@aceshooting/lyra-ui 16.0.0 → 17.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 (296) hide show
  1. package/CHANGELOG.md +504 -0
  2. package/custom-elements.json +1 -1
  3. package/dist/cli/migration-contract.json +1 -1
  4. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts +3 -3
  5. package/dist/components/agent-tools/browser-frame/browser-frame.class.js +2 -2
  6. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +2 -2
  7. package/dist/components/agent-tools/compare-panel/compare-panel.class.js +3 -3
  8. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +37 -13
  9. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  10. package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
  11. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +4 -0
  12. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +2 -2
  13. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +3 -3
  14. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +1 -1
  15. package/dist/components/charts/chart/chart.class.d.ts +117 -17
  16. package/dist/components/charts/chart/chart.class.js +3 -3
  17. package/dist/components/charts/chart/histogram-bin.d.ts +5 -1
  18. package/dist/components/charts/chart/histogram-bin.js +1 -1
  19. package/dist/components/charts/chart/lite-chart.class.d.ts +9 -0
  20. package/dist/components/conversation/code-block/code-block.styles.js +1 -1
  21. package/dist/components/conversation/message-actions/message-actions.styles.js +1 -1
  22. package/dist/components/conversation/model-select/model-select.class.d.ts +13 -4
  23. package/dist/components/conversation/model-select/model-select.class.js +2 -1
  24. package/dist/components/conversation/model-select/model-select.styles.js +1 -1
  25. package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +40 -2
  26. package/dist/components/conversation/streaming-text/streaming-text-base.class.js +2 -2
  27. package/dist/components/conversation/streaming-text/streaming-text-core.class.d.ts +5 -3
  28. package/dist/components/conversation/streaming-text/streaming-text-core.class.js +10 -0
  29. package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +9 -3
  30. package/dist/components/conversation/streaming-text/streaming-text.class.js +10 -0
  31. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.d.ts +30 -2
  32. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.js +4 -3
  33. package/dist/components/conversation/suggestion-chips/suggestion-chips.styles.js +1 -1
  34. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
  35. package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.js +1 -1
  36. package/dist/components/conversation/usage-badge/usage-badge.class.d.ts +4 -0
  37. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +16 -4
  38. package/dist/components/conversation/voice-picker/voice-picker.class.js +2 -1
  39. package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
  40. package/dist/components/data/context-meter/context-meter.class.d.ts +23 -4
  41. package/dist/components/data/context-meter/context-meter.class.js +10 -7
  42. package/dist/components/data/context-meter/context-meter.styles.js +1 -1
  43. package/dist/components/data/data-grid/data-grid.class.d.ts +5 -2
  44. package/dist/components/data/data-grid/data-grid.class.js +1 -1
  45. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +32 -5
  46. package/dist/components/data/flow-canvas/flow-canvas.class.js +3 -1
  47. package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
  48. package/dist/components/data/flow-canvas/flow-model.js +1 -1
  49. package/dist/components/data/flow-canvas/flow-types.d.ts +10 -1
  50. package/dist/components/data/gauge/gauge.class.d.ts +15 -2
  51. package/dist/components/data/gauge/gauge.class.js +20 -20
  52. package/dist/components/data/gauge/gauge.styles.js +1 -1
  53. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +14 -5
  54. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +2 -2
  55. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +28 -2
  56. package/dist/components/data/sequence-strip/sequence-strip.class.js +3 -2
  57. package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
  58. package/dist/components/data/table/table.class.d.ts +155 -30
  59. package/dist/components/data/table/table.class.js +6 -4
  60. package/dist/components/data/table/table.styles.js +1 -1
  61. package/dist/components/data/timeline/timeline-item.class.d.ts +9 -1
  62. package/dist/components/data/timeline/timeline-item.class.js +2 -2
  63. package/dist/components/data/word-cloud/word-cloud.class.js +1 -1
  64. package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
  65. package/dist/components/forms/button/button.class.d.ts +30 -1
  66. package/dist/components/forms/button/button.class.js +2 -2
  67. package/dist/components/forms/checkbox/checkbox.class.d.ts +8 -6
  68. package/dist/components/forms/checkbox/checkbox.class.js +2 -2
  69. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +7 -5
  70. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  71. package/dist/components/forms/color-picker/color-picker.class.d.ts +16 -2
  72. package/dist/components/forms/color-picker/color-picker.class.js +2 -2
  73. package/dist/components/forms/color-picker/color-picker.styles.js +1 -1
  74. package/dist/components/forms/combobox/combobox.class.d.ts +43 -8
  75. package/dist/components/forms/combobox/combobox.class.js +2 -2
  76. package/dist/components/forms/date-picker/date-input.class.d.ts +4 -0
  77. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  78. package/dist/components/forms/icon-button/icon-button.class.d.ts +20 -3
  79. package/dist/components/forms/icon-button/icon-button.class.js +1 -1
  80. package/dist/components/forms/icon-button/icon-button.styles.js +1 -1
  81. package/dist/components/forms/input/input.class.d.ts +5 -2
  82. package/dist/components/forms/input/input.class.js +1 -1
  83. package/dist/components/forms/input/time-input.class.d.ts +4 -0
  84. package/dist/components/forms/input/time-input.class.js +1 -1
  85. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +11 -5
  86. package/dist/components/forms/locale-picker/locale-picker.class.js +1 -1
  87. package/dist/components/forms/otp-input/otp-input.class.d.ts +7 -2
  88. package/dist/components/forms/otp-input/otp-input.class.js +2 -2
  89. package/dist/components/forms/radio/radio-button.class.d.ts +2 -1
  90. package/dist/components/forms/radio/radio-group.class.d.ts +9 -4
  91. package/dist/components/forms/radio/radio-group.class.js +1 -1
  92. package/dist/components/forms/radio/radio.class.d.ts +13 -7
  93. package/dist/components/forms/radio/radio.class.js +1 -1
  94. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +16 -6
  95. package/dist/components/forms/rubric-form/rubric-form.class.js +2 -2
  96. package/dist/components/forms/select/select.class.d.ts +19 -8
  97. package/dist/components/forms/select/select.class.js +2 -2
  98. package/dist/components/forms/slider/slider.class.d.ts +4 -2
  99. package/dist/components/forms/slider/slider.class.js +1 -1
  100. package/dist/components/forms/switch/switch.class.d.ts +8 -6
  101. package/dist/components/forms/switch/switch.class.js +1 -1
  102. package/dist/components/forms/textarea/textarea.class.d.ts +5 -3
  103. package/dist/components/forms/textarea/textarea.class.js +1 -1
  104. package/dist/components/forms/time-range/time-range.class.d.ts +12 -7
  105. package/dist/components/forms/time-range/time-range.class.js +1 -1
  106. package/dist/components/forms/time-range/time-range.styles.js +1 -1
  107. package/dist/components/forms/token-input/token-input.class.d.ts +6 -4
  108. package/dist/components/forms/token-input/token-input.class.js +1 -1
  109. package/dist/components/layout/app-rail/app-rail-item.class.d.ts +109 -4
  110. package/dist/components/layout/app-rail/app-rail-item.class.js +34 -29
  111. package/dist/components/layout/app-rail/app-rail-item.styles.js +1 -1
  112. package/dist/components/layout/app-rail/app-rail.class.d.ts +25 -3
  113. package/dist/components/layout/app-rail/app-rail.styles.js +1 -1
  114. package/dist/components/layout/app-rail-group/app-rail-group.class.d.ts +2 -2
  115. package/dist/components/layout/app-rail-group/app-rail-group.class.js +2 -2
  116. package/dist/components/layout/carousel/carousel.class.d.ts +1 -1
  117. package/dist/components/layout/carousel/carousel.class.js +1 -1
  118. package/dist/components/layout/details/accordion.class.d.ts +2 -2
  119. package/dist/components/layout/details/accordion.class.js +2 -2
  120. package/dist/components/layout/filter-bar/filter-bar-register.d.ts +1 -0
  121. package/dist/components/layout/filter-bar/filter-bar-register.js +1 -0
  122. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +85 -10
  123. package/dist/components/layout/filter-bar/filter-bar.class.js +7 -4
  124. package/dist/components/layout/menu/menu-item.class.d.ts +3 -3
  125. package/dist/components/layout/menu/menu-item.class.js +3 -3
  126. package/dist/components/layout/menu/menu.class.d.ts +5 -1
  127. package/dist/components/layout/menu/menu.class.js +2 -2
  128. package/dist/components/layout/reorder-list/reorder-item.styles.js +1 -1
  129. package/dist/components/layout/virtual-list/virtual-list.class.js +1 -1
  130. package/dist/components/media/attachment-trigger/attachment-trigger.styles.js +1 -1
  131. package/dist/components/media/avatar-group/avatar-group.class.d.ts +12 -1
  132. package/dist/components/media/avatar-group/avatar-group.class.js +2 -2
  133. package/dist/components/media/drop-zone/drop-zone.class.d.ts +32 -11
  134. package/dist/components/media/drop-zone/drop-zone.class.js +2 -2
  135. package/dist/components/media/file-input/file-input.class.d.ts +40 -19
  136. package/dist/components/media/file-input/file-input.class.js +2 -2
  137. package/dist/components/overlays/callout/callout.styles.js +1 -1
  138. package/dist/components/overlays/dialog/dialog.styles.js +1 -1
  139. package/dist/components/overlays/overlay/dropdown.class.d.ts +13 -3
  140. package/dist/components/overlays/overlay/dropdown.class.js +2 -2
  141. package/dist/components/overlays/overlay/popover.class.d.ts +12 -3
  142. package/dist/components/overlays/overlay/popover.class.js +2 -2
  143. package/dist/components/overlays/rating/rating.class.d.ts +9 -7
  144. package/dist/components/overlays/rating/rating.class.js +1 -1
  145. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +5 -1
  146. package/dist/components/retrieval/citation-badge/citation-badge.class.js +1 -1
  147. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
  148. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +5 -1
  149. package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
  150. package/dist/components/retrieval/graph-legend/graph-legend.styles.js +1 -1
  151. package/dist/components/retrieval/retrieval-value-format.js +1 -1
  152. package/dist/components/retrieval/source-list/source-list.styles.js +1 -1
  153. package/dist/components/utility/copy-button/copy-button.class.d.ts +23 -11
  154. package/dist/components/utility/copy-button/copy-button.class.js +2 -2
  155. package/dist/components/utility/copy-button/copy-button.styles.js +1 -1
  156. package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
  157. package/dist/components/utility/export-button/export-button.class.d.ts +4 -0
  158. package/dist/components/utility/export-button/export-button.class.js +1 -1
  159. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  160. package/dist/components/utility/known-date/known-date.class.js +1 -1
  161. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +38 -3
  162. package/dist/components/utility/mention-popover/mention-popover.class.js +2 -1
  163. package/dist/components/utility/mention-popover/mention-popover.styles.js +1 -1
  164. package/dist/components/utility/poll-status/poll-status.styles.js +1 -1
  165. package/dist/components/utility/tour/tour.class.d.ts +4 -0
  166. package/dist/components/utility/tour/tour.class.js +1 -1
  167. package/dist/components/utility/tour/tour.styles.js +1 -1
  168. package/dist/components/viewers/document-preview/document-preview.class.js +2 -2
  169. package/dist/components/viewers/docx-viewer/docx-viewer.class.js +2 -2
  170. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +2 -2
  171. package/dist/components/viewers/highlight-layer/highlight-layer.class.js +2 -2
  172. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +2 -2
  173. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +2 -2
  174. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +2 -2
  175. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +2 -2
  176. package/dist/custom-elements-jsx.d.ts +2 -2
  177. package/dist/events.d.ts +13 -12
  178. package/dist/internal/aggregate-file-limits.d.ts +33 -0
  179. package/dist/internal/aggregate-file-limits.js +1 -0
  180. package/dist/internal/catalog-picker.d.ts +15 -2
  181. package/dist/internal/catalog-picker.js +1 -1
  182. package/dist/internal/debounce-controller.d.ts +14 -0
  183. package/dist/internal/debounce-controller.js +1 -1
  184. package/dist/internal/default-strings.generated.d.ts +1 -1
  185. package/dist/internal/default-strings.generated.js +2 -2
  186. package/dist/internal/focus-navigation.d.ts +45 -0
  187. package/dist/internal/focus-navigation.js +1 -1
  188. package/dist/internal/form-associated.js +1 -1
  189. package/dist/internal/initial-slot-collection.d.ts +30 -0
  190. package/dist/internal/initial-slot-collection.js +1 -0
  191. package/dist/internal/intl-cache.js +1 -1
  192. package/dist/internal/invalid-event-alias.d.ts +46 -0
  193. package/dist/internal/invalid-event-alias.js +1 -1
  194. package/dist/internal/localization-runtime.d.ts +24 -0
  195. package/dist/internal/localization-runtime.js +1 -1
  196. package/dist/internal/localization-types.d.ts +1 -1
  197. package/dist/internal/localization.js +1 -1
  198. package/dist/internal/package-metadata.d.ts +1 -1
  199. package/dist/internal/package-metadata.js +1 -1
  200. package/dist/internal/positioning-strategy.d.ts +3 -1
  201. package/dist/internal/state-part.d.ts +49 -0
  202. package/dist/internal/state-part.js +1 -0
  203. package/dist/internal/variants.styles.js +1 -1
  204. package/dist/lyra.d.ts +1 -1
  205. package/dist/svelte.d.ts +2 -2
  206. package/dist/testing/index.d.ts +1 -1
  207. package/dist/testing/index.js +1 -1
  208. package/dist/testing/lyra-tag-event-map.d.ts +2 -2
  209. package/dist/testing/lyra-tag-event-map.js +1 -1
  210. package/dist/testing/wait-for-mount.d.ts +46 -0
  211. package/dist/testing/wait-for-mount.js +1 -0
  212. package/dist/theme/theme-bootstrap.js +1 -1
  213. package/dist/theme/theme.d.ts +11 -2
  214. package/dist/theme/theme.js +1 -1
  215. package/dist/translations/ar/layout.js +1 -1
  216. package/dist/translations/de/layout.js +1 -1
  217. package/dist/translations/es/layout.js +1 -1
  218. package/dist/translations/fa/layout.js +1 -1
  219. package/dist/translations/fr/layout.js +1 -1
  220. package/dist/translations/he/layout.js +1 -1
  221. package/dist/translations/it/layout.js +1 -1
  222. package/dist/translations/ja/layout.js +1 -1
  223. package/dist/translations/pt-BR/layout.js +1 -1
  224. package/dist/translations/ru/layout.js +1 -1
  225. package/dist/translations/zh-CN/layout.js +1 -1
  226. package/dist/utilities/format.d.ts +17 -0
  227. package/dist/utilities/format.js +1 -1
  228. package/dist/vue.d.ts +2 -2
  229. package/llms/components/lr-app-rail-group.md +87 -10
  230. package/llms/components/lr-app-rail-item.md +88 -11
  231. package/llms/components/lr-app-rail.md +88 -11
  232. package/llms/components/lr-attachment-trigger.md +21 -0
  233. package/llms/components/lr-bar-chart.md +3 -2
  234. package/llms/components/lr-bubble-chart.md +3 -2
  235. package/llms/components/lr-callout.md +10 -0
  236. package/llms/components/lr-chart.md +43 -12
  237. package/llms/components/lr-citation-badge.md +7 -1
  238. package/llms/components/lr-code-block.md +21 -0
  239. package/llms/components/lr-color-picker.md +12 -7
  240. package/llms/components/lr-combobox.md +13 -1
  241. package/llms/components/lr-confirm-bar.md +36 -7
  242. package/llms/components/lr-context-meter.md +17 -4
  243. package/llms/components/lr-date-input.md +7 -1
  244. package/llms/components/lr-date-picker.md +6 -0
  245. package/llms/components/lr-dialog.md +21 -0
  246. package/llms/components/lr-doughnut-chart.md +3 -2
  247. package/llms/components/lr-drawer.md +10 -0
  248. package/llms/components/lr-drop-zone.md +16 -7
  249. package/llms/components/lr-dropdown-item.md +7 -0
  250. package/llms/components/lr-entity-chip.md +7 -1
  251. package/llms/components/lr-export-button.md +7 -1
  252. package/llms/components/lr-file-input.md +21 -10
  253. package/llms/components/lr-filter-bar.md +91 -15
  254. package/llms/components/lr-flow-canvas.md +16 -9
  255. package/llms/components/lr-gauge.md +22 -2
  256. package/llms/components/lr-histogram.md +7 -2
  257. package/llms/components/lr-icon-button.md +15 -7
  258. package/llms/components/lr-input.md +3 -1
  259. package/llms/components/lr-line-chart.md +3 -2
  260. package/llms/components/lr-lite-chart.md +13 -0
  261. package/llms/components/lr-locale-picker.md +7 -1
  262. package/llms/components/lr-mention-popover.md +16 -3
  263. package/llms/components/lr-menu-item.md +7 -0
  264. package/llms/components/lr-menu.md +8 -1
  265. package/llms/components/lr-message-actions.md +10 -0
  266. package/llms/components/lr-model-select.md +8 -3
  267. package/llms/components/lr-native-time-input.md +8 -1
  268. package/llms/components/lr-number-input.md +8 -1
  269. package/llms/components/lr-option.md +12 -0
  270. package/llms/components/lr-otp-input.md +6 -0
  271. package/llms/components/lr-pie-chart.md +3 -2
  272. package/llms/components/lr-polar-area-chart.md +3 -2
  273. package/llms/components/lr-prompt-input.md +2 -2
  274. package/llms/components/lr-radar-chart.md +3 -2
  275. package/llms/components/lr-reorder-item.md +12 -0
  276. package/llms/components/lr-reorder-list.md +12 -0
  277. package/llms/components/lr-scatter-chart.md +3 -2
  278. package/llms/components/lr-sequence-strip.md +10 -4
  279. package/llms/components/lr-streaming-text-core.md +21 -8
  280. package/llms/components/lr-streaming-text.md +34 -4
  281. package/llms/components/lr-suggestion-chips.md +8 -4
  282. package/llms/components/lr-table.md +47 -10
  283. package/llms/components/lr-textarea.md +1 -1
  284. package/llms/components/lr-time-input.md +7 -1
  285. package/llms/components/lr-tool-call-chip.md +7 -1
  286. package/llms/components/lr-tour.md +7 -1
  287. package/llms/components/lr-usage-badge.md +7 -1
  288. package/llms/components/lr-voice-picker.md +7 -3
  289. package/llms/shared.md +169 -16
  290. package/llms/tokens.md +17 -1
  291. package/llms-full.txt +941 -147
  292. package/package.json +16 -2
  293. package/registrations.json +1 -1
  294. package/vscode-css-data.json +1 -1
  295. package/vscode-html-data.json +1 -1
  296. package/web-types.json +1 -1
@@ -92,8 +92,14 @@ structured points retain their y-value formatting.
92
92
  - `labels: readonly string[] = []` (attribute: false)
93
93
  - `datasets: readonly LyraChartSeries[] = []` (attribute: false) — `LyraChartSeries { readonly
94
94
  label: string; readonly data?: readonly (number|null)[]; readonly points?: readonly
95
- LyraChartPoint[]; readonly color?: string|readonly string[]; ... }`. The deprecated `Series` and
96
- `ChartPoint` names were removed in 9.0.0 — import `LyraChartSeries`/`LyraChartPoint` instead.
95
+ LyraChartPoint[]; readonly color?: string|readonly string[]; readonly stack?: string; ... }`. The
96
+ deprecated `Series` and `ChartPoint` names were removed in 9.0.0 — import
97
+ `LyraChartSeries`/`LyraChartPoint` instead.
98
+ - `stack` is a Chart.js dataset `stack` group id: series sharing one `stack` value on the same
99
+ (stacked) axis accumulate into one stack; a different id starts an independent stack Chart.js
100
+ draws side by side with the first on that axis. Omitted series share one implicit group, so
101
+ every chart written before `stack` existed sums exactly as it always did. Only meaningful on an
102
+ axis that is actually stacked — see `stacked`/`stackedAxes` below.
97
103
  `LyraChartPoint { readonly x: number; readonly
98
104
  y: number; readonly r?: number; readonly label?: string }`: `r` is the bubble
99
105
  radius, and the optional per-point `label` is retained by events, CSV export, keyboard
@@ -188,6 +194,16 @@ structured points retain their y-value formatting.
188
194
  and the stack's own `axis`, but no `datasetIndex` and no `seriesLabel` — naming the topmost
189
195
  series would make a unit-switching formatter render that one series' unit for a cross-series
190
196
  number. `lr-lite-chart`'s total cells drop the same two fields.
197
+ - `tooltipTitleFormatter?: LyraChartTooltipGroupFormatter` (attribute: false) — tooltip title
198
+ formatter (e.g. a scatter point's own name). `LyraChartTooltipGroupFormatter = (items:
199
+ readonly LyraChartFormatterContext[]) => string`: unlike `formatter`, which runs once per item,
200
+ this runs once per tooltip render and receives every hovered item's context at once (one entry
201
+ per dataset the tooltip covers, each in the same shape `formatter`'s `'tooltip'` surface already
202
+ produces). Unset (the default) leaves Chart.js's own default title — the shared category label.
203
+ - `tooltipFooterFormatter?: LyraChartTooltipGroupFormatter` (attribute: false) — tooltip footer
204
+ formatter (e.g. a category's stack total under the items), in the same shape and calling
205
+ convention as `tooltipTitleFormatter`. Unset (the default) leaves Chart.js's own default: no
206
+ footer.
191
207
  - `area: boolean = false` — chart-wide default for whether line-type series fill the region under
192
208
  their line; a series's own `fill` overrides it, rendered with a translucent version of its color
193
209
  - `zoom: boolean = false` — wheel/drag/pinch zoom on the `x` axis only (pan disabled, and the zoom
@@ -202,6 +218,14 @@ structured points retain their y-value formatting.
202
218
  - `stacked: boolean = false` — stacks the `x`/`y`(/`y2`) scale entries `buildScales()` returns; only
203
219
  meaningful for `bar`/`line` types (scatter/bubble's linear `x` scale and the radial `r` scale used
204
220
  by radar/polar-area are out of scope)
221
+ - `stackedAxes?: Partial<Record<'y' | 'y2', boolean>>` (attribute: false) — per-value-axis override
222
+ of `stacked`, keyed by `'y'`/`'y2'`. An axis absent from this record — including every axis when
223
+ the whole property is unset — falls back to `stacked`, so a chart that never sets this renders
224
+ byte-identically to before. Lets a `stacked` bar series on the primary axis sit next to an
225
+ unstacked overlay series on `y2` (via `LyraChartSeries.axis: 'y2'`): e.g. `stacked` plus
226
+ `stackedAxes: { y2: false }`. The shared categorical axis (`x` for a vertical bar/line, or `y`
227
+ under a horizontal `indexAxis`) has no entry of its own — it always mirrors the resolved `'y'`
228
+ value, matching Chart.js's own paired index/value-scale stacking contract.
205
229
  - `withoutAnimation: boolean = false` (attribute `without-animation`, reflected) — disables Chart.js
206
230
  construction animation; reduced-motion preference also disables it regardless of this value
207
231
  - `withoutTooltip: boolean = false` (attribute `without-tooltip`, reflected) — disables the
@@ -214,14 +238,20 @@ structured points retain their y-value formatting.
214
238
  `feature-warning` plus assertive announcement explains the nonfatal limitation. The screen-reader
215
239
  equivalent is the always-present accessible data table (`show-data-table` makes it visible) —
216
240
  labels are a purely visual, canvas-only addition and add no new a11y surface.
217
- - `stackTotals: boolean = false` (attribute `stack-totals`) — with `stacked` (bar/line only), draws
218
- the per-category stack total above each stack, via the same `chartjs-plugin-datalabels` peer.
219
- Null/undefined points are skipped; a category whose every value is null shows no total (not
220
- `0`). The generated accessible table receives the same formatted total column; a dual-axis stack
221
- receives separately labelled primary- and secondary-axis total columns. The table totals do not
222
- depend on the optional visual-label peer being installed. If that peer is unavailable, the chart
223
- retains its core rendering and generated table totals while a localized nonfatal warning explains
224
- that the canvas labels cannot be drawn.
241
+ - `stackTotals: boolean = false` (attribute `stack-totals`) — on an actually-stacked axis (`stacked`
242
+ or `stackedAxes`, bar/line only), draws the per-category stack total above each stack, via the
243
+ same `chartjs-plugin-datalabels` peer. Computed per `LyraChartSeries.stack` group as well as per
244
+ axis: two stack groups sharing one axis each get their own total, drawn above their own topmost
245
+ dataset, and a dataset on an axis that isn't stacked (e.g. an unstacked `stackedAxes` overlay)
246
+ never gets one. Null/undefined points are skipped; a category whose every value is null shows no
247
+ total (not `0`). The generated accessible table receives one formatted total column per stacked
248
+ axis (a dual-axis stack gets separately labelled primary- and secondary-axis columns); with
249
+ multiple stack groups on one axis, that column still totals only the implicit group of series
250
+ that never set their own `stack` id — a per-group breakdown is available programmatically but not
251
+ yet surfaced as extra table columns. The table totals do not depend on the optional visual-label
252
+ peer being installed. If that peer is unavailable, the chart retains its core rendering and
253
+ generated table totals while a localized nonfatal warning explains that the canvas labels cannot
254
+ be drawn.
225
255
  - `config?: LyraChartConfiguration` (attribute: false) — peer-neutral configuration structurally
226
256
  compatible with Chart.js's `ChartConfiguration`, deep-merged over the generated
227
257
  config; any nested key wins without clobbering sibling generated keys. This is the raw Chart.js
@@ -542,8 +572,9 @@ announced. In particular, unavailable data labels do not remove generated table
542
572
  pending. Independently, `updated()` only reaches
543
573
  Chart.js when at least one of `type`, `labels`, `datasets`, `description`, `grid`, `axes`, `compact`, `indexAxis`,
544
574
  `label`, `hiddenDatasets`, `legendPosition`, `min`, `max`, `plugins`, the internal resolved auto legend
545
- position, `valueFormatter`, `formatter`, `area`, `height`, `xLabel`, `yLabel`, `y2Label`, `beginAtZero`,
546
- `stacked`, any `without*` control, `dataLabels`, `stackTotals`, `config`, the parsed
575
+ position, `valueFormatter`, `formatter`, `tooltipTitleFormatter`, `tooltipFooterFormatter`, `area`,
576
+ `height`, `xLabel`, `yLabel`, `y2Label`, `beginAtZero`,
577
+ `stacked`, `stackedAxes`, any `without*` control, `dataLabels`, `stackTotals`, `config`, the parsed
547
578
  slotted config, `zoom`, `locale`, `strings`, or the internal loading state actually changed in
548
579
  that update (so an
549
580
  unrelated property/state update, or a bare `requestUpdate()`, draws nothing). Resize callbacks
@@ -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** 4 parts, 7 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 4 parts, 8 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
  ---
@@ -75,6 +75,12 @@ The anchored source-preview popover is a floating surface and paints from the **
75
75
  declared on `:host`, so one declaration on `:root` — or on any ancestor, to scope it — retints this
76
76
  surface together with every other floating surface in the library. `--lr-overlay-radius` (default `var(--lr-radius)`) is the matching corner radius.
77
77
 
78
+ `--lr-positioning-strategy` (16.0.0) — the source-preview popover reads this same cascading
79
+ `absolute`/`fixed` override documented on `<lr-popover>` when it is (re)positioned, falling back to
80
+ its own `fixed` default when nothing is set. There is no per-instance `positioning-strategy`
81
+ property on `<lr-citation-badge>`; set the custom property on `:root`, a theme, or one clipping
82
+ ancestor to change every unset citation badge beneath it.
83
+
78
84
  **Optional peer deps:** none.
79
85
 
80
86
  ```html
@@ -123,6 +123,27 @@ header gap — a rule that sets `display` on it must qualify itself with `:not([
123
123
  `line-button` (a gutter line-number button, only rendered while `activatableLines` and `lineNumbers`
124
124
  are both set)
125
125
 
126
+ **Migrating a pre-16.0.0 `::part()` rule.** This component's icon-only action is a composed
127
+ `<lr-icon-button>`, so the part naming that action now names the composed child's HOST, which
128
+ paints nothing. A `border`, `background` or `border-radius` set on it is silently dead — only
129
+ `color` still appears to work, because it inherits, which makes such a rule look half-alive rather
130
+ than broken. Set `--lr-icon-button-background`/`-color`/`-border`/`-radius` (and their
131
+ `-hover`/`-active` variants) on this element or an ancestor instead: the composed control reads
132
+ those public tokens ahead of any default this component supplies. For SIZE use
133
+ `--lr-theme-icon-button-size`, not `--lr-icon-button-size` — every `LyraElement` re-declares the
134
+ latter on its own `:host`, so it never reaches a composed child (see `llms/tokens.md`).
135
+
136
+ **Border reaches the composed copy control the same way background/color/radius do.** This
137
+ component paints no resting border of its own, so it relays no `--_lr-icon-button-border-default`
138
+ into the copy control's private fallback tier — but that absence is not a gap. The public
139
+ `--lr-icon-button-border` (and its `-hover`/`-active` variants) is the FIRST arm of the token
140
+ chain, resolved by ordinary custom-property inheritance regardless of whether this component
141
+ relays a default for that same property, so setting it on this element or an ancestor reaches the
142
+ copy control exactly as the background/color/radius tokens do. A component with no resting
143
+ border simply has no default to relay, which is different from border theming being broken. Size
144
+ remains the one exception that does not cross this way: use `--lr-theme-icon-button-size`, never
145
+ `--lr-icon-button-size`, as noted above.
146
+
126
147
  **Themeable custom properties:** `--lr-code-block-max-height` (default `none` — an independently
127
148
  settable scroll cap; a `max-height` attribute writes the same property inline on `body` and wins),
128
149
  `--lr-code-block-font` (default
@@ -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** 43 parts, 33 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 43 parts, 34 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
  ---
@@ -90,12 +90,15 @@ and:
90
90
  applies to the whole string, function names included (`RGB(255, 0, 0)`)
91
91
  - `swatches: string | string[] | LyraColorPickerSwatch[] = ''` — a predefined palette, given as a
92
92
  `;`-separated string, an array of colour strings, or an array of
93
- `{ color: string; label?: string }` objects. Any colour the picker can parse is accepted; blank
94
- entries are dropped. An entry that is _not_ parseable is kept in the list and still renders a
95
- swatch — it just paints no colour (the bare checkerboard) and clicking it does nothing, so filter
96
- the palette yourself if that matters. `label` becomes the swatch's accessible name; a missing,
97
- empty, or whitespace-only label falls back to announcing the raw colour string. The palette
98
- container renders only while the normalized list is non-empty
93
+ `{ color: string; label?: string; disabled?: boolean }` objects. Any colour the picker can parse
94
+ is accepted; blank entries are dropped. An entry that is _not_ parseable is kept in the list and
95
+ still renders a swatch — it just paints no colour (the bare checkerboard) and clicking it does
96
+ nothing, so filter the palette yourself if that matters. `label` becomes the swatch's accessible
97
+ name; a missing, empty, or whitespace-only label falls back to announcing the raw colour string.
98
+ `disabled` marks that one swatch non-actionable, independent of the whole control's own
99
+ `disabled`: it renders a genuinely disabled `<button>` (no tab stop, no hover/press affordance)
100
+ and clicking it commits nothing; omitted or `false` renders the swatch exactly as before this
101
+ field existed. The palette container renders only while the normalized list is non-empty
99
102
  - `withoutFormatToggle: boolean = false` (attribute `without-format-toggle`) — removes the button
100
103
  that cycles between formats. `noFormatToggle` (`no-format-toggle`) is the Shoelace spelling and
101
104
  reaches the same behavior; either one wins
@@ -279,6 +282,8 @@ of authoring `positioning-strategy`/`hoist` on each instance.
279
282
  `var(--lr-color-brand)`.
280
283
  - `--lr-color-picker-selected-check-color` — Checkmark on the selected palette swatch. Default:
281
284
  `var(--lr-color-surface)`.
285
+ - `--lr-color-picker-swatch-disabled-opacity` — Opacity of a palette swatch whose own entry sets
286
+ `disabled`. Default: `0.5`.
282
287
 
283
288
  ```html
284
289
  <lr-color-picker
@@ -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** 33 parts, 31 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 33 parts, 32 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Documented with** `lr-option` (same section below)
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
15
15
 
@@ -155,6 +155,18 @@ An async `source` row can carry the same two fields (`start`, `end`) alongside i
155
155
  that window instead, since the value is not yet known to be unmatched at all
156
156
  - `appearance: 'filled' | 'outlined' | 'filled-outlined' = 'outlined'` (reflected)
157
157
  - `placement: 'top' | 'bottom' = 'bottom'` (reflected; flip/shift can still keep the listbox in view)
158
+ - `positioningStrategy: PlaceStrategy = 'fixed'` (attribute `positioning-strategy`, reflected) —
159
+ the CSS positioning scheme the listbox is laid out with, spelled the same as on `lr-select`,
160
+ `lr-popover`, `lr-dropdown`, `lr-tooltip` and `lr-color-picker`. `fixed` is this control's
161
+ default and what it has always rendered: it positions against the viewport and escapes most
162
+ clipping ancestors, which suits a typeahead list that usually sits inside a scrollable region.
163
+ `absolute` positions against the nearest containing block and scrolls with it. An unsupported
164
+ value resolves to the default. Like `placement`, a change takes effect the next time the listbox
165
+ opens. When the instance sets nothing, the cascading `--lr-positioning-strategy` custom property
166
+ (`absolute`/`fixed`, set on `:root`, a theme, or one clipping ancestor) is honoured ahead of the
167
+ default; an explicit instance value always wins. There is deliberately no `hoist` alias here:
168
+ unlike on `lr-select`, where it is Shoelace's established spelling, it would be a boolean
169
+ defaulting to `true`, so its attribute could only ever express the value the control already has
158
170
  - `clearable: boolean = false` (reflected) — displays the clear button while there is something to
159
171
  clear on **either** axis this control owns: a committed selection, or _visible_ filter text. See
160
172
  "the clear button covers two axes" below
@@ -82,13 +82,21 @@ real overlays use.
82
82
  `returnFocusTo: ConfirmBarReturnFocusTarget = null` (attribute: false) — where focus goes once a
83
83
  decision lands, instead of parking on `[part="status"]`.
84
84
  `ConfirmBarReturnFocusTarget = HTMLElement | null | (() => HTMLElement | null)`; the thunk form is
85
- resolved at handoff time, because a host that swaps a focused control out for this bar often
86
- re-creates that control on the way back. It applies to every path that reaches a decision, a
87
- `pending` decision finalized externally included. A named target that is missing, detached, `inert`,
88
- or otherwise refuses focus falls back to `[part="status"]` rather than to `<body>` an `inert`
89
- element refuses `focus()` silently. Left unset, the handoff is byte-identical to the shipped one.
90
- The pending state is deliberately *not* affected: while a decision is awaiting resolution, focus
91
- still parks on `[part="status"]`, because that is not the return journey yet.
85
+ called at handoff time, because a host that swaps a focused control out for this bar often
86
+ re-creates that control on the way back and, because every supported host framework re-renders
87
+ asynchronously relative to that synchronous handoff, the control frequently does not exist yet at
88
+ that first call. When the first call does not yet name a live, focusable element, the same handoff
89
+ calls the thunk again once the host has had a real chance to react (its own re-render committed),
90
+ and moves focus there if it has since appeared and nothing else has claimed focus in the meantime —
91
+ this is what makes the swap-a-trigger-for-this-bar case actually work, rather than only working when
92
+ the host happens to re-create its control before the decision lands. A plain element value is
93
+ resolved once, synchronously, and never retried: it names something that either already exists or
94
+ never will. It applies to every path that reaches a decision, a `pending` decision finalized
95
+ externally included. A named target that is missing, detached, `inert`, or otherwise refuses focus
96
+ falls back to `[part="status"]` rather than to `<body>` — an `inert` element refuses `focus()`
97
+ silently. Left unset, the handoff is byte-identical to the shipped one. The pending state is
98
+ deliberately *not* affected: while a decision is awaiting resolution, focus still parks on
99
+ `[part="status"]`, because that is not the return journey yet.
92
100
 
93
101
  **Slots:** default — supplementary body content between the heading and the actions (e.g. a
94
102
  `lr-diff-view`). `footer` — extra content at the start of the action row.
@@ -213,3 +221,24 @@ bar.addEventListener("lr-approve", (e) => {
213
221
  }); // bounce back, retry
214
222
  });
215
223
  ```
224
+
225
+ A host that reveals this bar in place of a control it just hid — the `returnFocusTo` motivating
226
+ case — does not need to order that swap relative to the line above. A reactive host's own re-render
227
+ (replacing this bar with its trigger again) runs on its own update cycle, which lands asynchronously
228
+ either way, so `returnFocusTo`'s thunk is written to be called twice: once immediately, in case the
229
+ control already exists, and once more after the host has had a chance to react if the first call
230
+ found nothing yet:
231
+
232
+ ```ts
233
+ bar.returnFocusTo = () => document.querySelector('[data-action="delete"]');
234
+ bar.addEventListener("lr-approve", (e) => {
235
+ e.preventDefault();
236
+ runApproval(e.detail.args)
237
+ .then(() => {
238
+ bar.decision = "approved"; // the host's own state clear can happen before or after this
239
+ })
240
+ .catch(() => {
241
+ bar.pending = null;
242
+ });
243
+ });
244
+ ```
@@ -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** 13 parts, 9 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 17 parts, 10 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
  ---
@@ -26,9 +26,13 @@ used" summary.
26
26
  **Properties:**
27
27
 
28
28
  - `segments: ContextMeterSegment[] = []` (attribute: false, JS-only) — `{ label: string; value:
29
- number; tone?: 'brand' | 'success' | 'warning' | 'danger' | 'neutral'; color?: string }[]`. `value` is an _absolute_
29
+ number; tone?: 'brand' | 'success' | 'warning' | 'danger' | 'neutral'; color?: string; disabled?:
30
+ boolean }[]`. `value` is an _absolute_
30
31
  quantity measured against `total`, never a pre-computed percentage.
31
32
  `color`, when supplied, is a sanitized arbitrary CSS color that takes precedence over `tone`.
33
+ `disabled`, when set, marks that band non-actionable while `interactive` is set: its control
34
+ renders genuinely disabled (no tab stop, no hover/press affordance) and activating it emits no
35
+ `lr-segment-activate`.
32
36
  - `total: number = 0` — the full capacity segments are measured against (e.g. a model's context
33
37
  window size).
34
38
  - `shape: ContextMeterShape = 'bar'` (`'bar' | 'ring'`, reflected) — the v9 geometry name;
@@ -95,7 +99,14 @@ color hook as `segment`) and `legend-label`, plus `legend-value` and `legend-per
95
99
  matching `legendDisplay` settings. While `interactive` is set, `segment` and `legend-item` are
96
100
  `<button>`s (a `role="button"` arc under `shape="ring"`) and a selected one carries a second part
97
101
  token — `segment-selected` / `legend-item-selected` — because nothing but a pseudo-class may follow
98
- `::part()`, so the state has to live in the part name
102
+ `::part()`, so the state has to live in the part name. Two further state tokens join them, and they
103
+ compose: `segment-empty` / `legend-item-empty` on a band whose `value` is 0, and
104
+ `segment-disabled` / `legend-item-disabled` on a band whose `segments` entry sets `disabled`. The
105
+ empty pair is DERIVED and carries no built-in treatment — it is the hook for your own "nothing in
106
+ this bucket" styling, and a zero band stays actionable. The disabled pair is DECLARED: that control
107
+ renders genuinely disabled (no tab stop, no hover or press affordance) and activating it emits no
108
+ `lr-segment-activate`. Inertness is never inferred from a zero value, because a zero band is
109
+ legitimately clickable in a budget meter
99
110
 
100
111
  **Themeable custom properties:** `--lr-context-meter-segment-color` is set per segment when its
101
112
  `color` field is supplied, and is read by both `segment` and its matching `legend-swatch` so the
@@ -116,7 +127,9 @@ selected band stays visibly selected exactly while it is being pointed at or foc
116
127
  ring stays intact. `--lr-context-meter-selected-arc-stroke` (default `16`, in this component's
117
128
  `0 0 100 100` viewBox units) is the stroke width of a selected `ring`-shape arc: every arc shares
118
129
  one bounding box, so a selected arc reports itself by thickening in place rather than by an outline
119
- that would trace the whole ring identically for every selection. Otherwise the component consumes shared tokens
130
+ that would trace the whole ring identically for every selection.
131
+ `--lr-context-meter-disabled-opacity` (default `var(--lr-opacity-disabled)`) dims a band or legend row whose entry sets
132
+ `disabled`; the band keeps its own colour, since that colour is the datum. Otherwise the component consumes shared tokens
120
133
  `--lr-space-xs`, `--lr-color-text-quiet`, `--lr-font`, `--lr-radius`, `--lr-color-border`,
121
134
  `--lr-color-brand`, `--lr-color-success`, `--lr-color-warning`, `--lr-color-danger`,
122
135
  `--lr-transition-base`.
@@ -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** 22 parts, 23 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 22 parts, 24 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Documented with** `lr-date-picker` (same section below)
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
15
15
 
@@ -336,6 +336,12 @@ state hooks are `--lr-date-input-action-hover-color`, `--lr-date-input-action-ho
336
336
  `--lr-date-input-action-active-radius` for the pressed state. They inherit from theme ancestors;
337
337
  direct values on `lr-date-input` win without retuning library-wide tokens.
338
338
 
339
+ `--lr-positioning-strategy` (16.0.0) — the calendar popup reads this same cascading
340
+ `absolute`/`fixed` override documented on `<lr-popover>` when it is (re)positioned, falling back to
341
+ its own `fixed` default when nothing is set. There is no per-instance `positioning-strategy`
342
+ property on `<lr-date-input>`; set the custom property on `:root`, a theme, or one clipping
343
+ ancestor to change every unset date input beneath it.
344
+
339
345
  **Optional peer deps:** none.
340
346
 
341
347
  ```html
@@ -336,6 +336,12 @@ state hooks are `--lr-date-input-action-hover-color`, `--lr-date-input-action-ho
336
336
  `--lr-date-input-action-active-radius` for the pressed state. They inherit from theme ancestors;
337
337
  direct values on `lr-date-input` win without retuning library-wide tokens.
338
338
 
339
+ `--lr-positioning-strategy` (16.0.0) — the calendar popup reads this same cascading
340
+ `absolute`/`fixed` override documented on `<lr-popover>` when it is (re)positioned, falling back to
341
+ its own `fixed` default when nothing is set. There is no per-instance `positioning-strategy`
342
+ property on `<lr-date-input>`; set the custom property on `:root`, a theme, or one clipping
343
+ ancestor to change every unset date input beneath it.
344
+
339
345
  **Optional peer deps:** none.
340
346
 
341
347
  ```html
@@ -193,6 +193,27 @@ focusable control _inside_ the body, and the body itself is used only when there
193
193
  focus. So a dialog full of form controls behaves exactly as before, and a dialog full of text is now
194
194
  scrollable with the arrow keys, Page Up/Down and Home/End once Tab reaches it.
195
195
 
196
+ **Migrating a pre-16.0.0 `::part()` rule.** This component's icon-only action is a composed
197
+ `<lr-icon-button>`, so the part naming that action now names the composed child's HOST, which
198
+ paints nothing. A `border`, `background` or `border-radius` set on it is silently dead — only
199
+ `color` still appears to work, because it inherits, which makes such a rule look half-alive rather
200
+ than broken. Set `--lr-icon-button-background`/`-color`/`-border`/`-radius` (and their
201
+ `-hover`/`-active` variants) on this element or an ancestor instead: the composed control reads
202
+ those public tokens ahead of any default this component supplies. For SIZE use
203
+ `--lr-theme-icon-button-size`, not `--lr-icon-button-size` — every `LyraElement` re-declares the
204
+ latter on its own `:host`, so it never reaches a composed child (see `llms/tokens.md`).
205
+
206
+ **Border reaches the composed close control the same way background/color/radius do.** This
207
+ component paints no resting border of its own, so it relays no `--_lr-icon-button-border-default`
208
+ into the close control's private fallback tier — but that absence is not a gap. The public
209
+ `--lr-icon-button-border` (and its `-hover`/`-active` variants) is the FIRST arm of the token
210
+ chain, resolved by ordinary custom-property inheritance regardless of whether this component
211
+ relays a default for that same property, so setting it on this element or an ancestor reaches the
212
+ close control exactly as the background/color/radius tokens do. A component with no resting
213
+ border simply has no default to relay, which is different from border theming being broken. Size
214
+ remains the one exception that does not cross this way: use `--lr-theme-icon-button-size`, never
215
+ `--lr-icon-button-size`, as noted above.
216
+
196
217
  **Themeable custom properties:** mapped aliases are `--backdrop-filter`, `--width`, `--spacing`,
197
218
  `--header-spacing`, `--body-spacing`, `--footer-spacing`, `--show-duration`, and
198
219
  `--hide-duration`. The individual region properties override `--spacing`; mapped properties in
@@ -28,9 +28,10 @@ of every entry in these lists.**
28
28
  **Properties:** `description`, `grid`, `axes`, `compact`, `indexAxis` (`index-axis`), `label`, `hiddenDatasets`, `legendPosition`
29
29
  (`legend-position`), `hiddenDatums`, `legendMode` (`legend-mode`), `legendDisplay` (`legend-display`),
30
30
  `max`, `min`, `plugins`, `scaleType` (`scale-type`), `annotations`,
31
- `stacked`, `withoutAnimation` (`without-animation`),
31
+ `stacked`, `stackedAxes`, `withoutAnimation` (`without-animation`),
32
32
  `withoutLegend` (`without-legend`), `withoutTooltip` (`without-tooltip`), `xLabel` (`x-label`),
33
- `yLabel` (`y-label`), plus additive `labels`, `datasets`, `valueFormatter`, `formatter`, `area`, `zoom`,
33
+ `yLabel` (`y-label`), plus additive `labels`, `datasets`, `valueFormatter`, `formatter`,
34
+ `tooltipTitleFormatter`, `tooltipFooterFormatter`, `area`, `zoom`,
34
35
  `height`, `y2Label` (`y2-label`), `beginAtZero` (`begin-at-zero`), `dataLabels`
35
36
  (`data-labels`), `stackTotals` (`stack-totals`), `config`, `showDataTable`
36
37
  (`show-data-table`), `dataTableToggle` (`data-table-toggle`), `chartArea` (readonly), and `chart`.
@@ -84,6 +84,16 @@ controls, rendered before the built-in close button), `footer` — all inherited
84
84
  Names grouped together are aliases on the same functional node; `close-button__control` is the
85
85
  composed `<lr-icon-button>`'s own native `<button>`, inherited from `lr-dialog` as of 16.0.0.
86
86
 
87
+ **Migrating a pre-16.0.0 `::part()` rule.** This component's icon-only action is a composed
88
+ `<lr-icon-button>`, so the part naming that action now names the composed child's HOST, which
89
+ paints nothing. A `border`, `background` or `border-radius` set on it is silently dead — only
90
+ `color` still appears to work, because it inherits, which makes such a rule look half-alive rather
91
+ than broken. Set `--lr-icon-button-background`/`-color`/`-border`/`-radius` (and their
92
+ `-hover`/`-active` variants) on this element or an ancestor instead: the composed control reads
93
+ those public tokens ahead of any default this component supplies. For SIZE use
94
+ `--lr-theme-icon-button-size`, not `--lr-icon-button-size` — every `LyraElement` re-declares the
95
+ latter on its own `:host`, so it never reaches a composed child (see `llms/tokens.md`).
96
+
87
97
  **Themeable custom properties:** mapped `--size` controls the active axis. For start/end drawers,
88
98
  the inherited `--width` and `--lr-dialog-width` remain compatibility fallbacks when neither
89
99
  `--size` nor `--lr-drawer-width` is set, and `--lr-dialog-max-width` remains an effective cap,
@@ -39,16 +39,25 @@ reimplemented.
39
39
  - `maxFileSize: number = 0` (attribute `max-file-size` — bytes; `0` disables the check), `maxFiles:
40
40
  number = 0` (attribute `max-files`), `maxTotalSize: number = 0` (attribute `max-total-size`) —
41
41
  identical contract and invalid-override fail-safe fallback to `lr-file-input`'s own three limits.
42
- Since this component retains nothing between drops, `maxFiles`/`maxTotalSize` always cover only
43
- the current drop (there is no persisted count/total to add).
42
+ Since this component retains nothing of its own between drops, `maxFiles`/`maxTotalSize` would
43
+ otherwise always cover only the current drop `heldFileCount`/`heldTotalSize` below are what let
44
+ a cumulative cap span separate drops.
45
+ - `heldFileCount: number = 0` (attribute `held-file-count`) and `heldTotalSize: number = 0`
46
+ (attribute `held-total-size`) — externally held baseline added to the running count/byte-total
47
+ `maxFiles`/`maxTotalSize` evaluate against, identical contract to `lr-file-input`'s own
48
+ `heldFileCount`/`heldTotalSize`: `0` (the default) means "nothing held" and reproduces prior
49
+ behavior exactly, and a negative, `NaN`, or `Infinity` override is normalized to `0` via
50
+ `finiteCount` rather than corrupting every later comparison.
44
51
  - `readonly dragging: boolean` — `true` during an active drag session
45
52
 
46
53
  **Events:** `lr-files` (`detail: LyraDropZoneFilesDetail`, with fresh frozen readonly `files` and
47
- `rejected` arrays and frozen rejected-file records, fired on drop; immutable `File` objects retain
48
- identity) typed as `LyraDropZoneFilesEvent`, so `event.target`/`event.currentTarget` are
49
- `LyraDropZone` without a cast. `LyraDropZoneRejectedFile = { readonly file: File; readonly reason:
50
- 'type' | 'count' | 'size' | 'directory' | 'read' | 'limit' | 'maxFiles' | 'maxTotalSize' }`, the
51
- same reason vocabulary as `lr-file-input`'s `LyraFileInputRejectedFile`.
54
+ `rejected` arrays and frozen rejected-file records, plus `remainingFiles`/`remainingTotalSize`
55
+ reporting the allowance still left under `maxFiles`/`maxTotalSize` after this drop (`null` while
56
+ that limit is unset), fired on drop; immutable `File` objects retain identity) typed as
57
+ `LyraDropZoneFilesEvent`, so `event.target`/`event.currentTarget` are `LyraDropZone` without a
58
+ cast. `LyraDropZoneRejectedFile = { readonly file: File; readonly reason: 'type' | 'count' | 'size'
59
+ | 'directory' | 'read' | 'limit' | 'maxFiles' | 'maxTotalSize' }`, the same reason vocabulary as
60
+ `lr-file-input`'s `LyraFileInputRejectedFile`.
52
61
 
53
62
  **Slots:** the default slot is the wrapped region, rendered as ordinary light DOM; `overlay`
54
63
  overrides the localized accept/reject overlay text.
@@ -97,6 +97,13 @@ an out-of-syntax value falls back cleanly instead of invalidating the whole decl
97
97
  without `CSS.registerProperty` degrades to "use `100%`, not `none`".) A menu contained by
98
98
  `<lr-dropdown>` sizes from its dropdown and is unaffected by both names.
99
99
 
100
+ **`--lr-positioning-strategy`** (16.0.0) — the private submenu surface reads this same cascading
101
+ `absolute`/`fixed` override documented on `<lr-popover>` when it is (re)positioned, falling back to
102
+ its own `fixed` default when nothing is set. There is no per-instance `positioning-strategy`
103
+ property on `<lr-menu>`; set the custom property on `:root`, a theme, or one clipping ancestor to
104
+ change every unset submenu beneath it. A menu contained by `<lr-dropdown>` is positioned by the
105
+ dropdown instead and is unaffected.
106
+
100
107
  **Methods:** no menu-specific public overlay methods. Use `<lr-dropdown>`'s `show()`/`hide()` and
101
108
  `open` state for an overlay. Menu-item submenu methods remain public because they drive a row's
102
109
  nested disclosure.
@@ -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** 3 parts, 7 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 3 parts, 8 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
  ---
@@ -56,6 +56,12 @@ The anchored detail popover is a floating surface and paints from the **shared o
56
56
  declared on `:host`, so one declaration on `:root` — or on any ancestor, to scope it — retints this
57
57
  surface together with every other floating surface in the library. `--lr-overlay-radius` (default `var(--lr-radius)`) is the matching corner radius.
58
58
 
59
+ `--lr-positioning-strategy` (16.0.0) — the preview popover reads this same cascading
60
+ `absolute`/`fixed` override documented on `<lr-popover>` when it is (re)positioned, falling back to
61
+ its own `fixed` default when nothing is set. There is no per-instance `positioning-strategy`
62
+ property on `<lr-entity-chip>`; set the custom property on `:root`, a theme, or one clipping
63
+ ancestor to change every unset entity chip beneath it.
64
+
59
65
  **Optional peer deps:** none.
60
66
 
61
67
  ```html
@@ -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** 6 parts, 4 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 6 parts, 5 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
  ---
@@ -104,6 +104,12 @@ The menu popup is a floating surface and paints from the **shared overlay-surfac
104
104
  declared on `:host`, so one declaration on `:root` — or on any ancestor, to scope it — retints this
105
105
  surface together with every other floating surface in the library. `--lr-overlay-radius` (default `var(--lr-radius)`) is the matching corner radius.
106
106
 
107
+ `--lr-positioning-strategy` (16.0.0) — the format menu reads this same cascading `absolute`/`fixed`
108
+ override documented on `<lr-popover>` when it is (re)positioned, falling back to its own `fixed`
109
+ default when nothing is set. There is no per-instance `positioning-strategy` property on
110
+ `<lr-export-button>`; set the custom property on `:root`, a theme, or one clipping ancestor to
111
+ change every unset export button beneath it.
112
+
107
113
  **Optional peer deps:** none.
108
114
 
109
115
  ```html
@@ -53,14 +53,23 @@ enabled buttons retain pointer feedback.
53
53
  update them by assigning a new collection.
54
54
  - `maxFileSize: number = 0` (attribute `max-file-size` — bytes; `0` disables the check)
55
55
  - `maxFiles: number = 0` (attribute `max-files`) — largest total file count accepted, counting
56
- retained files plus the current batch; `0` disables the check. An excess file in the batch is
57
- rejected with reason `'maxFiles'`, in the same `[part="rejection"]` shape as `maxFileSize`. While
58
- `nonRetaining` is set, the count covers only the current batch (there is no externally-held count
59
- to add).
56
+ retained files (unless `nonRetaining`) plus `heldFileCount` plus the current batch; `0` disables
57
+ the check. An excess file in the batch is rejected with reason `'maxFiles'`, in the same
58
+ `[part="rejection"]` shape as `maxFileSize`.
60
59
  - `maxTotalSize: number = 0` (attribute `max-total-size`) — largest combined byte size accepted,
61
- summing retained files plus the current batch; `0` disables the check. Same rejection-UI shape and
62
- fail-safe invalid-override behavior as `maxFileSize` (see gotchas). Same `nonRetaining` batch-only
63
- scoping as `maxFiles`.
60
+ summing retained files (unless `nonRetaining`) plus `heldTotalSize` plus the current batch; `0`
61
+ disables the check. Same rejection-UI shape and fail-safe invalid-override behavior as
62
+ `maxFileSize` (see gotchas).
63
+ - `heldFileCount: number = 0` (attribute `held-file-count`) — externally held file count added to
64
+ the running count `maxFiles` evaluates against, in both retaining and `nonRetaining` modes — the
65
+ numeric counterpart of `valuePresent`, for a cumulative cap (e.g. a server-backed upload limit)
66
+ that spans separate picker sessions rather than resetting to what this control alone can see. `0`
67
+ (the default) means "nothing held" and reproduces prior behavior exactly. A negative, `NaN`, or
68
+ `Infinity` override is normalized to `0` via `finiteCount` rather than corrupting every later
69
+ comparison or permanently blocking every future file.
70
+ - `heldTotalSize: number = 0` (attribute `held-total-size`) — externally held byte total added to
71
+ the running size `maxTotalSize` evaluates against, in both retaining and `nonRetaining` modes.
72
+ Same contract, default, and invalid-input normalization as `heldFileCount`.
64
73
  - `nonRetaining: boolean = false` (reflected, attribute `non-retaining`) — opt-in mode where an
65
74
  accepted selection still fires `lr-files`/`input`/`change` but is never written to `files` or
66
75
  rendered as a built-in `[part="file"]` row. For a host that persists files elsewhere and renders
@@ -139,9 +148,11 @@ enabled buttons retain pointer feedback.
139
148
  host `change`; programmatic `files` writes are silent (both still fire while `nonRetaining` is set,
140
149
  even though `files` itself is not written in that mode). `lr-files` (`detail:
141
150
  LyraFileInputFilesDetail`, with fresh frozen readonly `files` and `rejected` arrays and frozen
142
- rejected-file records, fired on both drop and manual file-picker selection; immutable `File` objects
143
- retain identity) typed as `LyraFileInputFilesEvent`, so `event.target`/`event.currentTarget` are
144
- `LyraFileInput` without a cast. `LyraFileInputRejectedFile = { readonly file: File; readonly reason:
151
+ rejected-file records, plus `remainingFiles`/`remainingTotalSize` reporting the allowance still left
152
+ under `maxFiles`/`maxTotalSize` after this batch (`null` while that limit is unset), fired on both
153
+ drop and manual file-picker selection; immutable `File` objects retain identity) typed as
154
+ `LyraFileInputFilesEvent`, so `event.target`/`event.currentTarget` are `LyraFileInput` without a
155
+ cast. `LyraFileInputRejectedFile = { readonly file: File; readonly reason:
145
156
  'type' | 'count' | 'size' | 'directory' | 'read' | 'limit' | 'maxFiles' | 'maxTotalSize' }`: `'type'`
146
157
  from `accept`/`allowedMimeTypes`/`forbiddenMimeTypes`, `'count'` when a single-file input
147
158
  (`multiple` unset) receives more than one file (in which case _all_ files are rejected, none