@aceshooting/lyra-ui 14.3.1 → 15.0.0

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 (221) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/custom-elements.json +1 -1
  3. package/design-tokens.json +1 -1
  4. package/dist/cli/migration-contract.json +1 -1
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +4 -0
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +3 -3
  7. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +3 -2
  8. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +1 -1
  9. package/dist/components/agent-tools/commit-card/commit-card.styles.js +1 -1
  10. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +1 -1
  11. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +8 -3
  12. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +3 -1
  13. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +10 -1
  14. package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js +1 -1
  15. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +1 -1
  16. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.d.ts +19 -1
  17. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +4 -4
  18. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -1
  19. package/dist/components/agent-tools/task-list/task-list.class.d.ts +5 -0
  20. package/dist/components/agent-tools/task-list/task-list.class.js +3 -3
  21. package/dist/components/agent-tools/terminal/terminal.class.d.ts +1 -1
  22. package/dist/components/agent-tools/terminal/terminal.styles.js +1 -1
  23. package/dist/components/agent-tools/test-results/test-results.class.js +1 -1
  24. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +10 -7
  25. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +15 -14
  26. package/dist/components/agent-tools/tool-param-form/tool-param-form.d.ts +1 -1
  27. package/dist/components/agent-tools/tool-param-form/tool-param-form.js +1 -1
  28. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js +1 -1
  29. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.d.ts +5 -2
  30. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +1 -1
  31. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts +3 -1
  32. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +9 -1
  33. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.js +1 -1
  34. package/dist/components/charts/chart/box-plot.class.d.ts +64 -4
  35. package/dist/components/charts/chart/box-plot.class.js +5 -5
  36. package/dist/components/charts/chart/chart-colors.d.ts +10 -0
  37. package/dist/components/charts/chart/chart-colors.js +1 -1
  38. package/dist/components/charts/chart/chart.class.d.ts +35 -10
  39. package/dist/components/charts/chart/chart.class.js +4 -4
  40. package/dist/components/charts/chart/lite-chart.class.d.ts +10 -2
  41. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  42. package/dist/components/conversation/markdown/markdown.class.d.ts +9 -1
  43. package/dist/components/conversation/markdown/markdown.class.js +1 -1
  44. package/dist/components/conversation/message-parts/message-parts.class.d.ts +18 -1
  45. package/dist/components/conversation/message-parts/message-parts.class.js +4 -4
  46. package/dist/components/conversation/model-select/model-select.class.d.ts +6 -2
  47. package/dist/components/conversation/model-select/model-select.class.js +3 -3
  48. package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
  49. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +5 -1
  50. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  51. package/dist/components/data/calendar/calendar.class.js +2 -2
  52. package/dist/components/data/context-meter/context-meter.styles.js +1 -1
  53. package/dist/components/data/data-grid/data-grid-types.d.ts +8 -2
  54. package/dist/components/data/data-grid/data-grid.class.d.ts +16 -3
  55. package/dist/components/data/data-grid/data-grid.class.js +3 -2
  56. package/dist/components/data/env-list/env-list.styles.js +1 -1
  57. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +22 -2
  58. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
  59. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +12 -4
  60. package/dist/components/data/flow-minimap/flow-minimap.class.js +2 -2
  61. package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
  62. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +5 -1
  63. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
  64. package/dist/components/data/heatmap/heatmap.class.d.ts +12 -1
  65. package/dist/components/data/heatmap/heatmap.class.js +3 -3
  66. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  67. package/dist/components/forms/code-editor/code-editor.class.js +1 -1
  68. package/dist/components/forms/combobox/combobox.class.js +1 -1
  69. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  70. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  71. package/dist/components/forms/date-picker/date-picker.class.d.ts +12 -1
  72. package/dist/components/forms/date-picker/date-picker.class.js +1 -1
  73. package/dist/components/forms/icon-button/icon-button.class.d.ts +27 -5
  74. package/dist/components/forms/icon-button/icon-button.class.js +7 -3
  75. package/dist/components/forms/input/input.styles.js +1 -1
  76. package/dist/components/forms/input/time-input.class.d.ts +13 -2
  77. package/dist/components/forms/input/time-input.class.js +1 -1
  78. package/dist/components/forms/otp-input/otp-input.class.d.ts +8 -1
  79. package/dist/components/forms/otp-input/otp-input.class.js +1 -1
  80. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +1 -1
  81. package/dist/components/forms/rubric-form/rubric-form.class.js +1 -1
  82. package/dist/components/forms/select/select.class.d.ts +1 -1
  83. package/dist/components/forms/select/select.class.js +1 -1
  84. package/dist/components/forms/slider/slider.class.d.ts +4 -1
  85. package/dist/components/forms/slider/slider.class.js +1 -1
  86. package/dist/components/forms/textarea/textarea.class.d.ts +9 -4
  87. package/dist/components/forms/textarea/textarea.class.js +1 -1
  88. package/dist/components/forms/time-range/time-range.class.js +1 -1
  89. package/dist/components/layout/app-rail/app-rail.class.d.ts +7 -2
  90. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  91. package/dist/components/layout/card/card.class.js +2 -2
  92. package/dist/components/layout/card/card.styles.js +1 -1
  93. package/dist/components/layout/control-group/control-group.class.js +1 -1
  94. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +1 -1
  95. package/dist/components/layout/details/details.styles.js +1 -1
  96. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +13 -3
  97. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  98. package/dist/components/layout/menu/dropdown-item.class.d.ts +2 -0
  99. package/dist/components/layout/menu/menu-item.class.d.ts +28 -1
  100. package/dist/components/layout/menu/menu-item.class.js +45 -35
  101. package/dist/components/layout/menu/menu-item.styles.js +1 -1
  102. package/dist/components/layout/menu/menu.class.js +1 -1
  103. package/dist/components/layout/multi-split/multi-split.class.d.ts +12 -2
  104. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  105. package/dist/components/layout/page/page.class.js +2 -1
  106. package/dist/components/layout/page/page.styles.js +1 -1
  107. package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts +6 -4
  108. package/dist/components/layout/responsive-panel/responsive-panel.class.js +2 -2
  109. package/dist/components/layout/responsive-panel/responsive-panel.styles.js +1 -1
  110. package/dist/components/layout/stepper/stepper.class.js +2 -2
  111. package/dist/components/layout/tab-group/tab-group.class.js +1 -1
  112. package/dist/components/layout/virtual-list/virtual-list.class.js +2 -2
  113. package/dist/components/layout/widget/widget.class.d.ts +12 -2
  114. package/dist/components/layout/widget/widget.class.js +2 -2
  115. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts +1 -1
  116. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +3 -3
  117. package/dist/components/media/file-icon/file-icon.class.d.ts +3 -1
  118. package/dist/components/media/file-icon/file-icon.class.js +1 -1
  119. package/dist/components/media/file-input/file-input.class.d.ts +1 -1
  120. package/dist/components/media/file-input/file-input.class.js +1 -1
  121. package/dist/components/media/flag/flag.styles.js +1 -1
  122. package/dist/components/media/image-comparer/image-comparer.class.d.ts +5 -5
  123. package/dist/components/media/image-comparer/image-comparer.class.js +1 -1
  124. package/dist/components/media/image-comparer/image-comparer.styles.js +1 -1
  125. package/dist/components/media/lightbox/lightbox.styles.js +1 -1
  126. package/dist/components/media/map/map.styles.js +1 -1
  127. package/dist/components/media/sequence-playback/sequence-playback.class.js +1 -1
  128. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  129. package/dist/components/media/video-playlist/video-playlist.styles.js +1 -1
  130. package/dist/components/overlays/alert/alert.class.d.ts +6 -0
  131. package/dist/components/overlays/alert/alert.styles.js +1 -1
  132. package/dist/components/overlays/badge/tag.class.js +1 -1
  133. package/dist/components/overlays/chip/chip.class.js +1 -1
  134. package/dist/components/overlays/empty/empty.class.js +2 -2
  135. package/dist/components/overlays/kbd/kbd.styles.js +1 -1
  136. package/dist/components/overlays/progress/progress-ring.class.d.ts +4 -1
  137. package/dist/components/overlays/progress/progress.styles.js +1 -1
  138. package/dist/components/overlays/toast/toast.styles.js +1 -1
  139. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  140. package/dist/components/retrieval/graph/graph.class.d.ts +10 -3
  141. package/dist/components/retrieval/graph/graph.class.js +1 -1
  142. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  143. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +1 -1
  144. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +6 -6
  145. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +2 -2
  146. package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
  147. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +3 -3
  148. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +3 -3
  149. package/dist/components/retrieval/node-palette/node-palette.class.d.ts +7 -1
  150. package/dist/components/retrieval/node-palette/node-palette.class.js +23 -13
  151. package/dist/components/retrieval/node-palette/node-palette.styles.js +1 -1
  152. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +4 -1
  153. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +1 -1
  154. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +1 -1
  155. package/dist/components/retrieval/retrieval-search/retrieval-search.class.js +4 -3
  156. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  157. package/dist/components/retrieval/source-list/source-list.class.d.ts +7 -1
  158. package/dist/components/retrieval/source-list/source-list.class.js +1 -1
  159. package/dist/components/utility/export-button/export-button.class.d.ts +14 -2
  160. package/dist/components/utility/export-button/export-button.class.js +3 -3
  161. package/dist/components/utility/export-button/export-button.styles.js +1 -1
  162. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  163. package/dist/components/utility/known-date/known-date.class.js +1 -1
  164. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +4 -2
  165. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  166. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +9 -1
  167. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +4 -4
  168. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +1 -1
  169. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +4 -4
  170. package/dist/components/viewers/document-compare/document-compare.class.d.ts +5 -0
  171. package/dist/components/viewers/document-compare/document-compare.class.js +9 -4
  172. package/dist/components/viewers/document-compare/document-compare.styles.js +1 -1
  173. package/dist/components/viewers/document-preview/document-preview.class.d.ts +9 -1
  174. package/dist/components/viewers/document-preview/document-preview.class.js +2 -1
  175. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +5 -0
  176. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
  177. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +5 -0
  178. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +1 -1
  179. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +3 -3
  180. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
  181. package/dist/custom-elements-jsx.d.ts +1 -1
  182. package/dist/events.d.ts +5 -4
  183. package/dist/internal/accessibility-visibility.d.ts +13 -2
  184. package/dist/internal/accessibility-visibility.js +1 -1
  185. package/dist/internal/package-metadata.d.ts +1 -1
  186. package/dist/internal/package-metadata.js +1 -1
  187. package/dist/lyra.d.ts +1 -1
  188. package/dist/svelte.d.ts +1 -1
  189. package/dist/vue.d.ts +1 -1
  190. package/llms/components/lr-alert.md +11 -3
  191. package/llms/components/lr-box-plot.md +21 -4
  192. package/llms/components/lr-chart.md +13 -4
  193. package/llms/components/lr-code-block.md +5 -4
  194. package/llms/components/lr-data-grid.md +24 -10
  195. package/llms/components/lr-document-compare.md +5 -0
  196. package/llms/components/lr-dropdown-item.md +31 -0
  197. package/llms/components/lr-eval-dataset.md +5 -4
  198. package/llms/components/lr-export-button.md +10 -5
  199. package/llms/components/lr-filter-bar.md +4 -1
  200. package/llms/components/lr-flow-minimap.md +7 -1
  201. package/llms/components/lr-icon-button.md +6 -1
  202. package/llms/components/lr-lite-chart.md +2 -1
  203. package/llms/components/lr-markdown.md +2 -2
  204. package/llms/components/lr-menu-item.md +31 -0
  205. package/llms/components/lr-menu.md +31 -0
  206. package/llms/components/lr-message-parts.md +7 -0
  207. package/llms/components/lr-model-settings-panel.md +4 -1
  208. package/llms/components/lr-node-palette.md +5 -4
  209. package/llms/components/lr-pdf-viewer.md +7 -0
  210. package/llms/components/lr-responsive-panel.md +2 -2
  211. package/llms/components/lr-subagent-panel.md +17 -2
  212. package/llms/components/lr-thinking-panel.md +4 -0
  213. package/llms/components/lr-timeline-item.md +1 -1
  214. package/llms/components/lr-timeline.md +1 -1
  215. package/llms/components/lr-tool-select-dialog.md +4 -3
  216. package/llms/components/lr-virtual-list.md +11 -11
  217. package/llms-full.txt +212 -59
  218. package/package.json +3 -3
  219. package/vscode-css-data.json +1 -1
  220. package/vscode-html-data.json +1 -1
  221. package/web-types.json +1 -1
package/llms-full.txt CHANGED
@@ -6112,7 +6112,12 @@ app-wide with `registerLyraLocale()` (see `llms/shared.md`); don't rely on the f
6112
6112
  button whose purpose isn't generic.
6113
6113
 
6114
6114
  Host `aria-haspopup` and `aria-expanded` values are forwarded reactively to the shadow-internal
6115
- native button. Host `aria-describedby` targets in the host's own root are resolved through
6115
+ native button. `aria-pressed` (`true`, `false`, `mixed`) supports icon-only toggle actions such as
6116
+ mute, favorite, or pin; `aria-current` (`page`, `step`, `location`, `date`, `time`, `true`, `false`)
6117
+ supports current-item icon buttons such as an active nav/pagination target. Both follow attribute
6118
+ changes, removal, and button/link replacement without changing the native role; an empty or
6119
+ unsupported token is omitted — mirroring `lr-button`'s own `aria-pressed`/`aria-current`
6120
+ forwarding. Host `aria-describedby` targets in the host's own root are resolved through
6116
6121
  `ariaDescribedByElements`. Host `aria-controls` targets use the corresponding
6117
6122
  `ariaControlsElements` API, so using `<lr-icon-button slot="trigger">` inside `<lr-menu>` exposes
6118
6123
  the menu relationship and expanded state on the element that actually receives focus. Supporting
@@ -10338,6 +10343,12 @@ ARIA values as page-local positions rather than as the dataset-wide total.
10338
10343
  The mirrored `selectedKeys` spelling remains a compatibility alias for this same state.
10339
10344
  - `selectedRows: readonly Row[]` (writable, JS-only) — assigning rows that belong to the current source
10340
10345
  maps them to `selectedRowKeys`; detached rows are ignored and single-selection mode keeps the first.
10346
+ - `selectionMode: 'none' | 'single' | 'multiple'` (`selection-mode`) — alias of `selectable` using
10347
+ `<lr-table>`'s `selectionMode`/`selection-mode` spelling for the same row-selection concept, so a
10348
+ consumer migrating between the two grid components doesn't need to remember two names.
10349
+ `selectable` remains canonical (mirrored from `wa-data-grid`); this alias reads and writes
10350
+ `selectable` directly, so there is no separate value to fall out of sync, and the bare `''`
10351
+ shorthand for `selectable`'s own `multiple` normalizes to `'multiple'` when read back through it.
10341
10352
  - `server: boolean = false` (`server`, reflected).
10342
10353
  - `size: 'xs' | 's' | 'm' | 'l' | 'xl' | 'small' | 'medium' | 'large' = 'm'` (`size`, reflected).
10343
10354
  - `sort: readonly Array<{ readonly id: string; readonly desc: boolean }> = []` (JS-only).
@@ -10350,11 +10361,15 @@ ARIA values as page-local positions rather than as the dataset-wide total.
10350
10361
  - `withSearch: boolean = false` (`with-search`, reflected).
10351
10362
 
10352
10363
  `DataGridColumn<Row>` accepts `id`, dot-path `field`, `label`, `align`, numeric `width` /
10353
- `minWidth` / `maxWidth`, `flex`, `formatter(value, row)`, computed `value(row)`, `sortable`,
10354
- `sortFn`, `comparator`, `sortDescFirst`, `sortUndefined`, `searchable`, `filterable`, `filterType`,
10355
- `filterFn`, `hidden`, `hideable`, `resizable`, `movable`, `pinnable`, `pinned`, `footer`,
10356
- `aggregation`, and `aggregatedFormatter`. A column with neither `field` nor `value` is an action
10357
- column: its formatter receives `undefined`, and it is not sorted or searched by default.
10364
+ `minWidth` / `maxWidth`, `flex`, `formatter(value, row)`, `cellTitle(row)`, computed `value(row)`,
10365
+ `sortable`, `sortFn`, `comparator`, `sortDescFirst`, `sortUndefined`, `searchable`, `filterable`,
10366
+ `filterType`, `filterFn`, `hidden`, `hideable`, `resizable`, `movable`, `pinnable`, `pinned`,
10367
+ `footer`, `aggregation`, and `aggregatedFormatter`. A column with neither `field` nor `value` is an
10368
+ action column: its formatter receives `undefined`, and it is not sorted or searched by default.
10369
+ `cellTitle(row) => string | undefined` renders as the generated cell's native `title`, symmetrical
10370
+ with `<lr-table>`'s `columns[].cellTitle` — e.g. the untruncated text behind an ellipsized cell, or
10371
+ a formatted timestamp behind a relative one. Returning `undefined` or `''` omits the `title`
10372
+ attribute entirely rather than rendering `title=""`, which would suppress an ancestor's own tooltip.
10358
10373
 
10359
10374
  Built-in sort algorithms are `alphanumeric`, `alphanumericCaseSensitive`, `text`,
10360
10375
  `textCaseSensitive`, `datetime`, and `basic`; `comparator` takes precedence. Built-in filter types
@@ -10431,12 +10446,16 @@ restores the exact pre-gesture width state; after a live move it emits the resto
10431
10446
  `lr-filter-change`; `lr-page-change`; `lr-row-collapse`; `lr-row-expand`; `lr-group-collapse` and
10432
10447
  `lr-group-expand` (frozen `{ key, columnId, value, rows }` snapshots); `lr-row-select` with
10433
10448
  canonical `{ selectedRowKeys, selectedRows }` plus mirrored `selectedKeys`; row expand/collapse
10434
- details use canonical `rowKey` plus mirrored `key`;
10435
- `lr-sort-change`; `lr-copy` (frozen `{ ok: true, text }` after fulfillment); `lr-copy-error`
10449
+ details use canonical `rowKey` plus mirrored `key`; cancelable `lr-sort-request` (frozen readonly
10450
+ `detail: { sort }`) precedes `lr-sort-change`; vetoing it leaves `sort` unchanged and suppresses
10451
+ `lr-sort-change`, mirroring `<lr-table>`'s identical `lr-sort-request`/`lr-sort` veto-then-commit
10452
+ contract;
10453
+ `lr-copy` (frozen `{ ok: true, text }` after fulfillment); `lr-copy-error`
10436
10454
  (frozen `{ ok: false, text, reason, error }` after failure); `lr-error` (compatibility failure
10437
- notification with no raw platform error text). Every library event bubbles and is composed; only `lr-cell-contextmenu` is
10438
- cancelable. Structured details and their owned collections are frozen. The toolbar search and active column-filter inputs re-dispatch `focus` and `blur` once
10439
- from the grid host as bubbling, composed native `FocusEvent`s, preserving `relatedTarget` so
10455
+ notification with no raw platform error text). Every library event bubbles and is composed; only
10456
+ `lr-cell-contextmenu` and `lr-sort-request` are cancelable. Structured details and their owned
10457
+ collections are frozen. The toolbar search and active column-filter inputs re-dispatch `focus` and
10458
+ `blur` once from the grid host as bubbling, composed native `FocusEvent`s, preserving `relatedTarget` so
10440
10459
  delegated ancestors can observe editor entry and exit without crossing the shadow boundary.
10441
10460
 
10442
10461
  **Slots:** `empty`, `loading`, `no-results`.
@@ -12929,12 +12948,18 @@ disagree.
12929
12948
  is used (the slotted-into-a-corner-slot case, the primary wiring)
12930
12949
  - `label: string = ''` — accessible name for the map region. A host `aria-label` takes precedence,
12931
12950
  followed by `label`, then the localized default
12951
+ - `frame: 'card' | 'plain' = 'card'` (reflected) — container treatment, on the library-wide `frame`
12952
+ vocabulary. `'plain'` removes `[part="base"]`'s border, background and corner radius, for a
12953
+ minimap placed in a host panel or toolbar that already draws its own surface, so the frame isn't
12954
+ doubled. The map's own hover/click affordances and the viewport rect stay either way — only the
12955
+ outer `base` decoration goes. Mirrors `lr-flow-controls`'/`lr-flow-run-status`'s identical `frame`.
12932
12956
 
12933
12957
  **Events:** none.
12934
12958
 
12935
12959
  **Slots:** none.
12936
12960
 
12937
- **CSS parts:** `base`, `map` (the scaled SVG), `node` (one rect per node), `viewport` (the
12961
+ **CSS parts:** `base` (the root wrapper; drops its border, background and corner radius under
12962
+ `frame="plain"`), `map` (the scaled SVG), `node` (one rect per node), `viewport` (the
12938
12963
  exact visible view rectangle), `viewport-hit-area` (the transparent draggable/focusable target),
12939
12964
  `instructions` (visually hidden keyboard help), and `live-region` (the `aria-hidden` mirror of the
12940
12965
  latest viewport-change text).
@@ -13368,7 +13393,7 @@ activated by pointer, Enter, or Space. Its non-cancelable, bubbling, composed
13368
13393
  `detail: LyraTimelineClusterActivateDetail` is `{ items: readonly LyraTimelineItem[] }`: a fresh
13369
13394
  frozen snapshot of the cluster members in document order, preserving each element's identity.
13370
13395
  `LyraTimelineClusterActivateDetail {
13371
- items: unknown;
13396
+ items: readonly LyraTimelineItem[];
13372
13397
  }`
13373
13398
  Use it to open a consumer-owned popover, dialog, or detail view. `lr-timeline-item` emits no events.
13374
13399
  Read the reactive `itemCount` property after changing assigned items; the internal slot's
@@ -13794,6 +13819,7 @@ These named interfaces and helper signatures are available to typed integrations
13794
13819
  readonly maxWidth?: number;
13795
13820
  readonly flex?: number;
13796
13821
  readonly formatter?: (value: unknown, row: Row) => string | TemplateResult | Node | unknown;
13822
+ readonly cellTitle?: (row: Row) => string | undefined;
13797
13823
  readonly value?: (row: Row) => unknown;
13798
13824
  readonly sortable?: boolean;
13799
13825
  readonly sortFn?: DataGridSortAlgorithm;
@@ -16004,7 +16030,7 @@ contract.
16004
16030
  a property/lit-html binding (`.items=`), not an HTML attribute. This remains the compatibility
16005
16031
  source whenever `source` is unset. Its sequence is copied, bounded, and frozen while generic row
16006
16032
  identities are retained; reassign a new array after sequence changes.
16007
- - `source?: VirtualListSource` (attribute: false) — a readonly array or a count/index-backed
16033
+ - `source?: LyraVirtualListSource` (attribute: false) — a readonly array or a count/index-backed
16008
16034
  `{ readonly count: number; itemAt(index): unknown; keyAt?(index): string | number;
16009
16035
  indexOfKey?(key): number }`. When set it takes precedence over `items`. The indexed form performs
16010
16036
  bounded random access for only the rendered window instead of allocating `0…count`; invalid counts
@@ -16030,7 +16056,7 @@ list's `base` scroll container exposes horizontal scrolling for that explicit op
16030
16056
  which is only a safe identity while a collection never reorders/inserts/removes — provide this
16031
16057
  whenever possible, or scroll position and per-row DOM state (e.g. an `<audio>` element's playback
16032
16058
  position) can attach to the wrong row across a mutation.
16033
- - `groups?: VirtualListGroup[]` (attribute: false) — renders a labeled marker at each group's
16059
+ - `groups?: LyraVirtualListGroup[]` (attribute: false) — renders a labeled marker at each group's
16034
16060
  `startIndex` as a measured virtual entry immediately before that row. Its live block size
16035
16061
  contributes to every following offset, so a variable-height or late-resizing marker never covers
16036
16062
  the group's first row. Markers remain windowed with their rows. Groups are sorted by `startIndex`;
@@ -16040,7 +16066,7 @@ list's `base` scroll container exposes horizontal scrolling for that explicit op
16040
16066
  that renders its own group header as an ordinary row (and would otherwise end up with two stacked
16041
16067
  headers) but still needs this component to know where each group starts, e.g. to drive
16042
16068
  `renderStickyGroup` below. Omitting `label` entirely still falls back to rendering `key`.
16043
- - `renderStickyGroup?: (group: VirtualListGroup) => unknown` (attribute: false) — renders a pinned
16069
+ - `renderStickyGroup?: (group: LyraVirtualListGroup) => unknown` (attribute: false) — renders a pinned
16044
16070
  copy of whichever `groups` entry the viewport is currently inside, into a `[part="sticky-group"]`
16045
16071
  overlay that stays at the top of the scroll viewport and is pushed out by the overlap as the next
16046
16072
  group's header arrives (rather than swapped abruptly at the boundary). Native `position: sticky` on
@@ -16093,12 +16119,12 @@ progress` style, and gates `lr-load-more` while a consumer's fetch is in flight.
16093
16119
  - `hasMore: boolean = false` (attribute `has-more`, reflected) — when true, scrolling near the bottom
16094
16120
  fires `lr-load-more` (gated by `loading`).
16095
16121
 
16096
- **Exported types:** `VirtualListRowHeight = number | 'auto'`;
16097
- `VirtualListSource<T> = readonly T[] | VirtualListIndexedSource<T>` and
16098
- `VirtualListIndexedSource<T> { readonly count: number; itemAt(index): T; keyAt?(index): string |
16099
- number; indexOfKey?(key: string | number): number }`; `VirtualListRange { start: number; end: number }` (the `lr-visible-range-change`
16100
- detail shape); `VirtualListGroup { key: string | number; label?: string; startIndex: number }` — the
16101
- shape consumed by `groups` above; `VirtualListScroll { scrollTop: number; viewportHeight: number }` —
16122
+ **Exported types:** `LyraVirtualListRowHeight = number | 'auto'`;
16123
+ `LyraVirtualListSource<T> = readonly T[] | LyraVirtualListIndexedSource<T>` and
16124
+ `LyraVirtualListIndexedSource<T> { readonly count: number; itemAt(index): T; keyAt?(index): string |
16125
+ number; indexOfKey?(key: string | number): number }`; `LyraVirtualListRange { start: number; end: number }` (the `lr-visible-range-change`
16126
+ detail shape); `LyraVirtualListGroup { key: string | number; label?: string; startIndex: number }` — the
16127
+ shape consumed by `groups` above; `LyraVirtualListScroll { scrollTop: number; viewportHeight: number }` —
16102
16128
  the `lr-virtual-scroll` detail shape.
16103
16129
  `groupByRecency(items, options?)` is a DOM-free helper that returns non-empty
16104
16130
  Today/Yesterday/Previous 7 Days/Older buckets, preserves input order within each bucket, and accepts
@@ -16143,12 +16169,12 @@ math, and any row element can be recycled or removed on the next update.
16143
16169
  **Events:** `lr-load-more` (no detail — fired once per approach to the bottom of the list while
16144
16170
  `has-more` is true and `loading` is false; does not refire on every scroll tick while still near the
16145
16171
  bottom — scrolling back away from the bottom and returning, or `items` growing enough to move the
16146
- window away from the end, re-arms it), `lr-visible-range-change` (`detail: VirtualListRange`, the
16172
+ window away from the end, re-arms it), `lr-visible-range-change` (`detail: LyraVirtualListRange`, the
16147
16173
  current visible, non-overscanned item index range — fired only when it actually changes; it was
16148
16174
  spelled `lr-visible-range-changed` before 10.0.0, the only past-tense `-changed` spelling among 58
16149
16175
  `-change`-family events, so a convention-driven `lr-${x}-change` listener silently missed it),
16150
16176
  `lr-virtual-scroll`
16151
- (`detail: VirtualListScroll` — the scroll container moved; emitted from the same animation frame that
16177
+ (`detail: LyraVirtualListScroll` — the scroll container moved; emitted from the same animation frame that
16152
16178
  already coalesces native `scroll` events, so a fling produces at most one per frame and none at all
16153
16179
  when the position did not change. Unlike `lr-visible-range-change`, which only fires on index-range
16154
16180
  changes, this reports _sub-row_ movement, which is what scroll-linked layout needs)
@@ -16592,7 +16618,7 @@ invention (no `wa-*`/`sl-*` counterpart).
16592
16618
  against the component's allocation; `'inline'`/`'overlay'` force that presentation.
16593
16619
  - `effectiveMode: LyraResponsivePanelEffectiveMode` (readonly) — the currently resolved
16594
16620
  `'inline'|'overlay'` presentation.
16595
- - `variant: LyraResponsivePanelVariant = 'fullscreen'` (reflected) — only affects the overlay
16621
+ - `shape: LyraResponsivePanelShape = 'fullscreen'` (reflected) — only affects the overlay
16596
16622
  presentation's visual treatment: `'fullscreen'` covers the whole viewport; `'bottom-sheet'`
16597
16623
  anchors to its block-end edge and does not cover the full height. Has no visual effect while the effective
16598
16624
  presentation resolves to `'inline'`.
@@ -16679,7 +16705,7 @@ presentation participates in the shared modal stack rather than nesting a `<lr-d
16679
16705
  The granular route exports the pure
16680
16706
  `resolveResponsivePanelEffectiveMode(mode: LyraResponsivePanelMode,
16681
16707
  belowBreakpoint: boolean): LyraResponsivePanelEffectiveMode` resolver alongside the
16682
- `LyraResponsivePanelMode`/`LyraResponsivePanelEffectiveMode`/`LyraResponsivePanelVariant`/
16708
+ `LyraResponsivePanelMode`/`LyraResponsivePanelEffectiveMode`/`LyraResponsivePanelShape`/
16683
16709
  `LyraResponsivePanelCloseReason`/`LyraResponsivePanelModeChangeDetail` types. It's the same logic
16684
16710
  the element's allocation observer calls: `'inline'`/`'overlay'` pass straight through
16685
16711
  unchanged; `'auto'` resolves to `'overlay'` when `belowBreakpoint` is true, `'inline'` otherwise —
@@ -16821,6 +16847,23 @@ A focusable action row owned by `<lr-menu>`. The host itself carries `role="menu
16821
16847
  - `type: 'normal' | 'checkbox' = 'normal'`
16822
16848
  - `checked: boolean = false` — meaningful only for `type="checkbox"`
16823
16849
  - `loading: boolean = false`
16850
+ - `href?: string` — when set to a safe link URL (`http:`/`https:`/`blob:`/`mailto:`/relative; see
16851
+ `safeLinkHref`, or `safeDownloadHref` when `download` is set, which drops `mailto:`),
16852
+ `[part="base"]` renders as a real `<a href=…>` instead of a `<span>`, and activation (click, or
16853
+ the owning menu's Enter/Space handling, which forwards through `click()` for a link item so the
16854
+ anchor's own native default action runs) navigates there in addition to firing the usual
16855
+ `select()`/`lr-select` contract. An unsafe/unparseable value falls back to the plain `<span>`,
16856
+ matching `lr-button`'s identical fallback
16857
+ - `target?: string` — native anchor `target`, used only while `href` resolves to a link. Setting it
16858
+ (e.g. `'_blank'`) always force-adds `noopener noreferrer` to the rendered anchor's `rel`,
16859
+ matching `lr-button`'s identical pattern
16860
+ - `rel?: string` — independently settable author relationship tokens, no default. Author tokens are
16861
+ merged rather than replaced: `opener` is always stripped, and whenever `target` is set the
16862
+ non-removable `noopener noreferrer` floor is added, so a same-tab link (no `target`) keeps
16863
+ exactly the author's tokens while a link opening a new context can never lose the guard
16864
+ - `download?: string` — native anchor `download` attribute, used only while `href` resolves to a
16865
+ link. Presence narrows the safe-URL allowlist to `safeDownloadHref`'s, which drops `mailto:` — a
16866
+ mail handoff names no retrievable bytes, so it cannot be a download target
16824
16867
  - `hasSubmenu: boolean` (read-only)
16825
16868
  - `submenuOpen: boolean = false` — transient live state; assigning it drives an existing submenu
16826
16869
  without moving focus and disconnect resets it
@@ -16833,6 +16876,13 @@ A focusable action row owned by `<lr-menu>`. The host itself carries `role="menu
16833
16876
  - `closeSubmenu(): Promise<void>`
16834
16877
  - `getTextLabel(): string` returns the accessibility-visible label used by type-ahead
16835
16878
 
16879
+ The computed name is derived from the row's own visible label and does not depend on whether the
16880
+ menu is currently displayed, so a row inside a closed dropdown — whose popup is `visibility:
16881
+ hidden` — is named the same as an open one, and `getTextLabel()` drives type-ahead either way.
16882
+ A row with no label text carries **no** `aria-label` attribute rather than an empty one, so the
16883
+ browser falls back to the row's own content; an `aria-label` or `aria-labelledby` you set yourself,
16884
+ including an explicitly empty value, still wins.
16885
+
16836
16886
  A checkbox activation first emits cancelable `lr-menu-item-change` with the proposed
16837
16887
  `detail: { value, checked }`. Preventing that event retains the current checked state; the owning
16838
16888
  menu's canonical `lr-select` still follows. A submenu parent is a disclosure instead of an action:
@@ -16904,6 +16954,13 @@ properties, slots, parts, methods, checkbox/state events, roving focus, and cano
16904
16954
  `lr-select` behavior. Its host also exposes native, non-bubbling, composed `focus` and `blur`
16905
16955
  events.
16906
16956
 
16957
+ **Attributes:** `href`, `target`, `rel`, and `download` — the same link-rendering properties
16958
+ documented above for `<lr-menu-item>`, settable directly in markup
16959
+ (`<lr-dropdown-item href="/settings" target="_blank">`). The `rel` guard is identical: author
16960
+ tokens merge rather than get replaced, `opener` is always stripped, and setting `target` force-adds
16961
+ the non-removable `noopener noreferrer` floor, so a same-tab link keeps exactly the author's tokens
16962
+ while a link opening a new context can never lose the guard.
16963
+
16907
16964
  **Events:** native, non-bubbling, composed, non-cancelable `focus` and `blur` (`FocusEvent`) when
16908
16965
  the focusable host gains or loses focus, plus the shared menu-item events above.
16909
16966
 
@@ -17970,7 +18027,10 @@ abort stale contexts, whose callbacks become inert.
17970
18027
 
17971
18028
  The adapter's required `clearValue` is used when the active chip is removed. Its optional
17972
18029
  `isEmpty(value)` defines domain emptiness; without one, the bar compares against `clearValue`
17973
- (including shallow string-array equality). Its optional `formatValue` controls chip display.
18030
+ (including shallow string-array equality). Its optional `formatValue(value, locale)` controls chip
18031
+ display; `locale` is the filter bar's `effectiveLocale`, the same value every built-in filter
18032
+ type's own chip formatting already receives, so an existing single-argument `formatValue`
18033
+ implementation keeps working unchanged — JS simply ignores a second parameter it never declared.
17974
18034
  Consequently `false` remains a meaningful active value unless the adapter explicitly declares it
17975
18035
  empty. Custom values may be strings, string arrays, booleans, or `undefined`, so controls such as
17976
18036
  `lr-time-range`, `lr-checkbox`, and an async-backed `lr-combobox` can participate in the same
@@ -18389,7 +18449,7 @@ These named interfaces and helper signatures are available to typed integrations
18389
18449
  readonly valueFromEvent: (event: Event) => LyraFilterBarFieldValue;
18390
18450
  readonly clearValue: LyraFilterBarFieldValue;
18391
18451
  readonly isEmpty?: (value: LyraFilterBarFieldValue) => boolean;
18392
- readonly formatValue?: (value: LyraFilterBarFieldValue) => string;
18452
+ readonly formatValue?: (value: LyraFilterBarFieldValue, locale: string) => string;
18393
18453
  }`
18394
18454
  Import: `@aceshooting/lyra-ui/components/layout/filter-bar/filter-bar.class.js`.
18395
18455
  `LyraFilterBarCustomControlContext {
@@ -20904,8 +20964,16 @@ once. Toast-owned work instead settles and is discarded when its region disconne
20904
20964
  subtree remains visible but is inert and aria-hidden.
20905
20965
 
20906
20966
  **CSS parts:** `base`, `icon`, `message`, and `close-button` / `close-button__base` on the same
20907
- native close button. The pinned surface exposes no component CSS custom properties, custom states,
20908
- form association, native-event relays, or delegated native methods.
20967
+ native close button. The pinned surface exposes no custom states, form association, native-event
20968
+ relays, or delegated native methods.
20969
+
20970
+ **Themeable custom properties:** the close button's two state hooks are
20971
+ `--lr-alert-close-hover-bg` (its `:hover` surface; default `color-mix(in oklab, transparent,
20972
+ var(--lr-color-mix-partner) var(--lr-color-mix-hover))`) and `--lr-alert-close-active-bg` (its
20973
+ `:active` surface, scoped independently from the hover property; default `color-mix(in oklab,
20974
+ transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active))`). Each is an inline fallback
20975
+ at the relevant state, so setting one on the alert or an ancestor rethemes only that close-button
20976
+ state.
20909
20977
 
20910
20978
  By default the light-DOM `<lr-alert>` host owns `role="alert"`, so initially-open/static alerts and
20911
20979
  alerts shown later expose one assertive, content-derived semantic surface without duplicating it in
@@ -21360,13 +21428,18 @@ extension?: string }`. Descriptor labels/descriptions are consumer-supplied, alr
21360
21428
  substitute your own server-generated download instead of the built-in client-side one),
21361
21429
  `lr-export-complete` (`detail: { format: 'csv' | 'json' }`, fires only after a non-cancelled
21362
21430
  built-in download completes), `lr-export-error` (`detail: { format: 'csv' | 'json', error:
21363
- unknown }`, fires when a built-in export cannot be serialized or downloaded; activation does not
21364
- throw into consumer code), `lr-show`, `lr-hide` (cancelable format-menu visibility transitions;
21365
- self-imposed closes caused by disablement, loading, or an unusable format list emit neither event)
21431
+ unknown }`, fires when a built-in export cannot be serialized or downloaded; the same failure is
21432
+ also shown via the trigger's `trigger-error` part and announced through the shared light-DOM live
21433
+ region, so a listener is needed only for additional handling; activation does not throw into
21434
+ consumer code), `lr-show`, `lr-hide` (cancelable format-menu visibility transitions; self-imposed
21435
+ closes caused by disablement, loading, or an unusable format list emit neither event)
21366
21436
 
21367
21437
  **Slots:** none.
21368
21438
 
21369
- **CSS parts:** `trigger`, `menu`, `menu-item`, `format-label`, `format-description`
21439
+ **CSS parts:** `trigger`, `trigger-error` (present alongside `trigger` on the same button —
21440
+ `part="trigger trigger-error"` — after a built-in CSV/JSON export fails; cleared on the next export
21441
+ attempt regardless of outcome — style with `::part(trigger-error)`), `menu`, `menu-item`,
21442
+ `format-label`, `format-description`
21370
21443
 
21371
21444
  **Themeable custom properties:** shared tokens only, including `--lr-popover-viewport-clamp`
21372
21445
  (default `92vw`) — the shared narrow-viewport ceiling the `menu`'s max-inline-size is `min()`ed
@@ -26681,7 +26754,7 @@ toggle, not a duplicate). The deprecated type aliases `ChartPoint`, `Series` (su
26681
26754
  removed — update TypeScript imports to the canonical `Lyra*`-prefixed names. The internal
26682
26755
  `lockChartType` helper is no longer exported from the public `chart.ts` entry point; it is now used
26683
26756
  solely by `<lr-histogram>` to keep its `type` fixed to `'bar'` — every other `lr-*-chart` subclass
26684
- keeps its `type` writable, matching its mirrored WA counterpart. `chart-loader.ts`'s v8 compatibility
26757
+ keeps its `type` writable, matching its mirrored WA counterpart. `chart-core-loader.ts`'s v8 compatibility
26685
26758
  facade is removed; `./components/charts/chart/chart-core-loader.js` and
26686
26759
  `./components/charts/chart/chart-feature-loader.js` are now the real public entry points.
26687
26760
 
@@ -26770,7 +26843,8 @@ structured points retain their y-value formatting.
26770
26843
  - `datasets: readonly LyraChartSeries[] = []` (attribute: false) — `LyraChartSeries { readonly
26771
26844
  label: string; readonly data?: readonly (number|null)[]; readonly points?: readonly
26772
26845
  LyraChartPoint[]; readonly color?: string|readonly string[]; ... }`. The deprecated `Series` and
26773
- `ChartPoint` names remain aliases for migration. `LyraChartPoint { readonly x: number; readonly
26846
+ `ChartPoint` names were removed in 9.0.0 — import `LyraChartSeries`/`LyraChartPoint` instead.
26847
+ `LyraChartPoint { readonly x: number; readonly
26774
26848
  y: number; readonly r?: number; readonly label?: string }`: `r` is the bubble
26775
26849
  radius, and the optional per-point `label` is retained by events, CSV export, keyboard
26776
26850
  announcements, generated summaries, and the accessible table. Point wording is localized as
@@ -26804,9 +26878,11 @@ structured points retain their y-value formatting.
26804
26878
  would clip. Its pressed state follows `hiddenDatasets` whenever that controlled snapshot is
26805
26879
  defined, otherwise the effective dataset's declarative `hidden` value before Chart.js is ready
26806
26880
  and across chart type/plugin rebuilds.
26807
- - `legendMode: LyraChartLegendMode = 'dataset'` (attribute `legend-mode`) — `dataset` preserves
26808
- dataset toggles. `datum` shows one category toggle per slice in pie, doughnut and polar-area
26809
- charts; other types retain dataset legends. Category names use source labels with localized
26881
+ - `legendMode: LyraChartLegendMode = 'auto'` (attribute `legend-mode`) — `auto` resolves to `datum`
26882
+ on pie, doughnut and polar-area charts and to `dataset` everywhere else, so a single-dataset slice
26883
+ chart labels every slice rather than emitting one aggregate row that identifies only the first
26884
+ colour. `dataset` forces dataset toggles even on a slice chart. `datum` shows one category toggle
26885
+ per slice in pie, doughnut and polar-area charts; other types retain dataset legends. Category names use source labels with localized
26810
26886
  numbered fallbacks. Colors and values come from the first dataset. With multiple datasets/rings,
26811
26887
  a category toggle hides that source index in every ring, matching Chart.js category visibility.
26812
26888
  - `hiddenDatums: readonly number[] = []` (attribute: false) — clone-owned hidden source category
@@ -26981,6 +27057,12 @@ token layer yet, the helper reads the `--lr-theme-color-chart-N` inputs directly
26981
27057
  a fresh eight-color array each call (safe to mutate) and let chart-adjacent UI, KPI tiles, or the
26982
27058
  `Series` array itself come from one source of truth.
26983
27059
 
27060
+ The same module also exports `ChartThemeColors`, the resolved chrome colours a chart paints around
27061
+ its series. Every field is an already-resolved CSS colour string, because canvas silently ignores a
27062
+ raw `var(--lr-…)` string and would paint nothing; `<lr-box-plot>` consumes the same shape, so a
27063
+ consumer drawing its own canvas overlay beside a chart can match the grid, tick, legend and tooltip
27064
+ chrome exactly rather than re-deriving it.
27065
+
26984
27066
  Import the standalone form from `.../chart/chart-colors.js`, not from `.../chart/chart.js`: the
26985
27067
  latter is `<lr-chart>`'s registration entry, so it defines the element (and pulls in `<lr-skeleton>`)
26986
27068
  as a side effect. `chart-colors.js` is side-effect-free and carries nothing but the palette helpers,
@@ -27212,7 +27294,8 @@ passthrough). Not a subclass of `LyraChart`.
27212
27294
  - `labels: readonly string[] = []` (attribute: false)
27213
27295
  - `datasets: readonly LyraLiteChartSeries[] = []` (attribute: false) —
27214
27296
  `LyraLiteChartSeries { readonly label: string; readonly data: readonly (number|null)[];
27215
- readonly color?: string }`; the deprecated `LiteSeries` name remains an alias for migration.
27297
+ readonly color?: string }`. The legacy `LiteSeries` name was removed in 9.0.0 — import
27298
+ `LyraLiteChartSeries` instead.
27216
27299
  `color` accepts a valid CSS `color`, while invalid values,
27217
27300
  declaration-breaking input, and `url()` paint servers fall back to the built-in palette. A
27218
27301
  runtime entry whose required `data` member is not an array is dropped while valid siblings
@@ -27764,7 +27847,23 @@ bounded-alternative sampling notice)
27764
27847
  concrete semantic fallbacks rather than retaining a prior canvas paint), but declared in its own stylesheet, not a
27765
27848
  re-export: `lr-box-plot` has no `zoom`, so no `reset-zoom-button` chrome exists here. A `BoxPlotSeries`
27766
27849
  that sets no `color` is assigned an entry from the same `--lr-color-chart-1..8` ramp `lr-chart` uses,
27767
- so `--lr-theme-color-chart-*` retheming reaches box plots too. `--lr-chart-pattern-step`
27850
+ so `--lr-theme-color-chart-*` retheming reaches box plots too. That resolved color then layers two
27851
+ further per-series override tokens for the canvas paint, each wrapping modulo 8 like the underlying
27852
+ ramp and mirroring `lr-chart`'s own `--border-color-N`/`--fill-color-N` palette-override mechanism
27853
+ under a box-plot-namespaced name, since box-plot has no raw `config` passthrough to piggyback on:
27854
+ `--lr-box-plot-border-color-1` through `--lr-box-plot-border-color-8` (defaulting respectively to
27855
+ `--lr-color-chart-1` through `--lr-color-chart-8`) set the box-outline stroke color, and
27856
+ `--lr-box-plot-fill-color-1` through `--lr-box-plot-fill-color-8` (the same eight defaults) set the
27857
+ box fill and its legend swatch. In full, the stroke tokens are `--lr-box-plot-border-color-1`,
27858
+ `--lr-box-plot-border-color-2`, `--lr-box-plot-border-color-3`, `--lr-box-plot-border-color-4`,
27859
+ `--lr-box-plot-border-color-5`, `--lr-box-plot-border-color-6`, `--lr-box-plot-border-color-7` and
27860
+ `--lr-box-plot-border-color-8`; the fill tokens are `--lr-box-plot-fill-color-1`,
27861
+ `--lr-box-plot-fill-color-2`, `--lr-box-plot-fill-color-3`, `--lr-box-plot-fill-color-4`,
27862
+ `--lr-box-plot-fill-color-5`, `--lr-box-plot-fill-color-6`, `--lr-box-plot-fill-color-7` and
27863
+ `--lr-box-plot-fill-color-8`. `--lr-box-plot-border-width` (default `var(--lr-border-width-thin)`)
27864
+ sets the canvas box-outline stroke width in pixels — the same override mechanism as `lr-chart`'s
27865
+ `--border-width`. `--lr-box-plot-item-radius` (default `0`) sets the radius, in pixels, of the
27866
+ individual raw-sample dots drawn alongside each box; `0` disables them. `--lr-chart-pattern-step`
27768
27867
  (default `var(--lr-space-2xs)`) sizes the forced-colors legend texture and
27769
27868
  `--lr-chart-canvas-hover-outline-width` (default `var(--lr-border-width-thin)`) sizes the `canvas`
27770
27869
  hover outline; `--lr-chart-canvas-hover-outline-color` (default `var(--lr-chart-grid-color)`) sets
@@ -27795,8 +27894,9 @@ loads are memoized per page.
27795
27894
  ```
27796
27895
 
27797
27896
  **Known gotchas:**
27798
- - no raw `config` passthrough — limited to the properties above; can't reach the underlying
27799
- controller's own options (`itemRadius`, `outlierRadius`, `coef`).
27897
+ - no raw `config` passthrough — limited to the properties above, plus the `--lr-box-plot-border-width`
27898
+ and `--lr-box-plot-item-radius` CSS hooks; the underlying controller's other options
27899
+ (`outlierRadius`, `coef`) remain unreachable.
27800
27900
  - Chart.js receives `effectiveLocale`; generated numeric summaries use it, the y axis moves to
27801
27901
  logical start in RTL, and live ancestor `lang`/`dir` changes redraw the already-mounted canvas
27802
27902
  without requiring another box property write. Canvas tooltip/axis colors are token-driven, and
@@ -27859,6 +27959,14 @@ These named interfaces and helper signatures are available to typed integrations
27859
27959
  }`
27860
27960
 
27861
27961
  - **`components-charts-chart-chart-colors-contracts`** — Supporting data types and helpers for this component family.
27962
+ Import: `@aceshooting/lyra-ui/components/charts/chart/chart-colors.js`.
27963
+ `ChartThemeColors {
27964
+ grid: string;
27965
+ tick: string;
27966
+ legend: string;
27967
+ tooltipBg: string;
27968
+ tooltipText: string;
27969
+ }`
27862
27970
  Import: `@aceshooting/lyra-ui/components/charts/chart/chart-colors.js`.
27863
27971
  `seriesPalette(element?: Element | null): string[]`
27864
27972
  Import: `@aceshooting/lyra-ui/components/charts/chart/chart-colors.js`.
@@ -29429,6 +29537,13 @@ span boundary that `Range.surroundContents()` can't wrap stays unpainted (still
29429
29537
  localized label; later loading and error transitions use the shared document-level polite and
29430
29538
  assertive sinks, respectively, without adding live semantics inside the viewer shadow.
29431
29539
 
29540
+ **Known capability boundaries** — deliberate, not defects, and stated here so they need not be
29541
+ rediscovered: text search and `LyraAnchor` text-quote resolution match **exact** text only, after
29542
+ whitespace and soft-hyphen normalization, with no fuzzy or approximate mode. Non-Latin
29543
+ cMap-encoded fonts get no special handling beyond whatever the `pdfjs-dist` peer resolves on its
29544
+ own — no `cMapUrl`/`cMapPacked` is configured. A scanned or image-only PDF has no text layer at
29545
+ all, so it has nothing to select, search or anchor into; it still renders and paginates normally.
29546
+
29432
29547
  `page`, `page-canvas`, `text-layer`, `text-span`, `search-match` and `search-match-active` are
29433
29548
  rendered inside the virtualizing `lr-virtual-list`'s own shadow root and forwarded out through
29434
29549
  `exportparts`, so `lr-pdf-viewer::part(page)` (and each of the others) works from a consumer
@@ -30142,6 +30257,11 @@ is absent, it uses the localized comparison label. Dynamic host-label changes up
30142
30257
  `sync-scroll="false"`.
30143
30258
  - `anchor: LyraAnchor | string | null = null` (attribute: false) — sends the same target to both
30144
30259
  preview panes; repeated assignment of the same value still re-runs.
30260
+ - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"30rem"`) that overrides
30261
+ `--lr-document-compare-pane-max-height` declaratively, giving each `view="side-by-side"` pane its
30262
+ maximum block size before it scrolls internally. The value is sanitized as a CSS length, so an
30263
+ invalid one is ignored and the token default applies; the unset default `''` also defers to the
30264
+ token, so setting nothing preserves existing behaviour.
30145
30265
 
30146
30266
  **Exported types:** `DocumentCompareVersion`; `LyraDocumentCompareView = 'diff' |
30147
30267
  'side-by-side'`; `DocumentComparePaneSide = 'old' | 'new'`.
@@ -30805,7 +30925,7 @@ leaks through as the composite element's own focus/blur.
30805
30925
  Sanitized Markdown-to-HTML rendering (GFM tables, fenced code blocks, links, blockquotes) built on
30806
30926
  two optional peer dependencies — `marked` (parsing) and `dompurify` (sanitizing) — both lazy-loaded
30807
30927
  independently via `markdown-loader.ts`'s `loadMarkdownDeps()` on first connect, cached per page the
30808
- same way `chart-loader.ts`/`map-loader.ts` cache their load promise so every `<lr-markdown>`
30928
+ same way `chart-core-loader.ts`/`map-loader.ts` cache their load promise so every `<lr-markdown>`
30809
30929
  instance on a page shares one load. `heading`/`code`/`blockquote`/`table`/`link`/`image` tokens are
30810
30930
  rendered through a `marked` renderer override that injects `part="..."` attributes directly into the
30811
30931
  produced HTML in a single pass (no second DOM walk after insertion).
@@ -30966,7 +31086,7 @@ rendered fenced or indented `code-block`), plus shared tokens `--lr-space-xs/-s/
30966
31086
  `--lr-radius`.
30967
31087
 
30968
31088
  **Optional peer deps:** `marked`, `dompurify` (both lazy-loaded via `markdown-loader.ts`'s
30969
- `loadMarkdownDeps()`, mirroring `chart-loader.ts`'s two-independent-optional-peers shape). Each half
31089
+ `loadMarkdownDeps()`, mirroring `chart-core-loader.ts`'s two-independent-optional-peers shape). Each half
30970
31090
  is loaded and caught independently — a consumer who installs only `marked` and explicitly sets
30971
31091
  `html-mode="trusted"` (so `dompurify` is never needed) is a valid, supported combination. Also `shiki`,
30972
31092
  the same optional peer `<lr-code-block>` uses, for `highlightCode`'s fenced-block syntax
@@ -32408,10 +32528,11 @@ highlighted markup.
32408
32528
  to the default dynamic-import path unchanged. For a TypeScript annotation, use
32409
32529
  `import type { ShikiLanguageInput } from '@aceshooting/lyra-ui/components/conversation/code-block/code-block.js'`;
32410
32530
  the type-only granular import emits no registration side effect.
32411
- `refreshTheme(): void` re-reads the resolved theme for syntax highlighting.
32412
- **Methods:** `scrollToAnchor(target)` — resolves a `line-range` anchor (or a `highlights` id string
32413
- resolving to one) by scrolling its start line into view within `[part="body"]`; resolves `false`
32414
- when the anchor isn't a `line-range`, the id isn't found, or the start line is out of bounds.
32531
+
32532
+ **Methods:** `scrollToAnchor(target)` — resolves a `line-range` anchor (or a `highlights` id string
32533
+ resolving to one) by scrolling its start line into view within `[part="body"]`; resolves `false`
32534
+ when the anchor isn't a `line-range`, the id isn't found, or the start line is out of bounds.
32535
+ `refreshTheme(): void` re-reads the resolved theme for syntax highlighting.
32415
32536
 
32416
32537
  **Events:** `lr-copy` (frozen `detail: { ok: true, text }` — fires only after the raw `code` value
32417
32538
  was written successfully), `lr-error` (`detail: null` — generic notification when clipboard writing
@@ -32723,7 +32844,10 @@ The internal `lr-slider` renders with its own value readout suppressed (`.showVa
32723
32844
  the current temperature is instead shown via this component's own `[part="temperature-value"]` span,
32724
32845
  which formats `temperature` through the cached `Intl.NumberFormat` for the effective locale with up
32725
32846
  to 20 fractional digits, matching `lr-slider`'s own numeric readout. For example, `temperature="0.7"`
32726
- under `locale="de-DE"` displays `0,7`.
32847
+ under `locale="de-DE"` displays `0,7`. When the full decimal expansion would exceed 24 characters —
32848
+ reachable only through an extreme `temperatureMin`/`temperatureMax`/`temperatureStep` combination —
32849
+ the readout switches to bounded scientific notation at up to 6 significant digits instead, so
32850
+ `1e308` renders as `7E+307` rather than a 300-digit string that would overflow the label.
32727
32851
 
32728
32852
  The panel's own `temperature` property mirrors the nested slider's _live_ value on every one of its
32729
32853
  `lr-input` events (drag/key-repeat), not just its committed `lr-change` — so `temperature` (and
@@ -34091,6 +34215,13 @@ allocating every preceding part for each citation in a citation-heavy or growing
34091
34215
  **Properties:** `parts: MessagePart[] = []` (attribute: false); `contentMode: MessagePartsContentMode =
34092
34216
  'markdown'` (attribute `content-mode`, reflected) and `showReasoning: boolean = true` (attribute
34093
34217
  `show-reasoning`, reflected, with string-aware true-default conversion);
34218
+ `maxRenderedParts: number = 0` (attribute `max-rendered-parts`) — `0` (the default) renders every
34219
+ part, unbounded, matching every prior release; a positive value windows rendering to the newest N
34220
+ parts without touching the host's `parts` data. Citation ranks are unaffected by the window: they
34221
+ are still derived from the full sequence first, in the same linear prepass, so a badge's number
34222
+ stays stable even once an earlier citation rolls out of the rendered window. Opt in for a message
34223
+ that can grow an unusually large number of interleaved parts (e.g. a long agentic run with many
34224
+ tool-call/tool-result pairs), where unbounded live DOM can visibly stall the main thread.
34094
34225
  `renderPart?: MessagePartRenderer` (attribute: false), where returning `undefined` delegates that
34095
34226
  part to the built-in renderer; `accessibleLabel: string | null = null` (attribute `aria-label`).
34096
34227
 
@@ -35334,8 +35465,9 @@ already apply live via `lr-change`, so this slot is purely optional; only visual
35334
35465
  assigned elements.
35335
35466
 
35336
35467
  **CSS parts:** `backdrop`, `panel`, `header`, `title`, `subtitle`, `search-row`, `search-input`,
35337
- `defaults-row`, `defaults-toggle`, `defaults-hint`, `body` (the keyboard-focusable scroll region),
35338
- `empty`, `category`, `category-heading`,
35468
+ `search-clear` (replaces the native search-cancel glyph the component resets; rendered only while
35469
+ the field has text), `defaults-row`, `defaults-toggle`, `defaults-hint`, `body` (the
35470
+ keyboard-focusable scroll region), `empty`, `category`, `category-heading`,
35339
35471
  `category-count`, `category-list`, `tool-row`, `tool-checkbox`, `tool-name`, `tool-icon`,
35340
35472
  `tool-description`, `tool-disabled-reason`, `limit`, `load-more`, `footer`
35341
35473
 
@@ -35430,6 +35562,10 @@ plain text) — this component has no dependency on either.
35430
35562
  behavior differences, see prose below.
35431
35563
  - `durationMs?: number` (attribute `duration-ms`) — how long the reasoning took. Omitted entirely
35432
35564
  (nothing rendered in `'post-hoc'`, a pulsing placeholder in `'live'`) while unset.
35565
+ - `follow: boolean = true` (reflected) — whether live, expanded content follows the transcript tail.
35566
+ A user scroll updates this property and emits `lr-follow-change`; a direct assignment is
35567
+ controlled input and emits nothing. Being a `true`-defaulting boolean, `follow="false"` in plain
35568
+ HTML is honoured (it uses `trueDefaultBooleanConverter`), so the attribute form is load-bearing.
35433
35569
 
35434
35570
  **Methods:** `scrollToBottom(): void` — scrolls `[part="body"]` to its current bottom immediately
35435
35571
  (no smooth-scroll animation). Safe to call directly, e.g. from a host that wants to force a
@@ -37222,7 +37358,7 @@ expectedOutput?: string; tags?: readonly string[]; metadata?: Record<string, unk
37222
37358
  `searchable`; empty string leaves the corresponding browser default in effect
37223
37359
  - `accept: string = ''` — forwarded to the internal `lr-file-input`'s `accept` (e.g. `'.json,.csv'`);
37224
37360
  empty accepts any type
37225
- - `exportFormats: ExportFormatOption[] = ['csv', 'json']` (attribute: false) — forwarded to the
37361
+ - `exportFormats: readonly LyraExportFormatOption[] = ['csv', 'json']` (attribute: false) — forwarded to the
37226
37362
  internal `lr-export-button`
37227
37363
  - `disabled: boolean = false` (reflected) — disables every add/remove/import/export affordance, e.g.
37228
37364
  while a host-side mutation is still in flight
@@ -37241,8 +37377,9 @@ loses focus, since native focus neither bubbles nor crosses the shadow boundary.
37241
37377
  All three built-in columns are sortable; activating one of their headers produces that commit for
37242
37378
  the host to apply to its controlled `examples` array.
37243
37379
 
37244
- **CSS parts:** `base`, `toolbar`, `search`, `search-input`, `tag-filter`, `grid`,
37245
- `add-button`, `remove-button`, `import`, `export`.
37380
+ **CSS parts:** `base`, `toolbar`, `search`, `search-input`, `search-clear` (replaces the native
37381
+ search-cancel glyph the component resets; rendered only while the field has text), `tag-filter`,
37382
+ `grid`, `add-button`, `remove-button`, `import`, `export`.
37246
37383
 
37247
37384
  **Known gotchas:**
37248
37385
 
@@ -37791,7 +37928,14 @@ parents remain renderable instead of recursing forever.
37791
37928
  **Properties:** `runs: SubagentRun[] = []` (attribute: false);
37792
37929
  `selectedRunId: string | null = null` (attribute `selected-run-id`); `label?: string` — an
37793
37930
  accessible-name override for the `role="tree"` element, where omission reads back `undefined` and
37794
- localizes the default while any supplied string, including `''`, renders verbatim.
37931
+ localizes the default while any supplied string, including `''`, renders verbatim; `compact: boolean
37932
+ = false` (reflected) — tighter run-row padding/gaps and smaller task/model text, the same density
37933
+ convention `lr-task-list`/`lr-stack-trace`/`lr-thinking-panel`/`lr-terminal` already pair with
37934
+ `frame`; purely a density knob, since each run's own border stays, so reach for `frame="plain"` to
37935
+ drop the chrome entirely; `frame: LyraFrame = 'card'` (reflected) — container treatment for each run
37936
+ row, in the library-wide `frame` vocabulary (`'card' | 'plain'`). `'card'` keeps each run's own
37937
+ border/radius; `'plain'` drops it, for a transcript or message-bubble context that already draws its
37938
+ own border around a nested `<lr-subagent-panel>` and would otherwise double it.
37795
37939
  `SubagentRun = { id: string; parentId?: string; label: string; status: AgentStatusKind; task?:
37796
37940
  string; model?: string; readonly progressRatio?: number; startedAt?: number; endedAt?: number;
37797
37941
  metadata?: Record<string, unknown> }`. `progressRatio` represents completion from `0` to `1`,
@@ -37824,6 +37968,14 @@ import "@aceshooting/lyra-ui/components/agent-tools/subagent-panel/subagent-pane
37824
37968
  - `--lr-subagent-panel-selected-border` — Selected run border. Default: `var(--lr-color-brand)`.
37825
37969
  - `--lr-subagent-panel-progress-track` — Progress track. Default: `var(--lr-color-border)`.
37826
37970
  - `--lr-subagent-panel-progress-fill` — Progress fill. Default: `var(--lr-color-brand)`.
37971
+ - `--lr-subagent-panel-compact-trigger-padding` — `[part="run-trigger"]` padding while `compact`.
37972
+ Default: `var(--lr-space-2xs) var(--lr-space-s)`.
37973
+ - `--lr-subagent-panel-compact-trigger-gap` — Gap between `[part="run-trigger"]`'s
37974
+ label/status/task/model/progress while `compact`. Default: `var(--lr-space-2xs)`.
37975
+ - `--lr-subagent-panel-compact-font-size` — `[part="task"]`/`[part="model"]` font size while
37976
+ `compact`. Default: `var(--lr-font-size-2xs)`.
37977
+ - `--lr-subagent-panel-compact-action-padding` — `[part="cancel"]`/`[part="retry"]` padding while
37978
+ `compact`. Default: `var(--lr-space-2xs)`.
37827
37979
 
37828
37980
  ## Consumer integration notes
37829
37981
 
@@ -38788,9 +38940,10 @@ re-rendered group order confirms the host applied it.
38788
38940
  **Slots:** `header` (content above the search field, e.g. a heading or tabs), `footer` (content
38789
38941
  below the list).
38790
38942
 
38791
- **CSS parts:** `base`, `search`, `list` (the listbox), `group-header`, `item`, `item-icon`,
38792
- `item-label`, `item-description`, `empty` (no-results message), `live-region` (result-count
38793
- announcement).
38943
+ **CSS parts:** `base`, `search-field` (wrapper around the search input and its clear button),
38944
+ `search`, `search-clear` (clears the query; rendered only while the field has text), `list` (the
38945
+ listbox), `group-header`, `item`, `item-icon`, `item-label`, `item-description`, `empty`
38946
+ (no-results message), `live-region` (result-count announcement).
38794
38947
 
38795
38948
  **Themeable custom properties:** shared tokens only.
38796
38949
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aceshooting/lyra-ui",
3
- "version": "14.3.1",
3
+ "version": "15.0.0",
4
4
  "description": "Free, independent Lit web components: an open-source alternative to Shoelace and Web Awesome with accessible forms, dashboards, charts, and agent UI.",
5
5
  "keywords": [
6
6
  "web-components",
@@ -2425,7 +2425,7 @@
2425
2425
  "dompurify": "^3.4.15",
2426
2426
  "emoji-picker-element-data": "^1.8.0",
2427
2427
  "epubjs": "^0.3.93",
2428
- "fast-check": "^4.9.0",
2428
+ "fast-check": "^4.10.0",
2429
2429
  "ical.js": "^2.2.1",
2430
2430
  "istanbul-lib-coverage": "^3.2.2",
2431
2431
  "istanbul-lib-report": "^3.0.1",
@@ -2529,7 +2529,7 @@
2529
2529
  "test:default-string-slices": "node scripts/generate-default-string-slices.test.mjs",
2530
2530
  "check:default-strings": "node scripts/check-default-strings.mjs",
2531
2531
  "test:default-strings": "node scripts/check-default-strings.test.mjs",
2532
- "test:tooling": "node scripts/build-llms.test.mjs && node --test scripts/create-component.test.mjs && node --test scripts/full-engine-shard.test.mjs && node --test scripts/coverage-shard-runner.test.mjs && node --test scripts/lint-ci-shard.test.mjs && node --test scripts/web-test-runner-config.test.mjs && node scripts/component-families.test.mjs && node scripts/maplibre-peer-range.test.mjs && node scripts/migrate-wa.test.mjs && node scripts/visual-regression-compare.test.mjs && node --test scripts/visual-regression-shard.test.mjs && node scripts/visual-regression-config.test.mjs && node --test scripts/check-source-policy.test.mjs scripts/check-test-assertions.test.mjs && node scripts/bundle-budgets.test.mjs && node scripts/compact-build-js.test.mjs && node scripts/compact-build-css.test.mjs && node scripts/compact-build-declarations.test.mjs && node --test scripts/normalize-mixin-declarations.test.mjs && node --test scripts/check-palette-freshness.test.mjs && node --test scripts/is-main-module.test.mjs && node scripts/manifest-compact.test.mjs && node --test scripts/viewer-fixture-generators.test.mjs && node --test scripts/strip-css-comments.test.mjs && node scripts/editor-web-types.test.mjs",
2532
+ "test:tooling": "node scripts/build-llms.test.mjs && node --test scripts/create-component.test.mjs && node --test scripts/full-engine-shard.test.mjs && node --test scripts/coverage-shard-runner.test.mjs && node --test scripts/lint-ci-shard.test.mjs && node --test scripts/web-test-runner-config.test.mjs && node scripts/component-families.test.mjs && node scripts/maplibre-peer-range.test.mjs && node scripts/migrate-wa.test.mjs && node scripts/visual-regression-compare.test.mjs && node --test scripts/visual-regression-shard.test.mjs && node scripts/visual-regression-config.test.mjs && node --test scripts/check-source-policy.test.mjs scripts/check-test-assertions.test.mjs && node scripts/bundle-budgets.test.mjs && node scripts/compact-build-js.test.mjs && node scripts/compact-build-css.test.mjs && node scripts/compact-build-declarations.test.mjs && node --test scripts/normalize-mixin-declarations.test.mjs && node --test scripts/check-palette-freshness.test.mjs && node --test scripts/is-main-module.test.mjs && node scripts/manifest-compact.test.mjs && node --test scripts/viewer-fixture-generators.test.mjs && node --test scripts/strip-css-comments.test.mjs && node scripts/editor-web-types.test.mjs && node scripts/check-migration-coverage.test.mjs",
2533
2533
  "framework-types": "node scripts/generate-framework-types.mjs",
2534
2534
  "check:framework-types": "node scripts/check-framework-types.mjs",
2535
2535
  "test:framework-types": "node scripts/generate-framework-types.test.mjs",