@optionfactory/fml 8.0.3 → 9.0.0-rc10

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 +87 -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 +1622 -415
  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 +5767 -2313
  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 +973 -252
  31. package/dist/ful.iife.js +4176 -1416
  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 +4163 -1416
  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 +660 -58
  49. package/dist/web-types.json +1577 -354
  50. package/package.json +16 -8
@@ -1,27 +1,326 @@
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-rc10",
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: top (default), bottom, left or right.",
12
+ "attributes": [
13
+ {
14
+ "name": "placement",
15
+ "description": "Which side of the trigger the note opens on: top (the default), bottom, left or right. Above by default because a note opening downwards covers the control the marker explains. 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
+ "name": "icon",
23
+ "description": "The ful-icon the marker shows, for a tooltip meaning something other than plain information. Defaults to the page's Tooltip.config.icon; a name the library does not paint is declared by the page as ful-icon[name='...'] { mask-image: ... }.",
24
+ "value": {
25
+ "kind": "plain",
26
+ "type": "string"
27
+ }
28
+ },
29
+ {
30
+ "name": "describes",
31
+ "description": "For a tooltip standing in a field: the note joins the accessible description of that field's control, announced on reaching the field rather than only on opening the marker, and the marker leaves the tab order so a form of hinted fields costs no extra keystrokes to walk. The marker stays clickable, and keeps its tab stop wherever nothing took the note.",
32
+ "value": {
33
+ "kind": "plain",
34
+ "type": "boolean"
35
+ }
36
+ }
37
+ ],
38
+ "slots": [
39
+ {
40
+ "name": "default",
41
+ "description": "The short explanation shown in the popover."
42
+ }
43
+ ],
44
+ "events": []
45
+ },
46
+ {
47
+ "name": "ful-dialog",
48
+ "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 answer with how the dialog ended, or through update(callback), which opens it on a loading state and then shows either what the callback delivered or the problems of a rejection. Longer explanations belong here, shorter ones in ful-tooltip.",
49
+ "attributes": [
50
+ {
51
+ "name": "header",
52
+ "description": "The dialog's title, shown in its header. Text only; slot content into the body instead for anything richer.",
53
+ "value": {
54
+ "kind": "plain",
55
+ "type": "string"
56
+ }
57
+ },
58
+ {
59
+ "name": "requires-answer",
60
+ "description": "For the dialog that must be answered: the close button is not rendered and Escape is refused, so the only way out is a button carrying a result. Both, since a close button withheld while Escape still worked would be decoration rather than a rule.",
61
+ "value": {
62
+ "kind": "plain",
63
+ "type": "boolean"
64
+ }
65
+ },
66
+ {
67
+ "name": "close-on-submit",
68
+ "description": "For the dialog whose answer is a form succeeding rather than a button being pressed: its own form submitting successfully closes it and answers with the response. Opt in, and its own form only, a ful-form the body holds directly, since a ful-table wraps its filters in a form of its own and searching one is not the dialog being answered. Such a dialog renders no acknowledge button of its own, the form's submit being its answer.",
69
+ "value": {
70
+ "kind": "plain",
71
+ "type": "boolean"
72
+ }
73
+ }
74
+ ],
75
+ "slots": [
76
+ {
77
+ "name": "header",
78
+ "description": "Content beside the title and before it: an icon, a badge, a status. It sits outside the heading rather than in it, the header attribute setting the heading through text."
79
+ },
80
+ {
81
+ "name": "default",
82
+ "description": "The dialog body."
83
+ },
84
+ {
85
+ "name": "buttons",
86
+ "description": "Buttons closing the dialog; each carries a data-result that the answer carries back. Without this slot a localized acknowledge button is shown. A dialog closing on its form renders none either way, so the slot is for buttons beside the form, not for suppressing one."
87
+ }
88
+ ],
89
+ "events": [
90
+ {
91
+ "name": "close",
92
+ "description": "Fired when the dialog closes, carrying how it ended: dismissed tells a cancel from an answer, result the data-result of the button that closed it, response what a submit answered with. ask() and open() resolve with the same object, and a dialog leaving the document while open answers its waiters with a dismissal."
93
+ },
94
+ {
95
+ "name": "section:requested",
96
+ "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."
97
+ }
98
+ ]
99
+ },
100
+ {
101
+ "name": "ful-drawer",
102
+ "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.",
103
+ "attributes": [
104
+ {
105
+ "name": "title",
106
+ "description": "The drawer's title, shown in its header. Text only, and also what update() re-titles the panel with.",
107
+ "value": {
108
+ "kind": "plain",
109
+ "type": "string"
110
+ }
111
+ },
112
+ {
113
+ "name": "placement",
114
+ "description": "Which edge the panel slides in from: end (the default) or start, following the page's writing direction.",
115
+ "value": {
116
+ "kind": "plain",
117
+ "type": "string"
118
+ }
119
+ },
120
+ {
121
+ "name": "close-on-submit",
122
+ "description": "For the drawer whose ending is a form succeeding rather than its close button being pressed: the form its content holds directly submitting successfully closes it, the close event carrying the response. Opt in, and its own form only, since a ful-table wraps its filters in a form of its own and searching one is not the drawer finishing.",
123
+ "value": {
124
+ "kind": "plain",
125
+ "type": "boolean"
126
+ }
127
+ }
128
+ ],
129
+ "slots": [
130
+ {
131
+ "name": "header",
132
+ "description": "Content beside the title and before it: an icon, a badge, a status. It sits outside the heading rather than in it, update() setting the title through textContent and taking anything nested there with it."
133
+ },
134
+ {
135
+ "name": "default",
136
+ "description": "The drawer body, shown when update() never replaced it."
137
+ }
138
+ ],
139
+ "events": [
140
+ {
141
+ "name": "close",
142
+ "description": "Fired when the drawer closes, carrying how it ended: dismissed tells the close button and Escape from a form that closed it under close-on-submit, and response what that submit answered with, a save answering with no body at all being a save all the same."
143
+ },
144
+ {
145
+ "name": "section:requested",
146
+ "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."
147
+ }
148
+ ]
149
+ },
150
+ {
151
+ "name": "ful-toasts",
152
+ "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.",
153
+ "attributes": [
154
+ {
155
+ "name": "timeout",
156
+ "description": "How long a toast stands before it retires, in milliseconds; 5000 when absent. A show() may override it per toast.",
157
+ "value": {
158
+ "kind": "plain",
159
+ "type": "number"
160
+ }
161
+ }
162
+ ],
163
+ "slots": [],
164
+ "events": []
165
+ },
166
+ {
167
+ "name": "ful-tabs",
168
+ "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.",
169
+ "attributes": [
170
+ {
171
+ "name": "active",
172
+ "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.",
173
+ "value": {
174
+ "kind": "plain",
175
+ "type": "number"
176
+ }
177
+ }
178
+ ],
179
+ "slots": [
180
+ {
181
+ "name": "tabs",
182
+ "description": "The tab declarations, one tab element per panel, carrying the tab's label."
183
+ },
184
+ {
185
+ "name": "default",
186
+ "description": "The panels, one element per declared tab, paired in order: each becomes a tabpanel announced by its tab."
187
+ }
188
+ ],
189
+ "events": [
190
+ {
191
+ "name": "change",
192
+ "description": "Fired with the active index and the previous one whenever the visible panel moves."
193
+ },
194
+ {
195
+ "name": "section:requested",
196
+ "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."
197
+ }
198
+ ]
199
+ },
200
+ {
201
+ "name": "ful-accordion",
202
+ "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.",
203
+ "attributes": [
204
+ {
205
+ "name": "exclusive",
206
+ "description": "When present, opening a panel closes the others: the native details name grouping, assigned (and assignable again) by the render.",
207
+ "value": {
208
+ "kind": "plain",
209
+ "type": "boolean"
210
+ }
211
+ }
212
+ ],
13
213
  "slots": [
14
214
  {
15
215
  "name": "default",
16
- "description": "Text shown next to the spinner."
216
+ "description": "The native details/summary disclosures, one per panel, rendered inside the group."
17
217
  }
18
218
  ],
19
219
  "events": []
20
220
  },
221
+ {
222
+ "name": "ful-wizard",
223
+ "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.",
224
+ "attributes": [
225
+ {
226
+ "name": "progress",
227
+ "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.",
228
+ "value": {
229
+ "kind": "plain",
230
+ "type": "string"
231
+ }
232
+ }
233
+ ],
234
+ "slots": [
235
+ {
236
+ "name": "steps",
237
+ "description": "The step declarations, one step element per section, carrying the step's label."
238
+ },
239
+ {
240
+ "name": "default",
241
+ "description": "The sections, one per declared step: only the current one is shown, and each may carry a data-step name for move()."
242
+ }
243
+ ],
244
+ "events": [
245
+ {
246
+ "name": "change",
247
+ "description": "Fired with the index and the data-step name after next(), prev() or move() land on a different step."
248
+ },
249
+ {
250
+ "name": "section:requested",
251
+ "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."
252
+ }
253
+ ]
254
+ },
21
255
  {
22
256
  "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": [],
257
+ "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.",
258
+ "attributes": [
259
+ {
260
+ "name": "action",
261
+ "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.",
262
+ "value": {
263
+ "kind": "plain",
264
+ "type": "string"
265
+ }
266
+ },
267
+ {
268
+ "name": "method",
269
+ "description": "The http method of the remote loader, POST by default.",
270
+ "value": {
271
+ "kind": "plain",
272
+ "type": "string"
273
+ }
274
+ },
275
+ {
276
+ "name": "loader",
277
+ "description": "The registry component key of the form loader, loaders:form by default. A loader of your own implements prepare, submit and transform.",
278
+ "value": {
279
+ "kind": "plain",
280
+ "type": "string"
281
+ }
282
+ },
283
+ {
284
+ "name": "request-mapper",
285
+ "description": "A registry component key, (values, form) => request, applied to the extracted values before they are sent.",
286
+ "value": {
287
+ "kind": "plain",
288
+ "type": "string"
289
+ }
290
+ },
291
+ {
292
+ "name": "response-mapper",
293
+ "description": "A registry component key, (response, form) => mapped, applied to a successful response before it reaches submit:success.",
294
+ "value": {
295
+ "kind": "plain",
296
+ "type": "string"
297
+ }
298
+ },
299
+ {
300
+ "name": "clear-invalid-on-change",
301
+ "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.",
302
+ "value": {
303
+ "kind": "plain",
304
+ "type": "boolean"
305
+ }
306
+ },
307
+ {
308
+ "name": "scroll-on-error",
309
+ "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.",
310
+ "value": {
311
+ "kind": "plain",
312
+ "type": "boolean"
313
+ }
314
+ },
315
+ {
316
+ "name": "autocomplete",
317
+ "description": "The autofill token every field in the form takes unless it declares one of its own, copied onto the form element the host renders. A form cannot pass it down the way the platform would: each control carries form=\"\" so that the host is the only thing that submits, which leaves it with no form owner to inherit through, so the fields read it off the form instead.",
318
+ "value": {
319
+ "kind": "plain",
320
+ "type": "string"
321
+ }
322
+ }
323
+ ],
25
324
  "slots": [],
26
325
  "events": [
27
326
  {
@@ -47,8 +346,636 @@
47
346
  "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
347
  "attributes": [
49
348
  {
50
- "name": "value",
51
- "description": "Checked when the attribute is the string true.",
349
+ "name": "type",
350
+ "description": "switch renders the control as a switch rather than a checkbox. The value and the semantics are unchanged.",
351
+ "value": {
352
+ "kind": "plain",
353
+ "type": "string"
354
+ }
355
+ },
356
+ {
357
+ "name": "disabled",
358
+ "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.",
359
+ "value": {
360
+ "kind": "plain",
361
+ "type": "boolean"
362
+ }
363
+ },
364
+ {
365
+ "name": "readonly",
366
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
367
+ "value": {
368
+ "kind": "plain",
369
+ "type": "boolean"
370
+ }
371
+ },
372
+ {
373
+ "name": "required",
374
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
375
+ "value": {
376
+ "kind": "plain",
377
+ "type": "boolean"
378
+ }
379
+ },
380
+ {
381
+ "name": "value",
382
+ "description": "Checked when the attribute is the string true.",
383
+ "value": {
384
+ "kind": "plain",
385
+ "type": "boolean"
386
+ }
387
+ }
388
+ ],
389
+ "slots": [
390
+ {
391
+ "name": "default",
392
+ "description": "The label of the field."
393
+ },
394
+ {
395
+ "name": "info",
396
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
397
+ }
398
+ ],
399
+ "events": [
400
+ {
401
+ "name": "change",
402
+ "description": "Fired with the new checked state when the box or its label is clicked."
403
+ }
404
+ ]
405
+ },
406
+ {
407
+ "name": "ful-input",
408
+ "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.",
409
+ "attributes": [
410
+ {
411
+ "name": "type",
412
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
413
+ "value": {
414
+ "kind": "plain",
415
+ "type": "string"
416
+ }
417
+ },
418
+ {
419
+ "name": "v-type",
420
+ "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.",
421
+ "value": {
422
+ "kind": "plain",
423
+ "type": "string"
424
+ }
425
+ },
426
+ {
427
+ "name": "keep",
428
+ "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.",
429
+ "value": {
430
+ "kind": "plain",
431
+ "type": "string"
432
+ }
433
+ },
434
+ {
435
+ "name": "reject",
436
+ "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.",
437
+ "value": {
438
+ "kind": "plain",
439
+ "type": "string"
440
+ }
441
+ },
442
+ {
443
+ "name": "uppercase",
444
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
445
+ "value": {
446
+ "kind": "plain",
447
+ "type": "boolean"
448
+ }
449
+ },
450
+ {
451
+ "name": "trim",
452
+ "description": "Trims the value on the way out, leaving what was typed alone.",
453
+ "value": {
454
+ "kind": "plain",
455
+ "type": "boolean"
456
+ }
457
+ },
458
+ {
459
+ "name": "autocomplete",
460
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
461
+ "value": {
462
+ "kind": "plain",
463
+ "type": "string"
464
+ }
465
+ },
466
+ {
467
+ "name": "disabled",
468
+ "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.",
469
+ "value": {
470
+ "kind": "plain",
471
+ "type": "boolean"
472
+ }
473
+ },
474
+ {
475
+ "name": "readonly",
476
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
477
+ "value": {
478
+ "kind": "plain",
479
+ "type": "boolean"
480
+ }
481
+ },
482
+ {
483
+ "name": "required",
484
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
485
+ "value": {
486
+ "kind": "plain",
487
+ "type": "boolean"
488
+ }
489
+ },
490
+ {
491
+ "name": "value",
492
+ "description": "The current value.",
493
+ "value": {
494
+ "kind": "plain",
495
+ "type": "string"
496
+ }
497
+ },
498
+ {
499
+ "name": "placeholder",
500
+ "description": "Placeholder shown while the field is empty.",
501
+ "value": {
502
+ "kind": "plain",
503
+ "type": "string"
504
+ }
505
+ }
506
+ ],
507
+ "slots": [
508
+ {
509
+ "name": "default",
510
+ "description": "The label of the field."
511
+ },
512
+ {
513
+ "name": "info",
514
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
515
+ },
516
+ {
517
+ "name": "before",
518
+ "description": "An addon rendered inside the input group, before the control."
519
+ },
520
+ {
521
+ "name": "after",
522
+ "description": "An addon rendered inside the input group, after the control."
523
+ }
524
+ ],
525
+ "events": [
526
+ {
527
+ "name": "change",
528
+ "description": "Fired with the current value when the field is committed."
529
+ }
530
+ ]
531
+ },
532
+ {
533
+ "name": "ful-input-file",
534
+ "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.",
535
+ "attributes": [
536
+ {
537
+ "name": "type",
538
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
539
+ "value": {
540
+ "kind": "plain",
541
+ "type": "string"
542
+ }
543
+ },
544
+ {
545
+ "name": "v-type",
546
+ "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.",
547
+ "value": {
548
+ "kind": "plain",
549
+ "type": "string"
550
+ }
551
+ },
552
+ {
553
+ "name": "keep",
554
+ "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.",
555
+ "value": {
556
+ "kind": "plain",
557
+ "type": "string"
558
+ }
559
+ },
560
+ {
561
+ "name": "reject",
562
+ "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.",
563
+ "value": {
564
+ "kind": "plain",
565
+ "type": "string"
566
+ }
567
+ },
568
+ {
569
+ "name": "uppercase",
570
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
571
+ "value": {
572
+ "kind": "plain",
573
+ "type": "boolean"
574
+ }
575
+ },
576
+ {
577
+ "name": "trim",
578
+ "description": "Trims the value on the way out, leaving what was typed alone.",
579
+ "value": {
580
+ "kind": "plain",
581
+ "type": "boolean"
582
+ }
583
+ },
584
+ {
585
+ "name": "autocomplete",
586
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
587
+ "value": {
588
+ "kind": "plain",
589
+ "type": "string"
590
+ }
591
+ },
592
+ {
593
+ "name": "disabled",
594
+ "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.",
595
+ "value": {
596
+ "kind": "plain",
597
+ "type": "boolean"
598
+ }
599
+ },
600
+ {
601
+ "name": "readonly",
602
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
603
+ "value": {
604
+ "kind": "plain",
605
+ "type": "boolean"
606
+ }
607
+ },
608
+ {
609
+ "name": "required",
610
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
611
+ "value": {
612
+ "kind": "plain",
613
+ "type": "boolean"
614
+ }
615
+ },
616
+ {
617
+ "name": "value",
618
+ "description": "Only an empty value is honoured, to clear the selection: file inputs cannot be filled programmatically.",
619
+ "value": {
620
+ "kind": "plain",
621
+ "type": "string"
622
+ }
623
+ },
624
+ {
625
+ "name": "placeholder",
626
+ "description": "Placeholder shown while the field is empty.",
627
+ "value": {
628
+ "kind": "plain",
629
+ "type": "string"
630
+ }
631
+ },
632
+ {
633
+ "name": "accept",
634
+ "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.",
635
+ "value": {
636
+ "kind": "plain",
637
+ "type": "string"
638
+ }
639
+ },
640
+ {
641
+ "name": "multiple",
642
+ "description": "Allows selecting more than one file.",
643
+ "value": {
644
+ "kind": "plain",
645
+ "type": "boolean"
646
+ }
647
+ },
648
+ {
649
+ "name": "item-list",
650
+ "description": "Shows the list of selected files.",
651
+ "value": {
652
+ "kind": "plain",
653
+ "type": "boolean"
654
+ }
655
+ },
656
+ {
657
+ "name": "dropzone",
658
+ "description": "Shows the dropzone.",
659
+ "value": {
660
+ "kind": "plain",
661
+ "type": "boolean"
662
+ }
663
+ },
664
+ {
665
+ "name": "max-files",
666
+ "description": "Maximum number of files. Exceeding it clears the selection.",
667
+ "value": {
668
+ "kind": "plain",
669
+ "type": "number"
670
+ }
671
+ },
672
+ {
673
+ "name": "max-file-size",
674
+ "description": "Maximum size of a single file, in bytes. Larger files are dropped.",
675
+ "value": {
676
+ "kind": "plain",
677
+ "type": "number"
678
+ }
679
+ },
680
+ {
681
+ "name": "max-total-size",
682
+ "description": "Maximum size of all the selected files, in bytes. Exceeding it clears the selection.",
683
+ "value": {
684
+ "kind": "plain",
685
+ "type": "number"
686
+ }
687
+ }
688
+ ],
689
+ "slots": [
690
+ {
691
+ "name": "default",
692
+ "description": "The label of the field."
693
+ },
694
+ {
695
+ "name": "info",
696
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
697
+ },
698
+ {
699
+ "name": "before",
700
+ "description": "An addon rendered inside the input group, before the control."
701
+ },
702
+ {
703
+ "name": "after",
704
+ "description": "An addon rendered inside the input group, after the control."
705
+ },
706
+ {
707
+ "name": "dropzone",
708
+ "description": "Replaces the contents of the default dropzone."
709
+ }
710
+ ],
711
+ "events": [
712
+ {
713
+ "name": "change",
714
+ "description": "Fired with the names of the selected files."
715
+ }
716
+ ]
717
+ },
718
+ {
719
+ "name": "ful-local-date",
720
+ "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.",
721
+ "attributes": [
722
+ {
723
+ "name": "locale",
724
+ "description": "The locale the date is formatted in, taking precedence over the page's. The platform default applies when neither names one.",
725
+ "value": {
726
+ "kind": "plain",
727
+ "type": "string"
728
+ }
729
+ },
730
+ {
731
+ "name": "default",
732
+ "description": "The text rendered when the content is blank or does not parse as a date.",
733
+ "value": {
734
+ "kind": "plain",
735
+ "type": "string"
736
+ }
737
+ }
738
+ ],
739
+ "slots": [],
740
+ "events": []
741
+ },
742
+ {
743
+ "name": "ful-instant",
744
+ "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.",
745
+ "attributes": [
746
+ {
747
+ "name": "locale",
748
+ "description": "The locale the instant is formatted in, taking precedence over the page's. The platform default applies when neither names one.",
749
+ "value": {
750
+ "kind": "plain",
751
+ "type": "string"
752
+ }
753
+ },
754
+ {
755
+ "name": "default",
756
+ "description": "The text rendered when the content is blank or does not parse as an instant.",
757
+ "value": {
758
+ "kind": "plain",
759
+ "type": "string"
760
+ }
761
+ }
762
+ ],
763
+ "slots": [],
764
+ "events": []
765
+ },
766
+ {
767
+ "name": "ful-input-local-date",
768
+ "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.",
769
+ "attributes": [
770
+ {
771
+ "name": "type",
772
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
773
+ "value": {
774
+ "kind": "plain",
775
+ "type": "string"
776
+ }
777
+ },
778
+ {
779
+ "name": "v-type",
780
+ "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.",
781
+ "value": {
782
+ "kind": "plain",
783
+ "type": "string"
784
+ }
785
+ },
786
+ {
787
+ "name": "keep",
788
+ "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.",
789
+ "value": {
790
+ "kind": "plain",
791
+ "type": "string"
792
+ }
793
+ },
794
+ {
795
+ "name": "reject",
796
+ "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.",
797
+ "value": {
798
+ "kind": "plain",
799
+ "type": "string"
800
+ }
801
+ },
802
+ {
803
+ "name": "uppercase",
804
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
805
+ "value": {
806
+ "kind": "plain",
807
+ "type": "boolean"
808
+ }
809
+ },
810
+ {
811
+ "name": "trim",
812
+ "description": "Trims the value on the way out, leaving what was typed alone.",
813
+ "value": {
814
+ "kind": "plain",
815
+ "type": "boolean"
816
+ }
817
+ },
818
+ {
819
+ "name": "autocomplete",
820
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
821
+ "value": {
822
+ "kind": "plain",
823
+ "type": "string"
824
+ }
825
+ },
826
+ {
827
+ "name": "disabled",
828
+ "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.",
829
+ "value": {
830
+ "kind": "plain",
831
+ "type": "boolean"
832
+ }
833
+ },
834
+ {
835
+ "name": "readonly",
836
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
837
+ "value": {
838
+ "kind": "plain",
839
+ "type": "boolean"
840
+ }
841
+ },
842
+ {
843
+ "name": "required",
844
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
845
+ "value": {
846
+ "kind": "plain",
847
+ "type": "boolean"
848
+ }
849
+ },
850
+ {
851
+ "name": "value",
852
+ "description": "The current value.",
853
+ "value": {
854
+ "kind": "plain",
855
+ "type": "string"
856
+ }
857
+ },
858
+ {
859
+ "name": "placeholder",
860
+ "description": "Placeholder shown while the field is empty.",
861
+ "value": {
862
+ "kind": "plain",
863
+ "type": "string"
864
+ }
865
+ },
866
+ {
867
+ "name": "step",
868
+ "description": "Step between selectable dates, in days.",
869
+ "value": {
870
+ "kind": "plain",
871
+ "type": "string"
872
+ }
873
+ },
874
+ {
875
+ "name": "min",
876
+ "description": "Earliest selectable date. Accepts a date, now, or a day, month or year offset.",
877
+ "value": {
878
+ "kind": "plain",
879
+ "type": "string"
880
+ }
881
+ },
882
+ {
883
+ "name": "max",
884
+ "description": "Latest selectable date. Accepts a date, now, or a day, month or year offset.",
885
+ "value": {
886
+ "kind": "plain",
887
+ "type": "string"
888
+ }
889
+ }
890
+ ],
891
+ "slots": [
892
+ {
893
+ "name": "default",
894
+ "description": "The label of the field."
895
+ },
896
+ {
897
+ "name": "info",
898
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
899
+ },
900
+ {
901
+ "name": "before",
902
+ "description": "An addon rendered inside the input group, before the control."
903
+ },
904
+ {
905
+ "name": "after",
906
+ "description": "An addon rendered inside the input group, after the control."
907
+ }
908
+ ],
909
+ "events": [
910
+ {
911
+ "name": "change",
912
+ "description": "Fired with the current date."
913
+ }
914
+ ]
915
+ },
916
+ {
917
+ "name": "ful-input-local-time",
918
+ "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.",
919
+ "attributes": [
920
+ {
921
+ "name": "type",
922
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
923
+ "value": {
924
+ "kind": "plain",
925
+ "type": "string"
926
+ }
927
+ },
928
+ {
929
+ "name": "v-type",
930
+ "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.",
931
+ "value": {
932
+ "kind": "plain",
933
+ "type": "string"
934
+ }
935
+ },
936
+ {
937
+ "name": "keep",
938
+ "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.",
939
+ "value": {
940
+ "kind": "plain",
941
+ "type": "string"
942
+ }
943
+ },
944
+ {
945
+ "name": "reject",
946
+ "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.",
947
+ "value": {
948
+ "kind": "plain",
949
+ "type": "string"
950
+ }
951
+ },
952
+ {
953
+ "name": "uppercase",
954
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
955
+ "value": {
956
+ "kind": "plain",
957
+ "type": "boolean"
958
+ }
959
+ },
960
+ {
961
+ "name": "trim",
962
+ "description": "Trims the value on the way out, leaving what was typed alone.",
963
+ "value": {
964
+ "kind": "plain",
965
+ "type": "boolean"
966
+ }
967
+ },
968
+ {
969
+ "name": "autocomplete",
970
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
971
+ "value": {
972
+ "kind": "plain",
973
+ "type": "string"
974
+ }
975
+ },
976
+ {
977
+ "name": "disabled",
978
+ "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
979
  "value": {
53
980
  "kind": "plain",
54
981
  "type": "boolean"
@@ -69,6 +996,46 @@
69
996
  "kind": "plain",
70
997
  "type": "boolean"
71
998
  }
999
+ },
1000
+ {
1001
+ "name": "value",
1002
+ "description": "The current value.",
1003
+ "value": {
1004
+ "kind": "plain",
1005
+ "type": "string"
1006
+ }
1007
+ },
1008
+ {
1009
+ "name": "placeholder",
1010
+ "description": "Placeholder shown while the field is empty.",
1011
+ "value": {
1012
+ "kind": "plain",
1013
+ "type": "string"
1014
+ }
1015
+ },
1016
+ {
1017
+ "name": "step",
1018
+ "description": "Step between selectable times, in seconds. The bounds are truncated to this grid.",
1019
+ "value": {
1020
+ "kind": "plain",
1021
+ "type": "string"
1022
+ }
1023
+ },
1024
+ {
1025
+ "name": "min",
1026
+ "description": "Earliest selectable time. Accepts a time, now, or an offset such as +2h or -30m.",
1027
+ "value": {
1028
+ "kind": "plain",
1029
+ "type": "string"
1030
+ }
1031
+ },
1032
+ {
1033
+ "name": "max",
1034
+ "description": "Latest selectable time. Accepts a time, now, or an offset such as +2h or -30m.",
1035
+ "value": {
1036
+ "kind": "plain",
1037
+ "type": "string"
1038
+ }
72
1039
  }
73
1040
  ],
74
1041
  "slots": [
@@ -79,27 +1046,91 @@
79
1046
  {
80
1047
  "name": "info",
81
1048
  "description": "Extra content rendered next to the label, for a hint or a help icon."
1049
+ },
1050
+ {
1051
+ "name": "before",
1052
+ "description": "An addon rendered inside the input group, before the control."
1053
+ },
1054
+ {
1055
+ "name": "after",
1056
+ "description": "An addon rendered inside the input group, after the control."
82
1057
  }
83
1058
  ],
84
1059
  "events": [
85
1060
  {
86
1061
  "name": "change",
87
- "description": "Fired with the new checked state when the box or its label is clicked."
1062
+ "description": "Fired with the current time."
88
1063
  }
89
1064
  ]
90
1065
  },
91
1066
  {
92
- "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.",
1067
+ "name": "ful-input-instant",
1068
+ "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.",
94
1069
  "attributes": [
95
1070
  {
96
- "name": "value",
97
- "description": "The current value.",
1071
+ "name": "type",
1072
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
1073
+ "value": {
1074
+ "kind": "plain",
1075
+ "type": "string"
1076
+ }
1077
+ },
1078
+ {
1079
+ "name": "v-type",
1080
+ "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.",
1081
+ "value": {
1082
+ "kind": "plain",
1083
+ "type": "string"
1084
+ }
1085
+ },
1086
+ {
1087
+ "name": "keep",
1088
+ "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.",
1089
+ "value": {
1090
+ "kind": "plain",
1091
+ "type": "string"
1092
+ }
1093
+ },
1094
+ {
1095
+ "name": "reject",
1096
+ "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.",
1097
+ "value": {
1098
+ "kind": "plain",
1099
+ "type": "string"
1100
+ }
1101
+ },
1102
+ {
1103
+ "name": "uppercase",
1104
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
1105
+ "value": {
1106
+ "kind": "plain",
1107
+ "type": "boolean"
1108
+ }
1109
+ },
1110
+ {
1111
+ "name": "trim",
1112
+ "description": "Trims the value on the way out, leaving what was typed alone.",
1113
+ "value": {
1114
+ "kind": "plain",
1115
+ "type": "boolean"
1116
+ }
1117
+ },
1118
+ {
1119
+ "name": "autocomplete",
1120
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
98
1121
  "value": {
99
1122
  "kind": "plain",
100
1123
  "type": "string"
101
1124
  }
102
1125
  },
1126
+ {
1127
+ "name": "disabled",
1128
+ "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.",
1129
+ "value": {
1130
+ "kind": "plain",
1131
+ "type": "boolean"
1132
+ }
1133
+ },
103
1134
  {
104
1135
  "name": "readonly",
105
1136
  "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
@@ -116,6 +1147,14 @@
116
1147
  "type": "boolean"
117
1148
  }
118
1149
  },
1150
+ {
1151
+ "name": "value",
1152
+ "description": "The current value.",
1153
+ "value": {
1154
+ "kind": "plain",
1155
+ "type": "string"
1156
+ }
1157
+ },
119
1158
  {
120
1159
  "name": "placeholder",
121
1160
  "description": "Placeholder shown while the field is empty.",
@@ -123,6 +1162,30 @@
123
1162
  "kind": "plain",
124
1163
  "type": "string"
125
1164
  }
1165
+ },
1166
+ {
1167
+ "name": "step",
1168
+ "description": "Step between selectable instants, in seconds.",
1169
+ "value": {
1170
+ "kind": "plain",
1171
+ "type": "string"
1172
+ }
1173
+ },
1174
+ {
1175
+ "name": "min",
1176
+ "description": "Earliest selectable instant, as an ISO instant.",
1177
+ "value": {
1178
+ "kind": "plain",
1179
+ "type": "string"
1180
+ }
1181
+ },
1182
+ {
1183
+ "name": "max",
1184
+ "description": "Latest selectable instant, as an ISO instant.",
1185
+ "value": {
1186
+ "kind": "plain",
1187
+ "type": "string"
1188
+ }
126
1189
  }
127
1190
  ],
128
1191
  "slots": [
@@ -134,42 +1197,50 @@
134
1197
  "name": "info",
135
1198
  "description": "Extra content rendered next to the label, for a hint or a help icon."
136
1199
  },
137
- {
138
- "name": "ibefore",
139
- "description": "An addon rendered inside the input group, before the control."
140
- },
141
1200
  {
142
1201
  "name": "before",
143
- "description": "Content rendered before the control, outside the addon styling."
1202
+ "description": "An addon rendered inside the input group, before the control."
144
1203
  },
145
1204
  {
146
1205
  "name": "after",
147
- "description": "Content rendered after the control, outside the addon styling."
148
- },
149
- {
150
- "name": "iafter",
151
1206
  "description": "An addon rendered inside the input group, after the control."
152
1207
  }
153
1208
  ],
154
1209
  "events": [
155
1210
  {
156
1211
  "name": "change",
157
- "description": "Fired with the current value when the field is committed."
1212
+ "description": "Fired with the current instant."
158
1213
  }
159
1214
  ]
160
1215
  },
161
1216
  {
162
- "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.",
1217
+ "name": "ful-radio-group",
1218
+ "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.",
164
1219
  "attributes": [
165
1220
  {
166
- "name": "value",
167
- "description": "Only an empty value is honoured, to clear the selection: file inputs cannot be filled programmatically.",
1221
+ "name": "name",
1222
+ "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.",
1223
+ "value": {
1224
+ "kind": "plain",
1225
+ "type": "string"
1226
+ }
1227
+ },
1228
+ {
1229
+ "name": "type",
1230
+ "description": "boolean maps the two declared radios onto true and false rather than onto their own values.",
168
1231
  "value": {
169
1232
  "kind": "plain",
170
1233
  "type": "string"
171
1234
  }
172
1235
  },
1236
+ {
1237
+ "name": "disabled",
1238
+ "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.",
1239
+ "value": {
1240
+ "kind": "plain",
1241
+ "type": "boolean"
1242
+ }
1243
+ },
173
1244
  {
174
1245
  "name": "readonly",
175
1246
  "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
@@ -187,225 +1258,212 @@
187
1258
  }
188
1259
  },
189
1260
  {
190
- "name": "placeholder",
191
- "description": "Placeholder shown while the field is empty.",
1261
+ "name": "value",
1262
+ "description": "The value of the selected radio.",
192
1263
  "value": {
193
1264
  "kind": "plain",
194
1265
  "type": "string"
195
1266
  }
1267
+ }
1268
+ ],
1269
+ "slots": [
1270
+ {
1271
+ "name": "default",
1272
+ "description": "The legend of the group, and its ful-radio children."
196
1273
  },
197
1274
  {
198
- "name": "accept",
199
- "description": "Comma separated list of accepted extensions. Files that do not match are dropped with a warning.",
1275
+ "name": "header",
1276
+ "description": "Content rendered above the radios."
1277
+ },
1278
+ {
1279
+ "name": "footer",
1280
+ "description": "Content rendered below the radios."
1281
+ }
1282
+ ],
1283
+ "events": [
1284
+ {
1285
+ "name": "change",
1286
+ "description": "Fired with the value of the selected radio."
1287
+ }
1288
+ ]
1289
+ },
1290
+ {
1291
+ "name": "ful-table",
1292
+ "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.",
1293
+ "attributes": [
1294
+ {
1295
+ "name": "loader",
1296
+ "description": "The registered component name the table loads its rows through; loaders:table when absent.",
200
1297
  "value": {
201
1298
  "kind": "plain",
202
1299
  "type": "string"
203
1300
  }
204
1301
  },
205
1302
  {
206
- "name": "multiple",
207
- "description": "Allows selecting more than one file.",
1303
+ "name": "autoload",
1304
+ "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.",
208
1305
  "value": {
209
1306
  "kind": "plain",
210
1307
  "type": "boolean"
211
1308
  }
212
1309
  },
213
1310
  {
214
- "name": "itemlist",
215
- "description": "Shows the list of selected files.",
1311
+ "name": "page-size",
1312
+ "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.",
216
1313
  "value": {
217
1314
  "kind": "plain",
218
- "type": "boolean"
1315
+ "type": "number"
219
1316
  }
1317
+ }
1318
+ ],
1319
+ "slots": [
1320
+ {
1321
+ "name": "filters",
1322
+ "description": "Fields wrapped in a ful-form, submitted to filter the table."
220
1323
  },
221
1324
  {
222
- "name": "dropzone",
223
- "description": "Shows the dropzone.",
224
- "value": {
225
- "kind": "plain",
226
- "type": "boolean"
227
- }
1325
+ "name": "caption",
1326
+ "description": "The caption of the table."
228
1327
  },
229
1328
  {
230
- "name": "maxfiles",
231
- "description": "Maximum number of files. Exceeding it clears the selection.",
1329
+ "name": "footer",
1330
+ "description": "Content rendered in the table footer."
1331
+ }
1332
+ ],
1333
+ "events": []
1334
+ },
1335
+ {
1336
+ "name": "ful-pagination",
1337
+ "description": "The pager of a ful-table, its window rendering at most pages links (5 by default). Rarely used on its own.",
1338
+ "attributes": [
1339
+ {
1340
+ "name": "pages",
1341
+ "description": "How many page buttons are rendered around the current one, 5 by default.",
232
1342
  "value": {
233
1343
  "kind": "plain",
234
1344
  "type": "number"
235
1345
  }
236
1346
  },
237
1347
  {
238
- "name": "maxfilesize",
239
- "description": "Maximum size of a single file, in bytes. Larger files are dropped.",
1348
+ "name": "total",
1349
+ "description": "Number of pages.",
240
1350
  "value": {
241
1351
  "kind": "plain",
242
1352
  "type": "number"
243
1353
  }
244
1354
  },
245
1355
  {
246
- "name": "maxtotalsize",
247
- "description": "Maximum size of all the selected files, in bytes. Exceeding it clears the selection.",
1356
+ "name": "current",
1357
+ "description": "Zero based index of the page being shown.",
248
1358
  "value": {
249
1359
  "kind": "plain",
250
1360
  "type": "number"
251
1361
  }
252
1362
  }
253
1363
  ],
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
- },
1364
+ "slots": [],
1365
+ "events": [
271
1366
  {
272
- "name": "after",
273
- "description": "Content rendered after the control, outside the addon styling."
274
- },
1367
+ "name": "page:requested",
1368
+ "description": "Fired with the zero based index of the page the user asked for."
1369
+ }
1370
+ ]
1371
+ },
1372
+ {
1373
+ "name": "ful-sorter",
1374
+ "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.",
1375
+ "attributes": [
275
1376
  {
276
- "name": "iafter",
277
- "description": "An addon rendered inside the input group, after the control."
1377
+ "name": "sorter",
1378
+ "description": "The field name this column sorts by, sent in the load request. A column without it is not sortable.",
1379
+ "value": {
1380
+ "kind": "plain",
1381
+ "type": "string"
1382
+ }
278
1383
  },
279
1384
  {
280
- "name": "dropzone",
281
- "description": "Replaces the contents of the default dropzone."
1385
+ "name": "order",
1386
+ "description": "The sort currently applied, asc or desc, or absent when unsorted.",
1387
+ "value": {
1388
+ "kind": "plain",
1389
+ "type": "string"
1390
+ }
282
1391
  }
283
1392
  ],
1393
+ "slots": [],
284
1394
  "events": [
285
1395
  {
286
- "name": "change",
287
- "description": "Fired with the names of the selected files."
1396
+ "name": "sort:requested",
1397
+ "description": "Fired with the sorter and the next order when activated."
288
1398
  }
289
1399
  ]
290
1400
  },
291
1401
  {
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.",
1402
+ "name": "ful-filter-instant",
1403
+ "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.",
308
1404
  "attributes": [
309
1405
  {
310
- "name": "value",
311
- "description": "The current value.",
1406
+ "name": "type",
1407
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
312
1408
  "value": {
313
1409
  "kind": "plain",
314
1410
  "type": "string"
315
1411
  }
316
1412
  },
317
1413
  {
318
- "name": "readonly",
319
- "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
1414
+ "name": "v-type",
1415
+ "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.",
320
1416
  "value": {
321
1417
  "kind": "plain",
322
- "type": "boolean"
1418
+ "type": "string"
323
1419
  }
324
1420
  },
325
1421
  {
326
- "name": "required",
327
- "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
1422
+ "name": "keep",
1423
+ "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.",
328
1424
  "value": {
329
1425
  "kind": "plain",
330
- "type": "boolean"
1426
+ "type": "string"
331
1427
  }
332
1428
  },
333
1429
  {
334
- "name": "placeholder",
335
- "description": "Placeholder shown while the field is empty.",
1430
+ "name": "reject",
1431
+ "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.",
336
1432
  "value": {
337
1433
  "kind": "plain",
338
1434
  "type": "string"
339
1435
  }
340
1436
  },
341
1437
  {
342
- "name": "min",
343
- "description": "Earliest selectable date. Accepts a date, now, or a day, month or year offset.",
1438
+ "name": "uppercase",
1439
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
344
1440
  "value": {
345
1441
  "kind": "plain",
346
- "type": "string"
1442
+ "type": "boolean"
347
1443
  }
348
1444
  },
349
1445
  {
350
- "name": "max",
351
- "description": "Latest selectable date. Accepts a date, now, or a day, month or year offset.",
1446
+ "name": "trim",
1447
+ "description": "Trims the value on the way out, leaving what was typed alone.",
352
1448
  "value": {
353
1449
  "kind": "plain",
354
- "type": "string"
1450
+ "type": "boolean"
355
1451
  }
356
1452
  },
357
1453
  {
358
- "name": "step",
359
- "description": "Step between selectable dates, in days.",
1454
+ "name": "autocomplete",
1455
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
360
1456
  "value": {
361
1457
  "kind": "plain",
362
1458
  "type": "string"
363
1459
  }
364
- }
365
- ],
366
- "slots": [
367
- {
368
- "name": "default",
369
- "description": "The label of the field."
370
- },
371
- {
372
- "name": "info",
373
- "description": "Extra content rendered next to the label, for a hint or a help icon."
374
- },
375
- {
376
- "name": "ibefore",
377
- "description": "An addon rendered inside the input group, before the control."
378
- },
379
- {
380
- "name": "before",
381
- "description": "Content rendered before the control, outside the addon styling."
382
- },
383
- {
384
- "name": "after",
385
- "description": "Content rendered after the control, outside the addon styling."
386
1460
  },
387
1461
  {
388
- "name": "iafter",
389
- "description": "An addon rendered inside the input group, after the control."
390
- }
391
- ],
392
- "events": [
393
- {
394
- "name": "change",
395
- "description": "Fired with the current date."
396
- }
397
- ]
398
- },
399
- {
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.",
402
- "attributes": [
403
- {
404
- "name": "value",
405
- "description": "The current value.",
1462
+ "name": "disabled",
1463
+ "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.",
406
1464
  "value": {
407
1465
  "kind": "plain",
408
- "type": "string"
1466
+ "type": "boolean"
409
1467
  }
410
1468
  },
411
1469
  {
@@ -425,32 +1483,24 @@
425
1483
  }
426
1484
  },
427
1485
  {
428
- "name": "placeholder",
429
- "description": "Placeholder shown while the field is empty.",
430
- "value": {
431
- "kind": "plain",
432
- "type": "string"
433
- }
434
- },
435
- {
436
- "name": "min",
437
- "description": "Earliest selectable time. Accepts a time, now, or an offset such as +2h or -30m.",
1486
+ "name": "value",
1487
+ "description": "JSON tuple of the operator and its bounds, for example [\"BETWEEN\", from, to].",
438
1488
  "value": {
439
1489
  "kind": "plain",
440
1490
  "type": "string"
441
1491
  }
442
1492
  },
443
1493
  {
444
- "name": "max",
445
- "description": "Latest selectable time. Accepts a time, now, or an offset such as +2h or -30m.",
1494
+ "name": "placeholder",
1495
+ "description": "Placeholder shown while the field is empty.",
446
1496
  "value": {
447
1497
  "kind": "plain",
448
1498
  "type": "string"
449
1499
  }
450
1500
  },
451
1501
  {
452
- "name": "step",
453
- "description": "Step between selectable times, in seconds. The bounds are truncated to this grid.",
1502
+ "name": "operators",
1503
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ, LT, GT, LTE, GTE, BETWEEN. Defaults to all of them.",
454
1504
  "value": {
455
1505
  "kind": "plain",
456
1506
  "type": "string"
@@ -466,256 +1516,224 @@
466
1516
  "name": "info",
467
1517
  "description": "Extra content rendered next to the label, for a hint or a help icon."
468
1518
  },
469
- {
470
- "name": "ibefore",
471
- "description": "An addon rendered inside the input group, before the control."
472
- },
473
1519
  {
474
1520
  "name": "before",
475
- "description": "Content rendered before the control, outside the addon styling."
1521
+ "description": "An addon rendered inside the input group, before the control."
476
1522
  },
477
1523
  {
478
1524
  "name": "after",
479
- "description": "Content rendered after the control, outside the addon styling."
480
- },
481
- {
482
- "name": "iafter",
483
1525
  "description": "An addon rendered inside the input group, after the control."
484
1526
  }
485
1527
  ],
486
1528
  "events": [
487
1529
  {
488
1530
  "name": "change",
489
- "description": "Fired with the current time."
1531
+ "description": "Fired with the whole tuple, or undefined when the filter is incomplete."
490
1532
  }
491
1533
  ]
492
1534
  },
493
1535
  {
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.",
1536
+ "name": "ful-filter-local-date",
1537
+ "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.",
496
1538
  "attributes": [
497
1539
  {
498
- "name": "value",
499
- "description": "The current value.",
1540
+ "name": "type",
1541
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
500
1542
  "value": {
501
1543
  "kind": "plain",
502
1544
  "type": "string"
503
1545
  }
504
1546
  },
505
1547
  {
506
- "name": "readonly",
507
- "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
1548
+ "name": "v-type",
1549
+ "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.",
508
1550
  "value": {
509
1551
  "kind": "plain",
510
- "type": "boolean"
1552
+ "type": "string"
511
1553
  }
512
1554
  },
513
1555
  {
514
- "name": "required",
515
- "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
1556
+ "name": "keep",
1557
+ "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.",
516
1558
  "value": {
517
1559
  "kind": "plain",
518
- "type": "boolean"
1560
+ "type": "string"
519
1561
  }
520
1562
  },
521
1563
  {
522
- "name": "placeholder",
523
- "description": "Placeholder shown while the field is empty.",
1564
+ "name": "reject",
1565
+ "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.",
524
1566
  "value": {
525
1567
  "kind": "plain",
526
1568
  "type": "string"
527
1569
  }
528
1570
  },
529
1571
  {
530
- "name": "min",
531
- "description": "Earliest selectable instant, as an ISO instant.",
1572
+ "name": "uppercase",
1573
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
532
1574
  "value": {
533
1575
  "kind": "plain",
534
- "type": "string"
1576
+ "type": "boolean"
535
1577
  }
536
1578
  },
537
1579
  {
538
- "name": "max",
539
- "description": "Latest selectable instant, as an ISO instant.",
1580
+ "name": "trim",
1581
+ "description": "Trims the value on the way out, leaving what was typed alone.",
540
1582
  "value": {
541
1583
  "kind": "plain",
542
- "type": "string"
1584
+ "type": "boolean"
543
1585
  }
544
1586
  },
545
1587
  {
546
- "name": "step",
547
- "description": "Step between selectable instants, in seconds.",
1588
+ "name": "autocomplete",
1589
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
548
1590
  "value": {
549
1591
  "kind": "plain",
550
1592
  "type": "string"
551
1593
  }
552
- }
553
- ],
554
- "slots": [
555
- {
556
- "name": "default",
557
- "description": "The label of the field."
558
- },
559
- {
560
- "name": "info",
561
- "description": "Extra content rendered next to the label, for a hint or a help icon."
562
1594
  },
563
1595
  {
564
- "name": "ibefore",
565
- "description": "An addon rendered inside the input group, before the control."
1596
+ "name": "disabled",
1597
+ "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.",
1598
+ "value": {
1599
+ "kind": "plain",
1600
+ "type": "boolean"
1601
+ }
566
1602
  },
567
1603
  {
568
- "name": "before",
569
- "description": "Content rendered before the control, outside the addon styling."
1604
+ "name": "readonly",
1605
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
1606
+ "value": {
1607
+ "kind": "plain",
1608
+ "type": "boolean"
1609
+ }
570
1610
  },
571
1611
  {
572
- "name": "after",
573
- "description": "Content rendered after the control, outside the addon styling."
1612
+ "name": "required",
1613
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
1614
+ "value": {
1615
+ "kind": "plain",
1616
+ "type": "boolean"
1617
+ }
574
1618
  },
575
- {
576
- "name": "iafter",
577
- "description": "An addon rendered inside the input group, after the control."
578
- }
579
- ],
580
- "events": [
581
- {
582
- "name": "change",
583
- "description": "Fired with the current instant."
584
- }
585
- ]
586
- },
587
- {
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.",
590
- "attributes": [
591
1619
  {
592
1620
  "name": "value",
593
- "description": "The value of the selected radio.",
1621
+ "description": "JSON tuple of the operator and its bounds, for example [\"BETWEEN\", from, to].",
594
1622
  "value": {
595
1623
  "kind": "plain",
596
1624
  "type": "string"
597
1625
  }
598
1626
  },
599
1627
  {
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.",
1628
+ "name": "placeholder",
1629
+ "description": "Placeholder shown while the field is empty.",
602
1630
  "value": {
603
1631
  "kind": "plain",
604
- "type": "boolean"
1632
+ "type": "string"
605
1633
  }
606
1634
  },
607
1635
  {
608
- "name": "required",
609
- "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
1636
+ "name": "operators",
1637
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ, LT, GT, LTE, GTE, BETWEEN. Defaults to all of them.",
610
1638
  "value": {
611
1639
  "kind": "plain",
612
- "type": "boolean"
1640
+ "type": "string"
613
1641
  }
614
1642
  }
615
1643
  ],
616
1644
  "slots": [
617
1645
  {
618
1646
  "name": "default",
619
- "description": "The legend of the group, and its ful-radio children."
1647
+ "description": "The label of the field."
620
1648
  },
621
1649
  {
622
- "name": "header",
623
- "description": "Content rendered above the radios."
1650
+ "name": "info",
1651
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
624
1652
  },
625
1653
  {
626
- "name": "footer",
627
- "description": "Content rendered below the radios."
1654
+ "name": "before",
1655
+ "description": "An addon rendered inside the input group, before the control."
1656
+ },
1657
+ {
1658
+ "name": "after",
1659
+ "description": "An addon rendered inside the input group, after the control."
628
1660
  }
629
1661
  ],
630
1662
  "events": [
631
1663
  {
632
1664
  "name": "change",
633
- "description": "Fired with the value of the selected radio."
1665
+ "description": "Fired with the whole tuple, or undefined when the filter is incomplete."
634
1666
  }
635
1667
  ]
636
1668
  },
637
1669
  {
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
- },
650
- {
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.",
1670
+ "name": "ful-filter-number",
1671
+ "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.",
660
1672
  "attributes": [
661
1673
  {
662
- "name": "total",
663
- "description": "Number of pages.",
1674
+ "name": "type",
1675
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
664
1676
  "value": {
665
1677
  "kind": "plain",
666
- "type": "number"
1678
+ "type": "string"
667
1679
  }
668
1680
  },
669
1681
  {
670
- "name": "current",
671
- "description": "Zero based index of the page being shown.",
1682
+ "name": "v-type",
1683
+ "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.",
672
1684
  "value": {
673
1685
  "kind": "plain",
674
- "type": "number"
1686
+ "type": "string"
675
1687
  }
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": [
1688
+ },
690
1689
  {
691
- "name": "order",
692
- "description": "The sort currently applied, asc or desc, or absent when unsorted.",
1690
+ "name": "keep",
1691
+ "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.",
1692
+ "value": {
1693
+ "kind": "plain",
1694
+ "type": "string"
1695
+ }
1696
+ },
1697
+ {
1698
+ "name": "reject",
1699
+ "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.",
693
1700
  "value": {
694
1701
  "kind": "plain",
695
1702
  "type": "string"
696
1703
  }
697
- }
698
- ],
699
- "slots": [],
700
- "events": [
1704
+ },
701
1705
  {
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": [
1706
+ "name": "uppercase",
1707
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
1708
+ "value": {
1709
+ "kind": "plain",
1710
+ "type": "boolean"
1711
+ }
1712
+ },
711
1713
  {
712
- "name": "value",
713
- "description": "JSON tuple of the operator and its bounds, for example [\"BETWEEN\", from, to].",
1714
+ "name": "trim",
1715
+ "description": "Trims the value on the way out, leaving what was typed alone.",
1716
+ "value": {
1717
+ "kind": "plain",
1718
+ "type": "boolean"
1719
+ }
1720
+ },
1721
+ {
1722
+ "name": "autocomplete",
1723
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
714
1724
  "value": {
715
1725
  "kind": "plain",
716
1726
  "type": "string"
717
1727
  }
718
1728
  },
1729
+ {
1730
+ "name": "disabled",
1731
+ "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.",
1732
+ "value": {
1733
+ "kind": "plain",
1734
+ "type": "boolean"
1735
+ }
1736
+ },
719
1737
  {
720
1738
  "name": "readonly",
721
1739
  "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
@@ -732,6 +1750,14 @@
732
1750
  "type": "boolean"
733
1751
  }
734
1752
  },
1753
+ {
1754
+ "name": "value",
1755
+ "description": "JSON tuple of the operator and its bound(s).",
1756
+ "value": {
1757
+ "kind": "plain",
1758
+ "type": "string"
1759
+ }
1760
+ },
735
1761
  {
736
1762
  "name": "placeholder",
737
1763
  "description": "Placeholder shown while the field is empty.",
@@ -739,6 +1765,14 @@
739
1765
  "kind": "plain",
740
1766
  "type": "string"
741
1767
  }
1768
+ },
1769
+ {
1770
+ "name": "operators",
1771
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ, LT, GT, LTE, GTE, BETWEEN. Defaults to all of them.",
1772
+ "value": {
1773
+ "kind": "plain",
1774
+ "type": "string"
1775
+ }
742
1776
  }
743
1777
  ],
744
1778
  "slots": [
@@ -750,20 +1784,12 @@
750
1784
  "name": "info",
751
1785
  "description": "Extra content rendered next to the label, for a hint or a help icon."
752
1786
  },
753
- {
754
- "name": "ibefore",
755
- "description": "An addon rendered inside the input group, before the control."
756
- },
757
1787
  {
758
1788
  "name": "before",
759
- "description": "Content rendered before the control, outside the addon styling."
1789
+ "description": "An addon rendered inside the input group, before the control."
760
1790
  },
761
1791
  {
762
1792
  "name": "after",
763
- "description": "Content rendered after the control, outside the addon styling."
764
- },
765
- {
766
- "name": "iafter",
767
1793
  "description": "An addon rendered inside the input group, after the control."
768
1794
  }
769
1795
  ],
@@ -775,15 +1801,15 @@
775
1801
  ]
776
1802
  },
777
1803
  {
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.",
1804
+ "name": "ful-filter-boolean",
1805
+ "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
1806
  "attributes": [
781
1807
  {
782
- "name": "value",
783
- "description": "JSON tuple of the operator and its bounds, for example [\"BETWEEN\", from, to].",
1808
+ "name": "disabled",
1809
+ "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
1810
  "value": {
785
1811
  "kind": "plain",
786
- "type": "string"
1812
+ "type": "boolean"
787
1813
  }
788
1814
  },
789
1815
  {
@@ -803,8 +1829,16 @@
803
1829
  }
804
1830
  },
805
1831
  {
806
- "name": "placeholder",
807
- "description": "Placeholder shown while the field is empty.",
1832
+ "name": "value",
1833
+ "description": "JSON tuple of the operator and the token.",
1834
+ "value": {
1835
+ "kind": "plain",
1836
+ "type": "string"
1837
+ }
1838
+ },
1839
+ {
1840
+ "name": "operators",
1841
+ "description": "Comma separated list of the operators the menu offers, out of EQ, NEQ. Defaults to both.",
808
1842
  "value": {
809
1843
  "kind": "plain",
810
1844
  "type": "string"
@@ -820,42 +1854,90 @@
820
1854
  "name": "info",
821
1855
  "description": "Extra content rendered next to the label, for a hint or a help icon."
822
1856
  },
823
- {
824
- "name": "ibefore",
825
- "description": "An addon rendered inside the input group, before the control."
826
- },
827
1857
  {
828
1858
  "name": "before",
829
- "description": "Content rendered before the control, outside the addon styling."
1859
+ "description": "An addon rendered inside the input group, before the control."
830
1860
  },
831
1861
  {
832
1862
  "name": "after",
833
- "description": "Content rendered after the control, outside the addon styling."
834
- },
835
- {
836
- "name": "iafter",
837
1863
  "description": "An addon rendered inside the input group, after the control."
838
1864
  }
839
1865
  ],
840
1866
  "events": [
841
1867
  {
842
1868
  "name": "change",
843
- "description": "Fired with the whole tuple, or undefined when the filter is incomplete."
1869
+ "description": "Fired with the whole tuple, or undefined when nothing is picked."
844
1870
  }
845
1871
  ]
846
1872
  },
847
1873
  {
848
1874
  "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.",
1875
+ "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
1876
  "attributes": [
851
1877
  {
852
- "name": "value",
853
- "description": "JSON tuple of the operator, the sensitivity and the text.",
1878
+ "name": "type",
1879
+ "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
1880
+ "value": {
1881
+ "kind": "plain",
1882
+ "type": "string"
1883
+ }
1884
+ },
1885
+ {
1886
+ "name": "v-type",
1887
+ "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.",
1888
+ "value": {
1889
+ "kind": "plain",
1890
+ "type": "string"
1891
+ }
1892
+ },
1893
+ {
1894
+ "name": "keep",
1895
+ "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.",
1896
+ "value": {
1897
+ "kind": "plain",
1898
+ "type": "string"
1899
+ }
1900
+ },
1901
+ {
1902
+ "name": "reject",
1903
+ "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.",
1904
+ "value": {
1905
+ "kind": "plain",
1906
+ "type": "string"
1907
+ }
1908
+ },
1909
+ {
1910
+ "name": "uppercase",
1911
+ "description": "Upper-cases the value on the way out, leaving what was typed alone.",
1912
+ "value": {
1913
+ "kind": "plain",
1914
+ "type": "boolean"
1915
+ }
1916
+ },
1917
+ {
1918
+ "name": "trim",
1919
+ "description": "Trims the value on the way out, leaving what was typed alone.",
1920
+ "value": {
1921
+ "kind": "plain",
1922
+ "type": "boolean"
1923
+ }
1924
+ },
1925
+ {
1926
+ "name": "autocomplete",
1927
+ "description": "The autofill token the browser classifies the control by, one of the names the html autocomplete grammar defines (name, given-name, street-address, postal-code, one-time-code, off, ...). It is set on the control itself because the control carries form=\"\", which leaves it without a form owner to inherit a form-wide setting from. Read once at the upgrade. A value outside the grammar reads as on, so an identifier of your own does not switch autofill off.",
854
1928
  "value": {
855
1929
  "kind": "plain",
856
1930
  "type": "string"
857
1931
  }
858
1932
  },
1933
+ {
1934
+ "name": "disabled",
1935
+ "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.",
1936
+ "value": {
1937
+ "kind": "plain",
1938
+ "type": "boolean"
1939
+ }
1940
+ },
859
1941
  {
860
1942
  "name": "readonly",
861
1943
  "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
@@ -872,6 +1954,14 @@
872
1954
  "type": "boolean"
873
1955
  }
874
1956
  },
1957
+ {
1958
+ "name": "value",
1959
+ "description": "JSON tuple of the operator, the sensitivity and the text.",
1960
+ "value": {
1961
+ "kind": "plain",
1962
+ "type": "string"
1963
+ }
1964
+ },
875
1965
  {
876
1966
  "name": "placeholder",
877
1967
  "description": "Placeholder shown while the field is empty.",
@@ -879,6 +1969,22 @@
879
1969
  "kind": "plain",
880
1970
  "type": "string"
881
1971
  }
1972
+ },
1973
+ {
1974
+ "name": "operators",
1975
+ "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.",
1976
+ "value": {
1977
+ "kind": "plain",
1978
+ "type": "string"
1979
+ }
1980
+ },
1981
+ {
1982
+ "name": "sensitivities",
1983
+ "description": "Comma separated list of the case sensitivity modes, IGNORE_CASE, CASE_SENSITIVE. A single entry pins every emitted tuple to it.",
1984
+ "value": {
1985
+ "kind": "plain",
1986
+ "type": "string"
1987
+ }
882
1988
  }
883
1989
  ],
884
1990
  "slots": [
@@ -890,20 +1996,12 @@
890
1996
  "name": "info",
891
1997
  "description": "Extra content rendered next to the label, for a hint or a help icon."
892
1998
  },
893
- {
894
- "name": "ibefore",
895
- "description": "An addon rendered inside the input group, before the control."
896
- },
897
1999
  {
898
2000
  "name": "before",
899
- "description": "Content rendered before the control, outside the addon styling."
2001
+ "description": "An addon rendered inside the input group, before the control."
900
2002
  },
901
2003
  {
902
2004
  "name": "after",
903
- "description": "Content rendered after the control, outside the addon styling."
904
- },
905
- {
906
- "name": "iafter",
907
2005
  "description": "An addon rendered inside the input group, after the control."
908
2006
  }
909
2007
  ],
@@ -916,16 +2014,120 @@
916
2014
  },
917
2015
  {
918
2016
  "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.",
2017
+ "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
2018
  "attributes": [
921
2019
  {
922
- "name": "value",
923
- "description": "The selected key, or a comma separated list of keys when multiple.",
2020
+ "name": "name",
2021
+ "description": "The field name the surrounding form submits the selection under.",
2022
+ "value": {
2023
+ "kind": "plain",
2024
+ "type": "string"
2025
+ }
2026
+ },
2027
+ {
2028
+ "name": "loader",
2029
+ "description": "The registered component name the select loads its vocabulary through; loaders:select when absent.",
2030
+ "value": {
2031
+ "kind": "plain",
2032
+ "type": "string"
2033
+ }
2034
+ },
2035
+ {
2036
+ "name": "k-type",
2037
+ "description": "How a key coerces when it arrives from the response or from the value attribute: number, string or bool.",
2038
+ "value": {
2039
+ "kind": "plain",
2040
+ "type": "string"
2041
+ }
2042
+ },
2043
+ {
2044
+ "name": "src",
2045
+ "description": "The url the vocabulary is fetched from. Without it the slotted <option> elements are the whole vocabulary, held in memory.",
2046
+ "value": {
2047
+ "kind": "plain",
2048
+ "type": "string"
2049
+ }
2050
+ },
2051
+ {
2052
+ "name": "method",
2053
+ "description": "The method the vocabulary is fetched with; POST when absent.",
2054
+ "value": {
2055
+ "kind": "plain",
2056
+ "type": "string"
2057
+ }
2058
+ },
2059
+ {
2060
+ "name": "mode",
2061
+ "description": "chunked asks the endpoint per query instead of fetching the vocabulary once, for a list too large to hold.",
2062
+ "value": {
2063
+ "kind": "plain",
2064
+ "type": "string"
2065
+ }
2066
+ },
2067
+ {
2068
+ "name": "preload",
2069
+ "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.",
2070
+ "value": {
2071
+ "kind": "plain",
2072
+ "type": "boolean"
2073
+ }
2074
+ },
2075
+ {
2076
+ "name": "revision",
2077
+ "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.",
2078
+ "value": {
2079
+ "kind": "plain",
2080
+ "type": "string"
2081
+ }
2082
+ },
2083
+ {
2084
+ "name": "k-expr",
2085
+ "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
2086
  "value": {
925
2087
  "kind": "plain",
926
2088
  "type": "string"
927
2089
  }
928
2090
  },
2091
+ {
2092
+ "name": "l-expr",
2093
+ "description": "The expression yielding an option's label, evaluated against each row of the response.",
2094
+ "value": {
2095
+ "kind": "plain",
2096
+ "type": "string"
2097
+ }
2098
+ },
2099
+ {
2100
+ "name": "d-expr",
2101
+ "description": "The expression yielding the rows from the response body; the body itself when absent.",
2102
+ "value": {
2103
+ "kind": "plain",
2104
+ "type": "string"
2105
+ }
2106
+ },
2107
+ {
2108
+ "name": "m-expr",
2109
+ "description": "The expression yielding an option's metadata, evaluated against each row; the whole row when absent.",
2110
+ "value": {
2111
+ "kind": "plain",
2112
+ "type": "string"
2113
+ }
2114
+ },
2115
+ {
2116
+ "name": "response-mapper",
2117
+ "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.",
2118
+ "value": {
2119
+ "kind": "plain",
2120
+ "type": "string"
2121
+ }
2122
+ },
2123
+ {
2124
+ "name": "disabled",
2125
+ "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.",
2126
+ "value": {
2127
+ "kind": "plain",
2128
+ "type": "boolean"
2129
+ }
2130
+ },
929
2131
  {
930
2132
  "name": "readonly",
931
2133
  "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
@@ -943,8 +2145,24 @@
943
2145
  }
944
2146
  },
945
2147
  {
946
- "name": "itemlist",
947
- "description": "Shows the selection as a list under the control as well as badges.",
2148
+ "name": "value",
2149
+ "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.",
2150
+ "value": {
2151
+ "kind": "plain",
2152
+ "type": "string"
2153
+ }
2154
+ },
2155
+ {
2156
+ "name": "multiple",
2157
+ "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.",
2158
+ "value": {
2159
+ "kind": "plain",
2160
+ "type": "boolean"
2161
+ }
2162
+ },
2163
+ {
2164
+ "name": "item-list",
2165
+ "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
2166
  "value": {
949
2167
  "kind": "plain",
950
2168
  "type": "boolean"
@@ -961,24 +2179,16 @@
961
2179
  "description": "Extra content rendered next to the label, for a hint or a help icon."
962
2180
  },
963
2181
  {
964
- "name": "ibefore",
2182
+ "name": "before",
965
2183
  "description": "An addon rendered inside the input group, before the control."
966
2184
  },
967
2185
  {
968
- "name": "before",
969
- "description": "Content rendered before the control, outside the addon styling."
2186
+ "name": "after",
2187
+ "description": "An addon rendered inside the input group, after the control."
970
2188
  },
971
2189
  {
972
2190
  "name": "dropdown",
973
2191
  "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
2192
  }
983
2193
  ],
984
2194
  "events": [
@@ -990,10 +2200,23 @@
990
2200
  },
991
2201
  {
992
2202
  "name": "ful-dropdown",
993
- "description": "The options popup of a ful-select. Rarely used on its own.",
994
- "attributes": [],
2203
+ "description": "The options popup of a ful-select, with a localized no-results message when the search matches nothing. Rarely used on its own.",
2204
+ "attributes": [
2205
+ {
2206
+ "name": "listbox",
2207
+ "description": "The id to give the listbox, so a host can point aria-controls and aria-activedescendant at it before this element upgrades.",
2208
+ "value": {
2209
+ "kind": "plain",
2210
+ "type": "string"
2211
+ }
2212
+ }
2213
+ ],
995
2214
  "slots": [],
996
2215
  "events": [
2216
+ {
2217
+ "name": "activechange",
2218
+ "description": "Fired with the id of the option the reader is on, for the combobox that controls the listbox."
2219
+ },
997
2220
  {
998
2221
  "name": "change",
999
2222
  "description": "Fired with the option that was picked."