@relax.js/core 1.0.3 → 1.0.4

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 (234) hide show
  1. package/README.md +194 -188
  2. package/dist/DependencyInjection.d.ts +42 -24
  3. package/dist/di/index.js +1 -1
  4. package/dist/di/index.js.map +3 -3
  5. package/dist/di/index.mjs +1 -1
  6. package/dist/di/index.mjs.map +3 -3
  7. package/dist/errors.d.ts +20 -0
  8. package/dist/forms/FormValidator.d.ts +1 -20
  9. package/dist/forms/ValidationRules.d.ts +2 -0
  10. package/dist/forms/index.js +1 -1
  11. package/dist/forms/index.js.map +4 -4
  12. package/dist/forms/index.mjs +1 -1
  13. package/dist/forms/index.mjs.map +4 -4
  14. package/dist/html/TableRenderer.d.ts +1 -0
  15. package/dist/html/index.js.map +2 -2
  16. package/dist/html/index.mjs.map +2 -2
  17. package/dist/html/template.d.ts +4 -0
  18. package/dist/http/http.d.ts +1 -0
  19. package/dist/http/index.js.map +2 -2
  20. package/dist/http/index.mjs.map +2 -2
  21. package/dist/index.js +3 -3
  22. package/dist/index.js.map +3 -3
  23. package/dist/index.mjs +3 -3
  24. package/dist/index.mjs.map +3 -3
  25. package/dist/routing/index.js +3 -3
  26. package/dist/routing/index.js.map +3 -3
  27. package/dist/routing/index.mjs +3 -3
  28. package/dist/routing/index.mjs.map +3 -3
  29. package/dist/routing/routeTargetRegistry.d.ts +1 -0
  30. package/dist/routing/types.d.ts +2 -1
  31. package/dist/templates/NodeTemplate.d.ts +2 -0
  32. package/dist/utils/index.js +1 -1
  33. package/dist/utils/index.js.map +2 -2
  34. package/dist/utils/index.mjs +1 -1
  35. package/dist/utils/index.mjs.map +2 -2
  36. package/docs/Architecture.md +333 -333
  37. package/docs/DependencyInjection.md +277 -237
  38. package/docs/Errors.md +87 -87
  39. package/docs/GettingStarted.md +231 -231
  40. package/docs/Pipes.md +5 -5
  41. package/docs/Translations.md +167 -312
  42. package/docs/WhyRelaxjs.md +336 -336
  43. package/docs/api/.nojekyll +1 -0
  44. package/docs/api/assets/hierarchy.js +1 -0
  45. package/docs/api/assets/highlight.css +120 -0
  46. package/docs/api/assets/icons.js +18 -0
  47. package/docs/api/assets/icons.svg +1 -0
  48. package/docs/api/assets/main.js +60 -0
  49. package/docs/api/assets/navigation.js +1 -0
  50. package/docs/api/assets/search.js +1 -0
  51. package/docs/api/assets/style.css +1633 -0
  52. package/docs/api/classes/http.WebSocketClient.html +26 -0
  53. package/docs/api/classes/i18n.LocaleChangeEvent.html +66 -0
  54. package/docs/api/classes/index.Blueprint.html +3 -0
  55. package/docs/api/classes/index.BoundNode.html +3 -0
  56. package/docs/api/classes/index.DigitsValidation.html +10 -0
  57. package/docs/api/classes/index.FormValidator.html +32 -0
  58. package/docs/api/classes/index.HttpError.html +13 -0
  59. package/docs/api/classes/index.LinkedList.html +26 -0
  60. package/docs/api/classes/index.NavigateRouteEvent.html +76 -0
  61. package/docs/api/classes/index.Node.html +15 -0
  62. package/docs/api/classes/index.PageSelectedEvent.html +61 -0
  63. package/docs/api/classes/index.Pager.html +4 -0
  64. package/docs/api/classes/index.RangeValidation.html +15 -0
  65. package/docs/api/classes/index.RelaxError.html +17 -0
  66. package/docs/api/classes/index.RequiredValidation.html +10 -0
  67. package/docs/api/classes/index.RouteError.html +11 -0
  68. package/docs/api/classes/index.RouteGuardError.html +12 -0
  69. package/docs/api/classes/index.RouteLink.html +779 -0
  70. package/docs/api/classes/index.RouteTarget.html +788 -0
  71. package/docs/api/classes/index.SSEClient.html +13 -0
  72. package/docs/api/classes/index.SSEDataEvent.html +63 -0
  73. package/docs/api/classes/index.ServiceCollection.html +28 -0
  74. package/docs/api/classes/index.ServiceContainer.html +24 -0
  75. package/docs/api/classes/index.SortChangeEvent.html +61 -0
  76. package/docs/api/classes/index.TableRenderer.html +5 -0
  77. package/docs/api/classes/index.TableSorter.html +4 -0
  78. package/docs/api/enums/index.GuardResult.html +9 -0
  79. package/docs/api/functions/elements.formError.html +6 -0
  80. package/docs/api/functions/elements.selectOne.html +6 -0
  81. package/docs/api/functions/i18n.getCurrentLocale.html +3 -0
  82. package/docs/api/functions/i18n.loadNamespace.html +7 -0
  83. package/docs/api/functions/i18n.loadNamespaces.html +6 -0
  84. package/docs/api/functions/i18n.onMissingTranslation.html +7 -0
  85. package/docs/api/functions/i18n.setLocale.html +7 -0
  86. package/docs/api/functions/i18n.setMessageFormatter.html +7 -0
  87. package/docs/api/functions/i18n.t.html +9 -0
  88. package/docs/api/functions/index.BooleanConverter.html +6 -0
  89. package/docs/api/functions/index.ContainerService.html +13 -0
  90. package/docs/api/functions/index.DateConverter.html +11 -0
  91. package/docs/api/functions/index.Inject.html +16 -0
  92. package/docs/api/functions/index.NumberConverter.html +5 -0
  93. package/docs/api/functions/index.RegisterValidator.html +7 -0
  94. package/docs/api/functions/index.applyPipes.html +17 -0
  95. package/docs/api/functions/index.asyncHandler.html +11 -0
  96. package/docs/api/functions/index.capitalizePipe.html +4 -0
  97. package/docs/api/functions/index.clearPendingNavigations.html +1 -0
  98. package/docs/api/functions/index.compileTemplate.html +26 -0
  99. package/docs/api/functions/index.configure.html +5 -0
  100. package/docs/api/functions/index.createBluePrint.html +1 -0
  101. package/docs/api/functions/index.createConverterFromDataType.html +4 -0
  102. package/docs/api/functions/index.createConverterFromInputType.html +5 -0
  103. package/docs/api/functions/index.createPipeRegistry.html +12 -0
  104. package/docs/api/functions/index.currencyPipe.html +9 -0
  105. package/docs/api/functions/index.datePipe.html +9 -0
  106. package/docs/api/functions/index.daysAgoPipe.html +8 -0
  107. package/docs/api/functions/index.defaultPipe.html +5 -0
  108. package/docs/api/functions/index.defineRoutes.html +8 -0
  109. package/docs/api/functions/index.del.html +8 -0
  110. package/docs/api/functions/index.findRouteByName.html +5 -0
  111. package/docs/api/functions/index.findRouteByUrl.html +4 -0
  112. package/docs/api/functions/index.firstPipe.html +4 -0
  113. package/docs/api/functions/index.generateSequentialId.html +21 -0
  114. package/docs/api/functions/index.get.html +9 -0
  115. package/docs/api/functions/index.getDataConverter.html +11 -0
  116. package/docs/api/functions/index.getParentComponent.html +18 -0
  117. package/docs/api/functions/index.getValidator.html +4 -0
  118. package/docs/api/functions/index.html.html +19 -0
  119. package/docs/api/functions/index.joinPipe.html +5 -0
  120. package/docs/api/functions/index.keysPipe.html +4 -0
  121. package/docs/api/functions/index.lastPipe.html +4 -0
  122. package/docs/api/functions/index.lowercasePipe.html +4 -0
  123. package/docs/api/functions/index.mapFormToClass.html +17 -0
  124. package/docs/api/functions/index.matchRoute.html +5 -0
  125. package/docs/api/functions/index.navigate.html +8 -0
  126. package/docs/api/functions/index.onError.html +8 -0
  127. package/docs/api/functions/index.piecesPipe.html +8 -0
  128. package/docs/api/functions/index.post.html +9 -0
  129. package/docs/api/functions/index.printRoutes.html +2 -0
  130. package/docs/api/functions/index.put.html +9 -0
  131. package/docs/api/functions/index.readData.html +17 -0
  132. package/docs/api/functions/index.registerRouteTarget.html +9 -0
  133. package/docs/api/functions/index.reportError.html +10 -0
  134. package/docs/api/functions/index.request.html +8 -0
  135. package/docs/api/functions/index.resolveValue.html +18 -0
  136. package/docs/api/functions/index.setFetch.html +6 -0
  137. package/docs/api/functions/index.setFormData.html +17 -0
  138. package/docs/api/functions/index.shortenPipe.html +5 -0
  139. package/docs/api/functions/index.startRouting.html +6 -0
  140. package/docs/api/functions/index.ternaryPipe.html +6 -0
  141. package/docs/api/functions/index.trimPipe.html +4 -0
  142. package/docs/api/functions/index.unregisterRouteTarget.html +3 -0
  143. package/docs/api/functions/index.uppercasePipe.html +4 -0
  144. package/docs/api/hierarchy.html +1 -0
  145. package/docs/api/index.html +323 -0
  146. package/docs/api/interfaces/http.SimpleDataEvent.html +3 -0
  147. package/docs/api/interfaces/http.WebSocketAbstraction.html +9 -0
  148. package/docs/api/interfaces/http.WebSocketCodec.html +4 -0
  149. package/docs/api/interfaces/http.WebSocketOptions.html +20 -0
  150. package/docs/api/interfaces/index.CompiledTemplate.html +10 -0
  151. package/docs/api/interfaces/index.DataLoader.html +19 -0
  152. package/docs/api/interfaces/index.EngineConfig.html +11 -0
  153. package/docs/api/interfaces/index.ErrorContext.html +4 -0
  154. package/docs/api/interfaces/index.FormReaderOptions.html +8 -0
  155. package/docs/api/interfaces/index.HttpOptions.html +16 -0
  156. package/docs/api/interfaces/index.HttpResponse.html +17 -0
  157. package/docs/api/interfaces/index.LoadRoute.html +7 -0
  158. package/docs/api/interfaces/index.NavigateOptions.html +7 -0
  159. package/docs/api/interfaces/index.PipeRegistry.html +12 -0
  160. package/docs/api/interfaces/index.RegistrationOptions.html +22 -0
  161. package/docs/api/interfaces/index.RenderTemplate.html +7 -0
  162. package/docs/api/interfaces/index.RequestOptions.html +11 -0
  163. package/docs/api/interfaces/index.Routable.html +10 -0
  164. package/docs/api/interfaces/index.Route.html +13 -0
  165. package/docs/api/interfaces/index.RouteGuard.html +2 -0
  166. package/docs/api/interfaces/index.RouteValue.html +6 -0
  167. package/docs/api/interfaces/index.SSEOptions.html +24 -0
  168. package/docs/api/interfaces/index.ValidationContext.html +8 -0
  169. package/docs/api/interfaces/index.ValidatorOptions.html +14 -0
  170. package/docs/api/media/Architecture.md +333 -0
  171. package/docs/api/media/DependencyInjection.md +277 -0
  172. package/docs/api/media/GettingStarted.md +231 -0
  173. package/docs/api/media/HttpClient.md +459 -0
  174. package/docs/api/media/Pipes.md +211 -0
  175. package/docs/api/media/Routing.md +332 -0
  176. package/docs/api/media/WhyRelaxjs.md +336 -0
  177. package/docs/api/media/forms.md +99 -0
  178. package/docs/api/media/html.md +175 -0
  179. package/docs/api/media/i18n.md +354 -0
  180. package/docs/api/media/utilities.md +143 -0
  181. package/docs/api/media/validation.md +351 -0
  182. package/docs/api/modules/collections_Index.html +1 -0
  183. package/docs/api/modules/di.html +1 -0
  184. package/docs/api/modules/elements.html +1 -0
  185. package/docs/api/modules/forms.html +1 -0
  186. package/docs/api/modules/html.html +1 -0
  187. package/docs/api/modules/http.html +1 -0
  188. package/docs/api/modules/i18n.html +1 -0
  189. package/docs/api/modules/index.html +1 -0
  190. package/docs/api/modules/routing.html +1 -0
  191. package/docs/api/modules/utils.html +1 -0
  192. package/docs/api/modules.html +1 -0
  193. package/docs/api/types/http.WebSocketFactory.html +2 -0
  194. package/docs/api/types/i18n.MessageFormatter.html +3 -0
  195. package/docs/api/types/i18n.MissingTranslationHandler.html +1 -0
  196. package/docs/api/types/index.Constructor.html +7 -0
  197. package/docs/api/types/index.ConverterFunc.html +2 -0
  198. package/docs/api/types/index.DataType.html +2 -0
  199. package/docs/api/types/index.InputType.html +2 -0
  200. package/docs/api/types/index.PipeFunction.html +6 -0
  201. package/docs/api/types/index.RouteData.html +1 -0
  202. package/docs/api/types/index.RouteMatchResult.html +9 -0
  203. package/docs/api/types/index.RouteParamType.html +1 -0
  204. package/docs/api/types/index.RouteSegmentType.html +2 -0
  205. package/docs/api/types/index.SSEEventFactory.html +5 -0
  206. package/docs/api/types/index.ServiceScope.html +10 -0
  207. package/docs/api/types/index.SortColumn.html +3 -0
  208. package/docs/api/variables/i18n.formatICU.html +3 -0
  209. package/docs/api/variables/index.container.html +6 -0
  210. package/docs/api/variables/index.defaultPipes.html +6 -0
  211. package/docs/api/variables/index.internalRoutes.html +1 -0
  212. package/docs/api/variables/index.serviceCollection.html +6 -0
  213. package/docs/api.json +93171 -0
  214. package/docs/elements/dom.md +102 -102
  215. package/docs/forms/creating-form-components.md +924 -924
  216. package/docs/forms/form-api.md +94 -94
  217. package/docs/forms/forms.md +99 -99
  218. package/docs/forms/patterns.md +311 -311
  219. package/docs/forms/reading-writing.md +365 -365
  220. package/docs/forms/validation.md +351 -351
  221. package/docs/html/TableRenderer.md +291 -291
  222. package/docs/html/html.md +175 -175
  223. package/docs/html/index.md +54 -54
  224. package/docs/html/template.md +422 -422
  225. package/docs/http/HttpClient.md +459 -459
  226. package/docs/http/ServerSentEvents.md +184 -184
  227. package/docs/http/index.md +109 -109
  228. package/docs/i18n/i18n.md +49 -4
  229. package/docs/i18n/intl-standard.md +178 -178
  230. package/docs/routing/RouteLink.md +98 -98
  231. package/docs/routing/Routing.md +332 -332
  232. package/docs/routing/layouts.md +207 -207
  233. package/docs/utilities.md +143 -143
  234. package/package.json +4 -3
@@ -1,94 +1,94 @@
1
- # Form-Associated Custom Elements API
2
-
3
- The [Form-Associated Custom Elements](https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements) standard lets web components participate in HTML forms just like native `<input>`, `<select>`, and `<textarea>` elements. RelaxJS form utilities fully support this API. Custom elements work transparently with `readData()`, `setFormData()`, `mapFormToClass()`, and `FormValidator`.
4
-
5
- ## How the Standard Works
6
-
7
- A custom element becomes form-associated by declaring `static formAssociated = true` and using `ElementInternals`:
8
-
9
- ```typescript
10
- class MyInput extends HTMLElement {
11
- static formAssociated = true;
12
- private internals: ElementInternals;
13
-
14
- constructor() {
15
- super();
16
- this.internals = this.attachInternals();
17
- }
18
- }
19
- ```
20
-
21
- This gives the element:
22
-
23
- - Inclusion in `form.elements`: the browser tracks it like a native input
24
- - Participation in `FormData`: submitted values via `internals.setFormValue()`
25
- - Native validation: constraint checking via `internals.setValidity()`
26
- - Form lifecycle callbacks: `formResetCallback()`, `formDisabledCallback()`, etc.
27
-
28
- ## How RelaxJS Supports It
29
-
30
- All form utilities use duck-typing rather than `instanceof` checks. This means they work with any element that exposes the right properties, whether it's a native `<input>` or a custom `<r-input>`.
31
-
32
- ### Property Detection
33
-
34
- RelaxJS reads element properties via attribute and property checks:
35
-
36
- | Property | How it's detected |
37
- |----------|-------------------|
38
- | `type` | Property or `getAttribute('type')` |
39
- | `value` | `'value' in element` |
40
- | `checked` | Property (boolean) or attribute (`""`, `"true"`, `"checked"`) |
41
- | `disabled` | Property (boolean) or attribute (`""`, `"true"`, `"disabled"`) |
42
- | `multiple` | Property (boolean) or attribute (`""`, `"true"`, `"multiple"`) |
43
- | `selectedOptions` | `'selectedOptions' in element` |
44
-
45
- ### readData()
46
-
47
- Uses `FormData` to read values, which automatically includes form-associated custom elements. Unchecked checkboxes (including custom ones with `type="checkbox"` and a `checked` property) are included as `false`.
48
-
49
- ```typescript
50
- const data = readData(form);
51
- // Custom elements with name/value are included just like native inputs
52
- ```
53
-
54
- ### setFormData()
55
-
56
- Sets values by querying `[name]` attributes and using duck-typed property access:
57
-
58
- ```typescript
59
- setFormData(form, { email: 'user@example.com', terms: true });
60
- // Works on both <input name="email"> and <r-input name="email">
61
- ```
62
-
63
- For custom checkbox-like elements, `setFormData` checks `type === 'checkbox'` and sets the `checked` property. For custom select-like elements, it checks for `selectedOptions` and `multiple`.
64
-
65
- ### mapFormToClass()
66
-
67
- Queries `input, select, textarea` and uses duck-typed value reading. Disabled elements (detected via attribute, not `instanceof`) are skipped, matching `FormData` behavior.
68
-
69
- ### FormValidator
70
-
71
- Validates any element returned by `form.querySelectorAll('input,textarea,select')` that implements `checkValidity()`. Custom elements using `ElementInternals.setValidity()` integrate automatically.
72
-
73
- ## Required Properties for Custom Elements
74
-
75
- For full compatibility with RelaxJS form utilities, custom elements should expose:
76
-
77
- | Property | Purpose |
78
- |----------|---------|
79
- | `name` | Field name for data mapping |
80
- | `value` | Current value (string) |
81
- | `disabled` | Whether the field is excluded from form data |
82
- | `type` | Element type (e.g., `'checkbox'`, `'text'`) for converter selection |
83
- | `checked` | Boolean state for checkbox/radio-like elements |
84
-
85
- See [Creating Form Components](creating-form-components.md) for complete implementation examples.
86
-
87
- ## Browser Support
88
-
89
- Form-associated custom elements are supported in all modern browsers:
90
-
91
- - Chrome 77+
92
- - Edge 79+
93
- - Firefox 93+
94
- - Safari 16.4+
1
+ # Form-Associated Custom Elements API
2
+
3
+ The [Form-Associated Custom Elements](https://html.spec.whatwg.org/multipage/custom-elements.html#form-associated-custom-elements) standard lets web components participate in HTML forms just like native `<input>`, `<select>`, and `<textarea>` elements. RelaxJS form utilities fully support this API. Custom elements work transparently with `readData()`, `setFormData()`, `mapFormToClass()`, and `FormValidator`.
4
+
5
+ ## How the Standard Works
6
+
7
+ A custom element becomes form-associated by declaring `static formAssociated = true` and using `ElementInternals`:
8
+
9
+ ```typescript
10
+ class MyInput extends HTMLElement {
11
+ static formAssociated = true;
12
+ private internals: ElementInternals;
13
+
14
+ constructor() {
15
+ super();
16
+ this.internals = this.attachInternals();
17
+ }
18
+ }
19
+ ```
20
+
21
+ This gives the element:
22
+
23
+ - Inclusion in `form.elements`: the browser tracks it like a native input
24
+ - Participation in `FormData`: submitted values via `internals.setFormValue()`
25
+ - Native validation: constraint checking via `internals.setValidity()`
26
+ - Form lifecycle callbacks: `formResetCallback()`, `formDisabledCallback()`, etc.
27
+
28
+ ## How RelaxJS Supports It
29
+
30
+ All form utilities use duck-typing rather than `instanceof` checks. This means they work with any element that exposes the right properties, whether it's a native `<input>` or a custom `<r-input>`.
31
+
32
+ ### Property Detection
33
+
34
+ RelaxJS reads element properties via attribute and property checks:
35
+
36
+ | Property | How it's detected |
37
+ |----------|-------------------|
38
+ | `type` | Property or `getAttribute('type')` |
39
+ | `value` | `'value' in element` |
40
+ | `checked` | Property (boolean) or attribute (`""`, `"true"`, `"checked"`) |
41
+ | `disabled` | Property (boolean) or attribute (`""`, `"true"`, `"disabled"`) |
42
+ | `multiple` | Property (boolean) or attribute (`""`, `"true"`, `"multiple"`) |
43
+ | `selectedOptions` | `'selectedOptions' in element` |
44
+
45
+ ### readData()
46
+
47
+ Uses `FormData` to read values, which automatically includes form-associated custom elements. Unchecked checkboxes (including custom ones with `type="checkbox"` and a `checked` property) are included as `false`.
48
+
49
+ ```typescript
50
+ const data = readData(form);
51
+ // Custom elements with name/value are included just like native inputs
52
+ ```
53
+
54
+ ### setFormData()
55
+
56
+ Sets values by querying `[name]` attributes and using duck-typed property access:
57
+
58
+ ```typescript
59
+ setFormData(form, { email: 'user@example.com', terms: true });
60
+ // Works on both <input name="email"> and <r-input name="email">
61
+ ```
62
+
63
+ For custom checkbox-like elements, `setFormData` checks `type === 'checkbox'` and sets the `checked` property. For custom select-like elements, it checks for `selectedOptions` and `multiple`.
64
+
65
+ ### mapFormToClass()
66
+
67
+ Queries `input, select, textarea` and uses duck-typed value reading. Disabled elements (detected via attribute, not `instanceof`) are skipped, matching `FormData` behavior.
68
+
69
+ ### FormValidator
70
+
71
+ Validates any element returned by `form.querySelectorAll('input,textarea,select')` that implements `checkValidity()`. Custom elements using `ElementInternals.setValidity()` integrate automatically.
72
+
73
+ ## Required Properties for Custom Elements
74
+
75
+ For full compatibility with RelaxJS form utilities, custom elements should expose:
76
+
77
+ | Property | Purpose |
78
+ |----------|---------|
79
+ | `name` | Field name for data mapping |
80
+ | `value` | Current value (string) |
81
+ | `disabled` | Whether the field is excluded from form data |
82
+ | `type` | Element type (e.g., `'checkbox'`, `'text'`) for converter selection |
83
+ | `checked` | Boolean state for checkbox/radio-like elements |
84
+
85
+ See [Creating Form Components](creating-form-components.md) for complete implementation examples.
86
+
87
+ ## Browser Support
88
+
89
+ Form-associated custom elements are supported in all modern browsers:
90
+
91
+ - Chrome 77+
92
+ - Edge 79+
93
+ - Firefox 93+
94
+ - Safari 16.4+
@@ -1,99 +1,99 @@
1
- # Form Utilities
2
-
3
- A TypeScript library for form validation, data mapping, and form manipulation with strong typing support.
4
-
5
- ## Overview
6
-
7
- The form utilities provide:
8
-
9
- - **[Validation](validation.md)** - Form validation with HTML5 integration, error summaries, and custom validators
10
- - **[Reading & Writing](reading-writing.md)** - Read and write form data with automatic type conversion
11
- - **[Form API](form-api.md)** - How RelaxJS supports the Form-Associated Custom Elements standard
12
- - **[Patterns](patterns.md)** - Common patterns for multi-step forms, file uploads, and state management
13
- - **[Creating Form Components](creating-form-components.md)** - Guide for building custom form-associated components
14
-
15
- ## Form Components Support
16
-
17
- All form utilities fully support **form-associated custom elements** (the HTML Form API). Custom web components created with `ElementInternals` and `formAssociated = true` integrate seamlessly with:
18
-
19
- - `setFormData()` - Populates custom form components like standard HTML inputs
20
- - `readData()` - Extracts values from custom form components
21
- - `mapFormToClass()` - Maps custom form component values to class properties
22
- - `FormValidator` - Validates custom form components with native and custom validation
23
-
24
- ## Quick Start
25
-
26
- ### Basic Form Validation
27
-
28
- ```typescript
29
- const form = document.querySelector('form');
30
- const validator = new FormValidator(form, {
31
- useSummary: true,
32
- autoValidate: true
33
- });
34
- ```
35
-
36
- ### Reading Form Data
37
-
38
- ```typescript
39
- const form = document.querySelector('form');
40
- const data = readData(form);
41
- // Returns typed object with automatic conversion
42
- ```
43
-
44
- ### Writing Form Data
45
-
46
- ```typescript
47
- const form = document.querySelector('form');
48
- const userData = {
49
- name: 'John',
50
- email: 'john@example.com',
51
- preferences: {
52
- notifications: true
53
- }
54
- };
55
- setFormData(form, userData);
56
- ```
57
-
58
- ### Mapping to Class Instance
59
-
60
- ```typescript
61
- class UserDTO {
62
- name: string = '';
63
- email: string = '';
64
- age: number = 0;
65
- }
66
-
67
- const form = document.querySelector('form');
68
- const user = mapFormToClass(form, new UserDTO());
69
- ```
70
-
71
- ## Complete Example
72
-
73
- ```typescript
74
- class UserRegistration {
75
- name: string = '';
76
- email: string = '';
77
- age: number = 0;
78
- isSubscribed: boolean = false;
79
- }
80
-
81
- const form = document.querySelector('#registration-form');
82
- const user = new UserRegistration();
83
-
84
- const validator = new FormValidator(form, {
85
- useSummary: true,
86
- customChecks: (form) => {
87
- const password = form.querySelector('[name="password"]') as HTMLInputElement;
88
- const confirm = form.querySelector('[name="confirmPassword"]') as HTMLInputElement;
89
-
90
- if (password.value !== confirm.value) {
91
- validator.addErrorToSummary('Password Confirmation', 'Passwords do not match');
92
- }
93
- },
94
- submitCallback: () => {
95
- mapFormToClass(form, user);
96
- console.log('User data:', user);
97
- }
98
- });
99
- ```
1
+ # Form Utilities
2
+
3
+ A TypeScript library for form validation, data mapping, and form manipulation with strong typing support.
4
+
5
+ ## Overview
6
+
7
+ The form utilities provide:
8
+
9
+ - **[Validation](validation.md)** - Form validation with HTML5 integration, error summaries, and custom validators
10
+ - **[Reading & Writing](reading-writing.md)** - Read and write form data with automatic type conversion
11
+ - **[Form API](form-api.md)** - How RelaxJS supports the Form-Associated Custom Elements standard
12
+ - **[Patterns](patterns.md)** - Common patterns for multi-step forms, file uploads, and state management
13
+ - **[Creating Form Components](creating-form-components.md)** - Guide for building custom form-associated components
14
+
15
+ ## Form Components Support
16
+
17
+ All form utilities fully support **form-associated custom elements** (the HTML Form API). Custom web components created with `ElementInternals` and `formAssociated = true` integrate seamlessly with:
18
+
19
+ - `setFormData()` - Populates custom form components like standard HTML inputs
20
+ - `readData()` - Extracts values from custom form components
21
+ - `mapFormToClass()` - Maps custom form component values to class properties
22
+ - `FormValidator` - Validates custom form components with native and custom validation
23
+
24
+ ## Quick Start
25
+
26
+ ### Basic Form Validation
27
+
28
+ ```typescript
29
+ const form = document.querySelector('form');
30
+ const validator = new FormValidator(form, {
31
+ useSummary: true,
32
+ autoValidate: true
33
+ });
34
+ ```
35
+
36
+ ### Reading Form Data
37
+
38
+ ```typescript
39
+ const form = document.querySelector('form');
40
+ const data = readData(form);
41
+ // Returns typed object with automatic conversion
42
+ ```
43
+
44
+ ### Writing Form Data
45
+
46
+ ```typescript
47
+ const form = document.querySelector('form');
48
+ const userData = {
49
+ name: 'John',
50
+ email: 'john@example.com',
51
+ preferences: {
52
+ notifications: true
53
+ }
54
+ };
55
+ setFormData(form, userData);
56
+ ```
57
+
58
+ ### Mapping to Class Instance
59
+
60
+ ```typescript
61
+ class UserDTO {
62
+ name: string = '';
63
+ email: string = '';
64
+ age: number = 0;
65
+ }
66
+
67
+ const form = document.querySelector('form');
68
+ const user = mapFormToClass(form, new UserDTO());
69
+ ```
70
+
71
+ ## Complete Example
72
+
73
+ ```typescript
74
+ class UserRegistration {
75
+ name: string = '';
76
+ email: string = '';
77
+ age: number = 0;
78
+ isSubscribed: boolean = false;
79
+ }
80
+
81
+ const form = document.querySelector('#registration-form');
82
+ const user = new UserRegistration();
83
+
84
+ const validator = new FormValidator(form, {
85
+ useSummary: true,
86
+ customChecks: (form) => {
87
+ const password = form.querySelector('[name="password"]') as HTMLInputElement;
88
+ const confirm = form.querySelector('[name="confirmPassword"]') as HTMLInputElement;
89
+
90
+ if (password.value !== confirm.value) {
91
+ validator.addErrorToSummary('Password Confirmation', 'Passwords do not match');
92
+ }
93
+ },
94
+ submitCallback: () => {
95
+ mapFormToClass(form, user);
96
+ console.log('User data:', user);
97
+ }
98
+ });
99
+ ```