@aceshooting/lyra-ui 9.1.1 → 11.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.
- package/CHANGELOG.md +785 -0
- package/custom-elements.json +1 -1
- package/design-tokens.json +13 -0
- package/dist/cli/migrate-wa.mjs +216 -1
- package/dist/cli/migration-contract.json +1 -1
- package/dist/components/agent-tools/activity-feed/activity-feed.class.js +1 -1
- package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +0 -16
- package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js +1 -1
- package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js +7 -5
- package/dist/components/agent-tools/agent-run/agent-run.class.js +2 -2
- package/dist/components/agent-tools/agent-run/agent-run.styles.js +0 -13
- package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +7 -4
- package/dist/components/agent-tools/approval-queue/approval-queue.styles.js +7 -5
- package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +0 -3
- package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +3 -5
- package/dist/components/agent-tools/commit-card/commit-card.styles.js +0 -10
- package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +11 -6
- package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js +0 -46
- package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js +0 -7
- package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +2 -2
- package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.js +0 -15
- package/dist/components/agent-tools/result-card/result-card.styles.js +0 -7
- package/dist/components/agent-tools/result-card/result-field.styles.js +0 -5
- package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js +0 -3
- package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +0 -15
- package/dist/components/agent-tools/stack-trace/stack-trace.styles.js +0 -20
- package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +2 -2
- package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +0 -3
- package/dist/components/agent-tools/task-list/task-list.styles.js +0 -15
- package/dist/components/agent-tools/terminal/terminal.class.d.ts +11 -6
- package/dist/components/agent-tools/terminal/terminal.class.js +4 -4
- package/dist/components/agent-tools/terminal/terminal.styles.js +0 -46
- package/dist/components/agent-tools/test-results/test-results.class.js +2 -2
- package/dist/components/agent-tools/test-results/test-results.styles.js +0 -5
- package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +0 -41
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.js +0 -41
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.styles.js +0 -30
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +6 -6
- package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js +0 -5
- package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.styles.js +0 -20
- package/dist/components/agent-tools/tool-result-view/tool-result-view.styles.js +0 -4
- package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.js +0 -21
- package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +7 -31
- package/dist/components/charts/chart/box-plot.class.d.ts +27 -0
- package/dist/components/charts/chart/box-plot.class.js +14 -4
- package/dist/components/charts/chart/box-plot.styles.js +28 -20
- package/dist/components/charts/chart/chart-colors.d.ts +1 -1
- package/dist/components/charts/chart/chart-colors.js +1 -1
- package/dist/components/charts/chart/chart-core-loader.d.ts +1 -0
- package/dist/components/charts/chart/chart-core-loader.js +1 -1
- package/dist/components/charts/chart/chart-feature-loader.d.ts +35 -0
- package/dist/components/charts/chart/chart-feature-loader.js +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +120 -0
- package/dist/components/charts/chart/chart.class.js +16 -6
- package/dist/components/charts/chart/chart.styles.js +28 -27
- package/dist/components/charts/chart/lite-chart.class.d.ts +20 -1
- package/dist/components/charts/chart/lite-chart.class.js +4 -4
- package/dist/components/charts/chart/lite-chart.styles.js +0 -27
- package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +20 -0
- package/dist/components/conversation/agent-workspace/agent-workspace.class.js +3 -1
- package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +3 -0
- package/dist/components/conversation/audio-visualizer/audio-visualizer.styles.js +0 -7
- package/dist/components/conversation/branch-picker/branch-picker.styles.js +0 -3
- package/dist/components/conversation/chat-composer/chat-composer.styles.js +0 -51
- package/dist/components/conversation/chat-message/chat-message.styles.js +7 -35
- package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
- package/dist/components/conversation/chat-viewport/chat-viewport.styles.js +0 -33
- package/dist/components/conversation/checkpoint/checkpoint.class.js +1 -1
- package/dist/components/conversation/checkpoint/checkpoint.styles.js +0 -3
- package/dist/components/conversation/code-block/code-block-shared.d.ts +5 -2
- package/dist/components/conversation/code-block/code-block.class.js +1 -1
- package/dist/components/conversation/code-block/code-block.styles.js +4 -95
- package/dist/components/conversation/code-block/code-loader.d.ts +11 -0
- package/dist/components/conversation/code-block/code-loader.js +1 -1
- package/dist/components/conversation/code-block/shiki-types.d.ts +12 -0
- package/dist/components/conversation/code-block/shiki-types.js +1 -1
- package/dist/components/conversation/conversation-item/conversation-item.styles.js +8 -54
- package/dist/components/conversation/generation-metrics/generation-metrics.class.js +2 -2
- package/dist/components/conversation/generation-metrics/generation-metrics.styles.js +0 -17
- package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
- package/dist/components/conversation/markdown/markdown.styles.js +0 -41
- package/dist/components/conversation/message-actions/message-actions.styles.js +0 -3
- package/dist/components/conversation/message-feedback/message-feedback.styles.js +0 -35
- package/dist/components/conversation/message-parts/message-parts.class.d.ts +1 -1
- package/dist/components/conversation/message-parts/message-parts.styles.js +0 -5
- package/dist/components/conversation/model-select/model-select.class.js +3 -3
- package/dist/components/conversation/model-select/model-select.styles.js +12 -47
- package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +0 -6
- package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -0
- package/dist/components/conversation/prompt-input/prompt-input.styles.js +0 -10
- package/dist/components/conversation/push-to-talk/push-to-talk.styles.js +0 -8
- package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.js +1 -11
- package/dist/components/conversation/stream-status/stream-status.styles.js +0 -16
- package/dist/components/conversation/streaming-text/streaming-text.styles.js +0 -15
- package/dist/components/conversation/suggestion-chips/suggestion-chips.styles.js +0 -5
- package/dist/components/conversation/thread-list/thread-list.styles.js +0 -23
- package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +16 -4
- package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
- package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +0 -1
- package/dist/components/conversation/typing-indicator/typing-indicator.styles.js +0 -23
- package/dist/components/conversation/usage-badge/usage-badge.styles.js +0 -3
- package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -3
- package/dist/components/conversation/voice-picker/voice-picker.styles.js +9 -29
- package/dist/components/conversation/widget-renderer/resolve.d.ts +2 -0
- package/dist/components/conversation/widget-renderer/resolve.js +1 -1
- package/dist/components/data/calendar/calendar.class.d.ts +15 -2
- package/dist/components/data/calendar/calendar.class.js +2 -2
- package/dist/components/data/calendar/calendar.styles.js +2 -28
- package/dist/components/data/condition-builder/condition-builder.class.d.ts +10 -6
- package/dist/components/data/condition-builder/condition-builder.class.js +2 -2
- package/dist/components/data/condition-builder/condition-builder.styles.js +0 -6
- package/dist/components/data/context-meter/context-meter.styles.js +0 -24
- package/dist/components/data/data-grid/data-grid.class.js +3 -3
- package/dist/components/data/data-grid/data-grid.styles.js +0 -22
- package/dist/components/data/document-library/document-library.class.js +2 -2
- package/dist/components/data/document-library/document-library.styles.js +0 -4
- package/dist/components/data/env-list/env-list.class.js +1 -1
- package/dist/components/data/env-list/env-list.styles.js +7 -4
- package/dist/components/data/file-tree/file-tree.class.d.ts +12 -0
- package/dist/components/data/flow-canvas/flow-canvas.styles.js +12 -19
- package/dist/components/data/flow-controls/flow-controls.class.js +2 -2
- package/dist/components/data/flow-controls/flow-controls.styles.js +3 -36
- package/dist/components/data/flow-minimap/flow-minimap.class.js +1 -1
- package/dist/components/data/flow-minimap/flow-minimap.styles.js +0 -9
- package/dist/components/data/flow-node/flow-node.styles.js +0 -23
- package/dist/components/data/flow-run-status/flow-run-status.class.js +1 -1
- package/dist/components/data/flow-run-status/flow-run-status.styles.js +0 -7
- package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +0 -7
- package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
- package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +0 -10
- package/dist/components/data/heatmap/heatmap-scale.d.ts +20 -0
- package/dist/components/data/heatmap/heatmap-scale.js +1 -1
- package/dist/components/data/heatmap/heatmap.class.d.ts +117 -1
- package/dist/components/data/heatmap/heatmap.class.js +2 -2
- package/dist/components/data/heatmap/heatmap.styles.js +0 -54
- package/dist/components/data/pagination/pagination.styles.js +23 -46
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +34 -1
- package/dist/components/data/sequence-strip/sequence-strip.class.js +5 -2
- package/dist/components/data/sequence-strip/sequence-strip.styles.js +14 -20
- package/dist/components/data/sparkline/sparkline.class.js +1 -1
- package/dist/components/data/stat/stat.styles.js +0 -67
- package/dist/components/data/table/table.class.d.ts +42 -3
- package/dist/components/data/table/table.class.js +4 -4
- package/dist/components/data/table/table.styles.js +20 -91
- package/dist/components/data/timeline/timeline-item.styles.js +0 -30
- package/dist/components/data/timeline/timeline.class.d.ts +89 -1
- package/dist/components/data/timeline/timeline.class.js +2 -2
- package/dist/components/data/timeline/timeline.styles.js +111 -31
- package/dist/components/data/tree/tree-item.styles.js +1 -28
- package/dist/components/data/tree/tree.class.js +2 -2
- package/dist/components/data/tree/tree.styles.js +0 -6
- package/dist/components/data/word-cloud/word-cloud.styles.js +0 -5
- package/dist/components/forms/button/button.class.js +1 -1
- package/dist/components/forms/button/button.styles.js +0 -105
- package/dist/components/forms/checkbox/checkbox.class.d.ts +3 -0
- package/dist/components/forms/checkbox/checkbox.class.js +1 -1
- package/dist/components/forms/checkbox/checkbox.styles.js +0 -39
- package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +21 -2
- package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
- package/dist/components/forms/checkbox-group/checkbox-group.styles.js +0 -18
- package/dist/components/forms/code-editor/code-editor.styles.js +0 -30
- package/dist/components/forms/color-picker/color-picker.class.js +2 -2
- package/dist/components/forms/color-picker/color-picker.styles.js +0 -69
- package/dist/components/forms/combobox/combobox.class.d.ts +71 -3
- package/dist/components/forms/combobox/combobox.class.js +5 -3
- package/dist/components/forms/combobox/combobox.styles.js +31 -111
- package/dist/components/forms/combobox/option.styles.js +7 -1
- package/dist/components/forms/date-picker/date-input.class.js +1 -1
- package/dist/components/forms/date-picker/date-input.styles.js +12 -67
- package/dist/components/forms/date-picker/date-picker.class.d.ts +47 -0
- package/dist/components/forms/date-picker/date-picker.class.js +36 -22
- package/dist/components/forms/date-picker/date-picker.styles.js +82 -29
- package/dist/components/forms/emoji-picker/emoji-data-loader.d.ts +6 -3
- package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +8 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.js +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.styles.js +3 -41
- package/dist/components/forms/icon-button/icon-button.class.js +1 -1
- package/dist/components/forms/icon-button/icon-button.styles.js +0 -16
- package/dist/components/forms/input/input.styles.js +0 -54
- package/dist/components/forms/input/number-input.styles.d.ts +4 -5
- package/dist/components/forms/input/number-input.styles.js +0 -11
- package/dist/components/forms/input/time-input-shared.d.ts +11 -0
- package/dist/components/forms/input/time-input-shared.js +1 -1
- package/dist/components/forms/input/time-input.class.d.ts +11 -2
- package/dist/components/forms/input/time-input.class.js +1 -1
- package/dist/components/forms/input/time-input.styles.js +0 -6
- package/dist/components/forms/locale-picker/locale-picker.class.js +2 -2
- package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -26
- package/dist/components/forms/otp-input/otp-input.class.js +3 -3
- package/dist/components/forms/otp-input/otp-input.styles.js +0 -16
- package/dist/components/forms/phone-input/phone-input.class.d.ts +9 -1
- package/dist/components/forms/phone-input/phone-input.class.js +2 -2
- package/dist/components/forms/phone-input/phone-input.styles.js +0 -37
- package/dist/components/forms/radio/radio-button.styles.js +1 -30
- package/dist/components/forms/radio/radio-group.styles.js +0 -4
- package/dist/components/forms/radio/radio.styles.js +0 -44
- package/dist/components/forms/rubric-form/rubric-form.styles.js +0 -5
- package/dist/components/forms/select/select.class.js +1 -1
- package/dist/components/forms/select/select.styles.js +14 -114
- package/dist/components/forms/slider/slider.styles.js +0 -55
- package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +0 -11
- package/dist/components/forms/swatch-picker/swatch-picker.class.js +2 -2
- package/dist/components/forms/swatch-picker/swatch-picker.styles.js +0 -77
- package/dist/components/forms/switch/switch.class.d.ts +3 -0
- package/dist/components/forms/switch/switch.class.js +1 -1
- package/dist/components/forms/switch/switch.styles.js +0 -37
- package/dist/components/forms/textarea/textarea.styles.js +0 -28
- package/dist/components/forms/time-range/time-range.styles.js +12 -84
- package/dist/components/forms/token-input/token-input.class.d.ts +23 -9
- package/dist/components/forms/token-input/token-input.class.js +1 -1
- package/dist/components/forms/token-input/token-input.styles.js +1 -54
- package/dist/components/layout/app-rail/app-rail-item.class.js +2 -2
- package/dist/components/layout/app-rail/app-rail-item.styles.js +0 -13
- package/dist/components/layout/app-rail/app-rail.class.d.ts +5 -0
- package/dist/components/layout/app-rail/app-rail.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail.styles.js +0 -46
- package/dist/components/layout/button-group/button-group.styles.js +0 -6
- package/dist/components/layout/card/card.class.d.ts +12 -0
- package/dist/components/layout/card/card.styles.js +3 -11
- package/dist/components/layout/carousel/carousel.styles.js +0 -1
- package/dist/components/layout/command-palette/command-palette.class.d.ts +8 -0
- package/dist/components/layout/command-palette/command-palette.class.js +3 -1
- package/dist/components/layout/command-palette/command-palette.styles.js +1 -13
- package/dist/components/layout/control-group/control-group.styles.js +0 -7
- package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +6 -25
- package/dist/components/layout/details/accordion.class.d.ts +13 -0
- package/dist/components/layout/details/accordion.class.js +1 -1
- package/dist/components/layout/details/details.class.js +1 -1
- package/dist/components/layout/details/details.styles.js +0 -12
- package/dist/components/layout/dock-panel/dock-panel.styles.js +0 -45
- package/dist/components/layout/drilldown-panel/drilldown-panel.class.d.ts +2 -0
- package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +2 -2
- package/dist/components/layout/drilldown-panel/drilldown-panel.styles.js +0 -4
- package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
- package/dist/components/layout/filter-bar/filter-bar.styles.js +0 -9
- package/dist/components/layout/menu/menu-item.class.d.ts +5 -0
- package/dist/components/layout/menu/menu-item.class.js +1 -1
- package/dist/components/layout/menu/menu-item.styles.js +0 -49
- package/dist/components/layout/menu/menu-label.styles.js +0 -2
- package/dist/components/layout/menu/menu.styles.js +0 -18
- package/dist/components/layout/multi-split/multi-split.styles.js +0 -63
- package/dist/components/layout/page/page.class.d.ts +4 -0
- package/dist/components/layout/page/page.class.js +1 -1
- package/dist/components/layout/reorder-list/reorder-item.styles.js +0 -4
- package/dist/components/layout/responsive-panel/responsive-panel.styles.js +0 -27
- package/dist/components/layout/scroller/scroller.styles.js +0 -20
- package/dist/components/layout/segmented/segmented.class.d.ts +7 -1
- package/dist/components/layout/segmented/segmented.class.js +1 -1
- package/dist/components/layout/segmented/segmented.styles.js +69 -37
- package/dist/components/layout/split-panel/split-panel.styles.js +1 -7
- package/dist/components/layout/stepper/stepper.class.d.ts +8 -1
- package/dist/components/layout/stepper/stepper.class.js +1 -1
- package/dist/components/layout/stepper/stepper.styles.js +140 -41
- package/dist/components/layout/tab-group/tab-group.class.d.ts +4 -1
- package/dist/components/layout/tab-group/tab-group.styles.js +9 -75
- package/dist/components/layout/tab-group/tab.styles.js +0 -2
- package/dist/components/layout/virtual-list/virtual-list.class.d.ts +4 -4
- package/dist/components/layout/virtual-list/virtual-list.class.js +1 -1
- package/dist/components/layout/virtual-list/virtual-list.styles.js +0 -68
- package/dist/components/layout/widget/widget.class.d.ts +5 -1
- package/dist/components/layout/widget/widget.class.js +1 -1
- package/dist/components/layout/widget/widget.styles.js +97 -40
- package/dist/components/media/animated-image/animated-image.class.d.ts +3 -0
- package/dist/components/media/animated-image/animated-image.class.js +1 -1
- package/dist/components/media/animated-image/animated-image.styles.js +0 -28
- package/dist/components/media/attachment-chip/attachment-chip.class.d.ts +1 -1
- package/dist/components/media/attachment-chip/attachment-chip.class.js +1 -1
- package/dist/components/media/attachment-chip/attachment-chip.styles.js +0 -31
- package/dist/components/media/attachment-trigger/attachment-trigger.class.js +3 -3
- package/dist/components/media/attachment-trigger/attachment-trigger.styles.js +0 -40
- package/dist/components/media/av-player/av-player.class.d.ts +5 -6
- package/dist/components/media/av-player/av-player.class.js +1 -1
- package/dist/components/media/av-player/av-player.styles.js +0 -45
- package/dist/components/media/avatar/avatar.styles.js +3 -16
- package/dist/components/media/file-icon/file-icon.class.d.ts +1 -2
- package/dist/components/media/file-icon/file-icon.class.js +1 -1
- package/dist/components/media/file-input/file-input.class.d.ts +12 -0
- package/dist/components/media/file-input/file-input.styles.js +3 -24
- package/dist/components/media/flag/flag.class.d.ts +23 -1
- package/dist/components/media/flag/flag.class.js +4 -2
- package/dist/components/media/flag/flag.styles.js +7 -1
- package/dist/components/media/flag/language-map.d.ts +10 -0
- package/dist/components/media/flag/language-map.js +1 -1
- package/dist/components/media/image-comparer/image-comparer.styles.js +4 -33
- package/dist/components/media/image-viewer/image-viewer.class.js +0 -2
- package/dist/components/media/image-viewer/image-viewer.styles.js +7 -27
- package/dist/components/media/lightbox/lightbox.class.js +0 -2
- package/dist/components/media/lightbox/lightbox.styles.js +0 -21
- package/dist/components/media/map/map-loader.d.ts +19 -1
- package/dist/components/media/map/map-loader.js +1 -1
- package/dist/components/media/map/map.class.d.ts +178 -1
- package/dist/components/media/map/map.class.js +15 -3
- package/dist/components/media/map/map.styles.js +20 -17
- package/dist/components/media/media-card/media-card.class.d.ts +14 -3
- package/dist/components/media/media-card/media-card.class.js +1 -1
- package/dist/components/media/media-card/media-card.styles.js +2 -28
- package/dist/components/media/pan-zoom/pan-zoom.styles.js +0 -3
- package/dist/components/media/qr-code/qr-code.class.d.ts +3 -2
- package/dist/components/media/qr-code/qr-code.class.js +2 -2
- package/dist/components/media/qr-code/qr-code.styles.js +0 -3
- package/dist/components/media/sequence-playback/sequence-playback.class.d.ts +2 -0
- package/dist/components/media/sequence-playback/sequence-playback.class.js +2 -1
- package/dist/components/media/sequence-playback/sequence-playback.styles.js +0 -19
- package/dist/components/media/video/video.class.d.ts +23 -2
- package/dist/components/media/video/video.class.js +3 -3
- package/dist/components/media/video/video.styles.js +4 -2
- package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts +3 -2
- package/dist/components/media/zoomable-frame/zoomable-frame.class.js +2 -2
- package/dist/components/media/zoomable-frame/zoomable-frame.styles.js +0 -5
- package/dist/components/overlays/alert/alert.styles.js +4 -2
- package/dist/components/overlays/badge/badge.styles.js +4 -48
- package/dist/components/overlays/badge/tag.styles.js +0 -14
- package/dist/components/overlays/callout/callout.styles.js +0 -11
- package/dist/components/overlays/chip/chip-group.styles.js +0 -18
- package/dist/components/overlays/chip/chip.styles.js +6 -69
- package/dist/components/overlays/dialog/confirm.d.ts +1 -4
- package/dist/components/overlays/dialog/confirm.js +1 -1
- package/dist/components/overlays/dialog/dialog.class.d.ts +32 -9
- package/dist/components/overlays/dialog/dialog.class.js +1 -1
- package/dist/components/overlays/dialog/dialog.styles.js +0 -43
- package/dist/components/overlays/drawer/drawer.class.d.ts +2 -2
- package/dist/components/overlays/drawer/drawer.styles.js +0 -9
- package/dist/components/overlays/empty/empty.styles.js +0 -12
- package/dist/components/overlays/kbd/kbd.styles.js +0 -8
- package/dist/components/overlays/overlay/dropdown.class.d.ts +1 -6
- package/dist/components/overlays/overlay/dropdown.class.js +2 -2
- package/dist/components/overlays/overlay/overlay.styles.js +0 -28
- package/dist/components/overlays/overlay/popover.class.d.ts +28 -4
- package/dist/components/overlays/overlay/popover.class.js +2 -2
- package/dist/components/overlays/overlay/tooltip.class.d.ts +10 -0
- package/dist/components/overlays/overlay/tooltip.class.js +1 -1
- package/dist/components/overlays/popup/popup.class.d.ts +1 -0
- package/dist/components/overlays/popup/popup.class.js +1 -1
- package/dist/components/overlays/popup/popup.styles.js +0 -15
- package/dist/components/overlays/progress/progress-ring.class.d.ts +9 -1
- package/dist/components/overlays/progress/progress-ring.class.js +3 -3
- package/dist/components/overlays/progress/progress.styles.js +0 -21
- package/dist/components/overlays/rating/rating.styles.js +0 -25
- package/dist/components/overlays/skeleton/skeleton.styles.js +0 -4
- package/dist/components/overlays/spinner/spinner.styles.js +0 -3
- package/dist/components/overlays/toast/toast-item.styles.js +3 -45
- package/dist/components/retrieval/chunk-inspector/chunk-inspector.styles.js +0 -35
- package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +2 -2
- package/dist/components/retrieval/citation-badge/citation-badge.class.js +3 -3
- package/dist/components/retrieval/citation-badge/citation-badge.styles.js +0 -20
- package/dist/components/retrieval/claim-evidence/claim-evidence.styles.js +0 -8
- package/dist/components/retrieval/community-card/community-card.class.d.ts +1 -0
- package/dist/components/retrieval/community-card/community-card.styles.js +0 -6
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +8 -12
- package/dist/components/retrieval/entity-card/entity-card.class.d.ts +4 -3
- package/dist/components/retrieval/entity-card/entity-card.class.js +1 -1
- package/dist/components/retrieval/entity-card/entity-card.styles.js +0 -12
- package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +10 -4
- package/dist/components/retrieval/entity-chip/entity-chip.class.js +3 -3
- package/dist/components/retrieval/entity-chip/entity-chip.styles.js +6 -9
- package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts +19 -5
- package/dist/components/retrieval/graph/graph.class.d.ts +5 -0
- package/dist/components/retrieval/graph/graph.class.js +1 -1
- package/dist/components/retrieval/graph/graph.styles.js +0 -30
- package/dist/components/retrieval/graph-legend/graph-legend.styles.js +0 -3
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +0 -25
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +2 -0
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +0 -7
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +20 -6
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +2 -2
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +0 -16
- package/dist/components/retrieval/mind-map/mind-map.class.d.ts +5 -3
- package/dist/components/retrieval/mind-map/mind-map.class.js +1 -1
- package/dist/components/retrieval/mind-map/mind-map.styles.js +0 -2
- package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +3 -2
- package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +0 -30
- package/dist/components/retrieval/node-palette/node-palette.styles.js +0 -11
- package/dist/components/retrieval/path-strip/path-strip.styles.js +0 -10
- package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts +12 -3
- package/dist/components/retrieval/provenance-panel/provenance-panel.styles.js +0 -2
- package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +3 -2
- package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +2 -2
- package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +0 -28
- package/dist/components/retrieval/retrieval-search/retrieval-search.styles.js +0 -4
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.styles.js +0 -2
- package/dist/components/retrieval/source-card/source-card.styles.js +0 -13
- package/dist/components/retrieval/source-list/source-list.styles.js +0 -7
- package/dist/components/retrieval/source-picker/source-picker.styles.js +0 -7
- package/dist/components/utility/copy-button/copy-button.styles.js +0 -10
- package/dist/components/utility/diff-view/diff-view.styles.js +0 -14
- package/dist/components/utility/export-button/export-button.styles.js +0 -22
- package/dist/components/utility/icon/icon.styles.js +0 -6
- package/dist/components/utility/json-viewer/json-viewer.styles.js +2 -48
- package/dist/components/utility/known-date/known-date.class.d.ts +7 -3
- package/dist/components/utility/known-date/known-date.styles.js +10 -51
- package/dist/components/utility/live-region/live-region.styles.js +0 -4
- package/dist/components/utility/mention-popover/mention-popover.styles.js +0 -25
- package/dist/components/utility/poll-status/poll-status.styles.js +0 -4
- package/dist/components/utility/random-content/random-content.class.d.ts +22 -0
- package/dist/components/utility/random-content/random-content.class.js +3 -2
- package/dist/components/utility/random-content/random-content.styles.js +6 -13
- package/dist/components/utility/tour/tour.class.d.ts +4 -2
- package/dist/components/utility/tour/tour.class.js +3 -3
- package/dist/components/utility/tour/tour.styles.js +0 -13
- package/dist/components/utility/visually-hidden/visually-hidden.styles.js +0 -5
- package/dist/components/viewers/archive-viewer/archive-viewer.class.js +1 -1
- package/dist/components/viewers/archive-viewer/archive-viewer.styles.d.ts +2 -2
- package/dist/components/viewers/archive-viewer/archive-viewer.styles.js +0 -10
- package/dist/components/viewers/csv-viewer/csv-viewer.class.js +1 -1
- package/dist/components/viewers/csv-viewer/csv-viewer.styles.js +0 -19
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +1 -1
- package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js +0 -15
- package/dist/components/viewers/document-compare/document-compare.styles.js +0 -3
- package/dist/components/viewers/document-preview/document-preview.styles.js +0 -25
- package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +2 -1
- package/dist/components/viewers/document-viewer/document-viewer.class.js +1 -1
- package/dist/components/viewers/document-viewer/document-viewer.styles.js +0 -5
- package/dist/components/viewers/docx-viewer/docx-viewer.styles.js +0 -17
- package/dist/components/viewers/ebook-viewer/ebook-viewer.styles.js +0 -4
- package/dist/components/viewers/email-viewer/email-viewer.styles.js +0 -7
- package/dist/components/viewers/geojson-view/geojson-view.styles.js +0 -5
- package/dist/components/viewers/highlight-layer/highlight-layer.styles.js +0 -3
- package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
- package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js +0 -38
- package/dist/components/viewers/page-rail/page-rail.class.js +1 -1
- package/dist/components/viewers/page-rail/page-rail.styles.js +0 -13
- package/dist/components/viewers/pdf-viewer/pdf-loader.d.ts +13 -2
- package/dist/components/viewers/pdf-viewer/pdf-loader.js +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +32 -2
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +4 -4
- package/dist/components/viewers/pdf-viewer/pdf-viewer.styles.js +1 -27
- package/dist/components/viewers/pptx-viewer/pptx-viewer.styles.js +0 -3
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +1 -1
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.styles.js +0 -14
- package/dist/components/viewers/svg-viewer/svg-viewer.styles.js +0 -7
- package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +2 -24
- package/dist/custom-elements-jsx.d.ts +72 -40
- package/dist/events.d.ts +43 -33
- package/dist/internal/agent-status-variants.d.ts +18 -0
- package/dist/internal/agent-status-variants.js +1 -0
- package/dist/internal/announcer.d.ts +8 -3
- package/dist/internal/announcer.js +1 -1
- package/dist/internal/autoloader-manifest.js +1 -1
- package/dist/internal/canvas-color.d.ts +16 -0
- package/dist/internal/canvas-color.js +1 -1
- package/dist/internal/catalog-picker.d.ts +0 -1
- package/dist/internal/catalog-picker.js +1 -1
- package/dist/internal/default-strings.generated.d.ts +1 -0
- package/dist/internal/default-strings.generated.js +1 -1
- package/dist/internal/dev-mode-attribute-warning.d.ts +27 -4
- package/dist/internal/dev-mode-attribute-warning.js +1 -1
- package/dist/internal/localization-runtime.js +1 -1
- package/dist/internal/localization-types.d.ts +1 -1
- package/dist/internal/localization.js +1 -1
- package/dist/internal/lyra-element.d.ts +13 -0
- package/dist/internal/lyra-element.js +1 -1
- package/dist/internal/media-controller.js +1 -1
- package/dist/internal/package-metadata.d.ts +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/internal/scroll-overflow.d.ts +35 -13
- package/dist/internal/scroll-overflow.js +1 -1
- package/dist/internal/sizes.styles.js +0 -2
- package/dist/internal/specialist-tokens.styles.js +6 -11
- package/dist/internal/text-highlights.d.ts +4 -1
- package/dist/internal/text-highlights.js +1 -1
- package/dist/internal/tokens/palette.styles.js +0 -15
- package/dist/internal/tokens.styles.js +20 -113
- package/dist/lyra.d.ts +9 -6
- package/dist/styles/reservations.css +82 -0
- package/dist/svelte.d.ts +72 -40
- package/dist/translations/ar.js +1 -1
- package/dist/translations/de.js +1 -1
- package/dist/translations/es.js +1 -1
- package/dist/translations/fa.js +1 -1
- package/dist/translations/fr.js +1 -1
- package/dist/translations/he.js +1 -1
- package/dist/translations/ja.js +1 -1
- package/dist/translations/pt-BR.js +1 -1
- package/dist/translations/ru.js +1 -1
- package/dist/translations/zh-CN.js +1 -1
- package/dist/vue.d.ts +72 -40
- package/llms/components/lr-accordion-item.md +12 -3
- package/llms/components/lr-accordion.md +11 -2
- package/llms/components/lr-agent-eval-dashboard.md +1 -1
- package/llms/components/lr-agent-trace.md +3 -1
- package/llms/components/lr-agent-workspace.md +20 -0
- package/llms/components/lr-artifact-panel.md +10 -4
- package/llms/components/lr-attachment-chip.md +7 -4
- package/llms/components/lr-attachment-trigger.md +7 -4
- package/llms/components/lr-av-player.md +3 -1
- package/llms/components/lr-avatar.md +6 -6
- package/llms/components/lr-bar-chart.md +8 -6
- package/llms/components/lr-box-plot.md +15 -4
- package/llms/components/lr-browser-frame.md +7 -3
- package/llms/components/lr-bubble-chart.md +8 -6
- package/llms/components/lr-calendar.md +9 -2
- package/llms/components/lr-card.md +24 -0
- package/llms/components/lr-chart.md +45 -11
- package/llms/components/lr-chat-viewport.md +7 -2
- package/llms/components/lr-checkbox-group.md +13 -5
- package/llms/components/lr-checkbox.md +5 -2
- package/llms/components/lr-checkpoint.md +6 -2
- package/llms/components/lr-combobox.md +47 -8
- package/llms/components/lr-command-palette.md +4 -1
- package/llms/components/lr-confirm-bar.md +7 -3
- package/llms/components/lr-context-meter.md +12 -11
- package/llms/components/lr-conversation-item.md +7 -4
- package/llms/components/lr-date-input.md +22 -2
- package/llms/components/lr-date-picker.md +23 -3
- package/llms/components/lr-details.md +11 -2
- package/llms/components/lr-dialog.md +16 -10
- package/llms/components/lr-dock-panel.md +7 -10
- package/llms/components/lr-document-preview.md +6 -1
- package/llms/components/lr-document-viewer.md +3 -2
- package/llms/components/lr-doughnut-chart.md +8 -6
- package/llms/components/lr-drawer.md +3 -3
- package/llms/components/lr-entity-card.md +3 -3
- package/llms/components/lr-entity-chip.md +1 -1
- package/llms/components/lr-entity-dossier.md +4 -1
- package/llms/components/lr-file-input.md +2 -2
- package/llms/components/lr-flag.md +30 -8
- package/llms/components/lr-heatmap.md +46 -0
- package/llms/components/lr-histogram.md +7 -4
- package/llms/components/lr-icon.md +1 -1
- package/llms/components/lr-json-schema-viewer.md +2 -1
- package/llms/components/lr-knowledge-graph-explorer.md +8 -3
- package/llms/components/lr-known-date.md +4 -2
- package/llms/components/lr-line-chart.md +8 -6
- package/llms/components/lr-lite-chart.md +16 -6
- package/llms/components/lr-map.md +91 -10
- package/llms/components/lr-markdown-core.md +3 -2
- package/llms/components/lr-media-card.md +28 -12
- package/llms/components/lr-message-parts.md +2 -1
- package/llms/components/lr-model-select.md +9 -10
- package/llms/components/lr-model-settings-panel.md +9 -9
- package/llms/components/lr-neighbor-list.md +1 -1
- package/llms/components/lr-notebook-viewer.md +6 -3
- package/llms/components/lr-option.md +46 -7
- package/llms/components/lr-pdf-viewer.md +62 -2
- package/llms/components/lr-pie-chart.md +8 -6
- package/llms/components/lr-polar-area-chart.md +8 -6
- package/llms/components/lr-popover.md +25 -1
- package/llms/components/lr-progress-ring.md +8 -1
- package/llms/components/lr-prompt-studio.md +1 -1
- package/llms/components/lr-provenance-panel.md +4 -2
- package/llms/components/lr-qr-code.md +1 -1
- package/llms/components/lr-radar-chart.md +8 -6
- package/llms/components/lr-rag-eval-dashboard.md +2 -2
- package/llms/components/lr-random-content.md +13 -0
- package/llms/components/lr-reorder-item.md +6 -1
- package/llms/components/lr-reorder-list.md +6 -1
- package/llms/components/lr-responsive-panel.md +11 -7
- package/llms/components/lr-scatter-chart.md +8 -6
- package/llms/components/lr-sequence-strip.md +16 -2
- package/llms/components/lr-slider.md +12 -5
- package/llms/components/lr-sparkline.md +1 -1
- package/llms/components/lr-suggestion-chips.md +7 -2
- package/llms/components/lr-swatch-picker.md +5 -5
- package/llms/components/lr-switch.md +5 -2
- package/llms/components/lr-table.md +30 -4
- package/llms/components/lr-terminal.md +3 -1
- package/llms/components/lr-thread-list.md +8 -8
- package/llms/components/lr-time-input.md +6 -1
- package/llms/components/lr-timeline-item.md +24 -0
- package/llms/components/lr-timeline.md +25 -1
- package/llms/components/lr-token-input.md +7 -2
- package/llms/components/lr-tool-approval-dialog.md +7 -8
- package/llms/components/lr-tool-call-chip.md +5 -1
- package/llms/components/lr-tool-param-form.md +14 -12
- package/llms/components/lr-tool-result-dialog.md +11 -9
- package/llms/components/lr-tool-result-view.md +7 -6
- package/llms/components/lr-tool-select-dialog.md +18 -16
- package/llms/components/lr-trace-tree.md +3 -1
- package/llms/components/lr-usage-badge.md +4 -1
- package/llms/components/lr-video-playlist.md +1 -1
- package/llms/components/lr-virtual-list.md +22 -14
- package/llms/components/lr-voice-picker.md +8 -5
- package/llms/components/lr-widget-renderer.md +3 -3
- package/llms/components/lr-widget.md +1 -1
- package/llms/components/lr-word-cloud.md +6 -2
- package/llms/peers.md +12 -2
- package/llms/shared.md +70 -2
- package/llms/tokens.md +15 -1
- package/llms-full.txt +1335 -306
- package/package.json +17 -5
- package/vscode-css-data.json +93 -2
- package/vscode-html-data.json +513 -59
- package/web-types.json +457 -72
package/llms-full.txt
CHANGED
|
@@ -1145,6 +1145,70 @@ canvas consumer's redraw to its normal microtask/render schedule. The optional r
|
|
|
1145
1145
|
browser realm; it does not limit invalidation to a subtree. The function is a no-op during server
|
|
1146
1146
|
rendering and retains no document or stylesheet after the last canvas consumer disconnects.
|
|
1147
1147
|
|
|
1148
|
+
## Preventing layout shift from lazy-upgrading elements (CLS)
|
|
1149
|
+
|
|
1150
|
+
An undefined custom element is an inline box with no intrinsic size, so every `lr-*` in the initial
|
|
1151
|
+
viewport contributes a reflow as its definition loads. Components that additionally defer on an
|
|
1152
|
+
optional peer (`lr-chart`, `lr-map`, `lr-flag`, `lr-flow-canvas`, `lr-knowledge-graph-explorer`)
|
|
1153
|
+
render a skeleton while that peer resolves, which can cost a second shift when the real content
|
|
1154
|
+
replaces it. Each component is individually well-behaved; the aggregate on a first paint is what
|
|
1155
|
+
costs a Lighthouse Cumulative Layout Shift score.
|
|
1156
|
+
|
|
1157
|
+
Lyra ships an optional, opt-in stylesheet that reserves each component's intrinsic footprint before
|
|
1158
|
+
upgrade:
|
|
1159
|
+
|
|
1160
|
+
```css
|
|
1161
|
+
@import "@aceshooting/lyra-ui/reservations.css";
|
|
1162
|
+
```
|
|
1163
|
+
|
|
1164
|
+
It styles **only** `:not(:defined)` elements, inside an `@layer lr-reservations`, so it becomes inert
|
|
1165
|
+
the moment a definition upgrades and can never fight a component's own layout. It sets no colors and
|
|
1166
|
+
no `:root` rules.
|
|
1167
|
+
|
|
1168
|
+
**Every reservation is expressed with the same custom property and fallback token the component's
|
|
1169
|
+
own stylesheet uses** — `--lr-chart-height` / `--lr-size-280px` for the chart family,
|
|
1170
|
+
`--lr-flag-aspect-ratio` for `lr-flag`, `--lr-form-control-height` for the field controls, and so
|
|
1171
|
+
on. That is the point of shipping it rather than documenting measured pixel values: a hand-written
|
|
1172
|
+
reservation rots silently the moment a component's default changes, whereas these track it, and
|
|
1173
|
+
theming a component through its documented custom property re-themes its reservation with it.
|
|
1174
|
+
|
|
1175
|
+
Hand-rolling equivalent rules is still fine — the pattern is just:
|
|
1176
|
+
|
|
1177
|
+
```css
|
|
1178
|
+
lr-chart:not(:defined) {
|
|
1179
|
+
display: block;
|
|
1180
|
+
min-block-size: var(--lr-chart-height, var(--lr-size-280px));
|
|
1181
|
+
}
|
|
1182
|
+
```
|
|
1183
|
+
|
|
1184
|
+
Two things worth knowing:
|
|
1185
|
+
|
|
1186
|
+
- A per-instance override needs the matching custom property to be set as well, not only the
|
|
1187
|
+
attribute, or the pre-upgrade frame and the upgraded frame will disagree. `<lr-chart height="500px">`
|
|
1188
|
+
should carry `style="--lr-chart-height: 500px"` too if it sits above the fold.
|
|
1189
|
+
- The reservation covers the definition-upgrade shift. A component that then swaps a skeleton for
|
|
1190
|
+
peer-resolved content stays stable as long as the reserved box matches the final footprint, which
|
|
1191
|
+
is why the reservations target each component's *final* default size rather than its skeleton's.
|
|
1192
|
+
|
|
1193
|
+
## Scope: what this library does not provide
|
|
1194
|
+
|
|
1195
|
+
Lyra is a component library, not an application framework. The following are deliberately out of
|
|
1196
|
+
scope, so they are worth not searching the catalog for:
|
|
1197
|
+
|
|
1198
|
+
- **Client-side routing.** There is no router and no route-outlet component. URL ownership belongs to
|
|
1199
|
+
the application (or its router of choice), because a component library that took it over would
|
|
1200
|
+
conflict with every framework router a consumer might already run. The navigation components are
|
|
1201
|
+
designed to be *driven* by whatever router you use rather than to own the URL themselves:
|
|
1202
|
+
`lr-app-rail-item`, `lr-breadcrumb-item` and `lr-tab-group` all expose their active/selected state
|
|
1203
|
+
as ordinary reflected properties, so binding is a one-way write from your route state plus a click
|
|
1204
|
+
handler that calls your router. Wire it once in your shell component; there is no Lyra-specific
|
|
1205
|
+
pattern to learn.
|
|
1206
|
+
- **Data fetching, caching, and state management.** Components take data as properties and emit
|
|
1207
|
+
events; they never fetch on your behalf, except the documented viewers/`src`-taking components,
|
|
1208
|
+
which are explicit about it.
|
|
1209
|
+
- **Form submission and validation orchestration.** Form-associated controls integrate with the
|
|
1210
|
+
native `<form>`/`ElementInternals` contract; the submission lifecycle stays the application's.
|
|
1211
|
+
|
|
1148
1212
|
## Optional native styles and CSS utilities
|
|
1149
1213
|
|
|
1150
1214
|
Lyra ships two independent light-DOM stylesheets. Neither is imported by the root barrel, a family
|
|
@@ -1259,7 +1323,10 @@ setLyraLocale("fr"); // page-level selection; see the precedence order below
|
|
|
1259
1323
|
```
|
|
1260
1324
|
|
|
1261
1325
|
```html
|
|
1262
|
-
<lr-toast
|
|
1326
|
+
<lr-toast></lr-toast>
|
|
1327
|
+
<script type="module">
|
|
1328
|
+
document.querySelector("lr-toast").strings = { close: "Fermer" };
|
|
1329
|
+
</script>
|
|
1263
1330
|
```
|
|
1264
1331
|
|
|
1265
1332
|
**Which locale a component ends up using.** Four sources, first answer wins:
|
|
@@ -1651,7 +1718,7 @@ control) is a single tab stop using a roving `tabindex`; arrow keys move within
|
|
|
1651
1718
|
`Escape` dismisses the topmost dismissible overlay and returns focus to whatever opened it.
|
|
1652
1719
|
`ArrowLeft`/`ArrowRight` mean previous/next and swap under `dir="rtl"`.
|
|
1653
1720
|
|
|
1654
|
-
**What that contract is verified by, precisely.** Every one of the
|
|
1721
|
+
**What that contract is verified by, precisely.** Every one of the 284 public tags carries at least
|
|
1655
1722
|
one axe-core assertion in its own directory's tests, in a test that mounts its own tag; contrast
|
|
1656
1723
|
(4.5:1 text, 3:1 control borders, in both the light and dark palettes), a 40px minimum target size,
|
|
1657
1724
|
pressed-state coverage for every hoverable part, and `::part()` reachability are separate blocking
|
|
@@ -2857,6 +2924,7 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
2857
2924
|
|
|
2858
2925
|
- **`internal-canvas-color-contracts`** — Shared utility contracts.
|
|
2859
2926
|
`resolveCanvasColor(/* public names: scope, color, fallback */): unknown`
|
|
2927
|
+
`resolveCanvasColors(/* public names: scope, colors, fallback */): unknown`
|
|
2860
2928
|
|
|
2861
2929
|
- **`internal-localization-runtime-contracts`** — Shared utility contracts.
|
|
2862
2930
|
`getLyraLocaleDirection(/* public names: locale */): unknown`
|
|
@@ -3842,6 +3910,32 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
3842
3910
|
|
|
3843
3911
|
# Form controls & inputs (`components/forms/`)
|
|
3844
3912
|
|
|
3913
|
+
## Breaking changes in 10.0.0
|
|
3914
|
+
|
|
3915
|
+
`<lr-swatch-picker>` drops the three members it carried through 9.x as documented one-major
|
|
3916
|
+
back-compat aliases, each with a like-for-like replacement that has shipped since. The `options`
|
|
3917
|
+
property is now `items` — same frozen owned-snapshot contract, still `attribute: false`, so no
|
|
3918
|
+
markup changes. The `label` property/attribute is now `accessibleLabel` (attribute `aria-label`), or
|
|
3919
|
+
the host `aria-label` directly; this is the one worth grepping for, because an un-updated
|
|
3920
|
+
`<lr-swatch-picker label="Brand colours">` leaves the internal `role="radiogroup"` with no accessible
|
|
3921
|
+
name at all rather than failing loudly. And the exported `SwatchOption` type is now
|
|
3922
|
+
`SwatchPickerItem`. The item shape itself is unchanged, including its own per-item `label` field,
|
|
3923
|
+
which is a different member and stays.
|
|
3924
|
+
|
|
3925
|
+
Also corrected in 10.0.0 — not breaking, but visible. A specificity sweep found rules that were
|
|
3926
|
+
meant to win yet were losing to another rule in the same shadow stylesheet, so their declarations
|
|
3927
|
+
never applied at all. In this family: arrow-keying onto the already-selected option in
|
|
3928
|
+
`<lr-select>` or `<lr-combobox>` produces a visible keyboard highlight again — `[aria-selected="true"]`
|
|
3929
|
+
was written after the active-descendant rule at equal specificity and swallowed it, so the highlight
|
|
3930
|
+
was absent exactly on the row a user is most likely to arrow onto first. `appearance="filled"` has a
|
|
3931
|
+
focus indicator again on `<lr-combobox>` and `<lr-date-input>`, both of which previously had none:
|
|
3932
|
+
the appearance rule out-ranked `:focus-within`, and the only `outline` in the focus rule was
|
|
3933
|
+
`solid transparent`. Both now express appearance as private custom properties, so no `[part]` rule
|
|
3934
|
+
can out-rank another. `<lr-option>` and `<lr-time-range>`'s active preset regain their pointer
|
|
3935
|
+
feedback, and `<lr-token-input>` can now veto all three of its mutations (`lr-add` and
|
|
3936
|
+
`lr-token-edit` became cancelable alongside `lr-remove`, which already was — additive; see that
|
|
3937
|
+
section).
|
|
3938
|
+
|
|
3845
3939
|
## Setter-only `null` clearing in 8.0.0
|
|
3846
3940
|
|
|
3847
3941
|
Several mapped string IDLs accept `null` on assignment without widening their read type. This is a
|
|
@@ -3947,6 +4041,24 @@ An `lr-option` row remains bounded by its owning listbox: the default label elli
|
|
|
3947
4041
|
`start`/`end` (or `prefix`/`suffix`) adornment is capped at 40% of the row. Unbroken metadata
|
|
3948
4042
|
therefore cannot widen a 320px LTR or RTL picker.
|
|
3949
4043
|
|
|
4044
|
+
**Adornments in the popup (fixed in 10.1.0).** Before 10.1.0 this paragraph described behavior the
|
|
4045
|
+
code did not have: `lr-combobox` builds its popup from normalized row *data* rather than from the
|
|
4046
|
+
light-DOM nodes, so a slotted `start`/`end`/`prefix`/`suffix` adornment had nowhere to land and
|
|
4047
|
+
simply never rendered — the documented slots and their documented parts were both dead inside the
|
|
4048
|
+
one component `lr-option` exists to feed. They now render. The nodes are **cloned** into the row
|
|
4049
|
+
(`option-start` / `option-end` parts, inert and `aria-hidden`, so they never join the option's
|
|
4050
|
+
accessible name), which means the author's own `<lr-option>` subtree is left exactly where they put
|
|
4051
|
+
it rather than being moved into a shadow root as a side effect of opening a dropdown:
|
|
4052
|
+
|
|
4053
|
+
```html
|
|
4054
|
+
<lr-combobox label="Country">
|
|
4055
|
+
<lr-option value="fr"><lr-flag slot="start" country="fr"></lr-flag>France</lr-option>
|
|
4056
|
+
<lr-option value="mt"><lr-flag slot="start" country="mt"></lr-flag>Malta</lr-option>
|
|
4057
|
+
</lr-combobox>
|
|
4058
|
+
```
|
|
4059
|
+
|
|
4060
|
+
An async `source` row can carry the same two fields (`start`, `end`) alongside its existing `icon`.
|
|
4061
|
+
|
|
3950
4062
|
### `lr-combobox`
|
|
3951
4063
|
|
|
3952
4064
|
**Properties:**
|
|
@@ -4013,8 +4125,21 @@ therefore cannot widen a 320px LTR or RTL picker.
|
|
|
4013
4125
|
mapped IDLs `inputmode` and `enterkeyhint` delegate to the corresponding camel-case native
|
|
4014
4126
|
properties
|
|
4015
4127
|
- `inputValue: string` — the live filter input text; programmatic writes are event-silent
|
|
4016
|
-
- `maxOptionsVisible: number = 3` (attribute `max-options-visible` — caps how many selected tags
|
|
4017
|
-
show before collapsing to `+N
|
|
4128
|
+
- `maxOptionsVisible: number = 3` (attribute `max-options-visible` — caps how many selected **tags**
|
|
4129
|
+
show before collapsing to `+N`; nothing to do with the suggestion list, see the three-caps note
|
|
4130
|
+
below)
|
|
4131
|
+
- `visibleOptions?: number` (attribute `visible-options`, new in 10.1.0) — bounds the popup to about
|
|
4132
|
+
this many suggestion rows, leaving the rest reachable by scrolling. Purely presentational: every
|
|
4133
|
+
row is still rendered. Measured from where row N actually starts rather than computed from a
|
|
4134
|
+
token, because a row's height varies with `sub` lines, adornments and group labels. Unset imposes
|
|
4135
|
+
no bound of its own and the listbox keeps exactly its previous max-height behavior; zero,
|
|
4136
|
+
negative, and non-finite values normalize to unset rather than collapsing the popup
|
|
4137
|
+
|
|
4138
|
+
**The three caps, which are easy to confuse.** `visibleOptions` caps how many suggestion rows are
|
|
4139
|
+
*visible* (presentation; the rest scroll). `maxRender` caps how many suggestion rows are *rendered
|
|
4140
|
+
at all* (performance; the rest do not exist and are summarized by `option-overflow`).
|
|
4141
|
+
`maxOptionsVisible` caps how many *selected tags* show in multi-select and never touches the
|
|
4142
|
+
suggestion list.
|
|
4018
4143
|
- `emptyText?: string` (attribute `empty-text`) — omission displays localized `noMatches` (`"No
|
|
4019
4144
|
matches"` in the built-in English locale); any supplied string, including `''`, renders verbatim
|
|
4020
4145
|
- `loadingText?: string` (attribute `loading-text`) — shown while a `source` fetch is in flight;
|
|
@@ -4077,9 +4202,12 @@ every selection change and a `form.reset()` — like a native control, only anot
|
|
|
4077
4202
|
**8.0 migration:** the former camel-case string property `autoCorrect` is not retained as a public
|
|
4078
4203
|
alias. Set the boolean `autocorrect` IDL, or use `autocorrect="on"` / `autocorrect="off"` in markup.
|
|
4079
4204
|
|
|
4080
|
-
`ComboboxSourceRow = { readonly value: string; readonly label: string; readonly sub?: string; readonly icon?: unknown; readonly
|
|
4205
|
+
`ComboboxSourceRow = { readonly value: string; readonly label: string; readonly sub?: string; readonly icon?: unknown; readonly start?: unknown;
|
|
4206
|
+
readonly end?: unknown; readonly badge?: string |
|
|
4081
4207
|
number; accessibleLabel?: string; data?: unknown; dotColor?: string; group?: string; disabled?:
|
|
4082
|
-
boolean }` — the row shape used by the async `source` path. `
|
|
4208
|
+
boolean }` — the row shape used by the async `source` path. `start` and `end` (new in 10.1.0) are
|
|
4209
|
+
the async counterparts of `<lr-option>`'s `start`/`end` adornment slots and render as the
|
|
4210
|
+
`option-start` / `option-end` parts, inert and aria-hidden exactly like `icon`. `icon` renders as a decorative leading
|
|
4083
4211
|
visual whose rendered subtree stays visible but is inert and hidden from assistive technology;
|
|
4084
4212
|
put independent actions outside it. `badge` renders as trailing metadata, `accessibleLabel` can
|
|
4085
4213
|
provide richer spoken text than the visible label, and `data` is retained without being rendered
|
|
@@ -4187,7 +4315,9 @@ adornment-slot wrappers, each `hidden` while nothing is slotted into it), `tags`
|
|
|
4187
4315
|
`lr-emoji-picker` so one rule styles every grouped list; it labels the `role="group"` wrapper here),
|
|
4188
4316
|
`option`,
|
|
4189
4317
|
`option-dot` (the leading status dot, when a row's `dotColor` is set), `option-icon` (the inert,
|
|
4190
|
-
aria-hidden decorative leading visual for an async row), `option-
|
|
4318
|
+
aria-hidden decorative leading visual for an async row), `option-start` and `option-end` (the inert,
|
|
4319
|
+
aria-hidden adornments cloned from the source option's `start`/`prefix` and `end`/`suffix` slots, or
|
|
4320
|
+
from an async row's `start`/`end`), `option-label`, `option-sub` (a row's
|
|
4191
4321
|
secondary line, when `sub` is set), `option-badge` (an async row's trailing metadata),
|
|
4192
4322
|
`option-overflow` (the "+N more" indicator from `maxRender`), `error`, `hint`
|
|
4193
4323
|
|
|
@@ -4260,7 +4390,10 @@ box visibly (nothing is clipped or made unreachable), so leave it unset there.
|
|
|
4260
4390
|
plain-text contract even when a separate WA `label` override is present.
|
|
4261
4391
|
|
|
4262
4392
|
**Events:** `lr-option-change` — bubbles when the option's label or selectable data changes so
|
|
4263
|
-
its parent `lr-combobox` or `lr-select` can refresh its normalized option rows.
|
|
4393
|
+
its parent `lr-combobox` or `lr-select` can refresh its normalized option rows. It is a private
|
|
4394
|
+
child-to-parent refresh signal, not a picker event: the owning `lr-combobox`/`lr-select` consumes
|
|
4395
|
+
it and stops it, so it never reaches a listener on the picker host (whose own contract is
|
|
4396
|
+
`lr-change`/`lr-input`/`change`/`input`). Listen on the `<lr-option>` itself to observe it.
|
|
4264
4397
|
|
|
4265
4398
|
**Slots:** default (visible label), `start`/`end` (WA adornments), and `prefix`/`suffix` (Shoelace
|
|
4266
4399
|
aliases). `start` and `prefix` project into one leading wrapper; `end` and `suffix` project into one
|
|
@@ -4356,7 +4489,7 @@ synchronous and fires no `input`/`change`/`lr-change` event.
|
|
|
4356
4489
|
|
|
4357
4490
|
**Additional API surface:**
|
|
4358
4491
|
|
|
4359
|
-
- `part="tag-label"` — The
|
|
4492
|
+
- `part="tag-label"` — The selected-tag label. Kept on one line and truncated with an ellipsis at `--tag-max-size` (default `var(--lr-size-5rem)`), rather than wrapped. Note that `lr-select`'s tag of the same name defaults to `var(--lr-size-12rem)`, so the same `--tag-max-size` value yields a wider tag there.
|
|
4360
4493
|
|
|
4361
4494
|
---
|
|
4362
4495
|
|
|
@@ -4706,9 +4839,22 @@ Arabic/Persian display round-trips to the same ISO value.
|
|
|
4706
4839
|
Inline month-grid calendar, not form-associated (used standalone or embedded inside
|
|
4707
4840
|
`lr-date-input`'s popover).
|
|
4708
4841
|
|
|
4709
|
-
**Properties (
|
|
4842
|
+
**Properties (28):**
|
|
4710
4843
|
|
|
4711
4844
|
- `dayContent` (JS only): `LyraDatePickerDayContent | undefined`
|
|
4845
|
+
- `presets: LyraDateRangePreset[] = []` (JS only, new in 10.1.0) —
|
|
4846
|
+
`LyraDateRangePreset { label: string; start: string; end: string }`, where `start`/`end` are ISO
|
|
4847
|
+
`YYYY-MM-DD`. Renders a `[part="presets"]` quick-range button row above the calendar, for the
|
|
4848
|
+
dashboard time-filter shape (Today / Last 7 days / Last 30 days / This month / All time).
|
|
4849
|
+
**Range mode only** — a preset names two dates, so it is ignored for a single-date picker rather
|
|
4850
|
+
than rendering a row that cannot do anything; unset renders nothing at all. Applying one commits
|
|
4851
|
+
through the same path a two-click selection uses, so the ISO serialization, the `min`/`max`
|
|
4852
|
+
clamping and the `input`-then-`change` pair are identical and a consumer's change handler cannot
|
|
4853
|
+
tell them apart. A reversed preset normalizes; a malformed one is ignored rather than clearing the
|
|
4854
|
+
current value, so a bad entry in a config-driven list never reads as "the user picked nothing".
|
|
4855
|
+
The active button carries `aria-pressed="true"` and `data-active`. Deliberately the same
|
|
4856
|
+
`label`/`start`/`end` shape as `<lr-time-range>`'s `TimeRangePreset`, so the library has one
|
|
4857
|
+
preset vocabulary rather than two — the only difference is the unit (ISO dates, not numbers)
|
|
4712
4858
|
- `disabled: boolean = false` (reflected)
|
|
4713
4859
|
- `disabledDates: string | string[] | Date[] = ''` (attribute `disabled-dates`)
|
|
4714
4860
|
- `disabledDaysOfWeek: string = ''` (attribute `disabled-days-of-week`)
|
|
@@ -4760,11 +4906,13 @@ values. `lr-focus-day` carries `{ date: Date }`, and `lr-view-change` carries `{
|
|
|
4760
4906
|
|
|
4761
4907
|
**Custom states:** `disabled`, `range`, and `readonly`.
|
|
4762
4908
|
|
|
4763
|
-
**CSS parts (
|
|
4909
|
+
**CSS parts (37):** `date-picker` / permanent compatibility name `base` (tokens on the same
|
|
4764
4910
|
visible shell; both names remain supported), `day`, `day-disabled`, `day-label`, `day-outside`,
|
|
4765
4911
|
`day-placeholder`, `day-range-end`, `day-range-inner`, `day-range-preview`, `day-range-start`,
|
|
4766
4912
|
`day-selected`, `day-today`, `day-weekend`, `footer`, `grid`, `header`, `month`, `month-label`,
|
|
4767
4913
|
`months`, `nav`, `next`, `previous`, `title`, `view-cell`, `view-grid`, `view-item`,
|
|
4914
|
+
`presets` (the quick-range row), `preset-button` (one quick-range button; carries `data-active`
|
|
4915
|
+
while its range is the current value),
|
|
4768
4916
|
`view-item-disabled`, `view-item-selected`, `view-item-today`, `view-row`, `weekday`, `weekdays`,
|
|
4769
4917
|
`weeknumber`, and `weeknumbers`. Lyra additionally retains the existing `week` part.
|
|
4770
4918
|
|
|
@@ -5006,6 +5154,11 @@ and `dateTimeFormat(locale, options)`.
|
|
|
5006
5154
|
`::part(previous):hover` still wins without `!important`.
|
|
5007
5155
|
- `--lr-date-picker-nav-active-bg` — Pressed navigation background; defaults to the hover color
|
|
5008
5156
|
mixed by `--lr-color-mix-active`.
|
|
5157
|
+
- `--lr-date-picker-preset-hover-bg`, `--lr-date-picker-preset-active-bg`, and
|
|
5158
|
+
`--lr-date-picker-preset-selected-bg` (new in 10.1.0) — hover, pressed, and
|
|
5159
|
+
currently-selected paint for a `presets` quick-range button. Defaults are
|
|
5160
|
+
`var(--lr-color-brand-quiet)`, that hover colour mixed by `--lr-color-mix-active`, and
|
|
5161
|
+
`var(--lr-color-brand)` respectively.
|
|
5009
5162
|
- `--lr-date-picker-title-hover-color`, `--lr-date-picker-title-active-color`,
|
|
5010
5163
|
`--lr-date-picker-title-active-bg`, and `--lr-date-picker-title-active-radius` — Month-title
|
|
5011
5164
|
hover/press paint and pressed shape; defaults to brand, brand, brand-quiet, and
|
|
@@ -6197,7 +6350,12 @@ than adding outer padding around the buttons.
|
|
|
6197
6350
|
- `value: string` (also accepts a `Date` or `null` when assigned) — strict `HH:mm`, optional
|
|
6198
6351
|
`:ss`/`.sss`; `Date` reads local clock fields without timezone conversion. Invalid strings and
|
|
6199
6352
|
`null` normalize to `''`. `valueAsNumber` is milliseconds since midnight (`NaN` while blank),
|
|
6200
|
-
and `valueAsDate` applies the clock fields to today's local date (`null` while blank).
|
|
6353
|
+
and `valueAsDate` applies the clock fields to today's local date (`null` while blank). Both are
|
|
6354
|
+
settable, like the native `<input type="time">` properties they mirror: assigning `valueAsNumber`
|
|
6355
|
+
sets `value` from the same scale, and out-of-range or non-finite figures clear the field rather
|
|
6356
|
+
than wrapping into a different time; assigning `valueAsDate` reads the same local clock fields
|
|
6357
|
+
back off the Date, so it round-trips with the getter, and `null`/an invalid Date clears. Both
|
|
6358
|
+
assignments are silent, again like the native properties.
|
|
6201
6359
|
- `defaultValue`, `name`, `form`, `disabled`, `required`, `customError`, `getForm()`,
|
|
6202
6360
|
`checkValidity()`, `reportValidity()`, `setCustomValidity()`, and `resetValidity()` use the shared form-control
|
|
6203
6361
|
contract. Reset restores the current declarative `value` default; `readonly` remains focusable
|
|
@@ -6861,9 +7019,10 @@ gemstone?: GemstoneKey }`; a valid CSS `color` is used as the
|
|
|
6861
7019
|
the selected glow/shine defaults.
|
|
6862
7020
|
- `accessibleLabel: string = ''` (attribute `aria-label`) — accessible name copied to the internal
|
|
6863
7021
|
`role="radiogroup"`; attribute presence wins, including an explicitly empty name.
|
|
6864
|
-
-
|
|
6865
|
-
|
|
6866
|
-
|
|
7022
|
+
- The 9.x compatibility aliases were removed in 10.0.0: `options` is `items`, the exported
|
|
7023
|
+
`SwatchOption` type is `SwatchPickerItem`, and the former invisible `label` IDL is
|
|
7024
|
+
`accessibleLabel`/`aria-label`. The canonical sibling radiogroup vocabulary is now the only
|
|
7025
|
+
spelling.
|
|
6867
7026
|
- `disabled: boolean = false` (reflected) — locks the whole picker. Every swatch renders as a real
|
|
6868
7027
|
`disabled` `<button>`, so it leaves the tab sequence and cannot be activated; arrow/Home/End
|
|
6869
7028
|
navigation and host `click()` become no-ops; and the swatches dim to `--lr-opacity-disabled` with
|
|
@@ -7047,7 +7206,10 @@ leaves the internal role's serialized attribute empty; browsers without the refl
|
|
|
7047
7206
|
API keep the string fallback. The relationship tracks host attribute changes and clears when
|
|
7048
7207
|
unset.
|
|
7049
7208
|
|
|
7050
|
-
**CSS parts:** `form-control` (outer checkbox/error/hint frame), `
|
|
7209
|
+
**CSS parts:** `form-control` (outer checkbox/error/hint frame), `row` (the row wrapping the
|
|
7210
|
+
checkbox owner and the label as siblings — the node to size or align when laying out a column of
|
|
7211
|
+
checkboxes, since `base`/`checkbox` below is only the control box and its inline size tracks the box
|
|
7212
|
+
rather than the row), `base` (compatibility name for the
|
|
7051
7213
|
semantic owner; use `checkbox`), `checkbox` (the interactive `role="checkbox"` owner; it is the
|
|
7052
7214
|
same node as `base`, while the rich default label is its sibling),
|
|
7053
7215
|
`box` / `control` (the small square showing the checkmark/indeterminate dash; while active it also
|
|
@@ -7212,7 +7374,10 @@ restores the current default before making the control pristine again.
|
|
|
7212
7374
|
- `help-text` — Shoelace alias for the same hint surface.
|
|
7213
7375
|
- `error` — custom error content.
|
|
7214
7376
|
|
|
7215
|
-
**CSS parts:** `form-control` (the outer wrapper around the switch, error and hint), `
|
|
7377
|
+
**CSS parts:** `form-control` (the outer wrapper around the switch, error and hint), `row` (the row
|
|
7378
|
+
wrapping the switch owner and the label as siblings — the node to size or align when laying out a
|
|
7379
|
+
column of switches, since `base`/`switch` below is only the track box and its inline size tracks the
|
|
7380
|
+
track rather than the row), `base` /
|
|
7216
7381
|
`switch` / `wrapper` (the semantic interactive `role="switch"` owner; the rich label is its
|
|
7217
7382
|
sibling), `track` / `control` (the
|
|
7218
7383
|
pill-shaped background), `thumb` (the circular knob), `label` (wrapper around the default slot),
|
|
@@ -7458,6 +7623,7 @@ Mapped aliases are also live: `--thumb-size`, `--thumb-width`, `--thumb-height`,
|
|
|
7458
7623
|
|
|
7459
7624
|
```html
|
|
7460
7625
|
<lr-slider
|
|
7626
|
+
id="temperature-slider"
|
|
7461
7627
|
name="temperature"
|
|
7462
7628
|
min="0"
|
|
7463
7629
|
max="2"
|
|
@@ -7466,14 +7632,11 @@ Mapped aliases are also live: `--thumb-size`, `--thumb-width`, `--thumb-height`,
|
|
|
7466
7632
|
hint="Higher values make replies more varied."
|
|
7467
7633
|
with-markers
|
|
7468
7634
|
with-tooltip
|
|
7469
|
-
.valueAsNumber=${0.7}
|
|
7470
|
-
.valueFormatter=${(value, handle) => `${value * 100}%`}
|
|
7471
|
-
@lr-input=${(e) => setDraftTemperature(e.detail.value)}
|
|
7472
|
-
@lr-change=${(e) => commitTemperature(e.detail.value)}
|
|
7473
7635
|
></lr-slider>
|
|
7474
7636
|
|
|
7475
7637
|
<!-- Two handles, vertical. A name submits two `price` entries. -->
|
|
7476
7638
|
<lr-slider
|
|
7639
|
+
id="price-slider"
|
|
7477
7640
|
range
|
|
7478
7641
|
name="price"
|
|
7479
7642
|
orientation="vertical"
|
|
@@ -7483,8 +7646,17 @@ Mapped aliases are also live: `--thumb-size`, `--thumb-width`, `--thumb-height`,
|
|
|
7483
7646
|
min-value="200"
|
|
7484
7647
|
max-value="800"
|
|
7485
7648
|
label="Price"
|
|
7486
|
-
@lr-change=${(e) => applyPriceFilter(e.detail.minValue, e.detail.maxValue)}
|
|
7487
7649
|
></lr-slider>
|
|
7650
|
+
<script type="module">
|
|
7651
|
+
const temperature = document.getElementById("temperature-slider");
|
|
7652
|
+
temperature.valueAsNumber = 0.7;
|
|
7653
|
+
temperature.valueFormatter = (value, handle) => `${value * 100}%`;
|
|
7654
|
+
temperature.addEventListener("lr-input", (e) => setDraftTemperature(e.detail.value));
|
|
7655
|
+
temperature.addEventListener("lr-change", (e) => commitTemperature(e.detail.value));
|
|
7656
|
+
|
|
7657
|
+
const price = document.getElementById("price-slider");
|
|
7658
|
+
price.addEventListener("lr-change", (e) => applyPriceFilter(e.detail.minValue, e.detail.maxValue));
|
|
7659
|
+
</script>
|
|
7488
7660
|
```
|
|
7489
7661
|
|
|
7490
7662
|
An unset `value` starts at numeric `0`, clamped into the configured domain and step grid. A reset
|
|
@@ -8041,15 +8213,23 @@ option layout and defaults to `--lr-checkbox-group-option-gap`.
|
|
|
8041
8213
|
`--lr-checkbox-group-invalid-border` (default `var(--lr-color-danger)`) independently retints the
|
|
8042
8214
|
invalid option-collection border without changing other danger-colored surfaces.
|
|
8043
8215
|
|
|
8044
|
-
**`value`
|
|
8045
|
-
single source of truth. An internal sync recomputes `value`
|
|
8046
|
-
child `checked`/`value`/`disabled` update, `slotchange`,
|
|
8047
|
-
`form.reset()`. Mutating an obtained array cannot mutate the
|
|
8216
|
+
**`value` reads as a frozen defensive snapshot of child state, and assigning it mirrors back onto
|
|
8217
|
+
the children.** The children remain the single source of truth. An internal sync recomputes `value`
|
|
8218
|
+
on every child toggle, programmatic child `checked`/`value`/`disabled` update, `slotchange`,
|
|
8219
|
+
`name`/`required` change, blur, and `form.reset()`. Mutating an obtained array cannot mutate the
|
|
8220
|
+
group — assign a new array instead.
|
|
8048
8221
|
Only a checkbox whose nearest `lr-checkbox-group` ancestor is this group contributes; a nested
|
|
8049
8222
|
group owns its own descendants and form entries. `connectedCallback()` runs that sync before the
|
|
8050
8223
|
first render.
|
|
8051
8224
|
|
|
8052
|
-
|
|
8225
|
+
Assigning checks every child whose `value` (defaulting to `'on'`) appears in the array and unchecks
|
|
8226
|
+
every other one; duplicate entries check that many same-valued children, and values naming no child
|
|
8227
|
+
are ignored. `null`/`undefined` clear the selection. It is controlled input, so it emits no
|
|
8228
|
+
`lr-change` — only user interaction does. An assignment made before the children exist (the shape of
|
|
8229
|
+
a `.value=${...}` binding on first render) is applied once they arrive.
|
|
8230
|
+
|
|
8231
|
+
- **To preselect**, either set `checked` on the children (`<lr-checkbox value="a" checked>`) or
|
|
8232
|
+
assign the group's `value`.
|
|
8053
8233
|
- **To read the selection**, use this property or the `lr-change` event detail.
|
|
8054
8234
|
- **Give every child a distinct `value`.** `<lr-checkbox>`'s `value` defaults to `'on'`, so a group
|
|
8055
8235
|
of undifferentiated children submits several identical `FormData` entries and the submitted data
|
|
@@ -8090,11 +8270,16 @@ each list mutation; native events have no detail and both aliases carry a frozen
|
|
|
8090
8270
|
Native `FocusEvent` `focus`/`blur` are relayed once from the draft and inline editor, preserving
|
|
8091
8271
|
`relatedTarget`. `lr-add`
|
|
8092
8272
|
(`detail: { value, values }`, where `value` is the final added token and `values` is the frozen,
|
|
8093
|
-
readonly, complete ordered and deduplicated set of tokens added by that commit
|
|
8273
|
+
readonly, complete ordered and deduplicated set of tokens added by that commit — cancelable as of
|
|
8274
|
+
10.0.0; `preventDefault()` keeps the tokens out of `value` and leaves the typed draft text in the
|
|
8275
|
+
input unchanged so the user can correct it, rather than clearing it),
|
|
8094
8276
|
`lr-remove`
|
|
8095
8277
|
(`detail: { value, index }` — cancelable; `preventDefault()` keeps the token in `value`
|
|
8096
8278
|
unchanged), and `lr-token-edit`
|
|
8097
|
-
(`detail: { value, previousValue, index }` — an existing token
|
|
8279
|
+
(`detail: { value, previousValue, index }` — an existing token is about to be edited in place —
|
|
8280
|
+
cancelable as of 10.0.0; `preventDefault()` keeps the token in `value` unchanged and leaves the
|
|
8281
|
+
inline editor open with the user's edited text intact, rather than closing and discarding it).
|
|
8282
|
+
All three mutators now share one veto contract; previously only `lr-remove` could be vetoed.
|
|
8098
8283
|
`lr-invalid` (no detail) is emitted once as a bubbling/composed alias when native validity fails.
|
|
8099
8284
|
**CSS parts:** `form-control`, `form-control-label`, `input-wrapper`, `token`, `token-label` (the
|
|
8100
8285
|
token's text, doubling as the roving-focus edit trigger — rendered only while `editable`),
|
|
@@ -8981,6 +9166,8 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
8981
9166
|
label: unknown;
|
|
8982
9167
|
sub: unknown;
|
|
8983
9168
|
icon: unknown;
|
|
9169
|
+
start: unknown;
|
|
9170
|
+
end: unknown;
|
|
8984
9171
|
badge: unknown;
|
|
8985
9172
|
accessibleLabel: unknown;
|
|
8986
9173
|
data: unknown;
|
|
@@ -9018,6 +9205,11 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
9018
9205
|
from: unknown;
|
|
9019
9206
|
to: unknown;
|
|
9020
9207
|
}`
|
|
9208
|
+
`LyraDateRangePreset {
|
|
9209
|
+
label: unknown;
|
|
9210
|
+
start: unknown;
|
|
9211
|
+
end: unknown;
|
|
9212
|
+
}`
|
|
9021
9213
|
|
|
9022
9214
|
- **`components-forms-emoji-picker-emoji-types-contracts`** — Supporting data types and helpers for this component family.
|
|
9023
9215
|
`EmojiPickerGroup {
|
|
@@ -9152,6 +9344,30 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
9152
9344
|
|
|
9153
9345
|
# Data display, dashboards & flow canvas (`components/data/`)
|
|
9154
9346
|
|
|
9347
|
+
## Breaking changes in 10.0.0
|
|
9348
|
+
|
|
9349
|
+
`<lr-calendar>`'s `firstDayOfWeek`/`first-day-of-week` drops the bare `0`–`6` integer form and stops
|
|
9350
|
+
defaulting to a hardcoded Monday. The type is now exactly `LyraCalendarFirstDayOfWeek`
|
|
9351
|
+
(`'auto'|'sun'|'mon'|'tue'|'wed'|'thu'|'fri'|'sat'`, default `'auto'`), so there is one way to
|
|
9352
|
+
express a week start instead of two that had to be sanitized and wrapped against each other, and
|
|
9353
|
+
`'auto'` resolves through the same `resolveFirstDayOfWeek()` contract `<lr-date-picker>`/
|
|
9354
|
+
`<lr-date-input>` already use. An unset `<lr-calendar>` and an unset `<lr-date-picker>` on the same
|
|
9355
|
+
page therefore agree at last — Sunday-first under `en-US`, Monday-first under `fr-FR` — where the
|
|
9356
|
+
calendar previously rendered Monday-first everywhere while already formatting its weekday *labels*
|
|
9357
|
+
from the locale. Replace `first-day-of-week="1"` with `first-day-of-week="mon"`: a leftover numeric
|
|
9358
|
+
value is not mapped or clamped, it is simply an unrecognized token and falls through to Sunday. If
|
|
9359
|
+
the locale-independent Monday start was deliberate, keep it by writing `"mon"` explicitly instead of
|
|
9360
|
+
relying on the default. There is no `wa-calendar`, so no upstream mirror is affected.
|
|
9361
|
+
|
|
9362
|
+
Also corrected in 10.0.0 — not breaking, but visible. A specificity sweep found rules that were
|
|
9363
|
+
meant to win yet were losing to another rule in the same shadow stylesheet, so their declarations
|
|
9364
|
+
never applied at all. In this family: `<lr-calendar>`'s today cell has a focus ring again (its
|
|
9365
|
+
`[data-today]` outline was swallowing it, leaving today's cell pixel-identical focused and at rest)
|
|
9366
|
+
and its adjacent-month cells take selection and pointer feedback again; `<lr-table>`'s header cell
|
|
9367
|
+
that is both sticky and sortable, `<lr-pagination>`'s page input, `<lr-sequence-strip>`'s selected
|
|
9368
|
+
cell and `<lr-flow-canvas>`'s selected edge regain hover/press/focus feedback; and
|
|
9369
|
+
`<lr-flow-controls>` honors a `hidden` slotted action button instead of painting it.
|
|
9370
|
+
|
|
9155
9371
|
## `lr-sparkline`
|
|
9156
9372
|
|
|
9157
9373
|
Zero-dependency inline SVG trend chart (mirrors `<wa-sparkline>`). Its default allocation is one
|
|
@@ -9820,7 +10036,13 @@ cell: (row) => unknown }` —
|
|
|
9820
10036
|
- `groupLabel?: (key: string | number, rows: readonly T[]) => unknown` (attribute: false) — custom group
|
|
9821
10037
|
header content; without it, the group key is rendered as text
|
|
9822
10038
|
- `expandedContent?: (row: T) => unknown` (attribute: false) — enables a leading expand toggle and
|
|
9823
|
-
renders a full-width detail row beneath expanded records
|
|
10039
|
+
renders a full-width detail row beneath expanded records. The returned content renders inside
|
|
10040
|
+
the component's shadow root, behind the `expanded-cell` part — page CSS cannot reach it, and
|
|
10041
|
+
`::part(expanded-cell)` only reaches the wrapping `<td>` itself, not the descendants this
|
|
10042
|
+
callback returns (the same `::part()` limitation a column's `cell(row)` anchors run into, see
|
|
10043
|
+
`--lr-table-cell-link-color` below). Style such content by returning already-styled elements —
|
|
10044
|
+
inline `style`, or elements that reference this table's own `--lr-*` design tokens, which
|
|
10045
|
+
inherit across the shadow boundary like any custom property
|
|
9824
10046
|
- `canExpand?: (row: T) => boolean` (attribute: false) — optional per-row gate for expansion
|
|
9825
10047
|
- `expandedRowKeys: ReadonlySet<string | number> = new Set()` (attribute: false) — consumer-controlled
|
|
9826
10048
|
expanded state bounded to 10,000 keys; malformed and whitespace-only string keys are omitted while valid
|
|
@@ -9872,7 +10094,11 @@ sort properties; server mode leaves them controlled. Other events are `lr-row-cl
|
|
|
9872
10094
|
(`detail: { row }`), `lr-load-more` (fired on the "load more" button),
|
|
9873
10095
|
`lr-priority-columns-visibility-change` (frozen readonly `detail: { visible }`), and `lr-row-expand-toggle`
|
|
9874
10096
|
(`detail: { row, rowKey }`; the table does not mutate `expandedRowKeys`), and
|
|
9875
|
-
`lr-selection-change` (frozen readonly `detail: { rowKeys }
|
|
10097
|
+
`lr-selection-change` (frozen readonly `detail: { rowKeys }`, not cancelable) when selection is
|
|
10098
|
+
enabled — fired both from a row activation and from a `selectionMode` flip to `'single'` that coerces
|
|
10099
|
+
an existing multi-row selection down to one key (skipped on the very first render, since an
|
|
10100
|
+
already-inconsistent initial `selectionMode`/`selectedRowKeys` pairing is a starting state, not a
|
|
10101
|
+
live transition), `lr-filter-change`
|
|
9876
10102
|
(frozen readonly `detail: { text }`), and `lr-page-change` (frozen readonly `detail: { page }`) from the
|
|
9877
10103
|
filter/pagination surfaces, and `lr-cell-edit` (`detail: { row, columnKey, value }`) for editable
|
|
9878
10104
|
columns, and `lr-column-resize` (`detail: { columnKey, width }`, `width` in CSS pixels) on every pointer or
|
|
@@ -9921,7 +10147,23 @@ no-rows states return the empty element as the shadow root's own root, with no `
|
|
|
9921
10147
|
wrapper around it — `::part(base)` does not apply in those two states, only in the filtered-to-zero
|
|
9922
10148
|
one — and that `empty` disappears entirely once the `empty` slot is filled.
|
|
9923
10149
|
|
|
9924
|
-
|
|
10150
|
+
- `scrollMode: 'self' | 'page' = 'self'` (attribute `scroll-mode`, reflected) — which element
|
|
10151
|
+
scrolls when the table overflows. `'self'` makes `[part="base"]` the scroll container, which is
|
|
10152
|
+
what pairs with `--lr-table-max-height` and makes the sticky header pin inside the table's own
|
|
10153
|
+
viewport. `'page'` hands scrolling back to the document. Needed because a scroll container clips
|
|
10154
|
+
**both** axes — CSS offers no way to scroll one and not the other — so an *uncapped* table that is
|
|
10155
|
+
still `overflow: auto` becomes a sticky containing block that never scrolls, and its header
|
|
10156
|
+
scrolls away with the page. With `'page'` the header's nearest scrollport is the page, so it pins
|
|
10157
|
+
there; the cost is that a table wider than its host overflows the page instead of scrolling
|
|
10158
|
+
inside itself. Named `scrollMode` rather than `scroll` because a `scroll` property would shadow
|
|
10159
|
+
`Element.prototype.scroll()`
|
|
10160
|
+
|
|
10161
|
+
**Themeable custom properties:** `--lr-table-cell-color` (default `inherit`),
|
|
10162
|
+
`--lr-table-cell-link-color` (default `var(--lr-color-brand)`) and
|
|
10163
|
+
`--lr-table-cell-link-hover-color` — an anchor returned from a column's `cell(row)` renders inside
|
|
10164
|
+
the component's shadow root, where page CSS cannot reach it and `::part()` cannot select past the
|
|
10165
|
+
first compound selector to reach it either, so without these it computes to the UA default link
|
|
10166
|
+
blue; set `revert` for the UA default. `--lr-table-max-height` (default `none`; controls the scrollable
|
|
9925
10167
|
body's `max-block-size`). `--lr-table-heat-tint-lo` (default `var(--lr-color-brand-quiet)`) and
|
|
9926
10168
|
`--lr-table-heat-tint-hi` (default `var(--lr-color-brand)`) — the `color-mix()` ramp endpoints
|
|
9927
10169
|
for heat-tint mode's per-cell background, consulted only on columns/rows that define `heatValue`;
|
|
@@ -10431,9 +10673,13 @@ number, color?: string, group?: string }` snapshots; malformed/hostile records a
|
|
|
10431
10673
|
marking shortened strings with an ellipsis and disclosing omitted input through `[part="limit"]`.
|
|
10432
10674
|
The returned sequence and records are frozen; reassign `words` after changes.
|
|
10433
10675
|
- `minFontSize: number = 12` (attribute `min-font-size`) — px, applied to the lowest-weight word;
|
|
10434
|
-
|
|
10676
|
+
a finite value is clamped to `[1, 512]` (so `0`/a negative value floors at `1px`, and an oversized
|
|
10677
|
+
value caps at `512px`); a non-finite value (`NaN`/`Infinity`) falls back to the default `12px`
|
|
10678
|
+
rather than to the `1px` floor
|
|
10435
10679
|
- `maxFontSize: number = 48` (attribute `max-font-size`) — px, applied to the highest-weight word;
|
|
10436
|
-
|
|
10680
|
+
clamped/defaulted the same way (a non-finite value falls back to `48px`, not to `1px`); a
|
|
10681
|
+
resulting reversed pair (`minFontSize` greater than `maxFontSize`) is swapped rather than
|
|
10682
|
+
inverting the weight-to-size mapping
|
|
10437
10683
|
- `scale: 'linear'|'sqrt' = 'linear'` — `sqrt` compresses the weight→font-size mapping so one heavy
|
|
10438
10684
|
word doesn't dwarf the rest, matching `lr-heatmap`'s `scale` property
|
|
10439
10685
|
- `wordRotation: 'none'|'mixed' = 'none'` (attribute `word-rotation`, reflected) — `mixed` lets
|
|
@@ -10580,6 +10826,35 @@ weekdayLabelText?: (jsWeekday:number)=>string|undefined; monthLabelText?:
|
|
|
10580
10826
|
measured `clientWidth` on every draw/resize instead of the fixed `cell-size`, so the grid actually
|
|
10581
10827
|
fills the available width; now applies to calendar mode as well as matrix mode — see gotchas for
|
|
10582
10828
|
the default, non-`fit-to-width` behavior)
|
|
10829
|
+
- `rowLabelWidth?: number | 'auto'` (attribute `row-label-width`, reflected) — width, in CSS px, of
|
|
10830
|
+
the **matrix** row-label gutter, or `'auto'` to measure the widest label and size the gutter to
|
|
10831
|
+
fit (never below the built-in `60`, never above 40% of the host width, so one long label cannot
|
|
10832
|
+
squeeze out the cells it describes). Unset keeps the built-in `60`, so no existing chart reflows.
|
|
10833
|
+
Independently of this, a label too wide for the resolved gutter is truncated with an ellipsis
|
|
10834
|
+
rather than clipped mid-glyph — clipping read as a rendering fault, truncation reads as "there is
|
|
10835
|
+
more here". `cellText` still carries the full label to the tooltip and the keyboard announcement.
|
|
10836
|
+
A malformed value is ignored rather than collapsing the gutter. Calendar mode is unaffected; it
|
|
10837
|
+
has its own fixed weekday gutter
|
|
10838
|
+
- `colLabelHeight?: number | 'auto'` (attribute `col-label-height`, not reflected, `'auto'` new in
|
|
10839
|
+
10.1.0) — height, in CSS px, of the matrix column-label band, or `'auto'` to measure the labels
|
|
10840
|
+
and size the band to fit them. Under a non-zero `colLabelRotation` the measurement projects each
|
|
10841
|
+
label's width through the rotation, which is what makes a rotated axis usable without hand-tuning
|
|
10842
|
+
a magic number. Never below the built-in `20`, and bounded above by a sanity ceiling so a
|
|
10843
|
+
pathological label cannot produce an absurd canvas. Note this deliberately does **not** use
|
|
10844
|
+
`rowLabelWidth`'s "40% of the host" rule: the row gutter steals width from the cells and so must
|
|
10845
|
+
be bounded relative to them, whereas the canvas simply grows taller for this band and the cells
|
|
10846
|
+
keep their size. Unset keeps the built-in `20`, so no existing chart reflows. A malformed value is
|
|
10847
|
+
ignored
|
|
10848
|
+
- `colLabelRotation?: number` (attribute `col-label-rotation`, new in 10.1.0) — rotation, in
|
|
10849
|
+
degrees, applied to matrix column labels. Unset or `0` paints them horizontally exactly as before.
|
|
10850
|
+
In a dense matrix the per-column width is far narrower than a typical label, so horizontal labels
|
|
10851
|
+
collide with their neighbours; `45` or `90` is the standard remedy. Each label rotates about an
|
|
10852
|
+
anchor at its own column's centre with the label's *end* at that anchor, so it leans back over the
|
|
10853
|
+
columns to its left and the last column's label cannot overflow the canvas. Values outside
|
|
10854
|
+
`[0, 90]` clamp into that range and non-finite values normalize to `0`. Pair with
|
|
10855
|
+
`colLabelHeight="auto"` to have the band size itself to the rotated extent. **Not mirrored under
|
|
10856
|
+
`dir="rtl"`** — both grid modes deliberately retain physical LTR geometry, so leaning one axis'
|
|
10857
|
+
labels the other way would be incoherent
|
|
10583
10858
|
- `maxCellSize?: number` (attribute `max-cell-size`) — ceiling, in CSS px, on the cell size
|
|
10584
10859
|
`fitToWidth` derives from the host width, in **both** modes. Exists because `fitToWidth` divides
|
|
10585
10860
|
the _whole_ host width across the grid, so a 5-week calendar or a 3-column matrix in a wide pane
|
|
@@ -10597,6 +10872,23 @@ weekdayLabelText?: (jsWeekday:number)=>string|undefined; monthLabelText?:
|
|
|
10597
10872
|
color ramp via `sqrtStep()` instead of mapping linearly; in calendar mode, the default `'linear'`
|
|
10598
10873
|
still buckets by quartile (`quartileBucket()`, unchanged), while `'sqrt'` instead compresses via the
|
|
10599
10874
|
same `sqrtStep()` magnitude compression as matrix mode, so one heavy day doesn't wash out the rest
|
|
10875
|
+
- `domain?: [number, number]` (attribute: false) — pins the color ramp's input domain instead of
|
|
10876
|
+
deriving it from the data's own extremes, so two heatmaps of comparable data can share a scale
|
|
10877
|
+
rather than each normalizing to its own min/max. A reversed pair is normalized; a degenerate or
|
|
10878
|
+
non-finite one falls back to the derived range
|
|
10879
|
+
- `midpoint?: number` — anchors a diverging ramp's neutral color on this value rather than at the
|
|
10880
|
+
middle of the domain, scaling the two halves independently (`lo`→0, `midpoint`→0.5, `hi`→1). A
|
|
10881
|
+
midpoint outside the resolved domain degrades to plain normalization rather than distorting the
|
|
10882
|
+
ramp
|
|
10883
|
+
- **Signed data.** Setting either `domain` or `midpoint` opts the component into signed data, where
|
|
10884
|
+
only a **non-finite** value is no-data. With neither set (the default), a negative value is
|
|
10885
|
+
no-data — matching the long-documented `-1` sentinel, since a matrix of counts has no meaningful
|
|
10886
|
+
negative. Declaring a domain or midpoint is what disambiguates "a real negative" from "the
|
|
10887
|
+
sentinel", so signed datasets render their negative half instead of dropping it. In signed mode a
|
|
10888
|
+
structurally absent matrix cell reads as `NaN` so it stays no-data while a real `-1` beside it
|
|
10889
|
+
renders on the ramp; in default mode an absent cell still resolves to `-1`, keeping `valueAt()`
|
|
10890
|
+
and the `lr-cell-click` payload unchanged. `scale="sqrt"` rejects negatives in both modes — a
|
|
10891
|
+
square root of a negative has no meaning
|
|
10600
10892
|
- `bucketCount: number = 5` (attribute `bucket-count` — calendar mode only; non-finite values fall
|
|
10601
10893
|
back to 5, while finite values are floored and clamped to 2–256 before the color-ramp allocation)
|
|
10602
10894
|
- `annotations: readonly HeatmapAnnotation[] = []` (attribute: false) — `HeatmapAnnotation { row?: number;
|
|
@@ -10907,16 +11199,30 @@ readonly color, readonly label? }`; `color`
|
|
|
10907
11199
|
per-category only. The marker count is reported as its own clause rather than folded into any
|
|
10908
11200
|
category's count. Unset (the default) changes nothing: no extra legend row, no extra summary clause
|
|
10909
11201
|
|
|
11202
|
+
- `selectedIndex: number = -1` (attribute `selected-index`) — the currently selected item, or `-1`
|
|
11203
|
+
for none. **Controlled:** activating a cell emits `lr-item-activate` and does *not* move the
|
|
11204
|
+
selection itself, so the consumer stays the single source of truth and the strip cannot drift from
|
|
11205
|
+
a playback index it does not own (its natural companion is `lr-sequence-playback`). Mirrors the
|
|
11206
|
+
shape `lr-lite-chart`'s `selectedIndices` and `lr-heatmap`'s `selectedCell` already establish. An
|
|
11207
|
+
out-of-range or non-integer value selects nothing. The selected cell carries `aria-current="true"`
|
|
11208
|
+
and `data-selected`; the selection is drawn as a ring rather than a background change, because a
|
|
11209
|
+
cell's background is data (its category colour) and tinting it would misreport the category
|
|
11210
|
+
|
|
10910
11211
|
The single-member `orientation: 'horizontal'` property was **removed in 9.0.0**: nothing read it and
|
|
10911
11212
|
the stylesheet never mentioned it, so the reflected attribute styled nothing. Delete the attribute;
|
|
10912
11213
|
the strip has always laid out horizontally.
|
|
10913
11214
|
|
|
10914
|
-
**Events:**
|
|
11215
|
+
**Events:** `lr-item-activate` — `detail: { index: number; id: string; item: SequenceStripItem }`,
|
|
11216
|
+
fired when a cell is clicked or activated with Enter/Space on the roving-tabindex focus. Not
|
|
11217
|
+
cancelable: nothing in the component branches on `defaultPrevented`. Bubbles and composed, like every
|
|
11218
|
+
library event.
|
|
10915
11219
|
|
|
10916
11220
|
**Slots:** none.
|
|
10917
11221
|
|
|
10918
11222
|
**CSS parts:** `base` (the root strip, `role="list"`), `cell` (each item's `role="listitem"` cell,
|
|
10919
|
-
background-colored by its category
|
|
11223
|
+
background-colored by its category, carrying the roving `tabindex`, and activatable by click or
|
|
11224
|
+
Enter/Space — it has a pointer cursor plus paired hover/press treatments, and `[data-selected]` when
|
|
11225
|
+
it is `selectedIndex`), `marker` (the small bottom
|
|
10920
11226
|
marker on a cell whose item sets `marker: true`), `tooltip` (the detail tooltip showing the active
|
|
10921
11227
|
item's label, hidden until a cell is hovered or focused),
|
|
10922
11228
|
`legend` (the static category key rendered below the strip when `showLegend` is set — `aria-hidden`,
|
|
@@ -11851,17 +12157,18 @@ sizes a legend chip on both axes. Otherwise the component consumes shared tokens
|
|
|
11851
12157
|
**Optional peer deps:** none.
|
|
11852
12158
|
|
|
11853
12159
|
```html
|
|
11854
|
-
<lr-context-meter
|
|
11855
|
-
label="128K context window"
|
|
11856
|
-
total="128000"
|
|
11857
|
-
.segments=${[
|
|
11858
|
-
{ label: 'System prompt', value: 2200, tone: 'neutral' },
|
|
11859
|
-
{ label: 'Conversation history', value: 61000, tone: 'brand' },
|
|
11860
|
-
{ label: 'Retrieved context', value: 30800, tone: 'warning' },
|
|
11861
|
-
]}
|
|
11862
|
-
></lr-context-meter>
|
|
12160
|
+
<lr-context-meter label="128K context window" total="128000"></lr-context-meter>
|
|
11863
12161
|
|
|
11864
|
-
<lr-context-meter shape="ring" total="128000"
|
|
12162
|
+
<lr-context-meter shape="ring" total="128000"></lr-context-meter>
|
|
12163
|
+
<script type="module">
|
|
12164
|
+
const [meter, ringMeter] = document.querySelectorAll("lr-context-meter");
|
|
12165
|
+
meter.segments = [
|
|
12166
|
+
{ label: "System prompt", value: 2200, tone: "neutral" },
|
|
12167
|
+
{ label: "Conversation history", value: 61000, tone: "brand" },
|
|
12168
|
+
{ label: "Retrieved context", value: 30800, tone: "warning" },
|
|
12169
|
+
];
|
|
12170
|
+
ringMeter.segments = segments;
|
|
12171
|
+
</script>
|
|
11865
12172
|
```
|
|
11866
12173
|
|
|
11867
12174
|
An internal visually-hidden semantic node carries `role="meter"` plus `aria-valuenow`,
|
|
@@ -11918,8 +12225,15 @@ title, readonly color?, readonly data? }`; `date` is an ISO `YYYY-MM-DD` string
|
|
|
11918
12225
|
- `view: CalendarView = 'month'`, where `CalendarView = 'month' | 'agenda'` (reflected) — agenda
|
|
11919
12226
|
lists the effective visible month's events, date-sorted. Foreign tokens normalize and reflect to
|
|
11920
12227
|
`month`
|
|
11921
|
-
- `firstDayOfWeek:
|
|
11922
|
-
|
|
12228
|
+
- `firstDayOfWeek: LyraCalendarFirstDayOfWeek = 'auto'` (attribute `first-day-of-week`) — which
|
|
12229
|
+
weekday the grid starts on. **Breaking in 10.0.0:** the default was a hardcoded `1` (Monday)
|
|
12230
|
+
regardless of locale; it now derives from the effective locale through the same
|
|
12231
|
+
`resolveFirstDayOfWeek()` contract `<lr-date-picker>`/`<lr-date-input>` already use, so an unset
|
|
12232
|
+
`<lr-calendar>` renders Sunday-first under `en-US` and Monday-first under `fr-FR` instead of
|
|
12233
|
+
disagreeing with a date picker on the same page. **Also breaking in 10.0.0:** the bare `0`–`6`
|
|
12234
|
+
integer form is gone; the value is now one of the shared weekday-name tokens (`'auto'`, then
|
|
12235
|
+
`'sun'` through `'sat'`), which pins the week start independent of locale. Pass `'mon'` to keep
|
|
12236
|
+
the pre-10.0.0 rendering.
|
|
11923
12237
|
- `accessibleLabel: string = ''` (attribute `aria-label`) — names the host. The nested calendar
|
|
11924
12238
|
section retains the localized purpose name rather than duplicating an authored host name; when
|
|
11925
12239
|
set programmatically without a host attribute, this value names the section
|
|
@@ -11971,6 +12285,30 @@ opposite default from `lr-stepper`; `horizontal` makes `[part='base']` a horizon
|
|
|
11971
12285
|
(the `role="list"` element is in the shadow root and never inherits a host attribute). Read-only
|
|
11972
12286
|
`itemCount: number` is the live count of direct default-slot `<lr-timeline-item>` children;
|
|
11973
12287
|
unrelated slotted elements and text nodes are ignored.
|
|
12288
|
+
`scale: 'flow' | 'time' = 'flow'` (attribute `scale`, type `LyraTimelineScale`) chooses how items
|
|
12289
|
+
are distributed along the main axis. `'flow'` is the default even sequence, where `timestamp` is
|
|
12290
|
+
rendered as text but carries no positional meaning. `'time'` positions each item at its true
|
|
12291
|
+
proportion of the range, so a gap of weeks and a gap of decades stop looking identical. `'time'`
|
|
12292
|
+
needs a definite extent to distribute along — `--lr-timeline-time-extent` (default
|
|
12293
|
+
`var(--lr-size-20rem)`), applied as `block-size` when vertical and `inline-size` when horizontal —
|
|
12294
|
+
because items are absolutely positioned and a percentage against an auto-sized track resolves to
|
|
12295
|
+
zero. `collision: 'overlap' | 'stack' = 'overlap'` (attribute `collision`, type `LyraTimelineCollision`)
|
|
12296
|
+
chooses what `scale="time"` does with items landing on nearly the same position: `'overlap'` leaves
|
|
12297
|
+
them stacked on one another, `'stack'` steps each colliding item one lane along the **cross** axis
|
|
12298
|
+
(indent per lane: `--lr-timeline-collision-offset`, default `var(--lr-space-l)`), which is what a
|
|
12299
|
+
dense chronology needs — items within 1.5% of the axis of each other count as colliding, and an
|
|
12300
|
+
isolated item returns to lane 0 rather than inheriting a preceding run's depth. There is
|
|
12301
|
+
deliberately no `'cluster'` mode: collapsing coincident items into one expandable marker needs a
|
|
12302
|
+
selection model and click events this passive component does not have.
|
|
12303
|
+
`rangeStart` / `rangeEnd` (`Date | string | number`, attribute: false) pin the axis instead of
|
|
12304
|
+
deriving it from the earliest/latest item; a reversed or non-finite pair falls back to the derived
|
|
12305
|
+
range. An item with no parseable `timestamp` (including one supplied only through the `timestamp`
|
|
12306
|
+
slot, which carries no machine-readable instant) keeps document order and is spread evenly, so a
|
|
12307
|
+
partially-timestamped list degrades rather than stacking at the origin. Items sharing an instant
|
|
12308
|
+
overlap rather than being fanned into lanes: lane assignment, brushing, zooming and per-event
|
|
12309
|
+
selection belong to a denser component than this deliberately passive one. Positions are written to
|
|
12310
|
+
each child as a private `--_lr-timeline-item-offset` custom property and removed again on a switch
|
|
12311
|
+
back to `'flow'`, so the component still never alters its children's content or structure.
|
|
11974
12312
|
|
|
11975
12313
|
**`lr-timeline-item` properties:** `timestamp?: Date | string | number` (attribute: false — `Date`
|
|
11976
12314
|
isn't attribute-serializable; invalid input normalizes to unset and renders no timestamp UI),
|
|
@@ -12691,6 +13029,11 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
12691
13029
|
}`
|
|
12692
13030
|
|
|
12693
13031
|
- **`components-data-sequence-strip-sequence-strip-contracts`** — Supporting data types and helpers for this component family.
|
|
13032
|
+
`LyraSequenceStripActivateDetail {
|
|
13033
|
+
index: unknown;
|
|
13034
|
+
id: unknown;
|
|
13035
|
+
item: unknown;
|
|
13036
|
+
}`
|
|
12694
13037
|
`SequenceStripCategory {
|
|
12695
13038
|
id: unknown;
|
|
12696
13039
|
color: unknown;
|
|
@@ -12782,6 +13125,23 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
12782
13125
|
|
|
12783
13126
|
# Layout, navigation & structure (`components/layout/`)
|
|
12784
13127
|
|
|
13128
|
+
## Breaking changes in 10.0.0
|
|
13129
|
+
|
|
13130
|
+
**`lr-virtual-list`:** the `lr-visible-range-changed` event is removed — listen for
|
|
13131
|
+
`lr-visible-range-change` instead. The detail (`LyraVirtualListRange`), the firing conditions and the
|
|
13132
|
+
gesture are all unchanged; only the name moved. The old spelling was the library's only past-tense
|
|
13133
|
+
`-changed` event among 58 members of the `-change` family, so a convention-driven `lr-${x}-change`
|
|
13134
|
+
listener silently missed it on a component embedded in ten viewers. It is removed outright rather
|
|
13135
|
+
than kept as a dual-emitting alias, because the library has no released consumers and an alias is a
|
|
13136
|
+
permanent tax paid to protect users who do not exist. Rename the listener; nothing else changes.
|
|
13137
|
+
|
|
13138
|
+
Also corrected in 10.0.0 — not breaking, but visible. `<lr-dashboard-grid>`'s cell keeps a focus
|
|
13139
|
+
indicator while it is in a collision or drop state: the collision rule owns the outline channel by
|
|
13140
|
+
design, but the side effect was that the focus ring vanished entirely during exactly the drag or
|
|
13141
|
+
resize a keyboard user most needs it, so the ring is now re-expressed on a second channel. And
|
|
13142
|
+
`<lr-card>` honors a `hidden` slotted media child instead of painting it — the component's own
|
|
13143
|
+
`display` declaration is author-origin and was beating the UA stylesheet's `[hidden] { display: none }`.
|
|
13144
|
+
|
|
12785
13145
|
## Breaking changes in 9.0.0
|
|
12786
13146
|
|
|
12787
13147
|
**`lr-app-rail`:** `mode`'s write side is removed: the accessor is now strictly read-only (always resolves to
|
|
@@ -14181,11 +14541,16 @@ is pending.
|
|
|
14181
14541
|
between rows.
|
|
14182
14542
|
|
|
14183
14543
|
```html
|
|
14184
|
-
<lr-reorder-list label="Form fields"
|
|
14544
|
+
<lr-reorder-list label="Form fields">
|
|
14185
14545
|
<lr-reorder-item value="name">Name</lr-reorder-item>
|
|
14186
14546
|
<lr-reorder-item value="email">Email</lr-reorder-item>
|
|
14187
14547
|
<lr-reorder-item value="phone">Phone</lr-reorder-item>
|
|
14188
14548
|
</lr-reorder-list>
|
|
14549
|
+
<script type="module">
|
|
14550
|
+
document
|
|
14551
|
+
.querySelector("lr-reorder-list")
|
|
14552
|
+
.addEventListener("lr-reorder", (e) => console.log(e.detail.order));
|
|
14553
|
+
</script>
|
|
14189
14554
|
```
|
|
14190
14555
|
|
|
14191
14556
|
**Known gotchas:**
|
|
@@ -14476,7 +14841,7 @@ progress` style, and gates `lr-load-more` while a consumer's fetch is in flight.
|
|
|
14476
14841
|
**Exported types:** `VirtualListRowHeight = number | 'auto'`;
|
|
14477
14842
|
`VirtualListSource<T> = readonly T[] | VirtualListIndexedSource<T>` and
|
|
14478
14843
|
`VirtualListIndexedSource<T> { readonly count: number; itemAt(index): T; keyAt?(index): string |
|
|
14479
|
-
number; indexOfKey?(key: string | number): number }`; `VirtualListRange { start: number; end: number }` (the `lr-visible-range-
|
|
14844
|
+
number; indexOfKey?(key: string | number): number }`; `VirtualListRange { start: number; end: number }` (the `lr-visible-range-change`
|
|
14480
14845
|
detail shape); `VirtualListGroup { key: string | number; label?: string; startIndex: number }` — the
|
|
14481
14846
|
shape consumed by `groups` above; `VirtualListScroll { scrollTop: number; viewportHeight: number }` —
|
|
14482
14847
|
the `lr-virtual-scroll` detail shape.
|
|
@@ -14521,12 +14886,14 @@ math, and any row element can be recycled or removed on the next update.
|
|
|
14521
14886
|
**Events:** `lr-load-more` (no detail — fired once per approach to the bottom of the list while
|
|
14522
14887
|
`has-more` is true and `loading` is false; does not refire on every scroll tick while still near the
|
|
14523
14888
|
bottom — scrolling back away from the bottom and returning, or `items` growing enough to move the
|
|
14524
|
-
window away from the end, re-arms it), `lr-visible-range-
|
|
14525
|
-
current visible, non-overscanned item index range — fired only when it actually changes
|
|
14889
|
+
window away from the end, re-arms it), `lr-visible-range-change` (`detail: VirtualListRange`, the
|
|
14890
|
+
current visible, non-overscanned item index range — fired only when it actually changes; it was
|
|
14891
|
+
spelled `lr-visible-range-changed` before 10.0.0, the only past-tense `-changed` spelling among 58
|
|
14892
|
+
`-change`-family events, so a convention-driven `lr-${x}-change` listener silently missed it),
|
|
14526
14893
|
`lr-virtual-scroll`
|
|
14527
14894
|
(`detail: VirtualListScroll` — the scroll container moved; emitted from the same animation frame that
|
|
14528
14895
|
already coalesces native `scroll` events, so a fling produces at most one per frame and none at all
|
|
14529
|
-
when the position did not change. Unlike `lr-visible-range-
|
|
14896
|
+
when the position did not change. Unlike `lr-visible-range-change`, which only fires on index-range
|
|
14530
14897
|
changes, this reports _sub-row_ movement, which is what scroll-linked layout needs)
|
|
14531
14898
|
|
|
14532
14899
|
**Slots:** none — all content comes from `renderItem`.
|
|
@@ -14557,8 +14924,10 @@ activation target.
|
|
|
14557
14924
|
|
|
14558
14925
|
**Optional peer deps:** none.
|
|
14559
14926
|
|
|
14560
|
-
```
|
|
14561
|
-
|
|
14927
|
+
```ts
|
|
14928
|
+
import { html } from "lit";
|
|
14929
|
+
|
|
14930
|
+
const view = html`<lr-virtual-list
|
|
14562
14931
|
.items=${sessions}
|
|
14563
14932
|
.renderItem=${(item, index) => html`
|
|
14564
14933
|
<lr-conversation-item
|
|
@@ -14573,12 +14942,14 @@ activation target.
|
|
|
14573
14942
|
?has-more=${hasMorePages}
|
|
14574
14943
|
?loading=${isLoadingMore}
|
|
14575
14944
|
@lr-load-more=${() => loadNextPage()}
|
|
14576
|
-
@lr-visible-range-
|
|
14577
|
-
@lr-virtual-scroll=${(e) => console.log(
|
|
14578
|
-
></lr-virtual-list
|
|
14945
|
+
@lr-visible-range-change=${(e) => console.log("visible", e.detail.start, e.detail.end)}
|
|
14946
|
+
@lr-virtual-scroll=${(e) => console.log("scroll top", e.detail.scrollTop)}
|
|
14947
|
+
></lr-virtual-list>`;
|
|
14579
14948
|
```
|
|
14580
14949
|
|
|
14581
14950
|
```ts
|
|
14951
|
+
import { html } from "lit";
|
|
14952
|
+
|
|
14582
14953
|
// No count-sized array: only the current window is read.
|
|
14583
14954
|
const syntheticRows = {
|
|
14584
14955
|
count: 100_000,
|
|
@@ -14595,15 +14966,17 @@ html`<lr-virtual-list
|
|
|
14595
14966
|
></lr-virtual-list>`;
|
|
14596
14967
|
```
|
|
14597
14968
|
|
|
14598
|
-
```
|
|
14599
|
-
|
|
14600
|
-
|
|
14601
|
-
|
|
14969
|
+
```ts
|
|
14970
|
+
import { html } from "lit";
|
|
14971
|
+
|
|
14972
|
+
// Sticky group headers: the header is a real row, so the `groups` entries are position anchors
|
|
14973
|
+
// only (`label: ''`); the pinned copy remains strictly presentational.
|
|
14974
|
+
const view = html`<lr-virtual-list
|
|
14602
14975
|
.items=${rows}
|
|
14603
14976
|
.groups=${groupStarts /* [{ key: 'Today', label: '', startIndex: 0 }, …] */}
|
|
14604
14977
|
.renderItem=${(item, index) => (item.isHeader ? headerTemplate(item) : rowTemplate(item))}
|
|
14605
14978
|
.renderStickyGroup=${(group) => headerTemplate(group)}
|
|
14606
|
-
></lr-virtual-list
|
|
14979
|
+
></lr-virtual-list>`;
|
|
14607
14980
|
```
|
|
14608
14981
|
|
|
14609
14982
|
Every row is positioned by a `transform: translateY(offset)`, rather than page flow, so only a small
|
|
@@ -14959,13 +15332,17 @@ invention (no `wa-*`/`sl-*` counterpart).
|
|
|
14959
15332
|
anchors to its block-end edge and does not cover the full height. Has no visual effect while the effective
|
|
14960
15333
|
presentation resolves to `'inline'`.
|
|
14961
15334
|
- `label: string = ''` — accessible name for the overlay presentation's `role="dialog"`, used
|
|
14962
|
-
verbatim when set
|
|
14963
|
-
|
|
14964
|
-
|
|
14965
|
-
|
|
14966
|
-
`[
|
|
14967
|
-
the
|
|
14968
|
-
|
|
15335
|
+
verbatim when set — but a plain `aria-label` attribute on the host wins outright over `label`
|
|
15336
|
+
when both are present, the standard ARIA convention for a consumer that wants full control over
|
|
15337
|
+
the announced name (matching `lr-dialog`'s `accessibleLabel` pattern). When both the host
|
|
15338
|
+
`aria-label` and `label` are empty, this falls back to the `header` slot's content: a heading
|
|
15339
|
+
element (`h1`–`h6` or `[role="heading"]`) among the slotted header content wins if present,
|
|
15340
|
+
otherwise the header slot's combined text content is used (mirrors `lr-dialog`'s
|
|
15341
|
+
`detectHeading()` fallback, via `aria-label` rather than `aria-labelledby` since the header
|
|
15342
|
+
content is light DOM while `[part="panel"]` is in shadow DOM). A panel opened with none of a host
|
|
15343
|
+
`aria-label`, `label`, or header content uses the localized `responsivePanel` fallback (`"Panel"`
|
|
15344
|
+
in the default locale), so its dialog is never unnamed. Unused in the inline presentation, which
|
|
15345
|
+
has no dialog semantics to name.
|
|
14969
15346
|
- `overlayBreakpoint: string = '768px'` (attribute `overlay-breakpoint`) — CSS length compared with
|
|
14970
15347
|
the component's allocated inline size in `mode="auto"`; at or below it, the effective presentation
|
|
14971
15348
|
is `'overlay'`.
|
|
@@ -15383,19 +15760,16 @@ being dragged. Plus shared tokens `--lr-color-surface`, `--lr-color-border`, `--
|
|
|
15383
15760
|
|
|
15384
15761
|
```html
|
|
15385
15762
|
<div style="position: relative; block-size: 100vh;">
|
|
15386
|
-
<lr-dock-panel
|
|
15387
|
-
edge="end"
|
|
15388
|
-
extent="320px"
|
|
15389
|
-
min-extent="200px"
|
|
15390
|
-
max-extent="480px"
|
|
15391
|
-
collapsible
|
|
15392
|
-
@lr-resize-input=${(e) => updateLayoutPreview(e.detail.extent)}
|
|
15393
|
-
@lr-resize-change=${(e) => persistExtent(e.detail.extent)}
|
|
15394
|
-
@lr-collapse-change=${(e) => console.log(e.detail.collapsed)}
|
|
15395
|
-
>
|
|
15763
|
+
<lr-dock-panel edge="end" extent="320px" min-extent="200px" max-extent="480px" collapsible>
|
|
15396
15764
|
<div>Sidebar content — a chat thread list, an inspector, anything.</div>
|
|
15397
15765
|
</lr-dock-panel>
|
|
15398
15766
|
</div>
|
|
15767
|
+
<script type="module">
|
|
15768
|
+
const panel = document.querySelector("lr-dock-panel");
|
|
15769
|
+
panel.addEventListener("lr-resize-input", (e) => updateLayoutPreview(e.detail.extent));
|
|
15770
|
+
panel.addEventListener("lr-resize-change", (e) => persistExtent(e.detail.extent));
|
|
15771
|
+
panel.addEventListener("lr-collapse-change", (e) => console.log(e.detail.collapsed));
|
|
15772
|
+
</script>
|
|
15399
15773
|
```
|
|
15400
15774
|
|
|
15401
15775
|
Pointer-drag-resize admits only a primary pointer using its primary button, then mirrors
|
|
@@ -15530,6 +15904,30 @@ former brand and active-mix values when unset.
|
|
|
15530
15904
|
|
|
15531
15905
|
- every `appearance` renders on the _same_ `[part="base"]` element — there's no separate element per
|
|
15532
15906
|
variant, so a `::part(base)` override applies uniformly regardless of `appearance`.
|
|
15907
|
+
- **a card clips, it does not scroll — and it never picks a scroll owner for you.** `[part='base']`
|
|
15908
|
+
stretches to the host's allocated block-size and clips its overflow, which is what keeps a
|
|
15909
|
+
full-bleed `media`/`image` child inside the rounded border. In an auto-sized row the card simply
|
|
15910
|
+
grows and nothing is clipped; give it a _definite_ allocation (a fixed grid row, an explicit
|
|
15911
|
+
`block-size`) and body content taller than that allocation is clipped silently, with no
|
|
15912
|
+
scrollbar. Neither upstream card exposes an overflow, block-size, or scroll hook and neither does
|
|
15913
|
+
this one: the public `body` part already carries the whole decision, and a `::part()` rule from
|
|
15914
|
+
your tree wins over the shadow stylesheet regardless of specificity. A fixed-height tile that
|
|
15915
|
+
must hold more content says so itself:
|
|
15916
|
+
|
|
15917
|
+
```css
|
|
15918
|
+
.tile-grid {
|
|
15919
|
+
display: grid;
|
|
15920
|
+
grid-template-rows: 12rem;
|
|
15921
|
+
}
|
|
15922
|
+
.tile-grid lr-card::part(body) {
|
|
15923
|
+
overflow: auto;
|
|
15924
|
+
overscroll-behavior: contain;
|
|
15925
|
+
}
|
|
15926
|
+
```
|
|
15927
|
+
|
|
15928
|
+
`overflow` other than `visible` also zeroes the body's automatic minimum size, so that one
|
|
15929
|
+
declaration is enough — the body shrinks into the tile and scrolls, and `max-block-size` /
|
|
15930
|
+
`scrollbar-gutter` stay available on the same rule. The linked (`href`) card behaves identically.
|
|
15533
15931
|
- slot-presence (`header`/`media`/`image`/`footer`/`actions`/`header-actions`/`footer-actions`) is
|
|
15534
15932
|
tracked in JS, not via CSS `:empty` (a
|
|
15535
15933
|
`[part]` wrapper always contains a literal `<slot>` child, so `:empty` never matches) — the same
|
|
@@ -15609,7 +16007,10 @@ row also makes it active.
|
|
|
15609
16007
|
**Events:** `lr-open`, `lr-close` (both `detail: undefined`, cancelable — fired before the
|
|
15610
16008
|
mutation, `preventDefault()` keeps the palette in its current open state), `lr-select`
|
|
15611
16009
|
(`detail: { command }`, fired before the command's own `onSelect` runs and before the palette
|
|
15612
|
-
closes)
|
|
16010
|
+
closes), and no-detail `focus`/`blur` events re-dispatched from the host whenever the search input
|
|
16011
|
+
gains or loses focus. The `focus`/`blur` bridge is new in 10.0.0: native `focus`/`blur` neither
|
|
16012
|
+
bubble nor cross the shadow boundary, so a host-level `el.addEventListener('focus', …)` previously
|
|
16013
|
+
never fired at all.
|
|
15613
16014
|
|
|
15614
16015
|
**Slots:** none.
|
|
15615
16016
|
|
|
@@ -15720,11 +16121,20 @@ the ladder doesn't cover is a two-line override rather than a fork.
|
|
|
15720
16121
|
|
|
15721
16122
|
**Events:**
|
|
15722
16123
|
|
|
15723
|
-
- `lr-expand`, `lr-collapse`, `lr-after-expand`, `lr-after-collapse` —
|
|
16124
|
+
- `lr-expand`, `lr-collapse`, `lr-toggle-request`, `lr-after-expand`, `lr-after-collapse` —
|
|
16125
|
+
accordion group lifecycle.
|
|
15724
16126
|
- `lr-show`, `lr-hide`, `lr-toggle`, `lr-after-show`, `lr-after-hide` — Details lifecycle only.
|
|
15725
16127
|
|
|
15726
16128
|
On the accordion, `lr-expand` and `lr-collapse` fire before a direct item changes, are cancelable,
|
|
15727
|
-
and carry `detail: { item }`. **
|
|
16129
|
+
and carry `detail: { item }`. **New in 10.0.0:** a cancelable `lr-toggle-request`
|
|
16130
|
+
(`detail: { collapsed, item }`) fires alongside the matching directional event for every transition,
|
|
16131
|
+
including sibling auto-collapses in `single`/`single-collapsible` mode and `collapseAll()`. It carries
|
|
16132
|
+
the direction in the detail rather than the event name, matching `<lr-code-block>`/`<lr-chat-message>`'s
|
|
16133
|
+
`lr-toggle-request` convention, plus an `item` reference the single-panel siblings do not need (an
|
|
16134
|
+
accordion's toggling entity is one of several children, so the event target alone cannot identify it).
|
|
16135
|
+
`preventDefault()` on **either** event vetoes the transition — the two are a symmetric veto pair, not
|
|
16136
|
+
a primary and a notification. Note `<lr-thinking-panel>`'s own `lr-toggle-request` spells its detail
|
|
16137
|
+
`{ expanded }` rather than `{ collapsed }`; the two conventions are not fully unified. **Changed in 9.0.0:** `item` is now always a `LyraAccordionItem` —
|
|
15728
16138
|
it could previously also be a `LyraDetails`. The exported `LyraAccordionPanel` union that spelled
|
|
15729
16139
|
that has been removed; use `LyraAccordionItem`. An accepted transition finishes with the
|
|
15730
16140
|
non-cancelable
|
|
@@ -16745,6 +17155,35 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
16745
17155
|
|
|
16746
17156
|
# Overlays, status & feedback (`components/overlays/`)
|
|
16747
17157
|
|
|
17158
|
+
## Breaking changes in 10.0.0
|
|
17159
|
+
|
|
17160
|
+
**Breaking (event rename, v10):** `lr-dialog`'s close event is now spelled `lr-close`, and
|
|
17161
|
+
`lr-dialog-close` is removed; `lr-drawer`, which inherits the whole dialog lifecycle, loses it too.
|
|
17162
|
+
The detail (`DialogCloseReason`), the cancelability, and the position in the `lr-hide` → close →
|
|
17163
|
+
`lr-after-hide` sequence are all unchanged — only the name moved, onto the plain spelling
|
|
17164
|
+
`lr-tool-select-dialog` and the rest of the library already use. The old name is removed outright
|
|
17165
|
+
rather than dual-emitted, because the library has no released consumers and an alias is a permanent
|
|
17166
|
+
tax paid to protect users who do not exist. Rename the listener. **Breaking (default change, v10):**
|
|
17167
|
+
`lr-progress-ring` gains `showValue`/`show-value`, defaulting to `false`, so a determinate ring no
|
|
17168
|
+
longer renders its percentage unless asked. It used to render it unconditionally with no way to
|
|
17169
|
+
suppress it short of slotting replacement content, while sibling `lr-progress-bar` has had an opt-in
|
|
17170
|
+
`show-value` all along and this reference has always claimed the two share the same value contract;
|
|
17171
|
+
they now actually do. Add `show-value` to keep the percentage. The accessible value is unchanged
|
|
17172
|
+
either way — `aria-valuetext` still carries the locale-formatted percentage — and slotted replacement
|
|
17173
|
+
content still projects with or without the attribute. **Breaking (removal, v10):** `confirm()`'s
|
|
17174
|
+
deprecated `tone` option is removed from `ConfirmOptions`; use `variant` (same `'neutral' | 'danger'`
|
|
17175
|
+
values, same `'neutral'` default). It was documented as a one-major back-compat alias and `variant`
|
|
17176
|
+
already won whenever both were set, so only a caller passing `tone` alone is affected. **New,
|
|
17177
|
+
additive, non-breaking:** `lr-popover` gains `disabled` — both `lr-tooltip` and `lr-popover`'s own
|
|
17178
|
+
subclass `lr-dropdown` had it and the base did not; `lr-dropdown` now inherits it with byte-identical
|
|
17179
|
+
behavior.
|
|
17180
|
+
|
|
17181
|
+
Also corrected in 10.0.0 — not breaking, but visible. `lr-alert` really hides a base that is queued
|
|
17182
|
+
behind the visible toast window (it renders that base `hidden` and `inert`; `inert` is
|
|
17183
|
+
platform-enforced, but `hidden` was doing nothing), and `lr-badge` and `lr-chip` honor a consumer's
|
|
17184
|
+
`hidden` slotted adornment. In each case the component's own author-origin `display` declaration was
|
|
17185
|
+
beating the UA stylesheet's `[hidden] { display: none }` regardless of specificity.
|
|
17186
|
+
|
|
16748
17187
|
## Breaking changes in 9.0.0
|
|
16749
17188
|
|
|
16750
17189
|
**Breaking (type-only, v9):** `lr-toast`'s exported `ToastPlacement`, `ToastCreateOptions`, and
|
|
@@ -16775,7 +17214,7 @@ boolean, and all three drive the same code path: `el.show()` is indistinguishabl
|
|
|
16775
17214
|
`el.open = true`, and `el.hide()` from `el.open = false`. The property, the reflected attribute and
|
|
16776
17215
|
the two methods can therefore never disagree, and each method is a no-op when the overlay is already
|
|
16777
17216
|
in the requested state. `lr-dialog` and `lr-drawer` keep `close(reason)` alongside — `hide()` plus
|
|
16778
|
-
the reason string that `lr-
|
|
17217
|
+
the reason string that `lr-close` carries.
|
|
16779
17218
|
|
|
16780
17219
|
**Four events, and where the veto sits.**
|
|
16781
17220
|
|
|
@@ -16799,9 +17238,32 @@ with matching timing _and_ matching cancelability — which also means Lyra 7.x
|
|
|
16799
17238
|
relying on the opposite polarity and has to be re-read.
|
|
16800
17239
|
|
|
16801
17240
|
`lr-dialog` and `lr-drawer` also expose cancelable `lr-initial-focus` and `lr-request-close` veto
|
|
16802
|
-
points, documented in their sections. Their cancelable `lr-
|
|
16803
|
-
|
|
16804
|
-
all
|
|
17241
|
+
points, documented in their sections. Their cancelable `lr-close` fires **after** `lr-hide` and
|
|
17242
|
+
before `lr-after-hide`; it carries the close reason as `detail: DialogCloseReason`. Vetoing
|
|
17243
|
+
`lr-hide` stops it from firing at all, and `preventDefault()` on `lr-close` itself also vetoes the
|
|
17244
|
+
close. The same name is already used by the `lr-tool-select-dialog`/`lr-tool-result-dialog`/
|
|
17245
|
+
`lr-tool-approval-dialog` trio, which mirrors this identical detail shape, so one listener covers
|
|
17246
|
+
all of them. `lr-drawer` inherits `lr-close` unchanged.
|
|
17247
|
+
|
|
17248
|
+
> **`lr-close` is not a dialog-scoped name — filter by target.** Nine components in this library
|
|
17249
|
+
> emit `lr-close`, several of them commonly nested *inside* a dialog: `<lr-callout>` (an inline
|
|
17250
|
+
> notice above a form), `<lr-tab>`/`<lr-tab-group>`, `<lr-command-palette>`,
|
|
17251
|
+
> `<lr-document-viewer>`, `<lr-responsive-panel>`, and the three tool dialogs. Library events bubble
|
|
17252
|
+
> and are composed, so a listener bound directly on `<lr-dialog>` **also receives a descendant's
|
|
17253
|
+
> close** — a closable callout inside a dialog would otherwise dismiss the whole dialog. The details
|
|
17254
|
+
> differ too (`<lr-callout>` and `<lr-tab>` carry none, where the dialog carries a
|
|
17255
|
+
> `DialogCloseReason`), so a handler reading `event.detail.reason` throws on a foreign one. It is
|
|
17256
|
+
> latent rather than broken-on-arrival, because a callout or tab only emits once it is given a close
|
|
17257
|
+
> affordance — which is what makes it a bad failure mode: it shows up later and presents as the
|
|
17258
|
+
> dialog dismissing itself. Guard on the target, the way `<lr-document-viewer>` already does
|
|
17259
|
+
> internally:
|
|
17260
|
+
>
|
|
17261
|
+
> ```js
|
|
17262
|
+
> dialog.addEventListener('lr-close', (event) => {
|
|
17263
|
+
> if (event.target !== event.currentTarget) return; // a descendant's close, not this dialog's
|
|
17264
|
+
> // ...
|
|
17265
|
+
> });
|
|
17266
|
+
> ```
|
|
16805
17267
|
|
|
16806
17268
|
**The top layer.** An open `lr-dialog` or modal `lr-drawer` is promoted into the browser **top layer**
|
|
16807
17269
|
(through `popover="manual"`) rather than stacked with `z-index`. It therefore escapes every ancestor
|
|
@@ -17217,7 +17679,7 @@ A modal panel anchored to one logical edge of the viewport. `LyraDrawer` extends
|
|
|
17217
17679
|
inherits the entire dialog contract unchanged: focus trapping, Escape and opt-in backdrop dismissal,
|
|
17218
17680
|
document scroll locking, browser **top-layer** promotion, overlay stacking, accessible naming, the
|
|
17219
17681
|
`show()`/`hide()`/`close()` methods and the whole
|
|
17220
|
-
`lr-show`/`lr-after-show`/`lr-hide`/`lr-after-hide`/`lr-
|
|
17682
|
+
`lr-show`/`lr-after-show`/`lr-hide`/`lr-after-hide`/`lr-close` lifecycle. `contained` switches
|
|
17221
17683
|
to an absolute, nonmodal panel inside the nearest containing block; only that mode, `placement`, and
|
|
17222
17684
|
the slide animation are its own.
|
|
17223
17685
|
|
|
@@ -17248,8 +17710,8 @@ the slide animation are its own.
|
|
|
17248
17710
|
promise settles after the matching `lr-after-*` event.
|
|
17249
17711
|
|
|
17250
17712
|
**Events:** `lr-show` (cancelable), `lr-after-show`, `lr-hide` (cancelable), `lr-after-hide`, and
|
|
17251
|
-
`lr-initial-focus` (cancelable), `lr-request-close` (cancelable, detail source), and
|
|
17252
|
-
|
|
17713
|
+
`lr-initial-focus` (cancelable), `lr-request-close` (cancelable, detail source), and `lr-close`
|
|
17714
|
+
(`detail: DialogCloseReason`, cancelable) — all inherited unchanged from
|
|
17253
17715
|
`lr-dialog`; see that section for details and veto rules. `lr-after-show` /
|
|
17254
17716
|
`lr-after-hide` fire once the slide animation has finished, so they are deferred by roughly one
|
|
17255
17717
|
animation compared with the state flip.
|
|
@@ -17376,13 +17838,19 @@ chrome remains visible. The fallback order appears below.
|
|
|
17376
17838
|
- `lr-request-close` — cancelable request from a built-in affordance; detail source is
|
|
17377
17839
|
`'close-button' | 'keyboard' | 'overlay'`. Veto stops the close lifecycle. Direct `close()` and
|
|
17378
17840
|
`hide()` calls do not emit this request event.
|
|
17379
|
-
- `lr-
|
|
17841
|
+
- `lr-close` — cancelable, with `detail: DialogCloseReason`; emitted after `lr-hide`. The same name
|
|
17842
|
+
is already used by `<lr-tool-select-dialog>`, `<lr-tool-result-dialog>`, and
|
|
17843
|
+
`<lr-tool-approval-dialog>`, whose own docs describe an identical detail shape, so one listener
|
|
17844
|
+
covers all of them. A listener calling `preventDefault()` vetoes the close. Also fired (with
|
|
17845
|
+
reason `'unmount'`, non-cancelable there) when the dialog is removed from the DOM while still
|
|
17846
|
+
open. **But the name is not dialog-scoped** — see the target-filtering note above; nine
|
|
17847
|
+
components emit `lr-close`, and several are routinely nested inside a dialog.
|
|
17380
17848
|
|
|
17381
17849
|
The two `lr-after-*` events are never cancelable.
|
|
17382
17850
|
|
|
17383
17851
|
The open sequence is `lr-show` → `lr-initial-focus` (when focus would move) → `lr-after-show`; the
|
|
17384
|
-
direct close sequence is `lr-hide` → `lr-
|
|
17385
|
-
prepends `lr-request-close`. **Both state pre-events fire _before_ the state changes**, so reading
|
|
17852
|
+
direct close sequence is `lr-hide` → `lr-close` → `lr-after-hide`.
|
|
17853
|
+
A built-in dismissal prepends `lr-request-close`. **Both state pre-events fire _before_ the state changes**, so reading
|
|
17386
17854
|
`el.open` inside an `lr-show`/`lr-hide` handler returns the _old_ value — this is the polarity
|
|
17387
17855
|
`wa-show`/`wa-hide` already had, and the opposite of what Lyra 7.x's own `lr-show`/`lr-hide` did on
|
|
17388
17856
|
`lr-popover`/`lr-dropdown`. The `wa-*` → `lr-*` migration table treats the rename as mechanical, and
|
|
@@ -17398,8 +17866,8 @@ and easing. Under `prefers-reduced-motion: reduce`, registry timing flattens to
|
|
|
17398
17866
|
frame and lifecycle remain intact. Passing `null` skips native interpolation but still emits the
|
|
17399
17867
|
matching after-event before the method promise resolves. Because dialogs now animate on close too,
|
|
17400
17868
|
`lr-after-hide` is normally deferred by roughly one animation. A removal while open emits
|
|
17401
|
-
`lr-hide`, `lr-
|
|
17402
|
-
cancelable, since the element is already gone.
|
|
17869
|
+
`lr-hide`, `lr-close` (reason `'unmount'`) and `lr-after-hide` in that
|
|
17870
|
+
order, none of them cancelable, since the element is already gone.
|
|
17403
17871
|
|
|
17404
17872
|
**Stacking and the top layer:** an open dialog is promoted into the browser **top layer** (via
|
|
17405
17873
|
`popover="manual"`), new in 8.0.0. That means it escapes every ancestor stacking context and every
|
|
@@ -17488,7 +17956,7 @@ Otherwise shared tokens include `--lr-space-l/-m/-s`, `--lr-color-surface/-borde
|
|
|
17488
17956
|
dlg.addEventListener("lr-after-show", () =>
|
|
17489
17957
|
console.log("enter animation done")
|
|
17490
17958
|
);
|
|
17491
|
-
dlg.addEventListener("lr-
|
|
17959
|
+
dlg.addEventListener("lr-close", (e) =>
|
|
17492
17960
|
console.log("closed:", e.detail)
|
|
17493
17961
|
);
|
|
17494
17962
|
dlg.addEventListener("lr-after-hide", () =>
|
|
@@ -17571,7 +18039,7 @@ if (ok) deleteConversation();
|
|
|
17571
18039
|
```
|
|
17572
18040
|
|
|
17573
18041
|
`confirm(options: ConfirmOptions): Promise<boolean>` where
|
|
17574
|
-
`ConfirmOptions = { title: string; description?: string; confirmLabel?: string /* = 'Confirm' */; cancelLabel?: string /* = 'Cancel' */; variant?: 'neutral' | 'danger' /* = 'neutral'
|
|
18042
|
+
`ConfirmOptions = { title: string; description?: string; confirmLabel?: string /* = 'Confirm' */; cancelLabel?: string /* = 'Cancel' */; variant?: 'neutral' | 'danger' /* = 'neutral' */ }`.
|
|
17575
18043
|
|
|
17576
18044
|
Resolves `true` only when the confirm button is pressed — Escape, a backdrop click, and the cancel
|
|
17577
18045
|
button all resolve `false`. It sets `lightDismiss = true` on its transient dialog explicitly, so the
|
|
@@ -17582,8 +18050,8 @@ of the call and removes it once settled, rather than reusing a persistent page-l
|
|
|
17582
18050
|
stack, each tied to its own returned promise. `title` becomes a direct light-DOM `<h2>`, which per `<lr-dialog>`'s
|
|
17583
18051
|
own heading-detection also drives the dialog's accessible name; `description`, if provided, becomes
|
|
17584
18052
|
a direct light-DOM `<p>`. `variant: 'danger'` fills the confirm button with `--lr-color-danger`
|
|
17585
|
-
instead of `--lr-color-brand`, for destructive actions. The deprecated `tone` option
|
|
17586
|
-
|
|
18053
|
+
instead of `--lr-color-brand`, for destructive actions. The deprecated `tone` option that preceded
|
|
18054
|
+
`variant` was removed in 10.0.0. Confirm/cancel actions deliberately use native
|
|
17587
18055
|
inline-styled `<button>` elements so this helper does not register or import the broader button
|
|
17588
18056
|
component; every color value is still a `--lr-*` token reference, never a raw literal. They carry the same interaction
|
|
17589
18057
|
states as every other control in the library: a hover/pressed fill mixed toward
|
|
@@ -17596,7 +18064,7 @@ their `data-lr-confirm-action` attribute.
|
|
|
17596
18064
|
**Known gotchas:**
|
|
17597
18065
|
|
|
17598
18066
|
- Every dismissal path (confirm button, cancel button, Escape, backdrop click) funnels through
|
|
17599
|
-
`<lr-dialog>`'s own `close()`/`lr-
|
|
18067
|
+
`<lr-dialog>`'s own `close()`/`lr-close` event, so there is exactly one place that
|
|
17600
18068
|
resolves the promise and tears the dialog down — a consumer never needs to (and shouldn't) call
|
|
17601
18069
|
`.remove()` itself. Because the close event is cancelable, `confirm()` waits through the full
|
|
17602
18070
|
dispatch and remains pending/mounted when a listener calls `preventDefault()`.
|
|
@@ -18083,7 +18551,31 @@ A click-triggered, light-dismiss floating surface positioned with the shared Flo
|
|
|
18083
18551
|
- `accessibleLabel: string = ''` (attribute **`aria-label`**) — names the popup. An authored host
|
|
18084
18552
|
attribute wins by presence, including `aria-label=""`; only when it is absent does the property
|
|
18085
18553
|
or localized "Popover" ("Menu" when `popupRole` is `menu`) fallback apply
|
|
18086
|
-
- `popupRole: 'dialog'|'menu' = 'dialog'` (attribute `popup-role`)
|
|
18554
|
+
- `popupRole: 'dialog'|'menu'|'none' = 'dialog'` (attribute `popup-role`). `none` (new in 10.1.0)
|
|
18555
|
+
renders **no** `role` and no generated `aria-label` on the popup surface, and leaves
|
|
18556
|
+
`aria-haspopup` off the trigger, so slotted content owns its own semantics and accessible name.
|
|
18557
|
+
It exists for the WAI-ARIA **disclosure navigation** pattern: a flyout of links is not an
|
|
18558
|
+
application action menu (`menu` announces "menu, menu item" and expects `menuitem` children) and
|
|
18559
|
+
is not an interruptive surface (`dialog`). The `aria-expanded`/`aria-controls` wiring that pattern
|
|
18560
|
+
requires is unchanged, as are light dismiss, Escape, focus return, and positioning:
|
|
18561
|
+
|
|
18562
|
+
```html
|
|
18563
|
+
<lr-popover popup-role="none">
|
|
18564
|
+
<button slot="trigger">Products</button>
|
|
18565
|
+
<nav aria-label="Products">
|
|
18566
|
+
<ul><li><a href="/overview">Overview</a></li><li><a href="/pricing">Pricing</a></li></ul>
|
|
18567
|
+
</nav>
|
|
18568
|
+
</lr-popover>
|
|
18569
|
+
```
|
|
18570
|
+
|
|
18571
|
+
Note there is deliberately no `aria-haspopup="none"` — that is an invalid attribute value, not a
|
|
18572
|
+
neutral one, and axe reports it as a critical violation. `lr-dropdown` still pins `popupRole` to
|
|
18573
|
+
`menu`; the escape hatch lives on the general-purpose primitive.
|
|
18574
|
+
- `disabled: boolean = false` (reflected, new in 10.0.0) — prevents opening the popover; pointer,
|
|
18575
|
+
keyboard, and programmatic `show()`/`open = true` are all refused while set. Becoming disabled also
|
|
18576
|
+
closes an already-open popover, and initial `disabled` plus `open` normalizes closed in either
|
|
18577
|
+
attribute order. `lr-dropdown` now inherits this from `lr-popover` rather than declaring its own;
|
|
18578
|
+
its consumer-facing behavior is unchanged
|
|
18087
18579
|
|
|
18088
18580
|
To preserve the previous Lyra-shaped defaults explicitly, use
|
|
18089
18581
|
`placement="bottom-start" distance="4" without-arrow`; origin-aware migration emits those tokens.
|
|
@@ -18554,6 +19046,7 @@ A circular progress indicator with the same value contract as `lr-progress-bar`.
|
|
|
18554
19046
|
**Properties:** `value: number = 0` (reflected), `max: number = 100`, `indeterminate: boolean = false`
|
|
18555
19047
|
(reflected), `variant: LyraProgressVariant = 'brand'` (reflected, added in 9.0.0 — matches sibling
|
|
18556
19048
|
`lr-progress-bar`'s semantic-palette vocabulary: `neutral`/`brand`/`success`/`warning`/`danger`),
|
|
19049
|
+
`showValue: boolean = false` (attribute `show-value`),
|
|
18557
19050
|
`label: string = ''` (the mapped accessible-name property), and
|
|
18558
19051
|
`accessibleLabel: string = ''` (attribute `accessible-label`; a Lyra compatibility
|
|
18559
19052
|
accessible-name spelling retained by this progress component, while several sibling components use
|
|
@@ -18563,7 +19056,13 @@ visible default-slot text when supplied, then the localized "Progress". Non-fini
|
|
|
18563
19056
|
`value`/`max` are normalized (`max <= 0` falls
|
|
18564
19057
|
back to `100`, `value` clamps to `[0, max]`) rather than producing NaN geometry.
|
|
18565
19058
|
**Slots:** default — replaces the built-in center label, which otherwise renders the rounded
|
|
18566
|
-
percentage (and nothing at all while `indeterminate`).
|
|
19059
|
+
percentage **only when `show-value` is set** (and nothing at all while `indeterminate`).
|
|
19060
|
+
**Breaking in 10.0.0:** a determinate ring used to render its percentage unconditionally, with no way
|
|
19061
|
+
to suppress it short of slotting replacement content. It now gains `showValue`/`show-value` defaulting
|
|
19062
|
+
to `false`, exactly matching `lr-progress-bar` — which is what "the same value contract as
|
|
19063
|
+
`lr-progress-bar`" above has always claimed but did not deliver. Add `show-value` to keep the
|
|
19064
|
+
percentage. `aria-valuetext` still carries it regardless, mirroring `lr-progress-bar`'s own
|
|
19065
|
+
independence there, so the accessible value is unaffected.
|
|
18567
19066
|
Its accessible text uses the same visibility filtering, forwarding-slot mutation/reassignment
|
|
18568
19067
|
tracking, and explicit-empty host-label precedence as `lr-progress-bar`.
|
|
18569
19068
|
**Live members:** `indicator: SVGCircleElement | null` returns the rendered indicator circle (or
|
|
@@ -19147,7 +19646,6 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
19147
19646
|
confirmLabel: unknown;
|
|
19148
19647
|
cancelLabel: unknown;
|
|
19149
19648
|
variant: unknown;
|
|
19150
|
-
tone: unknown;
|
|
19151
19649
|
}`
|
|
19152
19650
|
|
|
19153
19651
|
- **`components-overlays-dialog-dialog-contracts`** — Supporting data types and helpers for this component family.
|
|
@@ -20707,7 +21205,9 @@ assigned nodes update the announcement without requiring the wrapper component t
|
|
|
20707
21205
|
|
|
20708
21206
|
The `label` part alias was deprecated in 8.0.0 in favor of the shared form vocabulary
|
|
20709
21207
|
`form-control-label`. Both names remain on the same node during the compatibility window; use
|
|
20710
|
-
`::part(form-control-label)` in new CSS.
|
|
21208
|
+
`::part(form-control-label)` in new CSS. Removal is not scheduled: Web Awesome still publishes its
|
|
21209
|
+
own deprecated `label` part on `<wa-known-date>`, and a mirrored tag owes its whole upstream
|
|
21210
|
+
surface, so the alias goes only when upstream's does.
|
|
20711
21211
|
|
|
20712
21212
|
**The required marker.** The `*` the legend grows while `required` is the library's shared
|
|
20713
21213
|
required-field marker, and it takes the same three consumer-settable properties every other
|
|
@@ -20873,6 +21373,19 @@ behavior warning; direct SVG candidates and the documented animation vocabulary
|
|
|
20873
21373
|
used (a11y-tree inconsistencies across engines).
|
|
20874
21374
|
- Slot/focus microtasks and autoplay never queue new selection work while detached; reconnecting
|
|
20875
21375
|
starts again from current state rather than replaying stale work.
|
|
21376
|
+
- Non-selected candidates are hidden by the component's own `::slotted([hidden])` rule, not by the
|
|
21377
|
+
UA's. `::slotted(*)` sets `display: inline-block` on every candidate, and an author-origin
|
|
21378
|
+
declaration always beats the user-agent `[hidden] { display: none }` — so the rule that restores
|
|
21379
|
+
the native meaning of `hidden` is load-bearing, and an author overriding `display` on
|
|
21380
|
+
`::slotted` content from outside must keep the hidden case at `display: none`.
|
|
21381
|
+
`hidden="until-found"` is exempted, exactly as the UA rule exempts it.
|
|
21382
|
+
- **Before script runs, the first candidate is the one that shows.** Selection happens after the
|
|
21383
|
+
first client render and works by setting `hidden`/`aria-hidden` on light-DOM siblings, which Lit
|
|
21384
|
+
hydration never compares, so a server renderer can never produce it. Every candidate after the
|
|
21385
|
+
first is therefore hidden by CSS until a selection has been applied: a server-rendered page — or
|
|
21386
|
+
one whose script never runs — paints one candidate rather than the whole pool. Randomness itself
|
|
21387
|
+
cannot survive SSR (there is no shared seed), so order the pool if a specific candidate should be
|
|
21388
|
+
the pre-hydration one. With `items > 1` the pre-hydration paint is still a single candidate.
|
|
20876
21389
|
|
|
20877
21390
|
## `lr-tour`
|
|
20878
21391
|
|
|
@@ -21089,6 +21602,37 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
21089
21602
|
|
|
21090
21603
|
# Media, files & maps (`components/media/`)
|
|
21091
21604
|
|
|
21605
|
+
## Breaking changes in 10.0.0
|
|
21606
|
+
|
|
21607
|
+
`<lr-media-card>`'s `alt` becomes optional (`alt?: string`, was `alt: string = ''`), so a decorative
|
|
21608
|
+
image is expressible at last. The image render used to fall through `alt`, then `filename`, then a
|
|
21609
|
+
localized generic description with `||`, which made an explicit `alt=""` indistinguishable from an
|
|
21610
|
+
absent one and published it as `alt="Image attachment"` — there was no way to mark the image
|
|
21611
|
+
decorative, which is the one thing
|
|
21612
|
+
`alt=""` means in HTML. It now reads `??`, matching `<lr-image-viewer>` and `<lr-document-preview>`,
|
|
21613
|
+
which already documented that contract. Omitting `alt` is unchanged; only the value read back from
|
|
21614
|
+
an unset property differs (`''` becomes `undefined`), so a consumer comparing `el.alt === ''` should
|
|
21615
|
+
read `el.alt ?? ''`. The nested `<video controls>` label deliberately does **not** follow: an empty
|
|
21616
|
+
`alt` there would leave an interactive player with no accessible name, and "decorative" is not a
|
|
21617
|
+
state a media control can be in, so the video path still falls through to `filename` and the generic
|
|
21618
|
+
description.
|
|
21619
|
+
|
|
21620
|
+
`<lr-attachment-chip>`'s `lr-preview-request` is no longer cancelable. It was advertised as a veto
|
|
21621
|
+
point, but the chip never read `defaultPrevented` and owns no preview default action to cancel — it
|
|
21622
|
+
never registers or owns a viewer or overlay, by its own documented contract — so `preventDefault()`
|
|
21623
|
+
was a no-op. The flag is removed rather than left as a promise the component cannot keep: a host that
|
|
21624
|
+
was calling `preventDefault()` can drop the call, and one that believed the call was suppressing
|
|
21625
|
+
something was never being served. `<lr-voice-picker>`'s same-named event belongs to a different
|
|
21626
|
+
component, owns a real internal default action, and stays cancelable.
|
|
21627
|
+
|
|
21628
|
+
Also corrected in 10.0.0 — not breaking, but visible. `<lr-flag>` no longer paints a full-size
|
|
21629
|
+
undecoded image beside its own skeleton while loading; `<lr-video>` no longer keeps a second,
|
|
21630
|
+
duplicate controls play button both painted and focusable behind a poster, and it now keeps captions
|
|
21631
|
+
for a `<track>` with no `kind` attribute, whose HTML missing-value default is `subtitles`; and
|
|
21632
|
+
`<lr-avatar>` and `<lr-image-comparer>` honor a consumer's `hidden` slotted child. In each case the
|
|
21633
|
+
component's own author-origin declaration was beating the UA stylesheet's `[hidden] { display: none }`
|
|
21634
|
+
regardless of specificity.
|
|
21635
|
+
|
|
21092
21636
|
## Breaking changes in 9.0.0
|
|
21093
21637
|
|
|
21094
21638
|
`<lr-media-card>`'s `accessibleLabel` property now defaults to `null` instead of `''`
|
|
@@ -21104,7 +21648,16 @@ Country/language flag image. Flag artwork ships in a **separate, optional peer p
|
|
|
21104
21648
|
|
|
21105
21649
|
**Properties:**
|
|
21106
21650
|
|
|
21107
|
-
- `country?: string` (ISO 3166-1 alpha-2
|
|
21651
|
+
- `country?: string` (ISO 3166-1 **alpha-2 or alpha-3**, e.g. `"fr"` or `"FRA"` — takes
|
|
21652
|
+
precedence over `language`). Length alone disambiguates the two code spaces, so no format hint
|
|
21653
|
+
is needed: a 2-letter value is alpha-2, a 3-letter value is alpha-3. Alpha-3 support exists
|
|
21654
|
+
because public statistical sources (World Bank, UN, IMF, most open-data portals) key country
|
|
21655
|
+
records on alpha-3; the 249 officially-assigned mappings are packed as a ~1.2 KB fixed-width
|
|
21656
|
+
string and expanded lazily on the first alpha-3 lookup, so an alpha-2-only app never pays for
|
|
21657
|
+
them. Withdrawn and user-assigned codes deliberately do not map to a successor state — they
|
|
21658
|
+
take the unresolved path below
|
|
21659
|
+
- `fallback?: string` — placeholder image URL rendered when the code cannot resolve to a current
|
|
21660
|
+
flag. The `fallback` slot wins over it
|
|
21108
21661
|
- `language?: string` (BCP-47-ish tag, e.g. `"en"`/`"en-US"`, resolved to a representative country
|
|
21109
21662
|
via `languageToCountry()`)
|
|
21110
21663
|
- `src?: string` (a pre-resolved flag image URL — takes precedence over `country`/`language` and
|
|
@@ -21129,11 +21682,17 @@ authoring types are `LyraFlagShape`, `LyraFlagFidelity`, and `LyraFlagUrlResolve
|
|
|
21129
21682
|
|
|
21130
21683
|
**Events:** none.
|
|
21131
21684
|
|
|
21132
|
-
**Slots:**
|
|
21685
|
+
**Slots:** `fallback` — rendered in place of the flag when `country`/`language` cannot resolve to a
|
|
21686
|
+
current flag (an unassigned, historical, or malformed code). Wins over the `fallback` property.
|
|
21133
21687
|
|
|
21134
|
-
**CSS parts:** `image` (the underlying `<img>`, exposed once native loading succeeds),
|
|
21688
|
+
**CSS parts:** `image` (the underlying `<img>`, exposed once native loading succeeds),
|
|
21689
|
+
`fallback-image` (the `fallback` property's placeholder, when no slot content is supplied), `error`
|
|
21135
21690
|
(contained localized visible text rendered when URL validation, peer resolution, or native image
|
|
21136
|
-
loading fails). The host reflects the terminal error state with `data-error
|
|
21691
|
+
loading fails). The host reflects the terminal error state with `data-error`, and an unresolvable
|
|
21692
|
+
code with `data-unresolved`. **The two are deliberately distinct:** a dissolved federation or
|
|
21693
|
+
unrecognized territory in a longitudinal dataset is *data*, not a defect, so it renders the neutral
|
|
21694
|
+
fallback (occupying its normal footprint in a table or card grid) rather than localized error
|
|
21695
|
+
wording that reads to a user as a bug. Style the two states apart with those attributes.
|
|
21137
21696
|
|
|
21138
21697
|
**Themeable custom properties:** `--lr-flag-radius` (default `calc(var(--lr-radius) * 0.33)` —
|
|
21139
21698
|
rectangular corner radius), `--lr-flag-aspect-ratio` (default `4 / 3`), and
|
|
@@ -21143,8 +21702,10 @@ rectangular corner radius), `--lr-flag-aspect-ratio` (default `4 / 3`), and
|
|
|
21143
21702
|
image when `country` or `language` is used. Import
|
|
21144
21703
|
`@aceshooting/lyra-ui/components/media/flag/flag-peer.js` once to opt into
|
|
21145
21704
|
that resolver; a pre-resolved `src` works without the peer registration entry. If the peer is not
|
|
21146
|
-
installed
|
|
21147
|
-
|
|
21705
|
+
installed — or if `flag-peer.js` was simply never imported, which looks identical from the page —
|
|
21706
|
+
the component fails closed with localized visible `[part="error"]` text, a shared light-DOM
|
|
21707
|
+
assertive announcement, and a one-time `console.warn` naming the unresolved code and this import
|
|
21708
|
+
(see gotchas).
|
|
21148
21709
|
|
|
21149
21710
|
Also exported from the package root:
|
|
21150
21711
|
`languageToCountry(language: string): string | undefined` and the `LANGUAGE_TO_COUNTRY` lookup
|
|
@@ -21230,7 +21791,12 @@ import "@aceshooting/lyra-ui/components/media/flag/flag-peer.js";
|
|
|
21230
21791
|
`[data-lr-live-region="assertive"]` sink, so the shadow chrome itself is not live and identical
|
|
21231
21792
|
retries remain separate additions. The failure also produces a one-time `console.warn`
|
|
21232
21793
|
once the resolver rejects (lazy `import()`, cached module-wide so the warning fires only once per
|
|
21233
|
-
page even with many `<lr-flag>` instances).
|
|
21794
|
+
page even with many `<lr-flag>` instances). A **separate** one-time `console.warn` covers the
|
|
21795
|
+
commonest setup mistake — `country`/`language` set while no resolver was ever registered, i.e.
|
|
21796
|
+
`flag-peer.js` was not imported. It names the offending code and that import path, because the
|
|
21797
|
+
visible `[part="error"]` state alone is indistinguishable from missing flag data. It is armed
|
|
21798
|
+
once per resolver-registration generation, so a table of many flags warns once.
|
|
21799
|
+
An _empty_ template is a different, non-error outcome:
|
|
21234
21800
|
the peer resolved fine but returned no URL for that code (e.g. `country="zz"`) — no `[part="error"]`,
|
|
21235
21801
|
no `<img>`, no warning.
|
|
21236
21802
|
- Rendering is async even when the peer _is_ installed: `src` resolves after an `import()` +
|
|
@@ -21384,6 +21950,22 @@ operations. Its runtime value is the underlying MapLibre map.
|
|
|
21384
21950
|
style-required failure and makes no tile/style request. Assign a hosted vector/raster style from
|
|
21385
21951
|
a provider whose terms fit your application, or an explicitly network-silent style for local
|
|
21386
21952
|
geometry.
|
|
21953
|
+
- `legendGradient: readonly (readonly [number, string])[] = []` (attribute: false, type
|
|
21954
|
+
`LyraMapLegendGradientStop[]`) — renders the legend as a **continuous** gradient bar with endpoint
|
|
21955
|
+
captions instead of (or alongside) the discrete `legend` swatches, which is the standard key for a
|
|
21956
|
+
choropleth whose `interpolate` fill is itself a continuous ramp. Takes the same `[value, color]`
|
|
21957
|
+
stop shape as `choropleth.stops`, so the usual assignment is `map.legendGradient =
|
|
21958
|
+
myChoropleth.stops` and the key cannot drift from the layer it describes. Stops are sorted
|
|
21959
|
+
ascending, bounded to 64, and filtered to finite values carrying a CSS-parsable color; fewer than
|
|
21960
|
+
two usable stops render no bar at all, since a one-stop "gradient" is a flat block that describes
|
|
21961
|
+
nothing. Each stop sits at its true proportion of the value range, so the bar shows the ramp the
|
|
21962
|
+
expression actually produces rather than evenly spacing unevenly-spaced values. Part names
|
|
21963
|
+
(`legend-gradient`, `legend-lo`, `legend-hi`) mirror `lr-heatmap`'s gradient legend, and the bar
|
|
21964
|
+
is `aria-hidden`/`inert` with the captions carrying the meaning. Mirrors under RTL
|
|
21965
|
+
- `legendGradientLoLabel: string | null = null` (attribute `legend-gradient-lo-label`),
|
|
21966
|
+
`legendGradientHiLabel: string | null = null` (attribute `legend-gradient-hi-label`) — override
|
|
21967
|
+
the endpoint captions, which otherwise default to the lowest/highest stop value in the component's
|
|
21968
|
+
own locale-aware numeric formatting
|
|
21387
21969
|
- `legend: readonly LyraMapLegendEntry[] = []` (attribute: false) — immutable defensive snapshots
|
|
21388
21970
|
of `LyraMapLegendEntry { readonly color: string; readonly label: string; readonly pattern:
|
|
21389
21971
|
LyraMapLegendPattern }`, where `LyraMapLegendPattern` is `'solid' | 'diagonal' | 'dots' |
|
|
@@ -21395,10 +21977,27 @@ omittedCount, truncatedLabelCount, truncated }` result for the latest assignment
|
|
|
21395
21977
|
projection renders a localized visible `1–N of M items` summary rather than silently claiming
|
|
21396
21978
|
the bounded rows are complete.
|
|
21397
21979
|
- `choropleth?: LyraMapChoroplethLayer` (attribute: false) — `LyraMapChoroplethLayer { sourceId:
|
|
21398
|
-
string; geojson: GeoJSON.FeatureCollection; field: string; stops: [number, string][]
|
|
21980
|
+
string; geojson: GeoJSON.FeatureCollection; field: string; stops: [number, string][]; interpolation?:
|
|
21981
|
+
'linear' | 'logarithmic' | 'step'; stepBaseColor?: string }` (interpolated
|
|
21399
21982
|
fill-color expression from `field`'s value against `stops`; `stops` must contain at least one
|
|
21400
21983
|
`[value, color]` pair — an empty array is ignored, leaving whatever fill layer already exists, if
|
|
21401
|
-
any, untouched, rather than being applied)
|
|
21984
|
+
any, untouched, rather than being applied).
|
|
21985
|
+
`interpolation` (type `LyraMapChoroplethInterpolation`, default `'linear'`) chooses how the colour
|
|
21986
|
+
is interpolated between stops. `'logarithmic'` compresses the ramp, which is what a heavy-tailed
|
|
21987
|
+
quantity — price, population, income — needs: on a linear ramp every value below the maximum falls
|
|
21988
|
+
into the first colour band, so the map reads as one flat colour plus a couple of outliers. It
|
|
21989
|
+
emits maplibre's own `['interpolate', ['exponential', 0.25], …]`, exposing an existing capability
|
|
21990
|
+
rather than adding one (maplibre has no `['log']` interpolation type; a sub-1 exponential base is
|
|
21991
|
+
the documented way to weight a ramp toward the low end). **`stops` stay in the data's own units
|
|
21992
|
+
under either mode**, so the legend keeps reading in real values instead of log units — no
|
|
21993
|
+
pre-transforming to log10 and hand-relabelling the legend back.
|
|
21994
|
+
`'step'` (new in 10.1.0) emits maplibre's `['step', …]` instead of `['interpolate', …]`, giving
|
|
21995
|
+
**discrete bands rather than a continuous ramp**. Use it whenever the legend advertises a fixed
|
|
21996
|
+
set of ranges with one swatch each: a ramp would put colours on the map that appear nowhere in the
|
|
21997
|
+
legend, and would render two regions in the same advertised band as visibly different colours
|
|
21998
|
+
(`legendGradient` covers the opposite case, a gradient legend). `stepBaseColor` is the colour for
|
|
21999
|
+
values below the first threshold, which `['step', …]` requires; it defaults to the first stop's own
|
|
22000
|
+
colour, so a legend whose first band starts at the data minimum needs no extra configuration
|
|
21402
22001
|
- `markers: LyraMapMarker[] = []` (attribute: false) — `LyraMapMarker { id?: string; lngLat:
|
|
21403
22002
|
[number, number]; color?: string; label?: string; unsafeHtml?: string }`; an explicit `id` is
|
|
21404
22003
|
trimmed and must be nonempty, and the first marker for an explicit ID wins. Markers are reconciled
|
|
@@ -21420,11 +22019,21 @@ string; geojson: GeoJSON.FeatureCollection; field: string; stops: [number, strin
|
|
|
21420
22019
|
- `dataLayers: LyraMapGeoJsonDataLayer[] = []` (attribute: false) —
|
|
21421
22020
|
`LyraMapGeoJsonDataLayer { sourceId: string; geojson: GeoJSON.Feature |
|
|
21422
22021
|
GeoJSON.FeatureCollection; tone?: 'accent' | 'success' | 'warning' |
|
|
21423
|
-
'danger' | 'neutral' }`. `sourceId` is trimmed and must be nonempty; the first layer for a
|
|
22022
|
+
'danger' | 'neutral'; color?: string; strokeColor?: string }`. `sourceId` is trimmed and must be nonempty; the first layer for a
|
|
21424
22023
|
`sourceId` wins and blank or later duplicate records are ignored. Each retained entry adds one
|
|
21425
22024
|
GeoJSON source plus three geometry-filtered layers
|
|
21426
22025
|
(fill, line, and circle, so a mixed `FeatureCollection` renders correctly), colored from the
|
|
21427
|
-
matching `--lr-color-*` token (`tone` defaults to `'accent'` → `--lr-color-brand`).
|
|
22026
|
+
matching `--lr-color-*` token (`tone` defaults to `'accent'` → `--lr-color-brand`).
|
|
22027
|
+
`color` and `strokeColor` (both new in 10.1.0) override that per surface — `color` paints the
|
|
22028
|
+
polygon fill, `strokeColor` the line and circle layers, falling back to `color` and then to `tone`.
|
|
22029
|
+
They are separable because a fill and its outline want opposite things on a
|
|
22030
|
+
choropleth-plus-overlay map, and the difference is measurable rather than aesthetic: the fill
|
|
22031
|
+
competes for area with the choropleth beside it and has to sit quiet, while the 1px outline
|
|
22032
|
+
competes with nothing and is the only thing keeping a no-data region's shape readable once the
|
|
22033
|
+
fill is that faint. Deriving one from the other measured 1.41:1 against a light basemap — under
|
|
22034
|
+
WCAG 1.4.11's 3:1 floor for graphical objects. A `var(--lr-…)` reference is resolved against the
|
|
22035
|
+
host before it reaches MapLibre, which paints to a WebGL canvas and never sees the CSS cascade.
|
|
22036
|
+
The component
|
|
21428
22037
|
assigns collision-free private MapLibre ids for those resources: `sourceId` is the stable
|
|
21429
22038
|
declarative reconciliation key, **not** an id to retrieve from `map`. This prevents a data layer
|
|
21430
22039
|
from overwriting or removing a same-named source supplied by `mapStyle`. Independent of
|
|
@@ -21433,6 +22042,37 @@ GeoJSON.FeatureCollection; tone?: 'accent' | 'success' | 'warning' |
|
|
|
21433
22042
|
persists across a `dataLayers` reassignment gets its GeoJSON updated in place (`setData()`), one
|
|
21434
22043
|
that's dropped has its private source/layers removed, and a genuinely new `sourceId` gets new
|
|
21435
22044
|
resources — nothing leaks on removal, style change, or disconnect.
|
|
22045
|
+
- `maxBounds: LyraMapBounds | null = null` (attribute: false) — box the map may not pan outside,
|
|
22046
|
+
`[[west, south], [east, north]]`. Prefer it over calling `map.setMaxBounds()` through the `.map`
|
|
22047
|
+
escape hatch: constraining the camera can wedge maplibre-gl at a sub-1 fractional zoom in a wide
|
|
22048
|
+
container, leaving `getZoom()` returning `null` permanently, every frame throwing from inside the
|
|
22049
|
+
peer's own matrix math, and the canvas never painting again — a blank map, with nothing thrown at
|
|
22050
|
+
the call site to attribute it to. This property applies the same call, then reads the camera back
|
|
22051
|
+
and reverts (restoring zoom and centre) if it did not survive, so the worst case is an
|
|
22052
|
+
unconstrained map plus a dev-mode warning. A malformed box is rejected rather than clamped
|
|
22053
|
+
|
|
22054
|
+
**Choropleth and `dataLayers` updates are diffed before they reach the peer.** `setData()`
|
|
22055
|
+
unconditionally re-tiles and repaints an entire source, which is invisible on a static map and
|
|
22056
|
+
expensive on an animated one. When an update changes only feature *properties* — the values driving
|
|
22057
|
+
the colour ramp — the component emits maplibre-gl's incremental `updateData()` instead. The fast
|
|
22058
|
+
path is deliberately strict, and needs all of: the same feature count, a `string`/`number` `id` on
|
|
22059
|
+
every feature in the same order, and geometry that is the **same object** as last time (not merely
|
|
22060
|
+
deep-equal). Structurally comparing polygon rings would cost about what the re-tile costs, and a
|
|
22061
|
+
false positive would paint stale geometry. Reuse your geometry objects across frames — the
|
|
22062
|
+
efficient way to build an animation anyway — and the fast path applies; otherwise it falls back to
|
|
22063
|
+
`setData()` with no change in behaviour. Peers predating `updateData()` always take the old path.
|
|
22064
|
+
|
|
22065
|
+
**Feature properties are tiled, and therefore bounded in numeric magnitude.** MapLibre GL tiles
|
|
22066
|
+
every GeoJSON source through a worker into a protobuf vector tile, so a property carrying a huge
|
|
22067
|
+
integer throws *inside that worker* — "Given varint doesn't fit into 10 bytes". That throw is not
|
|
22068
|
+
catchable by your app and not a rejected promise; it reaches you only as an opaque message on
|
|
22069
|
+
`lr-map`'s own error handler, while the rest of the layer still paints, so one bad feature in a
|
|
22070
|
+
large collection is invisible until someone walks the data by hand. Both `choropleth.geojson` and
|
|
22071
|
+
`dataLayers[].geojson` are now pre-scanned (first 10,000 features) and any numeric property beyond
|
|
22072
|
+
`Number.MAX_SAFE_INTEGER` draws a dev-mode warning naming the feature and the property. Carry a
|
|
22073
|
+
reduced figure in the feature — a log, a bucket, an index — and keep the exact value in your own
|
|
22074
|
+
payload beside the map.
|
|
22075
|
+
|
|
21436
22076
|
- `label: string = ''` — purpose-specific accessible name for MapLibre's actual focusable canvas.
|
|
21437
22077
|
A nonempty host `aria-label` remains on the host and is not duplicated onto the canvas; the canvas
|
|
21438
22078
|
uses `label` or the localized map name. An explicitly empty host `aria-label` is preserved as an
|
|
@@ -21455,13 +22095,20 @@ shared `maplibre-gl` import without constructing a map or allocating a WebGL con
|
|
|
21455
22095
|
an element.
|
|
21456
22096
|
|
|
21457
22097
|
**Events:** `lr-map-load` (fired once, after the underlying map's own `'load'`), `lr-map-click`
|
|
21458
|
-
(frozen `detail: { readonly lngLat: readonly [lng, lat], readonly feature
|
|
21459
|
-
|
|
21460
|
-
choropleth fill layer
|
|
21461
|
-
|
|
21462
|
-
|
|
21463
|
-
|
|
21464
|
-
|
|
22098
|
+
(frozen `detail: { readonly lngLat: readonly [lng, lat], readonly feature?, readonly origin?,
|
|
22099
|
+
readonly sourceId? }`; the tuple and any hit GeoJSON feature are detached and recursively frozen).
|
|
22100
|
+
`feature` resolves against the choropleth fill layer **and** every applied `dataLayers`
|
|
22101
|
+
fill/line/circle layer, topmost first — so a shape painted through `dataLayers` is identifiable
|
|
22102
|
+
instead of being indistinguishable from empty space. `origin` is `'choropleth'` or `'data-layer'`,
|
|
22103
|
+
and `sourceId` carries the authored `dataLayers[].sourceId` for a data-layer hit; both are
|
|
22104
|
+
`undefined` whenever `feature` is
|
|
22105
|
+
|
|
22106
|
+
**Slots:** `legend` — custom legend content, rendered inside the legend panel's own layout so it
|
|
22107
|
+
stays positioned with the map instead of floating beside it. Supplying it opens the panel even
|
|
22108
|
+
when `legend` and `legendGradient` are both empty.
|
|
22109
|
+
|
|
22110
|
+
**CSS parts:** `base`, `container`, `legend`, `legend-swatch`, `legend-gradient`, `legend-lo`,
|
|
22111
|
+
`legend-hi`, `legend-limit`, `marker`, `popup`,
|
|
21465
22112
|
`popup-content`, `popup-close-button`, `attribution`, `attribution-toggle`, `error`.
|
|
21466
22113
|
`legend` is a localized `role="group"` containing a real list associated to the map canvas with
|
|
21467
22114
|
`aria-describedby`; each entry is a `listitem`, decorative swatches are inert/accessibility-hidden,
|
|
@@ -22063,7 +22710,7 @@ to populate it: set `file` to a real `File` (fresh from a picker/drop), from whi
|
|
|
22063
22710
|
`mime-type`/`thumbnail-src` props instead, for reconstructing a chip from server-persisted
|
|
22064
22711
|
attachment metadata after a page reload, when no real `File` object exists any more. `file` always
|
|
22065
22712
|
wins when both are present. When a real `File` or `preview-src` is available, the chip offers a
|
|
22066
|
-
localized action that emits a cancelable `lr-preview-request`; it never registers or owns a viewer
|
|
22713
|
+
localized action that emits a plain, non-cancelable `lr-preview-request`; it never registers or owns a viewer
|
|
22067
22714
|
or overlay, so the host composes the desired preview surface.
|
|
22068
22715
|
|
|
22069
22716
|
**Properties:**
|
|
@@ -22122,9 +22769,12 @@ derived from `` `${file.name}:${file.size}:${file.lastModified}` ``; when neithe
|
|
|
22122
22769
|
generated internal id is used as a last resort.
|
|
22123
22770
|
|
|
22124
22771
|
**Events:** `lr-remove` (`detail: { attachmentId }`, only rendered while `removable`), `lr-retry`
|
|
22125
|
-
(`detail: { attachmentId }`, only rendered while `status="error"`), and
|
|
22126
|
-
`lr-preview-request` (`detail: { attachmentId, name, mimeType, src }`)
|
|
22127
|
-
|
|
22772
|
+
(`detail: { attachmentId }`, only rendered while `status="error"`), and
|
|
22773
|
+
`lr-preview-request` (`detail: { attachmentId, name, mimeType, src }`) — a plain, non-cancelable
|
|
22774
|
+
notification that the preview action was activated. **Breaking in 10.0.0:** this event was
|
|
22775
|
+
advertised as cancelable, but the chip never read `defaultPrevented` and owns no preview default
|
|
22776
|
+
action to veto (it never registers or owns a viewer/overlay), so `preventDefault()` was a no-op.
|
|
22777
|
+
The flag is gone rather than left as a promise the component cannot keep.
|
|
22128
22778
|
|
|
22129
22779
|
**Slots:** none.
|
|
22130
22780
|
|
|
@@ -22289,13 +22939,18 @@ final.
|
|
|
22289
22939
|
- `mimeType: string = ''` (attribute `mime-type`) — drives auto-detection when `kind` is unset.
|
|
22290
22940
|
- `filename: string = ''` — shown in the file-chip fallback, used as the download link's suggested
|
|
22291
22941
|
filename, and folded into the accessible name.
|
|
22292
|
-
- `alt
|
|
22293
|
-
back to `filename`, then a generic per-kind description.
|
|
22294
|
-
|
|
22295
|
-
|
|
22296
|
-
|
|
22297
|
-
|
|
22298
|
-
|
|
22942
|
+
- `alt?: string` — alt text for the image case (and reused as a video label fallback). Unset falls
|
|
22943
|
+
back to `filename`, then a generic per-kind description. An explicit `alt=""` survives to the
|
|
22944
|
+
rendered `<img alt="">`, which is the HTML idiom for a decorative image — same contract as
|
|
22945
|
+
`<lr-image-viewer>` and `<lr-document-preview>`. The `<video>` case is deliberately outside that
|
|
22946
|
+
carve-out: an empty `alt` there still falls through to `filename`/the generic description, because
|
|
22947
|
+
an empty accessible name would leave an interactive player unnamed rather than mark it decorative.
|
|
22948
|
+
- `accessibleLabel: string | null = null` (attribute `aria-label`) — a declarative attribute names
|
|
22949
|
+
the host as a whole while its nested button/link keeps a purpose-specific localized action name. A
|
|
22950
|
+
property-only assignment can override the nested action when no host label is present. An explicit
|
|
22951
|
+
empty string behaves like the unset `null` default — both fall through to the generated
|
|
22952
|
+
purpose-specific name. Image alt text and the native video's own purpose label remain independent;
|
|
22953
|
+
an explicitly empty host still leaves every interactive descendant named.
|
|
22299
22954
|
- `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"16rem"`); once set,
|
|
22300
22955
|
overrides the `--lr-media-card-max-height` custom property for this instance only (applied
|
|
22301
22956
|
inline on `[part="base"]`, so it reliably wins over a `:host{}`-declared default from outside the
|
|
@@ -22361,12 +23016,23 @@ sizing), `--lr-focus-ring-*`, `--lr-transition-fast`.
|
|
|
22361
23016
|
**Optional peer deps:** none.
|
|
22362
23017
|
|
|
22363
23018
|
```html
|
|
22364
|
-
<lr-media-card
|
|
22365
|
-
|
|
22366
|
-
|
|
22367
|
-
|
|
22368
|
-
|
|
23019
|
+
<lr-media-card
|
|
23020
|
+
id="image-card"
|
|
23021
|
+
kind="image"
|
|
23022
|
+
src="https://example.com/photo.jpg"
|
|
23023
|
+
alt="Screenshot"
|
|
23024
|
+
filename="photo.jpg"
|
|
22369
23025
|
></lr-media-card>
|
|
23026
|
+
<lr-media-card id="file-card" kind="file" src="https://example.com/report.pdf" filename="report.pdf">
|
|
23027
|
+
</lr-media-card>
|
|
23028
|
+
<script type="module">
|
|
23029
|
+
document
|
|
23030
|
+
.getElementById("image-card")
|
|
23031
|
+
.addEventListener("lr-media-open", (e) => openLightbox(e.detail.src));
|
|
23032
|
+
document
|
|
23033
|
+
.getElementById("file-card")
|
|
23034
|
+
.addEventListener("lr-before-media-download", (e) => shouldUseNativeDownload || e.preventDefault());
|
|
23035
|
+
</script>
|
|
22370
23036
|
```
|
|
22371
23037
|
|
|
22372
23038
|
**Safe-URL checking.** `src` is validated by internal sink-specific helpers before it's
|
|
@@ -22466,10 +23132,13 @@ hidden via CSS by default, exposed as a part only so a consumer can override tha
|
|
|
22466
23132
|
**Optional peer deps:** none.
|
|
22467
23133
|
|
|
22468
23134
|
```html
|
|
22469
|
-
<lr-attachment-trigger
|
|
22470
|
-
|
|
22471
|
-
|
|
22472
|
-
|
|
23135
|
+
<lr-attachment-trigger accept=".pdf,.docx"></lr-attachment-trigger>
|
|
23136
|
+
<script type="module">
|
|
23137
|
+
const trigger = document.querySelector("lr-attachment-trigger");
|
|
23138
|
+
trigger.capabilities = ["files", "image", "camera"];
|
|
23139
|
+
trigger.addEventListener("lr-files", (e) => queueFiles(e.detail.capability, e.detail.files));
|
|
23140
|
+
trigger.addEventListener("lr-camera-request", openCameraFlow);
|
|
23141
|
+
</script>
|
|
22473
23142
|
```
|
|
22474
23143
|
|
|
22475
23144
|
**Known gotchas:**
|
|
@@ -22574,14 +23243,14 @@ variant's quiet tint.
|
|
|
22574
23243
|
<lr-avatar label="Assistant"><svg slot="icon" viewBox="0 0 24 24"><!-- role glyph --></svg></lr-avatar>
|
|
22575
23244
|
|
|
22576
23245
|
<!-- Far down a long list: defer the request, fall back to a glyph, and report a broken URL. -->
|
|
22577
|
-
<lr-avatar
|
|
22578
|
-
image="/users/7/photo.jpg"
|
|
22579
|
-
label="Ada Lovelace"
|
|
22580
|
-
loading="lazy"
|
|
22581
|
-
@lr-error=${(e) => reportBrokenAvatar(e.detail.image)}
|
|
22582
|
-
>
|
|
23246
|
+
<lr-avatar id="lazy-avatar" image="/users/7/photo.jpg" label="Ada Lovelace" loading="lazy">
|
|
22583
23247
|
<svg slot="icon" viewBox="0 0 24 24"><!-- fallback glyph --></svg>
|
|
22584
23248
|
</lr-avatar>
|
|
23249
|
+
<script type="module">
|
|
23250
|
+
document
|
|
23251
|
+
.getElementById("lazy-avatar")
|
|
23252
|
+
.addEventListener("lr-error", (e) => reportBrokenAvatar(e.detail.image));
|
|
23253
|
+
</script>
|
|
22585
23254
|
```
|
|
22586
23255
|
|
|
22587
23256
|
**Known gotchas:**
|
|
@@ -23160,7 +23829,9 @@ unsupported or unresolved targets report `false` through the return value and `l
|
|
|
23160
23829
|
`lr-rate-change` (`detail: { rate }`), `lr-cue-change`
|
|
23161
23830
|
(`detail: { readonly cueId, readonly index }`; `cueId` is `null` and `index` is `-1` when no cue is active),
|
|
23162
23831
|
`lr-highlight-activate` (`detail: { highlightId }`), `lr-anchor-result` (`detail: {
|
|
23163
|
-
found }`), `lr-search-change` (`detail: { query, matchCount, activeIndex }
|
|
23832
|
+
found }`), `lr-search-change` (`detail: { query, matchCount, matchCountExact, activeIndex }`;
|
|
23833
|
+
`matchCountExact` is always `true` — `search()` matches over the already-loaded `cues` array with no
|
|
23834
|
+
additional ceiling), and
|
|
23164
23835
|
`lr-render-error` (`detail: { error }`). The native `ended`, `error`, `loadedmetadata`, `pause`,
|
|
23165
23836
|
`play`, `timeupdate`, and `volumechange`
|
|
23166
23837
|
events are also relayed exactly once from the host as native `Event` instances. Like the original
|
|
@@ -23565,6 +24236,7 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
23565
24236
|
`setFlagUrlResolver(/* public names: value */): unknown`
|
|
23566
24237
|
|
|
23567
24238
|
- **`components-media-flag-language-map-contracts`** — Supporting data types and helpers for this component family.
|
|
24239
|
+
`alpha3ToAlpha2(/* public names: code */): unknown`
|
|
23568
24240
|
`languageToCountry(/* public names: language */): unknown`
|
|
23569
24241
|
`localeNativeName(/* public names: tag */): unknown`
|
|
23570
24242
|
|
|
@@ -23588,9 +24260,19 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
23588
24260
|
|
|
23589
24261
|
- **`components-media-map-map-loader-contracts`** — Supporting data types and helpers for this component family.
|
|
23590
24262
|
`loadMaplibre(): unknown`
|
|
24263
|
+
`MapLibreGeoJsonDiff {
|
|
24264
|
+
update: unknown;
|
|
24265
|
+
id: unknown;
|
|
24266
|
+
addOrUpdateProperties: unknown;
|
|
24267
|
+
key: unknown;
|
|
24268
|
+
value: unknown;
|
|
24269
|
+
removeProperties: unknown;
|
|
24270
|
+
}`
|
|
23591
24271
|
`MapLibreGeoJsonSource {
|
|
23592
24272
|
setData: unknown;
|
|
23593
24273
|
data: unknown;
|
|
24274
|
+
updateData: unknown;
|
|
24275
|
+
diff: unknown;
|
|
23594
24276
|
}`
|
|
23595
24277
|
`MapLibreMapCapability {
|
|
23596
24278
|
getCanvas: unknown;
|
|
@@ -23603,6 +24285,8 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
23603
24285
|
setZoom: unknown;
|
|
23604
24286
|
zoom: unknown;
|
|
23605
24287
|
resize: unknown;
|
|
24288
|
+
setMaxBounds: unknown;
|
|
24289
|
+
bounds: unknown;
|
|
23606
24290
|
remove: unknown;
|
|
23607
24291
|
on: unknown;
|
|
23608
24292
|
type: unknown;
|
|
@@ -23662,16 +24346,21 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
23662
24346
|
}`
|
|
23663
24347
|
|
|
23664
24348
|
- **`components-media-map-map-contracts`** — Supporting data types and helpers for this component family.
|
|
24349
|
+
`buildGeoJsonPropertyDiff(/* public names: previous, next */): unknown`
|
|
23665
24350
|
`LyraMapChoroplethLayer {
|
|
23666
24351
|
sourceId: unknown;
|
|
23667
24352
|
geojson: unknown;
|
|
23668
24353
|
field: unknown;
|
|
23669
24354
|
stops: unknown;
|
|
24355
|
+
interpolation: unknown;
|
|
24356
|
+
stepBaseColor: unknown;
|
|
23670
24357
|
}`
|
|
23671
24358
|
`LyraMapGeoJsonDataLayer {
|
|
23672
24359
|
sourceId: unknown;
|
|
23673
24360
|
geojson: unknown;
|
|
23674
24361
|
tone: unknown;
|
|
24362
|
+
color: unknown;
|
|
24363
|
+
strokeColor: unknown;
|
|
23675
24364
|
}`
|
|
23676
24365
|
`LyraMapInstance {
|
|
23677
24366
|
getCanvas: unknown;
|
|
@@ -23684,6 +24373,8 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
23684
24373
|
setZoom: unknown;
|
|
23685
24374
|
zoom: unknown;
|
|
23686
24375
|
resize: unknown;
|
|
24376
|
+
setMaxBounds: unknown;
|
|
24377
|
+
bounds: unknown;
|
|
23687
24378
|
}`
|
|
23688
24379
|
`LyraMapLegendEntry {
|
|
23689
24380
|
color: unknown;
|
|
@@ -23821,6 +24512,32 @@ property).
|
|
|
23821
24512
|
- `max: number | null = null`, `min: number | null = null` — finite value-axis bounds. They apply to
|
|
23822
24513
|
the cartesian value axis selected by `indexAxis`, or the radial `r` scale; non-finite writes are
|
|
23823
24514
|
omitted before Chart.js sees them
|
|
24515
|
+
- `annotations: readonly LyraChartAnnotation[] = []` (attribute: false) — declarative reference
|
|
24516
|
+
lines and shaded bands: a threshold, an event year, a regime change, a highlighted period.
|
|
24517
|
+
`LyraChartAnnotation { axis?: 'x' | 'y'; value?: number; from?: number; to?: number; label?:
|
|
24518
|
+
string; tone?: LyraVariant }` — `tone` is the shared `LyraVariant` vocabulary
|
|
24519
|
+
(`'neutral' | 'brand' | 'success' | 'warning' | 'danger'`), not a chart-local copy. A finite `value` renders
|
|
24520
|
+
a reference line on that axis; a finite `from`/`to` pair renders a band bounded on that axis and
|
|
24521
|
+
spanning the other. `axis` defaults to `'y'`. An entry with neither (or non-finite numbers) is
|
|
24522
|
+
dropped rather than handed to Chart.js; a reversed range is normalized. Labelled entries are
|
|
24523
|
+
included in the generated accessible description, mirroring `lr-heatmap` — the label is
|
|
24524
|
+
consumer-supplied text and so is not localized, and an unlabelled line has no nameable meaning to
|
|
24525
|
+
announce. Needs the optional `chartjs-plugin-annotation` peer, loaded on first actual demand, so a
|
|
24526
|
+
page with no annotated charts never downloads it; without it the chart still renders and a single
|
|
24527
|
+
console warning explains the no-op. The plugin is registered globally, like `chartjs-plugin-zoom`
|
|
24528
|
+
and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart supplies annotation
|
|
24529
|
+
options, so the registration is unobservable to charts that set none, and registration is also
|
|
24530
|
+
what installs the plugin's own element defaults
|
|
24531
|
+
- `scaleType: 'linear' | 'logarithmic' = 'linear'` (attribute `scale-type`, type
|
|
24532
|
+
`LyraChartScaleType`) — scale type for the **value** axis; the categorical axis is never
|
|
24533
|
+
affected. `'logarithmic'` plots data spanning several orders of magnitude (prices, latency
|
|
24534
|
+
percentiles, file sizes) honestly, where a linear axis collapses everything below the maximum
|
|
24535
|
+
into the baseline. Inherited by `lr-line-chart`, `lr-scatter-chart` and `lr-bar-chart`, and
|
|
24536
|
+
applied to the secondary `y2` axis too when one is present. A logarithmic axis cannot represent
|
|
24537
|
+
zero (`log(0)` is `-Infinity`), so `beginAtZero` is not forwarded in that mode and non-positive
|
|
24538
|
+
points are dropped by Chart.js's own log scale. Chart.js rejects an unregistered scale type at
|
|
24539
|
+
construction, so `LogarithmicScale` is registered with the core — it ships inside the `chart.js`
|
|
24540
|
+
module already loaded, adding no download weight
|
|
23824
24541
|
- `plugins: LyraChartPlugin[] = []` — peer-neutral per-instance Chart.js plugin structures,
|
|
23825
24542
|
combined without duplicates with Lyra's
|
|
23826
24543
|
on-demand data-label plugin and any `config.plugins` entries
|
|
@@ -23852,9 +24569,9 @@ property).
|
|
|
23852
24569
|
non-integer, negative, and out-of-range indexes are discarded. The component writes the accepted
|
|
23853
24570
|
legend-toggle snapshot back to this property so a host can persist it, and a programmatic write
|
|
23854
24571
|
reconciles Chart.js and the DOM legend silently without emitting either legend-visibility event.
|
|
23855
|
-
- `withoutLegend: boolean = false` (attribute `without-legend
|
|
23856
|
-
set this to hide it. Renders a wrapping DOM legend (when shown) whose keyboard-operable
|
|
23857
|
-
toggle dataset visibility. The DOM surface preserves long public labels that a canvas legend
|
|
24572
|
+
- `withoutLegend: boolean = false` (attribute `without-legend`, reflected) — the legend shows by
|
|
24573
|
+
default; set this to hide it. Renders a wrapping DOM legend (when shown) whose keyboard-operable
|
|
24574
|
+
buttons toggle dataset visibility. The DOM surface preserves long public labels that a canvas legend
|
|
23858
24575
|
would clip. Its pressed state follows `hiddenDatasets` whenever that controlled snapshot is
|
|
23859
24576
|
defined, otherwise the effective dataset's declarative `hidden` value before Chart.js is ready
|
|
23860
24577
|
and across chart type/plugin rebuilds.
|
|
@@ -23889,8 +24606,6 @@ property).
|
|
|
23889
24606
|
by radar/polar-area are out of scope)
|
|
23890
24607
|
- `withoutAnimation: boolean = false` (attribute `without-animation`, reflected) — disables Chart.js
|
|
23891
24608
|
construction animation; reduced-motion preference also disables it regardless of this value
|
|
23892
|
-
- `withoutLegend: boolean = false` (attribute `without-legend`, reflected) — hides the legend;
|
|
23893
|
-
it wins over the positive `legend` alias
|
|
23894
24609
|
- `withoutTooltip: boolean = false` (attribute `without-tooltip`, reflected) — disables the
|
|
23895
24610
|
Chart.js tooltip plugin for this instance
|
|
23896
24611
|
- `dataLabels: boolean = false` (attribute `data-labels`) — draws each point's value on the chart via
|
|
@@ -23923,6 +24638,14 @@ property).
|
|
|
23923
24638
|
ignored without evaluating script or exposing prototype-pollution keys to the merge.
|
|
23924
24639
|
- `showDataTable: boolean = false` (attribute `show-data-table`) — makes the always-available
|
|
23925
24640
|
accessible data table visible rather than screen-reader-only
|
|
24641
|
+
- `dataTableToggle: boolean = false` (attribute `data-table-toggle`, new in 10.1.0) — renders a
|
|
24642
|
+
localized disclosure button (`part="data-table-toggle"`) above the data table so a *sighted*
|
|
24643
|
+
reader can reveal the numbers on demand. `showDataTable` alone is all-or-nothing, which left
|
|
24644
|
+
consumers wrapping a duplicated table in their own `<details>`. With the toggle on,
|
|
24645
|
+
`showDataTable` becomes the disclosure's **initial** state rather than its whole behavior; the
|
|
24646
|
+
table stays in the DOM in both states, so assistive technology never loses it, and the button
|
|
24647
|
+
carries `aria-expanded` plus `aria-controls` pointing at the `data-table` wrapper. Unset, nothing
|
|
24648
|
+
renders and behavior is identical to before.
|
|
23926
24649
|
- `chartArea: LyraChartArea | undefined` (readonly) — current Chart.js chart-area geometry in
|
|
23927
24650
|
canvas-local coordinates (`top`, `left`, `right`, `bottom`, `width`, `height`), when a chart is
|
|
23928
24651
|
drawn
|
|
@@ -24042,7 +24765,7 @@ Chart.js escape hatch and is not rewritten by the simplified-surface sampler.
|
|
|
24042
24765
|
wrapping DOM legend), `legend-item` (a dataset-visibility button), `legend-item-hidden` (added to
|
|
24043
24766
|
that button while its dataset is hidden), `legend-swatch`,
|
|
24044
24767
|
`reset-zoom-button`, `description`, `notices` (wrapper for nonfatal feature warnings and
|
|
24045
|
-
bounded-alternative truncation notices), `data-table`, `data-truncation` (the bounded-alternative
|
|
24768
|
+
bounded-alternative truncation notices), `data-table`, `data-table-toggle` (the `dataTableToggle` disclosure button), `data-truncation` (the bounded-alternative
|
|
24046
24769
|
notice), `feature-warning` (a nonfatal missing optional-feature warning), `center` (the
|
|
24047
24770
|
chart-area-centered wrapper for the `center` slot), `error` (neutral visible message rendered in
|
|
24048
24771
|
place of `canvas` when the optional `chart.js` peer dependency fails to load; the failure transition
|
|
@@ -24062,7 +24785,9 @@ ancestor, not a shadow-tree descendant, since custom properties only cascade dow
|
|
|
24062
24785
|
`y2Label` title text reuses `--lr-chart-tick-color` too — there's no separate title-color token),
|
|
24063
24786
|
legend text, and tooltip background/text respectively; plus
|
|
24064
24787
|
`--lr-chart-legend-item-hover-bg` / `--lr-chart-legend-item-active-bg`,
|
|
24065
|
-
`--lr-chart-data-table-button-hover-bg` / `--lr-chart-data-table-button-active-bg`,
|
|
24788
|
+
`--lr-chart-data-table-button-hover-bg` / `--lr-chart-data-table-button-active-bg`,
|
|
24789
|
+
`--lr-chart-data-table-toggle-hover-bg` / `--lr-chart-data-table-toggle-active-bg` (the
|
|
24790
|
+
`dataTableToggle` disclosure button), and
|
|
24066
24791
|
`--lr-chart-reset-zoom-button-hover-bg` / `--lr-chart-reset-zoom-button-active-bg` — independent
|
|
24067
24792
|
background hooks for each DOM control's hover and pressed states. Hover defaults to
|
|
24068
24793
|
`--lr-color-brand-quiet`; pressed defaults to its standard active color mix. Override one pair
|
|
@@ -24124,7 +24849,7 @@ requested enhancement is disabled and a localized static `feature-warning` is vi
|
|
|
24124
24849
|
announced. In particular, unavailable data labels do not remove generated table totals.
|
|
24125
24850
|
|
|
24126
24851
|
```html
|
|
24127
|
-
<lr-chart type="line" x-label="Day" y-label="kWh"
|
|
24852
|
+
<lr-chart type="line" x-label="Day" y-label="kWh"></lr-chart>
|
|
24128
24853
|
<script>
|
|
24129
24854
|
const c = document.querySelector('lr-chart');
|
|
24130
24855
|
c.labels = ['Mon', 'Tue', 'Wed'];
|
|
@@ -24169,7 +24894,7 @@ announced. In particular, unavailable data labels do not remove generated table
|
|
|
24169
24894
|
off-screen, property changes that would otherwise trigger a Chart.js redraw are skipped (and a
|
|
24170
24895
|
single redraw fires once it re-enters the viewport). Independently, `updated()` only reaches
|
|
24171
24896
|
Chart.js when at least one of `type`, `labels`, `datasets`, `description`, `grid`, `indexAxis`,
|
|
24172
|
-
`label`, `hiddenDatasets`, `
|
|
24897
|
+
`label`, `hiddenDatasets`, `legendPosition`, `min`, `max`, `plugins`, the internal resolved auto legend
|
|
24173
24898
|
position, `valueFormatter`, `formatter`, `area`, `height`, `xLabel`, `yLabel`, `y2Label`, `beginAtZero`,
|
|
24174
24899
|
`stacked`, any `without*` control, `dataLabels`, `stackTotals`, `config`, the parsed
|
|
24175
24900
|
slotted config, `zoom`, `locale`, `strings`, or the internal loading state actually changed in
|
|
@@ -24276,11 +25001,21 @@ passthrough). Not a subclass of `LyraChart`.
|
|
|
24276
25001
|
- `valueAxisGutter?: number` (attribute `value-axis-gutter`) — value-axis gutter width.
|
|
24277
25002
|
- `barGapRatio?: number` (attribute `bar-gap-ratio`) — overrides the internal 0.2 `BAR_GROUP_GAP`
|
|
24278
25003
|
fraction of a category slot left as a gap between categories. Unset keeps the fixed 0.2.
|
|
24279
|
-
- `scale: 'linear' | 'sqrt' = 'linear'` (bar type only)
|
|
24280
|
-
`Math.sqrt(value / domainMax)` instead of the standard linear `niceDomain`
|
|
24281
|
-
`lr-heatmap`'s matrix-mode `sqrt` scale), so a skewed dataset's smaller bars
|
|
24282
|
-
by one dominant value; gridlines/tick labels stay on the linear
|
|
24283
|
-
ignores it entirely.
|
|
25004
|
+
- `scale: 'linear' | 'sqrt' | 'logarithmic' = 'linear'` — `'sqrt'` (**bar type only**) maps a bar's
|
|
25005
|
+
value to height via `Math.sqrt(value / domainMax)` instead of the standard linear `niceDomain`
|
|
25006
|
+
fraction (mirroring `lr-heatmap`'s matrix-mode `sqrt` scale), so a skewed dataset's smaller bars
|
|
25007
|
+
aren't washed out by one dominant value; under `'sqrt'` gridlines/tick labels stay on the linear
|
|
25008
|
+
domain and `type="line"` ignores it entirely.
|
|
25009
|
+
`'logarithmic'` is the base-10 value axis for data spanning several orders of magnitude, where a
|
|
25010
|
+
linear axis collapses everything below the maximum into the baseline. Unlike `'sqrt'` it applies
|
|
25011
|
+
to **bars, line points and gridlines alike**, since a log axis whose gridlines stayed linear
|
|
25012
|
+
would misrepresent the plot. Its lower bound is the smallest *positive* datum rather than the
|
|
25013
|
+
linear `lo`: `beginAtZero` defaults to true, so `lo` is normally `0`, which has no logarithm —
|
|
25014
|
+
deriving the floor from the data is what makes a 1…1000 series span three even decades instead of
|
|
25015
|
+
collapsing onto one. Values at or below that floor (including zero and negatives, which have no
|
|
25016
|
+
real logarithm) pin to the axis floor rather than producing `-Infinity` geometry, and a degenerate
|
|
25017
|
+
domain falls back to the linear fraction. `lr-chart`'s own `scaleType` is the Chart.js-backed
|
|
25018
|
+
equivalent for the full charts.
|
|
24284
25019
|
- `withoutValueAxis: boolean = false` (attribute `without-value-axis`) — suppresses gridlines and
|
|
24285
25020
|
value-axis tick labels; x-axis category labels remain.
|
|
24286
25021
|
- `selectedIndices: readonly number[] = []` (attribute: false) — applies to every interactive data mark for
|
|
@@ -24427,7 +25162,8 @@ and behavior there. **See `llms/components/lr-chart.md` for the details, code ex
|
|
|
24427
25162
|
of every entry in these lists.**
|
|
24428
25163
|
|
|
24429
25164
|
**Properties:** `description`, `grid`, `indexAxis` (`index-axis`), `label`, `hiddenDatasets`, `legendPosition`
|
|
24430
|
-
(`legend-position`), `max`, `min`, `plugins`, `
|
|
25165
|
+
(`legend-position`), `max`, `min`, `plugins`, `scaleType` (`scale-type`), `annotations`,
|
|
25166
|
+
`stacked`, `withoutAnimation` (`without-animation`),
|
|
24431
25167
|
`withoutLegend` (`without-legend`), `withoutTooltip` (`without-tooltip`), `xLabel` (`x-label`),
|
|
24432
25168
|
`yLabel` (`y-label`), plus additive `labels`, `datasets`, `valueFormatter`, `formatter`, `area`, `zoom`,
|
|
24433
25169
|
`height`, `y2Label` (`y2-label`), `beginAtZero` (`begin-at-zero`), `dataLabels`
|
|
@@ -24445,7 +25181,7 @@ complete `hiddenDatasets` snapshot).
|
|
|
24445
25181
|
**Slots:** default JSON configuration script, `data-table`, `center`.
|
|
24446
25182
|
|
|
24447
25183
|
**CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-item-hidden`, `legend-swatch`,
|
|
24448
|
-
`reset-zoom-button`, `description`, `notices`, `data-table`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
|
|
25184
|
+
`reset-zoom-button`, `description`, `notices`, `data-table`, `data-table-toggle`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
|
|
24449
25185
|
rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load; the
|
|
24450
25186
|
failure transition is announced through the shared document-level light-DOM assertive sink — see
|
|
24451
25187
|
`llms/components/lr-chart.md`).
|
|
@@ -24454,7 +25190,8 @@ failure transition is announced through the shared document-level light-DOM asse
|
|
|
24454
25190
|
`--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
|
|
24455
25191
|
`--lr-chart-tooltip-text`, `--lr-chart-legend-item-hover-bg`,
|
|
24456
25192
|
`--lr-chart-legend-item-active-bg`, `--lr-chart-data-table-button-hover-bg`,
|
|
24457
|
-
`--lr-chart-data-table-button-active-bg`, `--lr-chart-
|
|
25193
|
+
`--lr-chart-data-table-button-active-bg`, `--lr-chart-data-table-toggle-hover-bg`,
|
|
25194
|
+
`--lr-chart-data-table-toggle-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
|
|
24458
25195
|
`--lr-chart-reset-zoom-button-active-bg`, `--lr-chart-canvas-hover-outline-width`, and
|
|
24459
25196
|
`--lr-chart-pattern-step`, plus `--lr-chart-legend-side-max` — all inherited from `LyraChart`, identical in meaning and default (see
|
|
24460
25197
|
`lr-chart` above); each of the eight variants below reads the same set, so one rule retunes them
|
|
@@ -24468,7 +25205,7 @@ together. The mirrored hooks are `--border-color-1`,
|
|
|
24468
25205
|
`zoom` is set, and `chartjs-plugin-datalabels` only once `data-labels`/`stack-totals` is set.
|
|
24469
25206
|
|
|
24470
25207
|
```html
|
|
24471
|
-
<lr-bar-chart
|
|
25208
|
+
<lr-bar-chart></lr-bar-chart>
|
|
24472
25209
|
<lr-pie-chart></lr-pie-chart>
|
|
24473
25210
|
<script>
|
|
24474
25211
|
document.querySelector('lr-bar-chart').labels = ['A', 'B'];
|
|
@@ -24500,6 +25237,8 @@ Bins `values` into `bins` equal-width buckets and renders as a bar chart (extend
|
|
|
24500
25237
|
- `seriesLabel: string = ''` (attribute `series-label`) — dataset label used for the
|
|
24501
25238
|
legend/tooltip/table; empty falls back to localized "Frequency". Inherited `label` keeps its
|
|
24502
25239
|
chart-wide accessible-name meaning.
|
|
25240
|
+
- inherits `lr-chart`'s full surface, including `scaleType` (`scale-type`) and `annotations` —
|
|
25241
|
+
a logarithmic frequency axis and threshold/band markers both apply to a histogram
|
|
24503
25242
|
- `labels`/`datasets`/`type` are **derived, read-only** (installed as getter/setter pairs on the
|
|
24504
25243
|
prototype; direct writes are silently ignored) — `labels`/`datasets` are computed from
|
|
24505
25244
|
`values`/`bins` (memoized per instance, keyed by reference equality on `values` plus the
|
|
@@ -24525,7 +25264,7 @@ maxSamples?)` appends finite raw samples and optionally retains only the newest
|
|
|
24525
25264
|
**Slots:** default JSON configuration script, `data-table`, `center`.
|
|
24526
25265
|
|
|
24527
25266
|
**CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-item-hidden`, `legend-swatch`,
|
|
24528
|
-
`reset-zoom-button`, `description`, `notices`, `data-table`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
|
|
25267
|
+
`reset-zoom-button`, `description`, `notices`, `data-table`, `data-table-toggle`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
|
|
24529
25268
|
rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load; the
|
|
24530
25269
|
failure transition is announced through the shared document-level light-DOM assertive sink —
|
|
24531
25270
|
inherited from `LyraChart`, unaffected by the binning logic).
|
|
@@ -24534,7 +25273,8 @@ inherited from `LyraChart`, unaffected by the binning logic).
|
|
|
24534
25273
|
`--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
|
|
24535
25274
|
`--lr-chart-tooltip-text`, `--lr-chart-legend-item-hover-bg`,
|
|
24536
25275
|
`--lr-chart-legend-item-active-bg`, `--lr-chart-data-table-button-hover-bg`,
|
|
24537
|
-
`--lr-chart-data-table-button-active-bg`, `--lr-chart-
|
|
25276
|
+
`--lr-chart-data-table-button-active-bg`, `--lr-chart-data-table-toggle-hover-bg`,
|
|
25277
|
+
`--lr-chart-data-table-toggle-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
|
|
24538
25278
|
`--lr-chart-reset-zoom-button-active-bg`, `--lr-chart-canvas-hover-outline-width`, and
|
|
24539
25279
|
`--lr-chart-pattern-step`, plus `--lr-chart-legend-side-max` — inherited from `LyraChart`, identical in meaning, together with the
|
|
24540
25280
|
mirrored `--border-color-1`,
|
|
@@ -24605,6 +25345,14 @@ browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
|
|
|
24605
25345
|
- `formatter?: LyraChartFormatter`, `valueFormatter?: LyraChartValueFormatter` — numeric axis,
|
|
24606
25346
|
tooltip, table, summary, and export formatting; the context-object formatter takes precedence
|
|
24607
25347
|
- `showDataTable: boolean = false` (attribute `show-data-table`) — reveals the accessible data table
|
|
25348
|
+
- `dataTableToggle: boolean = false` (attribute `data-table-toggle`, new in 10.1.0) — renders a
|
|
25349
|
+
localized disclosure button (`part="data-table-toggle"`) above the data table so a *sighted*
|
|
25350
|
+
reader can reveal the numbers on demand. `showDataTable` alone is all-or-nothing, which left
|
|
25351
|
+
consumers wrapping a duplicated table in their own `<details>`. With the toggle on,
|
|
25352
|
+
`showDataTable` becomes the disclosure's **initial** state rather than its whole behavior; the
|
|
25353
|
+
table stays in the DOM in both states, so assistive technology never loses it, and the button
|
|
25354
|
+
carries `aria-expanded` plus `aria-controls` pointing at the `data-table` wrapper. Unset, nothing
|
|
25355
|
+
renders and behavior is identical to before.
|
|
24608
25356
|
|
|
24609
25357
|
**Methods:** `exportData('csv'|'png')` returns spreadsheet-safe summary rows or the current canvas
|
|
24610
25358
|
PNG data URL. `refreshTheme()` re-reads canvas theme custom properties after an ancestor theme
|
|
@@ -24643,7 +25391,7 @@ detailed sample and notice, making it the escape hatch for complete data.
|
|
|
24643
25391
|
|
|
24644
25392
|
**CSS parts:** `base`, `plot` (the fixed-height canvas region), `canvas`, `legend`,
|
|
24645
25393
|
`legend-item`, `legend-item-hidden` (added to a legend item while its box series is hidden),
|
|
24646
|
-
`legend-swatch`, `description`, `data-table`, `error` (neutral visible message shown
|
|
25394
|
+
`legend-swatch`, `description`, `data-table`, `data-table-toggle` (the `dataTableToggle` disclosure button), `error` (neutral visible message shown
|
|
24647
25395
|
instead of `canvas` when the optional box-plot peer fails to load; the failure transition is
|
|
24648
25396
|
announced through the shared document-level light-DOM assertive sink), `data-truncation` (the
|
|
24649
25397
|
bounded-alternative sampling notice)
|
|
@@ -24660,7 +25408,10 @@ so `--lr-theme-color-chart-*` retheming reaches box plots too. `--lr-chart-patte
|
|
|
24660
25408
|
`--lr-chart-canvas-hover-outline-width` (default `var(--lr-border-width-thin)`) sizes the `canvas`
|
|
24661
25409
|
hover outline, `--lr-chart-legend-item-active-bg` and `--lr-chart-legend-item-hover-bg` retune the
|
|
24662
25410
|
pressed and hovered legend rows, and `--lr-chart-legend-side-max` caps a side legend — the same tokens and defaults as
|
|
24663
|
-
`lr-chart`.
|
|
25411
|
+
`lr-chart`. Its own `dataTableToggle` disclosure button carries box-plot-namespaced hooks rather
|
|
25412
|
+
than inheriting the chart pair, since its stylesheet is not a re-export:
|
|
25413
|
+
`--lr-box-plot-data-table-toggle-hover-bg` (defaults to `--lr-color-brand-quiet`) and
|
|
25414
|
+
`--lr-box-plot-data-table-toggle-active-bg` (defaults to its standard active color mix).
|
|
24664
25415
|
|
|
24665
25416
|
**Forced colors:** under `forced-colors: active` the eight-color ramp is remapped onto the small
|
|
24666
25417
|
repeating system-color cycle the platform exposes, so series 1/4/7 (and 2/5/8, 3/6) would otherwise
|
|
@@ -24746,6 +25497,7 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
24746
25497
|
|
|
24747
25498
|
- **`components-charts-chart-chart-core-loader-contracts`** — Supporting data types and helpers for this component family.
|
|
24748
25499
|
`ChartJsModule {
|
|
25500
|
+
LogarithmicScale: unknown;
|
|
24749
25501
|
Chart: unknown;
|
|
24750
25502
|
defaults: unknown;
|
|
24751
25503
|
plugins: unknown;
|
|
@@ -24780,6 +25532,9 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
24780
25532
|
`ChartPluginCapability {
|
|
24781
25533
|
id: unknown;
|
|
24782
25534
|
}`
|
|
25535
|
+
`loadAnnotationPlugin(/* public names: importAnnotation */): unknown`
|
|
25536
|
+
`loadChartAndAnnotation(/* public names: loadChart, importAnnotation */): unknown`
|
|
25537
|
+
`loadChartJsWithAnnotationResult(/* public names: importAnnotation */): unknown`
|
|
24783
25538
|
|
|
24784
25539
|
- **`components-charts-chart-chart-legend-visibility-contracts`** — Supporting data types and helpers for this component family.
|
|
24785
25540
|
`LyraChartLegendVisibilityChangeDetail {
|
|
@@ -24814,6 +25569,14 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
24814
25569
|
|
|
24815
25570
|
- **`components-charts-chart-chart-contracts`** — Supporting data types and helpers for this component family.
|
|
24816
25571
|
`lockChartType(/* public names: ctor, value */): unknown`
|
|
25572
|
+
`LyraChartAnnotation {
|
|
25573
|
+
axis: unknown;
|
|
25574
|
+
value: unknown;
|
|
25575
|
+
from: unknown;
|
|
25576
|
+
to: unknown;
|
|
25577
|
+
label: unknown;
|
|
25578
|
+
tone: unknown;
|
|
25579
|
+
}`
|
|
24817
25580
|
`LyraChartArea {
|
|
24818
25581
|
top: unknown;
|
|
24819
25582
|
left: unknown;
|
|
@@ -25083,11 +25846,11 @@ entry) or a third-party PDF/office-doc viewer, but neither is a dependency of th
|
|
|
25083
25846
|
|
|
25084
25847
|
```html
|
|
25085
25848
|
<lr-document-preview
|
|
25849
|
+
id="text-preview"
|
|
25086
25850
|
filename="board-notes.txt"
|
|
25087
25851
|
mime-type="text/plain"
|
|
25088
25852
|
src="/files/board-notes.txt"
|
|
25089
25853
|
max-height="24rem"
|
|
25090
|
-
@lr-render-error=${(e) => console.error(e.detail.error)}
|
|
25091
25854
|
></lr-document-preview>
|
|
25092
25855
|
|
|
25093
25856
|
<!-- A host driving its own server-side conversion -->
|
|
@@ -25097,6 +25860,11 @@ entry) or a third-party PDF/office-doc viewer, but neither is a dependency of th
|
|
|
25097
25860
|
<lr-document-preview filename="deck.pptx" mime-type="application/vnd.ms-powerpoint" src="/files/deck.pptx">
|
|
25098
25861
|
<lr-code-block slot="unsupported" language="text">Open in PowerPoint to preview.</lr-code-block>
|
|
25099
25862
|
</lr-document-preview>
|
|
25863
|
+
<script type="module">
|
|
25864
|
+
document
|
|
25865
|
+
.getElementById("text-preview")
|
|
25866
|
+
.addEventListener("lr-render-error", (e) => console.error(e.detail.error));
|
|
25867
|
+
</script>
|
|
25100
25868
|
```
|
|
25101
25869
|
|
|
25102
25870
|
Accessibility: after the initial silent baseline, entering `"converting"` without numeric
|
|
@@ -25181,8 +25949,9 @@ value, without suppressing the visible `name` heading.
|
|
|
25181
25949
|
|
|
25182
25950
|
- `lr-close` — `detail: DocumentViewerCloseReason`, the viewer shell dialog's dismissal reason.
|
|
25183
25951
|
The event is emitted after the viewer sets `open` to `false`. A registered renderer may compose
|
|
25184
|
-
its own descendant dialog; closing that inner dialog keeps its
|
|
25185
|
-
does not close the document viewer.
|
|
25952
|
+
its own descendant dialog; closing that inner dialog keeps its own `lr-close` path — the shell
|
|
25953
|
+
guards on `event.target !== event.currentTarget` — and does not close the document viewer.
|
|
25954
|
+
(`<lr-dialog>`'s close event was spelled `lr-dialog-close` before 10.0.0.)
|
|
25186
25955
|
- `lr-download` — `detail: { src, filename }`, emitted when the native safe download action is
|
|
25187
25956
|
activated. The browser download itself is handled by the link.
|
|
25188
25957
|
- `lr-anchor-result` — `detail: { found }`. Emitted by this shell as `{ found: false }` once per
|
|
@@ -26015,7 +26784,9 @@ current page and
|
|
|
26015
26784
|
`zoom: number = 1` is clamped to `0.25`–`4`. `maxHeight: string = ''` (attribute `max-height`) is a
|
|
26016
26785
|
CSS length that, once set, overrides `--lr-pdf-viewer-height` — the block size of the virtualized
|
|
26017
26786
|
page list — declaratively, writing it inline on `[part="base"]`; invalid CSS `max-height` values,
|
|
26018
|
-
declaration breaks, and `url()` are ignored. `
|
|
26787
|
+
declaration breaks, and `url()` are ignored. `workerSrc: string = ''` (attribute `worker-src`) is the
|
|
26788
|
+
URL of the PDF.js web worker chunk — see **Configuring the PDF.js worker** below.
|
|
26789
|
+
`anchorKinds: readonly LyraAnchorKind[] = ['page',
|
|
26019
26790
|
'text-quote', 'region']` (this viewer's supported `LyraAnchor.kind` values for the shared
|
|
26020
26791
|
anchor-target contract). The other inherited anchor-target properties are `highlights:
|
|
26021
26792
|
LyraHighlight[] = []` (property only; reassign after mutation), `activeHighlightId: string | null =
|
|
@@ -26032,7 +26803,8 @@ nonnegative dimensions.
|
|
|
26032
26803
|
- `lr-load` — `detail: { pageCount }` — the document reached `ready`. `page` is reset to `1` first.
|
|
26033
26804
|
- `lr-page-change` — `detail: { page, pageCount }` — fired for scroll-driven page crossings as well
|
|
26034
26805
|
as `page` assignments and `nextPage()`/`previousPage()`/`goToPage()`.
|
|
26035
|
-
- `lr-zoom-change` — `detail: { zoom }
|
|
26806
|
+
- `lr-zoom-change` — `detail: { zoom }` — fired for `zoom` assignments as well as
|
|
26807
|
+
`zoomIn()`/`zoomOut()`. Never fired for the initial `1`, only for a transition away from it.
|
|
26036
26808
|
- `lr-search-change` — `detail: { query, matchCount, matchCountExact, activeIndex }` — from `search()`/`searchNext()`/
|
|
26037
26809
|
`searchPrevious()`/`clearSearch()` and effective-locale re-evaluation. A `src` change invalidates document-relative matches and emits
|
|
26038
26810
|
the canonical reset `{ query: '', matchCount: 0, matchCountExact: true, activeIndex: -1 }`.
|
|
@@ -26047,6 +26819,30 @@ nonnegative dimensions.
|
|
|
26047
26819
|
`pageViewerSnapshot` (`identity`, `status`, `page`, `pageCount`). `identity` changes for every load,
|
|
26048
26820
|
including same-count replacements.
|
|
26049
26821
|
|
|
26822
|
+
**`lr-page-change`/`lr-zoom-change` are state broadcasts, not user-intent signals.** This differs
|
|
26823
|
+
deliberately from the same-named `<lr-pagination>` event and from `<lr-pan-zoom>`'s `lr-zoom-change`,
|
|
26824
|
+
and the distinction is worth internalizing before wiring a handler. Pagination and pan-zoom are
|
|
26825
|
+
*controlled*: pagination never mutates its own `page`, so its event is a request the host applies,
|
|
26826
|
+
and pan-zoom's `zoom` is bound by a parent, so echoing a programmatic write back would feed a loop.
|
|
26827
|
+
This viewer instead *owns* `page` and `zoom` — scrolling the page list changes `page` with no
|
|
26828
|
+
consumer action at all — so there is no useful "the user did this" subset to isolate, and every
|
|
26829
|
+
accepted transition is announced identically: scrolling, `nextPage()`/`previousPage()`/`goToPage()`,
|
|
26830
|
+
`zoomIn()`/`zoomOut()`, anchor resolution, the reset to page 1 when a new `src` finishes loading,
|
|
26831
|
+
and a plain `viewer.page = 3` / `viewer.zoom = 2` assignment. A handler that mirrors the event back
|
|
26832
|
+
into the property it came from is therefore idempotent rather than looping, but it is also
|
|
26833
|
+
redundant — read the property, or `pageViewerSnapshot`, instead.
|
|
26834
|
+
|
|
26835
|
+
A write that clamps or rounds back onto the value already in effect is not a transition and stays
|
|
26836
|
+
silent: on a 3-page document already showing page 1, `viewer.page = -7` and `viewer.page = 1.4` both
|
|
26837
|
+
settle on page 1 and emit nothing, and `viewer.zoom = 999` at 4× emits nothing.
|
|
26838
|
+
|
|
26839
|
+
For page-addressed integrations prefer the atomic `pageViewerSnapshot` /
|
|
26840
|
+
`lr-page-viewer-state-change` channel over this pair: it carries page, count, load status and
|
|
26841
|
+
document `identity` together, and a late subscriber can read the current value synchronously instead
|
|
26842
|
+
of having missed the announcement. `<lr-page-rail>` binds that channel for any viewer exposing
|
|
26843
|
+
`pageViewerSnapshot` — including this one — and falls back to `lr-load`/`lr-page-change` only for
|
|
26844
|
+
older structural sources that do not.
|
|
26845
|
+
|
|
26050
26846
|
**Methods:** `nextPage()`, `previousPage()`, `zoomIn()`, and `zoomOut()` update the corresponding
|
|
26051
26847
|
controlled state within its supported range. `getPageText(page)` resolves the raw reading-order text
|
|
26052
26848
|
of one page (per-page LRU-cached, 64 pages), rejecting on no loaded document or an out-of-range page.
|
|
@@ -26104,6 +26900,39 @@ a PDF is opened. An absent `pdfjs-dist` fails closed and renders
|
|
|
26104
26900
|
`[part="error"]` with the localized `pdfViewerMissingLibrary` message — there is no partial PDF
|
|
26105
26901
|
rendering without it.
|
|
26106
26902
|
|
|
26903
|
+
**Configuring the PDF.js worker.** PDF.js renders in a web worker and rejects every document with
|
|
26904
|
+
`No "GlobalWorkerOptions.workerSrc" specified.` until it has been told where that worker lives. The
|
|
26905
|
+
worker is a separate file inside the peer (`pdfjs-dist/build/pdf.worker.min.mjs`) that only the
|
|
26906
|
+
application's own bundler can turn into a real URL — a bare package specifier does not resolve in a
|
|
26907
|
+
browser without an import map, and resolving it against this library's own module URL would point
|
|
26908
|
+
into `@aceshooting/lyra-ui`'s files, where no worker exists. So a bundled application supplies it,
|
|
26909
|
+
either way round:
|
|
26910
|
+
|
|
26911
|
+
```ts
|
|
26912
|
+
// 1. Per element, through the public property/attribute.
|
|
26913
|
+
import workerUrl from 'pdfjs-dist/build/pdf.worker.min.mjs?worker&url'; // Vite; see your bundler
|
|
26914
|
+
const viewer = document.querySelector('lr-pdf-viewer');
|
|
26915
|
+
viewer.workerSrc = workerUrl;
|
|
26916
|
+
// or, declaratively: <lr-pdf-viewer worker-src="/assets/pdf.worker.min.mjs"></lr-pdf-viewer>
|
|
26917
|
+
|
|
26918
|
+
// 2. Once for the whole application, on PDF.js's own singleton, before any viewer loads a document.
|
|
26919
|
+
import { GlobalWorkerOptions } from 'pdfjs-dist';
|
|
26920
|
+
GlobalWorkerOptions.workerSrc = workerUrl;
|
|
26921
|
+
```
|
|
26922
|
+
|
|
26923
|
+
`workerSrc` accepts a document-relative URL (resolved against the document base) as well as an
|
|
26924
|
+
absolute one; only `http:`, `https:`, `blob:` and `file:` URLs are accepted, and anything else — a
|
|
26925
|
+
`javascript:` or `data:` URL in particular — is ignored rather than handed to `new Worker()`.
|
|
26926
|
+
|
|
26927
|
+
`GlobalWorkerOptions` is PDF.js's process-wide singleton and the PDF.js module itself is loaded once
|
|
26928
|
+
per page, so `workerSrc` is applied only while that singleton is still unset. Two consequences worth
|
|
26929
|
+
knowing before reaching for the per-element form: a worker the application configured itself is never
|
|
26930
|
+
overwritten, and when several viewers carry different `workerSrc` values only the first one to load
|
|
26931
|
+
PDF.js takes effect for the whole page. Assigning `workerSrc` after PDF.js has already loaded is not
|
|
26932
|
+
silently dropped — it is re-applied on the next load — but it still cannot displace an
|
|
26933
|
+
already-configured worker. Option 2 above is the right choice for an application that wants one
|
|
26934
|
+
explicit worker everywhere.
|
|
26935
|
+
|
|
26107
26936
|
Remote resources are capped at 25 MB; exceeding it surfaces the localized
|
|
26108
26937
|
`documentPreviewResourceTooLarge` message instead of the PDF.
|
|
26109
26938
|
|
|
@@ -26543,9 +27372,12 @@ each tone's highlighted-cell background. `--lr-notebook-viewer-highlight-active-
|
|
|
26543
27372
|
`text/plain`).
|
|
26544
27373
|
|
|
26545
27374
|
```html
|
|
26546
|
-
<lr-notebook-viewer
|
|
26547
|
-
|
|
26548
|
-
|
|
27375
|
+
<lr-notebook-viewer max-height="30rem"></lr-notebook-viewer>
|
|
27376
|
+
<script type="module">
|
|
27377
|
+
const viewer = document.querySelector("lr-notebook-viewer");
|
|
27378
|
+
viewer.notebook = result;
|
|
27379
|
+
viewer.addEventListener("lr-load", (e) => console.log(e.detail.cellCount, "cells"));
|
|
27380
|
+
</script>
|
|
26549
27381
|
```
|
|
26550
27382
|
|
|
26551
27383
|
A notebook major version outside 4.0–4.5, an invalid shape, or more than 2,000 cells renders a
|
|
@@ -27165,6 +27997,79 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
27165
27997
|
children: unknown;
|
|
27166
27998
|
}`
|
|
27167
27999
|
|
|
28000
|
+
- **`components-viewers-pptx-viewer-pptx-loader-contracts`** — Supporting data types and helpers for this component family.
|
|
28001
|
+
`adaptPptxViewer(/* public names: value */): unknown`
|
|
28002
|
+
`getPptxRenderer(): unknown`
|
|
28003
|
+
`loadPptxRenderer(/* public names: importer */): unknown`
|
|
28004
|
+
`PptxRendererModule {
|
|
28005
|
+
PptxViewer: unknown;
|
|
28006
|
+
open: unknown;
|
|
28007
|
+
input: unknown;
|
|
28008
|
+
container: unknown;
|
|
28009
|
+
options: unknown;
|
|
28010
|
+
RECOMMENDED_ZIP_LIMITS: unknown;
|
|
28011
|
+
}`
|
|
28012
|
+
`PptxSearchHighlightHandle {
|
|
28013
|
+
dispose: unknown;
|
|
28014
|
+
}`
|
|
28015
|
+
`PptxTextSearchResult {
|
|
28016
|
+
slideIndex: unknown;
|
|
28017
|
+
nodeId: unknown;
|
|
28018
|
+
matchStart: unknown;
|
|
28019
|
+
matchEnd: unknown;
|
|
28020
|
+
text: unknown;
|
|
28021
|
+
}`
|
|
28022
|
+
`PptxThumbnailHandle {
|
|
28023
|
+
ready: unknown;
|
|
28024
|
+
dispose: unknown;
|
|
28025
|
+
}`
|
|
28026
|
+
`PptxViewerAdapter {
|
|
28027
|
+
slideCount: unknown;
|
|
28028
|
+
currentSlideIndex: unknown;
|
|
28029
|
+
goToSlide: unknown;
|
|
28030
|
+
index: unknown;
|
|
28031
|
+
searchText: unknown;
|
|
28032
|
+
query: unknown;
|
|
28033
|
+
options: unknown;
|
|
28034
|
+
matchCase: unknown;
|
|
28035
|
+
highlightSearchResult: unknown;
|
|
28036
|
+
result: unknown;
|
|
28037
|
+
scrollIntoView: unknown;
|
|
28038
|
+
renderThumbnailToContainer: unknown;
|
|
28039
|
+
container: unknown;
|
|
28040
|
+
width: unknown;
|
|
28041
|
+
clearSearchHighlights: unknown;
|
|
28042
|
+
subscribe: unknown;
|
|
28043
|
+
listener: unknown;
|
|
28044
|
+
event: unknown;
|
|
28045
|
+
destroy: unknown;
|
|
28046
|
+
}`
|
|
28047
|
+
`PptxViewerApi {
|
|
28048
|
+
slideCount: unknown;
|
|
28049
|
+
currentSlideIndex: unknown;
|
|
28050
|
+
goToSlide: unknown;
|
|
28051
|
+
index: unknown;
|
|
28052
|
+
searchText: unknown;
|
|
28053
|
+
query: unknown;
|
|
28054
|
+
options: unknown;
|
|
28055
|
+
matchCase: unknown;
|
|
28056
|
+
highlightSearchResult: unknown;
|
|
28057
|
+
result: unknown;
|
|
28058
|
+
scrollIntoView: unknown;
|
|
28059
|
+
renderThumbnailToContainer: unknown;
|
|
28060
|
+
container: unknown;
|
|
28061
|
+
width: unknown;
|
|
28062
|
+
clearSearchHighlights: unknown;
|
|
28063
|
+
destroy: unknown;
|
|
28064
|
+
}`
|
|
28065
|
+
`PptxZipLimits {
|
|
28066
|
+
maxEntries: unknown;
|
|
28067
|
+
maxEntryUncompressedBytes: unknown;
|
|
28068
|
+
maxTotalUncompressedBytes: unknown;
|
|
28069
|
+
maxMediaBytes: unknown;
|
|
28070
|
+
maxConcurrency: unknown;
|
|
28071
|
+
}`
|
|
28072
|
+
|
|
27168
28073
|
- **`components-viewers-spreadsheet-viewer-spreadsheet-loader-contracts`** — Supporting data types and helpers for this component family.
|
|
27169
28074
|
`clearSheetJsCache(): unknown`
|
|
27170
28075
|
`loadSheetJsCached(): unknown`
|
|
@@ -27477,8 +28382,9 @@ support (`highlights`, `activeHighlightId`, `scrollToAnchor()`, the `lr-highligh
|
|
|
27477
28382
|
section above for the full write-up of shared behavior.
|
|
27478
28383
|
|
|
27479
28384
|
**Properties:** `content: string = ''`, `tabSize: number = 4` (attribute `tab-size`) — the same
|
|
27480
|
-
finite-integer-guarded leading-indentation expansion used by `<lr-markdown>`; values
|
|
27481
|
-
|
|
28385
|
+
finite-integer-guarded leading-indentation expansion used by `<lr-markdown>`; finite values are
|
|
28386
|
+
clamped to `[1, 32]` (`0` becomes `1`, `33` becomes `32`), and only non-finite values (`NaN`,
|
|
28387
|
+
`Infinity`) fall back to `4`, independently of rendered code's
|
|
27482
28388
|
`--lr-code-block-tab-size`; `marked: LyraMarkedParser | undefined` (readonly, no attribute) — this
|
|
27483
28389
|
instance's isolated peer-neutral configurable parser; `htmlMode: 'sanitize' | 'escape' | 'trusted' =
|
|
27484
28390
|
'sanitize'` (attribute `html-mode`), `gfm: boolean = true`, `linkTarget: string | null = '_blank'` (attribute
|
|
@@ -28217,13 +29123,16 @@ Plus shared tokens — `--lr-space-xs/-s/-m`, `--lr-radius`,
|
|
|
28217
29123
|
conversation-id="sess_123"
|
|
28218
29124
|
label="Q3 roadmap planning"
|
|
28219
29125
|
excerpt="Let's revisit the timeline for the launch…"
|
|
28220
|
-
.timestamp=${session.updatedAt}
|
|
28221
|
-
?active=${session.id === currentSessionId}
|
|
28222
|
-
@lr-select=${(e) => openSession(e.detail.conversationId)}
|
|
28223
|
-
@lr-rename=${(e) => renameSession(e.detail.conversationId, e.detail.label)}
|
|
28224
29126
|
>
|
|
28225
29127
|
<button slot="actions" aria-label="Delete conversation">✕</button>
|
|
28226
29128
|
</lr-conversation-item>
|
|
29129
|
+
<script type="module">
|
|
29130
|
+
const item = document.querySelector("lr-conversation-item");
|
|
29131
|
+
item.timestamp = session.updatedAt;
|
|
29132
|
+
item.active = session.id === currentSessionId;
|
|
29133
|
+
item.addEventListener("lr-select", (e) => openSession(e.detail.conversationId));
|
|
29134
|
+
item.addEventListener("lr-rename", (e) => renameSession(e.detail.conversationId, e.detail.label));
|
|
29135
|
+
</script>
|
|
28227
29136
|
```
|
|
28228
29137
|
|
|
28229
29138
|
`role="button"` lives on `[part="select-button"]`, so the row has
|
|
@@ -28472,19 +29381,18 @@ shared tokens — `--lr-space-xs/-s`, `--lr-color-border/-surface/-brand/-brand-
|
|
|
28472
29381
|
**Optional peer deps:** none.
|
|
28473
29382
|
|
|
28474
29383
|
```html
|
|
28475
|
-
<lr-model-select
|
|
28476
|
-
provider="openai"
|
|
28477
|
-
.catalog=${[
|
|
28478
|
-
{ id: 'gpt-4o', label: 'GPT-4o', icon: '✦' },
|
|
28479
|
-
{ id: 'gpt-4o-mini', label: 'GPT-4o mini' },
|
|
28480
|
-
]}
|
|
28481
|
-
value="gpt-4o"
|
|
28482
|
-
placeholder="Choose a model…"
|
|
28483
|
-
@lr-change=${(e) => setModel(e.detail.value, e.detail.inCatalog)}
|
|
28484
|
-
></lr-model-select>
|
|
29384
|
+
<lr-model-select provider="openai" value="gpt-4o" placeholder="Choose a model…"></lr-model-select>
|
|
28485
29385
|
|
|
28486
29386
|
<!-- No fixed catalog yet: falls back to free-text entry -->
|
|
28487
29387
|
<lr-model-select provider="ollama" placeholder="Type a model id…" allow-custom></lr-model-select>
|
|
29388
|
+
<script type="module">
|
|
29389
|
+
const select = document.querySelector("lr-model-select");
|
|
29390
|
+
select.catalog = [
|
|
29391
|
+
{ id: "gpt-4o", label: "GPT-4o", icon: "✦" },
|
|
29392
|
+
{ id: "gpt-4o-mini", label: "GPT-4o mini" },
|
|
29393
|
+
];
|
|
29394
|
+
select.addEventListener("lr-change", (e) => setModel(e.detail.value, e.detail.inCatalog));
|
|
29395
|
+
</script>
|
|
28488
29396
|
```
|
|
28489
29397
|
|
|
28490
29398
|
**Known gotchas:**
|
|
@@ -29062,15 +29970,15 @@ selector label), `temperature-row`, `temperature-label`, `temperature-value`
|
|
|
29062
29970
|
internally (both imported unconditionally as side effects, not optional).
|
|
29063
29971
|
|
|
29064
29972
|
```html
|
|
29065
|
-
<lr-model-settings-panel
|
|
29066
|
-
provider="OpenAI"
|
|
29067
|
-
.catalog=${['gpt-4o', 'gpt-4o-mini', 'gpt-4.1']}
|
|
29068
|
-
model="gpt-4o"
|
|
29069
|
-
temperature="0.7"
|
|
29070
|
-
@lr-change=${(e) => console.log(e.detail)}
|
|
29071
|
-
></lr-model-settings-panel>
|
|
29973
|
+
<lr-model-settings-panel provider="OpenAI" model="gpt-4o" temperature="0.7"></lr-model-settings-panel>
|
|
29072
29974
|
|
|
29073
|
-
<lr-model-settings-panel layout="compact"
|
|
29975
|
+
<lr-model-settings-panel layout="compact"></lr-model-settings-panel>
|
|
29976
|
+
<script type="module">
|
|
29977
|
+
const [panel, compactPanel] = document.querySelectorAll("lr-model-settings-panel");
|
|
29978
|
+
panel.catalog = ["gpt-4o", "gpt-4o-mini", "gpt-4.1"];
|
|
29979
|
+
panel.addEventListener("lr-change", (e) => console.log(e.detail));
|
|
29980
|
+
compactPanel.catalog = catalog;
|
|
29981
|
+
</script>
|
|
29074
29982
|
```
|
|
29075
29983
|
|
|
29076
29984
|
The internal `lr-slider` renders with its own value readout suppressed (`.showValue=${false}`);
|
|
@@ -29496,13 +30404,18 @@ component's existing requirement of a height-bounded parent, exactly as slotted
|
|
|
29496
30404
|
inline style) still wins over the built-in one.
|
|
29497
30405
|
|
|
29498
30406
|
```html
|
|
29499
|
-
<lr-chat-viewport unread-start-index="12"
|
|
30407
|
+
<lr-chat-viewport unread-start-index="12">
|
|
29500
30408
|
<lr-chat-message message-role="user">…</lr-chat-message>
|
|
29501
30409
|
<lr-chat-message message-role="assistant" status="streaming">
|
|
29502
|
-
<lr-streaming-text streaming
|
|
30410
|
+
<lr-streaming-text streaming></lr-streaming-text>
|
|
29503
30411
|
</lr-chat-message>
|
|
29504
30412
|
</lr-chat-viewport>
|
|
29505
30413
|
<lr-chat-composer status="streaming"></lr-chat-composer>
|
|
30414
|
+
<script type="module">
|
|
30415
|
+
const viewport = document.querySelector("lr-chat-viewport");
|
|
30416
|
+
viewport.querySelector("lr-streaming-text").content = partial;
|
|
30417
|
+
viewport.addEventListener("lr-follow-change", (e) => console.log(e.detail.following));
|
|
30418
|
+
</script>
|
|
29506
30419
|
```
|
|
29507
30420
|
|
|
29508
30421
|
## `lr-suggestion-chips`
|
|
@@ -29550,9 +30463,14 @@ Enter/Space activate. Renders inside an internal `lr-scroller` (`orientation="ho
|
|
|
29550
30463
|
`hide-scrollbar`) unless `wrap` is set.
|
|
29551
30464
|
|
|
29552
30465
|
```html
|
|
29553
|
-
<lr-suggestion-chips
|
|
29554
|
-
@lr-suggestion-select=${(e) => (composer.value = e.detail.label)}></lr-suggestion-chips>
|
|
30466
|
+
<lr-suggestion-chips></lr-suggestion-chips>
|
|
29555
30467
|
<lr-chat-composer></lr-chat-composer>
|
|
30468
|
+
<script type="module">
|
|
30469
|
+
const chips = document.querySelector("lr-suggestion-chips");
|
|
30470
|
+
const composer = document.querySelector("lr-chat-composer");
|
|
30471
|
+
chips.suggestions = followUps;
|
|
30472
|
+
chips.addEventListener("lr-suggestion-select", (e) => (composer.value = e.detail.label));
|
|
30473
|
+
</script>
|
|
29556
30474
|
```
|
|
29557
30475
|
|
|
29558
30476
|
## `lr-thread-list`
|
|
@@ -29735,14 +30653,14 @@ short one, and falls back to exactly `24rem` in an auto-height container.
|
|
|
29735
30653
|
style the pinned band with `lr-thread-list::part(group-sticky)`.
|
|
29736
30654
|
|
|
29737
30655
|
```html
|
|
29738
|
-
<lr-thread-list
|
|
29739
|
-
|
|
29740
|
-
|
|
29741
|
-
.threads
|
|
29742
|
-
|
|
29743
|
-
.rowActions
|
|
29744
|
-
|
|
29745
|
-
|
|
30656
|
+
<lr-thread-list searchable sticky-groups></lr-thread-list>
|
|
30657
|
+
<script type="module">
|
|
30658
|
+
const list = document.querySelector("lr-thread-list");
|
|
30659
|
+
list.threads = threads;
|
|
30660
|
+
list.activeConversationId = activeThreadId;
|
|
30661
|
+
list.rowActions = ["pin", "archive", "delete"];
|
|
30662
|
+
list.addEventListener("lr-select", (e) => openThread(e.detail.conversationId));
|
|
30663
|
+
</script>
|
|
29746
30664
|
```
|
|
29747
30665
|
|
|
29748
30666
|
Composed with `lr-multi-split` (or `lr-app-rail` + `lr-responsive-panel`): thread-list in the start
|
|
@@ -29791,8 +30709,12 @@ assigned to `animation-duration` alone. The spinner stops outright under
|
|
|
29791
30709
|
`prefers-reduced-motion: reduce`.
|
|
29792
30710
|
|
|
29793
30711
|
```html
|
|
29794
|
-
<lr-checkpoint checkpoint-id="ck_18" label="Before refactor"
|
|
29795
|
-
|
|
30712
|
+
<lr-checkpoint checkpoint-id="ck_18" label="Before refactor"></lr-checkpoint>
|
|
30713
|
+
<script type="module">
|
|
30714
|
+
const checkpoint = document.querySelector("lr-checkpoint");
|
|
30715
|
+
checkpoint.timestamp = t;
|
|
30716
|
+
checkpoint.addEventListener("lr-restore", (e) => restoreTo(e.detail.checkpointId));
|
|
30717
|
+
</script>
|
|
29796
30718
|
```
|
|
29797
30719
|
|
|
29798
30720
|
## `lr-usage-badge`
|
|
@@ -29835,8 +30757,11 @@ describable), `summary`, `tokens-in`, `tokens-out`, `cost`, `latency`, `tooltip`
|
|
|
29835
30757
|
cost-text="$0.012"
|
|
29836
30758
|
latency-ms="2350"
|
|
29837
30759
|
></lr-usage-badge>
|
|
29838
|
-
<lr-markdown
|
|
30760
|
+
<lr-markdown></lr-markdown>
|
|
29839
30761
|
</lr-chat-message>
|
|
30762
|
+
<script type="module">
|
|
30763
|
+
document.querySelector("lr-chat-message lr-markdown").content = answer;
|
|
30764
|
+
</script>
|
|
29840
30765
|
```
|
|
29841
30766
|
|
|
29842
30767
|
## `lr-widget-renderer`
|
|
@@ -29870,9 +30795,9 @@ readonly slot?: string; readonly actionId?: string; readonly payload?: unknown }
|
|
|
29870
30795
|
- `LyraWidgetDocument { readonly version: '2'; readonly root: LyraWidgetNode }` — the sole versioned tree source.
|
|
29871
30796
|
- `createWidgetDocument(root: LyraWidgetNode): LyraWidgetDocument` — creates an immediate frozen
|
|
29872
30797
|
version-two snapshot for former unversioned tree assignments. Traversal uses the renderer's depth,
|
|
29873
|
-
node,
|
|
29874
|
-
`TypeError`. Node records, child arrays, and prop records are copied and frozen,
|
|
29875
|
-
values and action payloads intentionally retain caller identity.
|
|
30798
|
+
node, per-node prop, and per-string length ceilings; malformed, cyclic, duplicate-id, or hostile
|
|
30799
|
+
structure throws `TypeError`. Node records, child arrays, and prop records are copied and frozen,
|
|
30800
|
+
while opaque prop values and action payloads intentionally retain caller identity.
|
|
29876
30801
|
|
|
29877
30802
|
The package root and the normal `widget-renderer.js` registration entry expose the renderer
|
|
29878
30803
|
`LyraWidgetRenderer`/`LyraWidgetRendererEventMap` together with the complete stable authoring
|
|
@@ -30139,15 +31064,18 @@ stale-value row), `option-preview` (a pointer-only per-row preview icon, `tabind
|
|
|
30139
31064
|
trigger), `expand-icon`, `empty`, `hint`, `error`.
|
|
30140
31065
|
|
|
30141
31066
|
```html
|
|
30142
|
-
<lr-voice-picker provider="elevenlabs"
|
|
30143
|
-
|
|
30144
|
-
|
|
31067
|
+
<lr-voice-picker provider="elevenlabs" allow-custom></lr-voice-picker>
|
|
31068
|
+
<script type="module">
|
|
31069
|
+
const picker = document.querySelector("lr-voice-picker");
|
|
31070
|
+
picker.catalog = voices;
|
|
31071
|
+
picker.addEventListener("lr-change", (e) => setVoice(e.detail.value));
|
|
31072
|
+
picker.addEventListener("lr-preview-request", (e) => {
|
|
30145
31073
|
if (!e.detail.previewUrl) {
|
|
30146
31074
|
e.preventDefault();
|
|
30147
31075
|
playSample(e.detail.voiceId);
|
|
30148
31076
|
}
|
|
30149
|
-
}
|
|
30150
|
-
|
|
31077
|
+
});
|
|
31078
|
+
</script>
|
|
30151
31079
|
```
|
|
30152
31080
|
|
|
30153
31081
|
**Known gotchas:**
|
|
@@ -30293,6 +31221,26 @@ optional-peer fallback.
|
|
|
30293
31221
|
Every public data/value property is controlled: forwarded child intents bubble without mutating
|
|
30294
31222
|
`messages`, `composerValue`, selections, run state, or persistence-owned data inside the shell.
|
|
30295
31223
|
|
|
31224
|
+
**Only the transcript scrolls.** `[part='base']` is a three-row grid — header, conversation,
|
|
31225
|
+
composer — and only the middle row can shrink, so the composed `lr-chat-viewport` owns the
|
|
31226
|
+
scrolling and the chrome rows stay put at their content size. The trade: give the workspace less
|
|
31227
|
+
block-size than the chrome needs and the conversation row collapses to zero first, after which the
|
|
31228
|
+
header or composer is clipped with no scrollbar. That takes unusually large slotted chrome — a very
|
|
31229
|
+
tall `header-actions` toolbar, or a `composer` replacement much taller than the built-in one — and
|
|
31230
|
+
the region that supplied it caps and scrolls itself through the public parts:
|
|
31231
|
+
|
|
31232
|
+
```css
|
|
31233
|
+
lr-agent-workspace::part(header) {
|
|
31234
|
+
max-block-size: 4rem;
|
|
31235
|
+
overflow: auto;
|
|
31236
|
+
}
|
|
31237
|
+
```
|
|
31238
|
+
|
|
31239
|
+
The same applies to `::part(composer)`. Both declarations are needed: the cap keeps the grid track
|
|
31240
|
+
inside the workspace, and `overflow` makes the capped region scrollable instead of spilling. No
|
|
31241
|
+
component-owned custom property duplicates this, because a `::part()` rule from your tree already
|
|
31242
|
+
wins over the shadow stylesheet regardless of specificity.
|
|
31243
|
+
|
|
30296
31244
|
## `lr-message-parts`
|
|
30297
31245
|
|
|
30298
31246
|
Ordered renderer for provider-neutral `MessagePart[]`: text, reasoning, tool call/result, citation,
|
|
@@ -30354,7 +31302,8 @@ import "@aceshooting/lyra-ui/components/conversation/message-parts/message-parts
|
|
|
30354
31302
|
- `lr-copy` event — Passthrough from rendered JSON content.
|
|
30355
31303
|
- `lr-highlight-activate` event — Passthrough from rendered Markdown.
|
|
30356
31304
|
- `lr-link-click` event — Passthrough from rendered Markdown.
|
|
30357
|
-
- `lr-preview-request` event —
|
|
31305
|
+
- `lr-preview-request` event — Passthrough from a rendered attachment. Not cancelable as of 10.0.0:
|
|
31306
|
+
`<lr-attachment-chip>` dropped the flag, since it owns no preview default action to veto.
|
|
30358
31307
|
- `lr-remove` event — Passthrough from a rendered attachment.
|
|
30359
31308
|
- `lr-render-error` event — Passthrough from rendered Markdown, tool-result, or widget content.
|
|
30360
31309
|
- `lr-retry` event — Passthrough from a rendered attachment.
|
|
@@ -30603,6 +31552,7 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
30603
31552
|
- **`components-conversation-code-block-code-loader-contracts`** — Supporting data types and helpers for this component family.
|
|
30604
31553
|
`loadShikiHighlighter(): unknown`
|
|
30605
31554
|
`loadShikiLanguage(/* public names: hl, lang */): unknown`
|
|
31555
|
+
`shikiHasLoadedLanguage(/* public names: hl, lang */): unknown`
|
|
30606
31556
|
|
|
30607
31557
|
- **`components-conversation-code-block-shiki-types-contracts`** — Supporting data types and helpers for this component family.
|
|
30608
31558
|
`loadShikiHighlighterCore(/* public names: languages */): unknown`
|
|
@@ -30953,11 +31903,15 @@ referenced: `--lr-color-text-quiet`, `--lr-color-surface`, `--lr-color-border`,
|
|
|
30953
31903
|
summary="Searching web…"
|
|
30954
31904
|
duration-ms="820"
|
|
30955
31905
|
call-id="call_123"
|
|
30956
|
-
@lr-tool-call-chip-select=${(e) => openDetail(e.detail.callId)}
|
|
30957
31906
|
>
|
|
30958
31907
|
<pre slot="icon" style="display:none"></pre>
|
|
30959
31908
|
<code>{"query": "lyra ui components"}</code>
|
|
30960
31909
|
</lr-tool-call-chip>
|
|
31910
|
+
<script type="module">
|
|
31911
|
+
document
|
|
31912
|
+
.querySelector("lr-tool-call-chip")
|
|
31913
|
+
.addEventListener("lr-tool-call-chip-select", (e) => openDetail(e.detail.callId));
|
|
31914
|
+
</script>
|
|
30961
31915
|
```
|
|
30962
31916
|
|
|
30963
31917
|
The default slot's tooltip is positioned with the same `internal/positioner.js` `place()` helper
|
|
@@ -31049,12 +32003,13 @@ of course pull in whatever they need (a charting library, a markdown renderer),
|
|
|
31049
32003
|
the lazy `load()` path in the registry exists for.
|
|
31050
32004
|
|
|
31051
32005
|
```html
|
|
31052
|
-
<lr-tool-result-view
|
|
31053
|
-
|
|
31054
|
-
|
|
31055
|
-
.
|
|
31056
|
-
|
|
31057
|
-
|
|
32006
|
+
<lr-tool-result-view tool-name="get_weather"></lr-tool-result-view>
|
|
32007
|
+
<script type="module">
|
|
32008
|
+
const view = document.querySelector("lr-tool-result-view");
|
|
32009
|
+
view.result = { tempC: 21, condition: "cloudy" };
|
|
32010
|
+
view.args = { city: "Brussels" };
|
|
32011
|
+
view.addEventListener("lr-render-error", (e) => console.warn("renderer failed", e.detail));
|
|
32012
|
+
</script>
|
|
31058
32013
|
```
|
|
31059
32014
|
|
|
31060
32015
|
### `registerToolRenderer()` and the tool-renderer registry (`registry.ts`)
|
|
@@ -31268,20 +32223,22 @@ tokens `--lr-color-surface/-border/-text-quiet/-brand/-brand-quiet/-success/-suc
|
|
|
31268
32223
|
**Optional peer deps:** none.
|
|
31269
32224
|
|
|
31270
32225
|
```html
|
|
31271
|
-
<lr-tool-result-dialog
|
|
31272
|
-
tool-name="run_query"
|
|
31273
|
-
status="success"
|
|
31274
|
-
duration-ms="1240"
|
|
31275
|
-
?open=${dialogOpen}
|
|
31276
|
-
@lr-close=${(e) => (dialogOpen = false)}
|
|
31277
|
-
@lr-maximize-change=${(e) => console.log('maximized:', e.detail.maximized)}
|
|
31278
|
-
>
|
|
32226
|
+
<lr-tool-result-dialog tool-name="run_query" status="success" duration-ms="1240">
|
|
31279
32227
|
<lr-tab-group slot="body">
|
|
31280
32228
|
<div slot="preview" label="Preview">…</div>
|
|
31281
|
-
<div slot="json" label="JSON"><lr-json-viewer
|
|
32229
|
+
<div slot="json" label="JSON"><lr-json-viewer></lr-json-viewer></div>
|
|
31282
32230
|
</lr-tab-group>
|
|
31283
32231
|
<button slot="footer">Rerun</button>
|
|
31284
32232
|
</lr-tool-result-dialog>
|
|
32233
|
+
<script type="module">
|
|
32234
|
+
const dialog = document.querySelector("lr-tool-result-dialog");
|
|
32235
|
+
dialog.querySelector("lr-json-viewer").data = result;
|
|
32236
|
+
dialog.open = true;
|
|
32237
|
+
dialog.addEventListener("lr-close", () => (dialog.open = false));
|
|
32238
|
+
dialog.addEventListener("lr-maximize-change", (e) =>
|
|
32239
|
+
console.log("maximized:", e.detail.maximized)
|
|
32240
|
+
);
|
|
32241
|
+
</script>
|
|
31285
32242
|
```
|
|
31286
32243
|
|
|
31287
32244
|
While open, `[part="panel"]` takes `role="dialog"` + `aria-modal="true"` with `aria-labelledby`
|
|
@@ -31413,23 +32370,25 @@ assigned elements.
|
|
|
31413
32370
|
dependencies of this package imported directly, not optional peers.
|
|
31414
32371
|
|
|
31415
32372
|
```html
|
|
31416
|
-
<lr-tool-select-dialog
|
|
31417
|
-
|
|
31418
|
-
.tools=${[
|
|
31419
|
-
{ id: 'search', name: 'Web search', category: 'Research' },
|
|
31420
|
-
{ id: 'python', name: 'Python', category: 'Code', description: 'Run sandboxed Python' },
|
|
31421
|
-
{ id: 'admin', name: 'Admin console', disabled: true, disabledReason: 'Requires admin approval' },
|
|
31422
|
-
]}
|
|
31423
|
-
.selectedToolIds=${enabledToolIds}
|
|
31424
|
-
?use-defaults=${usingDefaults}
|
|
31425
|
-
?open=${dialogOpen}
|
|
31426
|
-
@lr-change=${(e) => updateTools(e.detail.selectedToolIds, e.detail.useDefaults)}
|
|
31427
|
-
@lr-close=${() => (dialogOpen = false)}
|
|
31428
|
-
>
|
|
31429
|
-
<button slot="footer" @click=${(e) => e.target.closest('lr-tool-select-dialog').close('done')}>
|
|
31430
|
-
Done
|
|
31431
|
-
</button>
|
|
32373
|
+
<lr-tool-select-dialog label="Select tools">
|
|
32374
|
+
<button slot="footer" id="done-btn">Done</button>
|
|
31432
32375
|
</lr-tool-select-dialog>
|
|
32376
|
+
<script type="module">
|
|
32377
|
+
const dialog = document.querySelector("lr-tool-select-dialog");
|
|
32378
|
+
dialog.tools = [
|
|
32379
|
+
{ id: "search", name: "Web search", category: "Research" },
|
|
32380
|
+
{ id: "python", name: "Python", category: "Code", description: "Run sandboxed Python" },
|
|
32381
|
+
{ id: "admin", name: "Admin console", disabled: true, disabledReason: "Requires admin approval" },
|
|
32382
|
+
];
|
|
32383
|
+
dialog.selectedToolIds = enabledToolIds;
|
|
32384
|
+
dialog.useDefaults = usingDefaults;
|
|
32385
|
+
dialog.open = true;
|
|
32386
|
+
dialog.addEventListener("lr-change", (e) =>
|
|
32387
|
+
updateTools(e.detail.selectedToolIds, e.detail.useDefaults)
|
|
32388
|
+
);
|
|
32389
|
+
dialog.addEventListener("lr-close", () => (dialog.open = false));
|
|
32390
|
+
dialog.querySelector("#done-btn").addEventListener("click", () => dialog.close("done"));
|
|
32391
|
+
</script>
|
|
31433
32392
|
```
|
|
31434
32393
|
|
|
31435
32394
|
`useDefaults` is a single top-level switch: while `true`, every per-tool checkbox renders disabled
|
|
@@ -31788,15 +32747,14 @@ other text-entry surface in the library provides), plus shared tokens
|
|
|
31788
32747
|
package, not an optional peer.
|
|
31789
32748
|
|
|
31790
32749
|
```html
|
|
31791
|
-
<lr-tool-approval-dialog
|
|
31792
|
-
tool-name="send_email"
|
|
31793
|
-
.args=${{ to: 'ops@example.com', subject: 'Deploy finished' }}
|
|
31794
|
-
@lr-approve=${(e) => runTool(e.detail.args)}
|
|
31795
|
-
@lr-deny=${() => console.log('denied')}
|
|
31796
|
-
@lr-close=${(e) => console.log('closed:', e.detail)}
|
|
31797
|
-
></lr-tool-approval-dialog>
|
|
32750
|
+
<lr-tool-approval-dialog tool-name="send_email"></lr-tool-approval-dialog>
|
|
31798
32751
|
<script type="module">
|
|
31799
|
-
document.querySelector(
|
|
32752
|
+
const dialog = document.querySelector("lr-tool-approval-dialog");
|
|
32753
|
+
dialog.args = { to: "ops@example.com", subject: "Deploy finished" };
|
|
32754
|
+
dialog.addEventListener("lr-approve", (e) => runTool(e.detail.args));
|
|
32755
|
+
dialog.addEventListener("lr-deny", () => console.log("denied"));
|
|
32756
|
+
dialog.addEventListener("lr-close", (e) => console.log("closed:", e.detail));
|
|
32757
|
+
dialog.open = true;
|
|
31800
32758
|
</script>
|
|
31801
32759
|
```
|
|
31802
32760
|
|
|
@@ -32014,20 +32972,22 @@ form: `--lr-space-l/-xs/-s`, `--lr-color-border`, `--lr-radius`, `--lr-color-sur
|
|
|
32014
32972
|
dependencies of this package imported directly, not optional peers.
|
|
32015
32973
|
|
|
32016
32974
|
```html
|
|
32017
|
-
<lr-tool-param-form
|
|
32018
|
-
|
|
32019
|
-
|
|
32975
|
+
<lr-tool-param-form></lr-tool-param-form>
|
|
32976
|
+
<script type="module">
|
|
32977
|
+
const form = document.querySelector("lr-tool-param-form");
|
|
32978
|
+
form.schema = {
|
|
32979
|
+
type: "object",
|
|
32020
32980
|
properties: {
|
|
32021
|
-
title: { type:
|
|
32022
|
-
attendees: { type:
|
|
32023
|
-
allDay: { type:
|
|
32981
|
+
title: { type: "string", title: "Title" },
|
|
32982
|
+
attendees: { type: "string", enum: ["team", "everyone"], default: "team" },
|
|
32983
|
+
allDay: { type: "boolean", title: "All day" },
|
|
32024
32984
|
},
|
|
32025
|
-
required: [
|
|
32026
|
-
}
|
|
32027
|
-
.value
|
|
32028
|
-
|
|
32029
|
-
|
|
32030
|
-
|
|
32985
|
+
required: ["title"],
|
|
32986
|
+
};
|
|
32987
|
+
form.value = draftArgs;
|
|
32988
|
+
form.addEventListener("lr-input", (e) => (draftArgs = e.detail.value));
|
|
32989
|
+
form.addEventListener("lr-validity-change", (e) => (formIsValid = e.detail.valid));
|
|
32990
|
+
</script>
|
|
32031
32991
|
```
|
|
32032
32992
|
|
|
32033
32993
|
This component owns no Submit/Cancel/Approve chrome — a consumer composes it inside their own dialog
|
|
@@ -32419,7 +33379,9 @@ default the component creates a plain-text `Blob`/object URL and activates a syn
|
|
|
32419
33379
|
`<a download>`; `preventDefault()` suppresses that built-in download so the host can substitute
|
|
32420
33380
|
server-side or other handling),
|
|
32421
33381
|
`lr-follow-change` (`detail: { following }`), `lr-search-change` (`detail: { query, matchCount,
|
|
32422
|
-
activeIndex }
|
|
33382
|
+
matchCountExact, activeIndex }`; `matchCountExact` is `false` once a search hits the 10,000-match
|
|
33383
|
+
ceiling, marking `matchCount` as a lower bound rather than an exact total),
|
|
33384
|
+
`lr-highlight-activate` (`detail: { highlightId }`), and `lr-text-select` (`detail: {
|
|
32423
33385
|
text, anchor, rects }`).
|
|
32424
33386
|
|
|
32425
33387
|
**CSS parts:** `base`, `toolbar` (only rendered when copy/download are enabled), `copy-button`,
|
|
@@ -32517,9 +33479,11 @@ columns. Consumes the same `LyraSpan[]` as `<lr-span-waterfall>`.
|
|
|
32517
33479
|
under `lr-span-waterfall` above (exported from `trace-tree/span.ts`); hierarchy comes from
|
|
32518
33480
|
`parentId`, and a span whose `parentId` is missing or doesn't resolve within the same array renders
|
|
32519
33481
|
as a root rather than being dropped. `activeSpanId: string | null = null`
|
|
32520
|
-
(attribute `active-span-id`), `label
|
|
33482
|
+
(attribute `active-span-id`), `label?: string`, `showTokens: boolean = false` (attribute
|
|
32521
33483
|
`show-tokens`) — surfaces `tokensIn`/`tokensOut`, `showCost: boolean = false` (attribute
|
|
32522
33484
|
`show-cost`) — surfaces `costText`, and `hideBars: boolean = false` (attribute `hide-bars`).
|
|
33485
|
+
`label` is an optional accessible-name override for the `role="tree"` element: omission localizes
|
|
33486
|
+
the default, and any supplied string — including `''` — is rendered verbatim.
|
|
32523
33487
|
Token counts render only when finite and non-negative; invalid metrics are omitted rather than
|
|
32524
33488
|
reaching `Intl.NumberFormat`. A row's accessible name includes its optional `detail` text as well
|
|
32525
33489
|
as its name/status/metrics, and updates when the supplied span data changes. Every trace view uses
|
|
@@ -32841,9 +33805,13 @@ repainting everything else that reads them.
|
|
|
32841
33805
|
|
|
32842
33806
|
```html
|
|
32843
33807
|
<lr-tool-call-chip status="pending"></lr-tool-call-chip>
|
|
32844
|
-
<lr-confirm-bar tool-name="run_shell"
|
|
32845
|
-
|
|
32846
|
-
|
|
33808
|
+
<lr-confirm-bar tool-name="run_shell"></lr-confirm-bar>
|
|
33809
|
+
<script type="module">
|
|
33810
|
+
const bar = document.querySelector("lr-confirm-bar");
|
|
33811
|
+
bar.args = args;
|
|
33812
|
+
bar.addEventListener("lr-approve", (e) => run(e.detail.args));
|
|
33813
|
+
bar.addEventListener("lr-deny", () => cancel());
|
|
33814
|
+
</script>
|
|
32847
33815
|
```
|
|
32848
33816
|
|
|
32849
33817
|
An `lr-approve`/`lr-deny` listener that needs to await its own async work before finalizing calls
|
|
@@ -32905,9 +33873,13 @@ phase write queued while detached.
|
|
|
32905
33873
|
viewport's aspect ratio.
|
|
32906
33874
|
|
|
32907
33875
|
```html
|
|
32908
|
-
<lr-browser-frame phase="streaming" url="https://example.com"
|
|
32909
|
-
|
|
32910
|
-
|
|
33876
|
+
<lr-browser-frame phase="streaming" url="https://example.com"></lr-browser-frame>
|
|
33877
|
+
<script type="module">
|
|
33878
|
+
const frame = document.querySelector("lr-browser-frame");
|
|
33879
|
+
frame.pings = pings;
|
|
33880
|
+
frame.addEventListener("lr-take-over", (e) => setController(e.detail.controller));
|
|
33881
|
+
frame.addEventListener("lr-stop", () => stopSession());
|
|
33882
|
+
</script>
|
|
32911
33883
|
```
|
|
32912
33884
|
|
|
32913
33885
|
**Additional API surface:**
|
|
@@ -32981,11 +33953,17 @@ ancestor. They exist because `::part(view-button)[aria-pressed='true']` is inval
|
|
|
32981
33953
|
library-wide brand tokens as the only prior lever.
|
|
32982
33954
|
|
|
32983
33955
|
```html
|
|
32984
|
-
<lr-artifact-panel label="report.md" kind="document"
|
|
32985
|
-
|
|
32986
|
-
<lr-
|
|
32987
|
-
<lr-code-block slot="code" language="markdown" .code=${markdown}></lr-code-block>
|
|
33956
|
+
<lr-artifact-panel label="report.md" kind="document">
|
|
33957
|
+
<lr-markdown id="preview"></lr-markdown>
|
|
33958
|
+
<lr-code-block slot="code" id="code" language="markdown"></lr-code-block>
|
|
32988
33959
|
</lr-artifact-panel>
|
|
33960
|
+
<script type="module">
|
|
33961
|
+
const panel = document.querySelector("lr-artifact-panel");
|
|
33962
|
+
panel.versions = versions;
|
|
33963
|
+
panel.querySelector("#preview").content = markdown;
|
|
33964
|
+
panel.querySelector("#code").code = markdown;
|
|
33965
|
+
panel.addEventListener("lr-restore", (e) => restoreVersion(e.detail.versionId));
|
|
33966
|
+
</script>
|
|
32989
33967
|
```
|
|
32990
33968
|
|
|
32991
33969
|
## `lr-agent-run`
|
|
@@ -33094,7 +34072,9 @@ hierarchical trace tree from one shared `spans` array.
|
|
|
33094
34072
|
(`'agent' | 'llm' | 'tool' | 'retriever' | 'embedding' | 'other'`). Empty shows every kind;
|
|
33095
34073
|
pre-settable (e.g. to hide `retriever`/`embedding` by default) and readable back after
|
|
33096
34074
|
`lr-span-visibility-change`
|
|
33097
|
-
- `label
|
|
34075
|
+
- `label?: string` — forwarded to the composed `lr-trace-tree`. Omission leaves that tree's own
|
|
34076
|
+
`label` unset so it localizes its own default; any supplied string (including `''`) is
|
|
34077
|
+
forwarded verbatim
|
|
33098
34078
|
- `showTokens: boolean = false` (attribute `show-tokens`), `showCost: boolean = false` (attribute
|
|
33099
34079
|
`show-cost`), `showBars: boolean = true` (attribute `show-bars`, renamed from `hideBars` in
|
|
33100
34080
|
9.0.0 to match the positive polarity of its two siblings above — default inverted so the
|
|
@@ -33623,7 +34603,7 @@ persistence.
|
|
|
33623
34603
|
`versions: readonly PromptStudioVersion[] = []` is a property-only host-controlled input;
|
|
33624
34604
|
empty/blank message and version ids are omitted and later duplicates use deterministic first-wins
|
|
33625
34605
|
identity before rendering, editing, focus, selection, and events;
|
|
33626
|
-
`selectedVersionId: string =
|
|
34606
|
+
`selectedVersionId: string | null = null` (attribute `selected-version-id`); `label: string = ''`;
|
|
33627
34607
|
`heading: string = ''` — visible toolbar heading, falling back to the localized Prompt Studio
|
|
33628
34608
|
label when unset;
|
|
33629
34609
|
`running: boolean = false`, `disabled: boolean = false`, and `reorderable: boolean = false`
|
|
@@ -33690,7 +34670,8 @@ It intentionally does not fetch remote references or validate values.
|
|
|
33690
34670
|
|
|
33691
34671
|
**Properties:** clone-owned, bounded, frozen `schema: JsonSchemaNode | null = null` and
|
|
33692
34672
|
`issues: readonly SchemaValidationIssue[] = []` (attribute: false); reassign a new schema record or
|
|
33693
|
-
issue array after changes. `selectedPath: string =
|
|
34673
|
+
issue array after changes. `selectedPath: string | null = null` (attribute `selected-path`) —
|
|
34674
|
+
`null` means no selection, while the empty string is the valid JSON Pointer for the schema root;
|
|
33694
34675
|
`maxDepth: number = 20` (attribute `max-depth`, clamped to 100); `label: string = ''`.
|
|
33695
34676
|
|
|
33696
34677
|
**Exported types:** `JsonSchemaNode` covers `$ref`, type/title/description, properties/items,
|
|
@@ -34221,6 +35202,44 @@ These named interfaces and helper signatures are available to typed integrations
|
|
|
34221
35202
|
|
|
34222
35203
|
# Retrieval, knowledge graph & grounding (`components/retrieval/`)
|
|
34223
35204
|
|
|
35205
|
+
## Breaking changes in 10.0.0
|
|
35206
|
+
|
|
35207
|
+
`lr-entity-card`, `lr-entity-chip` and `lr-neighbor-list` no longer emit `lr-entity-activate`. The
|
|
35208
|
+
canonical name for that gesture is `lr-entity-select` (`detail: { entityId }`), fired from the same
|
|
35209
|
+
gesture with the same detail — only the second spelling is gone. It is removed outright rather than
|
|
35210
|
+
kept as a dual-emitting alias, because the library has no released consumers and an alias is a
|
|
35211
|
+
permanent tax paid to protect users who do not exist. Rename the listener; nothing else changes.
|
|
35212
|
+
|
|
35213
|
+
Two composites narrow with them. `lr-entity-dossier` surfaces its embedded entity card's and
|
|
35214
|
+
neighbor list's gesture as `lr-entity-select` only, and `lr-provenance-panel` does the same for its
|
|
35215
|
+
embedded entity chip. On both, `lr-entity-activate` now reaches a host only from the embedded
|
|
35216
|
+
community card or relationship path strip, which is also the only source of the richer
|
|
35217
|
+
`{ entityId, occurrenceIndex? }` detail — so on these two elements the names now carry different
|
|
35218
|
+
shapes rather than being two spellings of one event.
|
|
35219
|
+
|
|
35220
|
+
`lr-community-card` and `lr-path-strip` keep `lr-entity-activate` unchanged. It is their only name
|
|
35221
|
+
and never was an alias, so do **not** rename those listeners.
|
|
35222
|
+
|
|
35223
|
+
`lr-rag-eval-dashboard` no longer emits `lr-run-select`; listen for `lr-run-change`
|
|
35224
|
+
(`detail: { run }`, unchanged). Same removal, same reason.
|
|
35225
|
+
|
|
35226
|
+
`lr-knowledge-graph-explorer`'s `lr-search-change` detail is now exactly
|
|
35227
|
+
`{ query, matchCount, matchCountExact }`. The old `searchQuery` member is replaced by the canonical
|
|
35228
|
+
`query` rather than carried beside it, so the event finally has the `LyraSearchChangeDetail` shape
|
|
35229
|
+
the rest of the library's search emitters use — read `e.detail.query`. The detail deliberately has no
|
|
35230
|
+
`activeIndex` (this is a live node filter, not a cursor-based search) and `matchCountExact` is always
|
|
35231
|
+
`true`, since that filter has no truncating ceiling. The `searchQuery` **property** is a different
|
|
35232
|
+
member and is unaffected: the component still applies the query to it before emitting, so reassigning
|
|
35233
|
+
it from the handler stays a no-op.
|
|
35234
|
+
|
|
35235
|
+
Also corrected in 10.0.0 — not breaking, but visible. A chip with no `entity-id` renders its button
|
|
35236
|
+
disabled, and now looks it: `lr-entity-chip` used to paint that state pixel-identical to a working
|
|
35237
|
+
chip — full opacity, a hand cursor, complete hover and press feedback for a control that cannot emit
|
|
35238
|
+
anything — and now dims to `--lr-opacity-disabled` with a `not-allowed` cursor and no pointer
|
|
35239
|
+
response. `lr-embedding-explorer`'s selected point has a focus ring again. And
|
|
35240
|
+
`lr-knowledge-graph-explorer` no longer announces on mount: a preset `search-query` used to fire its
|
|
35241
|
+
live region before any user action.
|
|
35242
|
+
|
|
34224
35243
|
## Breaking changes in 9.0.0
|
|
34225
35244
|
|
|
34226
35245
|
`lr-graph`'s exported types `GraphLayout`, `GraphRenderer`, `GraphSelectionMode`, `GraphPickKind`, and
|
|
@@ -34672,7 +35691,7 @@ only that row's decorative swatch opacity. Also reads `--lr-graph-cat-1` through
|
|
|
34672
35691
|
|
|
34673
35692
|
A dossier card for one knowledge-graph entity: type badge, description, key/value property rows,
|
|
34674
35693
|
degree, community chip, plus a built-in "focus in graph" action. Never fetches or focuses a graph
|
|
34675
|
-
itself — `lr-entity-
|
|
35694
|
+
itself — `lr-entity-select` is a request a host routes into `lr-graph`'s own
|
|
34676
35695
|
`focusNode(id, options?)`.
|
|
34677
35696
|
|
|
34678
35697
|
**Properties:**
|
|
@@ -34697,7 +35716,7 @@ number; communityId?: string }`; field names deliberately mirror `lr-graph`'s `L
|
|
|
34697
35716
|
set — there is nothing left to tighten. The exported alias `EntityCardAppearance` is retained as a
|
|
34698
35717
|
name for the same union.
|
|
34699
35718
|
|
|
34700
|
-
**Events:** `lr-entity-
|
|
35719
|
+
**Events:** `lr-entity-select` (`detail: { entityId }`, the built-in focus button was activated).
|
|
34701
35720
|
|
|
34702
35721
|
**Slots:** default (extra body content below the property rows, e.g. a `lr-neighbor-list`),
|
|
34703
35722
|
`actions` (extra header actions alongside the built-in focus button).
|
|
@@ -34730,7 +35749,7 @@ from tokens.
|
|
|
34730
35749
|
};
|
|
34731
35750
|
document
|
|
34732
35751
|
.getElementById("card")
|
|
34733
|
-
.addEventListener("lr-entity-
|
|
35752
|
+
.addEventListener("lr-entity-select", (e) =>
|
|
34734
35753
|
graph.focusNode(e.detail.entityId)
|
|
34735
35754
|
);
|
|
34736
35755
|
</script>
|
|
@@ -34767,7 +35786,7 @@ before the type template is composed, so it never produces a leading punctuation
|
|
|
34767
35786
|
`, person`. An authored host `aria-label` intentionally names only the custom-element boundary;
|
|
34768
35787
|
it is not copied onto the shadow button because host naming does not cross that boundary.
|
|
34769
35788
|
|
|
34770
|
-
**Events:** `lr-entity-
|
|
35789
|
+
**Events:** `lr-entity-select` (`detail: { entityId }`, click, or Enter while focused),
|
|
34771
35790
|
`lr-entity-open` (`detail: { entityId }`, dblclick, or Space while focused).
|
|
34772
35791
|
|
|
34773
35792
|
**Slots:** default — rich preview content (typically a compact `lr-entity-card`), shown in a
|
|
@@ -34815,7 +35834,7 @@ graph data) and never mutates a graph.
|
|
|
34815
35834
|
- `label: string = ''` — fallback name for the stable group. A non-empty host `aria-label` makes
|
|
34816
35835
|
the host the sole overall owner; an explicitly empty host label stays empty on the group
|
|
34817
35836
|
|
|
34818
|
-
**Events:** `lr-entity-
|
|
35837
|
+
**Events:** `lr-entity-select` (`detail: { entityId }`, a row's node button was activated),
|
|
34819
35838
|
`lr-node-expand` (`detail: { nodeId }`, a row's expand button was activated — deliberately the same
|
|
34820
35839
|
name and detail shape as `lr-graph`'s own event, so one host handler serves both).
|
|
34821
35840
|
|
|
@@ -35186,8 +36205,10 @@ chip` row, one `lr-path-strip` per relationship, `lr-community-card`, `lr-chunk-
|
|
|
35186
36205
|
**Events:** `lr-toggle` (`detail: { section, expanded }`, a section header was toggled —
|
|
35187
36206
|
`section` is `'entities' | 'relationships' | 'communities' | 'chunks'`). Because the panel is a
|
|
35188
36207
|
conduit, every affordance it renders also reaches a listener on the panel itself, and all are
|
|
35189
|
-
part of its typed event map: `lr-entity-
|
|
35190
|
-
|
|
36208
|
+
part of its typed event map: `lr-entity-select` (`detail: { entityId }`, from an entity chip),
|
|
36209
|
+
`lr-entity-activate` (`detail: { entityId, occurrenceIndex? }`, from a community card member or
|
|
36210
|
+
path-strip node — the only name either one emits, and the only one carrying `occurrenceIndex`),
|
|
36211
|
+
`lr-entity-open` (`detail: { entityId }`, an entity chip double-click or
|
|
35191
36212
|
Space), `lr-drill` (`detail: { communityId }`, a community card's title, drill button, or overflow chip), and
|
|
35192
36213
|
`lr-relation-activate` (`detail: { relation, sourceNodeId?, targetNodeId?, occurrenceIndex }`, a relationship path-strip
|
|
35193
36214
|
edge), plus `lr-chunk-open` (`detail: { chunkId, sourceId, anchor? }`) and `lr-expand`
|
|
@@ -35582,7 +36603,10 @@ shape?: 'circle' | 'square' | 'diamond' }`, the `lr-graph.nodeTypes` entry shape
|
|
|
35582
36603
|
`aria-label` names the dossier as a whole and is not cloned onto the strip
|
|
35583
36604
|
|
|
35584
36605
|
**Events:** declares none of its own. Every composed child's event bubbles through unmodified
|
|
35585
|
-
(`composed: true`): `lr-entity-
|
|
36606
|
+
(`composed: true`): `lr-entity-select` (`detail: { entityId }`, surfaced from the embedded entity
|
|
36607
|
+
card or neighbor list), `lr-entity-activate` (`detail: { entityId, occurrenceIndex? }` — surfaced
|
|
36608
|
+
from the embedded provenance panel's own community card or relationship path strip, the only
|
|
36609
|
+
source carrying `occurrenceIndex`), `lr-node-expand` (`detail: { nodeId }`),
|
|
35586
36610
|
`lr-chunk-open` (`detail: { chunkId, sourceId, anchor? }`), `lr-expand` (`detail: { chunkId, expanded }`),
|
|
35587
36611
|
`lr-toggle` (`detail: { section, expanded }`), and `lr-tab-show`
|
|
35588
36612
|
(`detail: { tabId: LyraEntityDossierTab }`, where `LyraEntityDossierTab = 'relationships' | 'chunks'
|
|
@@ -35877,9 +36901,14 @@ same self-toggle-then-emit contract `lr-graph-legend` uses, so every feature wor
|
|
|
35877
36901
|
- `lr-hidden-types-change` (`detail: { hiddenTypes: string[] }`) — a node type's visibility changed
|
|
35878
36902
|
via the composed legend. Follows the same self-toggle-then-emit contract as `lr-pin-change`/
|
|
35879
36903
|
`lr-search-change`, so reassigning back is optional.
|
|
35880
|
-
- `lr-search-change` (`detail: {
|
|
35881
|
-
|
|
35882
|
-
|
|
36904
|
+
- `lr-search-change` (`detail: { query: string; matchCount: number; matchCountExact: boolean }`) —
|
|
36905
|
+
the user typed in the toolbar's search box. `query` is the canonical `LyraSearchChangeDetail`
|
|
36906
|
+
field name. `matchCount` is the same live node-filter total the result list and its live-region
|
|
36907
|
+
announcement already compute (`0` while the query is empty). `matchCountExact` is always `true` —
|
|
36908
|
+
this component's node filter has no truncating ceiling, unlike a paginated text-search viewer.
|
|
36909
|
+
There is no `activeIndex`: this is a live node filter, not a cursor-based search. The component
|
|
36910
|
+
has already applied the query to its own `searchQuery` property before emitting, so reassigning
|
|
36911
|
+
it back is optional and a direct host assignment stays silent.
|
|
35883
36912
|
- Bubbling straight through from composed children, unmodified: `lr-node-click`
|
|
35884
36913
|
(`detail: { nodeId, x, y }`), `lr-link-click` (`detail: { sourceNodeId, targetNodeId, linkId? }`), `lr-community-click`
|
|
35885
36914
|
(`detail: { communityId }`), `lr-node-expand` (`detail: { nodeId }`, from `lr-graph` and/or `lr-neighbor-list`),
|
|
@@ -36483,7 +37512,7 @@ duplicates are omitted first-wins before metric fallback, slice derivation/filte
|
|
|
36483
37512
|
history, counts, rendering, or actions.
|
|
36484
37513
|
|
|
36485
37514
|
**Events:** `lr-metric-change` (`{ metricId }`), `lr-slice-change` (`{ slice }`), and
|
|
36486
|
-
`lr-run-
|
|
37515
|
+
`lr-run-change` (`{ run }`). All are controlled intents; the component does not mutate the
|
|
36487
37516
|
corresponding selection properties.
|
|
36488
37517
|
|
|
36489
37518
|
**CSS parts:** `base`, `heading`, `slices`, `slice`, `slice-selected`, `metrics`, `metric`,
|