@aceshooting/lyra-ui 1.2.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -14
- package/custom-elements.json +30279 -12124
- package/dist/components/app-rail/app-rail-item.d.ts +30 -0
- package/dist/components/app-rail/app-rail-item.js +68 -0
- package/dist/components/app-rail/app-rail-item.styles.d.ts +1 -0
- package/dist/components/app-rail/app-rail-item.styles.js +65 -0
- package/dist/components/app-rail/app-rail.d.ts +168 -0
- package/dist/components/app-rail/app-rail.js +419 -0
- package/dist/components/app-rail/app-rail.styles.d.ts +1 -0
- package/dist/components/app-rail/app-rail.styles.js +128 -0
- package/dist/components/attachment-chip/attachment-chip.d.ts +141 -0
- package/dist/components/attachment-chip/attachment-chip.js +356 -0
- package/dist/components/attachment-chip/attachment-chip.styles.d.ts +1 -0
- package/dist/components/attachment-chip/attachment-chip.styles.js +184 -0
- package/dist/components/attachment-trigger/attachment-trigger.d.ts +96 -0
- package/dist/components/attachment-trigger/attachment-trigger.js +270 -0
- package/dist/components/attachment-trigger/attachment-trigger.styles.d.ts +1 -0
- package/dist/components/attachment-trigger/attachment-trigger.styles.js +90 -0
- package/dist/components/chart/bar-chart.js +2 -18
- package/dist/components/chart/box-plot.d.ts +25 -1
- package/dist/components/chart/box-plot.js +147 -7
- package/dist/components/chart/box-plot.styles.js +13 -0
- package/dist/components/chart/bubble-chart.js +2 -18
- package/dist/components/chart/chart-loader.d.ts +44 -13
- package/dist/components/chart/chart-loader.js +65 -18
- package/dist/components/chart/chart.d.ts +55 -12
- package/dist/components/chart/chart.js +247 -49
- package/dist/components/chart/doughnut-chart.js +2 -18
- package/dist/components/chart/histogram-bin.d.ts +7 -1
- package/dist/components/chart/histogram-bin.js +32 -14
- package/dist/components/chart/histogram.js +8 -16
- package/dist/components/chart/line-chart.js +2 -18
- package/dist/components/chart/lite-chart.d.ts +134 -3
- package/dist/components/chart/lite-chart.js +382 -67
- package/dist/components/chart/lite-chart.styles.js +9 -0
- package/dist/components/chart/pie-chart.js +2 -18
- package/dist/components/chart/polar-area-chart.js +2 -18
- package/dist/components/chart/radar-chart.js +2 -18
- package/dist/components/chart/scatter-chart.js +2 -18
- package/dist/components/chat-composer/chat-composer.d.ts +133 -0
- package/dist/components/chat-composer/chat-composer.js +366 -0
- package/dist/components/chat-composer/chat-composer.styles.d.ts +1 -0
- package/dist/components/chat-composer/chat-composer.styles.js +145 -0
- package/dist/components/chat-message/chat-message.d.ts +141 -0
- package/dist/components/chat-message/chat-message.js +331 -0
- package/dist/components/chat-message/chat-message.styles.d.ts +1 -0
- package/dist/components/chat-message/chat-message.styles.js +203 -0
- package/dist/components/checkbox/checkbox.d.ts +117 -0
- package/dist/components/checkbox/checkbox.js +353 -0
- package/dist/components/checkbox/checkbox.styles.d.ts +1 -0
- package/dist/components/checkbox/checkbox.styles.js +77 -0
- package/dist/components/chip/chip-group.d.ts +56 -0
- package/dist/components/chip/chip-group.js +130 -0
- package/dist/components/chip/chip-group.styles.d.ts +1 -0
- package/dist/components/chip/chip-group.styles.js +57 -0
- package/dist/components/chip/chip.d.ts +64 -0
- package/dist/components/chip/chip.js +122 -0
- package/dist/components/chip/chip.styles.d.ts +1 -0
- package/dist/components/chip/chip.styles.js +115 -0
- package/dist/components/citation-badge/citation-badge.d.ts +113 -0
- package/dist/components/citation-badge/citation-badge.js +318 -0
- package/dist/components/citation-badge/citation-badge.styles.d.ts +1 -0
- package/dist/components/citation-badge/citation-badge.styles.js +96 -0
- package/dist/components/code-block/code-block.d.ts +127 -0
- package/dist/components/code-block/code-block.js +382 -0
- package/dist/components/code-block/code-block.styles.d.ts +1 -0
- package/dist/components/code-block/code-block.styles.js +187 -0
- package/dist/components/code-block/code-loader.d.ts +87 -0
- package/dist/components/code-block/code-loader.js +142 -0
- package/dist/components/combobox/combobox.d.ts +65 -6
- package/dist/components/combobox/combobox.js +258 -48
- package/dist/components/combobox/combobox.styles.js +3 -3
- package/dist/components/combobox/option.d.ts +5 -1
- package/dist/components/combobox/option.js +35 -0
- package/dist/components/context-meter/context-meter.d.ts +53 -0
- package/dist/components/context-meter/context-meter.js +159 -0
- package/dist/components/context-meter/context-meter.styles.d.ts +1 -0
- package/dist/components/context-meter/context-meter.styles.js +114 -0
- package/dist/components/conversation-item/conversation-item.d.ts +125 -0
- package/dist/components/conversation-item/conversation-item.js +331 -0
- package/dist/components/conversation-item/conversation-item.styles.d.ts +1 -0
- package/dist/components/conversation-item/conversation-item.styles.js +155 -0
- package/dist/components/date-picker/calendar-core.d.ts +24 -0
- package/dist/components/date-picker/calendar-core.js +51 -4
- package/dist/components/date-picker/date-input.d.ts +100 -9
- package/dist/components/date-picker/date-input.js +383 -66
- package/dist/components/date-picker/date-picker.d.ts +35 -4
- package/dist/components/date-picker/date-picker.js +171 -44
- package/dist/components/dialog/confirm.d.ts +40 -0
- package/dist/components/dialog/confirm.js +76 -0
- package/dist/components/dialog/dialog.d.ts +129 -0
- package/dist/components/dialog/dialog.js +288 -0
- package/dist/components/dialog/dialog.styles.d.ts +1 -0
- package/dist/components/dialog/dialog.styles.js +96 -0
- package/dist/components/dock-panel/dock-panel.d.ts +142 -0
- package/dist/components/dock-panel/dock-panel.js +359 -0
- package/dist/components/dock-panel/dock-panel.styles.d.ts +1 -0
- package/dist/components/dock-panel/dock-panel.styles.js +159 -0
- package/dist/components/document-preview/document-preview.d.ts +143 -0
- package/dist/components/document-preview/document-preview.js +388 -0
- package/dist/components/document-preview/document-preview.styles.d.ts +1 -0
- package/dist/components/document-preview/document-preview.styles.js +191 -0
- package/dist/components/empty/empty.d.ts +1 -2
- package/dist/components/empty/empty.js +18 -12
- package/dist/components/empty/empty.styles.js +0 -3
- package/dist/components/export-button/csv.js +1 -1
- package/dist/components/export-button/export-button.d.ts +12 -0
- package/dist/components/export-button/export-button.js +35 -5
- package/dist/components/export-button/export-button.styles.js +5 -1
- package/dist/components/file-input/accept.js +2 -0
- package/dist/components/file-input/file-input.d.ts +10 -1
- package/dist/components/file-input/file-input.js +36 -5
- package/dist/components/flag/flag.d.ts +29 -13
- package/dist/components/flag/flag.js +54 -14
- package/dist/components/flag/flag.styles.js +1 -1
- package/dist/components/flag/language-map.d.ts +4 -1
- package/dist/components/flag/language-map.js +6 -3
- package/dist/components/gauge/gauge.d.ts +10 -1
- package/dist/components/gauge/gauge.js +41 -13
- package/dist/components/generation-status/generation-status.d.ts +117 -0
- package/dist/components/generation-status/generation-status.js +327 -0
- package/dist/components/generation-status/generation-status.styles.d.ts +1 -0
- package/dist/components/generation-status/generation-status.styles.js +84 -0
- package/dist/components/graph/graph.d.ts +37 -3
- package/dist/components/graph/graph.js +132 -20
- package/dist/components/heatmap/calendar-grid.d.ts +19 -7
- package/dist/components/heatmap/calendar-grid.js +42 -18
- package/dist/components/heatmap/heatmap-scale.d.ts +11 -1
- package/dist/components/heatmap/heatmap-scale.js +14 -2
- package/dist/components/heatmap/heatmap.d.ts +227 -12
- package/dist/components/heatmap/heatmap.js +488 -93
- package/dist/components/json-viewer/json-viewer.d.ts +70 -0
- package/dist/components/json-viewer/json-viewer.js +361 -0
- package/dist/components/json-viewer/json-viewer.styles.d.ts +1 -0
- package/dist/components/json-viewer/json-viewer.styles.js +177 -0
- package/dist/components/kbd/kbd.d.ts +77 -0
- package/dist/components/kbd/kbd.js +231 -0
- package/dist/components/kbd/kbd.styles.d.ts +1 -0
- package/dist/components/kbd/kbd.styles.js +52 -0
- package/dist/components/live-region/live-region.d.ts +90 -0
- package/dist/components/live-region/live-region.js +189 -0
- package/dist/components/live-region/live-region.styles.d.ts +1 -0
- package/dist/components/live-region/live-region.styles.js +10 -0
- package/dist/components/map/map.d.ts +32 -7
- package/dist/components/map/map.js +133 -32
- package/dist/components/markdown/markdown-loader.d.ts +58 -0
- package/dist/components/markdown/markdown-loader.js +77 -0
- package/dist/components/markdown/markdown.d.ts +119 -0
- package/dist/components/markdown/markdown.js +389 -0
- package/dist/components/markdown/markdown.styles.d.ts +1 -0
- package/dist/components/markdown/markdown.styles.js +88 -0
- package/dist/components/media-card/media-card.d.ts +130 -0
- package/dist/components/media-card/media-card.js +273 -0
- package/dist/components/media-card/media-card.styles.d.ts +1 -0
- package/dist/components/media-card/media-card.styles.js +132 -0
- package/dist/components/mention-popover/mention-popover.d.ts +203 -0
- package/dist/components/mention-popover/mention-popover.js +493 -0
- package/dist/components/mention-popover/mention-popover.styles.d.ts +1 -0
- package/dist/components/mention-popover/mention-popover.styles.js +101 -0
- package/dist/components/menu/menu-item.d.ts +91 -0
- package/dist/components/menu/menu-item.js +206 -0
- package/dist/components/menu/menu-item.styles.d.ts +1 -0
- package/dist/components/menu/menu-item.styles.js +75 -0
- package/dist/components/menu/menu.d.ts +167 -0
- package/dist/components/menu/menu.js +461 -0
- package/dist/components/menu/menu.styles.d.ts +1 -0
- package/dist/components/menu/menu.styles.js +67 -0
- package/dist/components/model-select/model-select.d.ts +170 -0
- package/dist/components/model-select/model-select.js +588 -0
- package/dist/components/model-select/model-select.styles.d.ts +1 -0
- package/dist/components/model-select/model-select.styles.js +203 -0
- package/dist/components/model-settings-panel/model-settings-panel.d.ts +93 -0
- package/dist/components/model-settings-panel/model-settings-panel.js +209 -0
- package/dist/components/model-settings-panel/model-settings-panel.styles.d.ts +1 -0
- package/dist/components/model-settings-panel/model-settings-panel.styles.js +82 -0
- package/dist/components/playback/playback.d.ts +19 -3
- package/dist/components/playback/playback.js +109 -33
- package/dist/components/playback/playback.styles.js +6 -1
- package/dist/components/responsive-panel/responsive-panel.d.ts +163 -0
- package/dist/components/responsive-panel/responsive-panel.js +363 -0
- package/dist/components/responsive-panel/responsive-panel.styles.d.ts +1 -0
- package/dist/components/responsive-panel/responsive-panel.styles.js +103 -0
- package/dist/components/result-card/result-card.d.ts +50 -0
- package/dist/components/result-card/result-card.js +89 -0
- package/dist/components/result-card/result-card.styles.d.ts +1 -0
- package/dist/components/result-card/result-card.styles.js +49 -0
- package/dist/components/result-card/result-field.d.ts +36 -0
- package/dist/components/result-card/result-field.js +87 -0
- package/dist/components/result-card/result-field.styles.d.ts +1 -0
- package/dist/components/result-card/result-field.styles.js +32 -0
- package/dist/components/select/select.d.ts +84 -4
- package/dist/components/select/select.js +251 -36
- package/dist/components/skeleton/skeleton.d.ts +3 -0
- package/dist/components/skeleton/skeleton.js +7 -1
- package/dist/components/skeleton/skeleton.styles.js +5 -4
- package/dist/components/slider/slider.d.ts +141 -0
- package/dist/components/slider/slider.js +467 -0
- package/dist/components/slider/slider.styles.d.ts +1 -0
- package/dist/components/slider/slider.styles.js +87 -0
- package/dist/components/source-card/source-card.d.ts +104 -0
- package/dist/components/source-card/source-card.js +195 -0
- package/dist/components/source-card/source-card.styles.d.ts +1 -0
- package/dist/components/source-card/source-card.styles.js +69 -0
- package/dist/components/source-list/source-list.d.ts +63 -0
- package/dist/components/source-list/source-list.js +130 -0
- package/dist/components/source-list/source-list.styles.d.ts +1 -0
- package/dist/components/source-list/source-list.styles.js +59 -0
- package/dist/components/sparkline/sparkline.js +58 -20
- package/dist/components/split/split.d.ts +224 -5
- package/dist/components/split/split.js +617 -43
- package/dist/components/split/split.styles.js +47 -0
- package/dist/components/stat/stat.d.ts +15 -4
- package/dist/components/stat/stat.js +53 -12
- package/dist/components/stream-status/stream-status.d.ts +126 -0
- package/dist/components/stream-status/stream-status.js +292 -0
- package/dist/components/stream-status/stream-status.styles.d.ts +1 -0
- package/dist/components/stream-status/stream-status.styles.js +103 -0
- package/dist/components/streaming-text/streaming-text.d.ts +104 -0
- package/dist/components/streaming-text/streaming-text.js +224 -0
- package/dist/components/streaming-text/streaming-text.styles.d.ts +1 -0
- package/dist/components/streaming-text/streaming-text.styles.js +63 -0
- package/dist/components/switch/switch.d.ts +103 -0
- package/dist/components/switch/switch.js +250 -0
- package/dist/components/switch/switch.styles.d.ts +1 -0
- package/dist/components/switch/switch.styles.js +75 -0
- package/dist/components/table/table.d.ts +89 -5
- package/dist/components/table/table.js +243 -26
- package/dist/components/table/table.styles.js +6 -1
- package/dist/components/tabs/tabs.d.ts +74 -0
- package/dist/components/tabs/tabs.js +254 -0
- package/dist/components/tabs/tabs.styles.d.ts +1 -0
- package/dist/components/tabs/tabs.styles.js +74 -0
- package/dist/components/thinking-panel/thinking-panel.d.ts +123 -0
- package/dist/components/thinking-panel/thinking-panel.js +260 -0
- package/dist/components/thinking-panel/thinking-panel.styles.d.ts +1 -0
- package/dist/components/thinking-panel/thinking-panel.styles.js +123 -0
- package/dist/components/time-range/time-range.d.ts +59 -2
- package/dist/components/time-range/time-range.js +163 -67
- package/dist/components/toast/toast-item.d.ts +12 -2
- package/dist/components/toast/toast-item.js +106 -44
- package/dist/components/toast/toast-item.styles.js +59 -28
- package/dist/components/toast/toast.js +17 -5
- package/dist/components/toast/toaster.js +10 -1
- package/dist/components/tool-approval-dialog/tool-approval-dialog.d.ts +131 -0
- package/dist/components/tool-approval-dialog/tool-approval-dialog.js +329 -0
- package/dist/components/tool-approval-dialog/tool-approval-dialog.styles.d.ts +1 -0
- package/dist/components/tool-approval-dialog/tool-approval-dialog.styles.js +160 -0
- package/dist/components/tool-call-chip/tool-call-chip.d.ts +105 -0
- package/dist/components/tool-call-chip/tool-call-chip.js +349 -0
- package/dist/components/tool-call-chip/tool-call-chip.styles.d.ts +1 -0
- package/dist/components/tool-call-chip/tool-call-chip.styles.js +203 -0
- package/dist/components/tool-param-form/tool-param-form.d.ts +206 -0
- package/dist/components/tool-param-form/tool-param-form.js +610 -0
- package/dist/components/tool-param-form/tool-param-form.styles.d.ts +1 -0
- package/dist/components/tool-param-form/tool-param-form.styles.js +75 -0
- package/dist/components/tool-result-dialog/tool-result-dialog.d.ts +122 -0
- package/dist/components/tool-result-dialog/tool-result-dialog.js +358 -0
- package/dist/components/tool-result-dialog/tool-result-dialog.styles.d.ts +1 -0
- package/dist/components/tool-result-dialog/tool-result-dialog.styles.js +176 -0
- package/dist/components/tool-result-view/registry.d.ts +73 -0
- package/dist/components/tool-result-view/registry.js +89 -0
- package/dist/components/tool-result-view/tool-result-view.d.ts +58 -0
- package/dist/components/tool-result-view/tool-result-view.js +152 -0
- package/dist/components/tool-result-view/tool-result-view.styles.d.ts +1 -0
- package/dist/components/tool-result-view/tool-result-view.styles.js +13 -0
- package/dist/components/tool-select-dialog/tool-select-dialog.d.ts +151 -0
- package/dist/components/tool-select-dialog/tool-select-dialog.js +350 -0
- package/dist/components/tool-select-dialog/tool-select-dialog.styles.d.ts +1 -0
- package/dist/components/tool-select-dialog/tool-select-dialog.styles.js +191 -0
- package/dist/components/tree/tree-node.d.ts +15 -3
- package/dist/components/tree/tree-node.js +20 -7
- package/dist/components/tree/tree.d.ts +25 -10
- package/dist/components/tree/tree.js +39 -31
- package/dist/components/typing-indicator/typing-indicator.d.ts +70 -0
- package/dist/components/typing-indicator/typing-indicator.js +108 -0
- package/dist/components/typing-indicator/typing-indicator.styles.d.ts +1 -0
- package/dist/components/typing-indicator/typing-indicator.styles.js +132 -0
- package/dist/components/virtual-list/virtual-list.d.ts +210 -0
- package/dist/components/virtual-list/virtual-list.js +607 -0
- package/dist/components/virtual-list/virtual-list.styles.d.ts +1 -0
- package/dist/components/virtual-list/virtual-list.styles.js +56 -0
- package/dist/components/widget/widget.d.ts +5 -4
- package/dist/components/widget/widget.js +54 -120
- package/dist/components/widget/widget.styles.js +8 -2
- package/dist/components/word-cloud/word-cloud-layout.d.ts +7 -0
- package/dist/components/word-cloud/word-cloud-layout.js +29 -2
- package/dist/components/word-cloud/word-cloud.d.ts +28 -2
- package/dist/components/word-cloud/word-cloud.js +69 -19
- package/dist/components/word-cloud/word-cloud.styles.js +16 -3
- package/dist/internal/anchored-validity.d.ts +1 -0
- package/dist/internal/anchored-validity.js +86 -0
- package/dist/internal/announcer.d.ts +57 -0
- package/dist/internal/announcer.js +71 -0
- package/dist/internal/form-associated.d.ts +8 -0
- package/dist/internal/form-associated.js +98 -15
- package/dist/internal/group-by-recency.d.ts +50 -0
- package/dist/internal/group-by-recency.js +80 -0
- package/dist/internal/numbers.d.ts +12 -0
- package/dist/internal/numbers.js +26 -0
- package/dist/internal/overlay-manager.d.ts +51 -0
- package/dist/internal/overlay-manager.js +523 -0
- package/dist/internal/positioner.js +27 -3
- package/dist/internal/rtl.d.ts +23 -0
- package/dist/internal/rtl.js +28 -0
- package/dist/internal/safe-url.d.ts +12 -0
- package/dist/internal/safe-url.js +41 -0
- package/dist/internal/scroll-lock.d.ts +10 -5
- package/dist/internal/scroll-lock.js +30 -14
- package/dist/internal/tokens.styles.js +22 -10
- package/dist/lyra.d.ts +133 -31
- package/dist/lyra.js +96 -26
- package/llms-full.txt +4546 -183
- package/llms.txt +21 -5
- package/package.json +41 -6
- package/dist/components/chart/bar-chart.stories.d.ts +0 -5
- package/dist/components/chart/bar-chart.stories.js +0 -20
- package/dist/components/chart/box-plot.stories.d.ts +0 -5
- package/dist/components/chart/box-plot.stories.js +0 -29
- package/dist/components/chart/bubble-chart.stories.d.ts +0 -5
- package/dist/components/chart/bubble-chart.stories.js +0 -26
- package/dist/components/chart/chart.stories.d.ts +0 -32
- package/dist/components/chart/chart.stories.js +0 -141
- package/dist/components/chart/doughnut-chart.stories.d.ts +0 -5
- package/dist/components/chart/doughnut-chart.stories.js +0 -26
- package/dist/components/chart/histogram.stories.d.ts +0 -5
- package/dist/components/chart/histogram.stories.js +0 -17
- package/dist/components/chart/line-chart.stories.d.ts +0 -22
- package/dist/components/chart/line-chart.stories.js +0 -99
- package/dist/components/chart/lite-chart.stories.d.ts +0 -14
- package/dist/components/chart/lite-chart.stories.js +0 -114
- package/dist/components/chart/pie-chart.stories.d.ts +0 -5
- package/dist/components/chart/pie-chart.stories.js +0 -26
- package/dist/components/chart/polar-area-chart.stories.d.ts +0 -5
- package/dist/components/chart/polar-area-chart.stories.js +0 -20
- package/dist/components/chart/radar-chart.stories.d.ts +0 -5
- package/dist/components/chart/radar-chart.stories.js +0 -20
- package/dist/components/chart/scatter-chart.stories.d.ts +0 -5
- package/dist/components/chart/scatter-chart.stories.js +0 -31
- package/dist/components/combobox/combobox.stories.d.ts +0 -24
- package/dist/components/combobox/combobox.stories.js +0 -102
- package/dist/components/date-picker/date-input.stories.d.ts +0 -10
- package/dist/components/date-picker/date-input.stories.js +0 -48
- package/dist/components/date-picker/date-picker.stories.d.ts +0 -10
- package/dist/components/date-picker/date-picker.stories.js +0 -25
- package/dist/components/empty/empty.stories.d.ts +0 -7
- package/dist/components/empty/empty.stories.js +0 -34
- package/dist/components/export-button/export-button.stories.d.ts +0 -7
- package/dist/components/export-button/export-button.stories.js +0 -37
- package/dist/components/file-input/file-input.stories.d.ts +0 -7
- package/dist/components/file-input/file-input.stories.js +0 -19
- package/dist/components/flag/flag.stories.d.ts +0 -6
- package/dist/components/flag/flag.stories.js +0 -31
- package/dist/components/gauge/gauge.stories.d.ts +0 -8
- package/dist/components/gauge/gauge.stories.js +0 -19
- package/dist/components/graph/graph.stories.d.ts +0 -8
- package/dist/components/graph/graph.stories.js +0 -68
- package/dist/components/heatmap/heatmap.stories.d.ts +0 -27
- package/dist/components/heatmap/heatmap.stories.js +0 -179
- package/dist/components/map/map.stories.d.ts +0 -15
- package/dist/components/map/map.stories.js +0 -135
- package/dist/components/playback/playback.stories.d.ts +0 -7
- package/dist/components/playback/playback.stories.js +0 -16
- package/dist/components/select/select.stories.d.ts +0 -21
- package/dist/components/select/select.stories.js +0 -91
- package/dist/components/skeleton/skeleton.stories.d.ts +0 -5
- package/dist/components/skeleton/skeleton.stories.js +0 -16
- package/dist/components/sparkline/sparkline.stories.d.ts +0 -11
- package/dist/components/sparkline/sparkline.stories.js +0 -39
- package/dist/components/split/split.stories.d.ts +0 -7
- package/dist/components/split/split.stories.js +0 -36
- package/dist/components/stat/stat.stories.d.ts +0 -9
- package/dist/components/stat/stat.stories.js +0 -81
- package/dist/components/table/table.stories.d.ts +0 -12
- package/dist/components/table/table.stories.js +0 -67
- package/dist/components/time-range/time-range.stories.d.ts +0 -8
- package/dist/components/time-range/time-range.stories.js +0 -26
- package/dist/components/toast/toast.stories.d.ts +0 -8
- package/dist/components/toast/toast.stories.js +0 -72
- package/dist/components/tree/tree.stories.d.ts +0 -9
- package/dist/components/tree/tree.stories.js +0 -52
- package/dist/components/widget/widget.stories.d.ts +0 -9
- package/dist/components/widget/widget.stories.js +0 -74
- package/dist/components/word-cloud/word-cloud.stories.d.ts +0 -10
- package/dist/components/word-cloud/word-cloud.stories.js +0 -55
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { html, nothing } from 'lit';
|
|
8
|
+
import { property, state } from 'lit/decorators.js';
|
|
9
|
+
import { repeat } from 'lit/directives/repeat.js';
|
|
10
|
+
import { LyraElement } from '../../internal/lyra-element.js';
|
|
11
|
+
import { defineElement } from '../../internal/prefix.js';
|
|
12
|
+
import { isRtl } from '../../internal/rtl.js';
|
|
13
|
+
import { nextId } from '../../internal/a11y.js';
|
|
14
|
+
import { styles } from './tabs.styles.js';
|
|
15
|
+
/**
|
|
16
|
+
* `<lyra-tabs>` — a tab strip whose panels are direct light-DOM children,
|
|
17
|
+
* each carrying `slot="<id>"` (the panel's stable id) and `label="<text>"`
|
|
18
|
+
* (the tab button's text). One named `<slot>` is rendered per distinct
|
|
19
|
+
* `slot` name found among the current children — a child with no `label`,
|
|
20
|
+
* or a name with no matching child, simply never produces a tab.
|
|
21
|
+
*
|
|
22
|
+
* A tab button's *visible* content can carry a leading icon without ever
|
|
23
|
+
* changing its *accessible name* (which always stays exactly `label`'s
|
|
24
|
+
* text, nothing else): give a tab an extra direct-child sibling of
|
|
25
|
+
* `<lyra-tabs>` carrying `slot="<id>-icon"` (that sibling's own content --
|
|
26
|
+
* an inline SVG, an emoji span, a custom icon element, anything -- is
|
|
27
|
+
* entirely up to the consumer). It's rendered ahead of the label inside
|
|
28
|
+
* that tab's button, wrapped in an `aria-hidden="true"` part so it's
|
|
29
|
+
* excluded from accessible-name computation no matter what it contains. A
|
|
30
|
+
* tab with no matching `<id>-icon` sibling renders no icon wrapper at all,
|
|
31
|
+
* so existing text-only tabs are completely unaffected. (A named slot,
|
|
32
|
+
* rather than a second attribute holding an icon-name lookup, was chosen
|
|
33
|
+
* because this library's `internal/icons.ts` is a small closed set of
|
|
34
|
+
* chrome glyphs for this library's *own* components, not a public
|
|
35
|
+
* name-keyed registry -- a slot lets a consumer supply an arbitrary,
|
|
36
|
+
* domain-specific icon instead of being limited to that internal set.)
|
|
37
|
+
*
|
|
38
|
+
* Implements the WAI-ARIA APG tabs pattern with automatic activation:
|
|
39
|
+
* Left/Right (swapped under RTL) move focus *and* selection together,
|
|
40
|
+
* Home/End jump to the first/last enabled tab, and a roving `tabindex`
|
|
41
|
+
* follows whichever tab is currently selected.
|
|
42
|
+
*
|
|
43
|
+
* @customElement lyra-tabs
|
|
44
|
+
* @slot - Direct children with `slot="<id>" label="<text>"` (and optionally `disabled`); one becomes each tab's panel.
|
|
45
|
+
* @slot <id>-icon - Optional sibling direct child supplying a tab's leading icon content; excluded from the tab button's accessible name.
|
|
46
|
+
* @event lyra-tabs-change - `detail: { tabId }`, fired when the active tab changes via click or keyboard.
|
|
47
|
+
* @csspart base - The root wrapper around the tablist and panels.
|
|
48
|
+
* @csspart tablist - The `role="tablist"` row of tab buttons.
|
|
49
|
+
* @csspart tab - A single tab button.
|
|
50
|
+
* @csspart tab-icon - The optional leading-icon wrapper inside a tab button; only rendered when that tab has a matching `<id>-icon` sibling.
|
|
51
|
+
* @csspart panel - A single `role="tabpanel"` wrapper (one per tab, hidden unless active).
|
|
52
|
+
*/
|
|
53
|
+
export class LyraTabs extends LyraElement {
|
|
54
|
+
constructor() {
|
|
55
|
+
super(...arguments);
|
|
56
|
+
/** The active tab's `slot`/id. Falls back to the first enabled tab whenever the current value doesn't resolve to one. */
|
|
57
|
+
this.active = '';
|
|
58
|
+
this.tabs = [];
|
|
59
|
+
this.baseId = nextId('tabs');
|
|
60
|
+
this.nextOpaqueId = 0;
|
|
61
|
+
this.idsBySlot = new Map();
|
|
62
|
+
/** Rebuilds `tabs` from the current direct children. First child wins when two share a `slot` name (matches native slot assignment: both would render into the one panel, but only one label can back the button). */
|
|
63
|
+
this.syncTabs = () => {
|
|
64
|
+
const seen = new Set();
|
|
65
|
+
const next = [];
|
|
66
|
+
const children = Array.from(this.children);
|
|
67
|
+
for (const child of children) {
|
|
68
|
+
const slotName = child.getAttribute('slot');
|
|
69
|
+
const label = child.getAttribute('label');
|
|
70
|
+
if (!slotName || !label || seen.has(slotName))
|
|
71
|
+
continue;
|
|
72
|
+
seen.add(slotName);
|
|
73
|
+
const iconSlot = this.iconSlotName(slotName);
|
|
74
|
+
const hasIcon = children.some((c) => c.getAttribute('slot') === iconSlot);
|
|
75
|
+
next.push({ slotName, label, disabled: child.hasAttribute('disabled'), hasIcon });
|
|
76
|
+
}
|
|
77
|
+
const liveSlots = new Set(next.map((tab) => tab.slotName));
|
|
78
|
+
for (const slotName of this.idsBySlot.keys()) {
|
|
79
|
+
if (!liveSlots.has(slotName))
|
|
80
|
+
this.idsBySlot.delete(slotName);
|
|
81
|
+
}
|
|
82
|
+
this.tabs = next;
|
|
83
|
+
};
|
|
84
|
+
this.onTabListKeyDown = (e) => {
|
|
85
|
+
const navigable = this.tabs.filter((t) => !t.disabled);
|
|
86
|
+
if (navigable.length === 0)
|
|
87
|
+
return;
|
|
88
|
+
const currentIndex = navigable.findIndex((t) => t.slotName === this.active);
|
|
89
|
+
// Horizontal strip -- Up/Down aren't used. Left/Right swap under RTL,
|
|
90
|
+
// matching lyra-split/lyra-tree's physical-direction handling.
|
|
91
|
+
const rtl = isRtl(this);
|
|
92
|
+
const forwardKey = rtl ? 'ArrowLeft' : 'ArrowRight';
|
|
93
|
+
const backwardKey = rtl ? 'ArrowRight' : 'ArrowLeft';
|
|
94
|
+
let targetIndex;
|
|
95
|
+
switch (e.key) {
|
|
96
|
+
case forwardKey:
|
|
97
|
+
targetIndex = currentIndex < 0 ? 0 : (currentIndex + 1) % navigable.length;
|
|
98
|
+
break;
|
|
99
|
+
case backwardKey:
|
|
100
|
+
targetIndex = currentIndex < 0 ? navigable.length - 1 : (currentIndex - 1 + navigable.length) % navigable.length;
|
|
101
|
+
break;
|
|
102
|
+
case 'Home':
|
|
103
|
+
targetIndex = 0;
|
|
104
|
+
break;
|
|
105
|
+
case 'End':
|
|
106
|
+
targetIndex = navigable.length - 1;
|
|
107
|
+
break;
|
|
108
|
+
default:
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
e.preventDefault();
|
|
112
|
+
const target = navigable[targetIndex];
|
|
113
|
+
this.selectTab(target);
|
|
114
|
+
this.focusTab(target.slotName);
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
static { this.styles = [LyraElement.styles, styles]; }
|
|
118
|
+
connectedCallback() {
|
|
119
|
+
super.connectedCallback();
|
|
120
|
+
this.syncTabs();
|
|
121
|
+
// Each child carries its own individual `slot` attribute (one named slot
|
|
122
|
+
// per tab, unlike lyra-split's single default-slot-of-many-panels) -- a
|
|
123
|
+
// brand-new tab's name has no matching `<slot>` to fire `slotchange` on
|
|
124
|
+
// until *this* component has already rendered one for it, and neither
|
|
125
|
+
// `slotchange` nor any Lit lifecycle hook observes a plain attribute
|
|
126
|
+
// edit (label/disabled) on a light-DOM child at all. A mutation observer
|
|
127
|
+
// on the host is the only thing that sees either case. `attributes: true`
|
|
128
|
+
// alone only reports mutations on the observed node itself (`this`), never
|
|
129
|
+
// on its children, so `subtree: true` is required too -- but that widens
|
|
130
|
+
// `childList`/`attributeFilter` to the *entire* descendant tree, including
|
|
131
|
+
// each panel's own projected content. A panel can legitimately churn its
|
|
132
|
+
// own children/attributes fast (a streaming log, a live JSON preview), so
|
|
133
|
+
// every record is filtered down to direct-child mutations only before
|
|
134
|
+
// triggering a resync, keeping panel-internal churn from forcing a tabs
|
|
135
|
+
// recompute and re-render on every unrelated mutation.
|
|
136
|
+
this.mutationObserver = new MutationObserver((records) => {
|
|
137
|
+
const isDirectChild = (node) => node.parentNode === this;
|
|
138
|
+
const relevant = records.some((r) => (r.type === 'childList' ? r.target === this : isDirectChild(r.target)));
|
|
139
|
+
if (relevant)
|
|
140
|
+
this.syncTabs();
|
|
141
|
+
});
|
|
142
|
+
this.mutationObserver.observe(this, {
|
|
143
|
+
childList: true,
|
|
144
|
+
subtree: true,
|
|
145
|
+
attributes: true,
|
|
146
|
+
attributeFilter: ['slot', 'label', 'disabled'],
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
disconnectedCallback() {
|
|
150
|
+
super.disconnectedCallback();
|
|
151
|
+
this.mutationObserver?.disconnect();
|
|
152
|
+
this.mutationObserver = undefined;
|
|
153
|
+
}
|
|
154
|
+
/** Keeps `active` resolved to a real, enabled tab -- covers the initial default, a tab disappearing/becoming disabled underneath the current selection, and a consumer assigning `.active` directly. Silent (no `lyra-tabs-change`): this corrects *invalid* state rather than responding to a user picking a different tab. */
|
|
155
|
+
willUpdate(changed) {
|
|
156
|
+
if (!changed.has('tabs') && !changed.has('active'))
|
|
157
|
+
return;
|
|
158
|
+
const current = this.tabs.find((t) => t.slotName === this.active);
|
|
159
|
+
if (current && !current.disabled)
|
|
160
|
+
return;
|
|
161
|
+
this.active = this.tabs.find((t) => !t.disabled)?.slotName ?? '';
|
|
162
|
+
}
|
|
163
|
+
/** Activates `tab` (no-op for a disabled tab or one that's already active) and emits `lyra-tabs-change`. */
|
|
164
|
+
selectTab(tab) {
|
|
165
|
+
if (tab.disabled || tab.slotName === this.active)
|
|
166
|
+
return;
|
|
167
|
+
this.active = tab.slotName;
|
|
168
|
+
this.emit('lyra-tabs-change', { tabId: tab.slotName });
|
|
169
|
+
}
|
|
170
|
+
/** Moves real DOM focus to tab `slotName`'s button. Safe to call immediately (no `updateComplete` wait): every tab button already exists in the DOM regardless of its current `tabindex`, and `tabindex="-1"` elements are still focusable via script. */
|
|
171
|
+
focusTab(slotName) {
|
|
172
|
+
const buttons = this.renderRoot.querySelectorAll('[part="tab"]');
|
|
173
|
+
for (const button of Array.from(buttons)) {
|
|
174
|
+
if (button.dataset.slot === slotName) {
|
|
175
|
+
button.focus();
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
tabId(slotName) {
|
|
181
|
+
return this.idsFor(slotName).tab;
|
|
182
|
+
}
|
|
183
|
+
panelId(slotName) {
|
|
184
|
+
return this.idsFor(slotName).panel;
|
|
185
|
+
}
|
|
186
|
+
idsFor(slotName) {
|
|
187
|
+
const existing = this.idsBySlot.get(slotName);
|
|
188
|
+
if (existing)
|
|
189
|
+
return existing;
|
|
190
|
+
const token = `${this.baseId}-${this.nextOpaqueId++}`;
|
|
191
|
+
const ids = { tab: `${token}-tab`, panel: `${token}-panel` };
|
|
192
|
+
this.idsBySlot.set(slotName, ids);
|
|
193
|
+
return ids;
|
|
194
|
+
}
|
|
195
|
+
/** Derives a tab's optional icon-sibling `slot` name from its own `slotName` -- see the class doc. */
|
|
196
|
+
iconSlotName(slotName) {
|
|
197
|
+
return `${slotName}-icon`;
|
|
198
|
+
}
|
|
199
|
+
renderTab(tab) {
|
|
200
|
+
const selected = tab.slotName === this.active;
|
|
201
|
+
return html `<button
|
|
202
|
+
type="button"
|
|
203
|
+
part="tab"
|
|
204
|
+
id=${this.tabId(tab.slotName)}
|
|
205
|
+
data-slot=${tab.slotName}
|
|
206
|
+
role="tab"
|
|
207
|
+
aria-selected=${selected ? 'true' : 'false'}
|
|
208
|
+
aria-disabled=${tab.disabled ? 'true' : 'false'}
|
|
209
|
+
aria-controls=${this.panelId(tab.slotName)}
|
|
210
|
+
tabindex=${selected ? '0' : '-1'}
|
|
211
|
+
@click=${() => this.selectTab(tab)}
|
|
212
|
+
>${tab.hasIcon
|
|
213
|
+
? html `<span part="tab-icon" aria-hidden="true"><slot name=${this.iconSlotName(tab.slotName)}></slot></span>`
|
|
214
|
+
: nothing}${tab.label}</button>`;
|
|
215
|
+
}
|
|
216
|
+
renderPanel(tab) {
|
|
217
|
+
const selected = tab.slotName === this.active;
|
|
218
|
+
return html `<div
|
|
219
|
+
part="panel"
|
|
220
|
+
id=${this.panelId(tab.slotName)}
|
|
221
|
+
role="tabpanel"
|
|
222
|
+
aria-labelledby=${this.tabId(tab.slotName)}
|
|
223
|
+
tabindex="0"
|
|
224
|
+
?hidden=${!selected}
|
|
225
|
+
>
|
|
226
|
+
<slot name=${tab.slotName}></slot>
|
|
227
|
+
</div>`;
|
|
228
|
+
}
|
|
229
|
+
render() {
|
|
230
|
+
// Keyed by `slotName`, not a plain `.map()`: a plain array binding reuses
|
|
231
|
+
// each rendered DOM node by *position*, so removing e.g. the first tab
|
|
232
|
+
// would silently relabel the still-focused second button's DOM node into
|
|
233
|
+
// the (unfocused) third tab's button, leaving real keyboard focus stuck
|
|
234
|
+
// on a tabindex="-1"/aria-selected="false" button instead of following
|
|
235
|
+
// the tab it used to represent. Keying by identity keeps each tab's own
|
|
236
|
+
// DOM node (and any focus on it) attached to that same tab across
|
|
237
|
+
// additions/removals anywhere in the list.
|
|
238
|
+
return html `
|
|
239
|
+
<div part="base">
|
|
240
|
+
<div part="tablist" role="tablist" aria-orientation="horizontal" @keydown=${this.onTabListKeyDown}>
|
|
241
|
+
${repeat(this.tabs, (tab) => tab.slotName, (tab) => this.renderTab(tab))}
|
|
242
|
+
</div>
|
|
243
|
+
${repeat(this.tabs, (tab) => tab.slotName, (tab) => this.renderPanel(tab))}
|
|
244
|
+
</div>
|
|
245
|
+
`;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
__decorate([
|
|
249
|
+
property({ reflect: true })
|
|
250
|
+
], LyraTabs.prototype, "active", void 0);
|
|
251
|
+
__decorate([
|
|
252
|
+
state()
|
|
253
|
+
], LyraTabs.prototype, "tabs", void 0);
|
|
254
|
+
defineElement('tabs', LyraTabs);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const styles: import("lit").CSSResult;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { css } from 'lit';
|
|
2
|
+
export const styles = css `
|
|
3
|
+
:host {
|
|
4
|
+
display: block;
|
|
5
|
+
}
|
|
6
|
+
[part='base'] {
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
gap: var(--lyra-space-s);
|
|
10
|
+
}
|
|
11
|
+
[part='tablist'] {
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: stretch;
|
|
14
|
+
gap: var(--lyra-space-m);
|
|
15
|
+
border-block-end: 1px solid var(--lyra-color-border);
|
|
16
|
+
overflow-x: auto;
|
|
17
|
+
}
|
|
18
|
+
[part='tab'] {
|
|
19
|
+
appearance: none;
|
|
20
|
+
background: none;
|
|
21
|
+
border: none;
|
|
22
|
+
/* Sits directly over the tablist's own border-block-end so the accent
|
|
23
|
+
underline below replaces it, pixel for pixel, when selected. */
|
|
24
|
+
border-block-end: 2px solid transparent;
|
|
25
|
+
margin-block-end: -1px;
|
|
26
|
+
padding: var(--lyra-space-s) var(--lyra-space-xs);
|
|
27
|
+
font: inherit;
|
|
28
|
+
font-weight: 500;
|
|
29
|
+
color: var(--lyra-color-text-quiet);
|
|
30
|
+
cursor: pointer;
|
|
31
|
+
white-space: nowrap;
|
|
32
|
+
/* inline-flex only matters once a tab-icon part is also present (gap
|
|
33
|
+
has no effect with a single child) -- a text-only tab lays out
|
|
34
|
+
identically to the previous plain inline-block button. */
|
|
35
|
+
display: inline-flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
gap: var(--lyra-space-xs);
|
|
38
|
+
transition:
|
|
39
|
+
color var(--lyra-transition-fast),
|
|
40
|
+
border-color var(--lyra-transition-fast);
|
|
41
|
+
}
|
|
42
|
+
[part='tab-icon'] {
|
|
43
|
+
display: inline-flex;
|
|
44
|
+
flex: 0 0 auto;
|
|
45
|
+
align-items: center;
|
|
46
|
+
}
|
|
47
|
+
[part='tab']:hover:not([aria-disabled='true']) {
|
|
48
|
+
color: var(--lyra-color-text);
|
|
49
|
+
}
|
|
50
|
+
[part='tab'][aria-selected='true'] {
|
|
51
|
+
color: var(--lyra-color-brand);
|
|
52
|
+
border-block-end-color: var(--lyra-color-brand);
|
|
53
|
+
}
|
|
54
|
+
[part='tab'][aria-disabled='true'] {
|
|
55
|
+
cursor: not-allowed;
|
|
56
|
+
/* No :hover color change and no pointer feedback -- the click handler
|
|
57
|
+
already no-ops on a disabled tab, this just matches it visually. */
|
|
58
|
+
pointer-events: none;
|
|
59
|
+
opacity: var(--lyra-opacity-disabled);
|
|
60
|
+
}
|
|
61
|
+
[part='tab']:focus-visible {
|
|
62
|
+
outline: var(--lyra-focus-ring-width) solid var(--lyra-focus-ring-color);
|
|
63
|
+
outline-offset: calc(var(--lyra-focus-ring-offset) * -1);
|
|
64
|
+
border-radius: var(--lyra-radius);
|
|
65
|
+
}
|
|
66
|
+
[part='panel'] {
|
|
67
|
+
padding-block-start: var(--lyra-space-xs);
|
|
68
|
+
}
|
|
69
|
+
[part='panel']:focus-visible {
|
|
70
|
+
outline: var(--lyra-focus-ring-width) solid var(--lyra-focus-ring-color);
|
|
71
|
+
outline-offset: var(--lyra-focus-ring-offset);
|
|
72
|
+
border-radius: var(--lyra-radius);
|
|
73
|
+
}
|
|
74
|
+
`;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { type TemplateResult, type PropertyValues } from 'lit';
|
|
2
|
+
import { LyraElement } from '../../internal/lyra-element.js';
|
|
3
|
+
export type ThinkingPanelMode = 'live' | 'post-hoc';
|
|
4
|
+
export interface ThinkingPanelToggleDetail {
|
|
5
|
+
expanded: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* `<lyra-thinking-panel>` — a collapsible panel for an AI agent's
|
|
9
|
+
* intermediate reasoning/"thinking" transcript, kept visually and
|
|
10
|
+
* semantically distinct from its final response. Same collapsible
|
|
11
|
+
* header-button-plus-region shape as `<lyra-source-list>`; the default slot
|
|
12
|
+
* is entirely free-form (a consumer-composed `<lyra-streaming-text>`,
|
|
13
|
+
* `<lyra-markdown>`, or plain text) — this component has no dependency on
|
|
14
|
+
* either and imposes no structure on what's slotted.
|
|
15
|
+
*
|
|
16
|
+
* `mode` (`'live'` while reasoning is actively streaming in, `'post-hoc'`
|
|
17
|
+
* once it's complete and being reviewed after the fact) drives two concrete
|
|
18
|
+
* behavior differences, not just a styling hook:
|
|
19
|
+
* - **Header hint.** While `duration-ms` is unset, `'live'` shows a pulsing
|
|
20
|
+
* "Thinking…" placeholder in `[part="duration"]`; `'post-hoc'` shows
|
|
21
|
+
* nothing there instead (a finished review with no known duration has
|
|
22
|
+
* nothing useful to say in that slot). Once `duration-ms` is set, both
|
|
23
|
+
* modes show the same static `"Thought for …"` text — a `'post-hoc'`
|
|
24
|
+
* consumer that captured a duration is free to supply it too.
|
|
25
|
+
* - **Auto-scroll.** Only `'live'` mode auto-follows new content appended to
|
|
26
|
+
* the default slot while `expanded` (see below); `'post-hoc'` never
|
|
27
|
+
* scrolls on its own, since reviewing finished reasoning is expected to
|
|
28
|
+
* start from the top like reading any other completed document. This
|
|
29
|
+
* library otherwise defaults to *not* editorializing about a host's data
|
|
30
|
+
* (see `<lyra-empty>`'s plain-`description` stance), but scroll position
|
|
31
|
+
* is presentation, not data, so this one behavior difference earns its
|
|
32
|
+
* keep rather than being left as a bare visual/semantic hint the host
|
|
33
|
+
* would have to reimplement identically itself.
|
|
34
|
+
*
|
|
35
|
+
* Live-mode auto-scroll ("stick to bottom") is the classic chat-transcript
|
|
36
|
+
* convention: while `mode="live"` and `expanded`, new content keeps the
|
|
37
|
+
* panel scrolled to its latest line — *unless* the user has manually
|
|
38
|
+
* scrolled up to (re-)read earlier content, in which case their position is
|
|
39
|
+
* never yanked away from them. This is tracked continuously via a `scroll`
|
|
40
|
+
* listener on `[part="body"]` (not recomputed from the mutation itself,
|
|
41
|
+
* which necessarily observes the DOM only *after* it has already changed):
|
|
42
|
+
* every user-driven scroll records whether the body was left within
|
|
43
|
+
* `NEAR_BOTTOM_PX` of its own max scroll position, and only a mutation that
|
|
44
|
+
* arrives while that's still true triggers a follow-up scroll-to-bottom.
|
|
45
|
+
* Opening an already-`'live'` panel (or one that later becomes `'live'`)
|
|
46
|
+
* always resets this to "anchored" and jumps to the latest content, the same
|
|
47
|
+
* way a chat app's own transcript does when you re-open it.
|
|
48
|
+
*
|
|
49
|
+
* New content is detected via a `MutationObserver` on this element's own
|
|
50
|
+
* light DOM (`childList`+`subtree`+`characterData`) rather than the default
|
|
51
|
+
* slot's `slotchange` event, because `slotchange` only fires when the set of
|
|
52
|
+
* top-level assigned nodes changes — never for a text node mutating *inside*
|
|
53
|
+
* an already-slotted element, which is the more likely shape for streamed
|
|
54
|
+
* reasoning (a consumer appending chunks to an existing node's `textContent`
|
|
55
|
+
* rather than re-slotting a whole new element per token). The one thing this
|
|
56
|
+
* can't see is a mutation entirely inside a slotted custom element's own
|
|
57
|
+
* shadow root (e.g. a `<lyra-markdown>` re-rendering its shadow tree after a
|
|
58
|
+
* `content` property change) — Shadow DOM encapsulation blocks that by
|
|
59
|
+
* design, and there is no way for this component to reach across that
|
|
60
|
+
* boundary. A slotted element whose *own* internal updates should drive this
|
|
61
|
+
* panel's auto-scroll needs to append/mutate visible light-DOM text itself
|
|
62
|
+
* (as `<lyra-streaming-text>` is expected to), or the host can call this
|
|
63
|
+
* panel's own `scrollToBottom()` directly.
|
|
64
|
+
*
|
|
65
|
+
* `aria-controls` linking the header to the body region uses `nextId()`
|
|
66
|
+
* (`../../internal/a11y.js`) for a collision-safe id, the same convention
|
|
67
|
+
* `<lyra-source-list>` and `<lyra-widget>` already establish for every
|
|
68
|
+
* toggle-controls-region pairing in this library.
|
|
69
|
+
*
|
|
70
|
+
* @customElement lyra-thinking-panel
|
|
71
|
+
* @slot - The reasoning/thinking content.
|
|
72
|
+
* @event lyra-toggle - The header was activated, expanding or collapsing the
|
|
73
|
+
* panel. `detail: { expanded }` — same event name and shape as
|
|
74
|
+
* `<lyra-source-list>`'s own `lyra-toggle`.
|
|
75
|
+
* @csspart base - The outer container.
|
|
76
|
+
* @csspart header - The clickable header (`<button>`) toggling `expanded`.
|
|
77
|
+
* @csspart label - The `label` text.
|
|
78
|
+
* @csspart duration - The formatted duration / "Thinking…" placeholder, when shown.
|
|
79
|
+
* @csspart toggle - The chevron indicator inside the header.
|
|
80
|
+
* @csspart body - The wrapper around the default slot, `hidden` while
|
|
81
|
+
* collapsed. Independently keyboard-focusable (`tabindex="0"`, `role="group"`
|
|
82
|
+
* named from `label`) since it's its own capped-height scrollable region.
|
|
83
|
+
*/
|
|
84
|
+
export declare class LyraThinkingPanel extends LyraElement {
|
|
85
|
+
static styles: import("lit").CSSResultGroup[];
|
|
86
|
+
/** Header text. */
|
|
87
|
+
label: string;
|
|
88
|
+
/** Whether the reasoning transcript is currently shown. Starts collapsed,
|
|
89
|
+
* matching `<lyra-source-list>`'s default -- a consumer running `'live'`
|
|
90
|
+
* reasoning sets this `true` itself to stream it in view as it arrives. */
|
|
91
|
+
expanded: boolean;
|
|
92
|
+
/** `'live'` while reasoning is actively streaming in right now; `'post-hoc'`
|
|
93
|
+
* once it's complete and being reviewed after the fact. See the class doc
|
|
94
|
+
* for the concrete behavior differences this drives. */
|
|
95
|
+
mode: ThinkingPanelMode;
|
|
96
|
+
/** How long the reasoning took, in milliseconds, once known. Omitted
|
|
97
|
+
* entirely (nothing rendered in `'post-hoc'`, a pulsing placeholder in
|
|
98
|
+
* `'live'`) while unset. */
|
|
99
|
+
durationMs?: number;
|
|
100
|
+
private readonly bodyId;
|
|
101
|
+
private contentObserver?;
|
|
102
|
+
private scrollRafId?;
|
|
103
|
+
private stickToBottom;
|
|
104
|
+
connectedCallback(): void;
|
|
105
|
+
disconnectedCallback(): void;
|
|
106
|
+
protected updated(changed: PropertyValues): void;
|
|
107
|
+
/** Scrolls the body to its current bottom immediately (no smooth-scroll
|
|
108
|
+
* animation, deliberately -- see onContentMutated()'s rAF-coalescing
|
|
109
|
+
* comment for why an instant jump reads better than a stack of competing
|
|
110
|
+
* smooth scrolls under a fast token stream). Safe to call directly, e.g.
|
|
111
|
+
* from a host that wants to force a jump-to-latest action of its own. */
|
|
112
|
+
scrollToBottom(): void;
|
|
113
|
+
private onScroll;
|
|
114
|
+
private onContentMutated;
|
|
115
|
+
private toggle;
|
|
116
|
+
private get durationDisplay();
|
|
117
|
+
render(): TemplateResult;
|
|
118
|
+
}
|
|
119
|
+
declare global {
|
|
120
|
+
interface HTMLElementTagNameMap {
|
|
121
|
+
'lyra-thinking-panel': LyraThinkingPanel;
|
|
122
|
+
}
|
|
123
|
+
}
|