@aceshooting/lyra-ui 14.3.2 → 15.0.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 (218) hide show
  1. package/CHANGELOG.md +116 -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/button/button.styles.js +1 -1
  68. package/dist/components/forms/code-editor/code-editor.class.js +1 -1
  69. package/dist/components/forms/combobox/combobox.class.js +1 -1
  70. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  71. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  72. package/dist/components/forms/date-picker/date-picker.class.d.ts +12 -1
  73. package/dist/components/forms/date-picker/date-picker.class.js +1 -1
  74. package/dist/components/forms/icon-button/icon-button.class.d.ts +27 -5
  75. package/dist/components/forms/icon-button/icon-button.class.js +7 -3
  76. package/dist/components/forms/input/input.styles.js +1 -1
  77. package/dist/components/forms/input/time-input.class.d.ts +13 -2
  78. package/dist/components/forms/input/time-input.class.js +1 -1
  79. package/dist/components/forms/otp-input/otp-input.class.d.ts +8 -1
  80. package/dist/components/forms/otp-input/otp-input.class.js +1 -1
  81. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +1 -1
  82. package/dist/components/forms/rubric-form/rubric-form.class.js +1 -1
  83. package/dist/components/forms/select/select.class.d.ts +1 -1
  84. package/dist/components/forms/select/select.class.js +1 -1
  85. package/dist/components/forms/slider/slider.class.d.ts +4 -1
  86. package/dist/components/forms/slider/slider.class.js +1 -1
  87. package/dist/components/forms/textarea/textarea.class.d.ts +9 -4
  88. package/dist/components/forms/textarea/textarea.class.js +1 -1
  89. package/dist/components/forms/time-range/time-range.class.js +1 -1
  90. package/dist/components/layout/app-rail/app-rail.class.d.ts +7 -2
  91. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  92. package/dist/components/layout/card/card.class.js +2 -2
  93. package/dist/components/layout/card/card.styles.js +1 -1
  94. package/dist/components/layout/control-group/control-group.class.js +1 -1
  95. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +1 -1
  96. package/dist/components/layout/details/details.styles.js +1 -1
  97. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +13 -3
  98. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  99. package/dist/components/layout/menu/dropdown-item.class.d.ts +2 -0
  100. package/dist/components/layout/menu/menu-item.class.d.ts +28 -1
  101. package/dist/components/layout/menu/menu-item.class.js +45 -35
  102. package/dist/components/layout/menu/menu-item.styles.js +1 -1
  103. package/dist/components/layout/menu/menu.class.js +1 -1
  104. package/dist/components/layout/multi-split/multi-split.class.d.ts +12 -2
  105. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  106. package/dist/components/layout/page/page.class.js +2 -1
  107. package/dist/components/layout/page/page.styles.js +1 -1
  108. package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts +6 -4
  109. package/dist/components/layout/responsive-panel/responsive-panel.class.js +2 -2
  110. package/dist/components/layout/responsive-panel/responsive-panel.styles.js +1 -1
  111. package/dist/components/layout/stepper/stepper.class.js +2 -2
  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/empty/empty.class.js +2 -2
  133. package/dist/components/overlays/kbd/kbd.styles.js +1 -1
  134. package/dist/components/overlays/progress/progress-ring.class.d.ts +4 -1
  135. package/dist/components/overlays/progress/progress.styles.js +1 -1
  136. package/dist/components/overlays/toast/toast.styles.js +1 -1
  137. package/dist/components/retrieval/graph/graph-canvas.js +1 -1
  138. package/dist/components/retrieval/graph/graph.class.d.ts +10 -3
  139. package/dist/components/retrieval/graph/graph.class.js +1 -1
  140. package/dist/components/retrieval/graph/graph.styles.js +1 -1
  141. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +1 -1
  142. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +6 -6
  143. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +2 -2
  144. package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
  145. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +3 -3
  146. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +3 -3
  147. package/dist/components/retrieval/node-palette/node-palette.class.d.ts +7 -1
  148. package/dist/components/retrieval/node-palette/node-palette.class.js +23 -13
  149. package/dist/components/retrieval/node-palette/node-palette.styles.js +1 -1
  150. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +4 -1
  151. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +1 -1
  152. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +1 -1
  153. package/dist/components/retrieval/retrieval-search/retrieval-search.class.js +4 -3
  154. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  155. package/dist/components/retrieval/source-list/source-list.class.d.ts +7 -1
  156. package/dist/components/retrieval/source-list/source-list.class.js +1 -1
  157. package/dist/components/utility/export-button/export-button.class.d.ts +14 -2
  158. package/dist/components/utility/export-button/export-button.class.js +3 -3
  159. package/dist/components/utility/export-button/export-button.styles.js +1 -1
  160. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  161. package/dist/components/utility/known-date/known-date.class.js +1 -1
  162. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +4 -2
  163. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  164. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +9 -1
  165. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +4 -4
  166. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +1 -1
  167. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +4 -4
  168. package/dist/components/viewers/document-compare/document-compare.class.d.ts +5 -0
  169. package/dist/components/viewers/document-compare/document-compare.class.js +9 -4
  170. package/dist/components/viewers/document-compare/document-compare.styles.js +1 -1
  171. package/dist/components/viewers/document-preview/document-preview.class.d.ts +9 -1
  172. package/dist/components/viewers/document-preview/document-preview.class.js +2 -1
  173. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +5 -0
  174. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
  175. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +5 -0
  176. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +1 -1
  177. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +3 -3
  178. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
  179. package/dist/custom-elements-jsx.d.ts +1 -1
  180. package/dist/events.d.ts +5 -4
  181. package/dist/internal/package-metadata.d.ts +1 -1
  182. package/dist/internal/package-metadata.js +1 -1
  183. package/dist/lyra.d.ts +1 -1
  184. package/dist/svelte.d.ts +1 -1
  185. package/dist/vue.d.ts +1 -1
  186. package/llms/components/lr-alert.md +11 -3
  187. package/llms/components/lr-box-plot.md +21 -4
  188. package/llms/components/lr-chart.md +13 -4
  189. package/llms/components/lr-code-block.md +5 -4
  190. package/llms/components/lr-data-grid.md +24 -10
  191. package/llms/components/lr-document-compare.md +5 -0
  192. package/llms/components/lr-dropdown-item.md +24 -0
  193. package/llms/components/lr-eval-dataset.md +5 -4
  194. package/llms/components/lr-export-button.md +10 -5
  195. package/llms/components/lr-filter-bar.md +4 -1
  196. package/llms/components/lr-flow-minimap.md +7 -1
  197. package/llms/components/lr-icon-button.md +6 -1
  198. package/llms/components/lr-lite-chart.md +2 -1
  199. package/llms/components/lr-markdown.md +2 -2
  200. package/llms/components/lr-menu-item.md +24 -0
  201. package/llms/components/lr-menu.md +24 -0
  202. package/llms/components/lr-message-parts.md +7 -0
  203. package/llms/components/lr-model-settings-panel.md +4 -1
  204. package/llms/components/lr-node-palette.md +5 -4
  205. package/llms/components/lr-pdf-viewer.md +7 -0
  206. package/llms/components/lr-responsive-panel.md +2 -2
  207. package/llms/components/lr-subagent-panel.md +17 -2
  208. package/llms/components/lr-thinking-panel.md +4 -0
  209. package/llms/components/lr-timeline-item.md +1 -1
  210. package/llms/components/lr-timeline.md +1 -1
  211. package/llms/components/lr-tool-select-dialog.md +4 -3
  212. package/llms/components/lr-virtual-list.md +11 -11
  213. package/llms/peers.md +1 -1
  214. package/llms-full.txt +205 -59
  215. package/package.json +7 -7
  216. package/vscode-css-data.json +1 -1
  217. package/vscode-html-data.json +1 -1
  218. package/web-types.json +1 -1
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [llms-full.txt](../../llms-full.txt)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 5 parts, 0 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 5 parts, 2 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -76,8 +76,16 @@ once. Toast-owned work instead settles and is discarded when its region disconne
76
76
  subtree remains visible but is inert and aria-hidden.
77
77
 
78
78
  **CSS parts:** `base`, `icon`, `message`, and `close-button` / `close-button__base` on the same
79
- native close button. The pinned surface exposes no component CSS custom properties, custom states,
80
- form association, native-event relays, or delegated native methods.
79
+ native close button. The pinned surface exposes no custom states, form association, native-event
80
+ relays, or delegated native methods.
81
+
82
+ **Themeable custom properties:** the close button's two state hooks are
83
+ `--lr-alert-close-hover-bg` (its `:hover` surface; default `color-mix(in oklab, transparent,
84
+ var(--lr-color-mix-partner) var(--lr-color-mix-hover))`) and `--lr-alert-close-active-bg` (its
85
+ `:active` surface, scoped independently from the hover property; default `color-mix(in oklab,
86
+ transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active))`). Each is an inline fallback
87
+ at the relevant state, so setting one on the alert or an ancestor rethemes only that close-button
88
+ state.
81
89
 
82
90
  By default the light-DOM `<lr-alert>` host owns `role="alert"`, so initially-open/static alerts and
83
91
  alerts shown later expose one assertive, content-derived semantic surface without duplicating it in
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [llms-full.txt](../../llms-full.txt)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `@sgratzl/chartjs-chart-boxplot`, `chart.js` — see `llms/peers.md`
12
- - **Themeable via** 12 parts, 14 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 12 parts, 32 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -117,7 +117,23 @@ bounded-alternative sampling notice)
117
117
  concrete semantic fallbacks rather than retaining a prior canvas paint), but declared in its own stylesheet, not a
118
118
  re-export: `lr-box-plot` has no `zoom`, so no `reset-zoom-button` chrome exists here. A `BoxPlotSeries`
119
119
  that sets no `color` is assigned an entry from the same `--lr-color-chart-1..8` ramp `lr-chart` uses,
120
- so `--lr-theme-color-chart-*` retheming reaches box plots too. `--lr-chart-pattern-step`
120
+ so `--lr-theme-color-chart-*` retheming reaches box plots too. That resolved color then layers two
121
+ further per-series override tokens for the canvas paint, each wrapping modulo 8 like the underlying
122
+ ramp and mirroring `lr-chart`'s own `--border-color-N`/`--fill-color-N` palette-override mechanism
123
+ under a box-plot-namespaced name, since box-plot has no raw `config` passthrough to piggyback on:
124
+ `--lr-box-plot-border-color-1` through `--lr-box-plot-border-color-8` (defaulting respectively to
125
+ `--lr-color-chart-1` through `--lr-color-chart-8`) set the box-outline stroke color, and
126
+ `--lr-box-plot-fill-color-1` through `--lr-box-plot-fill-color-8` (the same eight defaults) set the
127
+ box fill and its legend swatch. In full, the stroke tokens are `--lr-box-plot-border-color-1`,
128
+ `--lr-box-plot-border-color-2`, `--lr-box-plot-border-color-3`, `--lr-box-plot-border-color-4`,
129
+ `--lr-box-plot-border-color-5`, `--lr-box-plot-border-color-6`, `--lr-box-plot-border-color-7` and
130
+ `--lr-box-plot-border-color-8`; the fill tokens are `--lr-box-plot-fill-color-1`,
131
+ `--lr-box-plot-fill-color-2`, `--lr-box-plot-fill-color-3`, `--lr-box-plot-fill-color-4`,
132
+ `--lr-box-plot-fill-color-5`, `--lr-box-plot-fill-color-6`, `--lr-box-plot-fill-color-7` and
133
+ `--lr-box-plot-fill-color-8`. `--lr-box-plot-border-width` (default `var(--lr-border-width-thin)`)
134
+ sets the canvas box-outline stroke width in pixels — the same override mechanism as `lr-chart`'s
135
+ `--border-width`. `--lr-box-plot-item-radius` (default `0`) sets the radius, in pixels, of the
136
+ individual raw-sample dots drawn alongside each box; `0` disables them. `--lr-chart-pattern-step`
121
137
  (default `var(--lr-space-2xs)`) sizes the forced-colors legend texture and
122
138
  `--lr-chart-canvas-hover-outline-width` (default `var(--lr-border-width-thin)`) sizes the `canvas`
123
139
  hover outline; `--lr-chart-canvas-hover-outline-color` (default `var(--lr-chart-grid-color)`) sets
@@ -148,8 +164,9 @@ loads are memoized per page.
148
164
  ```
149
165
 
150
166
  **Known gotchas:**
151
- - no raw `config` passthrough — limited to the properties above; can't reach the underlying
152
- controller's own options (`itemRadius`, `outlierRadius`, `coef`).
167
+ - no raw `config` passthrough — limited to the properties above, plus the `--lr-box-plot-border-width`
168
+ and `--lr-box-plot-item-radius` CSS hooks; the underlying controller's other options
169
+ (`outlierRadius`, `coef`) remain unreachable.
153
170
  - Chart.js receives `effectiveLocale`; generated numeric summaries use it, the y axis moves to
154
171
  logical start in RTL, and live ancestor `lang`/`dir` changes redraw the already-mounted canvas
155
172
  without requiring another box property write. Canvas tooltip/axis colors are token-driven, and
@@ -93,7 +93,8 @@ structured points retain their y-value formatting.
93
93
  - `datasets: readonly LyraChartSeries[] = []` (attribute: false) — `LyraChartSeries { readonly
94
94
  label: string; readonly data?: readonly (number|null)[]; readonly points?: readonly
95
95
  LyraChartPoint[]; readonly color?: string|readonly string[]; ... }`. The deprecated `Series` and
96
- `ChartPoint` names remain aliases for migration. `LyraChartPoint { readonly x: number; readonly
96
+ `ChartPoint` names were removed in 9.0.0 — import `LyraChartSeries`/`LyraChartPoint` instead.
97
+ `LyraChartPoint { readonly x: number; readonly
97
98
  y: number; readonly r?: number; readonly label?: string }`: `r` is the bubble
98
99
  radius, and the optional per-point `label` is retained by events, CSV export, keyboard
99
100
  announcements, generated summaries, and the accessible table. Point wording is localized as
@@ -127,9 +128,11 @@ structured points retain their y-value formatting.
127
128
  would clip. Its pressed state follows `hiddenDatasets` whenever that controlled snapshot is
128
129
  defined, otherwise the effective dataset's declarative `hidden` value before Chart.js is ready
129
130
  and across chart type/plugin rebuilds.
130
- - `legendMode: LyraChartLegendMode = 'dataset'` (attribute `legend-mode`) — `dataset` preserves
131
- dataset toggles. `datum` shows one category toggle per slice in pie, doughnut and polar-area
132
- charts; other types retain dataset legends. Category names use source labels with localized
131
+ - `legendMode: LyraChartLegendMode = 'auto'` (attribute `legend-mode`) — `auto` resolves to `datum`
132
+ on pie, doughnut and polar-area charts and to `dataset` everywhere else, so a single-dataset slice
133
+ chart labels every slice rather than emitting one aggregate row that identifies only the first
134
+ colour. `dataset` forces dataset toggles even on a slice chart. `datum` shows one category toggle
135
+ per slice in pie, doughnut and polar-area charts; other types retain dataset legends. Category names use source labels with localized
133
136
  numbered fallbacks. Colors and values come from the first dataset. With multiple datasets/rings,
134
137
  a category toggle hides that source index in every ring, matching Chart.js category visibility.
135
138
  - `hiddenDatums: readonly number[] = []` (attribute: false) — clone-owned hidden source category
@@ -304,6 +307,12 @@ token layer yet, the helper reads the `--lr-theme-color-chart-N` inputs directly
304
307
  a fresh eight-color array each call (safe to mutate) and let chart-adjacent UI, KPI tiles, or the
305
308
  `Series` array itself come from one source of truth.
306
309
 
310
+ The same module also exports `ChartThemeColors`, the resolved chrome colours a chart paints around
311
+ its series. Every field is an already-resolved CSS colour string, because canvas silently ignores a
312
+ raw `var(--lr-…)` string and would paint nothing; `<lr-box-plot>` consumes the same shape, so a
313
+ consumer drawing its own canvas overlay beside a chart can match the grid, tick, legend and tooltip
314
+ chrome exactly rather than re-deriving it.
315
+
307
316
  Import the standalone form from `.../chart/chart-colors.js`, not from `.../chart/chart.js`: the
308
317
  latter is `<lr-chart>`'s registration entry, so it defines the element (and pulls in `<lr-skeleton>`)
309
318
  as a side effect. `chart-colors.js` is side-effect-free and carries nothing but the palette helpers,
@@ -79,10 +79,11 @@ highlighted markup.
79
79
  to the default dynamic-import path unchanged. For a TypeScript annotation, use
80
80
  `import type { ShikiLanguageInput } from '@aceshooting/lyra-ui/components/conversation/code-block/code-block.js'`;
81
81
  the type-only granular import emits no registration side effect.
82
- `refreshTheme(): void` re-reads the resolved theme for syntax highlighting.
83
- **Methods:** `scrollToAnchor(target)` — resolves a `line-range` anchor (or a `highlights` id string
84
- resolving to one) by scrolling its start line into view within `[part="body"]`; resolves `false`
85
- when the anchor isn't a `line-range`, the id isn't found, or the start line is out of bounds.
82
+
83
+ **Methods:** `scrollToAnchor(target)` — resolves a `line-range` anchor (or a `highlights` id string
84
+ resolving to one) by scrolling its start line into view within `[part="body"]`; resolves `false`
85
+ when the anchor isn't a `line-range`, the id isn't found, or the start line is out of bounds.
86
+ `refreshTheme(): void` re-reads the resolved theme for syntax highlighting.
86
87
 
87
88
  **Events:** `lr-copy` (frozen `detail: { ok: true, text }` — fires only after the raw `code` value
88
89
  was written successfully), `lr-error` (`detail: null` — generic notification when clipboard writing
@@ -94,6 +94,12 @@ ARIA values as page-local positions rather than as the dataset-wide total.
94
94
  The mirrored `selectedKeys` spelling remains a compatibility alias for this same state.
95
95
  - `selectedRows: readonly Row[]` (writable, JS-only) — assigning rows that belong to the current source
96
96
  maps them to `selectedRowKeys`; detached rows are ignored and single-selection mode keeps the first.
97
+ - `selectionMode: 'none' | 'single' | 'multiple'` (`selection-mode`) — alias of `selectable` using
98
+ `<lr-table>`'s `selectionMode`/`selection-mode` spelling for the same row-selection concept, so a
99
+ consumer migrating between the two grid components doesn't need to remember two names.
100
+ `selectable` remains canonical (mirrored from `wa-data-grid`); this alias reads and writes
101
+ `selectable` directly, so there is no separate value to fall out of sync, and the bare `''`
102
+ shorthand for `selectable`'s own `multiple` normalizes to `'multiple'` when read back through it.
97
103
  - `server: boolean = false` (`server`, reflected).
98
104
  - `size: 'xs' | 's' | 'm' | 'l' | 'xl' | 'small' | 'medium' | 'large' = 'm'` (`size`, reflected).
99
105
  - `sort: readonly Array<{ readonly id: string; readonly desc: boolean }> = []` (JS-only).
@@ -106,11 +112,15 @@ ARIA values as page-local positions rather than as the dataset-wide total.
106
112
  - `withSearch: boolean = false` (`with-search`, reflected).
107
113
 
108
114
  `DataGridColumn<Row>` accepts `id`, dot-path `field`, `label`, `align`, numeric `width` /
109
- `minWidth` / `maxWidth`, `flex`, `formatter(value, row)`, computed `value(row)`, `sortable`,
110
- `sortFn`, `comparator`, `sortDescFirst`, `sortUndefined`, `searchable`, `filterable`, `filterType`,
111
- `filterFn`, `hidden`, `hideable`, `resizable`, `movable`, `pinnable`, `pinned`, `footer`,
112
- `aggregation`, and `aggregatedFormatter`. A column with neither `field` nor `value` is an action
113
- column: its formatter receives `undefined`, and it is not sorted or searched by default.
115
+ `minWidth` / `maxWidth`, `flex`, `formatter(value, row)`, `cellTitle(row)`, computed `value(row)`,
116
+ `sortable`, `sortFn`, `comparator`, `sortDescFirst`, `sortUndefined`, `searchable`, `filterable`,
117
+ `filterType`, `filterFn`, `hidden`, `hideable`, `resizable`, `movable`, `pinnable`, `pinned`,
118
+ `footer`, `aggregation`, and `aggregatedFormatter`. A column with neither `field` nor `value` is an
119
+ action column: its formatter receives `undefined`, and it is not sorted or searched by default.
120
+ `cellTitle(row) => string | undefined` renders as the generated cell's native `title`, symmetrical
121
+ with `<lr-table>`'s `columns[].cellTitle` — e.g. the untruncated text behind an ellipsized cell, or
122
+ a formatted timestamp behind a relative one. Returning `undefined` or `''` omits the `title`
123
+ attribute entirely rather than rendering `title=""`, which would suppress an ancestor's own tooltip.
114
124
 
115
125
  Built-in sort algorithms are `alphanumeric`, `alphanumericCaseSensitive`, `text`,
116
126
  `textCaseSensitive`, `datetime`, and `basic`; `comparator` takes precedence. Built-in filter types
@@ -187,12 +197,16 @@ restores the exact pre-gesture width state; after a live move it emits the resto
187
197
  `lr-filter-change`; `lr-page-change`; `lr-row-collapse`; `lr-row-expand`; `lr-group-collapse` and
188
198
  `lr-group-expand` (frozen `{ key, columnId, value, rows }` snapshots); `lr-row-select` with
189
199
  canonical `{ selectedRowKeys, selectedRows }` plus mirrored `selectedKeys`; row expand/collapse
190
- details use canonical `rowKey` plus mirrored `key`;
191
- `lr-sort-change`; `lr-copy` (frozen `{ ok: true, text }` after fulfillment); `lr-copy-error`
200
+ details use canonical `rowKey` plus mirrored `key`; cancelable `lr-sort-request` (frozen readonly
201
+ `detail: { sort }`) precedes `lr-sort-change`; vetoing it leaves `sort` unchanged and suppresses
202
+ `lr-sort-change`, mirroring `<lr-table>`'s identical `lr-sort-request`/`lr-sort` veto-then-commit
203
+ contract;
204
+ `lr-copy` (frozen `{ ok: true, text }` after fulfillment); `lr-copy-error`
192
205
  (frozen `{ ok: false, text, reason, error }` after failure); `lr-error` (compatibility failure
193
- notification with no raw platform error text). Every library event bubbles and is composed; only `lr-cell-contextmenu` is
194
- cancelable. Structured details and their owned collections are frozen. The toolbar search and active column-filter inputs re-dispatch `focus` and `blur` once
195
- from the grid host as bubbling, composed native `FocusEvent`s, preserving `relatedTarget` so
206
+ notification with no raw platform error text). Every library event bubbles and is composed; only
207
+ `lr-cell-contextmenu` and `lr-sort-request` are cancelable. Structured details and their owned
208
+ collections are frozen. The toolbar search and active column-filter inputs re-dispatch `focus` and
209
+ `blur` once from the grid host as bubbling, composed native `FocusEvent`s, preserving `relatedTarget` so
196
210
  delegated ancestors can observe editor entry and exit without crossing the shadow boundary.
197
211
 
198
212
  **Slots:** `empty`, `loading`, `no-results`.
@@ -47,6 +47,11 @@ is absent, it uses the localized comparison label. Dynamic host-label changes up
47
47
  `sync-scroll="false"`.
48
48
  - `anchor: LyraAnchor | string | null = null` (attribute: false) — sends the same target to both
49
49
  preview panes; repeated assignment of the same value still re-runs.
50
+ - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"30rem"`) that overrides
51
+ `--lr-document-compare-pane-max-height` declaratively, giving each `view="side-by-side"` pane its
52
+ maximum block size before it scrolls internally. The value is sanitized as a CSS length, so an
53
+ invalid one is ignored and the token default applies; the unset default `''` also defers to the
54
+ token, so setting nothing preserves existing behaviour.
50
55
 
51
56
  **Exported types:** `DocumentCompareVersion`; `LyraDocumentCompareView = 'diff' |
52
57
  'side-by-side'`; `DocumentComparePaneSide = 'old' | 'new'`.
@@ -100,6 +100,23 @@ A focusable action row owned by `<lr-menu>`. The host itself carries `role="menu
100
100
  - `type: 'normal' | 'checkbox' = 'normal'`
101
101
  - `checked: boolean = false` — meaningful only for `type="checkbox"`
102
102
  - `loading: boolean = false`
103
+ - `href?: string` — when set to a safe link URL (`http:`/`https:`/`blob:`/`mailto:`/relative; see
104
+ `safeLinkHref`, or `safeDownloadHref` when `download` is set, which drops `mailto:`),
105
+ `[part="base"]` renders as a real `<a href=…>` instead of a `<span>`, and activation (click, or
106
+ the owning menu's Enter/Space handling, which forwards through `click()` for a link item so the
107
+ anchor's own native default action runs) navigates there in addition to firing the usual
108
+ `select()`/`lr-select` contract. An unsafe/unparseable value falls back to the plain `<span>`,
109
+ matching `lr-button`'s identical fallback
110
+ - `target?: string` — native anchor `target`, used only while `href` resolves to a link. Setting it
111
+ (e.g. `'_blank'`) always force-adds `noopener noreferrer` to the rendered anchor's `rel`,
112
+ matching `lr-button`'s identical pattern
113
+ - `rel?: string` — independently settable author relationship tokens, no default. Author tokens are
114
+ merged rather than replaced: `opener` is always stripped, and whenever `target` is set the
115
+ non-removable `noopener noreferrer` floor is added, so a same-tab link (no `target`) keeps
116
+ exactly the author's tokens while a link opening a new context can never lose the guard
117
+ - `download?: string` — native anchor `download` attribute, used only while `href` resolves to a
118
+ link. Presence narrows the safe-URL allowlist to `safeDownloadHref`'s, which drops `mailto:` — a
119
+ mail handoff names no retrievable bytes, so it cannot be a download target
103
120
  - `hasSubmenu: boolean` (read-only)
104
121
  - `submenuOpen: boolean = false` — transient live state; assigning it drives an existing submenu
105
122
  without moving focus and disconnect resets it
@@ -190,6 +207,13 @@ properties, slots, parts, methods, checkbox/state events, roving focus, and cano
190
207
  `lr-select` behavior. Its host also exposes native, non-bubbling, composed `focus` and `blur`
191
208
  events.
192
209
 
210
+ **Attributes:** `href`, `target`, `rel`, and `download` — the same link-rendering properties
211
+ documented above for `<lr-menu-item>`, settable directly in markup
212
+ (`<lr-dropdown-item href="/settings" target="_blank">`). The `rel` guard is identical: author
213
+ tokens merge rather than get replaced, `opener` is always stripped, and setting `target` force-adds
214
+ the non-removable `noopener noreferrer` floor, so a same-tab link keeps exactly the author's tokens
215
+ while a link opening a new context can never lose the guard.
216
+
193
217
  **Events:** native, non-bubbling, composed, non-cancelable `focus` and `blur` (`FocusEvent`) when
194
218
  the focusable host gains or loses focus, plus the shared menu-item events above.
195
219
 
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [llms-full.txt](../../llms-full.txt)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 10 parts, 0 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 11 parts, 0 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -38,7 +38,7 @@ expectedOutput?: string; tags?: readonly string[]; metadata?: Record<string, unk
38
38
  `searchable`; empty string leaves the corresponding browser default in effect
39
39
  - `accept: string = ''` — forwarded to the internal `lr-file-input`'s `accept` (e.g. `'.json,.csv'`);
40
40
  empty accepts any type
41
- - `exportFormats: ExportFormatOption[] = ['csv', 'json']` (attribute: false) — forwarded to the
41
+ - `exportFormats: readonly LyraExportFormatOption[] = ['csv', 'json']` (attribute: false) — forwarded to the
42
42
  internal `lr-export-button`
43
43
  - `disabled: boolean = false` (reflected) — disables every add/remove/import/export affordance, e.g.
44
44
  while a host-side mutation is still in flight
@@ -57,8 +57,9 @@ loses focus, since native focus neither bubbles nor crosses the shadow boundary.
57
57
  All three built-in columns are sortable; activating one of their headers produces that commit for
58
58
  the host to apply to its controlled `examples` array.
59
59
 
60
- **CSS parts:** `base`, `toolbar`, `search`, `search-input`, `tag-filter`, `grid`,
61
- `add-button`, `remove-button`, `import`, `export`.
60
+ **CSS parts:** `base`, `toolbar`, `search`, `search-input`, `search-clear` (replaces the native
61
+ search-cancel glyph the component resets; rendered only while the field has text), `tag-filter`,
62
+ `grid`, `add-button`, `remove-button`, `import`, `export`.
62
63
 
63
64
  **Known gotchas:**
64
65
 
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [llms-full.txt](../../llms-full.txt)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 5 parts, 0 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 6 parts, 0 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -59,13 +59,18 @@ extension?: string }`. Descriptor labels/descriptions are consumer-supplied, alr
59
59
  substitute your own server-generated download instead of the built-in client-side one),
60
60
  `lr-export-complete` (`detail: { format: 'csv' | 'json' }`, fires only after a non-cancelled
61
61
  built-in download completes), `lr-export-error` (`detail: { format: 'csv' | 'json', error:
62
- unknown }`, fires when a built-in export cannot be serialized or downloaded; activation does not
63
- throw into consumer code), `lr-show`, `lr-hide` (cancelable format-menu visibility transitions;
64
- self-imposed closes caused by disablement, loading, or an unusable format list emit neither event)
62
+ unknown }`, fires when a built-in export cannot be serialized or downloaded; the same failure is
63
+ also shown via the trigger's `trigger-error` part and announced through the shared light-DOM live
64
+ region, so a listener is needed only for additional handling; activation does not throw into
65
+ consumer code), `lr-show`, `lr-hide` (cancelable format-menu visibility transitions; self-imposed
66
+ closes caused by disablement, loading, or an unusable format list emit neither event)
65
67
 
66
68
  **Slots:** none.
67
69
 
68
- **CSS parts:** `trigger`, `menu`, `menu-item`, `format-label`, `format-description`
70
+ **CSS parts:** `trigger`, `trigger-error` (present alongside `trigger` on the same button —
71
+ `part="trigger trigger-error"` — after a built-in CSV/JSON export fails; cleared on the next export
72
+ attempt regardless of outcome — style with `::part(trigger-error)`), `menu`, `menu-item`,
73
+ `format-label`, `format-description`
69
74
 
70
75
  **Themeable custom properties:** shared tokens only, including `--lr-popover-viewport-clamp`
71
76
  (default `92vw`) — the shared narrow-viewport ceiling the `menu`'s max-inline-size is `min()`ed
@@ -193,7 +193,10 @@ abort stale contexts, whose callbacks become inert.
193
193
 
194
194
  The adapter's required `clearValue` is used when the active chip is removed. Its optional
195
195
  `isEmpty(value)` defines domain emptiness; without one, the bar compares against `clearValue`
196
- (including shallow string-array equality). Its optional `formatValue` controls chip display.
196
+ (including shallow string-array equality). Its optional `formatValue(value, locale)` controls chip
197
+ display; `locale` is the filter bar's `effectiveLocale`, the same value every built-in filter
198
+ type's own chip formatting already receives, so an existing single-argument `formatValue`
199
+ implementation keeps working unchanged — JS simply ignores a second parameter it never declared.
197
200
  Consequently `false` remains a meaningful active value unless the adapter explicitly declares it
198
201
  empty. Custom values may be strings, string arrays, booleans, or `undefined`, so controls such as
199
202
  `lr-time-range`, `lr-checkbox`, and an async-backed `lr-combobox` can participate in the same
@@ -28,12 +28,18 @@ disagree.
28
28
  is used (the slotted-into-a-corner-slot case, the primary wiring)
29
29
  - `label: string = ''` — accessible name for the map region. A host `aria-label` takes precedence,
30
30
  followed by `label`, then the localized default
31
+ - `frame: 'card' | 'plain' = 'card'` (reflected) — container treatment, on the library-wide `frame`
32
+ vocabulary. `'plain'` removes `[part="base"]`'s border, background and corner radius, for a
33
+ minimap placed in a host panel or toolbar that already draws its own surface, so the frame isn't
34
+ doubled. The map's own hover/click affordances and the viewport rect stay either way — only the
35
+ outer `base` decoration goes. Mirrors `lr-flow-controls`'/`lr-flow-run-status`'s identical `frame`.
31
36
 
32
37
  **Events:** none.
33
38
 
34
39
  **Slots:** none.
35
40
 
36
- **CSS parts:** `base`, `map` (the scaled SVG), `node` (one rect per node), `viewport` (the
41
+ **CSS parts:** `base` (the root wrapper; drops its border, background and corner radius under
42
+ `frame="plain"`), `map` (the scaled SVG), `node` (one rect per node), `viewport` (the
37
43
  exact visible view rectangle), `viewport-hit-area` (the transparent draggable/focusable target),
38
44
  `instructions` (visually hidden keyboard help), and `live-region` (the `aria-hidden` mirror of the
39
45
  latest viewport-change text).
@@ -55,7 +55,12 @@ app-wide with `registerLyraLocale()` (see `llms/shared.md`); don't rely on the f
55
55
  button whose purpose isn't generic.
56
56
 
57
57
  Host `aria-haspopup` and `aria-expanded` values are forwarded reactively to the shadow-internal
58
- native button. Host `aria-describedby` targets in the host's own root are resolved through
58
+ native button. `aria-pressed` (`true`, `false`, `mixed`) supports icon-only toggle actions such as
59
+ mute, favorite, or pin; `aria-current` (`page`, `step`, `location`, `date`, `time`, `true`, `false`)
60
+ supports current-item icon buttons such as an active nav/pagination target. Both follow attribute
61
+ changes, removal, and button/link replacement without changing the native role; an empty or
62
+ unsupported token is omitted — mirroring `lr-button`'s own `aria-pressed`/`aria-current`
63
+ forwarding. Host `aria-describedby` targets in the host's own root are resolved through
59
64
  `ariaDescribedByElements`. Host `aria-controls` targets use the corresponding
60
65
  `ariaControlsElements` API, so using `<lr-icon-button slot="trigger">` inside `<lr-menu>` exposes
61
66
  the menu relationship and expanded state on the element that actually receives focus. Supporting
@@ -28,7 +28,8 @@ passthrough). Not a subclass of `LyraChart`.
28
28
  - `labels: readonly string[] = []` (attribute: false)
29
29
  - `datasets: readonly LyraLiteChartSeries[] = []` (attribute: false) —
30
30
  `LyraLiteChartSeries { readonly label: string; readonly data: readonly (number|null)[];
31
- readonly color?: string }`; the deprecated `LiteSeries` name remains an alias for migration.
31
+ readonly color?: string }`. The legacy `LiteSeries` name was removed in 9.0.0 — import
32
+ `LyraLiteChartSeries` instead.
32
33
  `color` accepts a valid CSS `color`, while invalid values,
33
34
  declaration-breaking input, and `url()` paint servers fall back to the built-in palette. A
34
35
  runtime entry whose required `data` member is not an array is dropped while valid siblings
@@ -19,7 +19,7 @@
19
19
  Sanitized Markdown-to-HTML rendering (GFM tables, fenced code blocks, links, blockquotes) built on
20
20
  two optional peer dependencies — `marked` (parsing) and `dompurify` (sanitizing) — both lazy-loaded
21
21
  independently via `markdown-loader.ts`'s `loadMarkdownDeps()` on first connect, cached per page the
22
- same way `chart-loader.ts`/`map-loader.ts` cache their load promise so every `<lr-markdown>`
22
+ same way `chart-core-loader.ts`/`map-loader.ts` cache their load promise so every `<lr-markdown>`
23
23
  instance on a page shares one load. `heading`/`code`/`blockquote`/`table`/`link`/`image` tokens are
24
24
  rendered through a `marked` renderer override that injects `part="..."` attributes directly into the
25
25
  produced HTML in a single pass (no second DOM walk after insertion).
@@ -180,7 +180,7 @@ rendered fenced or indented `code-block`), plus shared tokens `--lr-space-xs/-s/
180
180
  `--lr-radius`.
181
181
 
182
182
  **Optional peer deps:** `marked`, `dompurify` (both lazy-loaded via `markdown-loader.ts`'s
183
- `loadMarkdownDeps()`, mirroring `chart-loader.ts`'s two-independent-optional-peers shape). Each half
183
+ `loadMarkdownDeps()`, mirroring `chart-core-loader.ts`'s two-independent-optional-peers shape). Each half
184
184
  is loaded and caught independently — a consumer who installs only `marked` and explicitly sets
185
185
  `html-mode="trusted"` (so `dompurify` is never needed) is a valid, supported combination. Also `shiki`,
186
186
  the same optional peer `<lr-code-block>` uses, for `highlightCode`'s fenced-block syntax
@@ -100,6 +100,23 @@ A focusable action row owned by `<lr-menu>`. The host itself carries `role="menu
100
100
  - `type: 'normal' | 'checkbox' = 'normal'`
101
101
  - `checked: boolean = false` — meaningful only for `type="checkbox"`
102
102
  - `loading: boolean = false`
103
+ - `href?: string` — when set to a safe link URL (`http:`/`https:`/`blob:`/`mailto:`/relative; see
104
+ `safeLinkHref`, or `safeDownloadHref` when `download` is set, which drops `mailto:`),
105
+ `[part="base"]` renders as a real `<a href=…>` instead of a `<span>`, and activation (click, or
106
+ the owning menu's Enter/Space handling, which forwards through `click()` for a link item so the
107
+ anchor's own native default action runs) navigates there in addition to firing the usual
108
+ `select()`/`lr-select` contract. An unsafe/unparseable value falls back to the plain `<span>`,
109
+ matching `lr-button`'s identical fallback
110
+ - `target?: string` — native anchor `target`, used only while `href` resolves to a link. Setting it
111
+ (e.g. `'_blank'`) always force-adds `noopener noreferrer` to the rendered anchor's `rel`,
112
+ matching `lr-button`'s identical pattern
113
+ - `rel?: string` — independently settable author relationship tokens, no default. Author tokens are
114
+ merged rather than replaced: `opener` is always stripped, and whenever `target` is set the
115
+ non-removable `noopener noreferrer` floor is added, so a same-tab link (no `target`) keeps
116
+ exactly the author's tokens while a link opening a new context can never lose the guard
117
+ - `download?: string` — native anchor `download` attribute, used only while `href` resolves to a
118
+ link. Presence narrows the safe-URL allowlist to `safeDownloadHref`'s, which drops `mailto:` — a
119
+ mail handoff names no retrievable bytes, so it cannot be a download target
103
120
  - `hasSubmenu: boolean` (read-only)
104
121
  - `submenuOpen: boolean = false` — transient live state; assigning it drives an existing submenu
105
122
  without moving focus and disconnect resets it
@@ -190,6 +207,13 @@ properties, slots, parts, methods, checkbox/state events, roving focus, and cano
190
207
  `lr-select` behavior. Its host also exposes native, non-bubbling, composed `focus` and `blur`
191
208
  events.
192
209
 
210
+ **Attributes:** `href`, `target`, `rel`, and `download` — the same link-rendering properties
211
+ documented above for `<lr-menu-item>`, settable directly in markup
212
+ (`<lr-dropdown-item href="/settings" target="_blank">`). The `rel` guard is identical: author
213
+ tokens merge rather than get replaced, `opener` is always stripped, and setting `target` force-adds
214
+ the non-removable `noopener noreferrer` floor, so a same-tab link keeps exactly the author's tokens
215
+ while a link opening a new context can never lose the guard.
216
+
193
217
  **Events:** native, non-bubbling, composed, non-cancelable `focus` and `blur` (`FocusEvent`) when
194
218
  the focusable host gains or loses focus, plus the shared menu-item events above.
195
219
 
@@ -100,6 +100,23 @@ A focusable action row owned by `<lr-menu>`. The host itself carries `role="menu
100
100
  - `type: 'normal' | 'checkbox' = 'normal'`
101
101
  - `checked: boolean = false` — meaningful only for `type="checkbox"`
102
102
  - `loading: boolean = false`
103
+ - `href?: string` — when set to a safe link URL (`http:`/`https:`/`blob:`/`mailto:`/relative; see
104
+ `safeLinkHref`, or `safeDownloadHref` when `download` is set, which drops `mailto:`),
105
+ `[part="base"]` renders as a real `<a href=…>` instead of a `<span>`, and activation (click, or
106
+ the owning menu's Enter/Space handling, which forwards through `click()` for a link item so the
107
+ anchor's own native default action runs) navigates there in addition to firing the usual
108
+ `select()`/`lr-select` contract. An unsafe/unparseable value falls back to the plain `<span>`,
109
+ matching `lr-button`'s identical fallback
110
+ - `target?: string` — native anchor `target`, used only while `href` resolves to a link. Setting it
111
+ (e.g. `'_blank'`) always force-adds `noopener noreferrer` to the rendered anchor's `rel`,
112
+ matching `lr-button`'s identical pattern
113
+ - `rel?: string` — independently settable author relationship tokens, no default. Author tokens are
114
+ merged rather than replaced: `opener` is always stripped, and whenever `target` is set the
115
+ non-removable `noopener noreferrer` floor is added, so a same-tab link (no `target`) keeps
116
+ exactly the author's tokens while a link opening a new context can never lose the guard
117
+ - `download?: string` — native anchor `download` attribute, used only while `href` resolves to a
118
+ link. Presence narrows the safe-URL allowlist to `safeDownloadHref`'s, which drops `mailto:` — a
119
+ mail handoff names no retrievable bytes, so it cannot be a download target
103
120
  - `hasSubmenu: boolean` (read-only)
104
121
  - `submenuOpen: boolean = false` — transient live state; assigning it drives an existing submenu
105
122
  without moving focus and disconnect resets it
@@ -190,6 +207,13 @@ properties, slots, parts, methods, checkbox/state events, roving focus, and cano
190
207
  `lr-select` behavior. Its host also exposes native, non-bubbling, composed `focus` and `blur`
191
208
  events.
192
209
 
210
+ **Attributes:** `href`, `target`, `rel`, and `download` — the same link-rendering properties
211
+ documented above for `<lr-menu-item>`, settable directly in markup
212
+ (`<lr-dropdown-item href="/settings" target="_blank">`). The `rel` guard is identical: author
213
+ tokens merge rather than get replaced, `opener` is always stripped, and setting `target` force-adds
214
+ the non-removable `noopener noreferrer` floor, so a same-tab link keeps exactly the author's tokens
215
+ while a link opening a new context can never lose the guard.
216
+
193
217
  **Events:** native, non-bubbling, composed, non-cancelable `focus` and `blur` (`FocusEvent`) when
194
218
  the focusable host gains or loses focus, plus the shared menu-item events above.
195
219
 
@@ -27,6 +27,13 @@ allocating every preceding part for each citation in a citation-heavy or growing
27
27
  **Properties:** `parts: MessagePart[] = []` (attribute: false); `contentMode: MessagePartsContentMode =
28
28
  'markdown'` (attribute `content-mode`, reflected) and `showReasoning: boolean = true` (attribute
29
29
  `show-reasoning`, reflected, with string-aware true-default conversion);
30
+ `maxRenderedParts: number = 0` (attribute `max-rendered-parts`) — `0` (the default) renders every
31
+ part, unbounded, matching every prior release; a positive value windows rendering to the newest N
32
+ parts without touching the host's `parts` data. Citation ranks are unaffected by the window: they
33
+ are still derived from the full sequence first, in the same linear prepass, so a badge's number
34
+ stays stable even once an earlier citation rolls out of the rendered window. Opt in for a message
35
+ that can grow an unusually large number of interleaved parts (e.g. a long agentic run with many
36
+ tool-call/tool-result pairs), where unbounded live DOM can visibly stall the main thread.
30
37
  `renderPart?: MessagePartRenderer` (attribute: false), where returning `undefined` delegates that
31
38
  part to the built-in renderer; `accessibleLabel: string | null = null` (attribute `aria-label`).
32
39
 
@@ -88,7 +88,10 @@ The internal `lr-slider` renders with its own value readout suppressed (`.showVa
88
88
  the current temperature is instead shown via this component's own `[part="temperature-value"]` span,
89
89
  which formats `temperature` through the cached `Intl.NumberFormat` for the effective locale with up
90
90
  to 20 fractional digits, matching `lr-slider`'s own numeric readout. For example, `temperature="0.7"`
91
- under `locale="de-DE"` displays `0,7`.
91
+ under `locale="de-DE"` displays `0,7`. When the full decimal expansion would exceed 24 characters —
92
+ reachable only through an extreme `temperatureMin`/`temperatureMax`/`temperatureStep` combination —
93
+ the readout switches to bounded scientific notation at up to 6 significant digits instead, so
94
+ `1e308` renders as `7E+307` rather than a 300-digit string that would overflow the label.
92
95
 
93
96
  The panel's own `temperature` property mirrors the nested slider's _live_ value on every one of its
94
97
  `lr-input` events (drag/key-repeat), not just its committed `lr-change` — so `temperature` (and
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [llms-full.txt](../../llms-full.txt)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 10 parts, 0 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 12 parts, 0 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -66,9 +66,10 @@ re-rendered group order confirms the host applied it.
66
66
  **Slots:** `header` (content above the search field, e.g. a heading or tabs), `footer` (content
67
67
  below the list).
68
68
 
69
- **CSS parts:** `base`, `search`, `list` (the listbox), `group-header`, `item`, `item-icon`,
70
- `item-label`, `item-description`, `empty` (no-results message), `live-region` (result-count
71
- announcement).
69
+ **CSS parts:** `base`, `search-field` (wrapper around the search input and its clear button),
70
+ `search`, `search-clear` (clears the query; rendered only while the field has text), `list` (the
71
+ listbox), `group-header`, `item`, `item-icon`, `item-label`, `item-description`, `empty`
72
+ (no-results message), `live-region` (result-count announcement).
72
73
 
73
74
  **Themeable custom properties:** shared tokens only.
74
75
 
@@ -129,6 +129,13 @@ span boundary that `Range.surroundContents()` can't wrap stays unpainted (still
129
129
  localized label; later loading and error transitions use the shared document-level polite and
130
130
  assertive sinks, respectively, without adding live semantics inside the viewer shadow.
131
131
 
132
+ **Known capability boundaries** — deliberate, not defects, and stated here so they need not be
133
+ rediscovered: text search and `LyraAnchor` text-quote resolution match **exact** text only, after
134
+ whitespace and soft-hyphen normalization, with no fuzzy or approximate mode. Non-Latin
135
+ cMap-encoded fonts get no special handling beyond whatever the `pdfjs-dist` peer resolves on its
136
+ own — no `cMapUrl`/`cMapPacked` is configured. A scanned or image-only PDF has no text layer at
137
+ all, so it has nothing to select, search or anchor into; it still renders and paginates normally.
138
+
132
139
  `page`, `page-canvas`, `text-layer`, `text-span`, `search-match` and `search-match-active` are
133
140
  rendered inside the virtualizing `lr-virtual-list`'s own shadow root and forwarded out through
134
141
  `exportparts`, so `lr-pdf-viewer::part(page)` (and each of the others) works from a consumer
@@ -28,7 +28,7 @@ invention (no `wa-*`/`sl-*` counterpart).
28
28
  against the component's allocation; `'inline'`/`'overlay'` force that presentation.
29
29
  - `effectiveMode: LyraResponsivePanelEffectiveMode` (readonly) — the currently resolved
30
30
  `'inline'|'overlay'` presentation.
31
- - `variant: LyraResponsivePanelVariant = 'fullscreen'` (reflected) — only affects the overlay
31
+ - `shape: LyraResponsivePanelShape = 'fullscreen'` (reflected) — only affects the overlay
32
32
  presentation's visual treatment: `'fullscreen'` covers the whole viewport; `'bottom-sheet'`
33
33
  anchors to its block-end edge and does not cover the full height. Has no visual effect while the effective
34
34
  presentation resolves to `'inline'`.
@@ -115,7 +115,7 @@ presentation participates in the shared modal stack rather than nesting a `<lr-d
115
115
  The granular route exports the pure
116
116
  `resolveResponsivePanelEffectiveMode(mode: LyraResponsivePanelMode,
117
117
  belowBreakpoint: boolean): LyraResponsivePanelEffectiveMode` resolver alongside the
118
- `LyraResponsivePanelMode`/`LyraResponsivePanelEffectiveMode`/`LyraResponsivePanelVariant`/
118
+ `LyraResponsivePanelMode`/`LyraResponsivePanelEffectiveMode`/`LyraResponsivePanelShape`/
119
119
  `LyraResponsivePanelCloseReason`/`LyraResponsivePanelModeChangeDetail` types. It's the same logic
120
120
  the element's allocation observer calls: `'inline'`/`'overlay'` pass straight through
121
121
  unchanged; `'auto'` resolves to `'overlay'` when `belowBreakpoint` is true, `'inline'` otherwise —
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [llms-full.txt](../../llms-full.txt)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 16 parts, 3 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 16 parts, 7 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -23,7 +23,14 @@ parents remain renderable instead of recursing forever.
23
23
  **Properties:** `runs: SubagentRun[] = []` (attribute: false);
24
24
  `selectedRunId: string | null = null` (attribute `selected-run-id`); `label?: string` — an
25
25
  accessible-name override for the `role="tree"` element, where omission reads back `undefined` and
26
- localizes the default while any supplied string, including `''`, renders verbatim.
26
+ localizes the default while any supplied string, including `''`, renders verbatim; `compact: boolean
27
+ = false` (reflected) — tighter run-row padding/gaps and smaller task/model text, the same density
28
+ convention `lr-task-list`/`lr-stack-trace`/`lr-thinking-panel`/`lr-terminal` already pair with
29
+ `frame`; purely a density knob, since each run's own border stays, so reach for `frame="plain"` to
30
+ drop the chrome entirely; `frame: LyraFrame = 'card'` (reflected) — container treatment for each run
31
+ row, in the library-wide `frame` vocabulary (`'card' | 'plain'`). `'card'` keeps each run's own
32
+ border/radius; `'plain'` drops it, for a transcript or message-bubble context that already draws its
33
+ own border around a nested `<lr-subagent-panel>` and would otherwise double it.
27
34
  `SubagentRun = { id: string; parentId?: string; label: string; status: AgentStatusKind; task?:
28
35
  string; model?: string; readonly progressRatio?: number; startedAt?: number; endedAt?: number;
29
36
  metadata?: Record<string, unknown> }`. `progressRatio` represents completion from `0` to `1`,
@@ -56,3 +63,11 @@ import "@aceshooting/lyra-ui/components/agent-tools/subagent-panel/subagent-pane
56
63
  - `--lr-subagent-panel-selected-border` — Selected run border. Default: `var(--lr-color-brand)`.
57
64
  - `--lr-subagent-panel-progress-track` — Progress track. Default: `var(--lr-color-border)`.
58
65
  - `--lr-subagent-panel-progress-fill` — Progress fill. Default: `var(--lr-color-brand)`.
66
+ - `--lr-subagent-panel-compact-trigger-padding` — `[part="run-trigger"]` padding while `compact`.
67
+ Default: `var(--lr-space-2xs) var(--lr-space-s)`.
68
+ - `--lr-subagent-panel-compact-trigger-gap` — Gap between `[part="run-trigger"]`'s
69
+ label/status/task/model/progress while `compact`. Default: `var(--lr-space-2xs)`.
70
+ - `--lr-subagent-panel-compact-font-size` — `[part="task"]`/`[part="model"]` font size while
71
+ `compact`. Default: `var(--lr-font-size-2xs)`.
72
+ - `--lr-subagent-panel-compact-action-padding` — `[part="cancel"]`/`[part="retry"]` padding while
73
+ `compact`. Default: `var(--lr-space-2xs)`.
@@ -42,6 +42,10 @@ plain text) — this component has no dependency on either.
42
42
  behavior differences, see prose below.
43
43
  - `durationMs?: number` (attribute `duration-ms`) — how long the reasoning took. Omitted entirely
44
44
  (nothing rendered in `'post-hoc'`, a pulsing placeholder in `'live'`) while unset.
45
+ - `follow: boolean = true` (reflected) — whether live, expanded content follows the transcript tail.
46
+ A user scroll updates this property and emits `lr-follow-change`; a direct assignment is
47
+ controlled input and emits nothing. Being a `true`-defaulting boolean, `follow="false"` in plain
48
+ HTML is honoured (it uses `trueDefaultBooleanConverter`), so the attribute form is load-bearing.
45
49
 
46
50
  **Methods:** `scrollToBottom(): void` — scrolls `[part="body"]` to its current bottom immediately
47
51
  (no smooth-scroll animation). Safe to call directly, e.g. from a host that wants to force a