@aceshooting/lyra-ui 23.0.0 → 24.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 (278) hide show
  1. package/CHANGELOG.md +9 -43
  2. package/README.md +72 -35
  3. package/custom-elements.json +1 -1
  4. package/design-tokens.json +1 -1
  5. package/dist/cli/lyra-rename-ledger.mjs +1 -1
  6. package/dist/cli/migration-contract.json +1 -1
  7. package/dist/cli/migration-contract.mjs +1 -1
  8. package/dist/cli/migration-renames.mjs +2 -2
  9. package/dist/cli/migration-transforms.mjs +2 -2
  10. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +1 -4
  11. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -3
  12. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +1 -4
  13. package/dist/components/agent-tools/compare-panel/compare-panel.class.js +1 -1
  14. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +1 -7
  15. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  16. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts +1 -1
  17. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.d.ts +2 -5
  18. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +1 -3
  19. package/dist/components/agent-tools/terminal/terminal.class.d.ts +1 -4
  20. package/dist/components/agent-tools/terminal/terminal.class.js +2 -2
  21. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts +1 -7
  22. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +1 -1
  23. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +1 -4
  24. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -3
  25. package/dist/components/charts/chart/lite-chart-axis-layout.d.ts +13 -0
  26. package/dist/components/charts/chart/lite-chart-axis-layout.js +1 -0
  27. package/dist/components/charts/chart/lite-chart.class.d.ts +1 -11
  28. package/dist/components/charts/chart/lite-chart.class.js +4 -4
  29. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +2 -2
  30. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +0 -1
  31. package/dist/components/conversation/chat-message/chat-message.class.d.ts +3 -9
  32. package/dist/components/conversation/chat-message/chat-message.class.js +1 -1
  33. package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
  34. package/dist/components/conversation/code-block/code-block-core.class.d.ts +6 -8
  35. package/dist/components/conversation/code-block/code-block-shared.d.ts +1 -4
  36. package/dist/components/conversation/code-block/code-block.class.d.ts +4 -6
  37. package/dist/components/conversation/markdown/markdown-base.class.d.ts +1 -3
  38. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  39. package/dist/components/conversation/markdown/markdown-core.class.d.ts +1 -4
  40. package/dist/components/conversation/markdown/markdown.class.d.ts +1 -4
  41. package/dist/components/conversation/message-actions/message-actions.class.d.ts +1 -4
  42. package/dist/components/conversation/message-actions/message-actions.class.js +1 -1
  43. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +1 -4
  44. package/dist/components/conversation/message-feedback/message-feedback.class.js +2 -2
  45. package/dist/components/conversation/message-parts/message-parts.class.d.ts +2 -5
  46. package/dist/components/conversation/message-parts/message-parts.class.js +3 -3
  47. package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +1 -1
  48. package/dist/components/conversation/streaming-text/streaming-text-core.class.d.ts +2 -0
  49. package/dist/components/conversation/streaming-text/streaming-text-core.class.js +0 -1
  50. package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +2 -0
  51. package/dist/components/conversation/streaming-text/streaming-text.class.js +0 -1
  52. package/dist/components/conversation/thread-list/thread-list.class.d.ts +6 -17
  53. package/dist/components/conversation/thread-list/thread-list.class.js +6 -6
  54. package/dist/components/data/context-meter/context-meter.class.d.ts +1 -6
  55. package/dist/components/data/context-meter/context-meter.class.js +1 -1
  56. package/dist/components/data/data-grid/data-grid.class.d.ts +0 -1
  57. package/dist/components/data/data-grid/data-grid.class.js +2 -2
  58. package/dist/components/data/document-library/document-library.class.d.ts +6 -13
  59. package/dist/components/data/document-library/document-library.class.js +1 -2
  60. package/dist/components/data/heatmap/heatmap-grid-navigation.d.ts +7 -0
  61. package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -0
  62. package/dist/components/data/heatmap/heatmap.class.d.ts +3 -23
  63. package/dist/components/data/heatmap/heatmap.class.js +2 -2
  64. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +3 -9
  65. package/dist/components/data/sequence-strip/sequence-strip.class.js +3 -3
  66. package/dist/components/data/table/table.class.d.ts +5 -14
  67. package/dist/components/data/table/table.class.js +6 -6
  68. package/dist/components/forms/button/button.class.d.ts +2 -2
  69. package/dist/components/forms/button/button.class.js +9 -9
  70. package/dist/components/forms/combobox/combobox.class.d.ts +1 -4
  71. package/dist/components/forms/combobox/combobox.class.js +2 -2
  72. package/dist/components/forms/input/time-input.class.d.ts +1 -1
  73. package/dist/components/forms/input/time-input.class.js +1 -1
  74. package/dist/components/forms/select/select.class.d.ts +1 -2
  75. package/dist/components/layout/app-rail/app-rail-item.class.d.ts +3 -6
  76. package/dist/components/layout/app-rail/app-rail-item.class.js +1 -1
  77. package/dist/components/layout/app-rail/app-rail.class.d.ts +2 -4
  78. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  79. package/dist/components/layout/app-rail-group/app-rail-group.class.d.ts +2 -6
  80. package/dist/components/layout/app-rail-group/app-rail-group.class.js +1 -1
  81. package/dist/components/layout/carousel/carousel.class.d.ts +1 -4
  82. package/dist/components/layout/carousel/carousel.class.js +2 -2
  83. package/dist/components/layout/command-palette/command-palette.class.js +1 -1
  84. package/dist/components/layout/details/details.class.d.ts +2 -4
  85. package/dist/components/layout/details/details.class.js +1 -1
  86. package/dist/components/layout/dock-panel/dock-panel.class.d.ts +3 -7
  87. package/dist/components/layout/dock-panel/dock-panel.class.js +1 -1
  88. package/dist/components/layout/menu/menu.class.js +1 -1
  89. package/dist/components/layout/multi-split/multi-split.class.d.ts +2 -4
  90. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  91. package/dist/components/layout/navigation-menu-item/navigation-menu-item.class.d.ts +2 -4
  92. package/dist/components/layout/navigation-menu-item/navigation-menu-item.class.js +1 -1
  93. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +1 -4
  94. package/dist/components/layout/reorder-list/reorder-item.class.js +2 -2
  95. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts +5 -9
  96. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +5 -5
  97. package/dist/components/media/av-player/av-player.class.js +3 -3
  98. package/dist/components/media/file-input/file-input.class.d.ts +3 -6
  99. package/dist/components/media/file-input/file-input.class.js +3 -3
  100. package/dist/components/media/lightbox/lightbox.class.d.ts +11 -20
  101. package/dist/components/media/lightbox/lightbox.class.js +1 -1
  102. package/dist/components/media/map/map-data-layers.d.ts +20 -0
  103. package/dist/components/media/map/map-data-layers.js +1 -0
  104. package/dist/components/media/map/map.class.js +3 -3
  105. package/dist/components/media/media-time.d.ts +2 -0
  106. package/dist/components/media/media-time.js +1 -0
  107. package/dist/components/media/video/video.class.js +5 -5
  108. package/dist/components/media/video-playlist/video-playlist.class.js +2 -2
  109. package/dist/components/overlays/callout/callout.class.d.ts +2 -5
  110. package/dist/components/overlays/callout/callout.class.js +2 -2
  111. package/dist/components/overlays/dialog/dialog.class.d.ts +4 -7
  112. package/dist/components/overlays/dialog/dialog.class.js +2 -2
  113. package/dist/components/overlays/overlay/dropdown.class.d.ts +5 -10
  114. package/dist/components/overlays/overlay/dropdown.class.js +2 -2
  115. package/dist/components/overlays/overlay/popover.class.d.ts +2 -3
  116. package/dist/components/overlays/popup/popup.class.js +1 -1
  117. package/dist/components/overlays/progress/progress-bar.class.d.ts +1 -4
  118. package/dist/components/overlays/progress/progress-bar.class.js +2 -2
  119. package/dist/components/overlays/progress/progress-ring.class.d.ts +1 -4
  120. package/dist/components/overlays/progress/progress-ring.class.js +2 -2
  121. package/dist/components/overlays/progress/progress-shared.d.ts +3 -3
  122. package/dist/components/overlays/progress/progress-shared.js +1 -1
  123. package/dist/components/overlays/toast/toast-item.class.js +1 -1
  124. package/dist/components/retrieval/graph/graph.class.d.ts +5 -10
  125. package/dist/components/retrieval/graph/graph.class.js +1 -1
  126. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +7 -14
  127. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +2 -3
  128. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +2 -8
  129. package/dist/components/retrieval/memory-panel/memory-panel.class.js +0 -4
  130. package/dist/components/retrieval/rag-answer/rag-answer.class.js +1 -1
  131. package/dist/components/utility/export-button/export-button.class.d.ts +6 -10
  132. package/dist/components/utility/export-button/export-button.class.js +1 -1
  133. package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
  134. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts +1 -1
  135. package/dist/components/viewers/highlight-layer/highlight-layer-timing.js +1 -1
  136. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +4 -4
  137. package/dist/events.d.ts +17 -78
  138. package/dist/framework-types.d.ts +1 -1
  139. package/dist/internal/catalog-picker.js +1 -1
  140. package/dist/internal/css-motion-time.d.ts +7 -0
  141. package/dist/internal/css-motion-time.js +1 -0
  142. package/dist/internal/data-state-renderer.d.ts +1 -3
  143. package/dist/internal/data-state-renderer.js +1 -1
  144. package/dist/internal/localization-runtime.d.ts +2 -0
  145. package/dist/internal/localization-runtime.js +1 -1
  146. package/dist/internal/lyra-element.js +2 -2
  147. package/dist/internal/package-metadata.d.ts +1 -1
  148. package/dist/internal/package-metadata.js +1 -1
  149. package/dist/looks/data.css +1 -1
  150. package/dist/looks/terminal.css +1 -1
  151. package/dist/lyra.d.ts +1 -592
  152. package/dist/lyra.js +1 -1
  153. package/dist/testing/event-factory.d.ts +2 -2
  154. package/dist/testing/interaction-drivers.d.ts +5 -3
  155. package/dist/testing/lyra-tag-event-map.js +1 -1
  156. package/dist/theme/looks/data.d.ts +1 -1
  157. package/dist/theme/looks/data.js +1 -1
  158. package/dist/theme/looks/terminal.d.ts +1 -1
  159. package/dist/theme/looks/terminal.js +1 -1
  160. package/dist/theme/theme.d.ts +2 -80
  161. package/dist/theme/theme.js +1 -1
  162. package/llms/components/lr-agent-workspace.md +1 -1
  163. package/llms/components/lr-alert.md +1 -1
  164. package/llms/components/lr-animation.md +1 -1
  165. package/llms/components/lr-app-rail.md +8 -10
  166. package/llms/components/lr-approval-queue.md +2 -4
  167. package/llms/components/lr-attachment-trigger.md +3 -4
  168. package/llms/components/lr-badge.md +2 -2
  169. package/llms/components/lr-button.md +45 -99
  170. package/llms/components/lr-callout.md +3 -4
  171. package/llms/components/lr-carousel.md +3 -5
  172. package/llms/components/lr-chat-message.md +1 -2
  173. package/llms/components/lr-claim-evidence.md +1 -1
  174. package/llms/components/lr-code-block-core.md +2 -2
  175. package/llms/components/lr-code-block.md +5 -6
  176. package/llms/components/lr-color-picker.md +1 -1
  177. package/llms/components/lr-combobox.md +5 -6
  178. package/llms/components/lr-compare-panel.md +2 -4
  179. package/llms/components/lr-confirm-bar.md +3 -7
  180. package/llms/components/lr-context-inspector.md +3 -2
  181. package/llms/components/lr-context-menu.md +2 -2
  182. package/llms/components/lr-context-meter.md +2 -4
  183. package/llms/components/lr-copy-button.md +1 -1
  184. package/llms/components/lr-data-grid.md +4 -7
  185. package/llms/components/lr-details.md +3 -3
  186. package/llms/components/lr-dialog.md +4 -6
  187. package/llms/components/lr-dock-panel.md +5 -6
  188. package/llms/components/lr-document-library.md +5 -7
  189. package/llms/components/lr-drawer.md +3 -3
  190. package/llms/components/lr-dropdown.md +4 -5
  191. package/llms/components/lr-eval-run.md +3 -5
  192. package/llms/components/lr-export-button.md +4 -7
  193. package/llms/components/lr-file-input.md +0 -5
  194. package/llms/components/lr-funnel.md +1 -1
  195. package/llms/components/lr-graph.md +3 -7
  196. package/llms/components/lr-icon.md +1 -1
  197. package/llms/components/lr-include.md +1 -1
  198. package/llms/components/lr-input.md +31 -79
  199. package/llms/components/lr-json-viewer.md +1 -1
  200. package/llms/components/lr-knowledge-base.md +4 -6
  201. package/llms/components/lr-knowledge-graph-explorer.md +2 -5
  202. package/llms/components/lr-known-date.md +1 -1
  203. package/llms/components/lr-lightbox.md +9 -7
  204. package/llms/components/lr-lite-chart.md +1 -5
  205. package/llms/components/lr-markdown-core.md +3 -4
  206. package/llms/components/lr-markdown.md +3 -5
  207. package/llms/components/lr-mcp-app.md +1 -1
  208. package/llms/components/lr-message-actions.md +2 -3
  209. package/llms/components/lr-message-feedback.md +1 -3
  210. package/llms/components/lr-message-parts.md +4 -5
  211. package/llms/components/lr-multi-split.md +8 -7
  212. package/llms/components/lr-native-time-input.md +1 -1
  213. package/llms/components/lr-navigation-menu.md +5 -5
  214. package/llms/components/lr-number-input.md +3 -1
  215. package/llms/components/lr-otp-input.md +2 -0
  216. package/llms/components/lr-page.md +1 -1
  217. package/llms/components/lr-pan-zoom.md +1 -1
  218. package/llms/components/lr-phone-input.md +3 -1
  219. package/llms/components/lr-popover.md +2 -2
  220. package/llms/components/lr-progress-bar.md +3 -5
  221. package/llms/components/lr-progress-ring.md +5 -7
  222. package/llms/components/lr-prompt-input.md +1 -1
  223. package/llms/components/lr-prompt-queue.md +1 -1
  224. package/llms/components/lr-prompt-studio.md +1 -1
  225. package/llms/components/lr-rag-eval-dashboard.md +1 -1
  226. package/llms/components/lr-rating.md +2 -2
  227. package/llms/components/lr-realtime-session.md +1 -1
  228. package/llms/components/lr-reorder-item.md +1 -1
  229. package/llms/components/lr-reorder-list.md +2 -3
  230. package/llms/components/lr-retrieval-compare.md +1 -1
  231. package/llms/components/lr-select.md +3 -1
  232. package/llms/components/lr-selection-toolbar.md +1 -1
  233. package/llms/components/lr-sequence-strip.md +3 -8
  234. package/llms/components/lr-span-waterfall.md +1 -1
  235. package/llms/components/lr-split-panel.md +1 -1
  236. package/llms/components/lr-streaming-text-core.md +2 -1
  237. package/llms/components/lr-streaming-text.md +3 -2
  238. package/llms/components/lr-subagent-panel.md +1 -1
  239. package/llms/components/lr-swatch-picker.md +4 -4
  240. package/llms/components/lr-switch.md +3 -1
  241. package/llms/components/lr-table.md +33 -85
  242. package/llms/components/lr-terminal.md +2 -5
  243. package/llms/components/lr-textarea.md +1 -1
  244. package/llms/components/lr-thread-list.md +8 -14
  245. package/llms/components/lr-time-input.md +1 -1
  246. package/llms/components/lr-toggle-group.md +2 -2
  247. package/llms/components/lr-toggle.md +1 -1
  248. package/llms/components/lr-tool-approval-dialog.md +4 -7
  249. package/llms/components/lr-tool-call-block.md +1 -1
  250. package/llms/components/lr-tool-timeline.md +2 -5
  251. package/llms/components/lr-video-playlist.md +1 -1
  252. package/llms/components/lr-video.md +1 -1
  253. package/llms/components/lr-widget-renderer.md +7 -6
  254. package/llms/components/lr-zoomable-frame.md +1 -1
  255. package/llms/index.md +3 -618
  256. package/llms/migration.md +614 -614
  257. package/llms/shared/events-and-types.md +25 -24
  258. package/llms/shared/frameworks-and-ssr.md +7 -3
  259. package/llms/shared/imports-and-registration.md +22 -22
  260. package/llms/shared/localization-and-rtl.md +2 -2
  261. package/llms/shared/native-styles-and-utilities.md +263 -0
  262. package/llms/shared/styles-and-tokens.md +85 -676
  263. package/llms/shared/testing-and-utilities.md +12 -11
  264. package/llms/shared/v23-to-v24-migration.md +167 -0
  265. package/llms/shared.md +142 -487
  266. package/llms/tokens.md +3 -3
  267. package/llms.txt +9 -4
  268. package/package.json +7 -311
  269. package/registrations.json +1 -1
  270. package/vscode-html-data.json +1 -1
  271. package/web-types.json +1 -1
  272. package/dist/ssr-loader.d.ts +0 -2
  273. package/dist/ssr-loader.js +0 -1
  274. package/dist/theme/presets/shadcn.d.ts +0 -22
  275. package/dist/theme/presets/shadcn.js +0 -1
  276. package/dist/theme/presets.d.ts +0 -49
  277. package/dist/theme/presets.js +0 -1
  278. package/dist/themes/shadcn.css +0 -1
@@ -6,7 +6,8 @@ Lyra-specific events are `lr-`-prefixed `CustomEvent`s (`lr-change`, `lr-input`,
6
6
  dispatched through `LyraElement`'s `protected emit<T>(name, detail?, options?)`: **bubbling,
7
7
  composed, and non-cancelable by default**, with the payload on `event.detail`. A component that
8
8
  offers a genuine veto point opts into `{ cancelable: true }` and checks `defaultPrevented` before
9
- acting (as `lr-export` does) — that is called out per component. Native wrappers may additionally
9
+ acting (as `lr-export-request` on `<lr-export-button>` does) — that is called out per component.
10
+ Native wrappers may additionally
10
11
  relay unprefixed `Event`, `InputEvent`, or `FocusEvent` instances; each component section documents
11
12
  the exact native names, constructors, bubbling, and cancelability it supports.
12
13
 
@@ -23,6 +24,10 @@ Every one of those names is also typed — per component through its own event m
23
24
  through `@aceshooting/lyra-ui/events` for listeners on an ancestor, `document` or `window`. See
24
25
  "TypeScript" below.
25
26
 
27
+ For the manually reviewed, retained event-detail compatibility fields in the v23-to-v24 upgrade,
28
+ use step 7 of the [migration checklist](v23-to-v24-migration.md#migrate-a-project-in-reviewable-steps).
29
+ Those nested detail fields are separate from deprecated event names and are not automatic renames.
30
+
26
31
  ## TypeScript
27
32
 
28
33
  - **Per-component event maps.** Every component with events exports a `Lyra<Name>EventMap` type, and
@@ -1586,34 +1591,30 @@ These named interfaces and helper signatures are available to typed integrations
1586
1591
  copy, so a glyph rendered anywhere else on the page can match it exactly by consuming the same
1587
1592
  export and attribute.
1588
1593
 
1589
- - **`theme-presets-contracts`** — Shared utility contracts.
1590
- `applyLyraThemePreset(/* public names: presetOrName */): unknown`
1591
- `defineLyraThemePreset(/* public names: preset */): unknown`
1592
- `LyraThemePresetChangeDetail {
1593
- id: unknown;
1594
- theme: unknown;
1595
- }`
1596
- `LyraThemePreset {
1597
- id: unknown;
1598
- theme: unknown;
1599
- }`
1600
-
1601
1594
  - **`theme-theme-contracts`** — Shared utility contracts.
1602
- `createLyraThemeBootstrap(/* public names: options */): unknown`
1603
- `getLyraTheme(): unknown`
1595
+ `createLyraThemeBootstrap(options?: LyraThemeBootstrapOptions): string`
1604
1596
  `LyraThemeBootstrapOptions {
1605
- storageKey: unknown;
1606
- }`
1607
- `LyraTheme {
1608
- mode: unknown;
1609
- accent: unknown;
1610
- surface: unknown;
1611
- tokens: unknown;
1612
- }`
1613
- `setLyraTheme(/* public names: theme */): unknown`
1597
+ storageKey?: string;
1598
+ }`
1599
+ `LyraThemeSemanticRole = 'brand' | 'success' | 'warning' | 'danger' | 'neutral'`
1600
+ `LyraThemeAccentValue = string | null | { light?: string | null; dark?: string | null }`
1601
+ `LyraThemeAccent = string | null | Partial<Record<LyraThemeSemanticRole, LyraThemeAccentValue>>`
1602
+ ``LyraThemeTokenName = `--lr-theme-${string}```
1603
+ `LyraThemeTokenValue = string | { light?: string | null; dark?: string | null }`
1604
+ `LyraThemeTokens = Readonly<Record<LyraThemeTokenName, LyraThemeTokenValue>>`
1605
+ `LyraStyleAxis = 'look' | 'surface' | 'density' | 'mode' | 'accent'`
1606
+ `LyraStyleField = LyraStyleAxis | 'accentBackground' | 'overrides'`
1607
+ `LyraLookId = 'lyra' | 'shadcn' | 'material' | (string & {})`
1608
+ `LyraSurface = 'solid' | 'glass'`
1609
+ `LyraDensity = 'compact' | 'comfortable' | 'touch'`
1610
+ `LyraMode = 'light' | 'dark' | 'system' | 'unset'`
1611
+ `LyraAccentName = 'emerald' | 'peridot' | 'topaz' | 'ruby' | 'tourmaline' | 'amethyst' | 'aquamarine' | 'sapphire' | 'hematite'`
1612
+ `LyraAccent = LyraAccentName | LyraThemeAccent`
1613
+ `LyraAccentBackground = string | { light?: string | null; dark?: string | null } | null`
1614
1614
  `applyLyraStyleScope(element: Element, choices: LyraStyleScopeChoices | null): void`
1615
1615
  `defineLyraLook<const Look extends LyraLook>(look: Look): Readonly<Look>`
1616
1616
  `getLyraStyle(): Readonly<LyraStyle>`
1617
+ `lyraThemeBootstrap: string`
1617
1618
  `LyraLook {
1618
1619
  readonly id: LyraLookId;
1619
1620
  readonly tokens: LyraThemeTokens;
@@ -32,12 +32,16 @@ and adapters emit empty JavaScript and do not register elements.
32
32
 
33
33
  ## SSR and declarative shadow DOM
34
34
 
35
+ When replacing the removed combined `ssr-loader.js` route, split browser hydration from component
36
+ registration and server rendering as shown below. The [v23-to-v24 migration guide](v23-to-v24-migration.md)
37
+ has the ordered upgrade steps and environment-specific import mapping.
38
+
35
39
  Root, `all.js`, and granular component imports are server-safe under the supported Node 22+ runtime.
36
40
  `@aceshooting/lyra-ui/ssr/all.js` is the **server-only** convenience entry: unlike the browser
37
41
  `all.js`, it registers the complete inventory including the optional-peer families — defining those
38
42
  tags never imports their peers (each component loads its own lazily, client-side), and the
39
43
  browser-bundle argument for excluding them does not apply to a server render. Use the public
40
- `@aceshooting/lyra-ui/ssr-loader.js` entry for the tested Lit SSR contract. Its exported
44
+ `@aceshooting/lyra-ui/ssr.js` entry for the tested Lit SSR contract. Its exported
41
45
  `LYRA_SSR_SUPPORT_MATRIX`, `LYRA_SSR_RENDER_AND_HYDRATE_TAGS`, and
42
46
  `LYRA_SSR_CLIENT_RENDER_TAGS` classify every inventory tag exactly once:
43
47
 
@@ -50,7 +54,7 @@ browser-bundle argument for excluding them does not apply to a server render. Us
50
54
  Server setup (the fallback must precede Lit's renderer):
51
55
 
52
56
  ```ts
53
- import { lyraSsrElementRenderers } from "@aceshooting/lyra-ui/ssr-loader.js";
57
+ import { lyraSsrElementRenderers } from "@aceshooting/lyra-ui/ssr.js";
54
58
  import { render, LitElementRenderer } from "@lit-labs/ssr";
55
59
  import { html } from "lit";
56
60
 
@@ -59,7 +63,7 @@ const result = render(html`<lr-page><main>Dashboard</main></lr-page>`, {
59
63
  });
60
64
  ```
61
65
 
62
- In the browser, import `@aceshooting/lyra-ui/ssr-loader.js` before any other module that can import
66
+ In the browser, import `@aceshooting/lyra-ui/hydration.js` before any other module that can import
63
67
  Lit. This installs `@lit-labs/ssr-client/lit-element-hydrate-support.js` before component
64
68
  registration. `getLyraSsrMode(tagName)` reads one tag's tier, and
65
69
  `diagnoseLyraHydration(document)` inspects current Lyra hosts in the supplied tree and every
@@ -60,8 +60,8 @@ way, and moving to the replacement removes the warning. A test suite that fails
60
60
  while deliberately exercising a deprecated form can pre-seed Lit's development-mode
61
61
  `globalThis.litIssuedWarnings` set, before the element renders, with the key
62
62
  `lyra-deprecated:<owner>:<kind>:<name>` — `<kind>` and `<name>` as in the deprecation record.
63
- `<owner>` is the element name or package-relative module specifier; for example,
64
- `lyra-deprecated:./theme.js:function:setLyraTheme`.
63
+ `<owner>` is the element name or package-relative module specifier. Theme migration guidance is in
64
+ [styles and tokens](styles-and-tokens.md).
65
65
 
66
66
  ### Release history and upgrade notes
67
67
 
@@ -82,6 +82,13 @@ The major-version landmarks after 9.0.0 are:
82
82
  that themselves overrode the hook are affected. Collection snapshot enforcement moved to a
83
83
  decorator-agnostic accessor seam instead.
84
84
 
85
+ - **24.0.0:** removed eligible v22 compatibility routes, including package-root component
86
+ constructors, duplicate nested registration entries, the combined `ssr-loader.js` entry, and the
87
+ retired theme/preset facade. Use stable tag-shaped registration entries, a component's
88
+ registration-free `.class.js` subpath, the split SSR/hydration entries, and the current style API.
89
+ The [v23-to-v24 migration guide](v23-to-v24-migration.md) gives the removed routes, ordered
90
+ consumer cleanup and retained-profile instructions.
91
+
85
92
  ### The support window
86
93
 
87
94
  Compatibility promises are bounded by a published support window, not by "evergreen browsers":
@@ -106,9 +113,9 @@ import "@aceshooting/lyra-ui/components/lr-combobox.js"; // registers <lr-combob
106
113
  import "@aceshooting/lyra-ui/components/lr-table.js"; // registers <lr-table>
107
114
  ```
108
115
 
109
- The older family-shaped registration paths remain supported for compatibility. Class-only
110
- `.class.js` entries still use their owning family path because they intentionally expose source
111
- organization and do not register a tag.
116
+ Family barrel entries remain supported and register their family. Class-only `.class.js` entries
117
+ use their owning family/component path because they intentionally expose source organization and
118
+ do not register a tag.
112
119
 
113
120
  New application code can import any component through its stable tag-shaped path:
114
121
 
@@ -119,8 +126,7 @@ import "@aceshooting/lyra-ui/components/lr-tool-call-block.js";
119
126
  ```
120
127
 
121
128
  `llms/index.md` lists every tag and its owning implementation module. The stable tag-shaped alias
122
- and the family-shaped compatibility path both resolve through the package's `./components/*`
123
- export.
129
+ and the supported family barrel each resolve through the package's component exports.
124
130
 
125
131
  The package root is a pure, side-effect-free export surface. Import a component entry to register
126
132
  only that tag, or use the explicit `all.js` entry when whole-library registration is needed:
@@ -129,17 +135,11 @@ only that tag, or use the explicit `all.js` entry when whole-library registratio
129
135
  import "@aceshooting/lyra-ui/all.js"; // explicitly registers the root-included tags
130
136
  ```
131
137
 
132
- Import component classes from their family-shaped `.class.js` subpaths. Deprecated root
133
- component-class exports refer to the component constructor bindings themselves, including a
134
- constructor re-exported from a module that also exports helpers or types. That deprecation does not
135
- extend to sibling helpers, constants, or types; those remain supported unless they have their own
136
- deprecation record. Use the owning component's granular `.class.js` subpath for class imports.
137
- Family-shaped registration imports are also deprecated. Both deprecated root component-class exports
138
- and family-shaped registration imports keep working throughout the compatibility window, with
139
- removal no earlier than 24.0.0. Stable tag-shaped registration imports and class-only subpaths are
140
- the canonical routes. The package root's helpers and types remain available. `all.js` is
141
- side-effectful and registers the root-included inventory; prefer tag-shaped imports in application
142
- code for smaller bundles.
138
+ The package root does not re-export component constructors. Import a class from its owning
139
+ component's `.class.js` subpath; import the stable tag-shaped entry to register it. The root remains
140
+ a side-effect-free home for shared utilities and types. Family registration barrels and `all.js`
141
+ remain side-effectful convenience entries; prefer tag-shaped imports for smaller application
142
+ bundles.
143
143
 
144
144
  The entry points, then:
145
145
 
@@ -178,7 +178,7 @@ The entry points, then:
178
178
  LyraAnchor,
179
179
  LyraHighlight,
180
180
  AnchorTargetCapabilities,
181
- } from "@aceshooting/lyra-ui/components/viewers/document-viewer/document-viewer.js";
181
+ } from "@aceshooting/lyra-ui/components/lr-document-viewer.js";
182
182
  ```
183
183
  Prefer the granular entry for component-local imports; use the root export when an application
184
184
  deliberately shares the contracts across several viewer integrations.
@@ -186,13 +186,13 @@ The entry points, then:
186
186
  a pre-resolved `src`) additionally needs
187
187
  `import '@aceshooting/lyra-ui/components/media/flag/flag-peer.js';` once.
188
188
  - **Other subpaths.** `@aceshooting/lyra-ui/theme.css` (ready-made light/dark theme),
189
- `@aceshooting/lyra-ui/themes/shadcn.css` (opt-in shadcn/ui look, imported after `theme.css` — see
190
- [The shadcn look](./styles-and-tokens.md#the-shadcn-look--themesshadcncss)),
189
+ `@aceshooting/lyra-ui/looks/shadcn.css` (opt-in shadcn/ui look, imported after `theme.css` — see
190
+ [The shadcn look](./styles-and-tokens.md#the-shadcn-look--looksshadcncss)),
191
191
  `@aceshooting/lyra-ui/tokens-root.css` (opt-in: the curated resolved `--lr-*` tokens at `:root`,
192
192
  so your own components can read them),
193
193
  `@aceshooting/lyra-ui/native.css` (opt-in native-element styles inside `.lr-native`),
194
194
  `@aceshooting/lyra-ui/utilities.css` (opt-in light-DOM layout/text/typography utilities),
195
- `@aceshooting/lyra-ui/theme.js` (the zero-dependency mode/accent runtime),
195
+ `@aceshooting/lyra-ui/theme.js` (the zero-dependency style runtime),
196
196
  `@aceshooting/lyra-ui/localization.js` (side-effect-free locale runtime),
197
197
  `@aceshooting/lyra-ui/autoloader.js` (side-effect-free on-demand tag loading),
198
198
  `@aceshooting/lyra-ui/autoloader-cdn.js` (browser-guarded auto-start side effect),
@@ -61,8 +61,8 @@ The side-effect-free `@aceshooting/lyra-ui/localization.js` entry exports
61
61
  `LyraPluralMessage`, `LyraPluralCategory`, `LyraLocaleBridgeOptions` and `LyraLocaleBridgeCleanup`.
62
62
  The package root continues to re-export the runtime for compatibility and remains registration-free;
63
63
  use the dedicated entry when the application only needs locale setup and the narrower import graph.
64
- The former `@aceshooting/lyra-ui/utilities/localization.js` entry point was removed in 23.0.0.
65
- Change that import specifier to `@aceshooting/lyra-ui/localization.js`; the helper contracts are unchanged.
64
+ The former utility-scoped entry point was removed in 23.0.0. Change that import specifier to
65
+ `@aceshooting/lyra-ui/localization.js`; the helper contracts are unchanged.
66
66
  **`LYRA_DEFAULT_STRINGS` is the authoritative key list** (matching the `LyraMessageKey` union) —
67
67
  read it to find the key to override rather than guessing one. Date, number, byte, relative-time and
68
68
  calendar output goes through `Intl`.
@@ -0,0 +1,263 @@
1
+ # Native styles and CSS utilities
2
+
3
+ ## Optional native styles and CSS utilities
4
+
5
+ Lyra ships two independent light-DOM stylesheets. Neither is imported by the root barrel, a family
6
+ barrel, a component entry, or `theme.css`, so applications that do not opt in keep their existing
7
+ native-element and utility conventions unchanged.
8
+
9
+ ```css
10
+ @import "@aceshooting/lyra-ui/native.css";
11
+ @import "@aceshooting/lyra-ui/utilities.css";
12
+ ```
13
+
14
+ `native.css` places its rules in `lr-base` and styles native elements only when they are
15
+ **descendants** of an explicit `.lr-native` scope. It has no `:root`, `html`, `body`, or unscoped
16
+ reset, and the element carrying `.lr-native` is not styled by the native bundle itself. The rules
17
+ stay in light DOM: they do not pierce a component's shadow root.
18
+
19
+ ```html
20
+ <section class="lr-native">
21
+ <h2>Profile</h2>
22
+ <label for="profile-name">Display name</label>
23
+ <input id="profile-name" />
24
+ <button type="button">Save</button>
25
+ </section>
26
+ ```
27
+
28
+ `utilities.css` places exact, zero-specificity `:where(.lr-*)` classes in `lr-utilities`. It never
29
+ uses a substring class selector, so a class such as `app-lr-flex-preview` does not opt in. Both
30
+ assets repeat `@layer lr-base, lr-theme, lr-theme-preset, lr-utilities, lr-overrides`; an ordinary unlayered
31
+ application rule therefore beats them regardless of load order. A third opt-in asset,
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.
35
+
36
+ ### Utility class inventory
37
+
38
+ | Group | Exact classes |
39
+ | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
40
+ | Display and composition | `lr-block`, `lr-inline-block`, `lr-flex`, `lr-inline-flex`, `lr-grid`, `lr-flow-root`, `lr-stack`, `lr-cluster`, `lr-grid-auto` |
41
+ | Flex direction and wrapping | `lr-row`, `lr-column`, `lr-wrap`, `lr-nowrap`, `lr-grow`, `lr-grow-0`, `lr-shrink`, `lr-shrink-0` |
42
+ | Item alignment | `lr-items-start`, `lr-items-center`, `lr-items-end`, `lr-items-stretch`, `lr-items-baseline`, `lr-self-start`, `lr-self-center`, `lr-self-end`, `lr-self-stretch` |
43
+ | Distribution | `lr-justify-start`, `lr-justify-center`, `lr-justify-end`, `lr-justify-between`, `lr-justify-around` |
44
+ | Gaps | `lr-gap-0`, `lr-gap-xs`, `lr-gap-s`, `lr-gap-m`, `lr-gap-l`, `lr-gap-2xl` |
45
+ | Logical sizing | `lr-inline-full`, `lr-block-full`, `lr-size-full`, `lr-min-inline-0`, `lr-min-block-0`, `lr-max-inline-full`, `lr-max-inline-prose`, `lr-center` |
46
+ | Overflow | `lr-overflow-auto`, `lr-overflow-hidden` |
47
+ | Text alignment and size | `lr-text-start`, `lr-text-center`, `lr-text-end`, `lr-text-xs`, `lr-text-sm`, `lr-text-base`, `lr-text-lg`, `lr-text-xl`, `lr-text-quiet` |
48
+ | Font | `lr-font-normal`, `lr-font-medium`, `lr-font-semibold`, `lr-font-bold`, `lr-font-mono` |
49
+ | Text flow | `lr-text-break`, `lr-text-nowrap`, `lr-truncate`, `lr-text-balance`, `lr-text-pretty`, `lr-prose` |
50
+ | Typography | `lr-typography`, `lr-not-typography`, `lr-heading-1`, `lr-heading-2`, `lr-heading-3`, `lr-heading-4`, `lr-inline-code` |
51
+ | Visibility and focus | `lr-visually-hidden`, `lr-visually-hidden-focusable`, `lr-fouce-hidden`, `lr-hidden` |
52
+ | Page allocation | `lr-page-mobile-only`, `lr-page-desktop-only` |
53
+
54
+ `lr-fouce-hidden` hides only an opted-in custom element while it matches `:not(:defined)`, then
55
+ reveals it automatically after registration. `lr-visually-hidden-focusable` becomes visible on
56
+ focus or when a descendant receives focus, making it suitable for skip links.
57
+
58
+ The Page helpers key off the reflected `view` state of their containing `<lr-page>`:
59
+ `lr-page-mobile-only` is hidden for `view="desktop"`, and `lr-page-desktop-only` is hidden for
60
+ `view="mobile"`. Page derives that state from its own allocated inline size, not the viewport.
61
+
62
+ ### Typography
63
+
64
+ `utilities.css` also carries an opt-in typography look for light-DOM content. Nothing changes for
65
+ markup that does not use these classes.
66
+
67
+ - **Scope** — `lr-typography` styles bare `h1`–`h6`, `p`, `a[href]`, `blockquote`, `ul`/`ol`/`li`,
68
+ inline `code` (not `pre code`) and `table`/`th`/`td`/`tr` **descendants**, and spaces its direct
69
+ children. Use it for CMS or Markdown-rendered HTML you cannot annotate element by element.
70
+ - **Roles** — `lr-heading-1` … `lr-heading-4` give any element a heading level's look without
71
+ changing its semantic level; `lr-inline-code` gives one element the inline-code chip. Role classes
72
+ apply anywhere, including inside a boundary, and an explicit role beats the element's own level
73
+ inside the scope (`<h3 class="lr-heading-1">` renders heading-1).
74
+ - **Boundary** — `lr-not-typography` removes an element and its whole subtree from every element
75
+ look. Use it around layout lists (`<ul class="lr-cluster">` tag rows, nav), embedded widgets and
76
+ component clusters. A nested `lr-typography` inside a boundary is not re-enabled.
77
+ - **Named-slot children are skipped.** A child with a `slot` attribute (`<lr-card><h2
78
+ slot="header">`) is component chrome and keeps the component's own styling; default-slot content
79
+ is styled.
80
+ - **The scope element itself is never styled.** It sets no font, size, colour or margin, so it can
81
+ sit on an app region. `<blockquote class="lr-typography">` does nothing: wrap single elements.
82
+ Root font and colour come from the page, from `lr-prose` or from `lr-native`
83
+ (`class="lr-prose lr-typography"` is the usual pairing).
84
+
85
+ Choose the element for the document outline and the class for the look: `<h2 class="lr-heading-1">`
86
+ for a visually dominant section heading, never `<div class="lr-heading-1">`.
87
+
88
+ | Element in `lr-typography` | Role class | Look |
89
+ | -------------------------- | ---------------- | -------------------------------------------------------------------------------------- |
90
+ | `h1` | `lr-heading-1` | `--lr-font-size-3xl`, bold, compact leading |
91
+ | `h2` | `lr-heading-2` | `--lr-font-size-2xl`, semibold, subtle bottom rule with `--lr-space-s` padding |
92
+ | `h3` | `lr-heading-3` | `--lr-font-size-xl`, semibold |
93
+ | `h4` | `lr-heading-4` | `--lr-font-size-lg`, semibold |
94
+ | `h5` / `h6` | — | `--lr-font-size-m` / `--lr-font-size-sm`, semibold |
95
+ | `p` | — | `--lr-line-height-loose` |
96
+ | `a[href]` | — | `--lr-color-brand`, always underlined; the underline thickens on hover |
97
+ | `blockquote` | — | italic, subtle `--lr-border-width-medium` inline-start edge, inherited colour |
98
+ | `ul` / `ol` | — | `--lr-space-2xl` indent, markers restated (disc/circle/square, decimal), item rhythm |
99
+ | inline `code` | `lr-inline-code` | mono chip on `--lr-color-neutral-fill-quiet`, `0.875em`, semibold; inherits link colour |
100
+ | `table` | — | full width, collapsed subtle cell borders, bold `th`, `--lr-color-surface-raised` zebra |
101
+
102
+ Headings, role classes and quotes inherit their colour, so a role class inside a banner or alert
103
+ keeps that surface's text colour. Heading tracking reads `--lr-heading-letter-spacing`, then the
104
+ `--lr-theme-heading-letter-spacing` theme input, then `normal`.
105
+
106
+ **Lead, large, small and muted** are compositions of existing utilities:
107
+
108
+ | Look | Classes |
109
+ | ----- | ------------------------------- |
110
+ | Lead | `lr-text-xl lr-text-quiet` |
111
+ | Large | `lr-text-lg lr-font-semibold` |
112
+ | Small | `lr-text-sm lr-font-medium` |
113
+ | Muted | `lr-text-sm lr-text-quiet` |
114
+
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):
117
+
118
+ ```css
119
+ .app-muted {
120
+ font-size: var(--lr-font-size-md-sm, var(--lr-theme-font-size-md-sm, 0.875rem));
121
+ }
122
+ .app-small {
123
+ font-size: var(--lr-font-size-md-sm, var(--lr-theme-font-size-md-sm, 0.875rem));
124
+ line-height: var(--lr-line-height-none, var(--lr-theme-line-height-none, 1));
125
+ }
126
+ ```
127
+
128
+ Combine `.app-muted` with `lr-text-quiet`, and `.app-small` with `lr-font-medium`.
129
+
130
+ **Precedence.** Every selector has zero specificity, so source order and layers decide:
131
+
132
+ 1. The typography element looks and role classes open the `lr-utilities` layer, so any other `lr-*`
133
+ utility on the same element wins: `class="lr-heading-2 lr-text-quiet"` is a quiet heading, and a
134
+ scope `<blockquote class="lr-center">` is centred.
135
+ 2. An explicit heading role class beats the element's own scope look (`<h2 class="lr-heading-4">`
136
+ has no bottom rule).
137
+ 3. In `class="lr-prose lr-typography"`, `lr-prose` keeps the measure, root type and colour, and the
138
+ typography element looks and heading-aware spacing win. Inside a boundary, or on a named-slot
139
+ child, `lr-prose` applies exactly as before. Plain `lr-prose` output is unchanged.
140
+ 4. `lr-utilities` beats `lr-base`, so the scope beats `lr-native` normalization, including its link,
141
+ quote and heading colours.
142
+ 5. A layered reset (such as Tailwind's `base` preflight) loses only when you declare the documented
143
+ layer order first — see [Using the light-DOM stylesheets with a CSS
144
+ reset](#using-the-light-dom-stylesheets-with-a-css-reset-tailwind-v4-preflight-and-similar).
145
+ Authored `type` (lists) and `align` (cells) attributes are presentational hints that any author
146
+ rule, including a reset, overrides.
147
+
148
+ Any unlayered application rule beats all of the above.
149
+
150
+ **Flow.** Every direct, non-slotted child of the scope has its block margins replaced by
151
+ `--lr-prose-flow-space` (default `--lr-space-l`), and a heading gets twice that space before it.
152
+ That includes wrappers, `hr`, `img`, `details`, `section` and `lr-*` elements, so a component's own
153
+ host margin is overridden at that position (wrap it in a `<div>` to keep it). Flow counts the
154
+ immediately preceding element sibling, including non-rendered ones (`<style>`, `<template>`,
155
+ `[hidden]`), so keep those out of the scope's direct children. Blocks nested inside `li` or
156
+ `blockquote` keep the page's own margins. Do not put `lr-stack`/`lr-cluster` on the scope element
157
+ itself — gap and flow margins would add up (set `--lr-prose-flow-space: 0` if you must).
158
+
159
+ **Wide tables** go in a focusable, labelled scroll region, labelled by the table's own caption:
160
+
161
+ ```html
162
+ <div class="lr-overflow-auto" role="region" aria-labelledby="pricing-caption" tabindex="0">
163
+ <table>
164
+ <caption id="pricing-caption">Plans and prices</caption>
165
+ …
166
+ </table>
167
+ </div>
168
+ ```
169
+
170
+ **Differences from the shadcn/ui look.** Values come from Lyra's scale:
171
+
172
+ | Element | Lyra | shadcn/ui |
173
+ | --------------------- | ------------------------------------------------------------- | --------------------------------------- |
174
+ | Heading sizes | 2 / 1.75 / 1.25 / 1.125rem | 2.25 / 1.875 / 1.5 / 1.25rem |
175
+ | h1 weight | 700 | 800 |
176
+ | Tracking | `normal` unless the hook or theme input sets it; `looks/shadcn.css` sets -0.025em | tight |
177
+ | Flow spacing | 1rem (`--lr-prose-flow-space`) | 1.5rem |
178
+ | Space before headings | 2 × flow = 2rem for every level | 2.5rem before h2, 2rem before h3 |
179
+ | Paragraph leading | 1.6 | 1.75rem |
180
+ | Quote and list indent | 1rem and 2rem | 1.5rem each |
181
+ | Inline code size | 0.875em (scales inside headings) | 0.875rem |
182
+ | Inline code padding | 0.25rem inline / 0.125rem block | 0.3rem / 0.2rem |
183
+ | Table stripe | `--lr-color-surface-raised` (matches `lr-data-grid`) | muted fill |
184
+ | Links | brand colour, inherited weight, underline | primary colour, medium weight, underline |
185
+ | Muted and small size | 0.8125rem via `lr-text-sm` (exact recipe above) | 0.875rem |
186
+ | Small line-height | inherited (exact recipe above) | 1 |
187
+
188
+ **Languages.** Only logical properties are used, so edges and indents mirror under `dir="rtl"`.
189
+ Blockquotes under `:lang()` `ar`, `fa`, `ur`, `ps`, `ckb`, `sd`, `ug`, `syr`, `he`, `yi`, `ja`, `ko`
190
+ and `zh` are not italic (those scripts have no true italic), and headings under `ar`, `fa`, `ur`,
191
+ `ps`, `ckb`, `sd`, `ug` and `syr` reset `letter-spacing` to `normal` (negative tracking breaks
192
+ cursive joins). To add a language to either list, or to opt back in, write an unlayered rule; it
193
+ wins.
194
+
195
+ **`lr-markdown`** renders into its own shadow root, which `utilities.css` cannot reach. For a
196
+ similar look, use its existing parts and hooks:
197
+
198
+ ```css
199
+ lr-markdown::part(inline-code) {
200
+ background: var(--lr-color-neutral-fill-quiet, var(--lr-theme-color-neutral-fill-quiet));
201
+ font-weight: var(--lr-font-weight-semibold, var(--lr-theme-font-weight-semibold, 600));
202
+ }
203
+ lr-markdown {
204
+ --lr-markdown-table-header-bg: transparent;
205
+ }
206
+ lr-markdown::part(blockquote) {
207
+ font-style: italic;
208
+ }
209
+ ```
210
+
211
+ The `blockquote` rule carries the same `:lang()` caveat as above.
212
+
213
+ ### Using the light-DOM stylesheets with a CSS reset (Tailwind v4 preflight and similar)
214
+
215
+ A layered reset such as Tailwind v4's preflight lives in its own `base` layer. Layer order is fixed
216
+ by first appearance, so if the reset's layers are declared first they sort **after** Lyra's and
217
+ outrank `native.css` and `utilities.css`: headings shrink to body size, list markers and link
218
+ underlines disappear. Declare the full order as the **first** CSS the page loads — for example a
219
+ tiny `layers.css` imported before `tailwindcss` and before any Lyra CSS:
220
+
221
+ ```css
222
+ /* layers.css — load first */
223
+ @layer theme, base, lr-base, lr-theme, lr-theme-preset, components, lr-utilities, utilities, lr-overrides;
224
+ ```
225
+
226
+ The reset then sorts before Lyra's layers, and Tailwind's own utilities after `lr-utilities`. List
227
+ markers and link underlines inside `lr-typography` survive the reset because the scope restates
228
+ them. An authored `type` on a list or `align` on a cell does not: presentational hints lose to every
229
+ author rule, so under a reset set `list-style-type` (or `text-align`) with a class instead.
230
+
231
+ ### Bundle-specific override hooks
232
+
233
+ The bundles consume the ordinary shared color, typography, spacing, border, radius, focus, size,
234
+ and opacity tokens first. These additional hooks customize only the light-DOM bundle behavior:
235
+
236
+ | Hook | Default/fallback and use |
237
+ | ----------------------------------------- | ---------------------------------------------------------------------------- |
238
+ | `--lr-layout-gap` | `--lr-space-m`; default gap for `lr-stack`, `lr-cluster`, and `lr-grid-auto` |
239
+ | `--lr-grid-min-inline-size` | `--lr-size-14rem`; minimum auto-grid item inline size |
240
+ | `--lr-content-max-inline-size` | `--lr-size-48rem`; `lr-center` content measure |
241
+ | `--lr-prose-max-inline-size` | `65ch`; `lr-prose` and `lr-max-inline-prose` measure |
242
+ | `--lr-prose-flow-space` | `--lr-space-l`; flow spacing between direct blocks of `lr-prose` and `lr-typography`; the space before an `lr-typography` heading is twice this value |
243
+ | `--lr-prose-quote-padding` | `--lr-space-l`; logical quote inset in `lr-prose` and `lr-typography` |
244
+ | `--lr-prose-quote-border-width` | `--lr-border-width-thick` in `lr-prose`, `--lr-border-width-medium` in `lr-typography`; logical quote edge |
245
+ | `--lr-heading-letter-spacing` | `--lr-theme-heading-letter-spacing`, then `normal`; heading tracking for `lr-heading-1`–`4` and `lr-typography` headings |
246
+ | `--lr-theme-heading-letter-spacing` | unset; theme input for heading tracking (no resolved `--lr-*` token); `looks/shadcn.css` sets it |
247
+ | `--lr-visually-hidden-size` | `--lr-size-1px` (1px); retained hidden box size |
248
+ | `--lr-native-link-decoration-width` | `--lr-border-width-thin`; resting underline thickness |
249
+ | `--lr-native-link-underline-offset` | `--lr-space-2xs`; underline offset |
250
+ | `--lr-native-link-hover-decoration-width` | `--lr-border-width-medium`; hovered underline thickness |
251
+ | `--lr-native-pre-padding` | `--lr-space-m`; preformatted block padding |
252
+ | `--lr-native-tab-size` | `2`; preformatted tab width |
253
+ | `--lr-native-quote-padding` | `--lr-space-l`; native blockquote logical inset |
254
+ | `--lr-native-quote-border-width` | `--lr-border-width-thick`; native blockquote logical edge |
255
+ | `--lr-native-control-min-block-size` | `--lr-icon-button-size`; native control hit-area floor |
256
+ | `--lr-native-control-padding-block` | `--lr-space-s`; native control block padding |
257
+ | `--lr-native-control-padding-inline` | `--lr-space-m`; native control inline padding |
258
+ | `--lr-native-placeholder-opacity` | `1`; native input/textarea placeholder opacity |
259
+ | `--lr-native-summary-min-block-size` | `--lr-icon-button-size`; native summary hit-area floor |
260
+ | `--lr-native-fieldset-padding` | `--lr-space-l`; fieldset padding |
261
+ | `--lr-native-legend-padding` | `--lr-space-xs`; legend inline padding |
262
+ | `--lr-native-table-cell-padding` | `--lr-space-s`; caption and table-cell padding |
263
+ | `--lr-native-rule-space` | `--lr-space-l`; horizontal-rule block margin |