@optionfactory/fml 9.0.0-rc2 → 9.0.0-rc21

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 (44) hide show
  1. package/README.md +16 -89
  2. package/dist/client-errors.iife.js +23 -37
  3. package/dist/client-errors.iife.js.map +1 -1
  4. package/dist/client-errors.iife.min.js +1 -1
  5. package/dist/client-errors.iife.min.js.map +1 -1
  6. package/dist/custom-elements.json +459 -36
  7. package/dist/fml.css +24 -19
  8. package/dist/fml.css.map +1 -1
  9. package/dist/fml.iife.js +4656 -1778
  10. package/dist/fml.iife.js.map +1 -1
  11. package/dist/fml.iife.min.js +1 -1
  12. package/dist/fml.iife.min.js.map +1 -1
  13. package/dist/ftl.d.mts +395 -224
  14. package/dist/ftl.iife.js +402 -332
  15. package/dist/ftl.iife.js.map +1 -1
  16. package/dist/ftl.iife.min.js +1 -1
  17. package/dist/ftl.iife.min.js.map +1 -1
  18. package/dist/ftl.min.mjs +1 -1
  19. package/dist/ftl.min.mjs.map +1 -1
  20. package/dist/ftl.mjs +402 -332
  21. package/dist/ftl.mjs.map +1 -1
  22. package/dist/ful.css +24 -19
  23. package/dist/ful.css.map +1 -1
  24. package/dist/ful.d.mts +2801 -519
  25. package/dist/ful.iife.js +4105 -1273
  26. package/dist/ful.iife.js.map +1 -1
  27. package/dist/ful.iife.min.js +1 -1
  28. package/dist/ful.iife.min.js.map +1 -1
  29. package/dist/ful.min.mjs +1 -1
  30. package/dist/ful.min.mjs.map +1 -1
  31. package/dist/ful.mjs +4102 -1275
  32. package/dist/ful.mjs.map +1 -1
  33. package/dist/httpc.d.mts +139 -121
  34. package/dist/httpc.iife.js +137 -166
  35. package/dist/httpc.iife.js.map +1 -1
  36. package/dist/httpc.iife.min.js +1 -1
  37. package/dist/httpc.iife.min.js.map +1 -1
  38. package/dist/httpc.min.mjs +1 -1
  39. package/dist/httpc.min.mjs.map +1 -1
  40. package/dist/httpc.mjs +137 -166
  41. package/dist/httpc.mjs.map +1 -1
  42. package/dist/vscode.html-custom-data.json +215 -27
  43. package/dist/web-types.json +463 -36
  44. package/package.json +1 -1
@@ -11,14 +11,28 @@
11
11
  "name": "Tooltip",
12
12
  "tagName": "ful-tooltip",
13
13
  "customElement": true,
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: bottom (default), top, left or right.",
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
15
  "attributes": [
16
16
  {
17
17
  "name": "placement",
18
- "description": "Which side of the trigger the note opens on: bottom (the default), top, start or end. The library places the note itself on every platform, so the side is the same everywhere.",
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
19
  "type": {
20
20
  "text": "string"
21
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
+ }
22
36
  }
23
37
  ],
24
38
  "slots": [
@@ -34,7 +48,7 @@
34
48
  "name": "Dialog",
35
49
  "tagName": "ful-dialog",
36
50
  "customElement": true,
37
- "description": "A modal dialog on the native platform: header, body and buttons, the header attribute naming its heading, opened by any element carrying dialog-target set to its id, or programmatically through open()/ask(), which resolve with the data-result of the button that closed the dialog (null on Escape). Longer explanations belong here, shorter ones in ful-tooltip.",
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. Dialog.ask(header, body, buttons) and Dialog.confirm(header, body, labels) ask a question in a transient one, building, showing, answering and removing the element themselves; a confirm's cancel, close and Escape all answer the negative.",
38
52
  "attributes": [
39
53
  {
40
54
  "name": "header",
@@ -42,22 +56,40 @@
42
56
  "type": {
43
57
  "text": "string"
44
58
  }
59
+ },
60
+ {
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.",
63
+ "type": {
64
+ "text": "boolean"
65
+ }
66
+ },
67
+ {
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
+ }
45
73
  }
46
74
  ],
47
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
+ },
48
80
  {
49
81
  "name": "",
50
82
  "description": "The dialog body."
51
83
  },
52
84
  {
53
85
  "name": "buttons",
54
- "description": "Buttons closing the dialog; each carries a data-result that ask() resolves with. Without this slot a localized acknowledge button is shown."
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."
55
87
  }
56
88
  ],
57
89
  "events": [
58
90
  {
59
91
  "name": "close",
60
- "description": "Fired when the dialog closes, carrying the data-result of the button that closed it, or null on Escape; ask() and open() resolve with the same answer, and a dialog leaving the document while open answers its waiters with null.",
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.",
61
93
  "type": {
62
94
  "text": "CustomEvent"
63
95
  }
@@ -68,6 +100,13 @@
68
100
  "type": {
69
101
  "text": "CustomEvent"
70
102
  }
103
+ },
104
+ {
105
+ "name": "dialog:dismiss",
106
+ "description": "Fired before the close button, Escape or a backdrop click closes the dialog, with detail.reason (button, escape or backdrop): cancelable, so preventDefault() keeps it open, to guard unsaved edits. Not fired for a data-result button, close-on-submit or close(). A second Escape with no interaction in between closes the dialog whatever the page does, and its dialog:dismiss is then not cancelable.",
107
+ "type": {
108
+ "text": "CustomEvent"
109
+ }
71
110
  }
72
111
  ]
73
112
  },
@@ -76,10 +115,10 @@
76
115
  "name": "Drawer",
77
116
  "tagName": "ful-drawer",
78
117
  "customElement": true,
79
- "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.",
118
+ "description": "A side panel drawer on the native dialog platform: a header with its title (the header 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(header, 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.",
80
119
  "attributes": [
81
120
  {
82
- "name": "title",
121
+ "name": "header",
83
122
  "description": "The drawer's title, shown in its header. Text only, and also what update() re-titles the panel with.",
84
123
  "type": {
85
124
  "text": "string"
@@ -91,9 +130,20 @@
91
130
  "type": {
92
131
  "text": "string"
93
132
  }
133
+ },
134
+ {
135
+ "name": "close-on-submit",
136
+ "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.",
137
+ "type": {
138
+ "text": "boolean"
139
+ }
94
140
  }
95
141
  ],
96
142
  "slots": [
143
+ {
144
+ "name": "header",
145
+ "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."
146
+ },
97
147
  {
98
148
  "name": "",
99
149
  "description": "The drawer body, shown when update() never replaced it."
@@ -102,7 +152,7 @@
102
152
  "events": [
103
153
  {
104
154
  "name": "close",
105
- "description": "Fired when the drawer closes, by its close button or Escape.",
155
+ "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.",
106
156
  "type": {
107
157
  "text": "CustomEvent"
108
158
  }
@@ -113,15 +163,40 @@
113
163
  "type": {
114
164
  "text": "CustomEvent"
115
165
  }
166
+ },
167
+ {
168
+ "name": "drawer:dismiss",
169
+ "description": "Fired before the close button, Escape or a backdrop click closes the drawer, with detail.reason (button, escape or backdrop): cancelable, so preventDefault() keeps it open, to guard unsaved edits. Not fired for close() or close-on-submit. A second Escape with no interaction in between closes the drawer at once, and its drawer:dismiss is then not cancelable.",
170
+ "type": {
171
+ "text": "CustomEvent"
172
+ }
116
173
  }
117
174
  ]
118
175
  },
176
+ {
177
+ "kind": "class",
178
+ "name": "Menu",
179
+ "tagName": "ful-menu",
180
+ "customElement": true,
181
+ "description": "A menu of commands on the native popover platform: the invoker named by for toggles it, light dismiss and Escape come from the browser, and the element adds the menu semantics and the keyboard protocol (roving focus with the arrows, Home and End, type-ahead, Enter and Space to activate, Escape and every close handing the focus back to the invoker). The items are the buttons and links written inside it, kept as they are and given their menuitem role; activation is the item's own click, which the menu only follows by closing.",
182
+ "attributes": [
183
+ {
184
+ "name": "for",
185
+ "description": "The id of the invoker the menu belongs to: it toggles the menu, carries aria-haspopup and aria-expanded, and takes the focus back when the menu closes. Read once at the upgrade, so the invoker must already be in the page by then.",
186
+ "type": {
187
+ "text": "string"
188
+ }
189
+ }
190
+ ],
191
+ "slots": [],
192
+ "events": []
193
+ },
119
194
  {
120
195
  "kind": "class",
121
196
  "name": "Toasts",
122
197
  "tagName": "ful-toasts",
123
198
  "customElement": true,
124
- "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.",
199
+ "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. The timer holds while the toast is hovered or holds the focus, and action: { label, onClick } renders a button beside the message whose click answers and retires the toast, the same option travelling in the event detail.",
125
200
  "attributes": [
126
201
  {
127
202
  "name": "timeout",
@@ -143,7 +218,7 @@
143
218
  "attributes": [
144
219
  {
145
220
  "name": "active",
146
- "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.",
221
+ "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 tabs:change event.",
147
222
  "type": {
148
223
  "text": "number"
149
224
  }
@@ -161,8 +236,8 @@
161
236
  ],
162
237
  "events": [
163
238
  {
164
- "name": "change",
165
- "description": "Fired with the active index and the previous one whenever the visible panel moves.",
239
+ "name": "tabs:change",
240
+ "description": "Fired with the active index and the previous one whenever the visible panel moves. A name of its own rather than the fields' change: the panels are the host's children, so every native change of a field inside them bubbles through the host under that name.",
166
241
  "type": {
167
242
  "text": "CustomEvent"
168
243
  }
@@ -204,7 +279,7 @@
204
279
  "name": "Wizard",
205
280
  "tagName": "ful-wizard",
206
281
  "customElement": true,
207
- "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.",
282
+ "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 wizard:change event.",
208
283
  "attributes": [
209
284
  {
210
285
  "name": "progress",
@@ -226,8 +301,8 @@
226
301
  ],
227
302
  "events": [
228
303
  {
229
- "name": "change",
230
- "description": "Fired with the index and the data-step name after next(), prev() or move() land on a different step.",
304
+ "name": "wizard:change",
305
+ "description": "Fired with the index and the data-step name after next(), prev() or move() land on a different step. Named apart from change so the bubbling change of a field inside a step never reaches its listeners.",
231
306
  "type": {
232
307
  "text": "CustomEvent"
233
308
  }
@@ -303,6 +378,20 @@
303
378
  "type": {
304
379
  "text": "string"
305
380
  }
381
+ },
382
+ {
383
+ "name": "track-changes",
384
+ "description": "Keeps track of the edits not saved yet: dirty answers whether a field the user edited since the last commit holds another value, the host matches :state(dirty) and the submit buttons carry a dot while it does. A successful submit commits, and so does the form once its fields have rendered; commit() is for a save of the page's own.",
385
+ "type": {
386
+ "text": "boolean"
387
+ }
388
+ },
389
+ {
390
+ "name": "guard-leave",
391
+ "description": "Asks before the page is left while the form holds edits not saved yet, through the browser's own prompt. Implies track-changes.",
392
+ "type": {
393
+ "text": "boolean"
394
+ }
306
395
  }
307
396
  ],
308
397
  "slots": [],
@@ -334,6 +423,13 @@
334
423
  "type": {
335
424
  "text": "CustomEvent"
336
425
  }
426
+ },
427
+ {
428
+ "name": "dirty:change",
429
+ "description": "Fired under track-changes when the form starts or stops holding edits not saved yet, with dirty in the detail.",
430
+ "type": {
431
+ "text": "CustomEvent"
432
+ }
337
433
  }
338
434
  ]
339
435
  },
@@ -405,11 +501,11 @@
405
501
  "name": "Input",
406
502
  "tagName": "ful-input",
407
503
  "customElement": true,
408
- "description": "A labelled text input. Use type to pick any native input type, or textarea; keep names the characters that survive a keystroke and reject the ones that do not, the caret staying among the survivors, and the uppercase and trim claims shape the value before it is read; v-type=number decodes the value to a number, blank staying null and a value that does not decode kept as it is, an undeclared type defaulting to number. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
504
+ "description": "A labelled text input. Use type to pick any native input type, the keypad types numeric and decimal, or textarea; keep names the characters that survive a keystroke and reject the ones that do not, the caret staying among the survivors, and the uppercase and trim claims shape the value before it is read; v-type=number decodes the value to a number, blank staying null and a value that does not decode kept as it is, an undeclared type defaulting to number. Disabled follows native semantics: the attribute is the field's own claim, honored together with a disabled fieldset ancestry through :disabled, while the property reflects the claim only.",
409
505
  "attributes": [
410
506
  {
411
507
  "name": "type",
412
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
508
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
413
509
  "type": {
414
510
  "text": "string"
415
511
  }
@@ -449,6 +545,13 @@
449
545
  "text": "boolean"
450
546
  }
451
547
  },
548
+ {
549
+ "name": "unsigned",
550
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
551
+ "type": {
552
+ "text": "boolean"
553
+ }
554
+ },
452
555
  {
453
556
  "name": "autocomplete",
454
557
  "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.",
@@ -529,7 +632,7 @@
529
632
  "attributes": [
530
633
  {
531
634
  "name": "type",
532
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
635
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
533
636
  "type": {
534
637
  "text": "string"
535
638
  }
@@ -569,6 +672,13 @@
569
672
  "text": "boolean"
570
673
  }
571
674
  },
675
+ {
676
+ "name": "unsigned",
677
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
678
+ "type": {
679
+ "text": "boolean"
680
+ }
681
+ },
572
682
  {
573
683
  "name": "autocomplete",
574
684
  "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.",
@@ -752,7 +862,7 @@
752
862
  "attributes": [
753
863
  {
754
864
  "name": "type",
755
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
865
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
756
866
  "type": {
757
867
  "text": "string"
758
868
  }
@@ -792,6 +902,13 @@
792
902
  "text": "boolean"
793
903
  }
794
904
  },
905
+ {
906
+ "name": "unsigned",
907
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
908
+ "type": {
909
+ "text": "boolean"
910
+ }
911
+ },
795
912
  {
796
913
  "name": "autocomplete",
797
914
  "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.",
@@ -893,7 +1010,7 @@
893
1010
  "attributes": [
894
1011
  {
895
1012
  "name": "type",
896
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
1013
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
897
1014
  "type": {
898
1015
  "text": "string"
899
1016
  }
@@ -933,6 +1050,13 @@
933
1050
  "text": "boolean"
934
1051
  }
935
1052
  },
1053
+ {
1054
+ "name": "unsigned",
1055
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
1056
+ "type": {
1057
+ "text": "boolean"
1058
+ }
1059
+ },
936
1060
  {
937
1061
  "name": "autocomplete",
938
1062
  "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.",
@@ -1034,7 +1158,7 @@
1034
1158
  "attributes": [
1035
1159
  {
1036
1160
  "name": "type",
1037
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
1161
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
1038
1162
  "type": {
1039
1163
  "text": "string"
1040
1164
  }
@@ -1074,6 +1198,13 @@
1074
1198
  "text": "boolean"
1075
1199
  }
1076
1200
  },
1201
+ {
1202
+ "name": "unsigned",
1203
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
1204
+ "type": {
1205
+ "text": "boolean"
1206
+ }
1207
+ },
1077
1208
  {
1078
1209
  "name": "autocomplete",
1079
1210
  "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.",
@@ -1267,6 +1398,20 @@
1267
1398
  "type": {
1268
1399
  "text": "number"
1269
1400
  }
1401
+ },
1402
+ {
1403
+ "name": "src",
1404
+ "description": "The url the default loader asks for rows; without it the table loads from an in-memory loader fed through withLoader. Stays live: writing it builds the loader again and reloads from the first page, keeping the sort and the filters.",
1405
+ "type": {
1406
+ "text": "string"
1407
+ }
1408
+ },
1409
+ {
1410
+ "name": "method",
1411
+ "description": "The http method the default loader sends, GET by default. Stays live, as src does.",
1412
+ "type": {
1413
+ "text": "string"
1414
+ }
1270
1415
  }
1271
1416
  ],
1272
1417
  "slots": [
@@ -1278,12 +1423,31 @@
1278
1423
  "name": "caption",
1279
1424
  "description": "The caption of the table."
1280
1425
  },
1426
+ {
1427
+ "name": "empty",
1428
+ "description": "Shown in place of the rows when a load returns none, replacing the localized default message. Rendered per load in the rows' own scope, so its expressions read schema, pageRequest, filterRequest and pageResponse: an empty state can tell nothing-there from a filter that matched nothing."
1429
+ },
1281
1430
  {
1282
1431
  "name": "footer",
1283
1432
  "description": "Content rendered in the table footer."
1284
1433
  }
1285
1434
  ],
1286
- "events": []
1435
+ "events": [
1436
+ {
1437
+ "name": "load:success",
1438
+ "description": "Fired once a load has settled, after the rows are in place and the busy state is gone, carrying the page response and the three requests that asked for it. Not fired for a load a newer one superseded, which owns nothing.",
1439
+ "type": {
1440
+ "text": "CustomEvent"
1441
+ }
1442
+ },
1443
+ {
1444
+ "name": "load:failure",
1445
+ "description": "Fired when a load rejects, after the error row is shown, carrying the exception and the three requests. Telling this from an empty result is what the aria-busy attribute alone cannot do.",
1446
+ "type": {
1447
+ "text": "CustomEvent"
1448
+ }
1449
+ }
1450
+ ]
1287
1451
  },
1288
1452
  {
1289
1453
  "kind": "class",
@@ -1367,7 +1531,7 @@
1367
1531
  "attributes": [
1368
1532
  {
1369
1533
  "name": "type",
1370
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
1534
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
1371
1535
  "type": {
1372
1536
  "text": "string"
1373
1537
  }
@@ -1407,6 +1571,13 @@
1407
1571
  "text": "boolean"
1408
1572
  }
1409
1573
  },
1574
+ {
1575
+ "name": "unsigned",
1576
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
1577
+ "type": {
1578
+ "text": "boolean"
1579
+ }
1580
+ },
1410
1581
  {
1411
1582
  "name": "autocomplete",
1412
1583
  "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.",
@@ -1414,6 +1585,13 @@
1414
1585
  "text": "string"
1415
1586
  }
1416
1587
  },
1588
+ {
1589
+ "name": "operator",
1590
+ "description": "Fixes the operator for the element's life: no menu and no button render, and every tuple carries it. The plural is the menu's whitelist; declaring both warns, the singular winning, and an unknown name warns and pins the filter's default.",
1591
+ "type": {
1592
+ "text": "string"
1593
+ }
1594
+ },
1417
1595
  {
1418
1596
  "name": "disabled",
1419
1597
  "description": "The field's own disabled claim: the control is disabled and the field is left out of the submitted values, composed with a disabled fieldset ancestry. The property reflects the claim only, matches(':disabled') tells the effective state.",
@@ -1494,7 +1672,7 @@
1494
1672
  "attributes": [
1495
1673
  {
1496
1674
  "name": "type",
1497
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
1675
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
1498
1676
  "type": {
1499
1677
  "text": "string"
1500
1678
  }
@@ -1534,6 +1712,13 @@
1534
1712
  "text": "boolean"
1535
1713
  }
1536
1714
  },
1715
+ {
1716
+ "name": "unsigned",
1717
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
1718
+ "type": {
1719
+ "text": "boolean"
1720
+ }
1721
+ },
1537
1722
  {
1538
1723
  "name": "autocomplete",
1539
1724
  "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.",
@@ -1541,6 +1726,13 @@
1541
1726
  "text": "string"
1542
1727
  }
1543
1728
  },
1729
+ {
1730
+ "name": "operator",
1731
+ "description": "Fixes the operator for the element's life: no menu and no button render, and every tuple carries it. The plural is the menu's whitelist; declaring both warns, the singular winning, and an unknown name warns and pins the filter's default.",
1732
+ "type": {
1733
+ "text": "string"
1734
+ }
1735
+ },
1544
1736
  {
1545
1737
  "name": "disabled",
1546
1738
  "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.",
@@ -1621,7 +1813,7 @@
1621
1813
  "attributes": [
1622
1814
  {
1623
1815
  "name": "type",
1624
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
1816
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
1625
1817
  "type": {
1626
1818
  "text": "string"
1627
1819
  }
@@ -1661,6 +1853,13 @@
1661
1853
  "text": "boolean"
1662
1854
  }
1663
1855
  },
1856
+ {
1857
+ "name": "unsigned",
1858
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
1859
+ "type": {
1860
+ "text": "boolean"
1861
+ }
1862
+ },
1664
1863
  {
1665
1864
  "name": "autocomplete",
1666
1865
  "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.",
@@ -1668,6 +1867,13 @@
1668
1867
  "text": "string"
1669
1868
  }
1670
1869
  },
1870
+ {
1871
+ "name": "operator",
1872
+ "description": "Fixes the operator for the element's life: no menu and no button render, and every tuple carries it. The plural is the menu's whitelist; declaring both warns, the singular winning, and an unknown name warns and pins the filter's default.",
1873
+ "type": {
1874
+ "text": "string"
1875
+ }
1876
+ },
1671
1877
  {
1672
1878
  "name": "disabled",
1673
1879
  "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.",
@@ -1815,11 +2021,11 @@
1815
2021
  "name": "TextFilter",
1816
2022
  "tagName": "ful-filter-text",
1817
2023
  "customElement": true,
1818
- "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.",
2024
+ "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.",
1819
2025
  "attributes": [
1820
2026
  {
1821
2027
  "name": "type",
1822
- "description": "Any native input type, or the literal textarea to render one. Defaults to number under v-type=number, and a declared type wins.",
2028
+ "description": "Any native input type, the literal textarea to render one, or numeric and decimal, which render a text input carrying that inputmode and filter what can be typed: numeric takes digits and a leading minus, decimal one separator as well, answering it as a dot whatever the keyboard offered. Neither enforces min, max or step, which the native number type still does. Defaults to number under v-type=number, and a declared type wins.",
1823
2029
  "type": {
1824
2030
  "text": "string"
1825
2031
  }
@@ -1859,6 +2065,13 @@
1859
2065
  "text": "boolean"
1860
2066
  }
1861
2067
  },
2068
+ {
2069
+ "name": "unsigned",
2070
+ "description": "Refuses the leading minus a numeric or decimal field otherwise takes. It narrows the type's own filter rather than replacing it, so a decimal still keeps one separator and still answers with a dot. Meaningless on any other type, where the sign is the native control's business, and a declared keep or reject still outranks it.",
2071
+ "type": {
2072
+ "text": "boolean"
2073
+ }
2074
+ },
1862
2075
  {
1863
2076
  "name": "autocomplete",
1864
2077
  "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.",
@@ -1866,6 +2079,20 @@
1866
2079
  "text": "string"
1867
2080
  }
1868
2081
  },
2082
+ {
2083
+ "name": "operator",
2084
+ "description": "Fixes the operator for the element's life: no menu and no button render, and every tuple carries it. The plural is the menu's whitelist; declaring both warns, the singular winning, and an unknown name warns and pins the filter's default.",
2085
+ "type": {
2086
+ "text": "string"
2087
+ }
2088
+ },
2089
+ {
2090
+ "name": "sensitivity",
2091
+ "description": "Fixes the case sensitivity for the element's life, on the operator's terms: the button leaves and every tuple carries it.",
2092
+ "type": {
2093
+ "text": "string"
2094
+ }
2095
+ },
1869
2096
  {
1870
2097
  "name": "disabled",
1871
2098
  "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.",
@@ -1946,10 +2173,10 @@
1946
2173
  },
1947
2174
  {
1948
2175
  "kind": "class",
1949
- "name": "Select",
1950
- "tagName": "ful-select",
2176
+ "name": "InFilter",
2177
+ "tagName": "ful-filter-in",
1951
2178
  "customElement": true,
1952
- "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.",
2179
+ "description": "A ful-table filter over set membership, answering for both of data-jpa's set annotations: InEnum and InList take the same array of values and no operator, differing only in what the server converts them to. The vocabulary comes from wherever a select's does, slotted options or a loader, and the value is an array whether one key was chosen or several, an empty selection contributing nothing rather than an empty array. It picks one key unless multiple is declared, as a ful-select does.",
1953
2180
  "attributes": [
1954
2181
  {
1955
2182
  "name": "name",
@@ -1967,21 +2194,187 @@
1967
2194
  },
1968
2195
  {
1969
2196
  "name": "k-type",
1970
- "description": "How a key coerces when it arrives from the response or from the value attribute: number, string or bool.",
2197
+ "description": "How a key coerces when it arrives from the response or from the value attribute: number, string or boolean.",
1971
2198
  "type": {
1972
2199
  "text": "string"
1973
2200
  }
1974
2201
  },
2202
+ {
2203
+ "name": "mode",
2204
+ "description": "chunked asks the endpoint per query instead of fetching the vocabulary once, for a list too large to hold.",
2205
+ "type": {
2206
+ "text": "string"
2207
+ }
2208
+ },
2209
+ {
2210
+ "name": "preload",
2211
+ "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.",
2212
+ "type": {
2213
+ "text": "boolean"
2214
+ }
2215
+ },
2216
+ {
2217
+ "name": "revision",
2218
+ "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. Left valueless, the revision the registry's 'revision' component answers is used, so a page states its build once instead of every element repeating it.",
2219
+ "type": {
2220
+ "text": "string"
2221
+ }
2222
+ },
2223
+ {
2224
+ "name": "k-expr",
2225
+ "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.",
2226
+ "type": {
2227
+ "text": "string"
2228
+ }
2229
+ },
2230
+ {
2231
+ "name": "l-expr",
2232
+ "description": "The expression yielding an option's label, evaluated against each row of the response.",
2233
+ "type": {
2234
+ "text": "string"
2235
+ }
2236
+ },
2237
+ {
2238
+ "name": "d-expr",
2239
+ "description": "The expression yielding the rows from the response body; the body itself when absent.",
2240
+ "type": {
2241
+ "text": "string"
2242
+ }
2243
+ },
2244
+ {
2245
+ "name": "m-expr",
2246
+ "description": "The expression yielding an option's metadata, evaluated against each row; the whole row when absent.",
2247
+ "type": {
2248
+ "text": "string"
2249
+ }
2250
+ },
2251
+ {
2252
+ "name": "response-mapper",
2253
+ "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.",
2254
+ "type": {
2255
+ "text": "string"
2256
+ }
2257
+ },
2258
+ {
2259
+ "name": "operator",
2260
+ "description": "A fixed operator sent in front of the chosen keys, for the field a compare reads rather than a set: absent the value is the bare array an InEnum or an InList takes, present it is [operator, ...keys]. No menu is rendered either way, the operator being the author naming the server's comparison rather than a choice offered to whoever is filtering. The criterion reports it, so a chip can show it.",
2261
+ "type": {
2262
+ "text": "string"
2263
+ }
2264
+ },
2265
+ {
2266
+ "name": "disabled",
2267
+ "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.",
2268
+ "type": {
2269
+ "text": "boolean"
2270
+ }
2271
+ },
2272
+ {
2273
+ "name": "readonly",
2274
+ "description": "Renders the control but does not let it be edited. A readonly field still contributes its value to the form.",
2275
+ "type": {
2276
+ "text": "boolean"
2277
+ }
2278
+ },
2279
+ {
2280
+ "name": "required",
2281
+ "description": "Marks the field as required for assistive technologies and shows the required marker on its label.",
2282
+ "type": {
2283
+ "text": "boolean"
2284
+ }
2285
+ },
2286
+ {
2287
+ "name": "value",
2288
+ "description": "Comma separated list of the selected keys. Empty contributes nothing, so the table drops the filter rather than sending an empty set.",
2289
+ "type": {
2290
+ "text": "string"
2291
+ }
2292
+ },
2293
+ {
2294
+ "name": "multiple",
2295
+ "description": "Always on for this element: a set of one is still a set, and a single selection would answer a bare key where the filter request wants an array.",
2296
+ "type": {
2297
+ "text": "boolean"
2298
+ }
2299
+ },
2300
+ {
2301
+ "name": "item-list",
2302
+ "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).",
2303
+ "type": {
2304
+ "text": "boolean"
2305
+ }
2306
+ },
1975
2307
  {
1976
2308
  "name": "src",
1977
- "description": "The url the vocabulary is fetched from. Without it the slotted <option> elements are the whole vocabulary, held in memory.",
2309
+ "description": "The url the vocabulary is fetched from. Without it the slotted <option> elements are the whole vocabulary, held in memory. Stays live: writing it builds the loader again and reloads as reload() does, dropping a selected key the new vocabulary does not know.",
1978
2310
  "type": {
1979
2311
  "text": "string"
1980
2312
  }
1981
2313
  },
1982
2314
  {
1983
2315
  "name": "method",
1984
- "description": "The method the vocabulary is fetched with; POST when absent.",
2316
+ "description": "The method the vocabulary is fetched with; POST when absent. Stays live, as src does.",
2317
+ "type": {
2318
+ "text": "string"
2319
+ }
2320
+ }
2321
+ ],
2322
+ "slots": [
2323
+ {
2324
+ "name": "",
2325
+ "description": "The label of the field."
2326
+ },
2327
+ {
2328
+ "name": "info",
2329
+ "description": "Extra content rendered next to the label, for a hint or a help icon."
2330
+ },
2331
+ {
2332
+ "name": "before",
2333
+ "description": "An addon rendered inside the input group, before the control."
2334
+ },
2335
+ {
2336
+ "name": "after",
2337
+ "description": "An addon rendered inside the input group, after the control."
2338
+ },
2339
+ {
2340
+ "name": "dropdown",
2341
+ "description": "Replaces the template used to render the options."
2342
+ }
2343
+ ],
2344
+ "events": [
2345
+ {
2346
+ "name": "change",
2347
+ "description": "Fired with the selected keys, or undefined when nothing is picked.",
2348
+ "type": {
2349
+ "text": "CustomEvent"
2350
+ }
2351
+ }
2352
+ ]
2353
+ },
2354
+ {
2355
+ "kind": "class",
2356
+ "name": "Select",
2357
+ "tagName": "ful-select",
2358
+ "customElement": true,
2359
+ "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.",
2360
+ "attributes": [
2361
+ {
2362
+ "name": "name",
2363
+ "description": "The field name the surrounding form submits the selection under.",
2364
+ "type": {
2365
+ "text": "string"
2366
+ }
2367
+ },
2368
+ {
2369
+ "name": "loader",
2370
+ "description": "The registered component name the select loads its vocabulary through; loaders:select when absent.",
2371
+ "type": {
2372
+ "text": "string"
2373
+ }
2374
+ },
2375
+ {
2376
+ "name": "k-type",
2377
+ "description": "How a key coerces when it arrives from the response or from the value attribute: number, string or boolean.",
1985
2378
  "type": {
1986
2379
  "text": "string"
1987
2380
  }
@@ -2002,7 +2395,7 @@
2002
2395
  },
2003
2396
  {
2004
2397
  "name": "revision",
2005
- "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.",
2398
+ "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. Left valueless, the revision the registry's 'revision' component answers is used, so a page states its build once instead of every element repeating it.",
2006
2399
  "type": {
2007
2400
  "text": "string"
2008
2401
  }
@@ -2065,7 +2458,7 @@
2065
2458
  },
2066
2459
  {
2067
2460
  "name": "value",
2068
- "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.",
2461
+ "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. A single select reads a present but empty attribute as the empty key, the one an <option value=\"\"> carries, where an absent attribute means no selection; a multiple select reads it as no keys.",
2069
2462
  "type": {
2070
2463
  "text": "string"
2071
2464
  }
@@ -2083,6 +2476,20 @@
2083
2476
  "type": {
2084
2477
  "text": "boolean"
2085
2478
  }
2479
+ },
2480
+ {
2481
+ "name": "src",
2482
+ "description": "The url the vocabulary is fetched from. Without it the slotted <option> elements are the whole vocabulary, held in memory. Stays live: writing it builds the loader again and reloads as reload() does, dropping a selected key the new vocabulary does not know.",
2483
+ "type": {
2484
+ "text": "string"
2485
+ }
2486
+ },
2487
+ {
2488
+ "name": "method",
2489
+ "description": "The method the vocabulary is fetched with; POST when absent. Stays live, as src does.",
2490
+ "type": {
2491
+ "text": "string"
2492
+ }
2086
2493
  }
2087
2494
  ],
2088
2495
  "slots": [
@@ -2122,7 +2529,7 @@
2122
2529
  "name": "Dropdown",
2123
2530
  "tagName": "ful-dropdown",
2124
2531
  "customElement": true,
2125
- "description": "The options popup of a ful-select, with a localized no-results message when the search matches nothing. Rarely used on its own.",
2532
+ "description": "The options popup of a ful-select, with a localized no-results message when the search matches nothing. An entry whose metadata.disabled is truthy is refused: its row carries aria-disabled and metadata.reason as its title, the arrows and Home/End walk past it, and a click on it changes nothing. Rarely used on its own.",
2126
2533
  "attributes": [
2127
2534
  {
2128
2535
  "name": "listbox",
@@ -2176,6 +2583,14 @@
2176
2583
  "module": "dist/fml.mjs"
2177
2584
  }
2178
2585
  },
2586
+ {
2587
+ "kind": "custom-element-definition",
2588
+ "name": "ful-menu",
2589
+ "declaration": {
2590
+ "name": "Menu",
2591
+ "module": "dist/fml.mjs"
2592
+ }
2593
+ },
2179
2594
  {
2180
2595
  "kind": "custom-element-definition",
2181
2596
  "name": "ful-toasts",
@@ -2352,6 +2767,14 @@
2352
2767
  "module": "dist/fml.mjs"
2353
2768
  }
2354
2769
  },
2770
+ {
2771
+ "kind": "custom-element-definition",
2772
+ "name": "ful-filter-in",
2773
+ "declaration": {
2774
+ "name": "InFilter",
2775
+ "module": "dist/fml.mjs"
2776
+ }
2777
+ },
2355
2778
  {
2356
2779
  "kind": "custom-element-definition",
2357
2780
  "name": "ful-select",