@ea-lab/reactive-json-docs 0.8.0 → 1.0.0-alpha.0

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 (66) hide show
  1. package/package.json +7 -5
  2. package/public/rjbuild/docs/advanced-concepts/plugins/plugin-system.md +47 -1
  3. package/public/rjbuild/docs/advanced-concepts/plugins/plugin-system.yaml +53 -1
  4. package/public/rjbuild/docs/core/dataMapping/simpleMapping.yaml +14 -4
  5. package/public/rjbuild/docs/core/element/form/Input.md +307 -0
  6. package/public/rjbuild/docs/core/element/form/Input.yaml +572 -0
  7. package/public/rjbuild/docs/core/element/special/Count.yaml +99 -31
  8. package/public/rjbuild/docs/core/element/special/DataFilter.yaml +118 -38
  9. package/public/rjbuild/docs/core/element/special/ReactiveJsonSubroot.yaml +154 -34
  10. package/public/rjbuild/docs/core/element/special/Switch.md +5 -5
  11. package/public/rjbuild/docs/core/element/special/Switch.yaml +9 -18
  12. package/public/rjbuild/docs/core/example/html.md +2 -2
  13. package/public/rjbuild/docs/core/example/html.yaml +2 -3
  14. package/public/rjbuild/docs/core/example/native-html-forms.md +245 -0
  15. package/public/rjbuild/docs/core/example/native-html-forms.yaml +393 -0
  16. package/public/rjbuild/docs/core/reaction/addData.md +17 -3
  17. package/public/rjbuild/docs/core/reaction/addData.yaml +53 -9
  18. package/public/rjbuild/docs/core/reaction/fetchData.yaml +44 -8
  19. package/public/rjbuild/docs/core/reaction/setData.md +18 -4
  20. package/public/rjbuild/docs/core/reaction/setData.yaml +18 -4
  21. package/public/rjbuild/docs/docs-components/Mermaid.md +254 -0
  22. package/public/rjbuild/docs/docs-components/Mermaid.yaml +339 -0
  23. package/public/rjbuild/docs/docs-components/index.yaml +1 -0
  24. package/public/rjbuild/docs/getting-started/actions.md +1 -1
  25. package/public/rjbuild/docs/index.yaml +2 -1
  26. package/public/rjbuild/docs/install.md +2 -5
  27. package/public/rjbuild/docs/install.yaml +4 -10
  28. package/public/rjbuild/docs/{core → integration/bootstrap}/action/Popover.md +1 -1
  29. package/public/rjbuild/docs/{core → integration/bootstrap}/action/Tooltip.md +1 -1
  30. package/public/rjbuild/docs/integration/bootstrap/element/html/AccordionItem.md +69 -0
  31. package/public/rjbuild/docs/integration/bootstrap/element/html/Modal.md +127 -0
  32. package/public/rjbuild/docs/integration/bootstrap/element/html/Tabs.md +150 -0
  33. package/public/rjbuild/docs/integration/bootstrap/element/html/index.md +13 -0
  34. package/public/rjbuild/docs/integration/bootstrap/element/special/index.md +19 -0
  35. package/public/rjbuild/docs/integration/bootstrap/example/website.md +41 -0
  36. package/public/rjbuild/docs/integration/bootstrap/overview.md +69 -0
  37. package/public/rjbuild/docs/integration/bootstrap/overview.yaml +87 -0
  38. /package/public/rjbuild/docs/{core → integration/bootstrap}/action/Popover.yaml +0 -0
  39. /package/public/rjbuild/docs/{core → integration/bootstrap}/action/Tooltip.yaml +0 -0
  40. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/CheckBoxField.md +0 -0
  41. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/CheckBoxField.yaml +0 -0
  42. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/DateField.md +0 -0
  43. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/DateField.yaml +0 -0
  44. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/NumberField.md +0 -0
  45. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/NumberField.yaml +0 -0
  46. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/SelectField.md +0 -0
  47. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/SelectField.yaml +0 -0
  48. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/TextAreaField.md +0 -0
  49. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/TextAreaField.yaml +0 -0
  50. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/TextField.md +0 -0
  51. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/TextField.yaml +0 -0
  52. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/formElementsCommon.md +0 -0
  53. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/index.md +0 -0
  54. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/index.yaml +0 -0
  55. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/html/AccordionItem.yaml +0 -0
  56. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/html/Modal.yaml +0 -0
  57. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/html/Tabs.yaml +0 -0
  58. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/special/BootstrapElement.md +0 -0
  59. /package/public/rjbuild/docs/{core → integration/bootstrap}/element/special/BootstrapElement.yaml +0 -0
  60. /package/public/rjbuild/docs/{core → integration/bootstrap}/example/accordion.md +0 -0
  61. /package/public/rjbuild/docs/{core → integration/bootstrap}/example/accordion.yaml +0 -0
  62. /package/public/rjbuild/docs/{core → integration/bootstrap}/example/dynamic-content.md +0 -0
  63. /package/public/rjbuild/docs/{core → integration/bootstrap}/example/dynamic-content.yaml +0 -0
  64. /package/public/rjbuild/docs/{core → integration/bootstrap}/example/website.yaml +0 -0
  65. /package/public/rjbuild/docs/{chartjs → integration/chartjs}/components.yaml +0 -0
  66. /package/public/rjbuild/docs/{chartjs → integration/chartjs}/overview.yaml +0 -0
@@ -0,0 +1,572 @@
1
+ renderView:
2
+ - type: Markdown
3
+ content: |
4
+ # Input
5
+
6
+ The `Input` component provides a native HTML input field with automatic data synchronization, combining the simplicity of native HTML with the convenience of automatic data binding.
7
+
8
+ - type: blockquote
9
+ content:
10
+ - type: Markdown
11
+ content: |
12
+ **About specialized input components**
13
+
14
+ For common input types, you can use specialized wrapper components that pre-set the `inputType`:
15
+
16
+ - `TextField` (text), `EmailField` (email), `PasswordField` (password)
17
+ - `UrlField` (url), `SearchField` (search), `TelField` (tel)
18
+ - `NumberField` (number), `RangeField` (range)
19
+ - `DateField` (date), `TimeField` (time), `DateTimeField` (datetime-local)
20
+ - `MonthField` (month), `WeekField` (week)
21
+ - `ColorField` (color), `FileField` (file), `HiddenField` (hidden)
22
+
23
+ All these components use the same properties as `Input` but with a predefined input type.
24
+
25
+ Using convenience components makes it easier to override specific component types through reactive-json's [plugin system](/docs/advanced-concepts/plugins/plugin-system). For example, you can replace all `EmailField` components with a custom implementation while leaving other input types unchanged.
26
+
27
+ - type: button
28
+ attributes:
29
+ class: "btn btn-primary"
30
+ style:
31
+ marginTop: "10px"
32
+ content: "Show the convenience components override graph"
33
+ actions:
34
+ - what: setData
35
+ on: click
36
+ path: ~._showConvenienceComponentsOverride
37
+ value: true
38
+
39
+ - type: Modal
40
+ attributes:
41
+ class: "modal-xl"
42
+ showBoolPath: ~._showConvenienceComponentsOverride
43
+ headerTitle: "Convenience Components Override"
44
+ body:
45
+ - type: Mermaid
46
+ content: |
47
+ graph TB
48
+ subgraph "Convenience Components Override"
49
+ direction TB
50
+
51
+ subgraph "Application YAML"
52
+ AppYAML["Application YAML<br/>- type: EmailField<br/>- type: TextField<br/>- type: PasswordField"]
53
+ end
54
+
55
+ subgraph "Plugin Override Options"
56
+ direction TB
57
+
58
+ subgraph "Option 1: Override Specific Type"
59
+ CustomEmail["Custom EmailField<br/>• Enhanced validation<br/>• Company branding<br/>• Special features"]
60
+ DefaultText["Default TextField<br/>• Unchanged"]
61
+ DefaultPassword["Default PasswordField<br/>• Unchanged"]
62
+ end
63
+
64
+ subgraph "Option 2: Override Base Input"
65
+ CustomInput["Custom Input<br/>• Affects ALL types<br/>• Global changes"]
66
+ end
67
+ end
68
+
69
+ subgraph "Result"
70
+ direction TB
71
+ GranularControl["Granular Control<br/>Override only EmailField<br/>while keeping others default"]
72
+ GlobalControl["Global Control<br/>Override Input affects<br/>all convenience components"]
73
+ end
74
+
75
+ AppYAML --> CustomEmail
76
+ AppYAML --> DefaultText
77
+ AppYAML --> DefaultPassword
78
+ AppYAML --> CustomInput
79
+
80
+ CustomEmail --> GranularControl
81
+ DefaultText --> GranularControl
82
+ DefaultPassword --> GranularControl
83
+
84
+ CustomInput --> GlobalControl
85
+ end
86
+
87
+ subgraph "Plugin System Benefits"
88
+ Flexibility["Flexibility<br/>Target specific<br/>component types"]
89
+ Maintainability["Maintainability<br/>Override without<br/>changing YAML"]
90
+ Reusability["Reusability<br/>Share custom<br/>implementations"]
91
+ end
92
+
93
+ GranularControl --> Flexibility
94
+ GranularControl --> Maintainability
95
+ GranularControl --> Reusability
96
+
97
+ - type: Markdown
98
+ content: |
99
+ ## Basic Syntax
100
+
101
+ ```yaml
102
+ - type: Input
103
+ dataLocation: ~.fieldName
104
+ label: "Field Label:"
105
+ placeholder: "Enter value..."
106
+ inputType: "text"
107
+ inputAttributes:
108
+ required: true
109
+ attributes:
110
+ style:
111
+ marginBottom: "10px"
112
+ ```
113
+
114
+ ## Properties
115
+
116
+ - type: DefinitionList
117
+ content:
118
+ - term:
119
+ code: dataLocation
120
+ after: "(string, optional)"
121
+ details: "Path to bind the field value in the data context."
122
+ - term:
123
+ code: defaultFieldValue
124
+ after: "(string, optional)"
125
+ details: "Default value when no data is present."
126
+ - term:
127
+ code: label
128
+ after: "(string, optional)"
129
+ details: "Field label text (supports template evaluation)."
130
+ - term:
131
+ code: placeholder
132
+ after: "(string, optional)"
133
+ details: "Placeholder text (supports template evaluation)."
134
+ - term:
135
+ code: inputType
136
+ after: "(string, optional)"
137
+ details:
138
+ type: Markdown
139
+ content: "HTML input type (default: \"text\", supports template evaluation)."
140
+ - term:
141
+ code: attributes
142
+ after: "(object, optional)"
143
+ details: "Attributes applied to the container div (or merged with inputAttributes if no wrapper)."
144
+ - term:
145
+ code: inputAttributes
146
+ after: "(object, optional)"
147
+ details: "Attributes applied directly to the input element."
148
+ - term:
149
+ code: labelAttributes
150
+ after: "(object, optional)"
151
+ details: "Attributes applied to the label (htmlFor is automatically managed)."
152
+ - term:
153
+ code: forceWrapper
154
+ after: "(boolean, optional)"
155
+ details: "Forces the presence (true) or absence (false) of the wrapper div. If omitted, wrapper is automatic only if label is present."
156
+ - term:
157
+ code: actions
158
+ after: "(array, optional)"
159
+ details: "Actions to execute based on field state."
160
+
161
+ - type: Markdown
162
+ content: |
163
+ ## Data Management
164
+
165
+ The component automatically synchronizes its value with the global data context. When `dataLocation` is used, the value is stored at the specified path. Without `dataLocation`, the value is stored in the template context using the component's `datafield`.
166
+
167
+ ## Input Types
168
+
169
+ The `inputType` property supports all HTML5 input types:
170
+ - `text` (default): Standard text input
171
+ - `email`: Email validation
172
+ - `password`: Masked password input
173
+ - `url`: URL validation
174
+ - `tel`: Telephone number input
175
+ - `search`: Search input with clear button
176
+ - `number`: Numeric input
177
+ - `date`: Date picker
178
+ - And all other HTML5 types
179
+
180
+ ## Wrapper Control
181
+
182
+ The component uses a flexible wrapper system that adapts based on the presence of a label and the `forceWrapper` property.
183
+
184
+ ### Default Behavior
185
+ When no `forceWrapper` is specified, the component automatically determines whether to use a wrapper div. If a label is present, the component wraps both the label and input in a div container. If no label is present, the input is rendered directly without a wrapper.
186
+
187
+ ### Explicit Control with `forceWrapper`
188
+ You can override the default behavior using the `forceWrapper` property. Setting `forceWrapper: true` will always create a wrapper div, even without a label. Setting `forceWrapper: false` will never create a wrapper, even when a label is present.
189
+
190
+ ### Attribute Merging
191
+ When a wrapper is present, the `attributes` are applied to the div container and `inputAttributes` are applied to the input element. When no wrapper is present, both `attributes` and `inputAttributes` are merged and applied to the input element.
192
+
193
+ - type: button
194
+ attributes:
195
+ class: "btn btn-primary"
196
+ content: "Show the wrapper logic graph"
197
+ actions:
198
+ - what: setData
199
+ on: click
200
+ path: ~._showWrapperLogic
201
+ value: true
202
+
203
+ - type: Modal
204
+ attributes:
205
+ class: "modal-lg"
206
+ showBoolPath: ~._showWrapperLogic
207
+ headerTitle: "Wrapper Logic: Decision Tree for div Container Usage"
208
+ body:
209
+ - type: Mermaid
210
+ mermaidConfig:
211
+ themeVariables:
212
+ primaryColor: "transparent"
213
+ primaryBorderColor: "#666"
214
+ primaryTextColor: "#333"
215
+ lineColor: "#666"
216
+ secondaryColor: "transparent"
217
+ tertiaryColor: "transparent"
218
+ flowchart:
219
+ htmlLabels: true
220
+ nodeSpacing: 60
221
+ rankSpacing: 90
222
+ curve: basis
223
+ content: |
224
+ flowchart TD
225
+ A["⚙️ Input Component"] --> B{"🔧 forceWrapper<br/>specified?"}
226
+ B -->|✅ Yes| C{"🔧 forceWrapper<br/>=== true?"}
227
+ B -->|❌ No| D{"🏷️ Has label?"}
228
+
229
+ C -->|✅ Yes| E["📦 Use Wrapper<br/>= TRUE"]
230
+ C -->|❌ No| F["🚫 Use Wrapper<br/>= FALSE"]
231
+
232
+ D -->|✅ Yes| E
233
+ D -->|❌ No| F
234
+
235
+ E --> G["📦 Render with<br/>wrapper div"]
236
+ F --> H["🎯 Render without<br/>wrapper"]
237
+
238
+ G --> I["📦 attributes → div<br/>📝 inputAttributes → input"]
239
+ H --> J["🔄 Merge attributes<br/>with inputAttributes<br/>📝 All applied to input"]
240
+
241
+ I --> O{"🏷️ Has label?"}
242
+ O -->|✅ Yes| K["📄 HTML: div > label + input"]
243
+ O -->|❌ No| P["📄 HTML: div > input"]
244
+
245
+ J --> M{"🏷️ Has label?"}
246
+ M -->|✅ Yes| L["📄 HTML: label + input"]
247
+ M -->|❌ No| N["📄 HTML: input"]
248
+
249
+ - type: Markdown
250
+ content: |
251
+
252
+ ### HTML Output Examples
253
+
254
+ **With label (automatic wrapper):**
255
+
256
+ - type: SyntaxHighlighter
257
+ language: "html"
258
+ content: |
259
+ <div>
260
+ <label htmlFor="input-abc123">Field Label:</label>
261
+ <input id="input-abc123" type="text" value="" />
262
+ </div>
263
+
264
+ - type: Markdown
265
+ content: |
266
+ **Without label (no wrapper):**
267
+
268
+ - type: SyntaxHighlighter
269
+ language: "html"
270
+ content: |
271
+ <input id="input-xyz789" type="text" value="" />
272
+
273
+ - type: Markdown
274
+ content: |
275
+ **Force wrapper without label:**
276
+
277
+ - type: SyntaxHighlighter
278
+ language: "html"
279
+ content: |
280
+ <div>
281
+ <input id="input-def456" type="text" value="" />
282
+ </div>
283
+
284
+ - type: Markdown
285
+ content: |
286
+ ## Integrated vs Separated Labels
287
+
288
+ ### Integrated Label (convenience)
289
+ ```yaml
290
+ - type: Input
291
+ label: "My field:"
292
+ dataLocation: ~.value
293
+ ```
294
+
295
+ **Advantages**: Simple, automatic accessibility (htmlFor)
296
+
297
+ **Limitations**: No conditional actions, limited styling
298
+
299
+ ### Separated Label (full control)
300
+ ```yaml
301
+ - type: label
302
+ content: "My field:"
303
+ attributes:
304
+ htmlFor: "my-input-id"
305
+ actions:
306
+ - what: setAttributeValue
307
+ when: ~.hasError
308
+ is: true
309
+ attribute: style.color
310
+ value: "red"
311
+ - type: Input
312
+ dataLocation: ~.value
313
+ forceWrapper: false
314
+ inputAttributes:
315
+ id: "my-input-id"
316
+ ```
317
+
318
+ **Advantages**: Conditional actions, advanced styling, full control
319
+ **Disadvantages**: More verbose, manual accessibility management
320
+
321
+ **Recommendation**: Use the integrated label for most cases. Opt for separated label only if you need conditional actions or advanced styling.
322
+
323
+ - type: RjBuildDescriber
324
+ title: "Basic Example"
325
+ description: "Simple input with label and placeholder"
326
+ toDescribe:
327
+ renderView:
328
+ - type: Input
329
+ dataLocation: ~.username
330
+ label: "Username:"
331
+ placeholder: "Enter your username"
332
+ - type: div
333
+ content:
334
+ - "Current value: "
335
+ - type: strong
336
+ content: ~.username
337
+ data:
338
+ username: ""
339
+
340
+ - type: RjBuildDescriber
341
+ title: "Different Input Types"
342
+ description: "Input with various HTML5 types"
343
+ toDescribe:
344
+ renderView:
345
+ - type: Input
346
+ dataLocation: ~.email
347
+ label: "Email:"
348
+ placeholder: "user@example.com"
349
+ inputType: "email"
350
+ - type: Input
351
+ dataLocation: ~.password
352
+ label: "Password:"
353
+ placeholder: "Enter password"
354
+ inputType: "password"
355
+ - type: Input
356
+ dataLocation: ~.website
357
+ label: "Website:"
358
+ placeholder: "https://example.com"
359
+ inputType: "url"
360
+ - type: Input
361
+ dataLocation: ~.age
362
+ label: "Age:"
363
+ inputType: "number"
364
+ inputAttributes:
365
+ min: "0"
366
+ max: "120"
367
+ - type: div
368
+ attributes:
369
+ style:
370
+ marginTop: "20px"
371
+ padding: "10px"
372
+ borderRadius: "5px"
373
+ content:
374
+ - type: strong
375
+ content: "Current Values:"
376
+ - type: div
377
+ content:
378
+ - "Email: "
379
+ - ~.email
380
+ - type: div
381
+ content:
382
+ - "Password: "
383
+ - ~.password
384
+ - type: div
385
+ content:
386
+ - "Website: "
387
+ - ~.website
388
+ - type: div
389
+ content:
390
+ - "Age: "
391
+ - ~.age
392
+ data:
393
+ email: ""
394
+ password: ""
395
+ website: ""
396
+ age: ""
397
+
398
+ - type: RjBuildDescriber
399
+ title: "Custom Attributes"
400
+ description: "Input with custom attributes and pattern validation (format: ABC-123)"
401
+ toDescribe:
402
+ renderView:
403
+ - type: style
404
+ content: |
405
+ input[pattern]:valid {
406
+ border-color: #28a745;
407
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
408
+ }
409
+ input[pattern]:invalid {
410
+ border-color: #dc3545;
411
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
412
+ }
413
+ - type: Input
414
+ dataLocation: ~.productCode
415
+ label: "Product Code:"
416
+ placeholder: "ABC-123"
417
+ inputAttributes:
418
+ pattern: "[A-Z]{3}-[0-9]{3}"
419
+ title: "Format: ABC-123 (3 letters, dash, 3 numbers)"
420
+ maxLength: 7
421
+ attributes:
422
+ style:
423
+ marginBottom: "10px"
424
+ - type: div
425
+ content:
426
+ - "Product Code: "
427
+ - ~.productCode
428
+ data:
429
+ productCode: ""
430
+
431
+ - type: RjBuildDescriber
432
+ title: "Wrapper Control"
433
+ description: "Demonstration of different wrapper modes"
434
+ toDescribe:
435
+ renderView:
436
+ - type: Markdown
437
+ content: |
438
+ **1. No label → no wrapper automatically:**
439
+ - type: Input
440
+ dataLocation: ~.noWrapper
441
+ placeholder: "Input without wrapper"
442
+ attributes:
443
+ style:
444
+ border: "1px solid green"
445
+ marginBottom: "10px"
446
+
447
+ - type: Markdown
448
+ content: |
449
+ **2. With label → automatic wrapper:**
450
+ - type: Input
451
+ dataLocation: ~.autoWrapper
452
+ label: "With automatic wrapper:"
453
+ placeholder: "Input with wrapper"
454
+ attributes:
455
+ style:
456
+ marginBottom: "10px"
457
+ padding: "5px"
458
+
459
+ - type: Markdown
460
+ content: |
461
+ **3. Force wrapper even without label:**
462
+ - type: Input
463
+ dataLocation: ~.forceWrapper
464
+ placeholder: "Forced wrapper"
465
+ forceWrapper: true
466
+ attributes:
467
+ style:
468
+ border: "2px solid blue"
469
+ padding: "10px"
470
+ marginBottom: "10px"
471
+ borderRadius: "8px"
472
+
473
+ - type: Markdown
474
+ content: |
475
+ **4. No wrapper even with label:**
476
+ - type: Input
477
+ dataLocation: ~.noWrapperForced
478
+ label: "Label without wrapper:"
479
+ placeholder: "Input without forced wrapper"
480
+ forceWrapper: false
481
+ attributes:
482
+ style:
483
+ border: "2px solid red"
484
+ marginBottom: "10px"
485
+
486
+ - type: div
487
+ attributes:
488
+ style:
489
+ marginTop: "20px"
490
+ padding: "10px"
491
+ borderRadius: "5px"
492
+ content:
493
+ - type: strong
494
+ content: "Values:"
495
+ - type: div
496
+ content:
497
+ - "No wrapper: "
498
+ - ~.noWrapper
499
+ - type: div
500
+ content:
501
+ - "Auto wrapper: "
502
+ - ~.autoWrapper
503
+ - type: div
504
+ content:
505
+ - "Forced wrapper: "
506
+ - ~.forceWrapper
507
+ - type: div
508
+ content:
509
+ - "Forced no wrapper: "
510
+ - ~.noWrapperForced
511
+ data:
512
+ noWrapper: ""
513
+ autoWrapper: ""
514
+ forceWrapper: ""
515
+ noWrapperForced: ""
516
+
517
+ - type: RjBuildDescriber
518
+ title: "Custom Label Attributes"
519
+ description: "Customizing label styling"
520
+ toDescribe:
521
+ renderView:
522
+ - type: Input
523
+ dataLocation: ~.customLabel1
524
+ label: "Blue and bold label:"
525
+ placeholder: "Input with styled label"
526
+ labelAttributes:
527
+ style:
528
+ color: "blue"
529
+ fontWeight: "bold"
530
+ fontSize: "16px"
531
+ - type: Input
532
+ dataLocation: ~.customLabel2
533
+ label: "Label with CSS class:"
534
+ placeholder: "Input with class"
535
+ labelAttributes:
536
+ className: "custom-label"
537
+ style:
538
+ color: "#28a745"
539
+ textDecoration: "underline"
540
+ - type: div
541
+ content:
542
+ - "Value 1: "
543
+ - ~.customLabel1
544
+ - " | Value 2: "
545
+ - ~.customLabel2
546
+ data:
547
+ customLabel1: ""
548
+ customLabel2: ""
549
+
550
+ - type: Markdown
551
+ content: |
552
+ ## Advantages
553
+
554
+ - **No external dependencies**: Works without any CSS framework
555
+ - **Full control**: Custom styling and behavior
556
+ - **Performance**: Lighter than component libraries
557
+ - **Accessibility**: Direct control over ARIA attributes, automatic htmlFor
558
+ - **Automatic synchronization**: Unlike raw HTML elements that require manual setData actions
559
+ - **Flexible wrapper**: Avoids unnecessary HTML when not needed
560
+ - **Flexibility**: Integrated label for convenience, separated for advanced control
561
+
562
+ ## Limitations
563
+
564
+ - No built-in validation beyond HTML5 input type validation
565
+ - No support for input masking or formatting
566
+ - No built-in error message display
567
+ - Styling must be provided via external CSS or style attributes
568
+ - Template evaluation for `inputType` should return valid HTML input types
569
+ - Integrated label is limited: for conditional actions, prefer separated label
570
+
571
+ templates: {}
572
+ data: {}