@ea-lab/reactive-json-docs 0.8.0 → 1.0.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.
- package/package.json +7 -5
- package/public/rjbuild/docs/advanced-concepts/attribute-transformers.md +168 -0
- package/public/rjbuild/docs/advanced-concepts/attribute-transformers.yaml +151 -0
- package/public/rjbuild/docs/advanced-concepts/data-mapping.md +6 -6
- package/public/rjbuild/docs/advanced-concepts/data-mapping.yaml +7 -7
- package/public/rjbuild/docs/advanced-concepts/data-processors.md +7 -7
- package/public/rjbuild/docs/advanced-concepts/data-processors.yaml +7 -7
- package/public/rjbuild/docs/advanced-concepts/forward-update.md +2 -2
- package/public/rjbuild/docs/advanced-concepts/forward-update.yaml +2 -2
- package/public/rjbuild/docs/advanced-concepts/index.md +1 -0
- package/public/rjbuild/docs/advanced-concepts/index.yaml +1 -0
- package/public/rjbuild/docs/advanced-concepts/plugins/component-development.md +1 -1
- package/public/rjbuild/docs/advanced-concepts/plugins/component-development.yaml +1 -1
- package/public/rjbuild/docs/advanced-concepts/plugins/plugin-system.md +48 -2
- package/public/rjbuild/docs/advanced-concepts/plugins/plugin-system.yaml +54 -2
- package/public/rjbuild/docs/core/action/Attribute/SetAttributeValue.md +2 -0
- package/public/rjbuild/docs/core/action/Attribute/SetAttributeValue.yaml +2 -0
- package/public/rjbuild/docs/core/action/Attribute/ToggleAttributeValue.md +2 -0
- package/public/rjbuild/docs/core/action/Attribute/ToggleAttributeValue.yaml +2 -0
- package/public/rjbuild/docs/core/action/Attribute/UnsetAttribute.md +2 -0
- package/public/rjbuild/docs/core/action/Attribute/UnsetAttribute.yaml +2 -0
- package/public/rjbuild/docs/core/action/Attribute/UnsetAttributeValue.md +2 -0
- package/public/rjbuild/docs/core/action/Attribute/UnsetAttributeValue.yaml +2 -0
- package/public/rjbuild/docs/core/action/Attribute/index.md +121 -0
- package/public/rjbuild/docs/core/action/Attribute/index.yaml +77 -0
- package/public/rjbuild/docs/core/attributeTransformer/index.md +17 -0
- package/public/rjbuild/docs/core/attributeTransformer/index.yaml +24 -0
- package/public/rjbuild/docs/core/attributeTransformer/setAttributeValue.md +101 -0
- package/public/rjbuild/docs/core/attributeTransformer/setAttributeValue.yaml +144 -0
- package/public/rjbuild/docs/core/attributeTransformer/toggleAttributeValue.md +269 -0
- package/public/rjbuild/docs/core/attributeTransformer/toggleAttributeValue.yaml +247 -0
- package/public/rjbuild/docs/core/attributeTransformer/unsetAttribute.md +114 -0
- package/public/rjbuild/docs/core/attributeTransformer/unsetAttribute.yaml +138 -0
- package/public/rjbuild/docs/core/attributeTransformer/unsetAttributeValue.md +140 -0
- package/public/rjbuild/docs/core/attributeTransformer/unsetAttributeValue.yaml +187 -0
- package/public/rjbuild/docs/core/dataMapping/simpleMapping.yaml +14 -4
- package/public/rjbuild/docs/core/element/form/Input.md +307 -0
- package/public/rjbuild/docs/core/element/form/Input.yaml +572 -0
- package/public/rjbuild/docs/core/element/special/Count.yaml +99 -31
- package/public/rjbuild/docs/core/element/special/DataFilter.yaml +118 -38
- package/public/rjbuild/docs/core/element/special/ReactiveJsonSubroot.yaml +154 -34
- package/public/rjbuild/docs/core/element/special/Switch.md +5 -5
- package/public/rjbuild/docs/core/element/special/Switch.yaml +9 -18
- package/public/rjbuild/docs/core/example/html.md +2 -2
- package/public/rjbuild/docs/core/example/html.yaml +2 -3
- package/public/rjbuild/docs/core/example/native-html-forms.md +245 -0
- package/public/rjbuild/docs/core/example/native-html-forms.yaml +393 -0
- package/public/rjbuild/docs/core/hook/index.md +38 -0
- package/public/rjbuild/docs/core/hook/index.yaml +44 -0
- package/public/rjbuild/docs/core/hook/usePagination.md +286 -0
- package/public/rjbuild/docs/core/hook/usePagination.yaml +319 -0
- package/public/rjbuild/docs/core/hook/useTransformedAttributes.md +130 -0
- package/public/rjbuild/docs/core/hook/useTransformedAttributes.yaml +164 -0
- package/public/rjbuild/docs/core/reaction/addData.md +17 -3
- package/public/rjbuild/docs/core/reaction/addData.yaml +53 -9
- package/public/rjbuild/docs/core/reaction/fetchData.yaml +44 -8
- package/public/rjbuild/docs/core/reaction/setData.md +18 -4
- package/public/rjbuild/docs/core/reaction/setData.yaml +18 -4
- package/public/rjbuild/docs/docs-components/Mermaid.md +254 -0
- package/public/rjbuild/docs/docs-components/Mermaid.yaml +339 -0
- package/public/rjbuild/docs/docs-components/index.yaml +1 -0
- package/public/rjbuild/docs/getting-started/actions.md +1 -1
- package/public/rjbuild/docs/index.yaml +2 -1
- package/public/rjbuild/docs/install.md +2 -5
- package/public/rjbuild/docs/install.yaml +4 -10
- package/public/rjbuild/docs/{core → integration/bootstrap}/action/Popover.md +1 -1
- package/public/rjbuild/docs/{core → integration/bootstrap}/action/Tooltip.md +1 -1
- package/public/rjbuild/docs/integration/bootstrap/element/html/AccordionItem.md +69 -0
- package/public/rjbuild/docs/integration/bootstrap/element/html/Modal.md +127 -0
- package/public/rjbuild/docs/integration/bootstrap/element/html/Tabs.md +150 -0
- package/public/rjbuild/docs/integration/bootstrap/element/html/index.md +13 -0
- package/public/rjbuild/docs/integration/bootstrap/element/special/index.md +19 -0
- package/public/rjbuild/docs/integration/bootstrap/example/website.md +41 -0
- package/public/rjbuild/docs/integration/bootstrap/overview.md +69 -0
- package/public/rjbuild/docs/integration/bootstrap/overview.yaml +87 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/action/Popover.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/action/Tooltip.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/CheckBoxField.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/CheckBoxField.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/DateField.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/DateField.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/NumberField.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/NumberField.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/SelectField.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/SelectField.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/TextAreaField.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/TextAreaField.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/TextField.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/TextField.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/formElementsCommon.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/index.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/form/index.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/html/AccordionItem.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/html/Modal.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/html/Tabs.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/special/BootstrapElement.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/element/special/BootstrapElement.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/example/accordion.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/example/accordion.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/example/dynamic-content.md +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/example/dynamic-content.yaml +0 -0
- /package/public/rjbuild/docs/{core → integration/bootstrap}/example/website.yaml +0 -0
- /package/public/rjbuild/docs/{chartjs → integration/chartjs}/components.yaml +0 -0
- /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: {}
|