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