@sonata-innovations/fiber-types 2.2.0 → 2.5.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/AGENTS.md +52 -0
- package/CHANGELOG.md +92 -0
- package/README.md +105 -0
- package/dist/flow-data.d.ts +3 -1
- package/dist/flow-data.d.ts.map +1 -1
- package/dist/flow.d.ts +50 -3
- package/dist/flow.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/docs/features/custom-presets-and-templates.md +428 -0
- package/docs/fiber-concepts.md +465 -0
- package/docs/schema/flow-data-schema.json +256 -0
- package/docs/schema/flow-data-schema.md +371 -0
- package/docs/schema/flow-quick-reference.md +196 -0
- package/docs/schema/flow-schema.json +899 -0
- package/docs/schema/flow-schema.md +875 -0
- package/package.json +18 -10
|
@@ -0,0 +1,899 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/sonata-innovations/fiber-docs/main/schema/flow-schema.json",
|
|
4
|
+
"title": "Fiber Flow",
|
|
5
|
+
"description": "Schema for Fiber Flow JSON — the format consumed by FBT (builder) and FBRE (render engine). As of @sonata-innovations/fiber-types v2, the TS-side Component is a discriminated union keyed on `type`; the on-disk JSON is unchanged.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["uuid", "metadata", "screens"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"uuid": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Unique identifier for the flow."
|
|
13
|
+
},
|
|
14
|
+
"metadata": { "$ref": "#/$defs/FlowMetadata" },
|
|
15
|
+
"config": { "$ref": "#/$defs/FlowConfiguration" },
|
|
16
|
+
"screens": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"description": "Ordered list of screens in the flow.",
|
|
19
|
+
"items": { "$ref": "#/$defs/FlowScreen" }
|
|
20
|
+
},
|
|
21
|
+
"calculations": {
|
|
22
|
+
"type": "array",
|
|
23
|
+
"description": "Top-level calculations. Each defines a named formula that references component values, option metadata, or other calculations.",
|
|
24
|
+
"items": { "$ref": "#/$defs/FlowCalculation" }
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
"$defs": {
|
|
29
|
+
"FlowMetadata": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"description": "Descriptive metadata for the flow.",
|
|
32
|
+
"properties": {
|
|
33
|
+
"name": { "type": "string" },
|
|
34
|
+
"description": { "type": "string" }
|
|
35
|
+
},
|
|
36
|
+
"additionalProperties": { "type": "string" }
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
"ThemeConfig": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"description": "Visual theme settings.",
|
|
42
|
+
"properties": {
|
|
43
|
+
"color": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "Accent / primary color (--fbre-theme-color)."
|
|
46
|
+
},
|
|
47
|
+
"colorScheme": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"description": "Built-in palette preset that seeds the token layer. Default 'light'. Replaces the former 'darkMode' boolean (darkMode:true -> colorScheme:'dark').",
|
|
50
|
+
"enum": ["light", "dark"]
|
|
51
|
+
},
|
|
52
|
+
"background": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"description": "Page/form ground color (--fbre-bg)."
|
|
55
|
+
},
|
|
56
|
+
"surface": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"description": "Raised surface: input fills, cards, popups (--fbre-surface). Derives hover/alt/subtle surfaces and input fills."
|
|
59
|
+
},
|
|
60
|
+
"text": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"description": "Primary text color (--fbre-text). Derives secondary/placeholder/disabled/label."
|
|
63
|
+
},
|
|
64
|
+
"border": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"description": "Border/rule color (--fbre-border). Derives hover/light/subtle."
|
|
67
|
+
},
|
|
68
|
+
"radius": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"description": "Corner radius as a CSS length (--fbre-radius), e.g. '3px'."
|
|
71
|
+
},
|
|
72
|
+
"fontFamily": {
|
|
73
|
+
"description": "Font family (--fbre-font). A plain CSS stack string uses whatever font the host page already provides; an object additionally carries the sources FBRE registers itself via ensureFontLoaded, which is what makes a brand font work inside a shadow root.",
|
|
74
|
+
"oneOf": [
|
|
75
|
+
{ "type": "string" },
|
|
76
|
+
{ "$ref": "#/$defs/FontFamilyConfig" }
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"error": {
|
|
80
|
+
"type": "string",
|
|
81
|
+
"description": "Error state color (--fbre-error)."
|
|
82
|
+
},
|
|
83
|
+
"success": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"description": "Success state color (--fbre-success)."
|
|
86
|
+
},
|
|
87
|
+
"warning": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"description": "Warning state color (--fbre-warning)."
|
|
90
|
+
},
|
|
91
|
+
"style": {
|
|
92
|
+
"type": "string",
|
|
93
|
+
"description": "Visual style for form elements. Standard mode styles: 'clean' = bottom-border inputs with uppercase labels (default). 'outlined' = full-border inputs with normal-case labels. 'refined-clean' = animated underline focus with left-accent groups. 'airy-clean' = spacious layout with tinted focus and pill buttons. 'soft-outlined' = full-border 8px radius with shadow-ring focus. 'defined-outlined' = filled-background inputs with top-accent groups. Conversational mode styles: 'centered-minimal' = thin underline inputs, bordered option cards, uppercase labels. 'stacked-cards' = filled background cards with left accent, keyboard shortcut badges. 'soft-float' = pill-shaped options with shadow lift on hover. 'bold-statement' = heavy borders, bold typography, inverted selection. Each style has a default stepper visual (see stepperStyle).",
|
|
94
|
+
"enum": ["clean", "outlined", "refined-clean", "airy-clean", "soft-outlined", "defined-outlined", "centered-minimal", "stacked-cards", "soft-float", "bold-statement"]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
"FontSource": {
|
|
100
|
+
"type": "object",
|
|
101
|
+
"additionalProperties": false,
|
|
102
|
+
"required": ["url"],
|
|
103
|
+
"properties": {
|
|
104
|
+
"url": {
|
|
105
|
+
"type": "string",
|
|
106
|
+
"description": "Where the font file is served from."
|
|
107
|
+
},
|
|
108
|
+
"format": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"description": "CSS format() hint, e.g. 'woff2'."
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"FontFaceConfig": {
|
|
115
|
+
"type": "object",
|
|
116
|
+
"description": "One @font-face — a single weight/style of the family.",
|
|
117
|
+
"additionalProperties": false,
|
|
118
|
+
"required": ["src"],
|
|
119
|
+
"properties": {
|
|
120
|
+
"src": {
|
|
121
|
+
"type": "array",
|
|
122
|
+
"items": { "$ref": "#/$defs/FontSource" },
|
|
123
|
+
"minItems": 1
|
|
124
|
+
},
|
|
125
|
+
"weight": {
|
|
126
|
+
"type": "string",
|
|
127
|
+
"description": "CSS font-weight: '400', '700', or a variable range like '100 900'."
|
|
128
|
+
},
|
|
129
|
+
"style": {
|
|
130
|
+
"type": "string",
|
|
131
|
+
"enum": ["normal", "italic", "oblique"]
|
|
132
|
+
},
|
|
133
|
+
"display": {
|
|
134
|
+
"type": "string",
|
|
135
|
+
"enum": ["auto", "block", "swap", "fallback", "optional"]
|
|
136
|
+
},
|
|
137
|
+
"unicodeRange": { "type": "string" }
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"FontFamilyConfig": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"description": "A brand font the renderer can load, rather than a family name it can only hope the host page already has.",
|
|
143
|
+
"additionalProperties": false,
|
|
144
|
+
"required": ["family"],
|
|
145
|
+
"properties": {
|
|
146
|
+
"family": {
|
|
147
|
+
"type": "string",
|
|
148
|
+
"description": "CSS family name, used for both the @font-face and the token value."
|
|
149
|
+
},
|
|
150
|
+
"src": {
|
|
151
|
+
"type": "array",
|
|
152
|
+
"items": { "$ref": "#/$defs/FontSource" },
|
|
153
|
+
"description": "Shorthand for a single regular face. Merged with faces."
|
|
154
|
+
},
|
|
155
|
+
"faces": {
|
|
156
|
+
"type": "array",
|
|
157
|
+
"items": { "$ref": "#/$defs/FontFaceConfig" },
|
|
158
|
+
"description": "Additional faces — a second weight, an italic."
|
|
159
|
+
},
|
|
160
|
+
"stack": {
|
|
161
|
+
"type": "string",
|
|
162
|
+
"description": "Full CSS stack written to --fbre-font. Defaults to the family plus a system fallback."
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
"NavigationConfig": {
|
|
167
|
+
"type": "object",
|
|
168
|
+
"description": "Screen navigation settings.",
|
|
169
|
+
"properties": {
|
|
170
|
+
"transition": {
|
|
171
|
+
"type": "string",
|
|
172
|
+
"description": "Screen transition animation type. Absent or 'none' means instant swap.",
|
|
173
|
+
"enum": ["none", "slide", "fade", "slideFade", "rise", "scaleFade"]
|
|
174
|
+
},
|
|
175
|
+
"allowInvalidTransition": {
|
|
176
|
+
"type": "boolean",
|
|
177
|
+
"description": "Allow navigating forward even when the screen has validation errors."
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
"ControlsConfig": {
|
|
183
|
+
"type": "object",
|
|
184
|
+
"description": "Navigation controls settings.",
|
|
185
|
+
"properties": {
|
|
186
|
+
"show": {
|
|
187
|
+
"type": "boolean",
|
|
188
|
+
"description": "Show built-in next/back navigation buttons. Default true."
|
|
189
|
+
},
|
|
190
|
+
"layout": {
|
|
191
|
+
"type": "string",
|
|
192
|
+
"description": "Layout for the navigation controls. 'default' = side-by-side grid (back-left / stepper-center / next-right); rows with a single visible button collapse to full-width. 'centered' = stepper on its own row above, buttons centered as a group below. 'inline-full' = stepper on its own row above, buttons side-by-side at 50% width each (or full-width solo). 'stacked' = stepper, then Back, then Next, stacked vertically at full-width.",
|
|
193
|
+
"enum": ["default", "centered", "inline-full", "stacked"]
|
|
194
|
+
},
|
|
195
|
+
"showStepper": {
|
|
196
|
+
"type": "boolean",
|
|
197
|
+
"description": "Show the step indicator dots in the controls bar. Default true."
|
|
198
|
+
},
|
|
199
|
+
"stepperStyle": {
|
|
200
|
+
"type": "string",
|
|
201
|
+
"description": "Style of the step indicator. 'default' = use the form style's default stepper. 'dots' = standard circles, scale on active. 'pill' = active dot stretches to pill shape. 'glow' = active dot gets a glow ring. 'bar' = track + counter (hides dots). 'text' = 'Step X of Y' text above screen content. Default 'default'.",
|
|
202
|
+
"enum": ["default", "dots", "pill", "glow", "bar", "text"]
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
"ConfirmationConfig": {
|
|
208
|
+
"type": "object",
|
|
209
|
+
"description": "Terminal 'thank you' / confirmation screen shown after the flow is submitted. Presentation-only, so it lives on the config rather than as a Screen. In local and remote modes it renders only when 'show' is not false and 'title' or 'body' has content (or the parent supplies an override via the onFlowComplete return value); server-driven mode falls back to a generic 'Thank you' when nothing is configured. An explicit 'show': false renders nothing in every mode.",
|
|
210
|
+
"properties": {
|
|
211
|
+
"show": {
|
|
212
|
+
"type": "boolean",
|
|
213
|
+
"description": "Explicit off-switch. Content presence is the positive gate."
|
|
214
|
+
},
|
|
215
|
+
"title": {
|
|
216
|
+
"type": "string",
|
|
217
|
+
"description": "Heading text. Supports ${...} reference markup and text formatting."
|
|
218
|
+
},
|
|
219
|
+
"body": {
|
|
220
|
+
"type": "string",
|
|
221
|
+
"description": "Body text. Supports ${...} reference markup and text formatting."
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
"FlowConfiguration": {
|
|
227
|
+
"type": "object",
|
|
228
|
+
"description": "Runtime configuration for the flow.",
|
|
229
|
+
"properties": {
|
|
230
|
+
"mode": {
|
|
231
|
+
"type": "string",
|
|
232
|
+
"description": "Form presentation mode. 'standard' = multi-field screens (default). 'conversational' = one-question-per-screen, vertically centered, with auto-advance on selection, Enter-to-advance on text inputs, and animated component entry.",
|
|
233
|
+
"enum": ["standard", "conversational"]
|
|
234
|
+
},
|
|
235
|
+
"theme": { "$ref": "#/$defs/ThemeConfig" },
|
|
236
|
+
"navigation": { "$ref": "#/$defs/NavigationConfig" },
|
|
237
|
+
"controls": { "$ref": "#/$defs/ControlsConfig" },
|
|
238
|
+
"summary": {
|
|
239
|
+
"type": "boolean",
|
|
240
|
+
"description": "Show a summary screen before completion."
|
|
241
|
+
},
|
|
242
|
+
"confirmation": { "$ref": "#/$defs/ConfirmationConfig" }
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
|
|
246
|
+
"FlowScreen": {
|
|
247
|
+
"type": "object",
|
|
248
|
+
"description": "A single screen (page) in the flow.",
|
|
249
|
+
"required": ["uuid", "components"],
|
|
250
|
+
"additionalProperties": false,
|
|
251
|
+
"properties": {
|
|
252
|
+
"uuid": { "type": "string" },
|
|
253
|
+
"label": {
|
|
254
|
+
"type": "string",
|
|
255
|
+
"description": "Display label for the screen, shown in navigation."
|
|
256
|
+
},
|
|
257
|
+
"components": {
|
|
258
|
+
"type": "array",
|
|
259
|
+
"items": { "$ref": "#/$defs/Component" }
|
|
260
|
+
},
|
|
261
|
+
"conditions": { "$ref": "#/$defs/FlowConditionConfig" },
|
|
262
|
+
"nextButtonLabel": {
|
|
263
|
+
"type": "string",
|
|
264
|
+
"description": "Custom label for the Next/Done navigation button on this screen. Overrides the default text."
|
|
265
|
+
},
|
|
266
|
+
"backButtonLabel": {
|
|
267
|
+
"type": "string",
|
|
268
|
+
"description": "Custom label for the Back navigation button on this screen. Overrides the default text."
|
|
269
|
+
},
|
|
270
|
+
"valid": {
|
|
271
|
+
"type": "boolean",
|
|
272
|
+
"description": "Runtime validity state. Do not set in authored JSON."
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
|
|
277
|
+
"Component": {
|
|
278
|
+
"type": "object",
|
|
279
|
+
"description": "A single form component.",
|
|
280
|
+
"required": ["uuid", "type", "properties"],
|
|
281
|
+
"properties": {
|
|
282
|
+
"uuid": {
|
|
283
|
+
"type": "string",
|
|
284
|
+
"description": "Unique identifier for the component."
|
|
285
|
+
},
|
|
286
|
+
"type": {
|
|
287
|
+
"type": "string",
|
|
288
|
+
"description": "Component type key. Acts as the discriminator on the TS-side Component union; narrowing on this value types `properties` to the matching Component*Properties variant.",
|
|
289
|
+
"enum": [
|
|
290
|
+
"header",
|
|
291
|
+
"text",
|
|
292
|
+
"divider",
|
|
293
|
+
"callout",
|
|
294
|
+
"table",
|
|
295
|
+
"inputText",
|
|
296
|
+
"inputTextArea",
|
|
297
|
+
"inputNumber",
|
|
298
|
+
"dropDown",
|
|
299
|
+
"dropDownMulti",
|
|
300
|
+
"checkbox",
|
|
301
|
+
"radio",
|
|
302
|
+
"rating",
|
|
303
|
+
"slider",
|
|
304
|
+
"toggleSwitch",
|
|
305
|
+
"fileUpload",
|
|
306
|
+
"group",
|
|
307
|
+
"date",
|
|
308
|
+
"time",
|
|
309
|
+
"dateTime",
|
|
310
|
+
"dateRange",
|
|
311
|
+
"timeRange",
|
|
312
|
+
"dateTimeRange",
|
|
313
|
+
"yesNo",
|
|
314
|
+
"confirm",
|
|
315
|
+
"colorPicker",
|
|
316
|
+
"cardSelect",
|
|
317
|
+
"repeater",
|
|
318
|
+
"computed",
|
|
319
|
+
"signature"
|
|
320
|
+
]
|
|
321
|
+
},
|
|
322
|
+
"properties": {
|
|
323
|
+
"description": "Type-specific properties. JSON schema is the open ComponentProperties shape below; TypeScript narrows it per-type via the variant map in types/src/component-variants.ts.",
|
|
324
|
+
"$ref": "#/$defs/ComponentProperties"
|
|
325
|
+
},
|
|
326
|
+
"conditions": { "$ref": "#/$defs/FlowConditionConfig" },
|
|
327
|
+
"components": {
|
|
328
|
+
"type": "array",
|
|
329
|
+
"description": "Child component templates. Used by 'group' and 'repeater' types.",
|
|
330
|
+
"items": { "$ref": "#/$defs/Component" }
|
|
331
|
+
},
|
|
332
|
+
"value": {
|
|
333
|
+
"description": "Current value. Typically set at runtime, not in authored JSON."
|
|
334
|
+
},
|
|
335
|
+
"addedComponents": {
|
|
336
|
+
"type": "array",
|
|
337
|
+
"description": "Runtime group/repeater iterations. Do not set in authored JSON.",
|
|
338
|
+
"items": {
|
|
339
|
+
"type": "array",
|
|
340
|
+
"items": { "$ref": "#/$defs/Component" }
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
"valid": {
|
|
344
|
+
"type": "boolean",
|
|
345
|
+
"description": "Runtime validity state. Do not set in authored JSON."
|
|
346
|
+
},
|
|
347
|
+
"display": {
|
|
348
|
+
"type": "object",
|
|
349
|
+
"description": "Runtime display overrides. Do not set in authored JSON.",
|
|
350
|
+
"additionalProperties": true
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
"additionalProperties": false
|
|
354
|
+
},
|
|
355
|
+
|
|
356
|
+
"ComponentProperties": {
|
|
357
|
+
"type": "object",
|
|
358
|
+
"description": "Properties vary by component type. Common fields documented here; type-specific fields below.",
|
|
359
|
+
"properties": {
|
|
360
|
+
"label": {
|
|
361
|
+
"type": "string",
|
|
362
|
+
"description": "Display label for the component."
|
|
363
|
+
},
|
|
364
|
+
"value": {
|
|
365
|
+
"type": "string",
|
|
366
|
+
"description": "Static content value (used by display components: header, text, divider)."
|
|
367
|
+
},
|
|
368
|
+
"displayType": {
|
|
369
|
+
"type": "boolean",
|
|
370
|
+
"description": "When true on a 'text' component, renders as display-only (no input)."
|
|
371
|
+
},
|
|
372
|
+
"required": {
|
|
373
|
+
"type": "boolean",
|
|
374
|
+
"description": "Whether the field must have a value to pass validation."
|
|
375
|
+
},
|
|
376
|
+
"placeholder": {
|
|
377
|
+
"type": "string",
|
|
378
|
+
"description": "Placeholder text shown when the field is empty."
|
|
379
|
+
},
|
|
380
|
+
"helperText": {
|
|
381
|
+
"type": "string",
|
|
382
|
+
"description": "Instructional text displayed below the field."
|
|
383
|
+
},
|
|
384
|
+
"tooltip": {
|
|
385
|
+
"type": "string",
|
|
386
|
+
"description": "Tooltip text shown on hover/focus of an info icon."
|
|
387
|
+
},
|
|
388
|
+
"detail": {
|
|
389
|
+
"type": "string",
|
|
390
|
+
"description": "Rich text displayed above the component. Supports markup ([b], [i], [l]). When set, hides the label unless showLabel is true."
|
|
391
|
+
},
|
|
392
|
+
"regex": {
|
|
393
|
+
"type": "string",
|
|
394
|
+
"description": "Regular expression pattern for input validation."
|
|
395
|
+
},
|
|
396
|
+
"maxlength": {
|
|
397
|
+
"type": "integer",
|
|
398
|
+
"description": "Maximum character length for text inputs."
|
|
399
|
+
},
|
|
400
|
+
"startAdornment": {
|
|
401
|
+
"type": "string",
|
|
402
|
+
"description": "Text or symbol displayed at the start of the input field (e.g. '$', '+1')."
|
|
403
|
+
},
|
|
404
|
+
"textAlign": {
|
|
405
|
+
"type": "string",
|
|
406
|
+
"description": "Text alignment for divider labels.",
|
|
407
|
+
"enum": ["left", "center", "right"]
|
|
408
|
+
},
|
|
409
|
+
"options": {
|
|
410
|
+
"type": "array",
|
|
411
|
+
"description": "Available choices for selection components (dropDown, dropDownMulti, checkbox, radio, cardSelect).",
|
|
412
|
+
"items": { "anyOf": [{ "$ref": "#/$defs/Option" }, { "$ref": "#/$defs/CardSelectOption" }] }
|
|
413
|
+
},
|
|
414
|
+
"min": {
|
|
415
|
+
"description": "Minimum value. Number for slider and inputNumber. String for date/time types: ISO date (YYYY-MM-DD), relative expression (today, today+7, today-3), or time (HH:MM). For inputNumber, sets the HTML min attribute and clamps value on blur.",
|
|
416
|
+
"oneOf": [{ "type": "number" }, { "type": "string" }]
|
|
417
|
+
},
|
|
418
|
+
"max": {
|
|
419
|
+
"description": "Maximum value. Number for slider/rating and inputNumber. String for date/time types: ISO date (YYYY-MM-DD), relative expression (today, today+7, today-3), or time (HH:MM). For inputNumber, sets the HTML max attribute and clamps value on blur.",
|
|
420
|
+
"oneOf": [{ "type": "number" }, { "type": "string" }]
|
|
421
|
+
},
|
|
422
|
+
"steps": {
|
|
423
|
+
"type": "number",
|
|
424
|
+
"description": "Step increment for slider."
|
|
425
|
+
},
|
|
426
|
+
"marks": {
|
|
427
|
+
"type": "boolean",
|
|
428
|
+
"description": "Show tick marks on slider."
|
|
429
|
+
},
|
|
430
|
+
"initValue": {
|
|
431
|
+
"type": "number",
|
|
432
|
+
"description": "Initial value for slider."
|
|
433
|
+
},
|
|
434
|
+
"precision": {
|
|
435
|
+
"type": "number",
|
|
436
|
+
"description": "Rating precision (e.g. 0.5 for half-stars, 1 for whole stars)."
|
|
437
|
+
},
|
|
438
|
+
"accept": {
|
|
439
|
+
"type": "string",
|
|
440
|
+
"description": "Comma-separated file extensions for fileUpload (e.g. '.pdf,.jpg,.png')."
|
|
441
|
+
},
|
|
442
|
+
"maxSize": {
|
|
443
|
+
"type": "integer",
|
|
444
|
+
"description": "Maximum file size in bytes for fileUpload."
|
|
445
|
+
},
|
|
446
|
+
"width": {
|
|
447
|
+
"type": "string",
|
|
448
|
+
"description": "Component width for flow-based layout. Components flow left-to-right and wrap naturally. Absent/undefined means full width.",
|
|
449
|
+
"enum": [
|
|
450
|
+
"full",
|
|
451
|
+
"half",
|
|
452
|
+
"third",
|
|
453
|
+
"two-thirds",
|
|
454
|
+
"quarter",
|
|
455
|
+
"three-quarters"
|
|
456
|
+
]
|
|
457
|
+
},
|
|
458
|
+
"showLabel": {
|
|
459
|
+
"type": "boolean",
|
|
460
|
+
"description": "Show the component label even when detail text is set. For groups/repeaters, shows the label as a visible header."
|
|
461
|
+
},
|
|
462
|
+
"collapsible": {
|
|
463
|
+
"type": "boolean",
|
|
464
|
+
"description": "Allow the group or repeater to be collapsed/expanded."
|
|
465
|
+
},
|
|
466
|
+
"showBorder": {
|
|
467
|
+
"type": "boolean",
|
|
468
|
+
"description": "Draw the container border/frame around the group or repeater."
|
|
469
|
+
},
|
|
470
|
+
"minIterations": {
|
|
471
|
+
"type": "integer",
|
|
472
|
+
"description": "Minimum number of repeater iterations. Also determines initial row count when no initialData is provided. Default 1.",
|
|
473
|
+
"minimum": 1
|
|
474
|
+
},
|
|
475
|
+
"initialData": {
|
|
476
|
+
"type": "array",
|
|
477
|
+
"description": "Pre-populated data for repeater iterations. Each element is an object mapping template child UUIDs to initial values.",
|
|
478
|
+
"items": {
|
|
479
|
+
"type": "object",
|
|
480
|
+
"additionalProperties": true
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
"mode": {
|
|
484
|
+
"type": "string",
|
|
485
|
+
"description": "Signature component mode: draw (canvas), type (text in script font), or both (toggle).",
|
|
486
|
+
"enum": ["draw", "type", "both"]
|
|
487
|
+
},
|
|
488
|
+
"validation": {
|
|
489
|
+
"$ref": "#/$defs/FlowValidationConfig"
|
|
490
|
+
},
|
|
491
|
+
"inputType": {
|
|
492
|
+
"type": "string",
|
|
493
|
+
"description": "HTML input type hint for inputText. Controls mobile keyboard behavior and input masking.",
|
|
494
|
+
"enum": ["text", "email", "tel", "url", "password"]
|
|
495
|
+
},
|
|
496
|
+
"readOnly": {
|
|
497
|
+
"type": "boolean",
|
|
498
|
+
"description": "When true, the field is non-editable with a muted background. Applies to inputText, inputTextArea, inputNumber, dropDown, dropDownMulti, radio, checkbox, slider, date, time, and dateTime."
|
|
499
|
+
},
|
|
500
|
+
"autocomplete": {
|
|
501
|
+
"type": "string",
|
|
502
|
+
"description": "HTML autocomplete attribute value for browser autofill (e.g. 'email', 'tel', 'given-name'). Applies to inputText, inputTextArea, and inputNumber."
|
|
503
|
+
},
|
|
504
|
+
"showPasswordToggle": {
|
|
505
|
+
"type": "boolean",
|
|
506
|
+
"description": "When true and inputType is 'password', shows an eye icon to toggle password visibility. Applies to inputText."
|
|
507
|
+
},
|
|
508
|
+
"columns": {
|
|
509
|
+
"description": "For cardSelect: number of columns in the card grid (integer, default 2). For table: array of column definitions.",
|
|
510
|
+
"oneOf": [
|
|
511
|
+
{ "type": "integer", "minimum": 1, "maximum": 4 },
|
|
512
|
+
{ "type": "array", "items": { "$ref": "#/$defs/TableColumn" } }
|
|
513
|
+
]
|
|
514
|
+
},
|
|
515
|
+
"placeholderStart": {
|
|
516
|
+
"type": "string",
|
|
517
|
+
"description": "Placeholder text for the start field in range components (dateRange, timeRange, dateTimeRange)."
|
|
518
|
+
},
|
|
519
|
+
"placeholderEnd": {
|
|
520
|
+
"type": "string",
|
|
521
|
+
"description": "Placeholder text for the end field in range components (dateRange, timeRange, dateTimeRange)."
|
|
522
|
+
},
|
|
523
|
+
"step": {
|
|
524
|
+
"type": "number",
|
|
525
|
+
"description": "Minute interval for time-related components (time, dateTime, timeRange, dateTimeRange). Default 15."
|
|
526
|
+
},
|
|
527
|
+
"dateFormat": {
|
|
528
|
+
"type": "string",
|
|
529
|
+
"description": "Display format for dates. Applies to date, dateTime, dateRange, dateTimeRange. Default MM/DD/YYYY.",
|
|
530
|
+
"enum": ["MM/DD/YYYY", "DD/MM/YYYY", "YYYY-MM-DD"]
|
|
531
|
+
},
|
|
532
|
+
"minTime": {
|
|
533
|
+
"type": "string",
|
|
534
|
+
"description": "Minimum allowed time (HH:MM, 24h) for dateTime and dateTimeRange. Enforced independently from min date."
|
|
535
|
+
},
|
|
536
|
+
"maxTime": {
|
|
537
|
+
"type": "string",
|
|
538
|
+
"description": "Maximum allowed time (HH:MM, 24h) for dateTime and dateTimeRange. Enforced independently from max date."
|
|
539
|
+
},
|
|
540
|
+
"swatches": {
|
|
541
|
+
"type": "array",
|
|
542
|
+
"description": "Preset color swatches for the colorPicker component.",
|
|
543
|
+
"items": { "type": "string" }
|
|
544
|
+
},
|
|
545
|
+
"defaultValue": {
|
|
546
|
+
"type": "string",
|
|
547
|
+
"description": "Pre-selected initial value. For colorPicker: hex color (e.g. '#FF0000'). For yesNo: 'yes' or 'no'. For radio, cardSelect, dropDown: the option value to pre-select. Ignored when no option matches; without it these components start at null (no default-to-first-option behavior)."
|
|
548
|
+
},
|
|
549
|
+
"labelYes": {
|
|
550
|
+
"type": "string",
|
|
551
|
+
"description": "Custom label for the 'Yes' button in yesNo component. Defaults to 'Yes'."
|
|
552
|
+
},
|
|
553
|
+
"labelNo": {
|
|
554
|
+
"type": "string",
|
|
555
|
+
"description": "Custom label for the 'No' button in yesNo component. Defaults to 'No'."
|
|
556
|
+
},
|
|
557
|
+
"layout": {
|
|
558
|
+
"type": "string",
|
|
559
|
+
"description": "Button layout direction for yesNo component. 'horizontal' keeps buttons side-by-side (even on small screens), 'vertical' stacks them. Defaults to responsive (horizontal on wide, vertical on narrow).",
|
|
560
|
+
"enum": ["horizontal", "vertical"]
|
|
561
|
+
},
|
|
562
|
+
"title": {
|
|
563
|
+
"type": "string",
|
|
564
|
+
"description": "Title text for the callout component, displayed as a bold header line."
|
|
565
|
+
},
|
|
566
|
+
"variant": {
|
|
567
|
+
"type": "string",
|
|
568
|
+
"description": "Visual variant for the callout component.",
|
|
569
|
+
"enum": ["info", "success", "warning", "neutral"]
|
|
570
|
+
},
|
|
571
|
+
"icon": {
|
|
572
|
+
"type": "string",
|
|
573
|
+
"description": "Icon key for the callout or rating component. Callout icons: info, check, warning, question, lightbulb, megaphone, bell, shield, lock, heart, flag, bookmark, zap, pencil, star, none. Rating icons: star, heart, thumbsUp, circle, diamond. Falls back to variant default (callout) or star (rating) if omitted."
|
|
574
|
+
},
|
|
575
|
+
"rows": {
|
|
576
|
+
"type": "array",
|
|
577
|
+
"description": "Table rows. Each row has a label and an array of cell values matching the columns.",
|
|
578
|
+
"items": { "$ref": "#/$defs/TableRow" }
|
|
579
|
+
},
|
|
580
|
+
"highlightColumn": {
|
|
581
|
+
"type": "integer",
|
|
582
|
+
"description": "1-based column number to visually highlight (0 = none).",
|
|
583
|
+
"minimum": 0
|
|
584
|
+
},
|
|
585
|
+
"formula": {
|
|
586
|
+
"type": "string",
|
|
587
|
+
"description": "Formula expression for computed components. References other fields via {uuid} syntax. Supports +, -, *, /, SUM(), COUNT(), AVG(), MIN(), MAX() (aggregation and scalar), IF(cond, then, else), comparison operators (>, <, >=, <=, ==, !=), and .selectedOption.metadata.key."
|
|
588
|
+
},
|
|
589
|
+
"format": {
|
|
590
|
+
"type": "string",
|
|
591
|
+
"description": "Display format for computed components and calculations.",
|
|
592
|
+
"enum": ["number", "currency", "percentage"]
|
|
593
|
+
},
|
|
594
|
+
"decimalPlaces": {
|
|
595
|
+
"type": "integer",
|
|
596
|
+
"description": "Number of decimal places (0-10). On inputNumber: restricts input via keystroke filtering; on computed/calculations: display precision.",
|
|
597
|
+
"minimum": 0,
|
|
598
|
+
"maximum": 10
|
|
599
|
+
},
|
|
600
|
+
"currencySymbol": {
|
|
601
|
+
"type": "string",
|
|
602
|
+
"description": "Currency symbol prepended to value when format is 'currency'. Defaults to '$'."
|
|
603
|
+
}
|
|
604
|
+
},
|
|
605
|
+
"additionalProperties": true
|
|
606
|
+
},
|
|
607
|
+
|
|
608
|
+
"FlowValidationConfig": {
|
|
609
|
+
"type": "object",
|
|
610
|
+
"description": "Validation configuration for a component. Contains an array of validation rules.",
|
|
611
|
+
"required": ["rules"],
|
|
612
|
+
"additionalProperties": false,
|
|
613
|
+
"properties": {
|
|
614
|
+
"rules": {
|
|
615
|
+
"type": "array",
|
|
616
|
+
"description": "Ordered list of validation rules to evaluate.",
|
|
617
|
+
"items": { "$ref": "#/$defs/ValidationRule" }
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
},
|
|
621
|
+
|
|
622
|
+
"ValidationRule": {
|
|
623
|
+
"type": "object",
|
|
624
|
+
"description": "A single validation rule.",
|
|
625
|
+
"required": ["type"],
|
|
626
|
+
"additionalProperties": false,
|
|
627
|
+
"properties": {
|
|
628
|
+
"type": {
|
|
629
|
+
"type": "string",
|
|
630
|
+
"description": "The validation rule type.",
|
|
631
|
+
"enum": [
|
|
632
|
+
"required",
|
|
633
|
+
"email",
|
|
634
|
+
"phone",
|
|
635
|
+
"url",
|
|
636
|
+
"minLength",
|
|
637
|
+
"maxLength",
|
|
638
|
+
"exactLength",
|
|
639
|
+
"minValue",
|
|
640
|
+
"maxValue",
|
|
641
|
+
"pattern",
|
|
642
|
+
"minSelected",
|
|
643
|
+
"maxSelected",
|
|
644
|
+
"fileType",
|
|
645
|
+
"fileSize",
|
|
646
|
+
"contains",
|
|
647
|
+
"excludes",
|
|
648
|
+
"matchesField"
|
|
649
|
+
]
|
|
650
|
+
},
|
|
651
|
+
"params": {
|
|
652
|
+
"type": "object",
|
|
653
|
+
"description": "Type-specific parameters (e.g. { min: 3 } for minLength, { regex: '...' } for pattern, { field: 'uuid' } for matchesField).",
|
|
654
|
+
"additionalProperties": true
|
|
655
|
+
},
|
|
656
|
+
"message": {
|
|
657
|
+
"type": "string",
|
|
658
|
+
"description": "Optional custom error message. When omitted, a default message is used."
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
|
|
663
|
+
"Option": {
|
|
664
|
+
"type": "object",
|
|
665
|
+
"description": "A selectable option for dropdown, radio, or checkbox components.",
|
|
666
|
+
"required": ["label", "value"],
|
|
667
|
+
"additionalProperties": false,
|
|
668
|
+
"properties": {
|
|
669
|
+
"label": {
|
|
670
|
+
"type": "string",
|
|
671
|
+
"description": "Display text for the option."
|
|
672
|
+
},
|
|
673
|
+
"value": {
|
|
674
|
+
"description": "Value stored when the option is selected.",
|
|
675
|
+
"oneOf": [{ "type": "string" }, { "type": "number" }]
|
|
676
|
+
},
|
|
677
|
+
"metadata": {
|
|
678
|
+
"type": "object",
|
|
679
|
+
"description": "Optional structured metadata for the option (e.g. price, weight, unit). Keys are strings; values are strings, numbers, or booleans. Consumed by the calculations engine.",
|
|
680
|
+
"additionalProperties": {
|
|
681
|
+
"oneOf": [
|
|
682
|
+
{ "type": "string" },
|
|
683
|
+
{ "type": "number" },
|
|
684
|
+
{ "type": "boolean" }
|
|
685
|
+
]
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
},
|
|
690
|
+
|
|
691
|
+
"FlowConditionConfig": {
|
|
692
|
+
"type": "object",
|
|
693
|
+
"description": "Condition configuration for conditionally showing or hiding a component or screen.",
|
|
694
|
+
"required": ["action", "when"],
|
|
695
|
+
"additionalProperties": false,
|
|
696
|
+
"properties": {
|
|
697
|
+
"action": {
|
|
698
|
+
"type": "string",
|
|
699
|
+
"description": "'show' = visible when condition is met; 'hide' = hidden when condition is met.",
|
|
700
|
+
"enum": ["show", "hide"]
|
|
701
|
+
},
|
|
702
|
+
"when": { "$ref": "#/$defs/ConditionGroup" }
|
|
703
|
+
}
|
|
704
|
+
},
|
|
705
|
+
|
|
706
|
+
"ConditionGroup": {
|
|
707
|
+
"type": "object",
|
|
708
|
+
"description": "A group of condition rules evaluated with AND or OR logic.",
|
|
709
|
+
"required": ["logic", "rules"],
|
|
710
|
+
"additionalProperties": false,
|
|
711
|
+
"properties": {
|
|
712
|
+
"logic": {
|
|
713
|
+
"type": "string",
|
|
714
|
+
"description": "'and' = all rules must match; 'or' = any rule matches.",
|
|
715
|
+
"enum": ["and", "or"]
|
|
716
|
+
},
|
|
717
|
+
"rules": {
|
|
718
|
+
"type": "array",
|
|
719
|
+
"description": "One or more condition rules to evaluate.",
|
|
720
|
+
"items": { "$ref": "#/$defs/ConditionRule" },
|
|
721
|
+
"minItems": 1
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
},
|
|
725
|
+
|
|
726
|
+
"CardSelectOption": {
|
|
727
|
+
"type": "object",
|
|
728
|
+
"description": "An option card for the cardSelect component.",
|
|
729
|
+
"required": ["label", "value"],
|
|
730
|
+
"additionalProperties": false,
|
|
731
|
+
"properties": {
|
|
732
|
+
"label": {
|
|
733
|
+
"type": "string",
|
|
734
|
+
"description": "Display title for the card."
|
|
735
|
+
},
|
|
736
|
+
"value": {
|
|
737
|
+
"type": "string",
|
|
738
|
+
"description": "Value stored when this card is selected."
|
|
739
|
+
},
|
|
740
|
+
"description": {
|
|
741
|
+
"type": "string",
|
|
742
|
+
"description": "Short description text below the title."
|
|
743
|
+
},
|
|
744
|
+
"title": {
|
|
745
|
+
"type": "string",
|
|
746
|
+
"description": "Heading text displayed prominently on the card."
|
|
747
|
+
},
|
|
748
|
+
"features": {
|
|
749
|
+
"type": "array",
|
|
750
|
+
"description": "List of feature strings displayed as a checklist.",
|
|
751
|
+
"items": { "type": "string" }
|
|
752
|
+
},
|
|
753
|
+
"badge": {
|
|
754
|
+
"type": "string",
|
|
755
|
+
"description": "Badge text shown as a pill above the card (e.g. 'Popular')."
|
|
756
|
+
},
|
|
757
|
+
"metadata": {
|
|
758
|
+
"type": "object",
|
|
759
|
+
"description": "Arbitrary key-value pairs for calculations.",
|
|
760
|
+
"additionalProperties": {
|
|
761
|
+
"oneOf": [
|
|
762
|
+
{ "type": "string" },
|
|
763
|
+
{ "type": "number" },
|
|
764
|
+
{ "type": "boolean" }
|
|
765
|
+
]
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
},
|
|
770
|
+
|
|
771
|
+
"TableColumn": {
|
|
772
|
+
"type": "object",
|
|
773
|
+
"description": "A column definition for the table display component.",
|
|
774
|
+
"required": ["label"],
|
|
775
|
+
"additionalProperties": false,
|
|
776
|
+
"properties": {
|
|
777
|
+
"label": {
|
|
778
|
+
"type": "string",
|
|
779
|
+
"description": "Column header text."
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
},
|
|
783
|
+
|
|
784
|
+
"TableRow": {
|
|
785
|
+
"type": "object",
|
|
786
|
+
"description": "A row definition for the table display component.",
|
|
787
|
+
"required": ["label", "values"],
|
|
788
|
+
"additionalProperties": false,
|
|
789
|
+
"properties": {
|
|
790
|
+
"label": {
|
|
791
|
+
"type": "string",
|
|
792
|
+
"description": "Row header label shown in the first column."
|
|
793
|
+
},
|
|
794
|
+
"values": {
|
|
795
|
+
"type": "array",
|
|
796
|
+
"description": "Cell values for each column, in order.",
|
|
797
|
+
"items": { "type": "string" }
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
},
|
|
801
|
+
|
|
802
|
+
"ConditionRule": {
|
|
803
|
+
"type": "object",
|
|
804
|
+
"description": "A single condition rule comparing a source component's value using an operator.",
|
|
805
|
+
"required": ["source", "operator"],
|
|
806
|
+
"additionalProperties": false,
|
|
807
|
+
"properties": {
|
|
808
|
+
"source": {
|
|
809
|
+
"type": "string",
|
|
810
|
+
"description": "UUID of the source component whose value is tested, or a context key when sourceType is 'context'."
|
|
811
|
+
},
|
|
812
|
+
"sourceType": {
|
|
813
|
+
"type": "string",
|
|
814
|
+
"description": "Where to resolve the source value. 'component' (default) looks up a component UUID. 'context' looks up a key in FBRE's external context prop.",
|
|
815
|
+
"enum": ["component", "context"]
|
|
816
|
+
},
|
|
817
|
+
"operator": {
|
|
818
|
+
"type": "string",
|
|
819
|
+
"description": "The comparison operator to apply.",
|
|
820
|
+
"enum": [
|
|
821
|
+
"equals",
|
|
822
|
+
"notEquals",
|
|
823
|
+
"contains",
|
|
824
|
+
"notContains",
|
|
825
|
+
"startsWith",
|
|
826
|
+
"endsWith",
|
|
827
|
+
"isEmpty",
|
|
828
|
+
"isNotEmpty",
|
|
829
|
+
"greaterThan",
|
|
830
|
+
"greaterThanOrEqual",
|
|
831
|
+
"lessThan",
|
|
832
|
+
"lessThanOrEqual",
|
|
833
|
+
"isOneOf",
|
|
834
|
+
"isNotOneOf",
|
|
835
|
+
"includesAny",
|
|
836
|
+
"includesAll",
|
|
837
|
+
"includesNone",
|
|
838
|
+
"isTrue",
|
|
839
|
+
"isFalse"
|
|
840
|
+
]
|
|
841
|
+
},
|
|
842
|
+
"value": {
|
|
843
|
+
"description": "Comparison value. Omitted for unary operators (isEmpty, isNotEmpty, isTrue, isFalse). Arrays for set operators (isOneOf, isNotOneOf, includesAny, includesAll, includesNone).",
|
|
844
|
+
"oneOf": [
|
|
845
|
+
{ "type": "string" },
|
|
846
|
+
{ "type": "number" },
|
|
847
|
+
{ "type": "boolean" },
|
|
848
|
+
{
|
|
849
|
+
"type": "array",
|
|
850
|
+
"items": { "type": "string" }
|
|
851
|
+
},
|
|
852
|
+
{
|
|
853
|
+
"type": "array",
|
|
854
|
+
"items": { "type": "number" }
|
|
855
|
+
}
|
|
856
|
+
]
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
},
|
|
860
|
+
|
|
861
|
+
"CalculationFormat": {
|
|
862
|
+
"type": "string",
|
|
863
|
+
"description": "Display format for a calculation result.",
|
|
864
|
+
"enum": ["number", "currency", "percentage"]
|
|
865
|
+
},
|
|
866
|
+
|
|
867
|
+
"FlowCalculation": {
|
|
868
|
+
"type": "object",
|
|
869
|
+
"description": "A named formula that computes a value from component values, option metadata, and other calculations. Supports arithmetic (+, -, *, /), comparison operators (>, <, >=, <=, ==, !=), parentheses, field references ({uuid}), option metadata ({uuid}.selectedOption.metadata.key), aggregation functions (SUM, COUNT, AVG, MIN, MAX) over repeater iterations, scalar MIN/MAX with multiple arguments, and IF(condition, then, else) conditionals.",
|
|
870
|
+
"required": ["uuid", "label", "formula"],
|
|
871
|
+
"additionalProperties": false,
|
|
872
|
+
"properties": {
|
|
873
|
+
"uuid": {
|
|
874
|
+
"type": "string",
|
|
875
|
+
"description": "Unique identifier for the calculation."
|
|
876
|
+
},
|
|
877
|
+
"label": {
|
|
878
|
+
"type": "string",
|
|
879
|
+
"description": "Human-readable label displayed in the builder UI and available for reference markup."
|
|
880
|
+
},
|
|
881
|
+
"formula": {
|
|
882
|
+
"type": "string",
|
|
883
|
+
"description": "The formula expression. References use {uuid} syntax. Supports: arithmetic (+, -, *, /), parentheses, numeric literals, {uuid}.selectedOption.metadata.key for option metadata, SUM({uuid})/COUNT({uuid})/AVG({uuid}) for repeater aggregation."
|
|
884
|
+
},
|
|
885
|
+
"format": { "$ref": "#/$defs/CalculationFormat" },
|
|
886
|
+
"decimalPlaces": {
|
|
887
|
+
"type": "integer",
|
|
888
|
+
"description": "Number of decimal places for display formatting.",
|
|
889
|
+
"minimum": 0,
|
|
890
|
+
"maximum": 10
|
|
891
|
+
},
|
|
892
|
+
"currencySymbol": {
|
|
893
|
+
"type": "string",
|
|
894
|
+
"description": "Currency symbol prepended to the result when format is 'currency'. Defaults to '$'."
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
}
|