@aceshooting/lyra-ui 23.0.0 → 24.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.
- package/CHANGELOG.md +16 -39
- package/README.md +72 -35
- package/custom-elements.json +1 -1
- package/design-tokens.json +1 -1
- package/dist/cli/lyra-rename-ledger.mjs +1 -1
- package/dist/cli/migration-contract.json +1 -1
- package/dist/cli/migration-contract.mjs +1 -1
- package/dist/cli/migration-renames.mjs +2 -2
- package/dist/cli/migration-transforms.mjs +2 -2
- package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +1 -4
- package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -3
- package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +1 -4
- package/dist/components/agent-tools/compare-panel/compare-panel.class.js +1 -1
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +1 -7
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
- package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts +1 -1
- package/dist/components/agent-tools/evaluation-run/evaluation-run.class.d.ts +2 -5
- package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +1 -3
- package/dist/components/agent-tools/terminal/terminal.class.d.ts +1 -4
- package/dist/components/agent-tools/terminal/terminal.class.js +2 -2
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts +1 -7
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +1 -1
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +1 -4
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -3
- package/dist/components/charts/chart/lite-chart-axis-layout.d.ts +13 -0
- package/dist/components/charts/chart/lite-chart-axis-layout.js +1 -0
- package/dist/components/charts/chart/lite-chart.class.d.ts +1 -11
- package/dist/components/charts/chart/lite-chart.class.js +4 -4
- package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +13 -3
- package/dist/components/conversation/agent-workspace/agent-workspace.class.js +1 -2
- package/dist/components/conversation/chat-message/chat-message.class.d.ts +3 -9
- package/dist/components/conversation/chat-message/chat-message.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-core.class.d.ts +6 -8
- package/dist/components/conversation/code-block/code-block-shared.d.ts +1 -4
- package/dist/components/conversation/code-block/code-block.class.d.ts +4 -6
- package/dist/components/conversation/markdown/markdown-base.class.d.ts +1 -3
- package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
- package/dist/components/conversation/markdown/markdown-core.class.d.ts +1 -4
- package/dist/components/conversation/markdown/markdown.class.d.ts +1 -4
- package/dist/components/conversation/message-actions/message-actions.class.d.ts +1 -4
- package/dist/components/conversation/message-actions/message-actions.class.js +1 -1
- package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +1 -4
- package/dist/components/conversation/message-feedback/message-feedback.class.js +2 -2
- package/dist/components/conversation/message-parts/message-parts.class.d.ts +2 -5
- package/dist/components/conversation/message-parts/message-parts.class.js +3 -3
- package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +1 -1
- package/dist/components/conversation/streaming-text/streaming-text-core.class.d.ts +2 -0
- package/dist/components/conversation/streaming-text/streaming-text-core.class.js +0 -1
- package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +2 -0
- package/dist/components/conversation/streaming-text/streaming-text.class.js +0 -1
- package/dist/components/conversation/thread-list/thread-list.class.d.ts +6 -17
- package/dist/components/conversation/thread-list/thread-list.class.js +6 -6
- package/dist/components/data/context-meter/context-meter.class.d.ts +1 -6
- package/dist/components/data/context-meter/context-meter.class.js +1 -1
- package/dist/components/data/data-grid/data-grid.class.d.ts +0 -1
- package/dist/components/data/data-grid/data-grid.class.js +2 -2
- package/dist/components/data/document-library/document-library.class.d.ts +6 -13
- package/dist/components/data/document-library/document-library.class.js +1 -2
- package/dist/components/data/heatmap/heatmap-grid-navigation.d.ts +7 -0
- package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -0
- package/dist/components/data/heatmap/heatmap.class.d.ts +3 -23
- package/dist/components/data/heatmap/heatmap.class.js +2 -2
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +3 -9
- package/dist/components/data/sequence-strip/sequence-strip.class.js +3 -3
- package/dist/components/data/table/table.class.d.ts +5 -14
- package/dist/components/data/table/table.class.js +6 -6
- package/dist/components/forms/button/button.class.d.ts +2 -2
- package/dist/components/forms/button/button.class.js +9 -9
- package/dist/components/forms/combobox/combobox.class.d.ts +1 -4
- package/dist/components/forms/combobox/combobox.class.js +2 -2
- package/dist/components/forms/input/time-input.class.d.ts +1 -1
- package/dist/components/forms/input/time-input.class.js +1 -1
- package/dist/components/forms/select/select.class.d.ts +1 -2
- package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +3 -1
- package/dist/components/forms/swatch-picker/swatch-picker.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail-item.class.d.ts +3 -6
- package/dist/components/layout/app-rail/app-rail-item.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail.class.d.ts +2 -4
- package/dist/components/layout/app-rail/app-rail.class.js +1 -1
- package/dist/components/layout/app-rail-group/app-rail-group.class.d.ts +2 -6
- package/dist/components/layout/app-rail-group/app-rail-group.class.js +1 -1
- package/dist/components/layout/carousel/carousel.class.d.ts +1 -4
- package/dist/components/layout/carousel/carousel.class.js +2 -2
- package/dist/components/layout/command-palette/command-palette.class.js +1 -1
- package/dist/components/layout/details/details.class.d.ts +2 -4
- package/dist/components/layout/details/details.class.js +1 -1
- package/dist/components/layout/dock-panel/dock-panel.class.d.ts +3 -7
- package/dist/components/layout/dock-panel/dock-panel.class.js +1 -1
- package/dist/components/layout/menu/menu.class.js +1 -1
- package/dist/components/layout/multi-split/multi-split.class.d.ts +2 -4
- package/dist/components/layout/multi-split/multi-split.class.js +1 -1
- package/dist/components/layout/navigation-menu-item/navigation-menu-item.class.d.ts +2 -4
- package/dist/components/layout/navigation-menu-item/navigation-menu-item.class.js +1 -1
- package/dist/components/layout/reorder-list/reorder-item.class.d.ts +1 -4
- package/dist/components/layout/reorder-list/reorder-item.class.js +2 -2
- package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts +5 -9
- package/dist/components/media/attachment-trigger/attachment-trigger.class.js +5 -5
- package/dist/components/media/av-player/av-player.class.js +3 -3
- package/dist/components/media/file-input/file-input.class.d.ts +3 -6
- package/dist/components/media/file-input/file-input.class.js +3 -3
- package/dist/components/media/lightbox/lightbox.class.d.ts +11 -20
- package/dist/components/media/lightbox/lightbox.class.js +1 -1
- package/dist/components/media/map/map-data-layers.d.ts +20 -0
- package/dist/components/media/map/map-data-layers.js +1 -0
- package/dist/components/media/map/map.class.js +3 -3
- package/dist/components/media/media-time.d.ts +2 -0
- package/dist/components/media/media-time.js +1 -0
- package/dist/components/media/video/video.class.js +5 -5
- package/dist/components/media/video-playlist/video-playlist.class.js +2 -2
- package/dist/components/overlays/callout/callout.class.d.ts +2 -5
- package/dist/components/overlays/callout/callout.class.js +2 -2
- package/dist/components/overlays/dialog/dialog.class.d.ts +4 -7
- package/dist/components/overlays/dialog/dialog.class.js +2 -2
- package/dist/components/overlays/overlay/dropdown.class.d.ts +5 -10
- package/dist/components/overlays/overlay/dropdown.class.js +2 -2
- package/dist/components/overlays/overlay/popover.class.d.ts +2 -3
- package/dist/components/overlays/popup/popup.class.js +1 -1
- package/dist/components/overlays/progress/progress-bar.class.d.ts +1 -4
- package/dist/components/overlays/progress/progress-bar.class.js +2 -2
- package/dist/components/overlays/progress/progress-ring.class.d.ts +1 -4
- package/dist/components/overlays/progress/progress-ring.class.js +2 -2
- package/dist/components/overlays/progress/progress-shared.d.ts +3 -3
- package/dist/components/overlays/progress/progress-shared.js +1 -1
- package/dist/components/overlays/toast/toast-item.class.js +1 -1
- package/dist/components/retrieval/graph/graph.class.d.ts +5 -10
- package/dist/components/retrieval/graph/graph.class.js +1 -1
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +7 -14
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +2 -3
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +2 -8
- package/dist/components/retrieval/memory-panel/memory-panel.class.js +0 -4
- package/dist/components/retrieval/rag-answer/rag-answer.class.js +1 -1
- package/dist/components/utility/export-button/export-button.class.d.ts +6 -10
- package/dist/components/utility/export-button/export-button.class.js +1 -1
- package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
- package/dist/components/viewers/geojson-view/geojson-view.class.d.ts +1 -1
- package/dist/components/viewers/highlight-layer/highlight-layer-timing.js +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +4 -4
- package/dist/events.d.ts +17 -78
- package/dist/framework-types.d.ts +1 -1
- package/dist/internal/catalog-picker.js +1 -1
- package/dist/internal/css-motion-time.d.ts +7 -0
- package/dist/internal/css-motion-time.js +1 -0
- package/dist/internal/data-state-renderer.d.ts +1 -3
- package/dist/internal/data-state-renderer.js +1 -1
- package/dist/internal/localization-runtime.d.ts +2 -0
- package/dist/internal/localization-runtime.js +1 -1
- package/dist/internal/lyra-element.js +2 -2
- package/dist/internal/package-metadata.d.ts +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/looks/data.css +1 -1
- package/dist/looks/terminal.css +1 -1
- package/dist/lyra.d.ts +1 -592
- package/dist/lyra.js +1 -1
- package/dist/testing/event-factory.d.ts +2 -2
- package/dist/testing/interaction-drivers.d.ts +5 -3
- package/dist/testing/lyra-tag-event-map.js +1 -1
- package/dist/theme/looks/data.d.ts +1 -1
- package/dist/theme/looks/data.js +1 -1
- package/dist/theme/looks/terminal.d.ts +1 -1
- package/dist/theme/looks/terminal.js +1 -1
- package/dist/theme/theme.d.ts +2 -80
- package/dist/theme/theme.js +1 -1
- package/llms/components/lr-agent-workspace.md +24 -2
- package/llms/components/lr-alert.md +1 -1
- package/llms/components/lr-animation.md +1 -1
- package/llms/components/lr-app-rail.md +8 -10
- package/llms/components/lr-approval-queue.md +2 -4
- package/llms/components/lr-attachment-trigger.md +3 -4
- package/llms/components/lr-badge.md +2 -2
- package/llms/components/lr-button.md +45 -99
- package/llms/components/lr-callout.md +3 -4
- package/llms/components/lr-carousel.md +3 -5
- package/llms/components/lr-chat-message.md +1 -2
- package/llms/components/lr-claim-evidence.md +1 -1
- package/llms/components/lr-code-block-core.md +2 -2
- package/llms/components/lr-code-block.md +5 -6
- package/llms/components/lr-color-picker.md +1 -1
- package/llms/components/lr-combobox.md +5 -6
- package/llms/components/lr-compare-panel.md +2 -4
- package/llms/components/lr-confirm-bar.md +3 -7
- package/llms/components/lr-context-inspector.md +3 -2
- package/llms/components/lr-context-menu.md +2 -2
- package/llms/components/lr-context-meter.md +2 -4
- package/llms/components/lr-copy-button.md +1 -1
- package/llms/components/lr-data-grid.md +4 -7
- package/llms/components/lr-details.md +3 -3
- package/llms/components/lr-dialog.md +4 -6
- package/llms/components/lr-dock-panel.md +5 -6
- package/llms/components/lr-document-library.md +5 -7
- package/llms/components/lr-drawer.md +3 -3
- package/llms/components/lr-dropdown.md +4 -5
- package/llms/components/lr-eval-run.md +3 -5
- package/llms/components/lr-export-button.md +4 -7
- package/llms/components/lr-file-input.md +0 -5
- package/llms/components/lr-funnel.md +1 -1
- package/llms/components/lr-graph.md +3 -7
- package/llms/components/lr-icon.md +1 -1
- package/llms/components/lr-include.md +1 -1
- package/llms/components/lr-input.md +31 -79
- package/llms/components/lr-json-viewer.md +1 -1
- package/llms/components/lr-knowledge-base.md +4 -6
- package/llms/components/lr-knowledge-graph-explorer.md +2 -5
- package/llms/components/lr-known-date.md +1 -1
- package/llms/components/lr-lightbox.md +9 -7
- package/llms/components/lr-lite-chart.md +1 -5
- package/llms/components/lr-markdown-core.md +3 -4
- package/llms/components/lr-markdown.md +3 -5
- package/llms/components/lr-mcp-app.md +1 -1
- package/llms/components/lr-message-actions.md +2 -3
- package/llms/components/lr-message-feedback.md +1 -3
- package/llms/components/lr-message-parts.md +4 -5
- package/llms/components/lr-multi-split.md +8 -7
- package/llms/components/lr-native-time-input.md +1 -1
- package/llms/components/lr-navigation-menu.md +5 -5
- package/llms/components/lr-number-input.md +3 -1
- package/llms/components/lr-otp-input.md +2 -0
- package/llms/components/lr-page.md +1 -1
- package/llms/components/lr-pan-zoom.md +1 -1
- package/llms/components/lr-phone-input.md +3 -1
- package/llms/components/lr-popover.md +2 -2
- package/llms/components/lr-progress-bar.md +3 -5
- package/llms/components/lr-progress-ring.md +5 -7
- package/llms/components/lr-prompt-input.md +1 -1
- package/llms/components/lr-prompt-queue.md +1 -1
- package/llms/components/lr-prompt-studio.md +1 -1
- package/llms/components/lr-rag-eval-dashboard.md +1 -1
- package/llms/components/lr-rating.md +2 -2
- package/llms/components/lr-realtime-session.md +1 -1
- package/llms/components/lr-reorder-item.md +1 -1
- package/llms/components/lr-reorder-list.md +2 -3
- package/llms/components/lr-retrieval-compare.md +1 -1
- package/llms/components/lr-select.md +3 -1
- package/llms/components/lr-selection-toolbar.md +1 -1
- package/llms/components/lr-sequence-strip.md +3 -8
- package/llms/components/lr-span-waterfall.md +1 -1
- package/llms/components/lr-split-panel.md +1 -1
- package/llms/components/lr-streaming-text-core.md +2 -1
- package/llms/components/lr-streaming-text.md +3 -2
- package/llms/components/lr-subagent-panel.md +1 -1
- package/llms/components/lr-swatch-picker.md +7 -6
- package/llms/components/lr-switch.md +3 -1
- package/llms/components/lr-table.md +33 -85
- package/llms/components/lr-terminal.md +2 -5
- package/llms/components/lr-textarea.md +1 -1
- package/llms/components/lr-thread-list.md +8 -14
- package/llms/components/lr-time-input.md +1 -1
- package/llms/components/lr-toggle-group.md +2 -2
- package/llms/components/lr-toggle.md +1 -1
- package/llms/components/lr-tool-approval-dialog.md +4 -7
- package/llms/components/lr-tool-call-block.md +1 -1
- package/llms/components/lr-tool-timeline.md +2 -5
- package/llms/components/lr-video-playlist.md +1 -1
- package/llms/components/lr-video.md +1 -1
- package/llms/components/lr-widget-renderer.md +7 -6
- package/llms/components/lr-zoomable-frame.md +1 -1
- package/llms/index.md +3 -618
- package/llms/migration.md +614 -614
- package/llms/shared/events-and-types.md +32 -31
- package/llms/shared/frameworks-and-ssr.md +7 -3
- package/llms/shared/imports-and-registration.md +22 -22
- package/llms/shared/localization-and-rtl.md +2 -2
- package/llms/shared/native-styles-and-utilities.md +263 -0
- package/llms/shared/styles-and-tokens.md +85 -676
- package/llms/shared/testing-and-utilities.md +12 -11
- package/llms/shared/v23-to-v24-migration.md +167 -0
- package/llms/shared.md +149 -494
- package/llms/tokens.md +3 -3
- package/llms.txt +9 -4
- package/package.json +7 -311
- package/registrations.json +1 -1
- package/vscode-html-data.json +1 -1
- package/web-types.json +1 -1
- package/dist/ssr-loader.d.ts +0 -2
- package/dist/ssr-loader.js +0 -1
- package/dist/theme/presets/shadcn.d.ts +0 -22
- package/dist/theme/presets/shadcn.js +0 -1
- package/dist/theme/presets.d.ts +0 -49
- package/dist/theme/presets.js +0 -1
- 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.
|
|
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 event-detail compatibility fields removed 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
|
|
@@ -31,7 +36,7 @@ through `@aceshooting/lyra-ui/events` for listeners on an ancestor, `document` o
|
|
|
31
36
|
```ts
|
|
32
37
|
import { LyraTable } from "@aceshooting/lyra-ui/components/data/table/table.class.js";
|
|
33
38
|
const table = document.querySelector("lr-table") as LyraTable;
|
|
34
|
-
table.addEventListener("lr-sort", (event) => event.detail.
|
|
39
|
+
table.addEventListener("lr-sort", (event) => event.detail.sortKey); // typed
|
|
35
40
|
```
|
|
36
41
|
- **`HTMLElementTagNameMap`** is augmented in the `.class.d.ts` files. `document.querySelector('lr-table')`
|
|
37
42
|
is only typed as `LyraTable` when that class module is in the type graph — importing just the
|
|
@@ -70,13 +75,13 @@ through `@aceshooting/lyra-ui/events` for listeners on an ancestor, `document` o
|
|
|
70
75
|
`LyraGlobalEventMap` is exported as well, for writing your own typed helper over it.
|
|
71
76
|
|
|
72
77
|
- **The surface is per-event type aliases, not runtime event classes.** `LyraSortEvent` and its
|
|
73
|
-
generated siblings are `type` aliases over
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
listener would cost every consumer runtime bytes for
|
|
77
|
-
costs zero.
|
|
78
|
+
generated siblings are `type` aliases over component event-map entries. `LyraSortEvent` unions
|
|
79
|
+
the `lr-sort` entries for document-library, eval-dataset and table. These aliases have no runtime
|
|
80
|
+
constructor and cannot be used with `new` or `instanceof`. The module compiles to `export {};`:
|
|
81
|
+
shipping runtime event subclasses to type a listener would cost every consumer runtime bytes for
|
|
82
|
+
a compile-time concern, so it deliberately costs zero.
|
|
78
83
|
- **A shared event name narrows to the union of its dispatchers.** One name can come from several
|
|
79
|
-
components with different details
|
|
84
|
+
components with different details, such as `lr-select` and `lr-selection-change`, so
|
|
80
85
|
its global entry is the _union_ of their entries, and `event.detail` there exposes only what all
|
|
81
86
|
of them share. Index the owning component's own map when you need one component's exact detail:
|
|
82
87
|
|
|
@@ -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(
|
|
1603
|
-
`getLyraTheme(): unknown`
|
|
1595
|
+
`createLyraThemeBootstrap(options?: LyraThemeBootstrapOptions): string`
|
|
1604
1596
|
`LyraThemeBootstrapOptions {
|
|
1605
|
-
storageKey
|
|
1606
|
-
}`
|
|
1607
|
-
`
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
`
|
|
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
|
|
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
|
|
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/
|
|
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
|
|
64
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
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
|
-
|
|
133
|
-
component
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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/
|
|
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/
|
|
190
|
-
[The shadcn look](./styles-and-tokens.md#the-shadcn-look--
|
|
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
|
|
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
|
|
65
|
-
|
|
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 |
|