@vielzeug/codex 3.1.1 → 26.10.1

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 (63) hide show
  1. package/README.md +1 -1
  2. package/data/catalog.json +166 -84
  3. package/data/llms-full.txt +3492 -1583
  4. package/data/llms.txt +9 -7
  5. package/data/manifest.json +1 -1
  6. package/data/packages/arsenal.json +40 -16
  7. package/data/packages/assay.json +12 -20
  8. package/data/packages/clockwork.json +31 -28
  9. package/data/packages/codex.json +5 -5
  10. package/data/packages/coins.json +4 -4
  11. package/data/packages/conduit.json +33 -34
  12. package/data/packages/courier.json +18 -17
  13. package/data/packages/dnd.json +11 -11
  14. package/data/packages/familiar.json +27 -6
  15. package/data/packages/flux.json +11 -8
  16. package/data/packages/focus.json +17 -7
  17. package/data/packages/forge.json +4 -4
  18. package/data/packages/gesture.json +11 -5
  19. package/data/packages/herald.json +16 -17
  20. package/data/packages/illusionist.json +5 -5
  21. package/data/packages/keymap.json +16 -12
  22. package/data/packages/ledger.json +26 -26
  23. package/data/packages/lingua.json +4 -4
  24. package/data/packages/mesh.json +30 -32
  25. package/data/packages/necromancer.json +7 -6
  26. package/data/packages/orbit.json +11 -10
  27. package/data/packages/ore.json +6 -5
  28. package/data/packages/postmaster.json +26 -26
  29. package/data/packages/prism.json +50 -42
  30. package/data/packages/pulse.json +34 -34
  31. package/data/packages/refine.json +7 -5
  32. package/data/packages/ripple.json +4 -4
  33. package/data/packages/rune.json +9 -9
  34. package/data/packages/sandbox.json +4 -4
  35. package/data/packages/scout.json +17 -11
  36. package/data/packages/scroll.json +14 -14
  37. package/data/packages/sentinel.json +26 -15
  38. package/data/packages/sigil.json +6 -6
  39. package/data/packages/sourcerer.json +4 -4
  40. package/data/packages/spell.json +31 -36
  41. package/data/packages/tandem.json +29 -0
  42. package/data/packages/tavern.json +23 -0
  43. package/data/packages/tempo.json +45 -43
  44. package/data/packages/vault.json +15 -25
  45. package/data/packages/ward.json +27 -30
  46. package/data/packages/wayfinder.json +34 -27
  47. package/data/refine.json +987 -134
  48. package/data/search.json +341 -306
  49. package/dist/http.js +2 -2
  50. package/dist/http.js.map +1 -1
  51. package/dist/index.d.ts +3 -4
  52. package/dist/index.js +3 -4
  53. package/dist/index.js.map +1 -1
  54. package/dist/refine.d.ts +1 -1
  55. package/dist/refine.js +1 -1
  56. package/dist/server.d.ts +1 -1
  57. package/dist/server.js +1 -1
  58. package/dist/tools/refine.js +1 -1
  59. package/package.json +5 -12
  60. package/skills/vielzeug/SKILL.md +57 -55
  61. package/dist/advanced.d.ts +0 -12
  62. package/dist/advanced.js +0 -13
  63. package/dist/advanced.js.map +0 -1
package/data/refine.json CHANGED
@@ -41,6 +41,25 @@
41
41
  },
42
42
  "default": "{ content, disclosure, feedback, inputs, layout, overlay }"
43
43
  },
44
+ {
45
+ "kind": "function",
46
+ "name": "createThemeController",
47
+ "return": {
48
+ "type": {
49
+ "text": "ThemeController"
50
+ }
51
+ },
52
+ "parameters": [
53
+ {
54
+ "name": "options",
55
+ "default": "{}",
56
+ "type": {
57
+ "text": "ThemeControllerOptions"
58
+ }
59
+ }
60
+ ],
61
+ "description": "Creates a document theme controller. Call once at app startup."
62
+ },
44
63
  {
45
64
  "kind": "function",
46
65
  "name": "announce",
@@ -113,7 +132,7 @@
113
132
  }
114
133
  }
115
134
  ],
116
- "description": "Grows a `<textarea>`'s height to fit its content, shared by every component that offers\nauto-resize (`ore-textarea`, `ore-message-composer`) instead of each reimplementing it.\n\nOwns only height — manual-resize cursor/direction is a per-component styling concern, not\nshared behavior, so it stays local to whichever component renders a resize handle."
135
+ "description": "Grows a `<textarea>`'s height to fit its content, shared by every component that offers\nauto-resize (`ore-textarea`, `ore-message-composer`) instead of each reimplementing it.\n\nOwns only height: manual-resize cursor/direction is a per-component styling concern, not\nshared behavior, so it stays local to whichever component renders a resize handle."
117
136
  },
118
137
  {
119
138
  "kind": "function",
@@ -165,7 +184,7 @@
165
184
  }
166
185
  }
167
186
  ],
168
- "description": "Send-gesture logic for a message/comment composer — decides *when* a send is allowed\nand *whether* a given keydown counts as one. Owns no DOM, value state, or event dispatch;\nthe component wires `handleKeydown`/`send` and decides what a send actually does."
187
+ "description": "Send-gesture logic for a message/comment composer: decides *when* a send is allowed\nand *whether* a given keydown counts as one. Owns no DOM, value state, or event dispatch;\nthe component wires `handleKeydown`/`send` and decides what a send actually does."
169
188
  },
170
189
  {
171
190
  "kind": "function",
@@ -183,7 +202,7 @@
183
202
  }
184
203
  }
185
204
  ],
186
- "description": "Parses an ISO 8601 date string (`yyyy-MM-dd`) into a `Temporal.PlainDate`.\nReturns `null` for any invalid / empty input — never throws."
205
+ "description": "Parses an ISO 8601 date string (`yyyy-MM-dd`) into a `Temporal.PlainDate`.\nReturns `null` for any invalid / empty input: never throws."
187
206
  },
188
207
  {
189
208
  "kind": "function",
@@ -243,7 +262,43 @@
243
262
  }
244
263
  }
245
264
  ],
246
- "description": "Pure, framework-agnostic date-picker state machine backed by `Temporal.PlainDate`.\n\nAll state is held in plain mutable variables — suitable for wrapping in any\nreactive layer (ore `signal`, Vue ref, etc.). The factory returns a stable\nhandle object; callers are responsible for reactivity.\n\nOptions with getter-based live bindings (e.g. `get min() { ... }`) are read\non every call so the control always reflects the latest reactive state."
265
+ "description": "Pure, framework-agnostic date-picker state machine backed by `Temporal.PlainDate`.\n\nAll state is held in plain mutable variables: suitable for wrapping in any\nreactive layer (ore `signal`, Vue ref, etc.). The factory returns a stable\nhandle object; callers are responsible for reactivity.\n\nOptions with getter-based live bindings (e.g. `get min() { ... }`) are read\non every call so the control always reflects the latest reactive state."
266
+ },
267
+ {
268
+ "kind": "function",
269
+ "name": "handleCalendarGridKeydown",
270
+ "return": {
271
+ "type": {
272
+ "text": "void"
273
+ }
274
+ },
275
+ "parameters": [
276
+ {
277
+ "name": "event",
278
+ "type": {
279
+ "text": "KeyboardEvent"
280
+ }
281
+ },
282
+ {
283
+ "name": "cellSelector",
284
+ "type": {
285
+ "text": "string"
286
+ }
287
+ },
288
+ {
289
+ "name": "columns",
290
+ "type": {
291
+ "text": "number"
292
+ }
293
+ },
294
+ {
295
+ "name": "onSelect",
296
+ "type": {
297
+ "text": "(cell: HTMLElement) => void"
298
+ }
299
+ }
300
+ ],
301
+ "description": "Roving-arrow keyboard navigation for a calendar grid, implementing the ARIA `grid` cell pattern:\nArrow keys move by one cell / one row (`columns` wide), Home/End jump to the row's first/last\ncell, and Enter/Space activate the focused cell. Every calendar grid: days (7 columns) and\nmonths/years (4 columns): carries the base `.cal-grid` class, so `closest('.cal-grid')` scopes\nthe movement to the grid the event fired in regardless of view.\n\n`onSelect` receives the activated cell element so the day view can read its `data-iso` while the\nmonth/year views ignore the argument and use their own closure value."
247
302
  },
248
303
  {
249
304
  "kind": "function",
@@ -261,7 +316,7 @@
261
316
  }
262
317
  }
263
318
  ],
264
- "description": "Resolves the effective text direction for an element.\n\nThe closest ancestor with an explicit `dir=\"ltr\"` or `dir=\"rtl\"` attribute wins — this\nsupports locally-scoped RTL sections (e.g. a single `dir=\"rtl\"` panel inside an otherwise\nLTR page). When no explicit `dir` attribute is found up the tree, falls back to the\ncomputed `direction` CSS property (e.g. set via a `direction: rtl` style rule with no\n`dir` attribute). Defaults to `'ltr'` when `el` is `null`."
319
+ "description": "Resolves the effective text direction for an element.\n\nThe closest ancestor with an explicit `dir=\"ltr\"` or `dir=\"rtl\"` attribute wins: this\nsupports locally-scoped RTL sections (e.g. a single `dir=\"rtl\"` panel inside an otherwise\nLTR page). When no explicit `dir` attribute is found up the tree, falls back to the\ncomputed `direction` CSS property (e.g. set via a `direction: rtl` style rule with no\n`dir` attribute). Defaults to `'ltr'` when `el` is `null`."
265
320
  },
266
321
  {
267
322
  "kind": "function",
@@ -296,7 +351,7 @@
296
351
  }
297
352
  }
298
353
  ],
299
- "description": "Creates a reactive counter state signal for text fields with `maxLength`.\nOnly call this when `maxLength` may be set — the state is genuinely opt-in."
354
+ "description": "Creates a reactive counter state signal for text fields with `maxLength`.\nOnly call this when `maxLength` may be set: the state is genuinely opt-in."
300
355
  },
301
356
  {
302
357
  "kind": "function",
@@ -318,7 +373,7 @@
318
373
  "default": "'counter'"
319
374
  }
320
375
  ],
321
- "description": "The single implementation of \"which modifier class does this counter state map to\" —\nevery field with a character counter (`ore-input`, `ore-textarea`, `ore-message-composer`)\nrenders the identical near-limit/at-limit styling, so this is the one place that decides it."
376
+ "description": "The single implementation of \"which modifier class does this counter state map to\" :\nevery field with a character counter (`ore-input`, `ore-textarea`, `ore-message-composer`)\nrenders the identical near-limit/at-limit styling, so this is the one place that decides it."
322
377
  },
323
378
  {
324
379
  "kind": "function",
@@ -398,6 +453,41 @@
398
453
  ],
399
454
  "description": "Encapsulates the three-step focus lifecycle used by dialogs and drawers:\n1. Capture the element that triggered the open.\n2. Move focus inside the overlay (optionally to a specific element).\n3. Restore focus when the overlay closes."
400
455
  },
456
+ {
457
+ "kind": "function",
458
+ "name": "registerIcons",
459
+ "return": {
460
+ "type": {
461
+ "text": "void"
462
+ }
463
+ },
464
+ "parameters": [
465
+ {
466
+ "name": "icons",
467
+ "type": {
468
+ "text": "Record<string, IconNode>"
469
+ }
470
+ }
471
+ ],
472
+ "description": "Register icons (or override existing ones) by name. Keys may be kebab-case or\nPascalCase: both resolve."
473
+ },
474
+ {
475
+ "kind": "function",
476
+ "name": "resolveIcon",
477
+ "return": {
478
+ "type": {
479
+ "text": "IconNode | undefined"
480
+ }
481
+ },
482
+ "parameters": [
483
+ {
484
+ "name": "name",
485
+ "type": {
486
+ "text": "string"
487
+ }
488
+ }
489
+ ]
490
+ },
401
491
  {
402
492
  "kind": "function",
403
493
  "name": "dispatchKeyboardAction",
@@ -520,7 +610,7 @@
520
610
  }
521
611
  }
522
612
  ],
523
- "description": "Coerces `value` via `Number()` and returns it when finite, `undefined` otherwise.\n\nCaveat: `null` and `''` both coerce to `0` in JavaScript (`Number(null) === 0`,\n`Number('') === 0`) and are therefore returned as the finite number `0`, not\n`undefined` — this function does not treat \"absent\" values specially. Only\ngenuinely non-numeric input (`undefined`, `NaN`, non-numeric strings) yields\n`undefined`. Callers that mean \"no bound set\" should pass `undefined`\nexplicitly rather than `null` or `''`."
613
+ "description": "Coerces `value` via `Number()` and returns it when finite, `undefined` otherwise.\n\nCaveat: `null` and `''` both coerce to `0` in JavaScript (`Number(null) === 0`,\n`Number('') === 0`) and are therefore returned as the finite number `0`, not\n`undefined`: this function does not treat \"absent\" values specially. Only\ngenuinely non-numeric input (`undefined`, `NaN`, non-numeric strings) yields\n`undefined`. Callers that mean \"no bound set\" should pass `undefined`\nexplicitly rather than `null` or `''`."
524
614
  },
525
615
  {
526
616
  "kind": "function",
@@ -652,6 +742,24 @@
652
742
  ],
653
743
  "description": "Parses a comma-separated trigger string into a typed array, filtering against\na valid set and falling back to `defaults` when the input is empty or invalid.\n\nUsed by tooltip and popover to normalise their `trigger` prop values."
654
744
  },
745
+ {
746
+ "kind": "function",
747
+ "name": "parseOptionalBool",
748
+ "return": {
749
+ "type": {
750
+ "text": "boolean | undefined"
751
+ }
752
+ },
753
+ "parameters": [
754
+ {
755
+ "name": "value",
756
+ "type": {
757
+ "text": "string | null"
758
+ }
759
+ }
760
+ ],
761
+ "description": "Parses a boolean HTML attribute value into `true | false | undefined`, where\n`undefined` means \"attribute absent\": the signal controlled components (`open`)\nuse to distinguish uncontrolled from controlled mode.\n\nThe grammar is the standard attribute one: presence with no value (`open`) or\nthe literal `\"true\"` is true; anything else, including `\"false\"`, is false.\nEvery controlled overlay (dialog, drawer, menu, popover, tooltip,\ncommand-palette) parses its `open` prop with this exact contract."
762
+ },
655
763
  {
656
764
  "kind": "function",
657
765
  "name": "createDropdownPositioner",
@@ -662,7 +770,7 @@
662
770
  },
663
771
  "parameters": [
664
772
  {
665
- "name": "{\n boundary,\n getDir,\n getFloating,\n getPlacement,\n getReference,\n matchWidth = true,\n offsetPx = 0,\n padding = 6,\n useClippingAncestor = true,\n}",
773
+ "name": "{\n boundary,\n getDir,\n getFloating,\n getOffsetPx = () => 0,\n getPlacement,\n getReference,\n matchWidth = true,\n onPlacementChange,\n padding = 6,\n useClippingAncestor = true,\n}",
666
774
  "type": {
667
775
  "text": "DropdownPositionerOptions"
668
776
  }
@@ -692,7 +800,7 @@
692
800
  }
693
801
  }
694
802
  ],
695
- "description": "Forwards a mounted element to a JS-only `ref` callback prop, and keeps forwarding to a\n*new* callback if the prop is set again after mount (e.g. a parent sets it via a ref\ncallback after render, rather than at initial mount). Every text-entry-style component\nwith a `ref` escape-hatch prop (`ore-input`, `ore-textarea`, `ore-message-composer`,\n`ore-file-input`) wires this identically — call it once from inside `onElement()`, alongside\nwhatever else that element needs wired."
803
+ "description": "Forwards a mounted element to a JS-only `ref` callback prop, and keeps forwarding to a\n*new* callback if the prop is set again after mount (e.g. a parent sets it via a ref\ncallback after render, rather than at initial mount). Every text-entry-style component\nwith a `ref` escape-hatch prop (`ore-input`, `ore-textarea`, `ore-message-composer`,\n`ore-file-input`) wires this identically: call it once from inside `onElement()`, alongside\nwhatever else that element needs wired."
696
804
  },
697
805
  {
698
806
  "kind": "function",
@@ -777,6 +885,60 @@
777
885
  }
778
886
  ]
779
887
  },
888
+ {
889
+ "kind": "function",
890
+ "name": "parseMaxWidthPx",
891
+ "return": {
892
+ "type": {
893
+ "text": "number | undefined"
894
+ }
895
+ },
896
+ "parameters": [
897
+ {
898
+ "name": "query",
899
+ "type": {
900
+ "text": "string | undefined"
901
+ }
902
+ }
903
+ ],
904
+ "description": "Parses the px value out of a container-query string like `(max-width: 768px)`."
905
+ },
906
+ {
907
+ "kind": "function",
908
+ "name": "resolveContainerElement",
909
+ "return": {
910
+ "type": {
911
+ "text": "HTMLElement | null"
912
+ }
913
+ },
914
+ "parameters": [
915
+ {
916
+ "name": "el",
917
+ "type": {
918
+ "text": "HTMLElement"
919
+ }
920
+ }
921
+ ],
922
+ "description": "The element whose width the component measures against, skipping transparent\n`ore-grid-item` wrappers so a component inside a grid still sees its real container."
923
+ },
924
+ {
925
+ "kind": "function",
926
+ "name": "readContainerWidth",
927
+ "return": {
928
+ "type": {
929
+ "text": "number"
930
+ }
931
+ },
932
+ "parameters": [
933
+ {
934
+ "name": "el",
935
+ "type": {
936
+ "text": "HTMLElement"
937
+ }
938
+ }
939
+ ],
940
+ "description": "The container width to test against a breakpoint, falling back to the element itself."
941
+ },
780
942
  {
781
943
  "kind": "variable",
782
944
  "name": "themableBundle",
@@ -872,19 +1034,19 @@
872
1034
  "kind": "variable",
873
1035
  "name": "MESSAGE_COMPOSER_SIZE_PRESET",
874
1036
  "default": "{ lg: { '--_padding': 'var(--size-4)', fontSize: 'var(--text-base)', gap: 'var(--size-2-5)', }, md: { '--_padding': 'var(--size-3)', fontSize: 'var(--text-sm)', gap: 'var(--size-2)', }, sm: { '--_padding': 'var(--size-2)', fontSize: 'var(--text-xs)', gap: 'var(--size-1-5)', }, } satisfies FullSizePreset",
875
- "description": "Size preset for the message composer card. Padding is symmetric (unlike\n`TEXTAREA_SIZE_PRESET`'s field-shaped padding) since this scales a card that wraps a field\n*and* a toolbar row, not a bare field — `md`'s padding matches the value the card used before\n`size` scaled anything, so the default look is unchanged."
1037
+ "description": "Size preset for the message composer card. Padding is symmetric (unlike\n`TEXTAREA_SIZE_PRESET`'s field-shaped padding) since this scales a card that wraps a field\n*and* a toolbar row, not a bare field: `md`'s padding matches the value the card used before\n`size` scaled anything, so the default look is unchanged."
876
1038
  },
877
1039
  {
878
1040
  "kind": "variable",
879
1041
  "name": "MENU_SIZE_PRESET",
880
1042
  "default": "{ lg: { '--_item-padding': 'var(--size-2) var(--size-3-5)', '--_panel-padding': 'var(--size-1-5)', '--_separator-margin': 'var(--size-1-5)', fontSize: 'var(--text-base)', gap: 'var(--size-2-5)', }, md: { '--_item-padding': 'var(--size-1-5) var(--size-3)', '--_panel-padding': 'var(--size-1)', '--_separator-margin': 'var(--size-1)', fontSize: 'var(--text-sm)', gap: 'var(--size-2)', }, sm: { '--_item-padding': 'var(--size-1) var(--size-2-5)', '--_panel-padding': 'var(--size-0-5)', '--_separator-margin': 'var(--size-0-5)', fontSize: 'var(--text-xs)', gap: 'var(--size-1-5)', }, } satisfies FullSizePreset",
881
- "description": "Size preset for `ore-menu`'s floating panel, `ore-menu-item`'s row, and `ore-menu-separator`'s\nmargin. `--_panel-padding`, `--_item-padding`, and `--_separator-margin` are custom pass-through\nkeys (not one of `SizeConfig`'s named slots) since the panel, its items, and its separators each\nneed independently-scaling spacing; `md`'s values match what `menu.css`/`menu-item.css`/\n`menu-separator.css` hardcoded before `size` was wired up, so the default look is unchanged.\n`--_font-size`/`--_gap` are inherited by `ore-menu-item` from `ore-menu`'s own host — custom\nproperties cascade down through light-DOM children the same way they cascade into a shadow root."
1043
+ "description": "Size preset for `ore-menu`'s floating panel, `ore-menu-item`'s row, and `ore-menu-separator`'s\nmargin. `--_panel-padding`, `--_item-padding`, and `--_separator-margin` are custom pass-through\nkeys (not one of `SizeConfig`'s named slots) since the panel, its items, and its separators each\nneed independently-scaling spacing; `md`'s values match what `menu.css`/`menu-item.css`/\n`menu-separator.css` hardcoded before `size` was wired up, so the default look is unchanged.\n`--_font-size`/`--_gap` are inherited by `ore-menu-item` from `ore-menu`'s own host: custom\nproperties cascade down through light-DOM children the same way they cascade into a shadow root."
882
1044
  },
883
1045
  {
884
1046
  "kind": "variable",
885
1047
  "name": "LIST_SIZE_PRESET",
886
1048
  "default": "{ lg: { '--_min-height': 'var(--size-14)', '--_min-height-two-line': 'calc(var(--size-16) + var(--size-2))', '--_padding-inline-end': 'var(--size-6)', fontSize: 'var(--text-base)', gap: 'var(--size-4)', padding: 'var(--size-3) var(--size-4)', }, md: { '--_min-height': 'var(--size-14)', '--_min-height-two-line': 'calc(var(--size-16) + var(--size-2))', '--_padding-inline-end': 'var(--size-6)', fontSize: 'var(--text-sm)', gap: 'var(--size-4)', padding: 'var(--size-2-5) var(--size-4)', }, sm: { '--_min-height': 'var(--size-12)', '--_min-height-two-line': 'var(--size-16)', '--_padding-inline-end': 'var(--size-4)', fontSize: 'var(--text-xs)', gap: 'var(--size-2)', padding: 'var(--size-1-5) var(--size-2)', }, } satisfies FullSizePreset",
887
- "description": "Size preset for `ore-list`'s own host. `ore-list-item` has no `sizeVariantMixin` call of its\nown — it reads `--_gap`/`--_padding`/`--_padding-inline-end`/`--_font-size`/`--_min-height`/\n`--_min-height-two-line` inherited straight from its parent `ore-list`'s shadow host (custom\nproperties cascade through light-DOM children the same way `MENU_SIZE_PRESET` cascades from\n`ore-menu` into `ore-menu-item`), with fallback defaults for standalone use outside an\n`ore-list`.\n\nFollows Material 3's list-item spacing at `md`/`lg`: 16dp between leading/content/trailing\n(`gap`), 16dp inline-start (`padding`), 24dp inline-end (`--_padding-inline-end` — the trailing\nedge sits 8dp further out than the other three sides in the M3 spec), 56dp one-line / 72dp\ntwo-line row height (`--_min-height`/`--_min-height-two-line`, applied in `list-item.css`).\n`sm` keeps the same asymmetry and the M3/WCAG 48dp touch-target floor proportionally, for a\ndenser list that still reads as \"M3-like\" rather than hitting the exact dp values M3 doesn't\nitself define an alternate density for."
1049
+ "description": "Size preset for `ore-list`'s own host. `ore-list-item` has no `sizeVariantMixin` call of its\nown: it reads `--_gap`/`--_padding`/`--_padding-inline-end`/`--_font-size`/`--_min-height`/\n`--_min-height-two-line` inherited straight from its parent `ore-list`'s shadow host (custom\nproperties cascade through light-DOM children the same way `MENU_SIZE_PRESET` cascades from\n`ore-menu` into `ore-menu-item`), with fallback defaults for standalone use outside an\n`ore-list`.\n\nFollows Material 3's list-item spacing at `md`/`lg`: 16dp between leading/content/trailing\n(`gap`), 16dp inline-start (`padding`), 24dp inline-end (`--_padding-inline-end`: the trailing\nedge sits 8dp further out than the other three sides in the M3 spec), 56dp one-line / 72dp\ntwo-line row height (`--_min-height`/`--_min-height-two-line`, applied in `list-item.css`).\n`sm` keeps the same asymmetry and the M3/WCAG 48dp touch-target floor proportionally, for a\ndenser list that still reads as \"M3-like\" rather than hitting the exact dp values M3 doesn't\nitself define an alternate density for."
888
1050
  },
889
1051
  {
890
1052
  "kind": "variable",
@@ -1587,14 +1749,14 @@
1587
1749
  "text": "'ore-chat-message'"
1588
1750
  },
1589
1751
  "default": "'ore-chat-message'",
1590
- "description": "A single message bubble for chat/conversation UIs — sender-aware alignment, an optional\navatar slot, delivery status (sending/sent/error with retry), and a streaming cursor for\nassistant messages still generating. Content is provided via the default slot, so any\nmarkdown-to-HTML rendering stays the consumer's choice.\n\nThe default slot's leading/trailing whitespace-only text nodes are trimmed in place once\nper slot assignment (mount, and again on `slotchange`) — pretty-printed HTML's\nindentation would otherwise render as blank lines, since the bubble preserves line breaks\n(`white-space: pre-wrap`) for genuine multi-paragraph replies. This mutates those specific\ntext nodes' `textContent` directly; it never touches nodes appended afterward (e.g. by\n`el.textContent += token` while streaming), only the ones present at assignment time."
1752
+ "description": "A single message bubble for chat/conversation UIs: sender-aware alignment, an optional\navatar slot, delivery status (sending/sent/error with retry), and a streaming cursor for\nassistant messages still generating. Content is provided via the default slot, so any\nmarkdown-to-HTML rendering stays the consumer's choice.\n\nThe default slot's leading/trailing whitespace-only text nodes are trimmed in place once\nper slot assignment (mount, and again on `slotchange`): pretty-printed HTML's\nindentation would otherwise render as blank lines, since the bubble preserves line breaks\n(`white-space: pre-wrap`) for genuine multi-paragraph replies. This mutates those specific\ntext nodes' `textContent` directly; it never touches nodes appended afterward (e.g. by\n`el.textContent += token` while streaming), only the ones present at assignment time."
1591
1753
  },
1592
1754
  {
1593
1755
  "kind": "class",
1594
1756
  "name": "OreChatMessageElement",
1595
1757
  "tagName": "ore-chat-message",
1596
1758
  "customElement": true,
1597
- "description": "A single message bubble for chat/conversation UIs — sender-aware alignment, an optional\navatar slot, delivery status (sending/sent/error with retry), and a streaming cursor for\nassistant messages still generating. Content is provided via the default slot, so any\nmarkdown-to-HTML rendering stays the consumer's choice.\nThe default slot's leading/trailing whitespace-only text nodes are trimmed in place once\nper slot assignment (mount, and again on `slotchange`) — pretty-printed HTML's\nindentation would otherwise render as blank lines, since the bubble preserves line breaks\n(`white-space: pre-wrap`) for genuine multi-paragraph replies. This mutates those specific\ntext nodes' `textContent` directly; it never touches nodes appended afterward (e.g. by\n`el.textContent += token` while streaming), only the ones present at assignment time.",
1759
+ "description": "A single message bubble for chat/conversation UIs: sender-aware alignment, an optional\navatar slot, delivery status (sending/sent/error with retry), and a streaming cursor for\nassistant messages still generating. Content is provided via the default slot, so any\nmarkdown-to-HTML rendering stays the consumer's choice.\nThe default slot's leading/trailing whitespace-only text nodes are trimmed in place once\nper slot assignment (mount, and again on `slotchange`): pretty-printed HTML's\nindentation would otherwise render as blank lines, since the bubble preserves line breaks\n(`white-space: pre-wrap`) for genuine multi-paragraph replies. This mutates those specific\ntext nodes' `textContent` directly; it never touches nodes appended afterward (e.g. by\n`el.textContent += token` while streaming), only the ones present at assignment time.",
1598
1760
  "summary": "",
1599
1761
  "attributes": [
1600
1762
  {
@@ -1750,6 +1912,139 @@
1750
1912
  }
1751
1913
  ]
1752
1914
  },
1915
+ {
1916
+ "kind": "variable",
1917
+ "name": "CHAT_PANEL_TAG",
1918
+ "type": {
1919
+ "text": "'ore-chat-panel'"
1920
+ },
1921
+ "default": "'ore-chat-panel'",
1922
+ "description": "A self-contained assistant chat surface: the fixed corner window a demo or support\nflow needs: header with title, status, Start over and close; a live-region message\ntranscript built from `ore-chat-message`; suggested questions while the transcript\nholds only the greeting; and an `ore-message-composer` footer.\n\nThe panel owns presentation and interaction only. Reply generation, persistence, and\naction semantics stay with the consumer: listen for `send`, append the assistant reply\nto `messages`, and reassign the array; handle `action` for whatever a message's action\npayload means in your app."
1923
+ },
1924
+ {
1925
+ "kind": "class",
1926
+ "name": "OreChatPanelElement",
1927
+ "tagName": "ore-chat-panel",
1928
+ "customElement": true,
1929
+ "description": "A self-contained assistant chat surface: the fixed corner window a demo or support\nflow needs: header with title, status, Start over and close; a live-region message\ntranscript built from `ore-chat-message`; suggested questions while the transcript\nholds only the greeting; and an `ore-message-composer` footer.\nThe panel owns presentation and interaction only. Reply generation, persistence, and\naction semantics stay with the consumer: listen for `send`, append the assistant reply\nto `messages`, and reassign the array; handle `action` for whatever a message's action\npayload means in your app.",
1930
+ "summary": "",
1931
+ "attributes": [
1932
+ {
1933
+ "name": "label",
1934
+ "type": {
1935
+ "text": "string"
1936
+ },
1937
+ "description": "Accessible name for the panel region"
1938
+ },
1939
+ {
1940
+ "name": "open",
1941
+ "type": {
1942
+ "text": "boolean"
1943
+ },
1944
+ "description": "Open state"
1945
+ },
1946
+ {
1947
+ "name": "initials",
1948
+ "type": {
1949
+ "text": "string"
1950
+ },
1951
+ "description": "Assistant avatar initials (default 'V')"
1952
+ },
1953
+ {
1954
+ "name": "maxlength",
1955
+ "type": {
1956
+ "text": "number"
1957
+ },
1958
+ "description": "Composer character limit (default 240)"
1959
+ }
1960
+ ],
1961
+ "events": [
1962
+ {
1963
+ "name": "send",
1964
+ "description": "A send or suggestion was submitted. detail: { text }",
1965
+ "type": {
1966
+ "text": "CustomEvent"
1967
+ }
1968
+ },
1969
+ {
1970
+ "name": "action",
1971
+ "description": "A message action button was activated. detail: { payload }",
1972
+ "type": {
1973
+ "text": "CustomEvent"
1974
+ }
1975
+ },
1976
+ {
1977
+ "name": "reset",
1978
+ "description": "The transcript was cleared via Start over.",
1979
+ "type": {
1980
+ "text": "CustomEvent"
1981
+ }
1982
+ },
1983
+ {
1984
+ "name": "open-change",
1985
+ "description": "Open state changed. detail: { open, reason }",
1986
+ "type": {
1987
+ "text": "CustomEvent"
1988
+ }
1989
+ }
1990
+ ],
1991
+ "slots": [
1992
+ {
1993
+ "name": "header",
1994
+ "description": "Replaces the default title/status header content"
1995
+ }
1996
+ ],
1997
+ "cssParts": [
1998
+ {
1999
+ "name": "window",
2000
+ "description": "The fixed panel window"
2001
+ },
2002
+ {
2003
+ "name": "header",
2004
+ "description": "Header row"
2005
+ },
2006
+ {
2007
+ "name": "body",
2008
+ "description": "Scrollable transcript area"
2009
+ },
2010
+ {
2011
+ "name": "messages",
2012
+ "description": "Message list (role=log)"
2013
+ },
2014
+ {
2015
+ "name": "suggestions",
2016
+ "description": "Suggestion chips row"
2017
+ },
2018
+ {
2019
+ "name": "composer",
2020
+ "description": "Composer footer"
2021
+ }
2022
+ ],
2023
+ "cssProperties": [
2024
+ {
2025
+ "name": "--chat-panel-width",
2026
+ "description": "Panel width (default min(420px, viewport-fit))"
2027
+ },
2028
+ {
2029
+ "name": "--chat-panel-height",
2030
+ "description": "Panel height (default min(640px, viewport-fit))"
2031
+ },
2032
+ {
2033
+ "name": "--chat-panel-inset",
2034
+ "description": "Distance from the viewport corner (default --size-6)"
2035
+ },
2036
+ {
2037
+ "name": "--chat-panel-z-index",
2038
+ "description": "Stacking order (default --z-fixed)"
2039
+ }
2040
+ ],
2041
+ "demos": [
2042
+ {
2043
+ "url": "",
2044
+ "description": "```html\n<ore-chat-panel id=\"advisor\" label=\"Model advisor\"></ore-chat-panel>\n<script type=\"module\">\n import '@vielzeug/refine/chat-panel';\n const panel = document.getElementById('advisor');\n panel.messages = [{ sender: 'assistant', text: 'Hi! What can I help with?' }];\n panel.addEventListener('send', (event) => {\n panel.messages = [\n ...panel.messages,\n { sender: 'user', text: event.detail.text },\n { sender: 'assistant', text: 'Let me look into that.' },\n ];\n });\n panel.show();\n</script>\n```"
2045
+ }
2046
+ ]
2047
+ },
1753
2048
  {
1754
2049
  "kind": "variable",
1755
2050
  "name": "CODE_WINDOW_TAG",
@@ -1757,14 +2052,14 @@
1757
2052
  "text": "'ore-code-window'"
1758
2053
  },
1759
2054
  "default": "'ore-code-window'",
1760
- "description": "A styled window chrome for code blocks and AI/MCP conversation flows.\n\nTwo variants:\n- `variant=\"code\"` (default) — language badge + optional filename header.\n- `variant=\"chat\"` — traffic-light dots + title header."
2055
+ "description": "A styled window chrome for code blocks and AI/MCP conversation flows.\n\nTwo variants:\n- `variant=\"code\"` (default): language badge + optional filename header.\n- `variant=\"chat\"`: traffic-light dots + title header."
1761
2056
  },
1762
2057
  {
1763
2058
  "kind": "class",
1764
2059
  "name": "OreCodeWindowElement",
1765
2060
  "tagName": "ore-code-window",
1766
2061
  "customElement": true,
1767
- "description": "A styled window chrome for code blocks and AI/MCP conversation flows.\nTwo variants:\n- `variant=\"code\"` (default) — language badge + optional filename header.\n- `variant=\"chat\"` — traffic-light dots + title header.",
2062
+ "description": "A styled window chrome for code blocks and AI/MCP conversation flows.\nTwo variants:\n- `variant=\"code\"` (default): language badge + optional filename header.\n- `variant=\"chat\"`: traffic-light dots + title header.",
1768
2063
  "summary": "",
1769
2064
  "attributes": [
1770
2065
  {
@@ -1993,24 +2288,6 @@
1993
2288
  }
1994
2289
  ]
1995
2290
  },
1996
- {
1997
- "kind": "function",
1998
- "name": "registerIcons",
1999
- "return": {
2000
- "type": {
2001
- "text": "void"
2002
- }
2003
- },
2004
- "parameters": [
2005
- {
2006
- "name": "icons",
2007
- "type": {
2008
- "text": "Record<string, IconNode>"
2009
- }
2010
- }
2011
- ],
2012
- "description": "Register additional icons (or override existing ones) by name.\nKeys may be kebab-case or PascalCase — both are accepted by `ore-icon`."
2013
- },
2014
2291
  {
2015
2292
  "kind": "variable",
2016
2293
  "name": "ICON_TAG",
@@ -2018,14 +2295,14 @@
2018
2295
  "text": "'ore-icon'"
2019
2296
  },
2020
2297
  "default": "'ore-icon'",
2021
- "description": "Icon wrapper for consistent Lucide rendering across Block."
2298
+ "description": "Icon wrapper for consistent Lucide rendering across Block.\n\nNames resolve from a synchronous registry: refine's own component icons are\nalways registered; apps register their set with `registerIcons()` or import\n`@vielzeug/refine/icon-lucide` for the complete library."
2022
2299
  },
2023
2300
  {
2024
2301
  "kind": "class",
2025
2302
  "name": "OreIconElement",
2026
2303
  "tagName": "ore-icon",
2027
2304
  "customElement": true,
2028
- "description": "Icon wrapper for consistent Lucide rendering across Block.",
2305
+ "description": "Icon wrapper for consistent Lucide rendering across Block.\nNames resolve from a synchronous registry: refine's own component icons are\nalways registered; apps register their set with `registerIcons()` or import\n`@vielzeug/refine/icon-lucide` for the complete library.",
2029
2306
  "summary": "",
2030
2307
  "attributes": [
2031
2308
  {
@@ -2033,7 +2310,7 @@
2033
2310
  "type": {
2034
2311
  "text": "string"
2035
2312
  },
2036
- "description": "Lucide icon name, e.g. `search` or `chevron-right`"
2313
+ "description": "Lucide icon name, e.g. `search` or `chevron-right`, resolved from the registered set"
2037
2314
  },
2038
2315
  {
2039
2316
  "name": "size",
@@ -2142,7 +2419,7 @@
2142
2419
  }
2143
2420
  }
2144
2421
  ],
2145
- "description": "The swipe-reveal-confirm gesture behind `ore-list-item`'s `actions-left`/`actions-right` slots\n— isolated here since it's the one genuinely tricky part of the component (three distance\nthresholds, inline style/attribute choreography during an active drag). Deliberately *not* a\nshared primitive: `createPanGesture` itself already is one (shared with `ore-toast`),\nbut this two-stage reveal/confirm layer on top of it has exactly one consumer today —\ngeneralizing it further would be speculative, not reusable.\n\nOnly sets/clears the `revealed`/`data-dragging`/`data-confirming` attributes and `--_swipe-x`\nstyle — it does not itself emit `reveal`/`conceal`. `ore-list-item` already watches `revealed`\nfor transitions (to cover *both* this gesture and a directly-set attribute uniformly), so this\nmodule setting the attribute is enough to drive both that watcher and `list.css`'s\n`[revealed]` styling."
2422
+ "description": "The swipe-reveal-confirm gesture behind `ore-list-item`'s `actions-left`/`actions-right` slots\n: isolated here since it's the one genuinely tricky part of the component (three distance\nthresholds, inline style/attribute choreography during an active drag). Deliberately *not* a\nshared primitive: `createPanGesture` itself already is one (shared with `ore-toast`),\nbut this two-stage reveal/confirm layer on top of it has exactly one consumer today :\ngeneralizing it further would be speculative, not reusable.\n\nOnly sets/clears the `revealed`/`data-dragging`/`data-confirming` attributes and `--_swipe-x`\nstyle: it does not itself emit `reveal`/`conceal`. `ore-list-item` already watches `revealed`\nfor transitions (to cover *both* this gesture and a directly-set attribute uniformly), so this\nmodule setting the attribute is enough to drive both that watcher and `list.css`'s\n`[revealed]` styling."
2146
2423
  },
2147
2424
  {
2148
2425
  "kind": "variable",
@@ -2151,14 +2428,14 @@
2151
2428
  "text": "'ore-list-item'"
2152
2429
  },
2153
2430
  "default": "'ore-list-item'",
2154
- "description": "A single row inside `ore-list`. Renders `leading`/default (title)/`description`/`trailing`\ncontent plus two off-canvas action panels (`actions-left`, `actions-right`) that a horizontal\npointer/touch swipe reveals — useful for mobile-style row actions (archive, delete, …). An\naction panel only opens if it actually has slotted content; swiping the other direction is a\nno-op. Revealed actions stay reachable from the keyboard (Tab focus on a slotted action button\nreveals its panel via `:focus-within`, independent of any gesture).\n\nSwiping past the reveal distance snaps the panel fully open on release; swiping further still —\npast the full-swipe-through distance — auto-confirms that side's action immediately (fires\n`confirm` and clicks the slot's first element), the same \"swipe all the way\" shortcut as iOS\nMail's delete gesture.\n\nClosing a revealed panel is deliberately one-directional: tap/click the row itself, tap outside\nthe item, or open a different item's panel. Reverse-swiping an already-open item is not\nsupported — see `ore-list`'s docs for the reasoning."
2431
+ "description": "A single row inside `ore-list`. Renders `leading`/default (title)/`description`/`trailing`\ncontent plus two off-canvas action panels (`actions-left`, `actions-right`) that a horizontal\npointer/touch swipe reveals: useful for mobile-style row actions (archive, delete, …). An\naction panel only opens if it actually has slotted content; swiping the other direction is a\nno-op. Revealed actions stay reachable from the keyboard (Tab focus on a slotted action button\nreveals its panel via `:focus-within`, independent of any gesture).\n\nSwiping past the reveal distance snaps the panel fully open on release; swiping further still :\npast the full-swipe-through distance: auto-confirms that side's action immediately (fires\n`confirm` and clicks the slot's first element), the same \"swipe all the way\" shortcut as iOS\nMail's delete gesture.\n\nClosing a revealed panel is deliberately one-directional: tap/click the row itself, tap outside\nthe item, or open a different item's panel. Reverse-swiping an already-open item is not\nsupported: see `ore-list`'s docs for the reasoning.\n\nOn hover-capable fine pointers, a hovered row peeks a few pixels of its first action panel\n(`--list-item-peek`, a fraction of the panel width) so the swipe affordance is discoverable\nwithout a gesture; touch discovers the swipe natively."
2155
2432
  },
2156
2433
  {
2157
2434
  "kind": "class",
2158
2435
  "name": "OreListItemElement",
2159
2436
  "tagName": "ore-list-item",
2160
2437
  "customElement": true,
2161
- "description": "A single row inside `ore-list`. Renders `leading`/default (title)/`description`/`trailing`\ncontent plus two off-canvas action panels (`actions-left`, `actions-right`) that a horizontal\npointer/touch swipe reveals — useful for mobile-style row actions (archive, delete, …). An\naction panel only opens if it actually has slotted content; swiping the other direction is a\nno-op. Revealed actions stay reachable from the keyboard (Tab focus on a slotted action button\nreveals its panel via `:focus-within`, independent of any gesture).\nSwiping past the reveal distance snaps the panel fully open on release; swiping further still —\npast the full-swipe-through distance — auto-confirms that side's action immediately (fires\n`confirm` and clicks the slot's first element), the same \"swipe all the way\" shortcut as iOS\nMail's delete gesture.\nClosing a revealed panel is deliberately one-directional: tap/click the row itself, tap outside\nthe item, or open a different item's panel. Reverse-swiping an already-open item is not\nsupported — see `ore-list`'s docs for the reasoning.",
2438
+ "description": "A single row inside `ore-list`. Renders `leading`/default (title)/`description`/`trailing`\ncontent plus two off-canvas action panels (`actions-left`, `actions-right`) that a horizontal\npointer/touch swipe reveals: useful for mobile-style row actions (archive, delete, …). An\naction panel only opens if it actually has slotted content; swiping the other direction is a\nno-op. Revealed actions stay reachable from the keyboard (Tab focus on a slotted action button\nreveals its panel via `:focus-within`, independent of any gesture).\nSwiping past the reveal distance snaps the panel fully open on release; swiping further still :\npast the full-swipe-through distance: auto-confirms that side's action immediately (fires\n`confirm` and clicks the slot's first element), the same \"swipe all the way\" shortcut as iOS\nMail's delete gesture.\nClosing a revealed panel is deliberately one-directional: tap/click the row itself, tap outside\nthe item, or open a different item's panel. Reverse-swiping an already-open item is not\nsupported: see `ore-list`'s docs for the reasoning.\nOn hover-capable fine pointers, a hovered row peeks a few pixels of its first action panel\n(`--list-item-peek`, a fraction of the panel width) so the swipe affordance is discoverable\nwithout a gesture; touch discovers the swipe natively.",
2162
2439
  "summary": "",
2163
2440
  "attributes": [
2164
2441
  {
@@ -2235,7 +2512,7 @@
2235
2512
  },
2236
2513
  {
2237
2514
  "name": "confirm",
2238
- "description": "Swiped all the way through — fires before the slotted action's own click. detail: { item: HTMLElement, side: 'left' | 'right' }",
2515
+ "description": "Swiped all the way through: fires before the slotted action's own click. detail: { item: HTMLElement, side: 'left' | 'right' }",
2239
2516
  "type": {
2240
2517
  "text": "CustomEvent"
2241
2518
  }
@@ -2306,6 +2583,10 @@
2306
2583
  "name": "--list-item-actions-width",
2307
2584
  "description": "Width of each action panel (default 6rem)"
2308
2585
  },
2586
+ {
2587
+ "name": "--list-item-peek",
2588
+ "description": "Hover-peek distance as a fraction of the action panel width (default 0.08; 0 disables the peek)"
2589
+ },
2309
2590
  {
2310
2591
  "name": "--list-item-bg",
2311
2592
  "description": "Row background color"
@@ -2338,14 +2619,14 @@
2338
2619
  "text": "'ore-list'"
2339
2620
  },
2340
2621
  "default": "'ore-list'",
2341
- "description": "A vertical list container for `ore-list-item` children — plain display list by default, or a\nkeyboard-navigable single-select listbox via `selectable`. Each item can independently reveal\na left/right action panel via touch/pointer swipe (see `ore-list-item`'s `actions-left`/\n`actions-right` slots) — useful for mobile-style row actions (archive, delete, …)."
2622
+ "description": "A vertical list container for `ore-list-item` children: plain display list by default, or a\nkeyboard-navigable single-select listbox via `selectable`. Each item can independently reveal\na left/right action panel via touch/pointer swipe (see `ore-list-item`'s `actions-left`/\n`actions-right` slots): useful for mobile-style row actions (archive, delete, …)."
2342
2623
  },
2343
2624
  {
2344
2625
  "kind": "class",
2345
2626
  "name": "OreListElement",
2346
2627
  "tagName": "ore-list",
2347
2628
  "customElement": true,
2348
- "description": "A vertical list container for `ore-list-item` children — plain display list by default, or a\nkeyboard-navigable single-select listbox via `selectable`. Each item can independently reveal\na left/right action panel via touch/pointer swipe (see `ore-list-item`'s `actions-left`/\n`actions-right` slots) — useful for mobile-style row actions (archive, delete, …).",
2629
+ "description": "A vertical list container for `ore-list-item` children: plain display list by default, or a\nkeyboard-navigable single-select listbox via `selectable`. Each item can independently reveal\na left/right action panel via touch/pointer swipe (see `ore-list-item`'s `actions-left`/\n`actions-right` slots): useful for mobile-style row actions (archive, delete, …).",
2349
2630
  "summary": "",
2350
2631
  "attributes": [
2351
2632
  {
@@ -2374,7 +2655,7 @@
2374
2655
  "type": {
2375
2656
  "text": "string"
2376
2657
  },
2377
- "description": "Selected item's value (only meaningful when `selectable`) — the single source of truth for selection"
2658
+ "description": "Selected item's value (only meaningful when `selectable`): the single source of truth for selection"
2378
2659
  },
2379
2660
  {
2380
2661
  "name": "variant",
@@ -2641,14 +2922,14 @@
2641
2922
  "text": "'ore-qr-code'"
2642
2923
  },
2643
2924
  "default": "'ore-qr-code'",
2644
- "description": "Renders a QR code for `value` as inline SVG — themeable via `currentColor`,\ncrisp at any scale, no canvas. On capacity errors the component shows an\nerror state and emits `error` rather than throwing."
2925
+ "description": "Renders a QR code for `value` as inline SVG: themeable via `currentColor`,\ncrisp at any scale, no canvas. On capacity errors the component shows an\nerror state and emits `error` rather than throwing."
2645
2926
  },
2646
2927
  {
2647
2928
  "kind": "class",
2648
2929
  "name": "OreQrCodeElement",
2649
2930
  "tagName": "ore-qr-code",
2650
2931
  "customElement": true,
2651
- "description": "Renders a QR code for `value` as inline SVG — themeable via `currentColor`,\ncrisp at any scale, no canvas. On capacity errors the component shows an\nerror state and emits `error` rather than throwing.",
2932
+ "description": "Renders a QR code for `value` as inline SVG: themeable via `currentColor`,\ncrisp at any scale, no canvas. On capacity errors the component shows an\nerror state and emits `error` rather than throwing.",
2652
2933
  "summary": "",
2653
2934
  "attributes": [
2654
2935
  {
@@ -2778,89 +3059,424 @@
2778
3059
  ],
2779
3060
  "demos": [
2780
3061
  {
2781
- "url": "",
2782
- "description": "```html\n<ore-qr-code value=\"https://example.com\"></ore-qr-code>\n<ore-qr-code value=\"otpauth://…\" error-correction=\"H\" size=\"256\"></ore-qr-code>\n```"
3062
+ "url": "",
3063
+ "description": "```html\n<ore-qr-code value=\"https://example.com\"></ore-qr-code>\n<ore-qr-code value=\"otpauth://…\" error-correction=\"H\" size=\"256\"></ore-qr-code>\n```"
3064
+ }
3065
+ ]
3066
+ },
3067
+ {
3068
+ "kind": "variable",
3069
+ "name": "RANK_ITEM_TAG",
3070
+ "type": {
3071
+ "text": "'ore-rank-item'"
3072
+ },
3073
+ "default": "'ore-rank-item'",
3074
+ "description": "A single ranked row inside `ore-rank-list`: a rank numeral, an optional `leading` slot\n(avatar, icon), the label, a secondary `description` line, and a right-aligned `trailing`\nvalue, with a proportional bar under the row sized against the largest sibling `value`.\nThe row is the whole visualization: the label and value stay text, so the ranking is\nreadable and accessible with the bar treated as reinforcement, never as the only carrier."
3075
+ },
3076
+ {
3077
+ "kind": "class",
3078
+ "name": "OreRankItemElement",
3079
+ "tagName": "ore-rank-item",
3080
+ "customElement": true,
3081
+ "description": "A single ranked row inside `ore-rank-list`: a rank numeral, an optional `leading` slot\n(avatar, icon), the label, a secondary `description` line, and a right-aligned `trailing`\nvalue, with a proportional bar under the row sized against the largest sibling `value`.\nThe row is the whole visualization: the label and value stay text, so the ranking is\nreadable and accessible with the bar treated as reinforcement, never as the only carrier.",
3082
+ "summary": "",
3083
+ "attributes": [
3084
+ {
3085
+ "name": "bar",
3086
+ "type": {
3087
+ "text": "boolean"
3088
+ },
3089
+ "description": "Show the proportional bar (default). Disable with `bar=\"false\"` for non-count rows."
3090
+ },
3091
+ {
3092
+ "name": "rank",
3093
+ "type": {
3094
+ "text": "number"
3095
+ },
3096
+ "description": "Rank position: assigned automatically by the parent list in DOM order; manual values are overwritten."
3097
+ },
3098
+ {
3099
+ "name": "value",
3100
+ "type": {
3101
+ "text": "number"
3102
+ },
3103
+ "description": "The row's numeric value: sizes the bar against the largest sibling, and is the formatted display when no `trailing` slot is present."
3104
+ }
3105
+ ],
3106
+ "slots": [
3107
+ {
3108
+ "name": "leading",
3109
+ "description": "Content before the label (e.g. avatar, icon)"
3110
+ },
3111
+ {
3112
+ "name": "",
3113
+ "description": "Item label"
3114
+ },
3115
+ {
3116
+ "name": "description",
3117
+ "description": "Secondary line below the label (e.g. sample count)"
3118
+ },
3119
+ {
3120
+ "name": "trailing",
3121
+ "description": "Right-aligned value display; replaces the formatted `value`"
3122
+ }
3123
+ ],
3124
+ "cssParts": [
3125
+ {
3126
+ "name": "row",
3127
+ "description": "The text row (rank, leading, label, trailing)"
3128
+ },
3129
+ {
3130
+ "name": "rank",
3131
+ "description": "The rank numeral (aria-hidden: the list order carries it)"
3132
+ },
3133
+ {
3134
+ "name": "leading",
3135
+ "description": "The leading slot container"
3136
+ },
3137
+ {
3138
+ "name": "content",
3139
+ "description": "The label + description container"
3140
+ },
3141
+ {
3142
+ "name": "label",
3143
+ "description": "The label slot container"
3144
+ },
3145
+ {
3146
+ "name": "description",
3147
+ "description": "The description slot container"
3148
+ },
3149
+ {
3150
+ "name": "trailing",
3151
+ "description": "The trailing value container"
3152
+ },
3153
+ {
3154
+ "name": "bar",
3155
+ "description": "The bar track"
3156
+ },
3157
+ {
3158
+ "name": "bar-fill",
3159
+ "description": "The bar fill"
3160
+ }
3161
+ ],
3162
+ "cssProperties": [
3163
+ {
3164
+ "name": "--rank-number-color",
3165
+ "description": "Rank numeral color (default --color-contrast-500)"
3166
+ },
3167
+ {
3168
+ "name": "--rank-number-width",
3169
+ "description": "Rank numeral column width (default --size-6)"
3170
+ },
3171
+ {
3172
+ "name": "--rank-bar-color",
3173
+ "description": "Bar fill color (default --color-primary)"
3174
+ },
3175
+ {
3176
+ "name": "--rank-track-color",
3177
+ "description": "Bar track color (default --color-contrast-100)"
3178
+ },
3179
+ {
3180
+ "name": "--rank-bar-height",
3181
+ "description": "Bar height (default --size-1)"
3182
+ }
3183
+ ],
3184
+ "demos": [
3185
+ {
3186
+ "url": "",
3187
+ "description": "```html\n<ore-rank-item value=\"8\">\n <ore-avatar slot=\"leading\" src=\"alex.png\" alt=\"\" rounded=\"full\" size=\"sm\"></ore-avatar>\n Alex\n</ore-rank-item>\n<ore-rank-item value=\"6\" bar=\"false\">\n Overview\n <span slot=\"description\">4 timed sessions</span>\n <span slot=\"trailing\">24m 11s</span>\n</ore-rank-item>\n```"
3188
+ }
3189
+ ]
3190
+ },
3191
+ {
3192
+ "kind": "variable",
3193
+ "name": "RANK_CTX",
3194
+ "description": "Injection key for the rank context."
3195
+ },
3196
+ {
3197
+ "kind": "variable",
3198
+ "name": "RANK_LIST_TAG",
3199
+ "type": {
3200
+ "text": "'ore-rank-list'"
3201
+ },
3202
+ "default": "'ore-rank-list'",
3203
+ "description": "A ranked display list: an ordered set of `ore-rank-item` rows where each row's proportional\nbar makes the ranking scannable without a separate chart. The list itself owns the two\nfacts an item cannot know on its own: the position of each row (assigned back to the item\nas its `rank` prop, in DOM order) and the scale every bar is measured against (the largest\nchild `value`, shared through context).\n\nThis is a read-only data display, not a selection control: rows never receive interactive\nstate. Order the items yourself before rendering: the list numbers them, it does not sort\nthem."
3204
+ },
3205
+ {
3206
+ "kind": "class",
3207
+ "name": "OreRankListElement",
3208
+ "tagName": "ore-rank-list",
3209
+ "customElement": true,
3210
+ "description": "A ranked display list: an ordered set of `ore-rank-item` rows where each row's proportional\nbar makes the ranking scannable without a separate chart. The list itself owns the two\nfacts an item cannot know on its own: the position of each row (assigned back to the item\nas its `rank` prop, in DOM order) and the scale every bar is measured against (the largest\nchild `value`, shared through context).\nThis is a read-only data display, not a selection control: rows never receive interactive\nstate. Order the items yourself before rendering: the list numbers them, it does not sort\nthem.",
3211
+ "summary": "",
3212
+ "slots": [
3213
+ {
3214
+ "name": "",
3215
+ "description": "`ore-rank-item` elements as direct children"
3216
+ }
3217
+ ],
3218
+ "cssProperties": [
3219
+ {
3220
+ "name": "--rank-list-gap",
3221
+ "description": "Vertical gap between rows (default --size-1)"
3222
+ }
3223
+ ],
3224
+ "demos": [
3225
+ {
3226
+ "url": "",
3227
+ "description": "```html\n<ore-rank-list aria-label=\"Most visited pages\">\n <ore-rank-item value=\"8\">Documentation</ore-rank-item>\n <ore-rank-item value=\"6\">Pricing</ore-rank-item>\n <ore-rank-item value=\"2\" bar=\"false\">Blog<span slot=\"trailing\">18m 24s</span></ore-rank-item>\n</ore-rank-list>\n```"
3228
+ }
3229
+ ]
3230
+ },
3231
+ {
3232
+ "kind": "variable",
3233
+ "name": "SEPARATOR_TAG",
3234
+ "type": {
3235
+ "text": "'ore-separator'"
3236
+ },
3237
+ "default": "'ore-separator'",
3238
+ "description": "A simple visual divider between sections of content."
3239
+ },
3240
+ {
3241
+ "kind": "class",
3242
+ "name": "OreSeparatorElement",
3243
+ "tagName": "ore-separator",
3244
+ "customElement": true,
3245
+ "description": "A simple visual divider between sections of content.",
3246
+ "summary": "",
3247
+ "attributes": [
3248
+ {
3249
+ "name": "orientation",
3250
+ "type": {
3251
+ "text": "string"
3252
+ },
3253
+ "description": "'horizontal' (default) | 'vertical'"
3254
+ },
3255
+ {
3256
+ "name": "decorative",
3257
+ "type": {
3258
+ "text": "boolean"
3259
+ },
3260
+ "description": "When true (default), aria-hidden is applied"
3261
+ },
3262
+ {
3263
+ "name": "label",
3264
+ "type": {
3265
+ "text": "string"
3266
+ },
3267
+ "description": "Optional centered label text"
3268
+ },
3269
+ {
3270
+ "name": "color",
3271
+ "type": {
3272
+ "text": "'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'"
3273
+ },
3274
+ "description": "Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'"
3275
+ }
3276
+ ],
3277
+ "cssParts": [
3278
+ {
3279
+ "name": "wrapper",
3280
+ "description": "Root wrapper container."
3281
+ },
3282
+ {
3283
+ "name": "separator",
3284
+ "description": "Separator element."
3285
+ },
3286
+ {
3287
+ "name": "label",
3288
+ "description": "Label element."
3289
+ }
3290
+ ],
3291
+ "cssProperties": [
3292
+ {
3293
+ "name": "--separator-color",
3294
+ "description": "Line color"
3295
+ },
3296
+ {
3297
+ "name": "--separator-size",
3298
+ "description": "Line thickness"
3299
+ },
3300
+ {
3301
+ "name": "--separator-spacing",
3302
+ "description": "Vertical margin"
3303
+ }
3304
+ ],
3305
+ "demos": [
3306
+ {
3307
+ "url": "",
3308
+ "description": "```html\n<ore-separator></ore-separator>\n<ore-separator label=\"or\"></ore-separator>\n<ore-separator orientation=\"vertical\"></ore-separator>\n```"
3309
+ }
3310
+ ]
3311
+ },
3312
+ {
3313
+ "kind": "variable",
3314
+ "name": "SPEECH_RATES",
3315
+ "type": {
3316
+ "text": "[1, 0.85, 1.15]"
3317
+ },
3318
+ "default": "[1, 0.85, 1.15]",
3319
+ "description": "The rate steps the speed control cycles through: normal, slow, fast."
3320
+ },
3321
+ {
3322
+ "kind": "function",
3323
+ "name": "speechSentences",
3324
+ "return": {
3325
+ "type": {
3326
+ "text": "string[]"
3327
+ }
3328
+ },
3329
+ "parameters": [
3330
+ {
3331
+ "name": "text",
3332
+ "type": {
3333
+ "text": "string"
3334
+ }
2783
3335
  }
2784
- ]
3336
+ ],
3337
+ "description": "The entry's sentences: prose ends . ! or ?, closing quotes belong to the sentence\nthey end, and an unterminated tail is still a sentence. Consumers that highlight what\nis being read build their display from this same list, so `progress` sentence indexes\nmap onto their own."
2785
3338
  },
2786
3339
  {
2787
3340
  "kind": "variable",
2788
- "name": "SEPARATOR_TAG",
3341
+ "name": "SPEECH_PLAYER_TAG",
2789
3342
  "type": {
2790
- "text": "'ore-separator'"
3343
+ "text": "'ore-speech-player'"
2791
3344
  },
2792
- "default": "'ore-separator'",
2793
- "description": "A simple visual divider between sections of content."
3345
+ "default": "'ore-speech-player'",
3346
+ "description": "A text-to-speech player control: reads its `text` aloud through the Web Speech API.\n\nRenders a labeled play/pause toggle (the label folds away once engaged), a stop\ncontrol beside it that appears while reading, and a speed control cycling\nnormal/slow/fast. The text is spoken sentence by sentence (long sentences split into pieces under the\nengine's truncation window), the `state` attribute reflects playback, a\n`role=\"status\"` live region announces transitions, and `progress` events name the\nsentence being read so a consumer can highlight it. Only one player speaks at a\ntime: starting one stops any other. `resume-at` names the sentence to begin from,\nso a persisted position makes resume mean it."
2794
3347
  },
2795
3348
  {
2796
3349
  "kind": "class",
2797
- "name": "OreSeparatorElement",
2798
- "tagName": "ore-separator",
3350
+ "name": "OreSpeechPlayerElement",
3351
+ "tagName": "ore-speech-player",
2799
3352
  "customElement": true,
2800
- "description": "A simple visual divider between sections of content.",
3353
+ "description": "A text-to-speech player control: reads its `text` aloud through the Web Speech API.\nRenders a labeled play/pause toggle (the label folds away once engaged), a stop\ncontrol beside it that appears while reading, and a speed control cycling\nnormal/slow/fast. The text is spoken sentence by sentence (long sentences split into pieces under the\nengine's truncation window), the `state` attribute reflects playback, a\n`role=\"status\"` live region announces transitions, and `progress` events name the\nsentence being read so a consumer can highlight it. Only one player speaks at a\ntime: starting one stops any other. `resume-at` names the sentence to begin from,\nso a persisted position makes resume mean it.",
2801
3354
  "summary": "",
2802
3355
  "attributes": [
2803
3356
  {
2804
- "name": "orientation",
3357
+ "name": "text",
2805
3358
  "type": {
2806
3359
  "text": "string"
2807
3360
  },
2808
- "description": "'horizontal' (default) | 'vertical'"
3361
+ "description": "The text to read aloud (also settable as a JavaScript property)"
2809
3362
  },
2810
3363
  {
2811
- "name": "decorative",
3364
+ "name": "lang",
2812
3365
  "type": {
2813
- "text": "boolean"
3366
+ "text": "string"
2814
3367
  },
2815
- "description": "When true (default), aria-hidden is applied"
3368
+ "description": "BCP-47 tag of `text`'s language, e.g. `en` or `de-DE`"
2816
3369
  },
2817
3370
  {
2818
- "name": "label",
3371
+ "name": "state",
2819
3372
  "type": {
2820
- "text": "string"
3373
+ "text": "'idle' | 'playing' | 'paused' | 'unsupported'"
2821
3374
  },
2822
- "description": "Optional centered label text"
3375
+ "description": "Reflected playback state: 'idle' | 'playing' | 'paused' | 'unsupported'"
2823
3376
  },
2824
3377
  {
2825
- "name": "color",
3378
+ "name": "rate",
2826
3379
  "type": {
2827
- "text": "'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'"
3380
+ "text": "number"
2828
3381
  },
2829
- "description": "Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'"
3382
+ "description": "Playback rate; the speed control cycles 1 → 0.85 → 1.15"
3383
+ },
3384
+ {
3385
+ "name": "resume-at",
3386
+ "type": {
3387
+ "text": "number"
3388
+ },
3389
+ "description": "The sentence index playback begins from"
3390
+ }
3391
+ ],
3392
+ "events": [
3393
+ {
3394
+ "name": "play",
3395
+ "description": "Reading started. No detail.",
3396
+ "type": {
3397
+ "text": "CustomEvent"
3398
+ }
3399
+ },
3400
+ {
3401
+ "name": "progress",
3402
+ "description": "A sentence began. detail: { sentence, total }",
3403
+ "type": {
3404
+ "text": "CustomEvent"
3405
+ }
3406
+ },
3407
+ {
3408
+ "name": "stop",
3409
+ "description": "Reading stopped before finishing. No detail.",
3410
+ "type": {
3411
+ "text": "CustomEvent"
3412
+ }
3413
+ },
3414
+ {
3415
+ "name": "end",
3416
+ "description": "Reading finished on its own. No detail.",
3417
+ "type": {
3418
+ "text": "CustomEvent"
3419
+ }
3420
+ },
3421
+ {
3422
+ "name": "error",
3423
+ "description": "The engine failed mid-read. No detail.",
3424
+ "type": {
3425
+ "text": "CustomEvent"
3426
+ }
3427
+ },
3428
+ {
3429
+ "name": "rate-change",
3430
+ "description": "The speed control moved to a new step. detail: { rate }",
3431
+ "type": {
3432
+ "text": "CustomEvent"
3433
+ }
2830
3434
  }
2831
3435
  ],
2832
3436
  "cssParts": [
2833
3437
  {
2834
- "name": "wrapper",
2835
- "description": "Root wrapper container."
3438
+ "name": "player",
3439
+ "description": "Outer control group"
2836
3440
  },
2837
3441
  {
2838
- "name": "separator",
2839
- "description": "Separator element."
3442
+ "name": "play",
3443
+ "description": "The play/pause toggle button"
2840
3444
  },
2841
3445
  {
2842
- "name": "label",
2843
- "description": "Label element."
3446
+ "name": "rate",
3447
+ "description": "The speed control"
3448
+ },
3449
+ {
3450
+ "name": "stop",
3451
+ "description": "The stop button (hidden while idle)"
2844
3452
  }
2845
3453
  ],
2846
3454
  "cssProperties": [
2847
3455
  {
2848
- "name": "--separator-color",
2849
- "description": "Line color"
3456
+ "name": "--speech-player-gap",
3457
+ "description": "Gap between the controls"
2850
3458
  },
2851
3459
  {
2852
- "name": "--separator-size",
2853
- "description": "Line thickness"
3460
+ "name": "--speech-player-control-size",
3461
+ "description": "Each control's hit-area size (the toggle grows with its label)"
2854
3462
  },
2855
3463
  {
2856
- "name": "--separator-spacing",
2857
- "description": "Vertical margin"
3464
+ "name": "--speech-player-icon-color",
3465
+ "description": "Control icon color at rest"
3466
+ },
3467
+ {
3468
+ "name": "--speech-player-active-color",
3469
+ "description": "Toggle color while reading (playing or paused)"
3470
+ },
3471
+ {
3472
+ "name": "--speech-player-hover-bg",
3473
+ "description": "Control background on hover"
2858
3474
  }
2859
3475
  ],
2860
3476
  "demos": [
2861
3477
  {
2862
3478
  "url": "",
2863
- "description": "```html\n<ore-separator></ore-separator>\n<ore-separator label=\"or\"></ore-separator>\n<ore-separator orientation=\"vertical\"></ore-separator>\n```"
3479
+ "description": "```html\n<ore-speech-player text=\"The valley sleeps under ash.\"></ore-speech-player>\n<ore-speech-player lang=\"de\" text=\"Das Tal schläft unter Asche.\"></ore-speech-player>\n```"
2864
3480
  }
2865
3481
  ]
2866
3482
  },
@@ -3105,14 +3721,14 @@
3105
3721
  "text": "'ore-step'"
3106
3722
  },
3107
3723
  "default": "'ore-step'",
3108
- "description": "A single step trigger. Must be placed as a direct child of `ore-stepper`, which provides\nthis step's current/completed/navigable/index/total state via context — those are derived,\nread-only attributes on this element, not settable props."
3724
+ "description": "A single step trigger. Must be placed as a direct child of `ore-stepper`, which provides\nthis step's current/completed/navigable/index/total state via context: those are derived,\nread-only attributes on this element, not settable props."
3109
3725
  },
3110
3726
  {
3111
3727
  "kind": "class",
3112
3728
  "name": "OreStepElement",
3113
3729
  "tagName": "ore-step",
3114
3730
  "customElement": true,
3115
- "description": "A single step trigger. Must be placed as a direct child of `ore-stepper`, which provides\nthis step's current/completed/navigable/index/total state via context — those are derived,\nread-only attributes on this element, not settable props.",
3731
+ "description": "A single step trigger. Must be placed as a direct child of `ore-stepper`, which provides\nthis step's current/completed/navigable/index/total state via context: those are derived,\nread-only attributes on this element, not settable props.",
3116
3732
  "summary": "",
3117
3733
  "attributes": [
3118
3734
  {
@@ -3497,14 +4113,14 @@
3497
4113
  "text": "'ore-table'"
3498
4114
  },
3499
4115
  "default": "'ore-table'",
3500
- "description": "Data table component.\n\nReads light-DOM `<ore-tr>`/`<ore-th>`/`<ore-td>` markers and projects them\ninto a fully-native shadow `<table>`. Cell attributes (`colspan`, `rowspan`,\n`scope`, etc.) are mirrored. Changes are observed and synced incrementally.\n\nNative table features — sticky headers, colspan/rowspan, the table layout\nalgorithm — all work because the shadow tree contains real table elements."
4116
+ "description": "Data table component.\n\nReads light-DOM `<ore-tr>`/`<ore-th>`/`<ore-td>` markers and projects them\ninto a fully-native shadow `<table>`. Cell attributes (`colspan`, `rowspan`,\n`scope`, etc.) are mirrored. Changes are observed and synced incrementally.\n\nNative table features: sticky headers, colspan/rowspan, the table layout\nalgorithm: all work because the shadow tree contains real table elements."
3501
4117
  },
3502
4118
  {
3503
4119
  "kind": "class",
3504
4120
  "name": "OreTableElement",
3505
4121
  "tagName": "ore-table",
3506
4122
  "customElement": true,
3507
- "description": "Data table component.\nReads light-DOM `<ore-tr>`/`<ore-th>`/`<ore-td>` markers and projects them\ninto a fully-native shadow `<table>`. Cell attributes (`colspan`, `rowspan`,\n`scope`, etc.) are mirrored. Changes are observed and synced incrementally.\nNative table features — sticky headers, colspan/rowspan, the table layout\nalgorithm — all work because the shadow tree contains real table elements.",
4123
+ "description": "Data table component.\nReads light-DOM `<ore-tr>`/`<ore-th>`/`<ore-td>` markers and projects them\ninto a fully-native shadow `<table>`. Cell attributes (`colspan`, `rowspan`,\n`scope`, etc.) are mirrored. Changes are observed and synced incrementally.\nNative table features: sticky headers, colspan/rowspan, the table layout\nalgorithm: all work because the shadow tree contains real table elements.",
3508
4124
  "summary": "",
3509
4125
  "attributes": [
3510
4126
  {
@@ -4022,6 +4638,22 @@
4022
4638
  {
4023
4639
  "name": "--accordion-item-summary-padding",
4024
4640
  "description": "Content padding"
4641
+ },
4642
+ {
4643
+ "name": "--accordion-item-row-duration",
4644
+ "description": "Expand/collapse row transition duration (default 200ms)"
4645
+ },
4646
+ {
4647
+ "name": "--accordion-item-fade-duration",
4648
+ "description": "Content fade duration (default 200ms)"
4649
+ },
4650
+ {
4651
+ "name": "--accordion-item-fade-delay",
4652
+ "description": "Content fade delay after the row starts (default 60ms)"
4653
+ },
4654
+ {
4655
+ "name": "--accordion-item-collapse-delay",
4656
+ "description": "Delay before the row collapses after the close fade (default 120ms)"
4025
4657
  }
4026
4658
  ],
4027
4659
  "demos": [
@@ -4850,7 +5482,7 @@
4850
5482
  "type": {
4851
5483
  "text": "string"
4852
5484
  },
4853
- "description": "Content layout: 'inline' (default) | 'stacked' — stacked places the icon above a wrapping label, for tile-like selectable chips"
5485
+ "description": "Content layout: 'inline' (default) | 'stacked': stacked places the icon above a wrapping label, for tile-like selectable chips"
4854
5486
  },
4855
5487
  {
4856
5488
  "name": "disabled",
@@ -5009,6 +5641,96 @@
5009
5641
  }
5010
5642
  ]
5011
5643
  },
5644
+ {
5645
+ "kind": "variable",
5646
+ "name": "COOKIE_BANNER_TAG",
5647
+ "type": {
5648
+ "text": "'ore-cookie-banner'"
5649
+ },
5650
+ "default": "'ore-cookie-banner'",
5651
+ "description": "A fixed-position consent banner for cookie/tracker opt-in: a short policy text\n(default slot, links included), optional per-category opt-in checkboxes with\ndescriptions, and accept-all / reject / save actions.\n\nThe layout is a single column: heading, policy text, a scrollable category\npanel, and actions, that scales linearly from one to many categories. Each\ncategory renders as a checkbox row; its optional `description` passes through\nthe checkbox's `helper` mechanism, so it is both visible below the label and\nlinked to the control via `aria-describedby`. The category panel scrolls\ninternally when it exceeds `--cookie-banner-categories-max-height`, so the\nbanner itself never grows past the viewport.\n\nThe banner owns presentation only. It never stores anything: listen for `decide`,\npersist the emitted record yourself (localStorage, a CMP, your own backend), and\ngate third-party embeds on it. The banner hides itself after `decide` unless\n`hide-on-decide` is set to false. Call `show()` again to let the user revise\ntheir choice.\n\nThe banner is a non-modal `role=\"dialog\"`: screen readers announce it when it\nappears, focus moves to the dialog card itself on `show()`: a neutral target,\nso no action is preselected for keyboard users, and returns to the previously\nfocused element on `hide()`. A banner that is simply present at page load (never\nshown via `show()`) does not steal focus and is not announced; consumers that\nwant a load-time announcement should call `show()` from a user gesture.\n\nThe `decide` record contains exactly the currently configured category ids\n(plus `essential`, always true). Replace: do not merge: the stored record\nwith it, so categories removed between sessions drop their stale keys."
5652
+ },
5653
+ {
5654
+ "kind": "class",
5655
+ "name": "OreCookieBannerElement",
5656
+ "tagName": "ore-cookie-banner",
5657
+ "customElement": true,
5658
+ "description": "A fixed-position consent banner for cookie/tracker opt-in: a short policy text\n(default slot, links included), optional per-category opt-in checkboxes with\ndescriptions, and accept-all / reject / save actions.\nThe layout is a single column: heading, policy text, a scrollable category\npanel, and actions, that scales linearly from one to many categories. Each\ncategory renders as a checkbox row; its optional `description` passes through\nthe checkbox's `helper` mechanism, so it is both visible below the label and\nlinked to the control via `aria-describedby`. The category panel scrolls\ninternally when it exceeds `--cookie-banner-categories-max-height`, so the\nbanner itself never grows past the viewport.\nThe banner owns presentation only. It never stores anything: listen for `decide`,\npersist the emitted record yourself (localStorage, a CMP, your own backend), and\ngate third-party embeds on it. The banner hides itself after `decide` unless\n`hide-on-decide` is set to false. Call `show()` again to let the user revise\ntheir choice.\nThe banner is a non-modal `role=\"dialog\"`: screen readers announce it when it\nappears, focus moves to the dialog card itself on `show()`: a neutral target,\nso no action is preselected for keyboard users, and returns to the previously\nfocused element on `hide()`. A banner that is simply present at page load (never\nshown via `show()`) does not steal focus and is not announced; consumers that\nwant a load-time announcement should call `show()` from a user gesture.\nThe `decide` record contains exactly the currently configured category ids\n(plus `essential`, always true). Replace: do not merge: the stored record\nwith it, so categories removed between sessions drop their stale keys.",
5659
+ "summary": "",
5660
+ "attributes": [
5661
+ {
5662
+ "name": "position",
5663
+ "type": {
5664
+ "text": "string"
5665
+ },
5666
+ "description": "Viewport edge: 'bottom' (default) | 'top'"
5667
+ },
5668
+ {
5669
+ "name": "hide-on-decide",
5670
+ "type": {
5671
+ "text": "boolean"
5672
+ },
5673
+ "description": "Hides the banner after `decide` (default true)"
5674
+ }
5675
+ ],
5676
+ "events": [
5677
+ {
5678
+ "name": "decide",
5679
+ "description": "A decision was made. detail: { consent }: every category id plus `essential`, always true.",
5680
+ "type": {
5681
+ "text": "CustomEvent"
5682
+ }
5683
+ }
5684
+ ],
5685
+ "slots": [
5686
+ {
5687
+ "name": "",
5688
+ "description": "Policy text, including links to the privacy policy and imprint"
5689
+ }
5690
+ ],
5691
+ "cssParts": [
5692
+ {
5693
+ "name": "banner",
5694
+ "description": "The banner card"
5695
+ },
5696
+ {
5697
+ "name": "text",
5698
+ "description": "The slot wrapper for the policy text"
5699
+ },
5700
+ {
5701
+ "name": "categories",
5702
+ "description": "The scrollable category panel"
5703
+ },
5704
+ {
5705
+ "name": "actions",
5706
+ "description": "The action buttons"
5707
+ }
5708
+ ],
5709
+ "cssProperties": [
5710
+ {
5711
+ "name": "--cookie-banner-width",
5712
+ "description": "Maximum width of the banner card (default min(560px, viewport-fit))"
5713
+ },
5714
+ {
5715
+ "name": "--cookie-banner-inset",
5716
+ "description": "Distance from the viewport edges (default --size-4)"
5717
+ },
5718
+ {
5719
+ "name": "--cookie-banner-z-index",
5720
+ "description": "Stacking order (default --z-modal)"
5721
+ },
5722
+ {
5723
+ "name": "--cookie-banner-categories-max-height",
5724
+ "description": "Category panel scroll threshold (default 16rem)"
5725
+ }
5726
+ ],
5727
+ "demos": [
5728
+ {
5729
+ "url": "",
5730
+ "description": "```html\n<ore-cookie-banner>\n We use cookies to keep you logged in and, with your consent, to embed music\n from YouTube. <a href=\"/privacy\">Privacy policy</a>.\n</ore-cookie-banner>\n<script type=\"module\">\n import '@vielzeug/refine/cookie-banner';\n const banner = document.querySelector('ore-cookie-banner');\n banner.categories = [\n { id: 'music', label: 'Music embeds', description: 'Embed music from YouTube' },\n { id: 'stats', label: 'Statistics', description: 'Anonymous usage analytics' },\n ];\n banner.addEventListener('decide', (event) => {\n localStorage.setItem('consent', JSON.stringify(event.detail.consent));\n });\n</script>\n```"
5731
+ }
5732
+ ]
5733
+ },
5012
5734
  {
5013
5735
  "kind": "variable",
5014
5736
  "name": "PASSWORD_STRENGTH_TAG",
@@ -5412,7 +6134,7 @@
5412
6134
  "name": "OreToastElement",
5413
6135
  "tagName": "ore-toast",
5414
6136
  "customElement": true,
5415
- "description": "Declarative toast host. It subscribes to the service for its scope and\nrenders notifications, but has no imperative mutation API of its own.\nNotifications render as a vertical list (newest nearest the anchored edge)\ninside polite and assertive live regions. Entries are keyed by id, so store\nupdates (timer pauses, message updates, phase changes) patch the existing\nDOM instead of re-creating it — focus, in-flight gestures, and CSS\ntransitions all survive.",
6137
+ "description": "Declarative toast host. It subscribes to the service for its scope and\nrenders notifications, but has no imperative mutation API of its own.\nNotifications render as a vertical list (newest nearest the anchored edge)\ninside polite and assertive live regions. Entries are keyed by id, so store\nupdates (timer pauses, message updates, phase changes) patch the existing\nDOM instead of re-creating it: focus, in-flight gestures, and CSS\ntransitions all survive.",
5416
6138
  "summary": "",
5417
6139
  "attributes": [
5418
6140
  {
@@ -5473,6 +6195,10 @@
5473
6195
  "name": "--toast-progress-height",
5474
6196
  "description": "Height of the auto-dismiss progress bar."
5475
6197
  },
6198
+ {
6199
+ "name": "--toast-snackbar-height",
6200
+ "description": "Snackbar message row height, action or not (default --size-8)."
6201
+ },
5476
6202
  {
5477
6203
  "name": "--toast-inset-top / --toast-inset-bottom / --toast-inset-left / --toast-inset-right",
5478
6204
  "description": "Viewport insets."
@@ -5514,14 +6240,14 @@
5514
6240
  "text": "'ore-typing-indicator'"
5515
6241
  },
5516
6242
  "default": "'ore-typing-indicator'",
5517
- "description": "Three bouncing dots signaling that the other side of a conversation is composing a reply —\nthe moment before any content exists. For a message whose content is already streaming in,\nuse `ore-chat-message`'s `streaming` attribute (a blinking cursor) instead.\n\nThe dots are decorative (`aria-hidden`) — `label` is the entire accessibility contract,\nannounced through the shared singleton live region (`core/announcer.ts`) rather than a\nstatic `aria-live` element in the template. A live region populated in the same paint as\nits own insertion is unreliable across browsers/screen readers; routing through the shared\nannouncer (pre-existing region, clear-then-set, document-scoped) is the same pattern\nalready used for other transient status messages across this package."
6243
+ "description": "Three bouncing dots signaling that the other side of a conversation is composing a reply :\nthe moment before any content exists. For a message whose content is already streaming in,\nuse `ore-chat-message`'s `streaming` attribute (a blinking cursor) instead.\n\nThe dots are decorative (`aria-hidden`): `label` is the entire accessibility contract,\nannounced through the shared singleton live region (`core/announcer.ts`) rather than a\nstatic `aria-live` element in the template. A live region populated in the same paint as\nits own insertion is unreliable across browsers/screen readers; routing through the shared\nannouncer (pre-existing region, clear-then-set, document-scoped) is the same pattern\nalready used for other transient status messages across this package."
5518
6244
  },
5519
6245
  {
5520
6246
  "kind": "class",
5521
6247
  "name": "OreTypingIndicatorElement",
5522
6248
  "tagName": "ore-typing-indicator",
5523
6249
  "customElement": true,
5524
- "description": "Three bouncing dots signaling that the other side of a conversation is composing a reply —\nthe moment before any content exists. For a message whose content is already streaming in,\nuse `ore-chat-message`'s `streaming` attribute (a blinking cursor) instead.\nThe dots are decorative (`aria-hidden`) — `label` is the entire accessibility contract,\nannounced through the shared singleton live region (`core/announcer.ts`) rather than a\nstatic `aria-live` element in the template. A live region populated in the same paint as\nits own insertion is unreliable across browsers/screen readers; routing through the shared\nannouncer (pre-existing region, clear-then-set, document-scoped) is the same pattern\nalready used for other transient status messages across this package.",
6250
+ "description": "Three bouncing dots signaling that the other side of a conversation is composing a reply :\nthe moment before any content exists. For a message whose content is already streaming in,\nuse `ore-chat-message`'s `streaming` attribute (a blinking cursor) instead.\nThe dots are decorative (`aria-hidden`): `label` is the entire accessibility contract,\nannounced through the shared singleton live region (`core/announcer.ts`) rather than a\nstatic `aria-live` element in the template. A live region populated in the same paint as\nits own insertion is unreliable across browsers/screen readers; routing through the shared\nannouncer (pre-existing region, clear-then-set, document-scoped) is the same pattern\nalready used for other transient status messages across this package.",
5525
6251
  "summary": "",
5526
6252
  "attributes": [
5527
6253
  {
@@ -6537,14 +7263,14 @@
6537
7263
  "text": "'ore-counter'"
6538
7264
  },
6539
7265
  "default": "'ore-counter'",
6540
- "description": "A large-target tally control for counting things at a glance: `−` / value / `+` with an\noptional icon, label and hint. Designed for touch and arm's-length use (tabletop trackers,\ninventories, scoreboards) rather than typed form entry — use `ore-number-input` for that.\n\nHolding any button auto-repeats. The value is announced through a live region and is\nkeyboard-operable as a spinbutton (Arrow keys, Home/End, Page Up/Down). Set `quick-steps` to add an\nouter pair of buttons that move by `large-step`, for values that change in chunks (damage, scores)."
7266
+ "description": "A large-target tally control for counting things at a glance: `−` / value / `+` with an\noptional icon, label and hint. Designed for touch and arm's-length use (tabletop trackers,\ninventories, scoreboards) rather than typed form entry: use `ore-number-input` for that.\n\nHolding any button auto-repeats. The value is announced through a live region and is\nkeyboard-operable as a spinbutton (Arrow keys, Home/End, Page Up/Down). Set `quick-steps` to add an\nouter pair of buttons that move by `large-step`, for values that change in chunks (damage, scores)."
6541
7267
  },
6542
7268
  {
6543
7269
  "kind": "class",
6544
7270
  "name": "OreCounterElement",
6545
7271
  "tagName": "ore-counter",
6546
7272
  "customElement": true,
6547
- "description": "A large-target tally control for counting things at a glance: `−` / value / `+` with an\noptional icon, label and hint. Designed for touch and arm's-length use (tabletop trackers,\ninventories, scoreboards) rather than typed form entry — use `ore-number-input` for that.\nHolding any button auto-repeats. The value is announced through a live region and is\nkeyboard-operable as a spinbutton (Arrow keys, Home/End, Page Up/Down). Set `quick-steps` to add an\nouter pair of buttons that move by `large-step`, for values that change in chunks (damage, scores).",
7273
+ "description": "A large-target tally control for counting things at a glance: `−` / value / `+` with an\noptional icon, label and hint. Designed for touch and arm's-length use (tabletop trackers,\ninventories, scoreboards) rather than typed form entry: use `ore-number-input` for that.\nHolding any button auto-repeats. The value is announced through a live region and is\nkeyboard-operable as a spinbutton (Arrow keys, Home/End, Page Up/Down). Set `quick-steps` to add an\nouter pair of buttons that move by `large-step`, for values that change in chunks (damage, scores).",
6548
7274
  "summary": "",
6549
7275
  "attributes": [
6550
7276
  {
@@ -6634,6 +7360,13 @@
6634
7360
  "text": "'sm' | 'md' | 'lg'"
6635
7361
  },
6636
7362
  "description": "'sm' | 'md' | 'lg'"
7363
+ },
7364
+ {
7365
+ "name": "variant",
7366
+ "type": {
7367
+ "text": "'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'frost'"
7368
+ },
7369
+ "description": "Surface variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'frost'"
6637
7370
  }
6638
7371
  ],
6639
7372
  "events": [
@@ -6650,6 +7383,10 @@
6650
7383
  "name": "icon",
6651
7384
  "description": "Leading icon or token artwork shown before the label"
6652
7385
  },
7386
+ {
7387
+ "name": "header-end",
7388
+ "description": "Trailing header action beside the label"
7389
+ },
6653
7390
  {
6654
7391
  "name": "hint",
6655
7392
  "description": "Custom hint content (replaces the `hint` attribute)"
@@ -6730,7 +7467,7 @@
6730
7467
  "demos": [
6731
7468
  {
6732
7469
  "url": "",
6733
- "description": "```html\n<ore-counter label=\"Stamina\" value=\"3\" hint=\"Pay for actions\">\n <ore-icon slot=\"icon\" name=\"zap\"></ore-icon>\n</ore-counter>\n<ore-counter label=\"Score\" value=\"10\" min=\"0\" max=\"99\" size=\"lg\" color=\"primary\"></ore-counter>\n<ore-counter label=\"Damage\" value=\"12\" large-step=\"5\" quick-steps></ore-counter>\n```"
7470
+ "description": "```html\n<ore-counter label=\"Stamina\" value=\"3\" hint=\"Pay for actions\">\n <ore-icon slot=\"icon\" name=\"zap\"></ore-icon>\n</ore-counter>\n<ore-counter label=\"Score\" value=\"10\" min=\"0\" max=\"99\" size=\"lg\" color=\"primary\"></ore-counter>\n<ore-counter label=\"Damage\" value=\"12\" large-step=\"5\" quick-steps></ore-counter>\n<ore-counter label=\"Wounds\" value=\"1\" max=\"3\" variant=\"frost\" color=\"error\"></ore-counter>\n```"
6734
7471
  }
6735
7472
  ]
6736
7473
  },
@@ -6839,6 +7576,14 @@
6839
7576
  ],
6840
7577
  "members": []
6841
7578
  },
7579
+ {
7580
+ "kind": "variable",
7581
+ "name": "DEFAULT_LABELS",
7582
+ "type": {
7583
+ "text": "DataGridLabels"
7584
+ },
7585
+ "default": "{ activeFilters: (count) => `${count} active filter${count === 1 ? '' : 's'}`, addFilter: 'Add filter…', ascending: 'A → Z', clearAllFilters: 'Clear all filters', clearFiltersAndSearch: 'Clear all filters & search', clearSort: 'Clear sort', closeSearch: 'Close search', collapseRow: 'Collapse row', columnOptions: 'Column options', columnVisibility: 'Column visibility', comfortableDensity: 'Density: Comfortable', compactDensity: 'Density: Compact', contains: 'Contains', cozyDensity: 'Density: Cozy', data: 'Data', descending: 'Z → A', emptyValue: '(empty)', equals: 'Equals', expandRow: 'Expand row', filter: 'Filter', filterBy: 'Filter by', filterOperator: (field) => `${field} operator`, greaterThan: 'Greater than', hiddenColumns: (count) => `${count} hidden column${count === 1 ? '' : 's'}`, lessThan: 'Less than', nextPage: 'Next page', numericAscending: '0 → 9', numericDescending: '9 → 0', pageNavigation: 'Page navigation', pagination: 'Pagination', previousPage: 'Previous page', property: 'Property', range: (start, end, total) => `${start} to ${end} of ${total}`, removeFilter: 'Remove filter', resetColumns: 'Reset', rowDetails: 'Row details', rows: (count) => `${count} row${count === 1 ? '' : 's'}`, rowsPerPage: 'Rows per page', search: 'Search', selectAllRows: 'Select all rows on this page', selectRow: 'Select row', sort: 'Sort', sortBy: 'Sort by', views: 'Views', visibleColumns: (count, total) => `${count} of ${total} visible`, }"
7586
+ },
6842
7587
  {
6843
7588
  "kind": "function",
6844
7589
  "name": "createDataGridModel",
@@ -6905,7 +7650,7 @@
6905
7650
  }
6906
7651
  }
6907
7652
  ],
6908
- "description": "Returns the Lucide icon name for a column's sort state.\nPure function — no closure dependency on the grid model."
7653
+ "description": "Returns the Lucide icon name for a column's sort state.\nPure function: no closure dependency on the grid model."
6909
7654
  },
6910
7655
  {
6911
7656
  "kind": "function",
@@ -6929,7 +7674,7 @@
6929
7674
  }
6930
7675
  }
6931
7676
  ],
6932
- "description": "Returns the WAI-ARIA `aria-sort` value for a column.\nPure function — independently unit-testable."
7677
+ "description": "Returns the WAI-ARIA `aria-sort` value for a column.\nPure function: independently unit-testable."
6933
7678
  },
6934
7679
  {
6935
7680
  "kind": "variable",
@@ -7214,7 +7959,7 @@
7214
7959
  }
7215
7960
  }
7216
7961
  ],
7217
- "description": "Owns file selection *and* the opt-in upload lifecycle together — they were never really\nseparable (adding a file starts its upload; removing one must abort it; replacing one is both\nat once). Independent of `html`/rendering, following the same shape as `datagrid`'s\n`createDataGridControls` and `combobox`'s `combobox-options.ts`: a factory `file-input.ts`\nwires into drag/drop/native-input events and the template, directly unit-testable without\nmounting a component.\n\nEvery file-level rule (accept, max-size, max-files, disabled) and every upload-lifecycle rule\n(progress, retry-from-offset, per-file isolation) lives here in one place."
7962
+ "description": "Owns file selection *and* the opt-in upload lifecycle together: they were never really\nseparable (adding a file starts its upload; removing one must abort it; replacing one is both\nat once). Independent of `html`/rendering, following the same shape as `datagrid`'s\n`createDataGridControls` and `combobox`'s `combobox-options.ts`: a factory `file-input.ts`\nwires into drag/drop/native-input events and the template, directly unit-testable without\nmounting a component.\n\nEvery file-level rule (accept, max-size, max-files, disabled) and every upload-lifecycle rule\n(progress, retry-from-offset, per-file isolation) lives here in one place."
7218
7963
  },
7219
7964
  {
7220
7965
  "kind": "variable",
@@ -7223,14 +7968,14 @@
7223
7968
  "text": "'ore-file-input'"
7224
7969
  },
7225
7970
  "default": "'ore-file-input'",
7226
- "description": "A file upload field with drag-and-drop support, built-in validation messaging, and — once a\n`upload` transport is wired up — a full per-file upload lifecycle: live progress/speed/ETA,\nretry-on-failure, a success confirmation card, and fully independent handling of concurrent\nfiles (one failing never blocks or cancels the others). Picking files with no `upload` set\nkeeps the original, upload-free selection-only behavior."
7971
+ "description": "A file upload field with drag-and-drop support, built-in validation messaging, and: once a\n`upload` transport is wired up: a full per-file upload lifecycle: live progress/speed/ETA,\nretry-on-failure, a success confirmation card, and fully independent handling of concurrent\nfiles (one failing never blocks or cancels the others). Picking files with no `upload` set\nkeeps the original, upload-free selection-only behavior."
7227
7972
  },
7228
7973
  {
7229
7974
  "kind": "class",
7230
7975
  "name": "OreFileInputElement",
7231
7976
  "tagName": "ore-file-input",
7232
7977
  "customElement": true,
7233
- "description": "A file upload field with drag-and-drop support, built-in validation messaging, and — once a\n`upload` transport is wired up — a full per-file upload lifecycle: live progress/speed/ETA,\nretry-on-failure, a success confirmation card, and fully independent handling of concurrent\nfiles (one failing never blocks or cancels the others). Picking files with no `upload` set\nkeeps the original, upload-free selection-only behavior.",
7978
+ "description": "A file upload field with drag-and-drop support, built-in validation messaging, and: once a\n`upload` transport is wired up: a full per-file upload lifecycle: live progress/speed/ETA,\nretry-on-failure, a success confirmation card, and fully independent handling of concurrent\nfiles (one failing never blocks or cancels the others). Picking files with no `upload` set\nkeeps the original, upload-free selection-only behavior.",
7234
7979
  "summary": "",
7235
7980
  "attributes": [
7236
7981
  {
@@ -7288,6 +8033,41 @@
7288
8033
  "text": "string"
7289
8034
  },
7290
8035
  "description": "Provide helper context below the dropzone"
8036
+ },
8037
+ {
8038
+ "name": "browse-label",
8039
+ "type": {
8040
+ "text": "string"
8041
+ },
8042
+ "description": "Action half of the dropzone line (default 'click to browse')"
8043
+ },
8044
+ {
8045
+ "name": "dropzone-label",
8046
+ "type": {
8047
+ "text": "string"
8048
+ },
8049
+ "description": "Main half of the dropzone line (default 'Drop files here or')"
8050
+ },
8051
+ {
8052
+ "name": "dropzone-active-label",
8053
+ "type": {
8054
+ "text": "string"
8055
+ },
8056
+ "description": "Dropzone line while a drag is active (default 'Release to upload')"
8057
+ },
8058
+ {
8059
+ "name": "dropzone-hint",
8060
+ "type": {
8061
+ "text": "string"
8062
+ },
8063
+ "description": "Replace the auto-generated accept/max-size hint with this text"
8064
+ },
8065
+ {
8066
+ "name": "files-label",
8067
+ "type": {
8068
+ "text": "string"
8069
+ },
8070
+ "description": "Accessible name of the selected-files list (default 'Selected files')"
7291
8071
  }
7292
8072
  ],
7293
8073
  "events": [
@@ -7305,6 +8085,13 @@
7305
8085
  "text": "CustomEvent"
7306
8086
  }
7307
8087
  },
8088
+ {
8089
+ "name": "reject",
8090
+ "description": "detail: { files: File[], reasons: ('size' | 'type')[] }: nothing was added",
8091
+ "type": {
8092
+ "text": "CustomEvent"
8093
+ }
8094
+ },
7308
8095
  {
7309
8096
  "name": "upload-progress",
7310
8097
  "description": "detail: { file: File, loaded: number, total: number }",
@@ -7402,7 +8189,7 @@
7402
8189
  "demos": [
7403
8190
  {
7404
8191
  "url": "",
7405
- "description": "```html\n<ore-file-input label=\"Upload files\" accept=\"image/*\" multiple />\n<ore-file-input label=\"Photos\" accept=\"image/*\" multiple gallery />\n<ore-file-input label=\"Resume\" accept=\".pdf,.doc,.docx\" max-size=\"5242880\" />\n<ore-file-input variant=\"bordered\" color=\"primary\" />\n```\n```ts\n// Wire up a real upload transport — progress/retry/success are then handled automatically.\n// `XMLHttpRequest` is used here (not `fetch`) because it's the only browser API that reports\n// upload progress; swap in whatever transport the app already uses.\nconst input = document.querySelector('ore-file-input');\ninput.upload = (file, { onProgress, signal, resumeFrom }) =>\n new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.upload.addEventListener('progress', (e) => onProgress(resumeFrom + e.loaded, file.size));\n xhr.addEventListener('load', () => (xhr.status < 400 ? resolve() : reject(new Error(xhr.statusText))));\n xhr.addEventListener('error', () => reject(new Error('Network error')));\n signal.addEventListener('abort', () => xhr.abort());\n xhr.open('PUT', '/uploads');\n if (resumeFrom > 0) xhr.setRequestHeader('Content-Range', `bytes ${resumeFrom}-/${file.size}`);\n xhr.send(file);\n });\n```"
8192
+ "description": "```html\n<ore-file-input label=\"Upload files\" accept=\"image/*\" multiple />\n<ore-file-input label=\"Photos\" accept=\"image/*\" multiple gallery />\n<ore-file-input label=\"Resume\" accept=\".pdf,.doc,.docx\" max-size=\"5242880\" />\n<ore-file-input variant=\"bordered\" color=\"primary\" />\n```\n```ts\n// Wire up a real upload transport: progress/retry/success are then handled automatically.\n// `XMLHttpRequest` is used here (not `fetch`) because it's the only browser API that reports\n// upload progress; swap in whatever transport the app already uses.\nconst input = document.querySelector('ore-file-input');\ninput.upload = (file, { onProgress, signal, resumeFrom }) =>\n new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.upload.addEventListener('progress', (e) => onProgress(resumeFrom + e.loaded, file.size));\n xhr.addEventListener('load', () => (xhr.status < 400 ? resolve() : reject(new Error(xhr.statusText))));\n xhr.addEventListener('error', () => reject(new Error('Network error')));\n signal.addEventListener('abort', () => xhr.abort());\n xhr.open('PUT', '/uploads');\n if (resumeFrom > 0) xhr.setRequestHeader('Content-Range', `bytes ${resumeFrom}-/${file.size}`);\n xhr.send(file);\n });\n```"
7406
8193
  }
7407
8194
  ]
7408
8195
  },
@@ -7484,7 +8271,7 @@
7484
8271
  "type": {
7485
8272
  "text": "string"
7486
8273
  },
7487
- "description": "Error message — marks the field as invalid (fallback when the `error` slot is empty)"
8274
+ "description": "Error message: marks the field as invalid (fallback when the `error` slot is empty)"
7488
8275
  },
7489
8276
  {
7490
8277
  "name": "disabled",
@@ -7577,15 +8364,15 @@
7577
8364
  },
7578
8365
  {
7579
8366
  "name": "label",
7580
- "description": "Replaces the label text — slotted content takes precedence over the `label` prop"
8367
+ "description": "Replaces the label text: slotted content takes precedence over the `label` prop"
7581
8368
  },
7582
8369
  {
7583
8370
  "name": "helper",
7584
- "description": "Replaces the helper text — slotted content takes precedence over the `helper` prop"
8371
+ "description": "Replaces the helper text: slotted content takes precedence over the `helper` prop"
7585
8372
  },
7586
8373
  {
7587
8374
  "name": "error",
7588
- "description": "Replaces the error text — slotted content takes precedence over the `error` prop"
8375
+ "description": "Replaces the error text: slotted content takes precedence over the `error` prop"
7589
8376
  }
7590
8377
  ],
7591
8378
  "cssParts": [
@@ -7698,14 +8485,14 @@
7698
8485
  "text": "'ore-message-composer'"
7699
8486
  },
7700
8487
  "default": "'ore-message-composer'",
7701
- "description": "A message/comment composer — a card with an auto-resizing field on top and a toolbar row\nbelow it, built directly on the same core primitives as `ore-textarea` (`createTextField`,\n`createAutoResize`) rather than composing `ore-textarea` itself. Nesting a fully-styled sibling\ncomponent and suppressing most of its chrome (as an earlier version of this component did) is\na leaky composition — this owns its single `<textarea>` outright, so there's exactly one\nimplementation of the field's appearance to reason about, not two fighting each other.\n\nHandles the send gesture (Enter to send, Shift+Enter for a newline, or a Ctrl/Cmd+Enter\nalternative), IME-safe composition, and clear-and-refocus after sending."
8488
+ "description": "A message/comment composer: a card with an auto-resizing field on top and a toolbar row\nbelow it, built directly on the same core primitives as `ore-textarea` (`createTextField`,\n`createAutoResize`) rather than composing `ore-textarea` itself. Nesting a fully-styled sibling\ncomponent and suppressing most of its chrome (as an earlier version of this component did) is\na leaky composition: this owns its single `<textarea>` outright, so there's exactly one\nimplementation of the field's appearance to reason about, not two fighting each other.\n\nHandles the send gesture (Enter to send, Shift+Enter for a newline, or a Ctrl/Cmd+Enter\nalternative), IME-safe composition, and clear-and-refocus after sending."
7702
8489
  },
7703
8490
  {
7704
8491
  "kind": "class",
7705
8492
  "name": "OreMessageComposerElement",
7706
8493
  "tagName": "ore-message-composer",
7707
8494
  "customElement": true,
7708
- "description": "A message/comment composer — a card with an auto-resizing field on top and a toolbar row\nbelow it, built directly on the same core primitives as `ore-textarea` (`createTextField`,\n`createAutoResize`) rather than composing `ore-textarea` itself. Nesting a fully-styled sibling\ncomponent and suppressing most of its chrome (as an earlier version of this component did) is\na leaky composition — this owns its single `<textarea>` outright, so there's exactly one\nimplementation of the field's appearance to reason about, not two fighting each other.\nHandles the send gesture (Enter to send, Shift+Enter for a newline, or a Ctrl/Cmd+Enter\nalternative), IME-safe composition, and clear-and-refocus after sending.",
8495
+ "description": "A message/comment composer: a card with an auto-resizing field on top and a toolbar row\nbelow it, built directly on the same core primitives as `ore-textarea` (`createTextField`,\n`createAutoResize`) rather than composing `ore-textarea` itself. Nesting a fully-styled sibling\ncomponent and suppressing most of its chrome (as an earlier version of this component did) is\na leaky composition: this owns its single `<textarea>` outright, so there's exactly one\nimplementation of the field's appearance to reason about, not two fighting each other.\nHandles the send gesture (Enter to send, Shift+Enter for a newline, or a Ctrl/Cmd+Enter\nalternative), IME-safe composition, and clear-and-refocus after sending.",
7709
8496
  "summary": "",
7710
8497
  "attributes": [
7711
8498
  {
@@ -7883,7 +8670,7 @@
7883
8670
  },
7884
8671
  {
7885
8672
  "name": "send",
7886
- "description": "Replaces the default send button entirely — the only supported way to customize it"
8673
+ "description": "Replaces the default send button entirely: the only supported way to customize it"
7887
8674
  }
7888
8675
  ],
7889
8676
  "cssParts": [
@@ -9112,6 +9899,10 @@
9112
9899
  "name": "--select-border-color",
9113
9900
  "description": "Border color"
9114
9901
  },
9902
+ {
9903
+ "name": "--select-min-width",
9904
+ "description": "Minimum width of the select; the trigger floors at it too, so the control never renders wider than its host"
9905
+ },
9115
9906
  {
9116
9907
  "name": "--select-radius",
9117
9908
  "description": "Border radius"
@@ -9152,7 +9943,7 @@
9152
9943
  }
9153
9944
  }
9154
9945
  ],
9155
- "description": "`prop.string()` already reflects `error`'s raw value as an attribute, but that leaves the\nattribute present-but-empty (`error=\"\"`) once set instead of removing it — this normalizes\nan empty error back to \"no attribute at all\". Shared by every text-field component\n(`ore-input`, `ore-textarea`, `ore-message-composer`) since `bind()`'s own `error` writer\nneeds a derived getter, not the raw prop, to get that behavior."
9946
+ "description": "`prop.string()` already reflects `error`'s raw value as an attribute, but that leaves the\nattribute present-but-empty (`error=\"\"`) once set instead of removing it: this normalizes\nan empty error back to \"no attribute at all\". Shared by every text-field component\n(`ore-input`, `ore-textarea`, `ore-message-composer`) since `bind()`'s own `error` writer\nneeds a derived getter, not the raw prop, to get that behavior."
9156
9947
  },
9157
9948
  {
9158
9949
  "kind": "function",
@@ -9311,6 +10102,42 @@
9311
10102
  }
9312
10103
  ]
9313
10104
  },
10105
+ {
10106
+ "kind": "function",
10107
+ "name": "eventFieldValue",
10108
+ "return": {
10109
+ "type": {
10110
+ "text": "string | undefined"
10111
+ }
10112
+ },
10113
+ "parameters": [
10114
+ {
10115
+ "name": "event",
10116
+ "type": {
10117
+ "text": "Event"
10118
+ }
10119
+ }
10120
+ ],
10121
+ "description": "Reads the `value` off the element an event fired from (`event.currentTarget`), guarding the\ncast: `undefined` when the target is missing or carries no string `value`. The read-side\ncompanion to setFieldValue: consumers wiring a native `change`/`input` handler to a\nfield no longer re-derive the `(currentTarget as HTMLElement & { value: string }).value` cast."
10122
+ },
10123
+ {
10124
+ "kind": "function",
10125
+ "name": "eventFieldChecked",
10126
+ "return": {
10127
+ "type": {
10128
+ "text": "boolean"
10129
+ }
10130
+ },
10131
+ "parameters": [
10132
+ {
10133
+ "name": "event",
10134
+ "type": {
10135
+ "text": "Event"
10136
+ }
10137
+ }
10138
+ ],
10139
+ "description": "Reads the `checked` flag off the element an event fired from (`event.currentTarget`), guarding\nthe cast: `false` when the target is missing or carries no boolean `checked`. The read-side\ncompanion to setFieldChecked."
10140
+ },
9314
10141
  {
9315
10142
  "kind": "function",
9316
10143
  "name": "renderHelperRegion",
@@ -9358,7 +10185,7 @@
9358
10185
  }
9359
10186
  }
9360
10187
  ],
9361
- "description": "Inline error/success status icon shown inside a field — identical markup across\n`ore-input`, `ore-textarea`, and `ore-message-composer` (previously hand-duplicated in all\nthree, down to the same derived-signal names)."
10188
+ "description": "Inline error/success status icon shown inside a field: identical markup across\n`ore-input`, `ore-textarea`, and `ore-message-composer` (previously hand-duplicated in all\nthree, down to the same derived-signal names)."
9362
10189
  },
9363
10190
  {
9364
10191
  "kind": "function",
@@ -9371,7 +10198,7 @@
9371
10198
  }
9372
10199
  }
9373
10200
  ],
9374
- "description": "Character counter + separate helper/error text regions below a field — identical across\n`ore-textarea` and `ore-message-composer` (kept out of `ore-input`, which slots its\nhelper/error content and drives its counter off a different data-attribute scheme via its\nown `char-counter` part — a genuinely different shape, not worth forcing into this one)."
10201
+ "description": "Character counter + separate helper/error text regions below a field: identical across\n`ore-textarea` and `ore-message-composer` (kept out of `ore-input`, which slots its\nhelper/error content and drives its counter off a different data-attribute scheme via its\nown `char-counter` part: a genuinely different shape, not worth forcing into this one)."
9375
10202
  },
9376
10203
  {
9377
10204
  "kind": "function",
@@ -10295,14 +11122,14 @@
10295
11122
  "text": "'ore-box'"
10296
11123
  },
10297
11124
  "default": "'ore-box'",
10298
- "description": "ore-box — A foundational layout primitive with theming support."
11125
+ "description": "ore-box: A foundational layout primitive with theming support."
10299
11126
  },
10300
11127
  {
10301
11128
  "kind": "class",
10302
11129
  "name": "OreBoxElement",
10303
11130
  "tagName": "ore-box",
10304
11131
  "customElement": true,
10305
- "description": "ore-box — A foundational layout primitive with theming support.",
11132
+ "description": "ore-box: A foundational layout primitive with theming support.",
10306
11133
  "summary": "",
10307
11134
  "attributes": [
10308
11135
  {
@@ -10411,14 +11238,14 @@
10411
11238
  "text": "'ore-grid'"
10412
11239
  },
10413
11240
  "default": "'ore-grid'",
10414
- "description": "ore-grid — Flexible grid layout with responsive column control.\n\nColumns are computed in JS and applied as `--_cols` inline, so they respond\nto the element's own width via ResizeObserver. CSS custom properties\n`--grid-cols`, `--grid-rows`, `--grid-gap`, `--grid-row-gap`, `--grid-col-gap`\nare honoured as fallbacks when no attribute is set."
11241
+ "description": "ore-grid: Flexible grid layout with responsive column control.\n\nColumns are computed in JS and applied as `--_cols` inline, so they respond\nto the element's own width via ResizeObserver. CSS custom properties\n`--grid-cols`, `--grid-rows`, `--grid-gap`, `--grid-row-gap`, `--grid-col-gap`\nare honoured as fallbacks when no attribute is set."
10415
11242
  },
10416
11243
  {
10417
11244
  "kind": "class",
10418
11245
  "name": "OreGridElement",
10419
11246
  "tagName": "ore-grid",
10420
11247
  "customElement": true,
10421
- "description": "ore-grid — Flexible grid layout with responsive column control.\nColumns are computed in JS and applied as `--_cols` inline, so they respond\nto the element's own width via ResizeObserver. CSS custom properties\n`--grid-cols`, `--grid-rows`, `--grid-gap`, `--grid-row-gap`, `--grid-col-gap`\nare honoured as fallbacks when no attribute is set.",
11248
+ "description": "ore-grid: Flexible grid layout with responsive column control.\nColumns are computed in JS and applied as `--_cols` inline, so they respond\nto the element's own width via ResizeObserver. CSS custom properties\n`--grid-cols`, `--grid-rows`, `--grid-gap`, `--grid-row-gap`, `--grid-col-gap`\nare honoured as fallbacks when no attribute is set.",
10422
11249
  "summary": "",
10423
11250
  "attributes": [
10424
11251
  {
@@ -10613,14 +11440,14 @@
10613
11440
  "text": "'ore-grid-item'"
10614
11441
  },
10615
11442
  "default": "'ore-grid-item'",
10616
- "description": "ore-grid-item — A grid cell with declarative placement and span control.\n\nUse `col-span` / `row-span` for the common case of spanning columns/rows.\nUse `col` / `row` for full CSS grid-column / grid-row shorthand power\n(e.g. explicit placement, mixed span + start, negative lines)."
11443
+ "description": "ore-grid-item: A grid cell with declarative placement and span control.\n\nUse `col-span` / `row-span` for the common case of spanning columns/rows.\nUse `col` / `row` for full CSS grid-column / grid-row shorthand power\n(e.g. explicit placement, mixed span + start, negative lines)."
10617
11444
  },
10618
11445
  {
10619
11446
  "kind": "class",
10620
11447
  "name": "OreGridItemElement",
10621
11448
  "tagName": "ore-grid-item",
10622
11449
  "customElement": true,
10623
- "description": "ore-grid-item — A grid cell with declarative placement and span control.\nUse `col-span` / `row-span` for the common case of spanning columns/rows.\nUse `col` / `row` for full CSS grid-column / grid-row shorthand power\n(e.g. explicit placement, mixed span + start, negative lines).",
11450
+ "description": "ore-grid-item: A grid cell with declarative placement and span control.\nUse `col-span` / `row-span` for the common case of spanning columns/rows.\nUse `col` / `row` for full CSS grid-column / grid-row shorthand power\n(e.g. explicit placement, mixed span + start, negative lines).",
10624
11451
  "summary": "",
10625
11452
  "attributes": [
10626
11453
  {
@@ -10710,14 +11537,14 @@
10710
11537
  "text": "'ore-navbar'"
10711
11538
  },
10712
11539
  "default": "'ore-navbar'",
10713
- "description": "`ore-navbar` — Responsive navigation with sticky/floating modes and a mobile overflow panel."
11540
+ "description": "`ore-navbar`: Responsive navigation with sticky/floating modes and a mobile overflow panel."
10714
11541
  },
10715
11542
  {
10716
11543
  "kind": "class",
10717
11544
  "name": "OreNavbarElement",
10718
11545
  "tagName": "ore-navbar",
10719
11546
  "customElement": true,
10720
- "description": "`ore-navbar` — Responsive navigation with sticky/floating modes and a mobile overflow panel.",
11547
+ "description": "`ore-navbar`: Responsive navigation with sticky/floating modes and a mobile overflow panel.",
10721
11548
  "summary": "",
10722
11549
  "attributes": [
10723
11550
  {
@@ -10831,6 +11658,10 @@
10831
11658
  "name": "end",
10832
11659
  "description": "Content rendered in the right/end region"
10833
11660
  },
11661
+ {
11662
+ "name": "persistent",
11663
+ "description": "Trailing content that stays in the bar through the mobile collapse (global actions and status icons)"
11664
+ },
10834
11665
  {
10835
11666
  "name": "mobile-menu",
10836
11667
  "description": "Controls and links rendered inside the mobile overflow panel"
@@ -10861,6 +11692,10 @@
10861
11692
  "name": "end",
10862
11693
  "description": "Trailing action/content region"
10863
11694
  },
11695
+ {
11696
+ "name": "persistent",
11697
+ "description": "Trailing region that survives the mobile collapse"
11698
+ },
10864
11699
  {
10865
11700
  "name": "mobile-toggle",
10866
11701
  "description": "Mobile menu toggle button"
@@ -10958,16 +11793,23 @@
10958
11793
  "text": "'ore-navbar-item'"
10959
11794
  },
10960
11795
  "default": "'ore-navbar-item'",
10961
- "description": "`ore-navbar-item` — Navigation item for navbar slots.\n\nRenders as an anchor when `href` is provided and item is not disabled."
11796
+ "description": "`ore-navbar-item`: Navigation item for navbar slots.\n\nRenders as an anchor when `href` is provided and item is not disabled."
10962
11797
  },
10963
11798
  {
10964
11799
  "kind": "class",
10965
11800
  "name": "OreNavbarItemElement",
10966
11801
  "tagName": "ore-navbar-item",
10967
11802
  "customElement": true,
10968
- "description": "`ore-navbar-item` — Navigation item for navbar slots.\nRenders as an anchor when `href` is provided and item is not disabled.",
11803
+ "description": "`ore-navbar-item`: Navigation item for navbar slots.\nRenders as an anchor when `href` is provided and item is not disabled.",
10969
11804
  "summary": "",
10970
11805
  "attributes": [
11806
+ {
11807
+ "name": "aria-label",
11808
+ "type": {
11809
+ "text": "string"
11810
+ },
11811
+ "description": "Accessible name for icon-only items, forwarded to the internal control"
11812
+ },
10971
11813
  {
10972
11814
  "name": "active",
10973
11815
  "type": {
@@ -11058,14 +11900,14 @@
11058
11900
  "text": "'ore-sidebar'"
11059
11901
  },
11060
11902
  "default": "'ore-sidebar'",
11061
- "description": "`ore-sidebar` — A collapsible navigation sidebar with group and item support."
11903
+ "description": "`ore-sidebar`: A collapsible navigation sidebar with group and item support."
11062
11904
  },
11063
11905
  {
11064
11906
  "kind": "class",
11065
11907
  "name": "OreSidebarElement",
11066
11908
  "tagName": "ore-sidebar",
11067
11909
  "customElement": true,
11068
- "description": "`ore-sidebar` — A collapsible navigation sidebar with group and item support.",
11910
+ "description": "`ore-sidebar`: A collapsible navigation sidebar with group and item support.",
11069
11911
  "summary": "",
11070
11912
  "attributes": [
11071
11913
  {
@@ -11089,6 +11931,13 @@
11089
11931
  },
11090
11932
  "description": "Show the collapse toggle button"
11091
11933
  },
11934
+ {
11935
+ "name": "drawer",
11936
+ "type": {
11937
+ "text": "boolean"
11938
+ },
11939
+ "description": "Drawer-only mode: no inline panel and no bottom bar, just the navbar/API-driven drawer"
11940
+ },
11092
11941
  {
11093
11942
  "name": "variant",
11094
11943
  "type": {
@@ -11113,8 +11962,8 @@
11113
11962
  }
11114
11963
  },
11115
11964
  {
11116
- "name": "mobile-open-change",
11117
- "description": "Fired when mobile overlay open state changes. detail: { open: boolean; source: string }",
11965
+ "name": "drawer-change",
11966
+ "description": "Fired when the drawer open state changes. detail: { open: boolean; source: string }",
11118
11967
  "type": {
11119
11968
  "text": "CustomEvent"
11120
11969
  }
@@ -11136,8 +11985,8 @@
11136
11985
  ],
11137
11986
  "cssParts": [
11138
11987
  {
11139
- "name": "mobile-backdrop",
11140
- "description": "Backdrop shown for mobile overlays."
11988
+ "name": "drawer-backdrop",
11989
+ "description": "Backdrop shown behind the open drawer."
11141
11990
  },
11142
11991
  {
11143
11992
  "name": "nav",
@@ -11209,6 +12058,10 @@
11209
12058
  "name": "--sidebar-collapsed-width",
11210
12059
  "description": "Collapsed sidebar width (default: 3.5rem)"
11211
12060
  },
12061
+ {
12062
+ "name": "--sidebar-drawer-width",
12063
+ "description": "Drawer panel width (default: min(--sidebar-width, 85vw))"
12064
+ },
11212
12065
  {
11213
12066
  "name": "--sidebar-bg",
11214
12067
  "description": "Sidebar background color"
@@ -11232,14 +12085,14 @@
11232
12085
  "text": "'ore-sidebar-group'"
11233
12086
  },
11234
12087
  "default": "'ore-sidebar-group'",
11235
- "description": "`ore-sidebar-group` — A labelled section within `ore-sidebar`."
12088
+ "description": "`ore-sidebar-group`: A labelled section within `ore-sidebar`."
11236
12089
  },
11237
12090
  {
11238
12091
  "kind": "class",
11239
12092
  "name": "OreSidebarGroupElement",
11240
12093
  "tagName": "ore-sidebar-group",
11241
12094
  "customElement": true,
11242
- "description": "`ore-sidebar-group` — A labelled section within `ore-sidebar`.",
12095
+ "description": "`ore-sidebar-group`: A labelled section within `ore-sidebar`.",
11243
12096
  "summary": "",
11244
12097
  "attributes": [
11245
12098
  {
@@ -11304,14 +12157,14 @@
11304
12157
  "text": "'ore-sidebar-item'"
11305
12158
  },
11306
12159
  "default": "'ore-sidebar-item'",
11307
- "description": "`ore-sidebar-item` — An individual navigation item in a `ore-sidebar`.\n\nRenders as an `<a>` when `href` is provided, otherwise as a `<button>`.\nMarks the active page via `aria-current=\"page\"` when the `active` attribute is set."
12160
+ "description": "`ore-sidebar-item`: An individual navigation item in a `ore-sidebar`.\n\nRenders as an `<a>` when `href` is provided, otherwise as a `<button>`.\nMarks the active page via `aria-current=\"page\"` when the `active` attribute is set."
11308
12161
  },
11309
12162
  {
11310
12163
  "kind": "class",
11311
12164
  "name": "OreSidebarItemElement",
11312
12165
  "tagName": "ore-sidebar-item",
11313
12166
  "customElement": true,
11314
- "description": "`ore-sidebar-item` — An individual navigation item in a `ore-sidebar`.\nRenders as an `<a>` when `href` is provided, otherwise as a `<button>`.\nMarks the active page via `aria-current=\"page\"` when the `active` attribute is set.",
12167
+ "description": "`ore-sidebar-item`: An individual navigation item in a `ore-sidebar`.\nRenders as an `<a>` when `href` is provided, otherwise as a `<button>`.\nMarks the active page via `aria-current=\"page\"` when the `active` attribute is set.",
11315
12168
  "summary": "",
11316
12169
  "attributes": [
11317
12170
  {
@@ -11448,7 +12301,7 @@
11448
12301
  }
11449
12302
  }
11450
12303
  ],
11451
- "description": "Splits a display-only shortcut hint into individual keys so each can be rendered in its\nown `<kbd>`. Keys are separated with `+` (e.g. `\"⌘+N\"` → `[\"⌘\", \"N\"]`); a shortcut with no\n`+` renders as a single key, unchanged. A literal `+` key can't be represented this way —\nspell it out instead (e.g. `\"Ctrl+Plus\"`)."
12304
+ "description": "Splits a display-only shortcut hint into individual keys so each can be rendered in its\nown `<kbd>`. Keys are separated with `+` (e.g. `\"⌘+N\"` → `[\"⌘\", \"N\"]`); a shortcut with no\n`+` renders as a single key, unchanged. A literal `+` key can't be represented this way :\nspell it out instead (e.g. `\"Ctrl+Plus\"`)."
11452
12305
  },
11453
12306
  {
11454
12307
  "kind": "function",
@@ -11521,14 +12374,14 @@
11521
12374
  "text": "'ore-command-palette-item'"
11522
12375
  },
11523
12376
  "default": "'ore-command-palette-item'",
11524
- "description": "A pure data node describing one command. Never rendered directly — `ore-command-palette`\nreads its attributes/text content and renders the visible row itself."
12377
+ "description": "A pure data node describing one command. Never rendered directly: `ore-command-palette`\nreads its attributes/text content and renders the visible row itself."
11525
12378
  },
11526
12379
  {
11527
12380
  "kind": "class",
11528
12381
  "name": "OreCommandPaletteItemElement",
11529
12382
  "tagName": "ore-command-palette-item",
11530
12383
  "customElement": true,
11531
- "description": "A pure data node describing one command. Never rendered directly — `ore-command-palette`\nreads its attributes/text content and renders the visible row itself.",
12384
+ "description": "A pure data node describing one command. Never rendered directly: `ore-command-palette`\nreads its attributes/text content and renders the visible row itself.",
11532
12385
  "summary": "",
11533
12386
  "attributes": [
11534
12387
  {
@@ -11557,7 +12410,7 @@
11557
12410
  "type": {
11558
12411
  "text": "string"
11559
12412
  },
11560
- "description": "Display-only keyboard hint rendered at the end of the row, one `<kbd>` per `+`-separated key (e.g. `\"⌘+S\"` renders two keycaps; a literal `+` key isn't representable — spell it out, e.g. `\"Ctrl+Plus\"`)"
12413
+ "description": "Display-only keyboard hint rendered at the end of the row, one `<kbd>` per `+`-separated key (e.g. `\"⌘+S\"` renders two keycaps; a literal `+` key isn't representable: spell it out, e.g. `\"Ctrl+Plus\"`)"
11561
12414
  },
11562
12415
  {
11563
12416
  "name": "disabled",
@@ -11587,14 +12440,14 @@
11587
12440
  "text": "'ore-command-palette'"
11588
12441
  },
11589
12442
  "default": "'ore-command-palette'",
11590
- "description": "A searchable, keyboard-driven list of commands presented in a centered modal —\nthe \"⌘K\" pattern popularized by editors and productivity apps. Built on the\nnative `<dialog>` element (focus trap, top-layer stacking, `Escape`-to-close)\nand `@vielzeug/keymap` for the global shortcut that opens it."
12443
+ "description": "A searchable, keyboard-driven list of commands presented in a centered modal :\nthe \"⌘K\" pattern popularized by editors and productivity apps. Built on the\nnative `<dialog>` element (focus trap, top-layer stacking, `Escape`-to-close)\nand `@vielzeug/keymap` for the global shortcut that opens it."
11591
12444
  },
11592
12445
  {
11593
12446
  "kind": "class",
11594
12447
  "name": "OreCommandPaletteElement",
11595
12448
  "tagName": "ore-command-palette",
11596
12449
  "customElement": true,
11597
- "description": "A searchable, keyboard-driven list of commands presented in a centered modal —\nthe \"⌘K\" pattern popularized by editors and productivity apps. Built on the\nnative `<dialog>` element (focus trap, top-layer stacking, `Escape`-to-close)\nand `@vielzeug/keymap` for the global shortcut that opens it.",
12450
+ "description": "A searchable, keyboard-driven list of commands presented in a centered modal :\nthe \"⌘K\" pattern popularized by editors and productivity apps. Built on the\nnative `<dialog>` element (focus trap, top-layer stacking, `Escape`-to-close)\nand `@vielzeug/keymap` for the global shortcut that opens it.",
11598
12451
  "summary": "",
11599
12452
  "attributes": [
11600
12453
  {