Spaces:
Sleeping
Sleeping
| # **FT** Components | |
| <!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! --> | |
| **FT**, or ‘FastTags’, are the display components of FastHTML. In fact, | |
| the word “components” in the context of FastHTML is often synonymous | |
| with **FT**. | |
| For example, when we look at a FastHTML app, in particular the views, as | |
| well as various functions and other objects, we see something like the | |
| code snippet below. It’s the `return` statement that we want to pay | |
| attention to: | |
| ``` python | |
| from fasthtml.common import * | |
| def example(): | |
| # The code below is a set of ft components | |
| return Div( | |
| H1("FastHTML APP"), | |
| P("Let's do this"), | |
| cls="go" | |
| ) | |
| ``` | |
| Let’s go ahead and call our function and print the result: | |
| ``` python | |
| example() | |
| ``` | |
| ``` xml | |
| <div class="go"> | |
| <h1>FastHTML APP</h1> | |
| <p>Let's do this</p> | |
| </div> | |
| ``` | |
| As you can see, when returned to the user from a Python callable, like a | |
| function, the ft components are transformed into their string | |
| representations of XML or XML-like content such as HTML. More concisely, | |
| *ft turns Python objects into HTML*. | |
| Now that we know what ft components look and behave like we can begin to | |
| understand them. At their most fundamental level, ft components: | |
| 1. Are Python callables, specifically functions, classes, methods of | |
| classes, lambda functions, and anything else called with parenthesis | |
| that returns a value. | |
| 2. Return a sequence of values which has three elements: | |
| 1. The tag to be generated | |
| 2. The content of the tag, which is a tuple of strings/tuples. If a | |
| tuple, it is the three-element structure of an ft component | |
| 3. A dictionary of XML attributes and their values | |
| 3. FastHTML’s default ft components words begin with an uppercase | |
| letter. Examples include `Title()`, `Ul()`, and `Div()` Custom | |
| components have included things like `BlogPost` and `CityMap`. | |
| ## How FastHTML names ft components | |
| When it comes to naming ft components, FastHTML appears to break from | |
| PEP8. Specifically, PEP8 specifies that when naming variables, functions | |
| and instantiated classes we use the `snake_case_pattern`. That is to | |
| say, lowercase with words separated by underscores. However, FastHTML | |
| uses `PascalCase` for ft components. | |
| There’s a couple of reasons for this: | |
| 1. ft components can be made from any callable type, so adhering to any | |
| one pattern doesn’t make much sense | |
| 2. It makes for easier reading of FastHTML code, as anything that is | |
| PascalCase is probably an ft component | |
| ## Default **FT** components | |
| FastHTML has over 150 **FT** components designed to accelerate web | |
| development. Most of these mirror HTML tags such as `<div>`, `<p>`, | |
| `<a>`, `<title>`, and more. However, there are some extra tags added, | |
| including: | |
| - [`Titled`](https://www.fastht.ml/docs/api/xtend.html#titled), a | |
| combination of the `Title()` and `H1()` tags | |
| - [`Socials`](https://www.fastht.ml/docs/api/xtend.html#socials), | |
| renders popular social media tags | |
| ## The `fasthtml.ft` Namespace | |
| Some people prefer to write code using namespaces while adhering to | |
| PEP8. If that’s a preference, projects can be coded using the | |
| `fasthtml.ft` namespace. | |
| ``` python | |
| from fasthtml import ft | |
| ft.Ul( | |
| ft.Li("one"), | |
| ft.Li("two"), | |
| ft.Li("three") | |
| ) | |
| ``` | |
| ``` xml | |
| <ul> | |
| <li>one</li> | |
| <li>two</li> | |
| <li>three</li> | |
| </ul> | |
| ``` | |
| ## Attributes | |
| This example demonstrates many important things to know about how ft | |
| components handle attributes. | |
| ``` python | |
| #| echo: False | |
| Label( | |
| "Choose an option", | |
| Select( | |
| Option("one", value="1", selected=True), | |
| Option("two", value="2", selected=False), | |
| Option("three", value=3), | |
| cls="selector", | |
| _id="counter", | |
| **{'@click':"alert('Clicked');"}, | |
| ), | |
| _for="counter", | |
| ) | |
| ``` | |
| Line 2 | |
| Line 2 demonstrates that FastHTML appreciates `Label`s surrounding their | |
| fields. | |
| Line 5 | |
| On line 5, we can see that attributes set to the `boolean` value of | |
| `True` are rendered with just the name of the attribute. | |
| Line 6 | |
| On line 6, we demonstrate that attributes set to the `boolean` value of | |
| `False` do not appear in the rendered output. | |
| Line 7 | |
| Line 7 is an example of how integers and other non-string values in the | |
| rendered output are converted to strings. | |
| Line 8 | |
| Line 8 is where we set the HTML class using the `cls` argument. We use | |
| `cls` here as `class` is a reserved word in Python. During the rendering | |
| process this will be converted to the word “class”. | |
| Line 9 | |
| Line 9 demonstrates that any named argument passed into an ft component | |
| will have the leading underscore stripped away before rendering. Useful | |
| for handling reserved words in Python. | |
| Line 10 | |
| On line 10 we have an attribute name that cannot be represented as a | |
| python variable. In cases like these, we can use an unpacked `dict` to | |
| represent these values. | |
| Line 12 | |
| The use of `_for` on line 12 is another demonstration of an argument | |
| having the leading underscore stripped during render. We can also use | |
| `fr` as that will be expanded to `for`. | |
| This renders the following HTML snippet: | |
| ``` python | |
| Label( | |
| "Choose an option", | |
| Select( | |
| Option("one", value="1", selected=True), | |
| Option("two", value="2", selected=False), | |
| Option("three", value=3), # <4>, | |
| cls="selector", | |
| _id="counter", | |
| **{'@click':"alert('Clicked');"}, | |
| ), | |
| _for="counter", | |
| ) | |
| ``` | |
| ``` xml | |
| <label for="counter"> | |
| Choose an option | |
| <select id="counter" @click="alert('Clicked');" class="selector" name="counter"> | |
| <option value="1" selected>one</option> | |
| <option value="2" >two</option> | |
| <option value="3">three</option> | |
| </select> | |
| </label> | |
| ``` | |
| ## Defining new ft components | |
| It is possible and sometimes useful to create your own ft components | |
| that generate non-standard tags that are not in the FastHTML library. | |
| FastHTML supports created and defining those new tags flexibly. | |
| For more information, see the [Defining new ft | |
| components](../ref/defining_xt_component.html) reference page. | |
| ## FT components and type hints | |
| If you use type hints, we strongly suggest that FT components be treated | |
| as the `Any` type. | |
| The reason is that FastHTML leverages python’s dynamic features to a | |
| great degree. Especially when it comes to `FT` components, which can | |
| evaluate out to be `FT|str|None|tuple` as well as anything that supports | |
| the `__ft__`, `__html__`, and `__str__` method. That’s enough of the | |
| Python stack that assigning anything but `Any` to be the FT type will | |
| prove an exercise in frustation. | |