1. First let's clarify how `include` and `extends` tags work inside components.
When component template includes `include` or `extends` tags, it's as if the "included"
template was inlined. So if the "included" template contains `slot` tags, then the component
uses those slots.
If you have a template `abc.html`:
```django
hello
{% slot "body" %}{% endslot %}
```
And components that make use of `abc.html` via `include` or `extends`:
```djc_py
from django_components import Component, register
@register("my_comp_extends")
class MyCompWithExtends(Component):
template = """{% extends "abc.html" %}"""
@register("my_comp_include")
class MyCompWithInclude(Component):
template = """{% include "abc.html" %}"""
```
Then you can set slot fill for the slot imported via `include/extends`:
```django
{% component "my_comp_extends" %}
{% fill "body" %}
123
{% endfill %}
{% endcomponent %}
```
And it will render:
```html
hello
123
```
2. Slot and block
If you have a template `abc.html` like so:
```django
hello
{% block inner %}
1
{% slot "body" %}
2
{% endslot %}
{% endblock %}
```
and component `my_comp`:
```py
@register("my_comp")
class MyComp(Component):
template_file = "abc.html"
```
Then:
1. Since the `block` wasn't overriden, you can use the `body` slot:
```django
{% component "my_comp" %}
{% fill "body" %}
XYZ
{% endfill %}
{% endcomponent %}
```
And we get:
```html
hello 1 XYZ
```
2. `blocks` CANNOT be overriden through the `component` tag, so something like this:
```django
{% component "my_comp" %}
{% fill "body" %}
XYZ
{% endfill %}
{% endcomponent %}
{% block "inner" %}
456
{% endblock %}
```
Will still render the component content just the same:
```html
hello 1 XYZ
```
3. You CAN override the `block` tags of `abc.html` if the component template
uses `extends`. In that case, just as you would expect, the `block inner` inside
`abc.html` will render `OVERRIDEN`:
```djc_py
@register("my_comp")
class MyComp(Component):
template = """
{% extends "abc.html" %}
{% block inner %}
OVERRIDEN
{% endblock %}
"""
```
4. This is where it gets interesting (but still intuitive). You can insert even
new `slots` inside these "overriding" blocks:
```djc_py
@register("my_comp")
class MyComp(Component):
template = """
{% extends "abc.html" %}
{% load component_tags %}
{% block "inner" %}
OVERRIDEN
{% slot "new_slot" %}
hello
{% endslot %}
{% endblock %}
"""
```
And you can then pass fill for this `new_slot` when rendering the component:
```django
{% component "my_comp" %}
{% fill "new_slot" %}
XYZ
{% endfill %}
{% endcomponent %}
```
NOTE: Currently you can supply fills for both `new_slot` and `body` slots, and you will
not get an error for an invalid/unknown slot name. But since `body` slot is not rendered,
it just won't do anything. So this renders the same as above:
```django
{% component "my_comp" %}
{% fill "new_slot" %}
XYZ
{% endfill %}
{% fill "body" %}
www
{% endfill %}
{% endcomponent %}
```