fastlifeweb 0.25.0__py3-none-any.whl → 0.25.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. CHANGELOG.md +11 -0
  2. fastlife/adapters/jinjax/widget_factory/emailstr_builder.py +1 -0
  3. fastlife/adapters/jinjax/widget_factory/secretstr_builder.py +3 -4
  4. fastlife/adapters/jinjax/widgets/mfa_code.py +25 -0
  5. fastlife/adapters/jinjax/widgets/sequence.py +1 -1
  6. fastlife/adapters/jinjax/widgets/text.py +33 -7
  7. fastlife/assets/dist.css +768 -0
  8. fastlife/assets/source.css +1 -0
  9. fastlife/components/A.jinja +1 -1
  10. fastlife/components/Button.jinja +1 -1
  11. fastlife/components/Checkbox.jinja +1 -1
  12. fastlife/components/Details.jinja +1 -1
  13. fastlife/components/Form.jinja +1 -1
  14. fastlife/components/H1.jinja +1 -1
  15. fastlife/components/H2.jinja +1 -1
  16. fastlife/components/H3.jinja +1 -1
  17. fastlife/components/H4.jinja +1 -1
  18. fastlife/components/H5.jinja +1 -1
  19. fastlife/components/H6.jinja +1 -1
  20. fastlife/components/Input.jinja +23 -4
  21. fastlife/components/Label.jinja +1 -1
  22. fastlife/components/P.jinja +1 -1
  23. fastlife/components/Password.jinja +51 -0
  24. fastlife/components/Radio.jinja +3 -3
  25. fastlife/components/Select.jinja +1 -1
  26. fastlife/components/Summary.jinja +2 -2
  27. fastlife/components/Table.jinja +1 -1
  28. fastlife/components/Td.jinja +1 -1
  29. fastlife/components/Th.jinja +1 -1
  30. fastlife/components/pydantic_form/Error.jinja +9 -3
  31. fastlife/components/pydantic_form/FatalError.jinja +19 -5
  32. fastlife/domain/model/form.py +2 -1
  33. fastlife/middlewares/session/middleware.py +1 -1
  34. fastlife/service/templates.py +1 -0
  35. fastlife/template_globals.py +14 -0
  36. {fastlifeweb-0.25.0.dist-info → fastlifeweb-0.25.2.dist-info}/METADATA +4 -4
  37. {fastlifeweb-0.25.0.dist-info → fastlifeweb-0.25.2.dist-info}/RECORD +40 -36
  38. {fastlifeweb-0.25.0.dist-info → fastlifeweb-0.25.2.dist-info}/WHEEL +0 -0
  39. {fastlifeweb-0.25.0.dist-info → fastlifeweb-0.25.2.dist-info}/entry_points.txt +0 -0
  40. {fastlifeweb-0.25.0.dist-info → fastlifeweb-0.25.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ @import 'tailwindcss' source('../../../src/');
@@ -8,7 +8,7 @@
8
8
  id: Annotated[str | None, "unique identifier of the element."] = None,
9
9
  class_: Annotated[
10
10
  str | None,
11
- "css class for the node, defaults to :attr:`fastlife.templates.constants.Constants.A_CLASS`."
11
+ "css class for the node, defaults to :attr:`fastlife.template_globals.Globals.A_CLASS`."
12
12
  ] = None,
13
13
  hx_target: Annotated[
14
14
  str,
@@ -10,7 +10,7 @@
10
10
  class_: Annotated[
11
11
  str | None,
12
12
  "css class for the node, defaults to "
13
- ":attr:`fastlife.templates.constants.Constants.BUTTON_CLASS`."
13
+ ":attr:`fastlife.template_globals.Globals.BUTTON_CLASS`."
14
14
  ] = None,
15
15
  name: str = "action",
16
16
  value: str = "submit",
@@ -7,7 +7,7 @@
7
7
  class_: Annotated[
8
8
  str | None,
9
9
  "css class for the node, defaults to "
10
- ":attr:`fastlife.templates.constants.Constants.CHECKBOX_CLASS`."
10
+ ":attr:`fastlife.template_globals.Globals.CHECKBOX_CLASS`."
11
11
  ] = None,
12
12
  value: Annotated[str | None, "http submitted value if the checkbox is checked"] = None,
13
13
  checked: Annotated[bool, "Initialized the checkbox as ticked"] = False,
@@ -19,7 +19,7 @@
19
19
  class_: Annotated[
20
20
  str | None,
21
21
  "css class for the node, defaults to "
22
- ":attr:`fastlife.templates.constants.Constants.DETAILS_CLASS`."
22
+ ":attr:`fastlife.template_globals.Globals.DETAILS_CLASS`."
23
23
  ] = None,
24
24
  open: Annotated[bool, "open/close state."] = True,
25
25
  #}
@@ -18,7 +18,7 @@
18
18
  class_: Annotated[
19
19
  str | None,
20
20
  "css class for the node, defaults to "
21
- ":attr:`fastlife.templates.constants.Constants.FORM_CLASS`"
21
+ ":attr:`fastlife.template_globals.Globals.FORM_CLASS`"
22
22
  ] = None,
23
23
  method: Annotated[Literal["get", "post"] | None, "Http method used"] = None,
24
24
  action: Annotated[str | None, "url where the form will be submitted"] = None,
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.H1_CLASS`."
7
+ ":attr:`fastlife.template_globals.Globals.H1_CLASS`."
8
8
  ] = None,
9
9
  #}
10
10
  <h1
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.H2_CLASS`."
7
+ ":attr:`fastlife.template_globals.Globals.H2_CLASS`."
8
8
  ] = None,
9
9
  #}
10
10
  <h2
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.H3_CLASS`."
7
+ ":attr:`fastlife.template_globals.Globals.H3_CLASS`."
8
8
  ] = None,
9
9
  #}
10
10
  <h3
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.H4_CLASS`."
7
+ ":attr:`fastlife.template_globals.Globals.H4_CLASS`."
8
8
  ] = None,
9
9
  #}
10
10
  <h4
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.H5_CLASS`."
7
+ ":attr:`fastlife.template_globals.Globals.H5_CLASS`."
8
8
  ] = None,
9
9
  #}
10
10
  <h5
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.H6_CLASS`."
7
+ ":attr:`fastlife.template_globals.Globals.H6_CLASS`."
8
8
  ] = None,
9
9
  #}
10
10
  <h6
@@ -9,7 +9,7 @@
9
9
  class_: Annotated[
10
10
  str | None,
11
11
  "css class for the node, defaults to "
12
- ":attr:`fastlife.templates.constants.Constants.INPUT_CLASS`."
12
+ ":attr:`fastlife.template_globals.Globals.INPUT_CLASS`."
13
13
  ] = None,
14
14
  aria_label: Annotated[str | None, "aria-label"] = None,
15
15
  placeholder: Annotated[
@@ -21,12 +21,31 @@
21
21
  "none", "text", "decimal", "numeric", "tel", "search", "email", "url"
22
22
  ] | None,
23
23
  "Define a virtual keyboard layout"
24
- ] = None
24
+ ] = None,
25
+ autocomplete: Annotated[
26
+ Literal[
27
+ "on", "off",
28
+ "name", "username", "current-password", "new-password", "one-time-code",
29
+ "email", "tel", "organization", "street-address",
30
+ "address-line1", "address-line2", "address-line3",
31
+ "postal-code", "country", "country-name",
32
+ "cc-name", "cc-number", "cc-exp", "cc-csc",
33
+ "tel-country-code", "tel-national", "tel-area-code",
34
+ "tel-local", "tel-extension",
35
+ "bday", "bday-day", "bday-month", "bday-year",
36
+ "transaction-amount", "transaction-currency"
37
+ ] | None,
38
+ "Define autocomplete mode"
39
+ ] = None,
40
+ autofocus: Annotated[bool, "Five the focus"] = False,
25
41
  #}
26
42
 
27
- <input name="{{name}}" value="{{value}}" type="{{type}}"
43
+ <input name="{{name}}" value="{{value|default('')}}" type="{{type}}"
28
44
  {%- if id %} id="{{id}}" {%- endif %}
29
45
  {%- if aria_label %} aria-label="{{aria_label}}" {%- endif %}
30
46
  {%- if placeholder %} placeholder="{{placeholder}}" {%- endif %}
31
47
  {%- if inputmode %} inputmode="{{inputmode}}" {%- endif %}
32
- class="{{attrs.class or INPUT_CLASS}}" />
48
+ {%- if autocomplete %} autocomplete="{{autocomplete}}" {%- endif %}
49
+ class="{{attrs.class or INPUT_CLASS}}"
50
+ {%- if autofocus %} autofocus{% endif -%}
51
+ />
@@ -7,7 +7,7 @@
7
7
  class_: Annotated[
8
8
  str | None,
9
9
  "css class for the node, defaults to "
10
- ":attr:`fastlife.templates.constants.Constants.LABEL_CLASS`."
10
+ ":attr:`fastlife.template_globals.Globals.LABEL_CLASS`."
11
11
  ] = None,
12
12
  #}
13
13
  <label
@@ -6,7 +6,7 @@
6
6
  class_: Annotated[
7
7
  str | None,
8
8
  "css class for the node, defaults to "
9
- ":attr:`fastlife.templates.constants.Constants.P_CLASS`."
9
+ ":attr:`fastlife.template_globals.Globals.P_CLASS`."
10
10
  ] = None,
11
11
  #}
12
12
  <p
@@ -0,0 +1,51 @@
1
+ {# doc
2
+ Produce ``<input type="password">`` node.
3
+ #}
4
+ {# def
5
+ name: Annotated[str, "submitted name in the form"],
6
+ id: Annotated[str | None, "unique identifier of the element."] = None,
7
+ class_: Annotated[
8
+ str | None,
9
+ "css class for the node, defaults to "
10
+ ":attr:`fastlife.template_globals.Globals.INPUT_CLASS`."
11
+ ] = None,
12
+ aria_label: Annotated[str | None, "aria-label"] = None,
13
+ placeholder: Annotated[
14
+ str | None,
15
+ "brief hint to the user as to what kind of information is expected in the field."
16
+ ] = None,
17
+ autocomplete: Annotated[
18
+ Literal[
19
+ "on", "off",
20
+ "current-password", "new-password",
21
+ ] | None,
22
+ "Define autocomplete mode"
23
+ ] = None,
24
+ inputmode: Annotated[
25
+ Literal[
26
+ "none", "text", "numeric",
27
+ ] | None,
28
+ "Define a virtual keyboard layout"
29
+ ] = None,
30
+ minlength: Annotated[int | None, "Minimum length"] = None,
31
+ maxlength: Annotated[int | None, "Maximum length"] = None,
32
+ pattern: Annotated[str | None, "Must match a pattern"] = None,
33
+ autofocus: Annotated[bool, "Five the focus"] = False,
34
+ required: Annotated[bool, "Mark as required field"] = False,
35
+ readonly: Annotated[bool, "Mark as readonly field"] = False,
36
+ #}
37
+
38
+ <input name="{{name}}" type="password"
39
+ {%- if id %} id="{{id}}" {%- endif %}
40
+ {%- if aria_label %} aria-label="{{aria_label}}" {%- endif %}
41
+ {%- if placeholder %} placeholder="{{placeholder}}" {%- endif %}
42
+ {%- if autocomplete %} autocomplete="{{autocomplete}}" {%- endif %}
43
+ {%- if inputmode %} inputmode="{{inputmode}}" {%- endif %}
44
+ {%- if minlength %} minlength="{{minlength}}" {%- endif %}
45
+ {%- if maxlength %} maxlength="{{maxlength}}" {%- endif %}
46
+ {%- if pattern %} pattern="{{pattern}}" {%- endif %}
47
+ class="{{attrs.class or INPUT_CLASS}}"
48
+ {%- if autofocus %} autofocus{% endif -%}
49
+ {%- if required %} required{% endif -%}
50
+ {%- if readonly %} readonly{% endif -%}
51
+ />
@@ -12,17 +12,17 @@
12
12
  div_class: Annotated[
13
13
  str | None,
14
14
  "css class for the div node, defaults to "
15
- ":attr:`fastlife.templates.constants.Constants.RADIO_DIV_CLASS`"
15
+ ":attr:`fastlife.template_globals.Globals.RADIO_DIV_CLASS`"
16
16
  ] = None,
17
17
  class_: Annotated[
18
18
  str | None,
19
19
  "css class for the input node, defaults to "
20
- ":attr:`fastlife.templates.constants.Constants.RADIO_INPUT_CLASS`"
20
+ ":attr:`fastlife.template_globals.Globals.RADIO_INPUT_CLASS`"
21
21
  ] = None,
22
22
  label_class: Annotated[
23
23
  str | None,
24
24
  "css class for the label node, defaults to "
25
- ":attr:`fastlife.templates.constants.Constants.RADIO_LABEL_CLASS`"
25
+ ":attr:`fastlife.template_globals.Globals.RADIO_LABEL_CLASS`"
26
26
  ] = None,
27
27
  #}
28
28
  <div class="{{ div_class or RADIO_DIV_CLASS }}">
@@ -7,7 +7,7 @@ id: Annotated[str | None, "unique identifier of the element."] = None,
7
7
  class_: Annotated[
8
8
  str | None,
9
9
  "css class for the node, defaults to "
10
- ":attr:`fastlife.templates.constants.Constants.SELECT_CLASS`."
10
+ ":attr:`fastlife.template_globals.Globals.SELECT_CLASS`."
11
11
  ] = None,
12
12
  multiple: Annotated[bool, "Mark as multiple"] = False,
13
13
  #}
@@ -6,12 +6,12 @@
6
6
  class_: Annotated[
7
7
  str | None,
8
8
  "css class for the node, defaults to "
9
- ":attr:`fastlife.templates.constants.Constants.SUMMARY_CLASS`."
9
+ ":attr:`fastlife.template_globals.Globals.SUMMARY_CLASS`."
10
10
  ] = None,
11
11
  open: Annotated[bool, "Open or collapse the content of the details."] = True
12
12
  #}
13
13
 
14
- <summary id="{{id}}" :class="attrs.class or SUMMARY_CLASS"
14
+ <summary id="{{id}}" class="{{attrs.class or SUMMARY_CLASS}}"
15
15
  style="list-style: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;"
16
16
  onclick="document.getElementById('{{id}}-icon').classList.toggle('rotate-90')">
17
17
  <icons.ChevronRight :id="id + '-icon'"
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.TABLE_CLASS`."
7
+ ":attr:`fastlife.template_globals.Globals.TABLE_CLASS`."
8
8
  ] = None,
9
9
  #}
10
10
  <table
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.TD_CLASS`"
7
+ ":attr:`fastlife.template_globals.Globals.TD_CLASS`"
8
8
  ] = None,
9
9
  #}
10
10
  <td
@@ -4,7 +4,7 @@
4
4
  class_: Annotated[
5
5
  str | None,
6
6
  "css class for the node, defaults to "
7
- ":attr:`fastlife.templates.constants.Constants.TH_CLASS`."
7
+ ":attr:`fastlife.template_globals.Globals.TH_CLASS`."
8
8
  ] = None,
9
9
  #}
10
10
  <th
@@ -1,5 +1,11 @@
1
1
  {# doc display an error for a field. #}
2
- {# def text: Annotated[str | None, "error message"] #}
2
+ {# def
3
+ text: Annotated[str | None, "error message"],
4
+ class_: Annotated[
5
+ str | None,
6
+ "css class for the node, defaults to :attr:`fastlife.template_globals.Globals.ERROR_CLASS`."
7
+ ] = None,
8
+ #}
3
9
  {%- if text -%}
4
- <span class="mt-2 text-sm text-danger-500 dark:text-danger-400">{{text}}</span>
5
- {%- endif -%}
10
+ <span class="{{attrs.class or ERROR_CLASS }}">{{ text }}</span>
11
+ {%- endif -%}
@@ -1,8 +1,22 @@
1
1
  {# doc display an error for a field. #}
2
- {# def message: Annotated[str | None, "error message"] #}
2
+ {# def
3
+ message: Annotated[str | None, "error message"],
4
+ class_: Annotated[
5
+ str | None,
6
+ "css class for the node, defaults to :attr:`fastlife.template_globals.Globals.FATAL_ERROR_CLASS`."
7
+ ] = None,
8
+ icon_class: Annotated[
9
+ str | None,
10
+ "css class for the node, defaults to :attr:`fastlife.template_globals.Globals.FATAL_ERROR_ICON_CLASS`."
11
+ ] = None,
12
+ text_class: Annotated[
13
+ str | None,
14
+ "css class for the node, defaults to :attr:`fastlife.template_globals.Globals.FATAL_ERROR_TEXT_CLASS`."
15
+ ] = None,
16
+ #}
3
17
  {%- if message -%}
4
- <div class="flex items-center bg-red-50 border border-red-400 text-red-700" role="alert">
5
- <icons.Fire class="m-3 w-16 h-16 fill-orange-500" />
6
- <span class="sm:inline text-xl">{{ message }}</span>
18
+ <div class="{{attrs.class or FATAL_ERROR_CLASS}}" role="alert">
19
+ <icons.Fire :class="icon_class or FATAL_ERROR_ICON_CLASS" />
20
+ <span class="{{text_class or FATAL_ERROR_TEXT_CLASS}}">{{ message }}</span>
7
21
  </div>
8
- {%- endif -%}
22
+ {%- endif -%}
@@ -58,7 +58,8 @@ class FormModel(Generic[T]):
58
58
  cls, prefix: str, pydantic_type: type[T], data: Mapping[str, Any]
59
59
  ) -> "FormModel[T]":
60
60
  try:
61
- return cls(prefix, pydantic_type(**data.get(prefix, {})), {}, True)
61
+ ret = cls(prefix, pydantic_type(**data.get(prefix, {})), {}, True)
62
+ return ret
62
63
  except ValidationError as exc:
63
64
  errors: dict[str, str] = {}
64
65
  for error in exc.errors():
@@ -17,8 +17,8 @@ class SessionMiddleware(AbstractMiddleware):
17
17
 
18
18
  def __init__(
19
19
  self,
20
- *,
21
20
  app: ASGIApp,
21
+ *,
22
22
  cookie_name: str,
23
23
  secret_key: str,
24
24
  duration: timedelta,
@@ -56,6 +56,7 @@ class AbstractTemplateRenderer(abc.ABC):
56
56
  resp.set_cookie(
57
57
  request.csrf_token.name,
58
58
  request.csrf_token.value,
59
+ httponly=True,
59
60
  secure=request.url.scheme == "https",
60
61
  samesite="strict",
61
62
  max_age=60 * 15,
@@ -323,3 +323,17 @@ class Globals(BaseModel):
323
323
 
324
324
  TH_CLASS: str = "px-4 py-2 font-medium border-b dark:border-neutral-500"
325
325
  """Default css class for {jinjax:component}`Th`."""
326
+
327
+ ERROR_CLASS: str = "mt-2 text-sm text-danger-500 dark:text-danger-400"
328
+ """Default css class for {jinjax:component}`pydantic_form.Error`."""
329
+
330
+ FATAL_ERROR_CLASS: str = (
331
+ "flex items-center bg-red-50 border border-red-400 text-red-700"
332
+ )
333
+ """Default css class for {jinjax:component}`pydantic_form.FatalError`."""
334
+
335
+ FATAL_ERROR_ICON_CLASS: str = "m-3 w-16 h-16 fill-orange-500"
336
+ """Default css class for {jinjax:component}`pydantic_form.FatalError` icon."""
337
+
338
+ FATAL_ERROR_TEXT_CLASS: str = "sm:inline text-xl"
339
+ """Default css class for {jinjax:component}`pydantic_form.FatalError` text."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastlifeweb
3
- Version: 0.25.0
3
+ Version: 0.25.2
4
4
  Summary: High-level web framework
5
5
  Author-Email: Guillaume Gauvrit <guillaume@gauvr.it>
6
6
  License: MIT
@@ -17,14 +17,14 @@ Project-URL: Repository, https://github.com/mardiros/fastlife.git
17
17
  Project-URL: Issues, https://github.com/mardiros/fastlife/issues
18
18
  Project-URL: Changelog, https://mardiros.github.io/fastlife/user/changelog.html
19
19
  Requires-Python: >=3.11
20
- Requires-Dist: fastapi[standard]<1,>=0.115.0
20
+ Requires-Dist: fastapi[standard]<0.116.0,>=0.115.4
21
21
  Requires-Dist: itsdangerous<3,>=2.1.2
22
- Requires-Dist: jinjax<0.45,>=0.44
22
+ Requires-Dist: jinjax<0.49,>=0.48
23
23
  Requires-Dist: markupsafe<3,>=2.1.3
24
24
  Requires-Dist: multidict<7,>=6.0.5
25
25
  Requires-Dist: pydantic<3,>=2.5.3
26
26
  Requires-Dist: pydantic-settings<3,>=2.0.3
27
- Requires-Dist: python-multipart<1,>=0.0.9
27
+ Requires-Dist: python-multipart<1,>=0.0.13
28
28
  Requires-Dist: venusian<4,>=3.0.0
29
29
  Provides-Extra: testing
30
30
  Requires-Dist: beautifulsoup4; extra == "testing"
@@ -1,4 +1,4 @@
1
- CHANGELOG.md,sha256=vPPDKoWZ3BBiM8Bx1tJV0PpKvuqDWhpLowTYC87ZajA,8019
1
+ CHANGELOG.md,sha256=lrPhY2hvBQErCpC_v376kDsXv_K2LTj4DgK7XWC_dsk,8373
2
2
  fastlife/__init__.py,sha256=nXWE4AbhkhG_yBjPJU-XnKDMTsU9ebv7Vj4eIciWQI0,2219
3
3
  fastlife/adapters/__init__.py,sha256=imPD1hImpgrYkvUJRhHA5kVyGAua7VbP2WGkhSWKJT8,93
4
4
  fastlife/adapters/fastapi/__init__.py,sha256=1goV1FGFP04TGyskJBLKZam4Gvt1yoAvLMNs4ekWSSQ,243
@@ -21,12 +21,12 @@ fastlife/adapters/jinjax/renderer.py,sha256=8Pv2Ivg8iObPa-LeIfj764p2MEq78wzHqxZe
21
21
  fastlife/adapters/jinjax/widget_factory/__init__.py,sha256=Dy_2xr_YDAyEF9WtNpjV-aYaehRO1iKEIHVFdfFeszw,59
22
22
  fastlife/adapters/jinjax/widget_factory/base.py,sha256=TLEpYdekR4AeHhIie_DICc_oSvQaUaL8GlatqNiRewg,1046
23
23
  fastlife/adapters/jinjax/widget_factory/bool_builder.py,sha256=ElIDb6rlUiwuDAetC22TreoMa9HDgoZ2euVV1VurFFY,1291
24
- fastlife/adapters/jinjax/widget_factory/emailstr_builder.py,sha256=hO0_4yd0lZ8mLqAzM_FMecdtkSa03AIG13cvs6K9JPA,1532
24
+ fastlife/adapters/jinjax/widget_factory/emailstr_builder.py,sha256=1niv0fB-KXV5wEjs5Q7PmKMs0RlmQ8CmGJ8YLw3cI7k,1566
25
25
  fastlife/adapters/jinjax/widget_factory/enum_builder.py,sha256=agx67oUeVy5_BKzY4WV0DxT67R43Vy74CoeHl9PBvK4,1527
26
26
  fastlife/adapters/jinjax/widget_factory/factory.py,sha256=zTa6zbpW5lAh_eHlhO6XBP2GbeDTHatymhMAJQ-alTI,5915
27
27
  fastlife/adapters/jinjax/widget_factory/literal_builder.py,sha256=mrtWbDMKNFtw5ufJK3DnkkttGGk16EnDQhejyOd57Ys,1758
28
28
  fastlife/adapters/jinjax/widget_factory/model_builder.py,sha256=WgIEUExtGO_s9AlNQlaTG_136ipe64MIJsNP0nlnsOc,2236
29
- fastlife/adapters/jinjax/widget_factory/secretstr_builder.py,sha256=JJLqN74tUSTDDBYcRLDuqOLSL0P16S1Fp-SqTCdjjgg,1573
29
+ fastlife/adapters/jinjax/widget_factory/secretstr_builder.py,sha256=-A7tEQTvzc1M9eNPvEZ_9EYX8zqel2XjLGNFH-V6iqk,1564
30
30
  fastlife/adapters/jinjax/widget_factory/sequence_builder.py,sha256=j5KRfK5R8q_QdzGqjG86mjoKTWH7gvhjXesFAoItPaU,1944
31
31
  fastlife/adapters/jinjax/widget_factory/set_builder.py,sha256=kwtVLATkoOFTcKBKHk7xZwQxRomPCic0sp4Bsd8YQfM,2742
32
32
  fastlife/adapters/jinjax/widget_factory/simpletype_builder.py,sha256=olP66B9AMY1X8fgEAxhMdozWN_w1TtcIAIW6uPJRSng,1570
@@ -37,36 +37,40 @@ fastlife/adapters/jinjax/widgets/boolean.py,sha256=GFvyO2Lz-vTJ8lpX2UrkJk7ymu0vU
37
37
  fastlife/adapters/jinjax/widgets/checklist.py,sha256=xsr_edMu1nTcNnMEs1AAS3U-ugK95pEqn5NV5hjTeI0,1747
38
38
  fastlife/adapters/jinjax/widgets/dropdown.py,sha256=ou8U48txShr8IXdwF4_pBvTn1VcR9SazZKzbLcsN3_0,1458
39
39
  fastlife/adapters/jinjax/widgets/hidden.py,sha256=IKcVYs6NjN8YjW-UTr3DRBong6Wrc0QLgcp8U9JoQmE,638
40
+ fastlife/adapters/jinjax/widgets/mfa_code.py,sha256=8HHaEHyUEQT6xzJ0Y4O0eA1SU3wSfzXljx8XY73o-Rc,733
40
41
  fastlife/adapters/jinjax/widgets/model.py,sha256=YBIEWa_6mnmrBnesXjLTrpJ4drUS2CIorNmhK24cz7Q,1298
41
- fastlife/adapters/jinjax/widgets/sequence.py,sha256=XhIPRJyE9UXFetlDQA83N64kKlTqkj6WPcgPm6XF7mo,2559
42
- fastlife/adapters/jinjax/widgets/text.py,sha256=uYdJ1bjA3-2vEumh2nnd264wAaHU758ZxEiN2BaqtcE,2143
42
+ fastlife/adapters/jinjax/widgets/sequence.py,sha256=dVoHQmHloaRuU1Sd82b2jnO8WDfdwM2FaZlLCJCps1o,2566
43
+ fastlife/adapters/jinjax/widgets/text.py,sha256=TfmlJU233aZWIl-4cmm-f-pFxp6ycHWHnbiluOvRDgM,3040
43
44
  fastlife/adapters/jinjax/widgets/union.py,sha256=roCoFA82dLjF1XFW6UYaV7SCQWdFsSAT8Ux7KEB6_Us,2602
44
- fastlife/components/A.jinja,sha256=rjnOFNpM2SUeJ0P8FDe3jzc_1WlsL65Kv-tb6KMCEpw,1389
45
- fastlife/components/Button.jinja,sha256=COtCjDpzGLNqtBUYsHw7gdUay4kff3KdLJFAzrEnMmo,2310
46
- fastlife/components/Checkbox.jinja,sha256=47_E9uPdr3QKUvRVhNQA7VE0uh5FVslQM26cdF0WCtY,753
45
+ fastlife/assets/dist.css,sha256=BkGYK48Fmy7t3-KMKlpGnpjmpJpxQ4D6QUNlfmtVbU8,18432
46
+ fastlife/assets/source.css,sha256=0KtDcsKHj9LOcqNR1iv9pACwNBaNWkieEDqqjkgNL_s,47
47
+ fastlife/components/A.jinja,sha256=MDNJ2auIeYbpNeErvJdlGid4nIKfbi85ArmMgChsCJU,1384
48
+ fastlife/components/Button.jinja,sha256=itKU-ct45XissU33yfmTekyHsNe00fr4RQL-e9cxbgU,2305
49
+ fastlife/components/Checkbox.jinja,sha256=g62A1LR8TaN60h94pE2e5l9_eMmgnhVVE9HVCQtVVMo,748
47
50
  fastlife/components/CsrfToken.jinja,sha256=mS0q-3_hAevl_waWEPaN0QAYOBzMyzl-W1PSpEHUBA0,215
48
- fastlife/components/Details.jinja,sha256=BKyhSU7bZdbd_deTjmAGcMbgUoQW3h8JSR3thH-2oJA,741
49
- fastlife/components/Form.jinja,sha256=Aukx9cVR8Af1nIsdHst3Qk7Bz34g1RpDhl7WOIcy0Tg,2094
50
- fastlife/components/H1.jinja,sha256=ODwQMgwtuy2E2ShgamjFDlnCwOQQuuLIhvEzUF66nYM,375
51
- fastlife/components/H2.jinja,sha256=LcBE2R_N50gio01nxH9qhp8_G1HxOT91xG_u8J8ae_Q,375
52
- fastlife/components/H3.jinja,sha256=3PzxfQh07A35Og6dE5ow9BZdNp2Qnu7OuVeWREvD7Uo,375
53
- fastlife/components/H4.jinja,sha256=ZjzqOEuV7t2D7gllxb5oP6Bk_jsUzVJ0C2im0f02bqg,375
54
- fastlife/components/H5.jinja,sha256=lm0tuR1hOs5cZzmvC-IRkzwRH9-L-zoop2MzGmvUxlM,375
55
- fastlife/components/H6.jinja,sha256=F4DL4-RVjIlgH0T4aywSP2wcMopczM2PYDxoNjzHpmE,375
51
+ fastlife/components/Details.jinja,sha256=NtQX-V3kcp1CV1GkrMkj5fc-KHPZHshWkrhXAZ8E3ms,736
52
+ fastlife/components/Form.jinja,sha256=IJhkUwp_dF-BePi8okh-sUglXP6wJvtxNd-4PUFCwTY,2089
53
+ fastlife/components/H1.jinja,sha256=fWZtTq34qN9gwGgDF91lkypxaXvGN_OTmUY7XUHIpw0,370
54
+ fastlife/components/H2.jinja,sha256=o7Q-oR_zDtItV5A7QWfEo_LoMw6bR44YNBDQP3ao1bg,370
55
+ fastlife/components/H3.jinja,sha256=cZHJTVER1LVYWAwP3sR-23Ktbk9WYlLgLnr2Dz_0oqU,370
56
+ fastlife/components/H4.jinja,sha256=w-n0bFqR_38oIuju_Bs_8OwYCtLP0gIfSsoi5u3U8GM,370
57
+ fastlife/components/H5.jinja,sha256=bpphjO54yrKLKt64voR5wCvxwFpxQRfkZg_OqhCPAcA,370
58
+ fastlife/components/H6.jinja,sha256=9qzd6LpaLk5oTLdKw3utSVyX-uq7fn837mm22zG23Ko,370
56
59
  fastlife/components/Hidden.jinja,sha256=-D74wZ7qp2n5l_8HKmDhX5v_M2sAJ5l-w_z9m5d5KvA,283
57
- fastlife/components/Input.jinja,sha256=ctLW4guWQJ6AHg2G_e75FO05CEMADKAdbCXqPuv-aLs,1167
58
- fastlife/components/Label.jinja,sha256=Xcb8zwitefQVul3W8ovpbHakQexYR-qQ7ttbKd0dHXs,537
60
+ fastlife/components/Input.jinja,sha256=bg2YCVGQsXwNF5zPauNg0VYbhf3qzEW12t6Xz7bWYVI,1950
61
+ fastlife/components/Label.jinja,sha256=t50MUGyNSFB4LK-J0D0fM2xMT_vCsG3fnO0OapvzPJQ,532
59
62
  fastlife/components/Option.jinja,sha256=x6t7uUQsI1YSRstD4bSVlgK2wm8NJUXnzOWfNWGlk_Y,448
60
- fastlife/components/P.jinja,sha256=Y8ltFqnZOuA7OlkQ2EwUES_QO9-DaAgL-38U45UO4VM,376
61
- fastlife/components/Radio.jinja,sha256=ohucEGNofDsC4-Hp6Ovexi5XW812-kfAzsFCcOyVFq4,1493
62
- fastlife/components/Select.jinja,sha256=aPqdPrCh6ooxj3XkeptefwvzFqC5XC4FLtW8XLj3CpM,556
63
- fastlife/components/Summary.jinja,sha256=EFVG2d7JJu7j5RRLNqKHxXcWAEJmv3Wif1aI5HXq1Zc,853
64
- fastlife/components/Table.jinja,sha256=X87pJkqp-fl4Uno52Ijj1Lw4MFYsqr4Jc6Oi4KGQVhM,390
63
+ fastlife/components/P.jinja,sha256=Jumlwu9Wix8E2K7QwwimgWTrMdrFDAEfdLHlkz_Mp-g,371
64
+ fastlife/components/Password.jinja,sha256=dSjPzzgBJM1K1hg_9UURPLpvUcwnna8hf6lH0nsYEps,1903
65
+ fastlife/components/Radio.jinja,sha256=DyoCDnAv1b0aaoHRA7iqaR86cZ4ZjkAcW2VpU9DIxZU,1478
66
+ fastlife/components/Select.jinja,sha256=H9Tg1ctASVXb0aTdGVDP1XDlLfTGIntPhMLjb2xCjM8,551
67
+ fastlife/components/Summary.jinja,sha256=1kGaGtCSl3pbE3Y406_zdQcK0FDQrEchXJpc4-iPWuE,851
68
+ fastlife/components/Table.jinja,sha256=mAtaCVmVGjhuGHtCnKBs3YZTr_d_DBgkUNuQTa5TQA8,385
65
69
  fastlife/components/Tbody.jinja,sha256=FqldzLFhV6dfG0UsB55kDtALixpnECdIISXGWXiXxEM,331
66
- fastlife/components/Td.jinja,sha256=NTV86bdtm8t_2_2Pj1X8vsCqm4NSE4H5NPUoSt1i8cA,374
70
+ fastlife/components/Td.jinja,sha256=pYiw_iKb4t3EaWm4IswpsZuF4CjD4UlcjJzrNn9Dm-4,369
67
71
  fastlife/components/Textarea.jinja,sha256=0WsTi-yxVwYXndmJJN93WblQVqM0h0NCSMUDwoC3kdc,636
68
72
  fastlife/components/Tfoot.jinja,sha256=Hw_eFhmbHcOx0dCHrNkyi4q1lrKye5RpihHBwjaT3zY,331
69
- fastlife/components/Th.jinja,sha256=tuIlLlwtvZiBHhQD_J7p8V-An-EeA4mzm_nRxUoGDzQ,375
73
+ fastlife/components/Th.jinja,sha256=YGL1uOJXMY2EfiFNQa5OoQESYUsUNR5Xj4OBCTWiCtE,370
70
74
  fastlife/components/Thead.jinja,sha256=TpnnbtbgYe97e0QDjeJulbh0_-Cbu3z_Qh9dsraQNb4,330
71
75
  fastlife/components/Tr.jinja,sha256=kWy-jx4ShT2dv9vuHqJtMnc3O2pZ3y8KCWEAifMpjrU,322
72
76
  fastlife/components/icons/AcademicCap.jinja,sha256=c4hjr-AbncgcrYoN1h1384qdYAyd8NCyTudy3k3RdgI,732
@@ -1681,8 +1685,8 @@ fastlife/components/icons/solid/Wrench.jinja,sha256=ZdpxRZTC5p54FGWw3bgeaQyaPooJ
1681
1685
  fastlife/components/icons/solid/WrenchScrewdriver.jinja,sha256=bqF-g6PTJds_KK2cMosVfycBVIIrmy_3sCaTkb9-C9o,1566
1682
1686
  fastlife/components/icons/solid/XCircle.jinja,sha256=pO93hG8JImNOy94B62tN7fdzkzGvSsqkSkkZlkLaxeo,791
1683
1687
  fastlife/components/icons/solid/XMark.jinja,sha256=c-ngdLuYwEMicwm4-Aj4xcEc1uQ_LrBoPhdDhQutEA8,705
1684
- fastlife/components/pydantic_form/Error.jinja,sha256=vVSb1BKyKLOD4IOAM7aCKSNh7aAlmoiZVgRuvDCwLIo,205
1685
- fastlife/components/pydantic_form/FatalError.jinja,sha256=lFVlNrXzBR6ExMahq77h0tYlD46T2yUzsBwqO8Gn58g,338
1688
+ fastlife/components/pydantic_form/Error.jinja,sha256=vvmnUosm3bbWZfFVRY_8QvmgrRE0_YU_ocU7XbyP7RA,337
1689
+ fastlife/components/pydantic_form/FatalError.jinja,sha256=ADtQvmo-e-NmDcFM1E6wZV8aiFXoo-6KWT7zhFoaV-o,820
1686
1690
  fastlife/components/pydantic_form/Hint.jinja,sha256=8leBpfMGDmalc_KAjr2paTojr_rwq-luS6m_1BGj7Tw,202
1687
1691
  fastlife/components/pydantic_form/Widget.jinja,sha256=PgguUpvhG6CY9AW6H8qQMjKqjlybjDCAaFFAOHzrzVQ,418
1688
1692
  fastlife/config/__init__.py,sha256=5qpuaVYqi-AS0GgsfggM6rFsSwXgrqrLBo9jH6dVroc,407
@@ -1695,7 +1699,7 @@ fastlife/domain/__init__.py,sha256=3zDDos5InVX0el9OO0lgSDGzdUNYIhlA6w4uhBh2pF8,2
1695
1699
  fastlife/domain/model/__init__.py,sha256=aoBjaSpDscuFXvtknJHwiNyoJRUpE-v4X54h_wNuo2Y,27
1696
1700
  fastlife/domain/model/asgi.py,sha256=RSTnfTsofOmCaWzHNuRGowjlyHYmoDCrXFbvNY_B55k,129
1697
1701
  fastlife/domain/model/csrf.py,sha256=BUiWK-S7rVciWHO1qTkM8e_KxzpF6gGC4MMJK1v6iDo,414
1698
- fastlife/domain/model/form.py,sha256=WriBT1qUUIbf5x5iewo9ChEcr6k0en8jMTD0iaei5Pk,3253
1702
+ fastlife/domain/model/form.py,sha256=JP6uumlZBYhiPxzcdxOsfsFm5BRfvkDFvlUCD6Vy8dI,3275
1699
1703
  fastlife/domain/model/request.py,sha256=ZRHZW_MOmtO_DFHt2UYu_aUmtoMdD14085A8Z8_eS8s,2678
1700
1704
  fastlife/domain/model/security_policy.py,sha256=f9SLi54vvRU-KSPJ5K0unoqYpkxIyzuZjKf2Ylwf5Rg,4796
1701
1705
  fastlife/domain/model/template.py,sha256=z9oxdKme1hMPuvk7mBiKR_tuVY8TqH77aTYqMgvEGl8,876
@@ -1705,7 +1709,7 @@ fastlife/middlewares/base.py,sha256=7FZE_1YU7wNew2u1qdYXjamosk4CXJmg1mJWGp6Xhc0,
1705
1709
  fastlife/middlewares/reverse_proxy/__init__.py,sha256=g1SoVDmenKzpAAPYHTEsWgdBByOxtLg9fGx6RV3i0ok,846
1706
1710
  fastlife/middlewares/reverse_proxy/x_forwarded.py,sha256=PPDjcfwik5eoYaolSY1Y4x5QMKpDV0XrOP_i4Am0y30,1724
1707
1711
  fastlife/middlewares/session/__init__.py,sha256=ZhXWXs53A__F9wJKBJ87rW8Qyt5Mn866vhzKDxVZ4t0,1348
1708
- fastlife/middlewares/session/middleware.py,sha256=MyZ0MobhlnGiqacYq0pPYBrlqCjTkWjpNXNeFyPD1fI,3133
1712
+ fastlife/middlewares/session/middleware.py,sha256=tzaJHLT3ri9sstrppATu8MWXUALTq54PsNKU0v5DTBI,3133
1709
1713
  fastlife/middlewares/session/serializer.py,sha256=nbJGiCJ_ryZxkW1I28kmK6hD3U98D4ZlUQA7B8_tngQ,635
1710
1714
  fastlife/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1711
1715
  fastlife/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1714,14 +1718,14 @@ fastlife/service/csrf.py,sha256=wC1PaKOmZ3il0FF_kevxnlg9PxDqruRdLrNnOA3ZHrU,1886
1714
1718
  fastlife/service/locale_negociator.py,sha256=JUqzTukxDqTJVOR-CNI7Vqo6kvdvwxYvZQe8P3V9S2U,796
1715
1719
  fastlife/service/registry.py,sha256=3lm7aUD7FdlV1lQUS73OuBlL55-O1DulPJdE0n6Epks,2648
1716
1720
  fastlife/service/security_policy.py,sha256=qYXs4mhfz_u4x59NhUkirqKYKQbFv9YrzyRuXj7mxE0,4688
1717
- fastlife/service/templates.py,sha256=QPAIUbbZiekazz_jV3q4JCwQd6Q4KA6a4RDek2RWuhE,2548
1721
+ fastlife/service/templates.py,sha256=xNMKH-jNkEoCscO04H-QlzTqg-0pYbF_fc65xG-2rzs,2575
1718
1722
  fastlife/service/translatablestring.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
1719
1723
  fastlife/service/translations.py,sha256=s6qFZSXR-1vYxSr7RRH-mS-VjNaa8OTxR7-k6Ib7h0E,6878
1720
1724
  fastlife/settings.py,sha256=q-rz4CEF2RQGow5-m-yZJOvdh3PPb2c1Q_ZLJGnu4VQ,3647
1721
1725
  fastlife/shared_utils/__init__.py,sha256=i66ytuf-Ezo7jSiNQHIsBMVIcB-tDX0tg28-pUOlhzE,26
1722
1726
  fastlife/shared_utils/infer.py,sha256=0GflLkaWJ-4LZ1Ig3moR-_o55wwJ_p_vJ4xo-yi3lyA,1406
1723
1727
  fastlife/shared_utils/resolver.py,sha256=Wb9cO2MWavpti63hju15xmwFMgaD5DsQaxikRpB39E8,3713
1724
- fastlife/template_globals.py,sha256=ZJkO53mFL3l46YrH8ZHLw4hAG1oQcZ3KiBo4friGq2c,8395
1728
+ fastlife/template_globals.py,sha256=bKcj6kSnQlzuOeoILA5oRxxzy6CsrBFMZv9S0w5XlTQ,9021
1725
1729
  fastlife/testing/__init__.py,sha256=VpxkS3Zp3t_hH8dBiLaGFGhsvt511dhBS_8fMoFXdmU,99
1726
1730
  fastlife/testing/dom.py,sha256=dVzDoZokn-ii681UaEwAr-khM5KE-CHgXSSLSo24oH0,4489
1727
1731
  fastlife/testing/form.py,sha256=diiGfVMfNt19JTNUxlnbGfcbskR3ZMpk0Y-A57vfShc,7871
@@ -1729,8 +1733,8 @@ fastlife/testing/session.py,sha256=LEFFbiR67_x_g-ioudkY0C7PycHdbDfaIaoo_G7GXQ8,2
1729
1733
  fastlife/testing/testclient.py,sha256=Id1tlA1ZapyW-8kUh2_U3lLteL64m3ERqOO7NAN7HEY,6922
1730
1734
  fastlife/views/__init__.py,sha256=zG8gveL8e2zBdYx6_9jtZfpQ6qJT-MFnBY3xXkLwHZI,22
1731
1735
  fastlife/views/pydantic_form.py,sha256=o7EUItciAGL1OSaGNHo-3BTrYAk34GuWE7zGikjiAGY,1486
1732
- fastlifeweb-0.25.0.dist-info/METADATA,sha256=yQOfNm_DF3WTxoL0mgqY3PIx3bvnk3x1TVWux8HvNEg,3683
1733
- fastlifeweb-0.25.0.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
1734
- fastlifeweb-0.25.0.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
1735
- fastlifeweb-0.25.0.dist-info/licenses/LICENSE,sha256=JFWuiKYRXKKMEAsX0aZp3hBcju-HYflJ2rwJAGwbCJo,1080
1736
- fastlifeweb-0.25.0.dist-info/RECORD,,
1736
+ fastlifeweb-0.25.2.dist-info/METADATA,sha256=szZ9s9Rv4714GIS8XeM0PAWN9EbGfZ5qX7T6TcjaMhE,3690
1737
+ fastlifeweb-0.25.2.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
1738
+ fastlifeweb-0.25.2.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
1739
+ fastlifeweb-0.25.2.dist-info/licenses/LICENSE,sha256=JFWuiKYRXKKMEAsX0aZp3hBcju-HYflJ2rwJAGwbCJo,1080
1740
+ fastlifeweb-0.25.2.dist-info/RECORD,,