@aceshooting/lyra-ui 27.0.0 → 28.1.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 (397) hide show
  1. package/CHANGELOG.md +67 -63
  2. package/README.md +7 -3
  3. package/dist/cli/css-declarations.mjs +1 -0
  4. package/dist/cli/lyra-rename-ledger.mjs +1 -1
  5. package/dist/cli/migrate-wa.mjs +9 -4
  6. package/dist/cli/migration-contract.json +1 -1
  7. package/dist/cli/migration-renames.mjs +2 -2
  8. package/dist/cli/migration-theme-scopes.mjs +3 -0
  9. package/dist/cli/theme-scope-vocabulary.generated.mjs +1 -0
  10. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +1 -1
  11. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js +1 -1
  12. package/dist/components/agent-tools/agent-question/agent-question.class.js +1 -1
  13. package/dist/components/agent-tools/agent-run/agent-run.class.js +1 -1
  14. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +1 -1
  15. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -1
  16. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js +1 -1
  17. package/dist/components/agent-tools/background-runs/background-runs.class.js +1 -1
  18. package/dist/components/agent-tools/browser-frame/browser-frame.class.js +1 -1
  19. package/dist/components/agent-tools/budget-meter/budget-meter.class.js +1 -1
  20. package/dist/components/agent-tools/change-review/change-review.class.js +1 -1
  21. package/dist/components/agent-tools/commit-card/commit-card.class.js +1 -1
  22. package/dist/components/agent-tools/compare-panel/compare-panel.class.js +1 -1
  23. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +1 -1
  24. package/dist/components/agent-tools/connector-manager/connector-manager.class.js +1 -1
  25. package/dist/components/agent-tools/context-inspector/context-inspector.class.js +1 -1
  26. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +1 -1
  27. package/dist/components/agent-tools/eval-result/eval-result.class.js +1 -1
  28. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +1 -1
  29. package/dist/components/agent-tools/mcp-app/mcp-app.class.js +1 -1
  30. package/dist/components/agent-tools/permission-grant/permission-grant.class.js +1 -1
  31. package/dist/components/agent-tools/permission-rules/permission-rules.class.js +1 -1
  32. package/dist/components/agent-tools/policy-summary/policy-summary.class.js +1 -1
  33. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +1 -1
  34. package/dist/components/agent-tools/result-card/result-field.class.js +1 -1
  35. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +1 -1
  36. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +1 -1
  37. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +1 -1
  38. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +2 -2
  39. package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
  40. package/dist/components/agent-tools/terminal/terminal.class.js +1 -1
  41. package/dist/components/agent-tools/test-results/test-results.class.js +1 -1
  42. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js +1 -1
  43. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +1 -1
  44. package/dist/components/agent-tools/tool-call-block/tool-call-block.class.js +1 -1
  45. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +1 -1
  46. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +1 -1
  47. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +1 -1
  48. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js +1 -1
  49. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +1 -1
  50. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -1
  51. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +2 -2
  52. package/dist/components/charts/chart/box-plot.class.d.ts +4 -2
  53. package/dist/components/charts/chart/box-plot.class.js +6 -5
  54. package/dist/components/charts/chart/chart-token-cache.js +2 -2
  55. package/dist/components/charts/chart/chart.class.d.ts +6 -4
  56. package/dist/components/charts/chart/chart.class.js +8 -7
  57. package/dist/components/charts/chart/histogram.class.js +1 -1
  58. package/dist/components/charts/chart/lite-chart.class.js +1 -1
  59. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +1 -1
  60. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +1 -1
  61. package/dist/components/conversation/branch-picker/branch-picker.class.js +1 -1
  62. package/dist/components/conversation/chat-composer/chat-composer.class.js +1 -1
  63. package/dist/components/conversation/chat-message/chat-message.class.js +1 -1
  64. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  65. package/dist/components/conversation/checkpoint/checkpoint.class.js +1 -1
  66. package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
  67. package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
  68. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  69. package/dist/components/conversation/conversation-item/conversation-item.class.js +1 -1
  70. package/dist/components/conversation/generation-metrics/generation-metrics.class.js +1 -1
  71. package/dist/components/conversation/handoff-divider/handoff-divider.class.js +1 -1
  72. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  73. package/dist/components/conversation/markdown/markdown-core.class.js +1 -1
  74. package/dist/components/conversation/markdown/markdown.class.js +1 -1
  75. package/dist/components/conversation/message-actions/message-actions.class.js +1 -1
  76. package/dist/components/conversation/message-feedback/message-feedback.class.js +1 -1
  77. package/dist/components/conversation/message-parts/message-parts.class.js +1 -1
  78. package/dist/components/conversation/model-select/model-select.class.js +1 -1
  79. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +1 -1
  80. package/dist/components/conversation/prompt-input/prompt-input.class.js +1 -1
  81. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +1 -1
  82. package/dist/components/conversation/push-to-talk/push-to-talk.class.js +1 -1
  83. package/dist/components/conversation/realtime-session/realtime-session.class.js +1 -1
  84. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  85. package/dist/components/conversation/stream-status/stream-status.class.js +1 -1
  86. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.js +1 -1
  87. package/dist/components/conversation/thread-list/thread-list.class.js +1 -1
  88. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
  89. package/dist/components/conversation/typing-indicator/typing-indicator.class.js +1 -1
  90. package/dist/components/conversation/usage-badge/usage-badge.class.js +1 -1
  91. package/dist/components/conversation/voice-picker/voice-picker.class.js +1 -1
  92. package/dist/components/data/calendar/calendar.class.js +1 -1
  93. package/dist/components/data/condition-builder/condition-builder.class.js +1 -1
  94. package/dist/components/data/context-meter/context-meter.class.js +1 -1
  95. package/dist/components/data/data-grid/data-grid.class.d.ts +2 -2
  96. package/dist/components/data/data-grid/data-grid.class.js +3 -3
  97. package/dist/components/data/document-library/document-library.class.js +1 -1
  98. package/dist/components/data/env-list/env-list.class.js +1 -1
  99. package/dist/components/data/file-tree/file-tree.class.d.ts +2 -2
  100. package/dist/components/data/file-tree/file-tree.class.js +1 -1
  101. package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
  102. package/dist/components/data/flow-controls/flow-controls.class.js +1 -1
  103. package/dist/components/data/flow-minimap/flow-minimap.class.js +1 -1
  104. package/dist/components/data/flow-node/flow-node.class.js +1 -1
  105. package/dist/components/data/flow-run-status/flow-run-status.class.js +1 -1
  106. package/dist/components/data/funnel/funnel.class.js +1 -1
  107. package/dist/components/data/gauge/gauge.class.js +1 -1
  108. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
  109. package/dist/components/data/heatmap/heatmap.class.d.ts +2 -1
  110. package/dist/components/data/heatmap/heatmap.class.js +2 -2
  111. package/dist/components/data/heatmap/heatmap.styles.js +1 -1
  112. package/dist/components/data/pagination/pagination.class.d.ts +2 -0
  113. package/dist/components/data/pagination/pagination.class.js +1 -1
  114. package/dist/components/data/pagination/pagination.styles.js +1 -1
  115. package/dist/components/data/sequence-strip/sequence-strip.class.js +1 -1
  116. package/dist/components/data/sparkline/sparkline.class.js +1 -1
  117. package/dist/components/data/stat/stat.class.js +1 -1
  118. package/dist/components/data/table/table.class.d.ts +23 -2
  119. package/dist/components/data/table/table.class.js +5 -3
  120. package/dist/components/data/table/table.styles.js +1 -1
  121. package/dist/components/data/timeline/timeline.class.js +1 -1
  122. package/dist/components/data/tree/tree.class.js +1 -1
  123. package/dist/components/data/word-cloud/word-cloud.class.js +1 -1
  124. package/dist/components/forms/button/button.class.js +1 -1
  125. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  126. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  127. package/dist/components/forms/code-editor/code-editor.class.js +1 -1
  128. package/dist/components/forms/color-picker/color-picker.class.d.ts +8 -4
  129. package/dist/components/forms/color-picker/color-picker.class.js +2 -2
  130. package/dist/components/forms/combobox/combobox.class.js +1 -1
  131. package/dist/components/forms/country-picker/country-picker.class.js +1 -1
  132. package/dist/components/forms/currency-picker/currency-picker.class.js +1 -1
  133. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  134. package/dist/components/forms/date-picker/date-picker.class.js +1 -1
  135. package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
  136. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +7 -4
  137. package/dist/components/forms/emoji-picker/emoji-picker.class.js +5 -5
  138. package/dist/components/forms/icon-button/icon-button.class.d.ts +4 -0
  139. package/dist/components/forms/icon-button/icon-button.class.js +1 -1
  140. package/dist/components/forms/icon-button/icon-button.styles.js +1 -1
  141. package/dist/components/forms/input/input-shared.js +1 -1
  142. package/dist/components/forms/input/input.class.js +1 -1
  143. package/dist/components/forms/input/native-time-input.class.js +1 -1
  144. package/dist/components/forms/input/number-input.class.js +1 -1
  145. package/dist/components/forms/input/time-input.class.js +1 -1
  146. package/dist/components/forms/locale-picker/locale-picker.class.js +1 -1
  147. package/dist/components/forms/otp-input/otp-input.class.js +1 -1
  148. package/dist/components/forms/phone-input/phone-input.class.js +1 -1
  149. package/dist/components/forms/radio/radio-group.class.js +1 -1
  150. package/dist/components/forms/radio/radio.class.js +1 -1
  151. package/dist/components/forms/rubric-form/rubric-form.class.js +4 -4
  152. package/dist/components/forms/select/select.class.js +1 -1
  153. package/dist/components/forms/signature-pad/signature-pad.class.js +1 -1
  154. package/dist/components/forms/slider/slider.class.js +1 -1
  155. package/dist/components/forms/switch/switch.class.js +1 -1
  156. package/dist/components/forms/textarea/textarea.class.js +1 -1
  157. package/dist/components/forms/time-range/time-range.class.js +1 -1
  158. package/dist/components/forms/time-zone-picker/time-zone-picker.class.js +1 -1
  159. package/dist/components/forms/token-input/token-input.class.js +1 -1
  160. package/dist/components/forms/unit-picker/unit-picker.class.js +1 -1
  161. package/dist/components/layout/app-rail/app-rail-item.class.js +1 -1
  162. package/dist/components/layout/app-rail/app-rail.class.d.ts +70 -7
  163. package/dist/components/layout/app-rail/app-rail.class.js +16 -4
  164. package/dist/components/layout/app-rail/app-rail.styles.js +1 -1
  165. package/dist/components/layout/app-rail-group/app-rail-group.class.js +1 -1
  166. package/dist/components/layout/breadcrumb/breadcrumb.class.js +1 -1
  167. package/dist/components/layout/card/card.class.js +1 -1
  168. package/dist/components/layout/carousel/carousel.class.js +1 -1
  169. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  170. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
  171. package/dist/components/layout/details/accordion-item.class.js +1 -1
  172. package/dist/components/layout/details/details.class.js +1 -1
  173. package/dist/components/layout/dock-panel/dock-panel.class.js +1 -1
  174. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +1 -1
  175. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  176. package/dist/components/layout/menu/menu.class.js +1 -1
  177. package/dist/components/layout/menubar/menubar.class.js +1 -1
  178. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  179. package/dist/components/layout/navigation-menu/navigation-menu.class.js +1 -1
  180. package/dist/components/layout/page/page.class.js +1 -1
  181. package/dist/components/layout/reorder-list/reorder-item.class.js +1 -1
  182. package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
  183. package/dist/components/layout/responsive-panel/responsive-panel.class.js +1 -1
  184. package/dist/components/layout/scroller/scroller.class.js +1 -1
  185. package/dist/components/layout/segmented/segmented.class.d.ts +7 -4
  186. package/dist/components/layout/segmented/segmented.styles.js +1 -1
  187. package/dist/components/layout/split-panel/split-panel.class.js +1 -1
  188. package/dist/components/layout/tab-group/tab-group.class.js +1 -1
  189. package/dist/components/layout/tab-group/tab.class.js +1 -1
  190. package/dist/components/layout/virtual-list/virtual-list.styles.js +1 -1
  191. package/dist/components/layout/widget/widget.class.js +1 -1
  192. package/dist/components/media/animated-image/animated-image.class.js +1 -1
  193. package/dist/components/media/attachment-chip/attachment-chip.class.js +1 -1
  194. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +2 -2
  195. package/dist/components/media/av-player/av-player.class.js +1 -1
  196. package/dist/components/media/avatar-group/avatar-group.class.js +1 -1
  197. package/dist/components/media/drop-zone/drop-zone.class.js +1 -1
  198. package/dist/components/media/file-icon/file-icon.class.js +1 -1
  199. package/dist/components/media/file-input/file-input.class.js +1 -1
  200. package/dist/components/media/flag/flag.class.js +1 -1
  201. package/dist/components/media/image-comparer/image-comparer.class.js +1 -1
  202. package/dist/components/media/image-viewer/image-viewer.class.d.ts +2 -1
  203. package/dist/components/media/image-viewer/image-viewer.class.js +4 -2
  204. package/dist/components/media/image-viewer/image-viewer.styles.js +1 -1
  205. package/dist/components/media/lightbox/lightbox.class.js +1 -1
  206. package/dist/components/media/map/map.class.js +1 -1
  207. package/dist/components/media/media-card/media-card.class.js +1 -1
  208. package/dist/components/media/pan-zoom/pan-zoom.class.js +1 -1
  209. package/dist/components/media/qr-code/qr-code.class.d.ts +2 -2
  210. package/dist/components/media/qr-code/qr-code.class.js +1 -1
  211. package/dist/components/media/sequence-playback/sequence-playback.class.js +1 -1
  212. package/dist/components/media/video/video.class.js +1 -1
  213. package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
  214. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +1 -1
  215. package/dist/components/overlays/alert/alert.class.js +1 -1
  216. package/dist/components/overlays/badge/tag.class.js +1 -1
  217. package/dist/components/overlays/callout/callout.class.js +1 -1
  218. package/dist/components/overlays/chip/chip-group.class.js +1 -1
  219. package/dist/components/overlays/chip/chip.class.js +1 -1
  220. package/dist/components/overlays/context-menu/context-menu.class.js +1 -1
  221. package/dist/components/overlays/dialog/confirm.js +1 -1
  222. package/dist/components/overlays/dialog/dialog.class.js +1 -1
  223. package/dist/components/overlays/kbd/kbd.class.js +1 -1
  224. package/dist/components/overlays/overlay/popover.class.js +1 -1
  225. package/dist/components/overlays/overlay/tooltip.class.js +1 -1
  226. package/dist/components/overlays/progress/progress-bar.class.js +1 -1
  227. package/dist/components/overlays/progress/progress-ring.class.js +1 -1
  228. package/dist/components/overlays/rating/rating.class.js +1 -1
  229. package/dist/components/overlays/skeleton/skeleton.class.js +1 -1
  230. package/dist/components/overlays/spinner/spinner.class.js +1 -1
  231. package/dist/components/overlays/toast/toast-item.class.js +1 -1
  232. package/dist/components/overlays/toast/toast.class.js +1 -1
  233. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js +1 -1
  234. package/dist/components/retrieval/citation-badge/citation-badge.class.js +1 -1
  235. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +1 -1
  236. package/dist/components/retrieval/community-card/community-card.class.js +1 -1
  237. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +1 -1
  238. package/dist/components/retrieval/entity-card/entity-card.class.js +1 -1
  239. package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
  240. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js +1 -1
  241. package/dist/components/retrieval/graph/graph.class.js +1 -1
  242. package/dist/components/retrieval/graph-legend/graph-legend.class.js +1 -1
  243. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +2 -2
  244. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +1 -1
  245. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +1 -1
  246. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +1 -1
  247. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +1 -1
  248. package/dist/components/retrieval/memory-panel/memory-panel.class.js +1 -1
  249. package/dist/components/retrieval/mind-map/mind-map.class.js +1 -1
  250. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +1 -1
  251. package/dist/components/retrieval/node-palette/node-palette.class.js +1 -1
  252. package/dist/components/retrieval/path-strip/path-strip.class.js +1 -1
  253. package/dist/components/retrieval/provenance-panel/provenance-panel.class.js +1 -1
  254. package/dist/components/retrieval/rag-answer/rag-answer.class.js +1 -1
  255. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +1 -1
  256. package/dist/components/retrieval/research-progress/research-progress.class.js +1 -1
  257. package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +1 -1
  258. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +1 -1
  259. package/dist/components/retrieval/retrieval-search/retrieval-search.class.js +1 -1
  260. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  261. package/dist/components/retrieval/source-card/source-card.class.js +1 -1
  262. package/dist/components/retrieval/source-list/source-list.class.js +1 -1
  263. package/dist/components/retrieval/source-picker/source-picker.class.js +1 -1
  264. package/dist/components/utility/copy-button/copy-button.class.js +1 -1
  265. package/dist/components/utility/diff-view/diff-view.class.js +1 -1
  266. package/dist/components/utility/export-button/export-button.class.js +1 -1
  267. package/dist/components/utility/icon/icon.class.js +1 -1
  268. package/dist/components/utility/json-viewer/json-viewer.class.js +1 -1
  269. package/dist/components/utility/known-date/known-date.class.js +1 -1
  270. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  271. package/dist/components/utility/poll-status/poll-status.class.js +1 -1
  272. package/dist/components/utility/random-content/random-content.class.js +1 -1
  273. package/dist/components/utility/tour/tour.class.js +1 -1
  274. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +1 -1
  275. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +1 -1
  276. package/dist/components/viewers/contact-viewer/contact-viewer.class.js +1 -1
  277. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +1 -1
  278. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +2 -2
  279. package/dist/components/viewers/document-compare/document-compare.class.js +1 -1
  280. package/dist/components/viewers/document-preview/document-preview.class.js +1 -1
  281. package/dist/components/viewers/document-viewer/document-viewer.class.js +1 -1
  282. package/dist/components/viewers/docx-viewer/docx-viewer.class.js +1 -1
  283. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  284. package/dist/components/viewers/email-viewer/email-viewer.class.js +1 -1
  285. package/dist/components/viewers/geojson-view/geojson-view.class.js +1 -1
  286. package/dist/components/viewers/geojson-view/geojson-viewer.class.js +1 -1
  287. package/dist/components/viewers/highlight-layer/highlight-layer.class.js +1 -1
  288. package/dist/components/viewers/html-viewer/html-viewer.class.js +1 -1
  289. package/dist/components/viewers/include/include.class.js +1 -1
  290. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
  291. package/dist/components/viewers/page-rail/page-rail.class.d.ts +1 -1
  292. package/dist/components/viewers/page-rail/page-rail.class.js +3 -3
  293. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +2 -2
  294. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +2 -2
  295. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +1 -1
  296. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +1 -1
  297. package/dist/components/viewers/svg-viewer/svg-viewer.class.js +1 -1
  298. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +1 -1
  299. package/dist/events.d.ts +6 -1
  300. package/dist/framework-types.d.ts +1 -1
  301. package/dist/internal/accessibility-visibility.js +1 -1
  302. package/dist/internal/collection-snapshot.js +1 -1
  303. package/dist/internal/default-strings/agent-tools.generated.js +1 -0
  304. package/dist/internal/default-strings/charts.generated.js +1 -0
  305. package/dist/internal/default-strings/conversation.generated.js +1 -0
  306. package/dist/internal/default-strings/data.generated.js +1 -0
  307. package/dist/internal/default-strings/forms.generated.js +1 -0
  308. package/dist/internal/default-strings/layout.generated.js +1 -0
  309. package/dist/internal/default-strings/media.generated.js +1 -0
  310. package/dist/internal/default-strings/overlays.generated.js +1 -0
  311. package/dist/internal/default-strings/retrieval.generated.js +1 -0
  312. package/dist/internal/default-strings/shared.generated.js +1 -0
  313. package/dist/internal/default-strings/utility.generated.js +1 -0
  314. package/dist/internal/default-strings/viewers.generated.js +5 -0
  315. package/dist/internal/dev-mode-attribute-warning.development.js +1 -1
  316. package/dist/internal/dev-mode-attribute-warning.production.js +1 -1
  317. package/dist/internal/document-tokens.d.ts +11 -0
  318. package/dist/internal/document-tokens.generated.js +15 -0
  319. package/dist/internal/document-tokens.js +3 -0
  320. package/dist/internal/form-associated.d.ts +1 -1
  321. package/dist/internal/form-associated.js +1 -1
  322. package/dist/internal/glass-surface.styles.js +1 -1
  323. package/dist/internal/host-tokens.styles.js +1 -0
  324. package/dist/internal/image-zoom.js +1 -0
  325. package/dist/internal/intl-cache.js +1 -1
  326. package/dist/internal/localization-types.d.ts +1 -1
  327. package/dist/internal/localization.js +2 -2
  328. package/dist/internal/lyra-element.d.ts +4 -2
  329. package/dist/internal/lyra-element.js +2 -2
  330. package/dist/internal/nonmodal-overlay-manager.js +1 -1
  331. package/dist/internal/opaque-content-border.styles.js +1 -1
  332. package/dist/internal/open-overlay-ancestors.js +1 -0
  333. package/dist/internal/open-overlay-raise.styles.js +1 -0
  334. package/dist/internal/optional-peer-failure.js +1 -0
  335. package/dist/internal/package-metadata.js +1 -1
  336. package/dist/internal/prefix.js +1 -1
  337. package/dist/internal/specialist-host-tokens.styles.js +1 -0
  338. package/dist/internal/specialist-tokens.generated.js +2 -0
  339. package/dist/internal/step-value.js +1 -1
  340. package/dist/internal/theme-observation.js +1 -1
  341. package/dist/internal/theme-scopes.d.ts +11 -0
  342. package/dist/internal/theme-scopes.js +1 -0
  343. package/dist/looks/shadcn.css +1 -1
  344. package/dist/lyra.d.ts +1 -1
  345. package/dist/lyra.js +1 -1
  346. package/dist/styles/design-tokens.css +1 -1
  347. package/dist/styles/tokens-root.css +1 -1
  348. package/dist/surfaces/glass.css +1 -1
  349. package/dist/testing/happy-dom-shims.d.ts +22 -1
  350. package/dist/testing/happy-dom-shims.js +1 -1
  351. package/dist/testing/index.d.ts +1 -1
  352. package/dist/testing/index.js +1 -1
  353. package/dist/testing/interaction-drivers.d.ts +66 -7
  354. package/dist/testing/interaction-drivers.js +1 -1
  355. package/dist/testing/jsdom-shims.d.ts +70 -0
  356. package/dist/testing/jsdom-shims.js +1 -0
  357. package/dist/theme/look-inputs.d.ts +1 -1
  358. package/dist/theme/look-inputs.js +37 -41
  359. package/dist/theme/theme.d.ts +13 -0
  360. package/dist/theme/theme.js +1 -1
  361. package/dist/theme.css +1 -1
  362. package/dist/utilities/index.d.ts +1 -1
  363. package/dist/utilities/index.js +1 -1
  364. package/dist/utilities/scoped-registry.d.ts +3 -0
  365. package/dist/utilities/scoped-registry.js +1 -1
  366. package/dist/utilities/theme-scopes.d.ts +1 -0
  367. package/dist/utilities/theme-scopes.js +1 -0
  368. package/dist/utilities/tokens.d.ts +1 -0
  369. package/dist/utilities/tokens.js +1 -0
  370. package/llms/components/lr-app-rail.md +51 -4
  371. package/llms/components/lr-box-plot.md +5 -0
  372. package/llms/components/lr-chart.md +6 -0
  373. package/llms/components/lr-emoji-picker.md +13 -8
  374. package/llms/components/lr-heatmap.md +10 -2
  375. package/llms/components/lr-icon-button.md +13 -1
  376. package/llms/components/lr-image-viewer.md +8 -0
  377. package/llms/components/lr-pagination.md +4 -2
  378. package/llms/components/lr-segmented.md +7 -3
  379. package/llms/components/lr-table.md +14 -12
  380. package/llms/components/lr-thread-list.md +4 -3
  381. package/llms/migration.md +9 -0
  382. package/llms/peers.md +1 -1
  383. package/llms/shared/events-and-types.md +41 -0
  384. package/llms/shared/frameworks-and-ssr.md +16 -0
  385. package/llms/shared/imports-and-registration.md +4 -3
  386. package/llms/shared/native-styles-and-utilities.md +38 -3
  387. package/llms/shared/styles-and-tokens.md +242 -102
  388. package/llms/shared/testing-and-utilities.md +104 -7
  389. package/llms/shared.md +445 -115
  390. package/llms/tokens.md +31 -49
  391. package/locales.json +138 -138
  392. package/package.json +16 -8
  393. package/registrations.json +1 -1
  394. package/dist/internal/default-strings.generated.js +0 -5
  395. package/dist/internal/specialist-tokens.styles.js +0 -1
  396. package/dist/internal/tokens/palette.styles.js +0 -1
  397. package/dist/internal/tokens.styles.js +0 -1
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 11 parts, 33 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 13 parts, 37 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Documented with** `lr-app-rail-item`, `lr-app-rail-group` (same section below)
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
15
15
 
@@ -113,6 +113,31 @@ letting a consumer that syncs app chrome to the rail's mode pick up the restored
113
113
  a reload only when `storage-key` is set AND `persist` includes `preferred-mode` — the default
114
114
  `persist` is `open width`, which does not. Pair them: `persist="width preferred-mode"`. Either
115
115
  route announces itself through the existing `lr-mode-change` event; there is no new event.
116
+ - `autoHide: boolean = false` (reflected, attribute `auto-hide`) — opts the desktop rail into an
117
+ auto-hide ("peek") mode. The rail rests as the `'icon-only'` strip (an unset `preferredMode` reads
118
+ as `'icon-only'` instead of following `icon-only-breakpoint`; `preferredMode` and `forceMode` keep
119
+ their meaning). While a non-touch pointer moves inside the strip, or keyboard focus enters it, the
120
+ rail expands to full width as an overlay: the strip's inline footprint stays in the layout, so the
121
+ content beside it never reflows, and the expansion grows toward the inline end and mirrors under
122
+ RTL. It collapses back once the pointer has left and keyboard focus is no longer inside, after
123
+ `peekCloseDelay`; Escape closes it at once and it stays closed until the pointer and focus have
124
+ both left. Touch pointers and boundary events fired with no movement (a cursor resting where the
125
+ page loaded) never open it, and pointer-originated focus (a click) does not hold it open. The rail
126
+ docks at full width only while pinned: the built-in `[part="pin-button"]` writes
127
+ `preferredMode`, so it persists through `storage-key` with `persist` including `preferred-mode`
128
+ (the default `persist` does not, so set `persist="preferred-mode"`). The mobile presentation is
129
+ unchanged, `[part="collapse-toggle"]` is not rendered while this is set (the pin replaces it),
130
+ `mode` stays `'icon-only'` while peeking, and the resizer is hidden until pinned. Unset reproduces
131
+ today's exact behavior.
132
+ - `peekOpenDelay: number = 150` (attribute `peek-open-delay`) — milliseconds a moving pointer must
133
+ stay inside the strip before it peeks open; keyboard focus opens it at once. Non-finite values use
134
+ the default and negative values clamp to `0`.
135
+ - `peekCloseDelay: number = 300` (attribute `peek-close-delay`) — milliseconds the peek stays open
136
+ after the pointer left and keyboard focus is no longer inside. Non-finite values use the default
137
+ and negative values clamp to `0`.
138
+ - `peeking: boolean` (read-only getter, reflected `peeking` attribute) — whether the `auto-hide`
139
+ rail is currently expanded as a temporary overlay. Always `false` while `auto-hide` is unset or the
140
+ rail is pinned (`'full'`) or `'mobile'`. Disconnecting resets it silently.
116
141
  - `withoutToggle: boolean = false` (reflected, attribute `without-toggle`) — suppresses the built-in mobile
117
142
  `[part='toggle']` hamburger/OPEN button, for a consumer that already owns an external mobile-menu
118
143
  trigger wired to this rail's own `open` property (pair it with `trigger`/`for` below so focus
@@ -229,7 +254,9 @@ built-in control does, for a consumer rendering its own control (app chrome, a c
229
254
  keyboard shortcut). A no-op while `mode` is `'mobile'`. While `forceMode` pins the mode the
230
255
  preference alternates relative to `preferredMode ?? mode` on every call and takes effect once the pin is released.
231
256
 
232
- **Events:** `lr-mode-change` (`detail: LyraAppRailModeChangeDetail` = `{ mode: LyraAppRailMode }`; the
257
+ **Events:** `lr-peek-change` (`detail: LyraAppRailPeekChangeDetail` = `{ peeking: boolean }`; the
258
+ `auto-hide` rail started or stopped peeking; non-cancelable, and not fired for the silent reset a
259
+ disconnect performs), `lr-mode-change` (`detail: LyraAppRailModeChangeDetail` = `{ mode: LyraAppRailMode }`; the
233
260
  effective mode changed, whether from a breakpoint crossing, a `forceMode` assignment, or a
234
261
  persisted `preferred-mode` restored on mount (`storage-key` + `persist="preferred-mode"`) — the
235
262
  restored-on-mount case fires once, from the first `updated()` after that mount's render and
@@ -272,7 +299,10 @@ underlying element — see above), `resizer` (the `resizable` opt-in's drag hand
272
299
  `aria-controls` at `[part="nav"]` — the item list whose presentation actually changes, never the
273
300
  containing `[part="base"]`/`[part="panel"]` — and takes a localized name from the
274
301
  `appRailCollapse`/`appRailExpand` keys) and `collapse-icon` (the chevron wrapper, mirrored by its own
275
- `transform` under RTL). Collapsing to `'icon-only'` keeps each item's own accessible name and
302
+ `transform` under RTL), `pin-button` (the `auto-hide` pin control, rendered inside `[part="header"]`
303
+ while the rail is peeking or pinned, never in the resting strip; `aria-pressed` renders `"true"`
304
+ while pinned and `"false"` otherwise, the name comes from the `appRailPin`/`appRailUnpin` keys, and it
305
+ takes the `--lr-icon-button-size` hit area) and `pin-icon` (its glyph wrapper). Collapsing to `'icon-only'` keeps each item's own accessible name and
276
306
  clips its `label`/`meta` visually, while hiding nested disclosure controls and child lists — so `aria-expanded` reports which of the two
277
307
  presentations is on screen, for magnifier and braille users, rather than announcing hidden content.
278
308
 
@@ -287,6 +317,13 @@ panel; no value can paint elevation while closed. Prefer that token over an unqu
287
317
  `::part(panel)` shadow rule, which would also paint while closed; state-scope a part override with
288
318
  `lr-app-rail[mode="mobile"][open]::part(panel)`.
289
319
 
320
+ `--lr-app-rail-peek-shadow` (default `var(--lr-shadow-l)`) and `--lr-app-rail-peek-bg` (default
321
+ `var(--lr-color-surface-overlay)`) restyle the `auto-hide` rail while it overlays the content; the
322
+ overlay sits on the `--lr-layer-dropdown` layer token, below modals and popovers.
323
+ `--lr-app-rail-pin-hover-bg` (default `var(--lr-color-brand-quiet)`) and
324
+ `--lr-app-rail-pin-hover-color` (default `var(--lr-color-brand)`) tint the pin control on hover.
325
+ Motion uses the shared transition tokens and stops under `prefers-reduced-motion`.
326
+
290
327
  Other hooks: `--lr-app-rail-width` (default `15rem` — the inline rail width in
291
328
  `'full'` mode), `--lr-app-rail-icon-width` (default `4rem` — the inline rail width in `'icon-only'`
292
329
  mode), `--lr-app-rail-mobile-width` (default `18rem`, capped at `85vw` — the mobile overlay panel
@@ -373,6 +410,16 @@ fallback at its exact state rule and preserves the previous brand or active-mix
373
410
  </script>
374
411
  ```
375
412
 
413
+ An auto-hide sidebar that peeks open over the content and docks only when pinned, remembering the pin:
414
+
415
+ ```html
416
+ <lr-app-rail auto-hide label="Workspace" storage-key="app" persist="preferred-mode">
417
+ <lr-app-rail-item href="/inbox" current>
418
+ <svg slot="icon" aria-hidden="true">...</svg>Inbox
419
+ </lr-app-rail-item>
420
+ </lr-app-rail>
421
+ ```
422
+
376
423
  ```ts
377
424
  rail.forceMode = "icon-only"; // force a presentation regardless of viewport width
378
425
  rail.forceMode = "auto"; // release the force, resume live breakpoint tracking
@@ -381,7 +428,7 @@ rail.forceMode = "auto"; // release the force, resume live breakpoint tracking
381
428
  The package root also exports a pure `computeAppRailMode(iconOnlyMatches: boolean, mobileMatches:
382
429
  boolean, preferredMode?: 'full' | 'icon-only' | null): LyraAppRailMode` resolver (plus the
383
430
  `LyraAppRailMode`/`LyraAppRailModeInput`/`LyraAppRailPreferredMode`/`LyraAppRailPersistField`/
384
- `LyraAppRailModeChangeDetail`/`LyraAppRailToggleDetail`/`LyraAppRailResizeDetail` types) — the same
431
+ `LyraAppRailModeChangeDetail`/`LyraAppRailToggleDetail`/`LyraAppRailResizeDetail`/`LyraAppRailPeekChangeDetail` types) — the same
385
432
  logic the element's internal `matchMedia` listeners call, exposed standalone so a
386
433
  consumer can compute or unit-test the same resolution without a real browser window. `mobileMatches`
387
434
  wins over everything else when true (the viewport is narrower than both breakpoints at once);
@@ -19,6 +19,11 @@
19
19
  Box-and-whisker chart from a precomputed five-number summary (no raw sample data sent to the
20
20
  browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
21
21
 
22
+ If the browser cannot acquire a 2D canvas context, a localized visible message replaces the plot
23
+ and the generated or slotted data table becomes visible. No failed Chart.js instance is retained.
24
+ Changing the data or calling `refreshTheme()` retries rendering, so the plot recovers when the
25
+ canvas capability becomes available.
26
+
22
27
  With `IntersectionObserver` available, canvas construction waits for its first delivered visibility
23
28
  decision. An off-screen box plot stays unconstructed until visible. Without the observer, drawing
24
29
  starts when the peers and canvas are ready; an empty delivered callback retains the visible
@@ -25,6 +25,12 @@ For horizontal scalar bars, tooltip values come from parsed x rather than the ca
25
25
  an effective raw `config.options.indexAxis` override. Both formatter APIs follow this rule;
26
26
  structured points retain their y-value formatting.
27
27
 
28
+
29
+ If the browser cannot acquire a 2D canvas context, a localized visible message replaces the plot
30
+ and the generated or slotted data table becomes visible. No failed Chart.js instance is retained.
31
+ Changing the data or calling `refreshTheme()` retries rendering, so the plot recovers when the
32
+ canvas capability becomes available.
33
+
28
34
  **Properties:**
29
35
  - `axes: LyraChartAxes = 'both'` — `'x' | 'y' | 'both' | 'none'`, controlling complete cartesian
30
36
  axes: labels, ticks, borders and grid lines. The `y` setting includes `y2`; invalid values use
@@ -178,15 +178,20 @@ one declaration to retheme every internal scroll container in the library.
178
178
 
179
179
  **Optional peer dependency:** install `emoji-picker-element-data` with
180
180
  `pnpm add emoji-picker-element-data` for the built-in auto-loaded default emoji set — omit it and
181
- supply `groups` directly instead. The loader never throws; a missing or failed peer logs one
182
- `console.warn` and leaves `groups` empty, and the picker then **fails closed and visibly**: the
183
- grid renders a distinct localized `[part="load-error"]` surface instead of the ordinary
184
- `[part="empty"]` message, so a skipped install is distinguishable at a glance from a genuine
185
- zero-match search or a deliberate `groups = []` opt-out, announces the same message once
181
+ supply `groups` directly instead. The loader never throws; it leaves `groups` empty and logs one
182
+ `console.warn` that names the cause: the peer **is not installed** (its module cannot be resolved)
183
+ or it **was found but could not be loaded or validated** (a network or JSON/import-attribute error,
184
+ an incompatible version, or a module without the expected data array). The picker then **fails
185
+ closed and visibly**: the grid renders a distinct localized `[part="load-error"]` surface instead
186
+ of the ordinary `[part="empty"]` message — `emojiPickerPeerMissing` ("Emoji are not available.")
187
+ for a missing peer, `emojiPickerLoadError` ("Could not load emoji.") with the `load-retry` button
188
+ for a failed one — so a skipped install is distinguishable at a glance from a broken one, a
189
+ genuine zero-match search or a deliberate `groups = []` opt-out. It announces the same message once
186
190
  through the document's shared assertive live region (not a shadow-root `role="alert"`, which
187
- announces unreliably) and emits `lr-load-error` (no detail). The failed load is not cached: the
188
- `load-retry` button (or a later locale change) loads again, and a successful retry clears the
189
- failure. Assigning `groups` also clears it. The adapter buckets the peer's flat
191
+ announces unreliably) and emits `lr-load-error` (no detail) in both cases. A failed load is not
192
+ cached: the `load-retry` button (or a later locale change) loads again, and a successful retry
193
+ clears the failure. No Retry button is offered for a missing peer, since retrying cannot install
194
+ it. Assigning `groups` also clears it. The adapter buckets the peer's flat
190
195
  entry list by numeric group id and returns only the public `{ key, label, emojis }` shape. The picker
191
196
  privately maps auto-loaded group ids 0–9 to the existing `emojiPickerGroup*` locale strings; override
192
197
  those through `registerLyraLocale()` or `.strings`. An unknown future group id uses `Group {id}`.
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 18 parts, 12 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 18 parts, 13 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
  ---
@@ -30,7 +30,10 @@ movements remain separate announcements, and `[part="live-region"]` is only an `
30
30
  Both modes deliberately retain physical LTR grid geometry under `dir="rtl"`: matrix column 0 and
31
31
  calendar week 0 remain at the physical left, so ArrowLeft and ArrowRight retain their physical
32
32
  previous/next movement instead of swapping for RTL.
33
- Full canvas redraws pause while the host is outside the viewport. Data, locale, theme, resize, and
33
+ Full canvas redraws pause while the host is outside the viewport. A deferred `fitToWidth` frame
34
+ stays within a smaller allocation when the current grid fits it; explicit cell floors, accessible
35
+ hit targets and custom column extents still retain intentional overflow. The next visible draw
36
+ restores the bitmap and cell geometry together. Data, locale, theme, resize, and
34
37
  DPR invalidations remain pending and coalesce into one redraw when the heatmap intersects again;
35
38
  environments without `IntersectionObserver` retain eager drawing. A theme signal (any ancestor
36
39
  `style`/`class` write) repaints only when a theme token the canvas reads changed, or while `cellColor`
@@ -464,6 +467,11 @@ resolve-via-`getComputedStyle` pattern), `--lr-heatmap-label-font` (default
464
467
  `--lr-heatmap-focus-ring-color` (default
465
468
  `var(--lr-focus-ring-color)` — the canvas-drawn ring stroked around the keyboard-focused cell;
466
469
  also reused by `[part="canvas"]`'s own `:focus-visible` outline so the two stay visually in sync),
470
+ `--lr-heatmap-hover-ring-color` (defaults to the effective `--lr-heatmap-focus-ring-color`) —
471
+ the pointer-hover outline on the canvas and accessible cells. Set it to `transparent` to omit
472
+ that outline while retaining keyboard-focus and pressed feedback. Leaving it unset preserves
473
+ existing hover styling; native forced-color adjustment remains enabled.
474
+
467
475
  `--lr-heatmap-color-steps-gradient` (default
468
476
  `linear-gradient(to right, var(--lr-heatmap-scale-lo), var(--lr-heatmap-scale-hi))` — the gradient
469
477
  painted on the continuous legend bar; the component writes it onto the host itself while
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `dompurify` — see `llms/peers.md`
12
- - **Themeable via** 3 parts, 11 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 3 parts, 12 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
  ---
@@ -166,6 +166,18 @@ it inherits normally from an ancestor even through an intervening component; it
166
166
  counterpart to it. The internal control sets `font: inherit`, so an `em`-sized slotted glyph takes
167
167
  the surrounding text's font-size rather than the native button's UA default.
168
168
 
169
+ `--lr-icon-button-padding-inline` (default `0`) is the logical inline padding of the
170
+ `[part='button']` control, for a compact trigger that shows a short text value (a currency, unit or
171
+ locale code) instead of a square glyph. It inherits from an ancestor like the radius. The default
172
+ keeps an icon-only button at exactly its `--lr-icon-button-size` floor; padding adds to the
173
+ content, so a label grows the button and the hit-area floor still applies. Block padding stays 0.
174
+
175
+ ```html
176
+ <lr-icon-button aria-label="Currency: euro" style="--lr-icon-button-padding-inline: var(--lr-space-s)">
177
+ <span>€ EUR</span>
178
+ </lr-icon-button>
179
+ ```
180
+
169
181
  The rest come in resting/hover/pressed triples, each falling through to the next-quieter state so
170
182
  setting only one still behaves:
171
183
 
@@ -30,6 +30,14 @@ apply when that wrapper itself owns keyboard input. Enter on a highlight button
30
30
  highlight without starting or committing an annotation, whether or not a draft exists; wrapper arrow
31
31
  commands retain physical image-coordinate semantics in both directions.
32
32
 
33
+ A region highlight paints exactly the percentage rectangle it names, at every fit, zoom and
34
+ rotation: its box never takes the shared `--lr-icon-button-size` minimum, so a small region cannot
35
+ grow past its data or overlap a neighbour. The accessible pointer target is a separate transparent
36
+ `::after` of the `[part="highlight"]` button, centred on the box and grown to
37
+ `--lr-icon-button-size` on any axis where the box is smaller. Overlap rule: a region's own painted
38
+ box always wins over another region's enlarged area, and where only enlarged areas overlap the
39
+ later highlight in document order wins. Keyboard navigation between highlights is unaffected.
40
+
33
41
  **Properties:** `src: string = ''`, `name: string = ''`, `alt?: string`,
34
42
  `fit: LyraImageFit = 'contain' | 'width' | 'actual'` (reflected; invalid writes normalize to
35
43
  `contain`), `zoom: number = 1` (reflected), `minZoom: number = 0.5` (attribute
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 22 parts, 22 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 22 parts, 23 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
  ---
@@ -203,7 +203,9 @@ buttons, the numbered pages and the page input — `--lr-pagination-control-padd
203
203
  `--lr-pagination-control-size`, so this only adjusts the icon/digit inset. Layout spacing is split
204
204
  across `--lr-pagination-base-gap` (default `var(--lr-space-m)`) between summary and controls,
205
205
  `--lr-pagination-controls-gap` (default `var(--lr-space-xs)`) inside the navigation group, and
206
- `--lr-pagination-pages-gap` (default `var(--lr-space-xs)`) between numbered pages; each remains
206
+ `--lr-pagination-pages-gap` (default `var(--lr-space-xs)`) between numbered pages, and
207
+ `--lr-pagination-page-field-gap` (default `var(--lr-space-2xs)`) between the compact
208
+ `[part="page-input"]` and its `[part="page-count"]`; each remains
207
209
  active in standard, compact, and 320px container layouts —
208
210
  `--lr-pagination-invalid-border` (default `var(--lr-color-danger)`) — border color of
209
211
  `[part="page-input"]` while the typed page is out of range (`aria-invalid="true"`); a state hook
@@ -101,11 +101,15 @@ The floor at the two compact tiers is the ladder's own (20px at `2xs`, 24px at `
101
101
  `2xs`/`xs` _segment_ separately carries a 24×24px minimum box, so the tappable target holds even
102
102
  when a label is a single character and the track ends up taller than its nominal floor.
103
103
 
104
- `--lr-segmented-selected-bg` (default `var(--lr-color-surface)`), `--lr-segmented-selected-color`
105
- (default `var(--lr-color-text)`), `--lr-segmented-selected-font-weight` (default
104
+ `--lr-segmented-selected-bg` (default `var(--lr-color-text)`), `--lr-segmented-selected-color`
105
+ (default `var(--lr-color-surface)`), `--lr-segmented-selected-font-weight` (default
106
106
  `var(--lr-font-weight-semibold)`) and `--lr-segmented-selected-shadow` (default
107
107
  `var(--lr-shadow-xs)` — the shallowest step in the elevation scale, since the checked segment is a
108
- thumb lifted a hair off its own track) style the checked segment's pill;
108
+ thumb lifted a hair off its own track) style the checked segment's pill. The default pill is the
109
+ inverse of the surface (text-coloured fill, surface-coloured label), so the checked state stays at
110
+ least 3:1 against a card or dialog in every look and mode; when you override
111
+ `--lr-segmented-selected-bg`, also set `--lr-segmented-selected-color` to a label that contrasts with
112
+ your fill;
109
113
  `--lr-segmented-hover-color` (default `var(--lr-color-text)`) styles a hovered segment that is
110
114
  neither checked nor disabled, independently of the four above — so recoloring the checked pill never
111
115
  bleeds onto hover. `--lr-segmented-hover-bg` (default `transparent`) and `--lr-segmented-hover-shadow`
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 47 parts, 27 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 56 parts, 27 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
  ---
@@ -78,7 +78,7 @@ cell: (row) => unknown }` — `cell` is required for every `editTrigger` except
78
78
  `scroll-mode="auto"`, adapts to actual overflow rather than a fixed token threshold, and can be
79
79
  reversed with `[part='reveal-columns-button']`; `sticky` pins headers/cells to the logical start
80
80
  or end while scrolling. Sticky columns stack in logical order using
81
- `--lr-table-sticky-offset` rather than overlap. A sticky body cell's
81
+ `--lr-table-sticky-offset` rather than overlap. Open overlays in a sticky cell stay on top. A sticky body cell's
82
82
  background always matches its own row's effective fill — striped, selected, hovered, or pressed —
83
83
  rather than painting a flat opaque surface over that state; a sticky header cell is unaffected
84
84
  (headers are never striped/selected) and keeps its plain surface fill, see
@@ -275,15 +275,15 @@ cell: (row) => unknown }` — `cell` is required for every `editTrigger` except
275
275
  - `paginationMode: 'client'|'server' = 'client'` (attribute `pagination-mode`, reflected) — client
276
276
  mode slices rows and updates `page`; server mode leaves `page` controlled and bounds the supplied
277
277
  page to `pageSize`
278
- - `unknownTotal: boolean = false` (attribute `unknown-total`, reflected) — server pagination for a
279
- caller with no total item count, only whether one more page exists (`hasNext`). Forwarded to the
280
- nested `<lr-pagination>` as its own indeterminate mode (`total="-1"`): previous/next only, no
281
- numbered page list, no item-range summary. Ignored outside `paginationMode: 'server'` — client
282
- mode always knows the exact row count it slices. A dedicated boolean rather than reusing
283
- `totalItems`'s own `-1` sentinel, which already means "derive from the currently matching rows"
284
- - `hasNext: boolean = true` (attribute `has-next`, reflected) — whether at least one more page
285
- exists past the current one; consulted only alongside `unknownTotal` and forwarded verbatim to
286
- the nested `<lr-pagination>`'s own `hasNext`
278
+ - `unknownTotal: boolean = false` (attribute `unknown-total`, reflected) — server pagination with
279
+ no total, only `hasNext`: the pager's indeterminate mode (previous/next only). Ignored outside
280
+ `paginationMode: 'server'`
281
+ - `hasNext: boolean = true` (attribute `has-next`, reflected) — whether another page exists;
282
+ read only with `unknownTotal`
283
+ - `paginationWithSummary: boolean = false` (attribute `pagination-with-summary`, reflected) —
284
+ pager item-range summary at the inline start, controls at the inline end
285
+ - `paginationFormat: 'standard'|'compact' = 'compact'` (attribute `pagination-format`) — pager
286
+ `format`; invalid values resolve to `compact`
287
287
  - Editable columns emit `lr-cell-edit` on commit and never mutate the supplied row object.
288
288
  - `groupBy?: (row: T) => string | number` (attribute: false) — inserts a non-focusable full-width
289
289
  group row wherever this key changes between consecutive rendered rows. Supply `rows` with each
@@ -519,7 +519,9 @@ affordance; the part has no live-region role in either appearance),
519
519
  and cells reuse the ordinary `row`/`cell`/`row-total-cell` parts, which is exactly what keeps them
520
520
  geometrically identical to real rows, so `skeleton` is the part to target for the placeholder's own
521
521
  look: `::part(skeleton) { --lr-skeleton-h: 2em; }`), and
522
- `pagination`, `cell-editor`, `group-row`, `group-cell`, and `resize-handle` (the focusable column
522
+ `pagination` (the pager host; re-exported as `pagination-summary`,
523
+ `pagination-controls`, `pagination-pages`, `pagination-page`, `pagination-page-current`,
524
+ `pagination-page-field`, `pagination-page-input`, `pagination-page-count`, `pagination-button`), `cell-editor`, `group-row`, `group-cell`, and `resize-handle` (the focusable column
523
525
  separator, with a finite explicit ARIA maximum even when no CSS `maxWidth` was supplied). The built-in empty state is addressable rather than fixed: `empty` is the `<lr-empty>`
524
526
  host in all three empty states, and it re-exports that element's own inner parts as `empty-base`,
525
527
  `empty-icon`, `empty-heading`, `empty-description` and `empty-actions`. Note that the no-columns and
@@ -290,9 +290,10 @@ lr-thread-list::part(row-item-label) {
290
290
  }
291
291
  ```
292
292
 
293
- Do **not** reach for `::part(row) { --lr-theme-space-s: … }` instead. That is a whole-subtree
294
- retheme: it shrinks everything nested inside the row, including the items of a `renderActions` menu,
295
- which pushes their touch targets below the accessible minimum. The `row-item-*` parts exist so row
293
+ Do **not** reach for `::part(row) { --lr-theme-space-s: … }` instead. A part is not a theme scope,
294
+ so the input does not re-derive the spacing of the components nested in the row; and a scope there
295
+ would be a whole-subtree retheme that shrinks everything inside the row, including the items of a
296
+ `renderActions` menu, below the accessible touch-target minimum. The `row-item-*` parts exist so row
296
297
  density can be tuned without that blast radius.
297
298
 
298
299
  **Sizing:** the internal list fills whatever height this component is given, with no consumer CSS —
package/llms/migration.md CHANGED
@@ -84,6 +84,7 @@ review removed names before running the migrated application.
84
84
  | `DEPRECATED_MEMBER_REVIEW`, `DEPRECATED_CONTENT_REVIEW` | A deprecated member, tag or kind of slotted content without a mechanical replacement. |
85
85
  | `DEPRECATED_MODULE_REVIEW` | A deprecated module, stylesheet, named export, window event or root attribute. Its replacement needs a semantic review. |
86
86
  | `GLOBAL_REVIEW` | A moved package specifier, removed root export or removed localization key that cannot be rewritten safely. |
87
+ | `THEME_SCOPE_CSS_INPUT_REVIEW`, `THEME_SCOPE_OUTPUT_REVIEW`, `THEME_SCOPE_DYNAMIC_INPUT_REVIEW`, `THEME_SCOPE_REPEATED_REVIEW`, `THEME_SCOPE_DOUBLE_LAYER_REVIEW` | The `theme-scopes` rule found an input, shared output or marker that needs a theme scope by hand, or `tokens-root.css` imported next to `theme.css`, which already carries the layer. |
87
88
  | `MODULE_NAMESPACE_REVIEW` | A namespace, dynamic import or CommonJS module access whose exported bindings need review. |
88
89
  | `RENAME_CONFLICT_REVIEW` | The element already binds the new name, or the same receiver already listens to it with the same handler. |
89
90
  | `UNUSED_ACKNOWLEDGEMENT` | An acknowledgement comment matches no report. |
@@ -820,6 +821,7 @@ review removed names before running the migrated application.
820
821
  | `DEPRECATED_MEMBER_REVIEW`, `DEPRECATED_CONTENT_REVIEW` | A deprecated member, tag or kind of slotted content without a mechanical replacement. |
821
822
  | `DEPRECATED_MODULE_REVIEW` | A deprecated module, stylesheet, named export, window event or root attribute. Its replacement needs a semantic review. |
822
823
  | `GLOBAL_REVIEW` | A moved package specifier, removed root export or removed localization key that cannot be rewritten safely. |
824
+ | `THEME_SCOPE_CSS_INPUT_REVIEW`, `THEME_SCOPE_OUTPUT_REVIEW`, `THEME_SCOPE_DYNAMIC_INPUT_REVIEW`, `THEME_SCOPE_REPEATED_REVIEW`, `THEME_SCOPE_DOUBLE_LAYER_REVIEW` | The `theme-scopes` rule found an input, shared output or marker that needs a theme scope by hand, or `tokens-root.css` imported next to `theme.css`, which already carries the layer. |
823
825
  | `MODULE_NAMESPACE_REVIEW` | A namespace, dynamic import or CommonJS module access whose exported bindings need review. |
824
826
  | `RENAME_CONFLICT_REVIEW` | The element already binds the new name, or the same receiver already listens to it with the same handler. |
825
827
  | `UNUSED_ACKNOWLEDGEMENT` | An acknowledgement comment matches no report. |
@@ -1541,6 +1543,7 @@ the old name keeps working meanwhile.
1541
1543
  | `DEPRECATED_MEMBER_REVIEW`, `DEPRECATED_CONTENT_REVIEW` | A deprecated member, tag or kind of slotted content without a mechanical replacement. |
1542
1544
  | `DEPRECATED_MODULE_REVIEW` | A deprecated module, stylesheet, named export, window event or root attribute. Its replacement needs a semantic review. |
1543
1545
  | `GLOBAL_REVIEW` | A moved package specifier, removed root export or removed localization key that cannot be rewritten safely. |
1546
+ | `THEME_SCOPE_CSS_INPUT_REVIEW`, `THEME_SCOPE_OUTPUT_REVIEW`, `THEME_SCOPE_DYNAMIC_INPUT_REVIEW`, `THEME_SCOPE_REPEATED_REVIEW`, `THEME_SCOPE_DOUBLE_LAYER_REVIEW` | The `theme-scopes` rule found an input, shared output or marker that needs a theme scope by hand, or `tokens-root.css` imported next to `theme.css`, which already carries the layer. |
1544
1547
  | `MODULE_NAMESPACE_REVIEW` | A namespace, dynamic import or CommonJS module access whose exported bindings need review. |
1545
1548
  | `RENAME_CONFLICT_REVIEW` | The element already binds the new name, or the same receiver already listens to it with the same handler. |
1546
1549
  | `UNUSED_ACKNOWLEDGEMENT` | An acknowledgement comment matches no report. |
@@ -1621,6 +1624,7 @@ the old name keeps working meanwhile.
1621
1624
  | `DEPRECATED_MEMBER_REVIEW`, `DEPRECATED_CONTENT_REVIEW` | A deprecated member, tag or kind of slotted content without a mechanical replacement. |
1622
1625
  | `DEPRECATED_MODULE_REVIEW` | A deprecated module, stylesheet, named export, window event or root attribute. Its replacement needs a semantic review. |
1623
1626
  | `GLOBAL_REVIEW` | A moved package specifier, removed root export or removed localization key that cannot be rewritten safely. |
1627
+ | `THEME_SCOPE_CSS_INPUT_REVIEW`, `THEME_SCOPE_OUTPUT_REVIEW`, `THEME_SCOPE_DYNAMIC_INPUT_REVIEW`, `THEME_SCOPE_REPEATED_REVIEW`, `THEME_SCOPE_DOUBLE_LAYER_REVIEW` | The `theme-scopes` rule found an input, shared output or marker that needs a theme scope by hand, or `tokens-root.css` imported next to `theme.css`, which already carries the layer. |
1624
1628
  | `MODULE_NAMESPACE_REVIEW` | A namespace, dynamic import or CommonJS module access whose exported bindings need review. |
1625
1629
  | `RENAME_CONFLICT_REVIEW` | The element already binds the new name, or the same receiver already listens to it with the same handler. |
1626
1630
  | `UNUSED_ACKNOWLEDGEMENT` | An acknowledgement comment matches no report. |
@@ -1676,6 +1680,11 @@ working; other uses (a deep import, a namespace member) and removed localization
1676
1680
  | part | `<lr-eval-dataset> ::part(search-clear)` | Style the clear button through part search-clear on the field, and the native input through search-input-field. | Reported only. search-clear is now the composed lr-input clear button. |
1677
1681
  | part | `<lr-eval-dataset> ::part(search-input)` | Style the native input through search-input-field. | Reported only. search-input is now the lr-input host, not the native input. |
1678
1682
 
1683
+ This profile also runs the structural rule `theme-scopes`, the same implementation as `--rule=<name>`.
1684
+ It adds `data-lr-theme-scope` to elements whose inline style sets a token-layer input, and reports dynamic inputs,
1685
+ markers inside loops, and stylesheet rules that set an input or a shared output outside a theme scope
1686
+ (`THEME_SCOPE_*_REVIEW`, acknowledged like any other code).
1687
+
1679
1688
  ## Upstream-protected compatibility spellings
1680
1689
 
1681
1690
  These 8 legacy spellings remain supported while their corresponding Web Awesome or Shoelace surface publishes them. Prefer the current Lyra spelling for new code. Their recorded `removalNotBefore` value is a minimum, not an automatic removal date or permission to remove a still-mirrored spelling.
package/llms/peers.md CHANGED
@@ -38,7 +38,7 @@ for the page.
38
38
  | Peer | Range | Needed by |
39
39
  |---|---|---|
40
40
  | `@aceshooting/lyra-flags` | `^2.3.0` | _(loaded by a shared internal module)_ |
41
- | `@aceshooting/lyra-translations` | `^27.0.0` | _(not referenced by any component)_ |
41
+ | `@aceshooting/lyra-translations` | `^28.1.0` | _(not referenced by any component)_ |
42
42
  | `@aiden0z/pptx-renderer` | `^1.3.0` | `lr-pptx-viewer` |
43
43
  | `@sgratzl/chartjs-chart-boxplot` | `^4.0.0` | `lr-box-plot` |
44
44
  | `chart.js` | `^4.0.1` | `lr-bar-chart`, `lr-box-plot`, `lr-bubble-chart`, `lr-chart`, `lr-doughnut-chart`, `lr-histogram`, `lr-line-chart`, `lr-pie-chart`, `lr-polar-area-chart`, `lr-radar-chart`, `lr-scatter-chart` |
@@ -842,6 +842,16 @@ These named interfaces and helper signatures are available to typed integrations
842
842
  `resolveCanvasColor(/* public names: scope, color, fallback */): unknown`
843
843
  `resolveCanvasColors(/* public names: scope, colors, fallback */): unknown`
844
844
 
845
+ - **`internal-document-tokens-contracts`** — Shared utility contracts.
846
+ `adoptLyraTokens(root: Document | ShadowRoot): void`
847
+ Adopts the document token layer into a document or shadow root. Idempotent; see "Application
848
+ shadow roots" in the styles and tokens guide for when a root needs it.
849
+
850
+ - **`internal-theme-scopes-contracts`** — Shared utility contracts.
851
+ `findUnscopedThemeInputs(root?: Document | DocumentFragment | Element): Element[]`
852
+ Lists elements that set an inline `--lr-theme-*` input the layer consumes without being a theme
853
+ scope. Reads inline styles only and logs nothing.
854
+
845
855
  - **`internal-localization-runtime-contracts`** — Shared utility contracts.
846
856
  `getLyraLocaleDirection(/* public names: locale */): unknown`
847
857
  `getLyraLocale(): unknown`
@@ -1577,15 +1587,45 @@ These named interfaces and helper signatures are available to typed integrations
1577
1587
  - **`testing-happy-dom-shims-contracts`** — Shared utility contracts.
1578
1588
  `installHappyDomFormAssociatedShims(): unknown`
1579
1589
  `installHappyDomShadowFocusShim(): unknown`
1590
+ `flattenCascadeLayers(/* public names: css */): unknown`
1580
1591
  `installHappyDomAriaControlsShim(/* public names: proto */): unknown`
1592
+ `installHappyDomCascadeLayerShim(/* public names: proto, misbehaves */): unknown`
1581
1593
  `installHappyDomShims(): unknown`
1582
1594
  `installStubInternalsForTest(/* public names: host */): unknown`
1583
1595
 
1596
+ - **`testing-jsdom-shims-contracts`** — Shared utility contracts.
1597
+ `JsdomAdoptedStyleSheetsTargets {
1598
+ documentPrototype?: object;
1599
+ shadowRootPrototype?: object;
1600
+ styleSheetPrototype?: object;
1601
+ isJsdom?: () => boolean;
1602
+ }`
1603
+ `installJsdomAdoptedStyleSheetsShim(targets?: JsdomAdoptedStyleSheetsTargets): () => void`
1604
+ `JsdomFormAssociatedTargets {
1605
+ internalsPrototype?: object;
1606
+ elementPrototype?: object;
1607
+ isJsdom?: () => boolean;
1608
+ }`
1609
+ `installJsdomFormAssociatedShim(targets?: JsdomFormAssociatedTargets): () => void`
1610
+ `installJsdomShims(): () => void`
1611
+ See "jsdom: `installJsdomShims()`" above for the full contract.
1612
+
1584
1613
  - **`testing-interaction-drivers-contracts`** — Shared utility contracts.
1585
1614
  `chooseOption(/* public names: owner, value */): unknown`
1586
1615
  `submitConfirmDecision(/* public names: owner, decision */): unknown`
1587
1616
  `toggleSwitch(/* public names: switchEl */): unknown`
1588
1617
  `activateStep(/* public names: stepper, target */): unknown`
1618
+ `chooseSwatch(/* public names: picker, value */): unknown`
1619
+ `chooseCurrency(/* public names: picker, code */): unknown`
1620
+ `PopoverDriverOptions {
1621
+ timeoutMs: unknown;
1622
+ }`
1623
+ `ClosePopoverOptions {
1624
+ via: unknown;
1625
+ timeoutMs: unknown;
1626
+ }`
1627
+ `openPopover(/* public names: popover, options */): unknown`
1628
+ `closePopover(/* public names: popover, options */): unknown`
1589
1629
  See "Driving a component's real activation path: interaction drivers" above for the full contract.
1590
1630
 
1591
1631
  - **`testing-wait-for-mount-contracts`** — Shared utility contracts.
@@ -1682,6 +1722,7 @@ These named interfaces and helper signatures are available to typed integrations
1682
1722
  `parseLyraStyleRecord(value: unknown): Readonly<LyraStyle>`
1683
1723
  `resetLyraStyle(fields?: readonly LyraStyleField[]): Readonly<LyraStyle>`
1684
1724
  `setLyraStyle(choices: LyraStyleChoices): Readonly<LyraStyle>`
1725
+ `startLyraStyle(): Readonly<LyraStyle>`
1685
1726
 
1686
1727
  - **`vue-contracts`** — Framework integration type contracts, including the multi-split
1687
1728
  `for` launcher id and `trigger` element reference.
@@ -51,6 +51,22 @@ browser-bundle argument for excluding them does not apply to a server render. Us
51
51
  template; the component renders when its definition upgrades in the browser. Use this for initial
52
52
  renders that require light-DOM traversal, layout, canvas, observers, media, or other browser APIs.
53
53
 
54
+ **Link the token layer in `<head>`.** Since 28.0.0 declarative shadow roots no longer carry the
55
+ shared `--lr-*` layer (one server-rendered `lr-button` is about 34 KB smaller). `theme.css` carries
56
+ it, so for a correct first paint before hydration link `theme.css` after the no-flash bootstrap (a
57
+ page that does not use `theme.css` links `styles/tokens-root.css`, the layer alone, instead):
58
+
59
+ ```html
60
+ <link rel="stylesheet" href="/node_modules/@aceshooting/lyra-ui/dist/theme.css" />
61
+ ```
62
+
63
+ Hydration then skips the constructed copy. An application's **own** declarative shadow roots that
64
+ contain theme scopes (for example a `.lr-dark` region or a `data-lr-theme-scope` wrapper) include the
65
+ same `<link rel="stylesheet" href="…/tokens-root.css">` inside their template: document styles do not
66
+ reach into a shadow root until hydration adopts the layer there. Without any link and without
67
+ JavaScript, server-rendered components paint without resolved tokens, as a page without Lyra's styles
68
+ always did.
69
+
54
70
  Server setup (the fallback must precede Lit's renderer):
55
71
 
56
72
  ```ts
@@ -185,11 +185,12 @@ The entry points, then:
185
185
  - **`lr-flag`** registers from the barrel, but resolving a flag by `country`/`language` (rather than
186
186
  a pre-resolved `src`) additionally needs
187
187
  `import '@aceshooting/lyra-ui/components/media/flag/flag-peer.js';` once.
188
- - **Other subpaths.** `@aceshooting/lyra-ui/theme.css` (ready-made light/dark theme),
188
+ - **Other subpaths.** `@aceshooting/lyra-ui/theme.css` (ready-made light/dark theme, including the
189
+ document token layer),
189
190
  `@aceshooting/lyra-ui/looks/shadcn.css` (opt-in shadcn/ui look, imported after `theme.css` — see
190
191
  [The shadcn look](./styles-and-tokens.md#the-shadcn-look--looksshadcncss)),
191
- `@aceshooting/lyra-ui/tokens-root.css` (opt-in: the curated resolved `--lr-*` tokens at `:root`,
192
- so your own components can read them),
192
+ `@aceshooting/lyra-ui/tokens-root.css` (the document token layer alone, for pages that do not
193
+ use `theme.css`; link one of the two, not both),
193
194
  `@aceshooting/lyra-ui/native.css` (opt-in native-element styles inside `.lr-native`),
194
195
  `@aceshooting/lyra-ui/utilities.css` (opt-in light-DOM layout/text/typography utilities),
195
196
  `@aceshooting/lyra-ui/theme.js` (the zero-dependency style runtime),
@@ -30,8 +30,8 @@ uses a substring class selector, so a class such as `app-lr-flex-preview` does n
30
30
  assets repeat `@layer lr-base, lr-theme, lr-theme-preset, lr-utilities, lr-overrides`; an ordinary unlayered
31
31
  application rule therefore beats them regardless of load order. A third opt-in asset,
32
32
  [`tokens-root.css`](./styles-and-tokens.md#reading-the-resolved-tokens-from-your-own-components--tokens-rootcss), is not a
33
- style sheet in the same sense — it declares custom properties only, and exists so your own
34
- components can read the resolved `--lr-*` tokens these two are written against.
33
+ style sheet in the same sense — it declares custom properties only: the document token layer that
34
+ the first connected Lyra element would otherwise adopt, available before any component connects.
35
35
 
36
36
  ### Utility class inventory
37
37
 
@@ -113,7 +113,8 @@ keeps that surface's text colour. Heading tracking reads `--lr-heading-letter-sp
113
113
  | Muted | `lr-text-sm lr-text-quiet` |
114
114
 
115
115
  For an exact 0.875rem muted/small size, use a class of your own with the token chain (resolved
116
- `--lr-*` tokens are undefined at document scope unless `tokens-root.css` is loaded):
116
+ `--lr-*` tokens exist at document scope once a Lyra element has connected or `tokens-root.css` is
117
+ loaded; the chain covers the moment before):
117
118
 
118
119
  ```css
119
120
  .app-muted {
@@ -303,3 +304,37 @@ contrast and forced colors retain opaque fills. Load `preferences.css` for expli
303
304
  contrast/motion choices. Nested chrome suppresses repeated blur; independently presented top-layer
304
305
  surfaces begin their own material root. Keep cards, data tables, charts, map layers and editing
305
306
  fields outside the automatic chrome class.
307
+
308
+ #### Application fallback fills and cascade layers
309
+
310
+ Lyra paints the `.lr-surface-chrome` fill from a rule inside its cascade layers
311
+ (`lr-theme-preset.surface`). An **unlayered** application rule that sets `background` on the same
312
+ element — a generic `dialog { background: … }`, a `.panel` class — beats every layered rule
313
+ whatever its specificity, so the element keeps the application's opaque fill and the Glass
314
+ treatment disappears without a warning. No `revert-layer` workaround is needed; put the
315
+ application's fallback where it ranks below Lyra:
316
+
317
+ ```css
318
+ /* 1. A low-priority application layer named before Lyra's. This order statement must be the first
319
+ the browser sees: put it at the top of the entry stylesheet, before the theme.css import. */
320
+ @layer app-base, lr-base, lr-theme, lr-theme-preset, lr-utilities, lr-overrides;
321
+ @import "@aceshooting/lyra-ui/theme.css";
322
+
323
+ @layer app-base {
324
+ dialog,
325
+ .panel {
326
+ background: #fff; /* still paints when the Lyra stylesheets are absent */
327
+ }
328
+ }
329
+
330
+ /* 2. Or choose the chrome's base fill through its token; Glass mixes it at the surface opacity. */
331
+ .panel.lr-surface-chrome {
332
+ --lr-surface-background: #fff;
333
+ }
334
+ ```
335
+
336
+ An application layer declared after Lyra's (or unnamed until after `theme.css` loads) ranks above
337
+ the surface layer and disables Glass in the same way as an unlayered rule. Keep unlayered
338
+ `background` rules off `.lr-surface-chrome` elements, or exclude them with
339
+ `:not(.lr-surface-chrome)`. See [Cascade layers](styles-and-tokens.md#cascade-layers) for the full
340
+ order.