@optionfactory/fml 8.0.3 → 9.0.0-rc1

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 (50) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +88 -0
  3. package/dist/client-errors.iife.js +30 -9
  4. package/dist/client-errors.iife.js.map +1 -1
  5. package/dist/client-errors.iife.min.js +1 -1
  6. package/dist/client-errors.iife.min.js.map +1 -1
  7. package/dist/custom-elements.json +1529 -435
  8. package/dist/fml.css +21 -10
  9. package/dist/fml.css.map +1 -1
  10. package/dist/fml.d.mts +3 -1322
  11. package/dist/fml.iife.js +5267 -2276
  12. package/dist/fml.iife.js.map +1 -1
  13. package/dist/fml.iife.min.js +1 -1
  14. package/dist/fml.iife.min.js.map +1 -1
  15. package/dist/fml.min.mjs +1 -1
  16. package/dist/fml.min.mjs.map +1 -1
  17. package/dist/fml.mjs +6 -8737
  18. package/dist/fml.mjs.map +1 -1
  19. package/dist/ftl.d.mts +430 -92
  20. package/dist/ftl.iife.js +1314 -809
  21. package/dist/ftl.iife.js.map +1 -1
  22. package/dist/ftl.iife.min.js +1 -1
  23. package/dist/ftl.iife.min.js.map +1 -1
  24. package/dist/ftl.min.mjs +1 -1
  25. package/dist/ftl.min.mjs.map +1 -1
  26. package/dist/ftl.mjs +1313 -810
  27. package/dist/ftl.mjs.map +1 -1
  28. package/dist/ful.css +21 -10
  29. package/dist/ful.css.map +1 -1
  30. package/dist/ful.d.mts +801 -252
  31. package/dist/ful.iife.js +3677 -1378
  32. package/dist/ful.iife.js.map +1 -1
  33. package/dist/ful.iife.min.js +1 -1
  34. package/dist/ful.iife.min.js.map +1 -1
  35. package/dist/ful.min.mjs +1 -1
  36. package/dist/ful.min.mjs.map +1 -1
  37. package/dist/ful.mjs +3666 -1378
  38. package/dist/ful.mjs.map +1 -1
  39. package/dist/httpc.d.mts +114 -19
  40. package/dist/httpc.iife.js +253 -83
  41. package/dist/httpc.iife.js.map +1 -1
  42. package/dist/httpc.iife.min.js +1 -1
  43. package/dist/httpc.iife.min.js.map +1 -1
  44. package/dist/httpc.min.mjs +1 -1
  45. package/dist/httpc.min.mjs.map +1 -1
  46. package/dist/httpc.mjs +250 -84
  47. package/dist/httpc.mjs.map +1 -1
  48. package/dist/vscode.html-custom-data.json +600 -58
  49. package/dist/web-types.json +1475 -380
  50. package/package.json +16 -8
@@ -1,27 +1,270 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@optionfactory/fml",
4
- "version": "8.0.3",
4
+ "version": "9.0.0-rc1",
5
5
  "description-markup": "none",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "elements": [
9
9
  {
10
- "name": "ful-spinner",
11
- "description": "A busy indicator. ful-form shows and hides the ones it contains while submitting.",
12
- "attributes": [],
10
+ "name": "ful-tooltip",
11
+ "description": "An info affordance: a themed icon button toggling a small popover with a short explanation, opened by click and by keyboard like a button, dismissed by Escape or an outside click. placement picks the side the note sits on: bottom (default), top, left or right.",
12
+ "attributes": [
13
+ {
14
+ "name": "placement",
15
+ "description": "Which side of the trigger the note opens on: bottom (the default), top, start or end. The library places the note itself on every platform, so the side is the same everywhere.",
16
+ "value": {
17
+ "kind": "plain",
18
+ "type": "string"
19
+ }
20
+ }
21
+ ],
22
+ "slots": [
23
+ {
24
+ "name": "default",
25
+ "description": "The short explanation shown in the popover."
26
+ }
27
+ ],
28
+ "events": []
29
+ },
30
+ {
31
+ "name": "ful-dialog",
32
+ "description": "A modal dialog on the native platform: header, body and buttons, the header attribute naming its heading, opened by any element carrying dialog-target set to its id, or programmatically through open()/ask(), which resolve with the data-result of the button that closed the dialog (null on Escape). Longer explanations belong here, shorter ones in ful-tooltip.",
33
+ "attributes": [
34
+ {
35
+ "name": "header",
36
+ "description": "The dialog's title, shown in its header. Text only; slot content into the body instead for anything richer.",
37
+ "value": {
38
+ "kind": "plain",
39
+ "type": "string"
40
+ }
41
+ }
42
+ ],
43
+ "slots": [
44
+ {
45
+ "name": "default",
46
+ "description": "The dialog body."
47
+ },
48
+ {
49
+ "name": "buttons",
50
+ "description": "Buttons closing the dialog; each carries a data-result that ask() resolves with. Without this slot a localized acknowledge button is shown."
51
+ }
52
+ ],
53
+ "events": [
54
+ {
55
+ "name": "close",
56
+ "description": "Fired when the dialog closes, carrying the data-result of the button that closed it, or null on Escape; ask() and open() resolve with the same answer, and a dialog leaving the document while open answers its waiters with null."
57
+ },
58
+ {
59
+ "name": "section:requested",
60
+ "description": "Fired by the disclosure when it opens (bubbling): answer through AsyncEvents.asyncOn with the body's delivery; the open awaits the answers under the loading chrome, and a failed delivery paints the body's problems."
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "name": "ful-drawer",
66
+ "description": "A side panel drawer on the native dialog platform: a header with its title (the title attribute, or update()'s own) and close button, and a body that opens in a loading state, then shows either the content delivered by update(title, callback) (or the slotted one, when it is never updated) or the error a rejecting callback carries. placement picks the side, end by default, start its mirror. Any element carrying dialog-target set to its id opens it too.",
67
+ "attributes": [
68
+ {
69
+ "name": "title",
70
+ "description": "The drawer's title, shown in its header. Text only, and also what update() re-titles the panel with.",
71
+ "value": {
72
+ "kind": "plain",
73
+ "type": "string"
74
+ }
75
+ },
76
+ {
77
+ "name": "placement",
78
+ "description": "Which edge the panel slides in from: end (the default) or start, following the page's writing direction.",
79
+ "value": {
80
+ "kind": "plain",
81
+ "type": "string"
82
+ }
83
+ }
84
+ ],
85
+ "slots": [
86
+ {
87
+ "name": "default",
88
+ "description": "The drawer body, shown when update() never replaced it."
89
+ }
90
+ ],
91
+ "events": [
92
+ {
93
+ "name": "close",
94
+ "description": "Fired when the drawer closes, by its close button or Escape."
95
+ },
96
+ {
97
+ "name": "section:requested",
98
+ "description": "Fired by the disclosure when it opens (bubbling): answer through AsyncEvents.asyncOn with the body's delivery; the open awaits the answers under the loading chrome, and a failed delivery paints the body's problems."
99
+ }
100
+ ]
101
+ },
102
+ {
103
+ "name": "ful-toasts",
104
+ "description": "A transient feedback region, one per page: each show() (or a show-toast document event carrying the same detail) appends a toast that dismisses itself after its timeout, the element's timeout attribute or five seconds by default, and carries its own dismiss button. severity picks the theme and the announcement, info by default, success, warning and error, the error one announced as an alert; a Failure message shows its problems' reasons.",
105
+ "attributes": [
106
+ {
107
+ "name": "timeout",
108
+ "description": "How long a toast stands before it retires, in milliseconds; 5000 when absent. A show() may override it per toast.",
109
+ "value": {
110
+ "kind": "plain",
111
+ "type": "number"
112
+ }
113
+ }
114
+ ],
115
+ "slots": [],
116
+ "events": []
117
+ },
118
+ {
119
+ "name": "ful-tabs",
120
+ "description": "A tab panel: one visible panel at a time, announced through the tab pattern (a tablist of tab buttons, each panel a tabpanel named by its tab, the arrows and Home/End walking the tabs with automatic activation). The tabs are declared as tab elements in the tabs slot, the panels as the slotless children, paired in order; the chrome anchors on the ful-tablist style-only tag, so a subclass or foreign markup built from it keeps the look.",
121
+ "attributes": [
122
+ {
123
+ "name": "active",
124
+ "description": "The index of the visible panel, zero based, reflected as the active attribute. Clicks, the arrow keys and the property all move it, each move answering with a change event.",
125
+ "value": {
126
+ "kind": "plain",
127
+ "type": "number"
128
+ }
129
+ }
130
+ ],
131
+ "slots": [
132
+ {
133
+ "name": "tabs",
134
+ "description": "The tab declarations, one tab element per panel, carrying the tab's label."
135
+ },
136
+ {
137
+ "name": "default",
138
+ "description": "The panels, one element per declared tab, paired in order: each becomes a tabpanel announced by its tab."
139
+ }
140
+ ],
141
+ "events": [
142
+ {
143
+ "name": "change",
144
+ "description": "Fired with the active index and the previous one whenever the visible panel moves."
145
+ },
146
+ {
147
+ "name": "section:requested",
148
+ "description": "Fired by the component when one of its sections is entered (bubbling): the generic type of the family, joined by section:requested:#index and by section:requested:name when the section carries a data-step. Answer through AsyncEvents.asyncOn with the section's delivery; the component awaits the answers under its loading chrome, and a failed delivery paints the section's problems."
149
+ }
150
+ ]
151
+ },
152
+ {
153
+ "name": "ful-accordion",
154
+ "description": "An accordion over native details/summary disclosures: the platform carries the semantics, the keyboard and the toggling, the chrome paints the group (anchored on the ful-accordion-group style-only tag). With the exclusive claim the render assigns one shared name to every panel, which is the platform's own exclusive grouping: opening one closes the others.",
155
+ "attributes": [
156
+ {
157
+ "name": "exclusive",
158
+ "description": "When present, opening a panel closes the others: the native details name grouping, assigned (and assignable again) by the render.",
159
+ "value": {
160
+ "kind": "plain",
161
+ "type": "boolean"
162
+ }
163
+ }
164
+ ],
13
165
  "slots": [
14
166
  {
15
167
  "name": "default",
16
- "description": "Text shown next to the spinner."
168
+ "description": "The native details/summary disclosures, one per panel, rendered inside the group."
17
169
  }
18
170
  ],
19
171
  "events": []
20
172
  },
173
+ {
174
+ "name": "ful-wizard",
175
+ "description": "A wizard: a progress of steps over one-of-N sections. The steps are declared as step elements in the steps slot, the sections as the slotless children, paired in order; each section may carry a data-step name, which is what move() answers to, next() and prev() walk the neighbors, and the current step is the aria-current=step claim carried in lockstep by the step and its section, so the chrome, including which section is shown, follows the claim alone. Each move answers with a change event.",
176
+ "attributes": [
177
+ {
178
+ "name": "progress",
179
+ "description": "picks the progress chrome's shape over the same claims: the default shows the current step alone (any counter or dressing is the page's own), timeline the full timeline, dots a done/current/future strip, none leaves the chrome to the page.",
180
+ "value": {
181
+ "kind": "plain",
182
+ "type": "string"
183
+ }
184
+ }
185
+ ],
186
+ "slots": [
187
+ {
188
+ "name": "steps",
189
+ "description": "The step declarations, one step element per section, carrying the step's label."
190
+ },
191
+ {
192
+ "name": "default",
193
+ "description": "The sections, one per declared step: only the current one is shown, and each may carry a data-step name for move()."
194
+ }
195
+ ],
196
+ "events": [
197
+ {
198
+ "name": "change",
199
+ "description": "Fired with the index and the data-step name after next(), prev() or move() land on a different step."
200
+ },
201
+ {
202
+ "name": "section:requested",
203
+ "description": "Fired by the component when one of its sections is entered (bubbling): the generic type of the family, joined by section:requested:#index and by section:requested:name when the section carries a data-step. Answer through AsyncEvents.asyncOn with the section's delivery; the component awaits the answers under its loading chrome, and a failed delivery paints the section's problems."
204
+ }
205
+ ]
206
+ },
21
207
  {
22
208
  "name": "ful-form",
23
- "description": "Wraps its content in a form, collects the values of the fields it contains and hands them to a loader on submit.",
24
- "attributes": [],
209
+ "description": "Wraps its content in a form, collects the values of the fields it contains and hands them to the loader named by loader (loaders:form by default) on submit: with action the values travel as json (method, POST by default) through the request-mapper and response-mapper components when declared, without it the submit:requested listeners deliver the response themselves. Validation errors are announced politely without focus, or exactly once through focus management with scroll-on-error, and clear-invalid-on-change drops a field's problem as soon as the field changes again; global errors land in an author-provided ful-errors element, announced as an alert.",
210
+ "attributes": [
211
+ {
212
+ "name": "action",
213
+ "description": "The endpoint the values are submitted to. With it the form posts json through a RemoteJsonFormLoader; without it a LocalFormLoader hands the outcome to whatever a submit:requested listener resolves with.",
214
+ "value": {
215
+ "kind": "plain",
216
+ "type": "string"
217
+ }
218
+ },
219
+ {
220
+ "name": "method",
221
+ "description": "The http method of the remote loader, POST by default.",
222
+ "value": {
223
+ "kind": "plain",
224
+ "type": "string"
225
+ }
226
+ },
227
+ {
228
+ "name": "loader",
229
+ "description": "The registry component key of the form loader, loaders:form by default. A loader of your own implements prepare, submit and transform.",
230
+ "value": {
231
+ "kind": "plain",
232
+ "type": "string"
233
+ }
234
+ },
235
+ {
236
+ "name": "request-mapper",
237
+ "description": "A registry component key, (values, form) => request, applied to the extracted values before they are sent.",
238
+ "value": {
239
+ "kind": "plain",
240
+ "type": "string"
241
+ }
242
+ },
243
+ {
244
+ "name": "response-mapper",
245
+ "description": "A registry component key, (response, form) => mapped, applied to a successful response before it reaches submit:success.",
246
+ "value": {
247
+ "kind": "plain",
248
+ "type": "string"
249
+ }
250
+ },
251
+ {
252
+ "name": "clear-invalid-on-change",
253
+ "description": "Clears a field's custom validity as soon as that field changes again, so a server problem stops being shown the moment the user addresses it.",
254
+ "value": {
255
+ "kind": "plain",
256
+ "type": "boolean"
257
+ }
258
+ },
259
+ {
260
+ "name": "scroll-on-error",
261
+ "description": "Moves focus, and the viewport with it, to the topmost invalid field when errors land. The error live region is muted while focus moves, so each problem is announced once through the focused field rather than twice.",
262
+ "value": {
263
+ "kind": "plain",
264
+ "type": "boolean"
265
+ }
266
+ }
267
+ ],
25
268
  "slots": [],
26
269
  "events": [
27
270
  {
@@ -47,8 +290,16 @@
47
290
  "description": "A checkbox, or a switch with type=\"switch\". Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
48
291
  "attributes": [
49
292
  {
50
- "name": "value",
51
- "description": "Checked when the attribute is the string true.",
293
+ "name": "type",
294
+ "description": "switch renders the control as a switch rather than a checkbox. The value and the semantics are unchanged.",
295
+ "value": {
296
+ "kind": "plain",
297
+ "type": "string"
298
+ }
299
+ },
300
+ {
301
+ "name": "disabled",
302
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
52
303
  "value": {
53
304
  "kind": "plain",
54
305
  "type": "boolean"
@@ -69,6 +320,14 @@
69
320
  "kind": "plain",
70
321
  "type": "boolean"
71
322
  }
323
+ },
324
+ {
325
+ "name": "value",
326
+ "description": "Checked when the attribute is the string true.",
327
+ "value": {
328
+ "kind": "plain",
329
+ "type": "boolean"
330
+ }
72
331
  }
73
332
  ],
74
333
  "slots": [
@@ -90,16 +349,64 @@
90
349
  },
91
350
  {
92
351
  "name": "ful-input",
93
- "description": "A labelled text input. Use type to pick any native input type, or textarea. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
352
+ "description": "A labelled text input. Use type to pick any native input type, or textarea; keep names the characters that survive a keystroke and reject the ones that do not, the caret staying among the survivors, and the uppercase and trim claims shape the value before it is read; v-type=number decodes the value to a number, blank staying null and a value that does not decode kept as it is, an undeclared type defaulting to number. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
94
353
  "attributes": [
95
354
  {
96
- "name": "value",
97
- "description": "The current value.",
355
+ "name": "type",
356
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
357
+ "value": {
358
+ "kind": "plain",
359
+ "type": "string"
360
+ }
361
+ },
362
+ {
363
+ "name": "v-type",
364
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
365
+ "value": {
366
+ "kind": "plain",
367
+ "type": "string"
368
+ }
369
+ },
370
+ {
371
+ "name": "keep",
372
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
373
+ "value": {
374
+ "kind": "plain",
375
+ "type": "string"
376
+ }
377
+ },
378
+ {
379
+ "name": "reject",
380
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
98
381
  "value": {
99
382
  "kind": "plain",
100
383
  "type": "string"
101
384
  }
102
385
  },
386
+ {
387
+ "name": "uppercase",
388
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
389
+ "value": {
390
+ "kind": "plain",
391
+ "type": "boolean"
392
+ }
393
+ },
394
+ {
395
+ "name": "trim",
396
+ "description": "Trims the value on the way out, leaving what was typed alone.",
397
+ "value": {
398
+ "kind": "plain",
399
+ "type": "boolean"
400
+ }
401
+ },
402
+ {
403
+ "name": "disabled",
404
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
405
+ "value": {
406
+ "kind": "plain",
407
+ "type": "boolean"
408
+ }
409
+ },
103
410
  {
104
411
  "name": "readonly",
105
412
  "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
@@ -116,6 +423,14 @@
116
423
  "type": "boolean"
117
424
  }
118
425
  },
426
+ {
427
+ "name": "value",
428
+ "description": "The current value.",
429
+ "value": {
430
+ "kind": "plain",
431
+ "type": "string"
432
+ }
433
+ },
119
434
  {
120
435
  "name": "placeholder",
121
436
  "description": "Placeholder shown while the field is empty.",
@@ -134,20 +449,12 @@
134
449
  "name": "info",
135
450
  "description": "Extra content rendered next to the label, for a hint or a help icon."
136
451
  },
137
- {
138
- "name": "ibefore",
139
- "description": "An addon rendered inside the input group, before the control."
140
- },
141
452
  {
142
453
  "name": "before",
143
- "description": "Content rendered before the control, outside the addon styling."
454
+ "description": "An addon rendered inside the input group, before the control."
144
455
  },
145
456
  {
146
457
  "name": "after",
147
- "description": "Content rendered after the control, outside the addon styling."
148
- },
149
- {
150
- "name": "iafter",
151
458
  "description": "An addon rendered inside the input group, after the control."
152
459
  }
153
460
  ],
@@ -160,30 +467,596 @@
160
467
  },
161
468
  {
162
469
  "name": "ful-input-file",
163
- "description": "A file input with an optional dropzone and a list of the selected files, enforcing the size and count limits it declares. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
470
+ "description": "A file input with an optional dropzone and a list of the selected files, enforcing the size and count limits it declares; the noinput claim hides the picker control, the dropzone and the item list carrying the field alone. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
164
471
  "attributes": [
165
472
  {
166
- "name": "value",
167
- "description": "Only an empty value is honoured, to clear the selection: file inputs cannot be filled programmatically.",
473
+ "name": "type",
474
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
168
475
  "value": {
169
476
  "kind": "plain",
170
477
  "type": "string"
171
478
  }
172
479
  },
173
480
  {
174
- "name": "readonly",
175
- "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
481
+ "name": "v-type",
482
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
176
483
  "value": {
177
484
  "kind": "plain",
178
- "type": "boolean"
485
+ "type": "string"
179
486
  }
180
487
  },
181
488
  {
182
- "name": "required",
183
- "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
489
+ "name": "keep",
490
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
184
491
  "value": {
185
492
  "kind": "plain",
186
- "type": "boolean"
493
+ "type": "string"
494
+ }
495
+ },
496
+ {
497
+ "name": "reject",
498
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
499
+ "value": {
500
+ "kind": "plain",
501
+ "type": "string"
502
+ }
503
+ },
504
+ {
505
+ "name": "uppercase",
506
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
507
+ "value": {
508
+ "kind": "plain",
509
+ "type": "boolean"
510
+ }
511
+ },
512
+ {
513
+ "name": "trim",
514
+ "description": "Trims the value on the way out, leaving what was typed alone.",
515
+ "value": {
516
+ "kind": "plain",
517
+ "type": "boolean"
518
+ }
519
+ },
520
+ {
521
+ "name": "disabled",
522
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
523
+ "value": {
524
+ "kind": "plain",
525
+ "type": "boolean"
526
+ }
527
+ },
528
+ {
529
+ "name": "readonly",
530
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
531
+ "value": {
532
+ "kind": "plain",
533
+ "type": "boolean"
534
+ }
535
+ },
536
+ {
537
+ "name": "required",
538
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
539
+ "value": {
540
+ "kind": "plain",
541
+ "type": "boolean"
542
+ }
543
+ },
544
+ {
545
+ "name": "value",
546
+ "description": "Only an empty value is honoured, to clear the selection: file inputs cannot be filled programmatically.",
547
+ "value": {
548
+ "kind": "plain",
549
+ "type": "string"
550
+ }
551
+ },
552
+ {
553
+ "name": "placeholder",
554
+ "description": "Placeholder shown while the field is empty.",
555
+ "value": {
556
+ "kind": "plain",
557
+ "type": "string"
558
+ }
559
+ },
560
+ {
561
+ "name": "accept",
562
+ "description": "Comma separated list of accepted tokens: an extension (.pdf), a mime type (application/pdf) or a wildcard (image/*). Files that do not match are dropped with a warning.",
563
+ "value": {
564
+ "kind": "plain",
565
+ "type": "string"
566
+ }
567
+ },
568
+ {
569
+ "name": "multiple",
570
+ "description": "Allows selecting more than one file.",
571
+ "value": {
572
+ "kind": "plain",
573
+ "type": "boolean"
574
+ }
575
+ },
576
+ {
577
+ "name": "item-list",
578
+ "description": "Shows the list of selected files.",
579
+ "value": {
580
+ "kind": "plain",
581
+ "type": "boolean"
582
+ }
583
+ },
584
+ {
585
+ "name": "dropzone",
586
+ "description": "Shows the dropzone.",
587
+ "value": {
588
+ "kind": "plain",
589
+ "type": "boolean"
590
+ }
591
+ },
592
+ {
593
+ "name": "max-files",
594
+ "description": "Maximum number of files. Exceeding it clears the selection.",
595
+ "value": {
596
+ "kind": "plain",
597
+ "type": "number"
598
+ }
599
+ },
600
+ {
601
+ "name": "max-file-size",
602
+ "description": "Maximum size of a single file, in bytes. Larger files are dropped.",
603
+ "value": {
604
+ "kind": "plain",
605
+ "type": "number"
606
+ }
607
+ },
608
+ {
609
+ "name": "max-total-size",
610
+ "description": "Maximum size of all the selected files, in bytes. Exceeding it clears the selection.",
611
+ "value": {
612
+ "kind": "plain",
613
+ "type": "number"
614
+ }
615
+ }
616
+ ],
617
+ "slots": [
618
+ {
619
+ "name": "default",
620
+ "description": "The label of the field."
621
+ },
622
+ {
623
+ "name": "info",
624
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
625
+ },
626
+ {
627
+ "name": "before",
628
+ "description": "An addon rendered inside the input group, before the control."
629
+ },
630
+ {
631
+ "name": "after",
632
+ "description": "An addon rendered inside the input group, after the control."
633
+ },
634
+ {
635
+ "name": "dropzone",
636
+ "description": "Replaces the contents of the default dropzone."
637
+ }
638
+ ],
639
+ "events": [
640
+ {
641
+ "name": "change",
642
+ "description": "Fired with the names of the selected files."
643
+ }
644
+ ]
645
+ },
646
+ {
647
+ "name": "ful-local-date",
648
+ "description": "Formats the date in its content, written as yyyy-mm-dd, in the locale of the page or the one its locale attribute names; default is shown when the content is empty.",
649
+ "attributes": [
650
+ {
651
+ "name": "locale",
652
+ "description": "The locale the date is formatted in, taking precedence over the page's. The platform default applies when neither names one.",
653
+ "value": {
654
+ "kind": "plain",
655
+ "type": "string"
656
+ }
657
+ },
658
+ {
659
+ "name": "default",
660
+ "description": "The text rendered when the content is blank or does not parse as a date.",
661
+ "value": {
662
+ "kind": "plain",
663
+ "type": "string"
664
+ }
665
+ }
666
+ ],
667
+ "slots": [],
668
+ "events": []
669
+ },
670
+ {
671
+ "name": "ful-instant",
672
+ "description": "Formats the ISO instant in its content in the locale and timezone of the page or the one its locale attribute names; default is shown when the content is empty.",
673
+ "attributes": [
674
+ {
675
+ "name": "locale",
676
+ "description": "The locale the instant is formatted in, taking precedence over the page's. The platform default applies when neither names one.",
677
+ "value": {
678
+ "kind": "plain",
679
+ "type": "string"
680
+ }
681
+ },
682
+ {
683
+ "name": "default",
684
+ "description": "The text rendered when the content is blank or does not parse as an instant.",
685
+ "value": {
686
+ "kind": "plain",
687
+ "type": "string"
688
+ }
689
+ }
690
+ ],
691
+ "slots": [],
692
+ "events": []
693
+ },
694
+ {
695
+ "name": "ful-input-local-date",
696
+ "description": "A date input. Its bounds accept a date, now, or an offset such as +1d, -2m or +3y. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
697
+ "attributes": [
698
+ {
699
+ "name": "type",
700
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
701
+ "value": {
702
+ "kind": "plain",
703
+ "type": "string"
704
+ }
705
+ },
706
+ {
707
+ "name": "v-type",
708
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
709
+ "value": {
710
+ "kind": "plain",
711
+ "type": "string"
712
+ }
713
+ },
714
+ {
715
+ "name": "keep",
716
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
717
+ "value": {
718
+ "kind": "plain",
719
+ "type": "string"
720
+ }
721
+ },
722
+ {
723
+ "name": "reject",
724
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
725
+ "value": {
726
+ "kind": "plain",
727
+ "type": "string"
728
+ }
729
+ },
730
+ {
731
+ "name": "uppercase",
732
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
733
+ "value": {
734
+ "kind": "plain",
735
+ "type": "boolean"
736
+ }
737
+ },
738
+ {
739
+ "name": "trim",
740
+ "description": "Trims the value on the way out, leaving what was typed alone.",
741
+ "value": {
742
+ "kind": "plain",
743
+ "type": "boolean"
744
+ }
745
+ },
746
+ {
747
+ "name": "disabled",
748
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
749
+ "value": {
750
+ "kind": "plain",
751
+ "type": "boolean"
752
+ }
753
+ },
754
+ {
755
+ "name": "readonly",
756
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
757
+ "value": {
758
+ "kind": "plain",
759
+ "type": "boolean"
760
+ }
761
+ },
762
+ {
763
+ "name": "required",
764
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
765
+ "value": {
766
+ "kind": "plain",
767
+ "type": "boolean"
768
+ }
769
+ },
770
+ {
771
+ "name": "value",
772
+ "description": "The current value.",
773
+ "value": {
774
+ "kind": "plain",
775
+ "type": "string"
776
+ }
777
+ },
778
+ {
779
+ "name": "placeholder",
780
+ "description": "Placeholder shown while the field is empty.",
781
+ "value": {
782
+ "kind": "plain",
783
+ "type": "string"
784
+ }
785
+ },
786
+ {
787
+ "name": "step",
788
+ "description": "Step between selectable dates, in days.",
789
+ "value": {
790
+ "kind": "plain",
791
+ "type": "string"
792
+ }
793
+ },
794
+ {
795
+ "name": "min",
796
+ "description": "Earliest selectable date. Accepts a date, now, or a day, month or year offset.",
797
+ "value": {
798
+ "kind": "plain",
799
+ "type": "string"
800
+ }
801
+ },
802
+ {
803
+ "name": "max",
804
+ "description": "Latest selectable date. Accepts a date, now, or a day, month or year offset.",
805
+ "value": {
806
+ "kind": "plain",
807
+ "type": "string"
808
+ }
809
+ }
810
+ ],
811
+ "slots": [
812
+ {
813
+ "name": "default",
814
+ "description": "The label of the field."
815
+ },
816
+ {
817
+ "name": "info",
818
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
819
+ },
820
+ {
821
+ "name": "before",
822
+ "description": "An addon rendered inside the input group, before the control."
823
+ },
824
+ {
825
+ "name": "after",
826
+ "description": "An addon rendered inside the input group, after the control."
827
+ }
828
+ ],
829
+ "events": [
830
+ {
831
+ "name": "change",
832
+ "description": "Fired with the current date."
833
+ }
834
+ ]
835
+ },
836
+ {
837
+ "name": "ful-input-local-time",
838
+ "description": "A time input. Its bounds accept a time, now, or an hour or minute offset, snapped to the step grid. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
839
+ "attributes": [
840
+ {
841
+ "name": "type",
842
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
843
+ "value": {
844
+ "kind": "plain",
845
+ "type": "string"
846
+ }
847
+ },
848
+ {
849
+ "name": "v-type",
850
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
851
+ "value": {
852
+ "kind": "plain",
853
+ "type": "string"
854
+ }
855
+ },
856
+ {
857
+ "name": "keep",
858
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
859
+ "value": {
860
+ "kind": "plain",
861
+ "type": "string"
862
+ }
863
+ },
864
+ {
865
+ "name": "reject",
866
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
867
+ "value": {
868
+ "kind": "plain",
869
+ "type": "string"
870
+ }
871
+ },
872
+ {
873
+ "name": "uppercase",
874
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
875
+ "value": {
876
+ "kind": "plain",
877
+ "type": "boolean"
878
+ }
879
+ },
880
+ {
881
+ "name": "trim",
882
+ "description": "Trims the value on the way out, leaving what was typed alone.",
883
+ "value": {
884
+ "kind": "plain",
885
+ "type": "boolean"
886
+ }
887
+ },
888
+ {
889
+ "name": "disabled",
890
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
891
+ "value": {
892
+ "kind": "plain",
893
+ "type": "boolean"
894
+ }
895
+ },
896
+ {
897
+ "name": "readonly",
898
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
899
+ "value": {
900
+ "kind": "plain",
901
+ "type": "boolean"
902
+ }
903
+ },
904
+ {
905
+ "name": "required",
906
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
907
+ "value": {
908
+ "kind": "plain",
909
+ "type": "boolean"
910
+ }
911
+ },
912
+ {
913
+ "name": "value",
914
+ "description": "The current value.",
915
+ "value": {
916
+ "kind": "plain",
917
+ "type": "string"
918
+ }
919
+ },
920
+ {
921
+ "name": "placeholder",
922
+ "description": "Placeholder shown while the field is empty.",
923
+ "value": {
924
+ "kind": "plain",
925
+ "type": "string"
926
+ }
927
+ },
928
+ {
929
+ "name": "step",
930
+ "description": "Step between selectable times, in seconds. The bounds are truncated to this grid.",
931
+ "value": {
932
+ "kind": "plain",
933
+ "type": "string"
934
+ }
935
+ },
936
+ {
937
+ "name": "min",
938
+ "description": "Earliest selectable time. Accepts a time, now, or an offset such as +2h or -30m.",
939
+ "value": {
940
+ "kind": "plain",
941
+ "type": "string"
942
+ }
943
+ },
944
+ {
945
+ "name": "max",
946
+ "description": "Latest selectable time. Accepts a time, now, or an offset such as +2h or -30m.",
947
+ "value": {
948
+ "kind": "plain",
949
+ "type": "string"
950
+ }
951
+ }
952
+ ],
953
+ "slots": [
954
+ {
955
+ "name": "default",
956
+ "description": "The label of the field."
957
+ },
958
+ {
959
+ "name": "info",
960
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
961
+ },
962
+ {
963
+ "name": "before",
964
+ "description": "An addon rendered inside the input group, before the control."
965
+ },
966
+ {
967
+ "name": "after",
968
+ "description": "An addon rendered inside the input group, after the control."
969
+ }
970
+ ],
971
+ "events": [
972
+ {
973
+ "name": "change",
974
+ "description": "Fired with the current time."
975
+ }
976
+ ]
977
+ },
978
+ {
979
+ "name": "ful-input-instant",
980
+ "description": "A datetime input whose value is read and written as an ISO instant. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
981
+ "attributes": [
982
+ {
983
+ "name": "type",
984
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
985
+ "value": {
986
+ "kind": "plain",
987
+ "type": "string"
988
+ }
989
+ },
990
+ {
991
+ "name": "v-type",
992
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
993
+ "value": {
994
+ "kind": "plain",
995
+ "type": "string"
996
+ }
997
+ },
998
+ {
999
+ "name": "keep",
1000
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
1001
+ "value": {
1002
+ "kind": "plain",
1003
+ "type": "string"
1004
+ }
1005
+ },
1006
+ {
1007
+ "name": "reject",
1008
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
1009
+ "value": {
1010
+ "kind": "plain",
1011
+ "type": "string"
1012
+ }
1013
+ },
1014
+ {
1015
+ "name": "uppercase",
1016
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
1017
+ "value": {
1018
+ "kind": "plain",
1019
+ "type": "boolean"
1020
+ }
1021
+ },
1022
+ {
1023
+ "name": "trim",
1024
+ "description": "Trims the value on the way out, leaving what was typed alone.",
1025
+ "value": {
1026
+ "kind": "plain",
1027
+ "type": "boolean"
1028
+ }
1029
+ },
1030
+ {
1031
+ "name": "disabled",
1032
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
1033
+ "value": {
1034
+ "kind": "plain",
1035
+ "type": "boolean"
1036
+ }
1037
+ },
1038
+ {
1039
+ "name": "readonly",
1040
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
1041
+ "value": {
1042
+ "kind": "plain",
1043
+ "type": "boolean"
1044
+ }
1045
+ },
1046
+ {
1047
+ "name": "required",
1048
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
1049
+ "value": {
1050
+ "kind": "plain",
1051
+ "type": "boolean"
1052
+ }
1053
+ },
1054
+ {
1055
+ "name": "value",
1056
+ "description": "The current value.",
1057
+ "value": {
1058
+ "kind": "plain",
1059
+ "type": "string"
187
1060
  }
188
1061
  },
189
1062
  {
@@ -195,123 +1068,298 @@
195
1068
  }
196
1069
  },
197
1070
  {
198
- "name": "accept",
199
- "description": "Comma separated list of accepted extensions. Files that do not match are dropped with a warning.",
1071
+ "name": "step",
1072
+ "description": "Step between selectable instants, in seconds.",
1073
+ "value": {
1074
+ "kind": "plain",
1075
+ "type": "string"
1076
+ }
1077
+ },
1078
+ {
1079
+ "name": "min",
1080
+ "description": "Earliest selectable instant, as an ISO instant.",
1081
+ "value": {
1082
+ "kind": "plain",
1083
+ "type": "string"
1084
+ }
1085
+ },
1086
+ {
1087
+ "name": "max",
1088
+ "description": "Latest selectable instant, as an ISO instant.",
1089
+ "value": {
1090
+ "kind": "plain",
1091
+ "type": "string"
1092
+ }
1093
+ }
1094
+ ],
1095
+ "slots": [
1096
+ {
1097
+ "name": "default",
1098
+ "description": "The label of the field."
1099
+ },
1100
+ {
1101
+ "name": "info",
1102
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
1103
+ },
1104
+ {
1105
+ "name": "before",
1106
+ "description": "An addon rendered inside the input group, before the control."
1107
+ },
1108
+ {
1109
+ "name": "after",
1110
+ "description": "An addon rendered inside the input group, after the control."
1111
+ }
1112
+ ],
1113
+ "events": [
1114
+ {
1115
+ "name": "change",
1116
+ "description": "Fired with the current instant."
1117
+ }
1118
+ ]
1119
+ },
1120
+ {
1121
+ "name": "ful-radio-group",
1122
+ "description": "A group of radios, declared as ful-radio children. With type=\"boolean\" the value is a real boolean. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
1123
+ "attributes": [
1124
+ {
1125
+ "name": "name",
1126
+ "description": "The name the radio inputs share, which is what makes them one group. Generated when absent, so a group only needs it to be addressed from outside.",
1127
+ "value": {
1128
+ "kind": "plain",
1129
+ "type": "string"
1130
+ }
1131
+ },
1132
+ {
1133
+ "name": "type",
1134
+ "description": "boolean maps the two declared radios onto true and false rather than onto their own values.",
1135
+ "value": {
1136
+ "kind": "plain",
1137
+ "type": "string"
1138
+ }
1139
+ },
1140
+ {
1141
+ "name": "disabled",
1142
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
1143
+ "value": {
1144
+ "kind": "plain",
1145
+ "type": "boolean"
1146
+ }
1147
+ },
1148
+ {
1149
+ "name": "readonly",
1150
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
1151
+ "value": {
1152
+ "kind": "plain",
1153
+ "type": "boolean"
1154
+ }
1155
+ },
1156
+ {
1157
+ "name": "required",
1158
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
1159
+ "value": {
1160
+ "kind": "plain",
1161
+ "type": "boolean"
1162
+ }
1163
+ },
1164
+ {
1165
+ "name": "value",
1166
+ "description": "The value of the selected radio.",
1167
+ "value": {
1168
+ "kind": "plain",
1169
+ "type": "string"
1170
+ }
1171
+ }
1172
+ ],
1173
+ "slots": [
1174
+ {
1175
+ "name": "default",
1176
+ "description": "The legend of the group, and its ful-radio children."
1177
+ },
1178
+ {
1179
+ "name": "header",
1180
+ "description": "Content rendered above the radios."
1181
+ },
1182
+ {
1183
+ "name": "footer",
1184
+ "description": "Content rendered below the radios."
1185
+ }
1186
+ ],
1187
+ "events": [
1188
+ {
1189
+ "name": "change",
1190
+ "description": "Fired with the value of the selected radio."
1191
+ }
1192
+ ]
1193
+ },
1194
+ {
1195
+ "name": "ful-table",
1196
+ "description": "A table that loads its rows from a loader, with sorting, pagination and an optional filter form. Its columns are declared in a schema slot; the rows come from src (method, GET by default) through the loader named by loader (loaders:table by default), page-size rows a page (10 by default), the first one loading on upgrade under the autoload claim.",
1197
+ "attributes": [
1198
+ {
1199
+ "name": "loader",
1200
+ "description": "The registered component name the table loads its rows through; loaders:table when absent.",
1201
+ "value": {
1202
+ "kind": "plain",
1203
+ "type": "string"
1204
+ }
1205
+ },
1206
+ {
1207
+ "name": "autoload",
1208
+ "description": "Loads the first page while upgrading, instead of waiting for a reload(). The load is not awaited, so a slow or failing loader cannot hold up the page.",
1209
+ "value": {
1210
+ "kind": "plain",
1211
+ "type": "boolean"
1212
+ }
1213
+ },
1214
+ {
1215
+ "name": "page-size",
1216
+ "description": "How many rows a page asks the loader for, 10 by default. Stays live: writing it reloads from the first page, a table that has not been asked to load yet only recording it.",
1217
+ "value": {
1218
+ "kind": "plain",
1219
+ "type": "number"
1220
+ }
1221
+ }
1222
+ ],
1223
+ "slots": [
1224
+ {
1225
+ "name": "filters",
1226
+ "description": "Fields wrapped in a ful-form, submitted to filter the table."
1227
+ },
1228
+ {
1229
+ "name": "caption",
1230
+ "description": "The caption of the table."
1231
+ },
1232
+ {
1233
+ "name": "footer",
1234
+ "description": "Content rendered in the table footer."
1235
+ }
1236
+ ],
1237
+ "events": []
1238
+ },
1239
+ {
1240
+ "name": "ful-pagination",
1241
+ "description": "The pager of a ful-table, its window rendering at most pages links (5 by default). Rarely used on its own.",
1242
+ "attributes": [
1243
+ {
1244
+ "name": "pages",
1245
+ "description": "How many page buttons are rendered around the current one, 5 by default.",
1246
+ "value": {
1247
+ "kind": "plain",
1248
+ "type": "number"
1249
+ }
1250
+ },
1251
+ {
1252
+ "name": "total",
1253
+ "description": "Number of pages.",
1254
+ "value": {
1255
+ "kind": "plain",
1256
+ "type": "number"
1257
+ }
1258
+ },
1259
+ {
1260
+ "name": "current",
1261
+ "description": "Zero based index of the page being shown.",
1262
+ "value": {
1263
+ "kind": "plain",
1264
+ "type": "number"
1265
+ }
1266
+ }
1267
+ ],
1268
+ "slots": [],
1269
+ "events": [
1270
+ {
1271
+ "name": "page:requested",
1272
+ "description": "Fired with the zero based index of the page the user asked for."
1273
+ }
1274
+ ]
1275
+ },
1276
+ {
1277
+ "name": "ful-sorter",
1278
+ "description": "The sort control rendered in a ful-table header, focusable and activated by Enter and Space, carrying aria-sort on its header cell. Rarely used on its own.",
1279
+ "attributes": [
1280
+ {
1281
+ "name": "sorter",
1282
+ "description": "The field name this column sorts by, sent in the load request. A column without it is not sortable.",
1283
+ "value": {
1284
+ "kind": "plain",
1285
+ "type": "string"
1286
+ }
1287
+ },
1288
+ {
1289
+ "name": "order",
1290
+ "description": "The sort currently applied, asc or desc, or absent when unsorted.",
1291
+ "value": {
1292
+ "kind": "plain",
1293
+ "type": "string"
1294
+ }
1295
+ }
1296
+ ],
1297
+ "slots": [],
1298
+ "events": [
1299
+ {
1300
+ "name": "sort:requested",
1301
+ "description": "Fired with the sorter and the next order when activated."
1302
+ }
1303
+ ]
1304
+ },
1305
+ {
1306
+ "name": "ful-filter-instant",
1307
+ "description": "A ful-table filter over an instant, with an operator and one or two bounds. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
1308
+ "attributes": [
1309
+ {
1310
+ "name": "type",
1311
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
200
1312
  "value": {
201
1313
  "kind": "plain",
202
1314
  "type": "string"
203
1315
  }
204
1316
  },
205
1317
  {
206
- "name": "multiple",
207
- "description": "Allows selecting more than one file.",
208
- "value": {
209
- "kind": "plain",
210
- "type": "boolean"
211
- }
212
- },
213
- {
214
- "name": "itemlist",
215
- "description": "Shows the list of selected files.",
1318
+ "name": "v-type",
1319
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
216
1320
  "value": {
217
1321
  "kind": "plain",
218
- "type": "boolean"
1322
+ "type": "string"
219
1323
  }
220
1324
  },
221
1325
  {
222
- "name": "dropzone",
223
- "description": "Shows the dropzone.",
1326
+ "name": "keep",
1327
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
224
1328
  "value": {
225
1329
  "kind": "plain",
226
- "type": "boolean"
1330
+ "type": "string"
227
1331
  }
228
1332
  },
229
1333
  {
230
- "name": "maxfiles",
231
- "description": "Maximum number of files. Exceeding it clears the selection.",
1334
+ "name": "reject",
1335
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
232
1336
  "value": {
233
1337
  "kind": "plain",
234
- "type": "number"
1338
+ "type": "string"
235
1339
  }
236
1340
  },
237
1341
  {
238
- "name": "maxfilesize",
239
- "description": "Maximum size of a single file, in bytes. Larger files are dropped.",
1342
+ "name": "uppercase",
1343
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
240
1344
  "value": {
241
1345
  "kind": "plain",
242
- "type": "number"
1346
+ "type": "boolean"
243
1347
  }
244
1348
  },
245
1349
  {
246
- "name": "maxtotalsize",
247
- "description": "Maximum size of all the selected files, in bytes. Exceeding it clears the selection.",
1350
+ "name": "trim",
1351
+ "description": "Trims the value on the way out, leaving what was typed alone.",
248
1352
  "value": {
249
1353
  "kind": "plain",
250
- "type": "number"
1354
+ "type": "boolean"
251
1355
  }
252
- }
253
- ],
254
- "slots": [
255
- {
256
- "name": "default",
257
- "description": "The label of the field."
258
- },
259
- {
260
- "name": "info",
261
- "description": "Extra content rendered next to the label, for a hint or a help icon."
262
- },
263
- {
264
- "name": "ibefore",
265
- "description": "An addon rendered inside the input group, before the control."
266
- },
267
- {
268
- "name": "before",
269
- "description": "Content rendered before the control, outside the addon styling."
270
- },
271
- {
272
- "name": "after",
273
- "description": "Content rendered after the control, outside the addon styling."
274
1356
  },
275
1357
  {
276
- "name": "iafter",
277
- "description": "An addon rendered inside the input group, after the control."
278
- },
279
- {
280
- "name": "dropzone",
281
- "description": "Replaces the contents of the default dropzone."
282
- }
283
- ],
284
- "events": [
285
- {
286
- "name": "change",
287
- "description": "Fired with the names of the selected files."
288
- }
289
- ]
290
- },
291
- {
292
- "name": "ful-local-date",
293
- "description": "Formats the date in its content, written as yyyy-mm-dd, in the locale of the page.",
294
- "attributes": [],
295
- "slots": [],
296
- "events": []
297
- },
298
- {
299
- "name": "ful-instant",
300
- "description": "Formats the ISO instant in its content in the locale and timezone of the page.",
301
- "attributes": [],
302
- "slots": [],
303
- "events": []
304
- },
305
- {
306
- "name": "ful-input-local-date",
307
- "description": "A date input. Its bounds accept a date, now, or an offset such as +1d, -2m or +3y. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
308
- "attributes": [
309
- {
310
- "name": "value",
311
- "description": "The current value.",
1358
+ "name": "disabled",
1359
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
312
1360
  "value": {
313
1361
  "kind": "plain",
314
- "type": "string"
1362
+ "type": "boolean"
315
1363
  }
316
1364
  },
317
1365
  {
@@ -331,32 +1379,24 @@
331
1379
  }
332
1380
  },
333
1381
  {
334
- "name": "placeholder",
335
- "description": "Placeholder shown while the field is empty.",
336
- "value": {
337
- "kind": "plain",
338
- "type": "string"
339
- }
340
- },
341
- {
342
- "name": "min",
343
- "description": "Earliest selectable date. Accepts a date, now, or a day, month or year offset.",
1382
+ "name": "value",
1383
+ "description": "JSON tuple of the operator and its bounds, for example [\"BETWEEN\", from, to].",
344
1384
  "value": {
345
1385
  "kind": "plain",
346
1386
  "type": "string"
347
1387
  }
348
1388
  },
349
1389
  {
350
- "name": "max",
351
- "description": "Latest selectable date. Accepts a date, now, or a day, month or year offset.",
1390
+ "name": "placeholder",
1391
+ "description": "Placeholder shown while the field is empty.",
352
1392
  "value": {
353
1393
  "kind": "plain",
354
1394
  "type": "string"
355
1395
  }
356
1396
  },
357
1397
  {
358
- "name": "step",
359
- "description": "Step between selectable dates, in days.",
1398
+ "name": "operators",
1399
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ, LT, GT, LTE, GTE, BETWEEN. Defaults to all of them.",
360
1400
  "value": {
361
1401
  "kind": "plain",
362
1402
  "type": "string"
@@ -372,134 +1412,80 @@
372
1412
  "name": "info",
373
1413
  "description": "Extra content rendered next to the label, for a hint or a help icon."
374
1414
  },
375
- {
376
- "name": "ibefore",
377
- "description": "An addon rendered inside the input group, before the control."
378
- },
379
1415
  {
380
1416
  "name": "before",
381
- "description": "Content rendered before the control, outside the addon styling."
1417
+ "description": "An addon rendered inside the input group, before the control."
382
1418
  },
383
1419
  {
384
1420
  "name": "after",
385
- "description": "Content rendered after the control, outside the addon styling."
386
- },
387
- {
388
- "name": "iafter",
389
1421
  "description": "An addon rendered inside the input group, after the control."
390
1422
  }
391
1423
  ],
392
1424
  "events": [
393
1425
  {
394
1426
  "name": "change",
395
- "description": "Fired with the current date."
1427
+ "description": "Fired with the whole tuple, or undefined when the filter is incomplete."
396
1428
  }
397
1429
  ]
398
1430
  },
399
1431
  {
400
- "name": "ful-input-local-time",
401
- "description": "A time input. Its bounds accept a time, now, or an hour or minute offset, snapped to the step grid. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
1432
+ "name": "ful-filter-local-date",
1433
+ "description": "A ful-table filter over a date, with an operator and one or two bounds. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
402
1434
  "attributes": [
403
1435
  {
404
- "name": "value",
405
- "description": "The current value.",
1436
+ "name": "type",
1437
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
406
1438
  "value": {
407
1439
  "kind": "plain",
408
1440
  "type": "string"
409
1441
  }
410
1442
  },
411
1443
  {
412
- "name": "readonly",
413
- "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
414
- "value": {
415
- "kind": "plain",
416
- "type": "boolean"
417
- }
418
- },
419
- {
420
- "name": "required",
421
- "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
1444
+ "name": "v-type",
1445
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
422
1446
  "value": {
423
1447
  "kind": "plain",
424
- "type": "boolean"
1448
+ "type": "string"
425
1449
  }
426
1450
  },
427
1451
  {
428
- "name": "placeholder",
429
- "description": "Placeholder shown while the field is empty.",
1452
+ "name": "keep",
1453
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
430
1454
  "value": {
431
1455
  "kind": "plain",
432
1456
  "type": "string"
433
1457
  }
434
1458
  },
435
1459
  {
436
- "name": "min",
437
- "description": "Earliest selectable time. Accepts a time, now, or an offset such as +2h or -30m.",
1460
+ "name": "reject",
1461
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
438
1462
  "value": {
439
1463
  "kind": "plain",
440
1464
  "type": "string"
441
1465
  }
442
1466
  },
443
1467
  {
444
- "name": "max",
445
- "description": "Latest selectable time. Accepts a time, now, or an offset such as +2h or -30m.",
1468
+ "name": "uppercase",
1469
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
446
1470
  "value": {
447
1471
  "kind": "plain",
448
- "type": "string"
1472
+ "type": "boolean"
449
1473
  }
450
1474
  },
451
1475
  {
452
- "name": "step",
453
- "description": "Step between selectable times, in seconds. The bounds are truncated to this grid.",
1476
+ "name": "trim",
1477
+ "description": "Trims the value on the way out, leaving what was typed alone.",
454
1478
  "value": {
455
1479
  "kind": "plain",
456
- "type": "string"
1480
+ "type": "boolean"
457
1481
  }
458
- }
459
- ],
460
- "slots": [
461
- {
462
- "name": "default",
463
- "description": "The label of the field."
464
- },
465
- {
466
- "name": "info",
467
- "description": "Extra content rendered next to the label, for a hint or a help icon."
468
- },
469
- {
470
- "name": "ibefore",
471
- "description": "An addon rendered inside the input group, before the control."
472
- },
473
- {
474
- "name": "before",
475
- "description": "Content rendered before the control, outside the addon styling."
476
- },
477
- {
478
- "name": "after",
479
- "description": "Content rendered after the control, outside the addon styling."
480
1482
  },
481
1483
  {
482
- "name": "iafter",
483
- "description": "An addon rendered inside the input group, after the control."
484
- }
485
- ],
486
- "events": [
487
- {
488
- "name": "change",
489
- "description": "Fired with the current time."
490
- }
491
- ]
492
- },
493
- {
494
- "name": "ful-input-instant",
495
- "description": "A datetime input whose value is read and written as an ISO instant. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
496
- "attributes": [
497
- {
498
- "name": "value",
499
- "description": "The current value.",
1484
+ "name": "disabled",
1485
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
500
1486
  "value": {
501
1487
  "kind": "plain",
502
- "type": "string"
1488
+ "type": "boolean"
503
1489
  }
504
1490
  },
505
1491
  {
@@ -519,32 +1505,24 @@
519
1505
  }
520
1506
  },
521
1507
  {
522
- "name": "placeholder",
523
- "description": "Placeholder shown while the field is empty.",
524
- "value": {
525
- "kind": "plain",
526
- "type": "string"
527
- }
528
- },
529
- {
530
- "name": "min",
531
- "description": "Earliest selectable instant, as an ISO instant.",
1508
+ "name": "value",
1509
+ "description": "JSON tuple of the operator and its bounds, for example [\"BETWEEN\", from, to].",
532
1510
  "value": {
533
1511
  "kind": "plain",
534
1512
  "type": "string"
535
1513
  }
536
1514
  },
537
1515
  {
538
- "name": "max",
539
- "description": "Latest selectable instant, as an ISO instant.",
1516
+ "name": "placeholder",
1517
+ "description": "Placeholder shown while the field is empty.",
540
1518
  "value": {
541
1519
  "kind": "plain",
542
1520
  "type": "string"
543
1521
  }
544
1522
  },
545
1523
  {
546
- "name": "step",
547
- "description": "Step between selectable instants, in seconds.",
1524
+ "name": "operators",
1525
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ, LT, GT, LTE, GTE, BETWEEN. Defaults to all of them.",
548
1526
  "value": {
549
1527
  "kind": "plain",
550
1528
  "type": "string"
@@ -560,160 +1538,80 @@
560
1538
  "name": "info",
561
1539
  "description": "Extra content rendered next to the label, for a hint or a help icon."
562
1540
  },
563
- {
564
- "name": "ibefore",
565
- "description": "An addon rendered inside the input group, before the control."
566
- },
567
1541
  {
568
1542
  "name": "before",
569
- "description": "Content rendered before the control, outside the addon styling."
1543
+ "description": "An addon rendered inside the input group, before the control."
570
1544
  },
571
1545
  {
572
1546
  "name": "after",
573
- "description": "Content rendered after the control, outside the addon styling."
574
- },
575
- {
576
- "name": "iafter",
577
1547
  "description": "An addon rendered inside the input group, after the control."
578
1548
  }
579
1549
  ],
580
1550
  "events": [
581
1551
  {
582
1552
  "name": "change",
583
- "description": "Fired with the current instant."
1553
+ "description": "Fired with the whole tuple, or undefined when the filter is incomplete."
584
1554
  }
585
1555
  ]
586
1556
  },
587
1557
  {
588
- "name": "ful-radio-group",
589
- "description": "A group of radios, declared as ful-radio children. With type=\"boolean\" the value is a real boolean. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
1558
+ "name": "ful-filter-number",
1559
+ "description": "A ful-table filter over numbers, with an operator such as GTE or BETWEEN. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
590
1560
  "attributes": [
591
1561
  {
592
- "name": "value",
593
- "description": "The value of the selected radio.",
1562
+ "name": "type",
1563
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
594
1564
  "value": {
595
1565
  "kind": "plain",
596
1566
  "type": "string"
597
1567
  }
598
1568
  },
599
1569
  {
600
- "name": "readonly",
601
- "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
1570
+ "name": "v-type",
1571
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
602
1572
  "value": {
603
1573
  "kind": "plain",
604
- "type": "boolean"
1574
+ "type": "string"
605
1575
  }
606
1576
  },
607
1577
  {
608
- "name": "required",
609
- "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
1578
+ "name": "keep",
1579
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
610
1580
  "value": {
611
1581
  "kind": "plain",
612
- "type": "boolean"
1582
+ "type": "string"
613
1583
  }
614
- }
615
- ],
616
- "slots": [
617
- {
618
- "name": "default",
619
- "description": "The legend of the group, and its ful-radio children."
620
- },
621
- {
622
- "name": "header",
623
- "description": "Content rendered above the radios."
624
- },
625
- {
626
- "name": "footer",
627
- "description": "Content rendered below the radios."
628
- }
629
- ],
630
- "events": [
631
- {
632
- "name": "change",
633
- "description": "Fired with the value of the selected radio."
634
- }
635
- ]
636
- },
637
- {
638
- "name": "ful-table",
639
- "description": "A table that loads its rows from a loader, with sorting, pagination and an optional filter form. Its columns are declared in a schema slot.",
640
- "attributes": [],
641
- "slots": [
642
- {
643
- "name": "filters",
644
- "description": "Fields wrapped in a ful-form, submitted to filter the table."
645
- },
646
- {
647
- "name": "caption",
648
- "description": "The caption of the table."
649
1584
  },
650
1585
  {
651
- "name": "footer",
652
- "description": "Content rendered in the table footer."
653
- }
654
- ],
655
- "events": []
656
- },
657
- {
658
- "name": "ful-pagination",
659
- "description": "The pager of a ful-table. Rarely used on its own.",
660
- "attributes": [
661
- {
662
- "name": "total",
663
- "description": "Number of pages.",
1586
+ "name": "reject",
1587
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
664
1588
  "value": {
665
1589
  "kind": "plain",
666
- "type": "number"
1590
+ "type": "string"
667
1591
  }
668
1592
  },
669
1593
  {
670
- "name": "current",
671
- "description": "Zero based index of the page being shown.",
1594
+ "name": "uppercase",
1595
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
672
1596
  "value": {
673
1597
  "kind": "plain",
674
- "type": "number"
1598
+ "type": "boolean"
675
1599
  }
676
- }
677
- ],
678
- "slots": [],
679
- "events": [
680
- {
681
- "name": "page-requested",
682
- "description": "Fired with the zero based index of the page the user asked for."
683
- }
684
- ]
685
- },
686
- {
687
- "name": "ful-sorter",
688
- "description": "The sort control rendered in a ful-table header. Rarely used on its own.",
689
- "attributes": [
1600
+ },
690
1601
  {
691
- "name": "order",
692
- "description": "The sort currently applied, asc or desc, or absent when unsorted.",
1602
+ "name": "trim",
1603
+ "description": "Trims the value on the way out, leaving what was typed alone.",
693
1604
  "value": {
694
1605
  "kind": "plain",
695
- "type": "string"
1606
+ "type": "boolean"
696
1607
  }
697
- }
698
- ],
699
- "slots": [],
700
- "events": [
701
- {
702
- "name": "sort-requested",
703
- "description": "Fired with the sorter and the next order when clicked."
704
- }
705
- ]
706
- },
707
- {
708
- "name": "ful-filter-instant",
709
- "description": "A ful-table filter over an instant, with an operator and one or two bounds. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
710
- "attributes": [
1608
+ },
711
1609
  {
712
- "name": "value",
713
- "description": "JSON tuple of the operator and its bounds, for example [\"BETWEEN\", from, to].",
1610
+ "name": "disabled",
1611
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
714
1612
  "value": {
715
1613
  "kind": "plain",
716
- "type": "string"
1614
+ "type": "boolean"
717
1615
  }
718
1616
  },
719
1617
  {
@@ -732,6 +1630,14 @@
732
1630
  "type": "boolean"
733
1631
  }
734
1632
  },
1633
+ {
1634
+ "name": "value",
1635
+ "description": "JSON tuple of the operator and its bound(s).",
1636
+ "value": {
1637
+ "kind": "plain",
1638
+ "type": "string"
1639
+ }
1640
+ },
735
1641
  {
736
1642
  "name": "placeholder",
737
1643
  "description": "Placeholder shown while the field is empty.",
@@ -739,6 +1645,14 @@
739
1645
  "kind": "plain",
740
1646
  "type": "string"
741
1647
  }
1648
+ },
1649
+ {
1650
+ "name": "operators",
1651
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ, LT, GT, LTE, GTE, BETWEEN. Defaults to all of them.",
1652
+ "value": {
1653
+ "kind": "plain",
1654
+ "type": "string"
1655
+ }
742
1656
  }
743
1657
  ],
744
1658
  "slots": [
@@ -750,20 +1664,12 @@
750
1664
  "name": "info",
751
1665
  "description": "Extra content rendered next to the label, for a hint or a help icon."
752
1666
  },
753
- {
754
- "name": "ibefore",
755
- "description": "An addon rendered inside the input group, before the control."
756
- },
757
1667
  {
758
1668
  "name": "before",
759
- "description": "Content rendered before the control, outside the addon styling."
1669
+ "description": "An addon rendered inside the input group, before the control."
760
1670
  },
761
1671
  {
762
1672
  "name": "after",
763
- "description": "Content rendered after the control, outside the addon styling."
764
- },
765
- {
766
- "name": "iafter",
767
1673
  "description": "An addon rendered inside the input group, after the control."
768
1674
  }
769
1675
  ],
@@ -775,15 +1681,15 @@
775
1681
  ]
776
1682
  },
777
1683
  {
778
- "name": "ful-filter-local-date",
779
- "description": "A ful-table filter over a date, with an operator and one or two bounds. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
1684
+ "name": "ful-filter-boolean",
1685
+ "description": "A ful-table filter over booleans, with the EQ or NEQ operator and a yes/no menu carrying the true and false tokens, plus an any entry that contributes nothing. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
780
1686
  "attributes": [
781
1687
  {
782
- "name": "value",
783
- "description": "JSON tuple of the operator and its bounds, for example [\"BETWEEN\", from, to].",
1688
+ "name": "disabled",
1689
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
784
1690
  "value": {
785
1691
  "kind": "plain",
786
- "type": "string"
1692
+ "type": "boolean"
787
1693
  }
788
1694
  },
789
1695
  {
@@ -803,8 +1709,16 @@
803
1709
  }
804
1710
  },
805
1711
  {
806
- "name": "placeholder",
807
- "description": "Placeholder shown while the field is empty.",
1712
+ "name": "value",
1713
+ "description": "JSON tuple of the operator and the token.",
1714
+ "value": {
1715
+ "kind": "plain",
1716
+ "type": "string"
1717
+ }
1718
+ },
1719
+ {
1720
+ "name": "operators",
1721
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ. Defaults to both.",
808
1722
  "value": {
809
1723
  "kind": "plain",
810
1724
  "type": "string"
@@ -820,42 +1734,82 @@
820
1734
  "name": "info",
821
1735
  "description": "Extra content rendered next to the label, for a hint or a help icon."
822
1736
  },
823
- {
824
- "name": "ibefore",
825
- "description": "An addon rendered inside the input group, before the control."
826
- },
827
1737
  {
828
1738
  "name": "before",
829
- "description": "Content rendered before the control, outside the addon styling."
1739
+ "description": "An addon rendered inside the input group, before the control."
830
1740
  },
831
1741
  {
832
1742
  "name": "after",
833
- "description": "Content rendered after the control, outside the addon styling."
834
- },
835
- {
836
- "name": "iafter",
837
1743
  "description": "An addon rendered inside the input group, after the control."
838
1744
  }
839
1745
  ],
840
1746
  "events": [
841
1747
  {
842
1748
  "name": "change",
843
- "description": "Fired with the whole tuple, or undefined when the filter is incomplete."
1749
+ "description": "Fired with the whole tuple, or undefined when nothing is picked."
844
1750
  }
845
1751
  ]
846
1752
  },
847
1753
  {
848
1754
  "name": "ful-filter-text",
849
- "description": "A ful-table filter over text, with an operator such as CONTAINS or STARTS_WITH. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
1755
+ "description": "A ful-table filter over text, with an operator such as CONTAINS or STARTS_WITH and a case sensitivity. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only. A multiple ful-select used as a filter emits the bare value array the in-list annotations expect.",
850
1756
  "attributes": [
851
1757
  {
852
- "name": "value",
853
- "description": "JSON tuple of the operator, the sensitivity and the text.",
1758
+ "name": "type",
1759
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
1760
+ "value": {
1761
+ "kind": "plain",
1762
+ "type": "string"
1763
+ }
1764
+ },
1765
+ {
1766
+ "name": "v-type",
1767
+ "description": "number decodes the value to a number on the way out: blank stays null and a value that does not decode is kept as it is.",
1768
+ "value": {
1769
+ "kind": "plain",
1770
+ "type": "string"
1771
+ }
1772
+ },
1773
+ {
1774
+ "name": "keep",
1775
+ "description": "A regular expression naming the characters that survive a keystroke, so keep=\"[0-9]\" is digits only. It matches rather than negating, so it takes a pattern and not only a character class.",
1776
+ "value": {
1777
+ "kind": "plain",
1778
+ "type": "string"
1779
+ }
1780
+ },
1781
+ {
1782
+ "name": "reject",
1783
+ "description": "The same filter from the other side: a regular expression naming what is stripped from the value on every keystroke. Declaring both applies keep and warns once.",
854
1784
  "value": {
855
1785
  "kind": "plain",
856
1786
  "type": "string"
857
1787
  }
858
1788
  },
1789
+ {
1790
+ "name": "uppercase",
1791
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
1792
+ "value": {
1793
+ "kind": "plain",
1794
+ "type": "boolean"
1795
+ }
1796
+ },
1797
+ {
1798
+ "name": "trim",
1799
+ "description": "Trims the value on the way out, leaving what was typed alone.",
1800
+ "value": {
1801
+ "kind": "plain",
1802
+ "type": "boolean"
1803
+ }
1804
+ },
1805
+ {
1806
+ "name": "disabled",
1807
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
1808
+ "value": {
1809
+ "kind": "plain",
1810
+ "type": "boolean"
1811
+ }
1812
+ },
859
1813
  {
860
1814
  "name": "readonly",
861
1815
  "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
@@ -872,6 +1826,14 @@
872
1826
  "type": "boolean"
873
1827
  }
874
1828
  },
1829
+ {
1830
+ "name": "value",
1831
+ "description": "JSON tuple of the operator, the sensitivity and the text.",
1832
+ "value": {
1833
+ "kind": "plain",
1834
+ "type": "string"
1835
+ }
1836
+ },
875
1837
  {
876
1838
  "name": "placeholder",
877
1839
  "description": "Placeholder shown while the field is empty.",
@@ -879,6 +1841,22 @@
879
1841
  "kind": "plain",
880
1842
  "type": "string"
881
1843
  }
1844
+ },
1845
+ {
1846
+ "name": "operators",
1847
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ, LT, GT, LTE, GTE, BETWEEN, CONTAINS, STARTS_WITH, ENDS_WITH. Defaults to all of them.",
1848
+ "value": {
1849
+ "kind": "plain",
1850
+ "type": "string"
1851
+ }
1852
+ },
1853
+ {
1854
+ "name": "sensitivities",
1855
+ "description": "Comma separated list of the case sensitivity modes, IGNORE_CASE, CASE_SENSITIVE. A single entry pins every emitted tuple to it.",
1856
+ "value": {
1857
+ "kind": "plain",
1858
+ "type": "string"
1859
+ }
882
1860
  }
883
1861
  ],
884
1862
  "slots": [
@@ -890,20 +1868,12 @@
890
1868
  "name": "info",
891
1869
  "description": "Extra content rendered next to the label, for a hint or a help icon."
892
1870
  },
893
- {
894
- "name": "ibefore",
895
- "description": "An addon rendered inside the input group, before the control."
896
- },
897
1871
  {
898
1872
  "name": "before",
899
- "description": "Content rendered before the control, outside the addon styling."
1873
+ "description": "An addon rendered inside the input group, before the control."
900
1874
  },
901
1875
  {
902
1876
  "name": "after",
903
- "description": "Content rendered after the control, outside the addon styling."
904
- },
905
- {
906
- "name": "iafter",
907
1877
  "description": "An addon rendered inside the input group, after the control."
908
1878
  }
909
1879
  ],
@@ -916,16 +1886,120 @@
916
1886
  },
917
1887
  {
918
1888
  "name": "ful-select",
919
- "description": "A combobox backed by a loader, with badges for the current selection. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
1889
+ "description": "A combobox backed by a loader that acts like a select: the field mirrors the label of a single selection, clicking anywhere on it toggles the dropdown, which opens highlighting the current selection, and Home, End, PageUp, PageDown and Alt+arrows navigate it. A multiple selection renders as ful-badge chips. Without src the slotted options are the vocabulary; with src the options are fetched once (method, POST by default, preload fetching them while upgrading, revision caching them in local storage) or asked per query under mode=chunked, the response shaped through the k-expr/l-expr/d-expr/m-expr expressions or a response-mapper component, and every key coerced as k-type declares. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
920
1890
  "attributes": [
921
1891
  {
922
- "name": "value",
923
- "description": "The selected key, or a comma separated list of keys when multiple.",
1892
+ "name": "name",
1893
+ "description": "The field name the surrounding form submits the selection under.",
1894
+ "value": {
1895
+ "kind": "plain",
1896
+ "type": "string"
1897
+ }
1898
+ },
1899
+ {
1900
+ "name": "loader",
1901
+ "description": "The registered component name the select loads its vocabulary through; loaders:select when absent.",
1902
+ "value": {
1903
+ "kind": "plain",
1904
+ "type": "string"
1905
+ }
1906
+ },
1907
+ {
1908
+ "name": "k-type",
1909
+ "description": "How a key coerces when it arrives from the response or from the value attribute: number, string or bool.",
1910
+ "value": {
1911
+ "kind": "plain",
1912
+ "type": "string"
1913
+ }
1914
+ },
1915
+ {
1916
+ "name": "src",
1917
+ "description": "The url the vocabulary is fetched from. Without it the slotted <option> elements are the whole vocabulary, held in memory.",
1918
+ "value": {
1919
+ "kind": "plain",
1920
+ "type": "string"
1921
+ }
1922
+ },
1923
+ {
1924
+ "name": "method",
1925
+ "description": "The method the vocabulary is fetched with; POST when absent.",
1926
+ "value": {
1927
+ "kind": "plain",
1928
+ "type": "string"
1929
+ }
1930
+ },
1931
+ {
1932
+ "name": "mode",
1933
+ "description": "chunked asks the endpoint per query instead of fetching the vocabulary once, for a list too large to hold.",
1934
+ "value": {
1935
+ "kind": "plain",
1936
+ "type": "string"
1937
+ }
1938
+ },
1939
+ {
1940
+ "name": "preload",
1941
+ "description": "Fetches the vocabulary while the element upgrades rather than on first use. The field paints immediately either way; the options arrive when they arrive.",
1942
+ "value": {
1943
+ "kind": "plain",
1944
+ "type": "boolean"
1945
+ }
1946
+ },
1947
+ {
1948
+ "name": "revision",
1949
+ "description": "Caches the fetched vocabulary in local storage under this revision; a load under a different one is a miss that evicts the entry. It is the cache's namespace, so a vocabulary that differs per user wants the principal in it.",
1950
+ "value": {
1951
+ "kind": "plain",
1952
+ "type": "string"
1953
+ }
1954
+ },
1955
+ {
1956
+ "name": "k-expr",
1957
+ "description": "The expression yielding an option's key, evaluated against each row of the response. Set it together with l-expr to shape a response without a mapper component.",
924
1958
  "value": {
925
1959
  "kind": "plain",
926
1960
  "type": "string"
927
1961
  }
928
1962
  },
1963
+ {
1964
+ "name": "l-expr",
1965
+ "description": "The expression yielding an option's label, evaluated against each row of the response.",
1966
+ "value": {
1967
+ "kind": "plain",
1968
+ "type": "string"
1969
+ }
1970
+ },
1971
+ {
1972
+ "name": "d-expr",
1973
+ "description": "The expression yielding the rows from the response body; the body itself when absent.",
1974
+ "value": {
1975
+ "kind": "plain",
1976
+ "type": "string"
1977
+ }
1978
+ },
1979
+ {
1980
+ "name": "m-expr",
1981
+ "description": "The expression yielding an option's metadata, evaluated against each row; the whole row when absent.",
1982
+ "value": {
1983
+ "kind": "plain",
1984
+ "type": "string"
1985
+ }
1986
+ },
1987
+ {
1988
+ "name": "response-mapper",
1989
+ "description": "The registered component name that turns a response into { key, label, metadata } entries. The k-expr/l-expr pair takes precedence; without either, the response is read as positional rows.",
1990
+ "value": {
1991
+ "kind": "plain",
1992
+ "type": "string"
1993
+ }
1994
+ },
1995
+ {
1996
+ "name": "disabled",
1997
+ "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
1998
+ "value": {
1999
+ "kind": "plain",
2000
+ "type": "boolean"
2001
+ }
2002
+ },
929
2003
  {
930
2004
  "name": "readonly",
931
2005
  "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
@@ -943,8 +2017,24 @@
943
2017
  }
944
2018
  },
945
2019
  {
946
- "name": "itemlist",
947
- "description": "Shows the selection as a list under the control as well as badges.",
2020
+ "name": "value",
2021
+ "description": "The selected keys, comma separated, whether or not the select is multiple. A key given here is trimmed and cannot contain a comma; assign such a key through the property instead. The property answers a key for a single select and an array for a multiple one.",
2022
+ "value": {
2023
+ "kind": "plain",
2024
+ "type": "string"
2025
+ }
2026
+ },
2027
+ {
2028
+ "name": "multiple",
2029
+ "description": "Selects any number of options rather than one: the value is a comma separated list of keys and the selection renders as ful-badge chips.",
2030
+ "value": {
2031
+ "kind": "plain",
2032
+ "type": "boolean"
2033
+ }
2034
+ },
2035
+ {
2036
+ "name": "item-list",
2037
+ "description": "Shows the selection as a ful-item-list under the control as well, in addition to the field itself (the label for a single select, the ful-badge chips when multiple).",
948
2038
  "value": {
949
2039
  "kind": "plain",
950
2040
  "type": "boolean"
@@ -961,24 +2051,16 @@
961
2051
  "description": "Extra content rendered next to the label, for a hint or a help icon."
962
2052
  },
963
2053
  {
964
- "name": "ibefore",
2054
+ "name": "before",
965
2055
  "description": "An addon rendered inside the input group, before the control."
966
2056
  },
967
2057
  {
968
- "name": "before",
969
- "description": "Content rendered before the control, outside the addon styling."
2058
+ "name": "after",
2059
+ "description": "An addon rendered inside the input group, after the control."
970
2060
  },
971
2061
  {
972
2062
  "name": "dropdown",
973
2063
  "description": "Replaces the template used to render the options."
974
- },
975
- {
976
- "name": "after",
977
- "description": "Content rendered after the control, outside the addon styling."
978
- },
979
- {
980
- "name": "iafter",
981
- "description": "An addon rendered inside the input group, after the control."
982
2064
  }
983
2065
  ],
984
2066
  "events": [
@@ -990,10 +2072,23 @@
990
2072
  },
991
2073
  {
992
2074
  "name": "ful-dropdown",
993
- "description": "The options popup of a ful-select. Rarely used on its own.",
994
- "attributes": [],
2075
+ "description": "The options popup of a ful-select, with a localized no-results message when the search matches nothing. Rarely used on its own.",
2076
+ "attributes": [
2077
+ {
2078
+ "name": "listbox",
2079
+ "description": "The id to give the listbox, so a host can point aria-controls and aria-activedescendant at it before this element upgrades.",
2080
+ "value": {
2081
+ "kind": "plain",
2082
+ "type": "string"
2083
+ }
2084
+ }
2085
+ ],
995
2086
  "slots": [],
996
2087
  "events": [
2088
+ {
2089
+ "name": "activechange",
2090
+ "description": "Fired with the id of the option the reader is on, for the combobox that controls the listbox."
2091
+ },
997
2092
  {
998
2093
  "name": "change",
999
2094
  "description": "Fired with the option that was picked."