@aceshooting/lyra-ui 29.0.2 → 29.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +19 -26
- package/design-tokens.json +1 -1
- package/dist/cli/migrate-wa.mjs +2 -0
- package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +5 -3
- package/dist/components/agent-tools/activity-feed/activity-feed.class.js +4 -3
- package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +1 -1
- package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +21 -5
- package/dist/components/agent-tools/agent-trace/agent-trace.class.js +14 -11
- package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +1 -1
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
- package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +34 -7
- package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +25 -11
- package/dist/components/agent-tools/eval-result/eval-result-source.js +1 -0
- package/dist/components/agent-tools/eval-result/eval-result.class.d.ts +31 -11
- package/dist/components/agent-tools/eval-result/eval-result.class.js +29 -15
- package/dist/components/agent-tools/eval-result/eval-result.styles.js +1 -1
- package/dist/components/agent-tools/eval-result/eval-run-result.d.ts +10 -0
- package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +26 -5
- package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +16 -6
- package/dist/components/agent-tools/span-waterfall/span-waterfall.d.ts +1 -1
- package/dist/components/agent-tools/span-waterfall/span-waterfall.js +1 -1
- package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
- package/dist/components/agent-tools/task-list/task-list.class.d.ts +29 -6
- package/dist/components/agent-tools/task-list/task-list.class.js +13 -7
- package/dist/components/agent-tools/task-list/task-list.d.ts +1 -1
- package/dist/components/agent-tools/task-list/task-list.js +1 -1
- package/dist/components/agent-tools/task-list/task-list.styles.js +1 -1
- package/dist/components/agent-tools/terminal/terminal.class.d.ts +9 -5
- package/dist/components/agent-tools/terminal/terminal.class.js +8 -8
- package/dist/components/agent-tools/test-results/test-results.class.d.ts +16 -4
- package/dist/components/agent-tools/test-results/test-results.class.js +15 -6
- package/dist/components/agent-tools/test-results/test-results.d.ts +1 -0
- package/dist/components/agent-tools/test-results/test-results.js +1 -1
- package/dist/components/agent-tools/test-results/test-results.styles.js +1 -1
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +7 -4
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +2 -1
- package/dist/components/agent-tools/trace-tree/span-projection.js +1 -0
- package/dist/components/agent-tools/trace-tree/span-shared.d.ts +29 -0
- package/dist/components/agent-tools/trace-tree/span-shared.js +1 -0
- package/dist/components/agent-tools/trace-tree/span.d.ts +5 -35
- package/dist/components/agent-tools/trace-tree/span.js +1 -1
- package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts +27 -5
- package/dist/components/agent-tools/trace-tree/trace-tree.class.js +19 -9
- package/dist/components/agent-tools/trace-tree/trace-tree.d.ts +1 -1
- package/dist/components/agent-tools/trace-tree/trace-tree.js +1 -1
- package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
- package/dist/components/charts/chart/bar-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/box-plot.class.d.ts +2 -2
- package/dist/components/charts/chart/box-plot.class.js +3 -3
- package/dist/components/charts/chart/bubble-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/chart-prepared-data.d.ts +9 -0
- package/dist/components/charts/chart/chart-prepared-data.js +1 -0
- package/dist/components/charts/chart/chart-spatial-data.js +2 -0
- package/dist/components/charts/chart/chart-sync.js +1 -1
- package/dist/components/charts/chart/chart-table-sampling.js +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +56 -6
- package/dist/components/charts/chart/chart.class.js +18 -8
- package/dist/components/charts/chart/chart.styles.js +1 -1
- package/dist/components/charts/chart/doughnut-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/histogram-buckets.d.ts +1 -1
- package/dist/components/charts/chart/histogram-buckets.js +1 -1
- package/dist/components/charts/chart/histogram.class.d.ts +19 -4
- package/dist/components/charts/chart/histogram.class.js +1 -1
- package/dist/components/charts/chart/line-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/lite-chart.class.d.ts +51 -11
- package/dist/components/charts/chart/lite-chart.class.js +33 -27
- package/dist/components/charts/chart/lite-chart.styles.js +1 -1
- package/dist/components/charts/chart/pie-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/polar-area-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/radar-chart.class.d.ts +5 -1
- package/dist/components/charts/chart/scatter-chart.class.d.ts +5 -1
- package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +6 -3
- package/dist/components/conversation/agent-workspace/agent-workspace.class.js +6 -5
- package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +1 -1
- package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +8 -0
- package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-base.class.d.ts +5 -3
- package/dist/components/conversation/code-block/code-block-base.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-core.class.d.ts +4 -1
- package/dist/components/conversation/code-block/code-block-core.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-shared.d.ts +6 -4
- package/dist/components/conversation/code-block/code-block-shared.js +3 -2
- package/dist/components/conversation/code-block/code-block.class.d.ts +11 -4
- package/dist/components/conversation/code-block/code-block.class.js +1 -1
- package/dist/components/conversation/code-block/code-block.d.ts +1 -1
- package/dist/components/conversation/code-block/code-block.styles.js +1 -1
- package/dist/components/conversation/code-block/shiki-types.d.ts +2 -0
- package/dist/components/conversation/code-block/shiki-types.js +1 -1
- package/dist/components/conversation/markdown/markdown-base.class.d.ts +6 -4
- package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
- package/dist/components/conversation/markdown/markdown-code-header.d.ts +2 -2
- package/dist/components/conversation/markdown/markdown-code-header.js +1 -1
- package/dist/components/conversation/markdown/markdown-core.class.d.ts +8 -3
- package/dist/components/conversation/markdown/markdown-progressive.js +2 -2
- package/dist/components/conversation/markdown/markdown-shared.d.ts +5 -10
- package/dist/components/conversation/markdown/markdown-shared.js +5 -5
- package/dist/components/conversation/markdown/markdown-streaming-tail.js +1 -1
- package/dist/components/conversation/markdown/markdown.class.d.ts +17 -10
- package/dist/components/conversation/markdown/markdown.class.js +1 -1
- package/dist/components/conversation/markdown/markdown.styles.js +1 -1
- package/dist/components/conversation/model-select/model-select.class.d.ts +4 -3
- package/dist/components/conversation/model-select/model-select.class.js +3 -2
- package/dist/components/conversation/model-select/model-select.styles.js +1 -1
- package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +2 -1
- package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
- package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +1 -1
- package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -2
- package/dist/components/conversation/prompt-input/prompt-input.class.js +2 -1
- package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
- package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +10 -2
- package/dist/components/conversation/prompt-queue/prompt-queue.class.js +15 -6
- package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
- package/dist/components/conversation/realtime-session/realtime-session.class.d.ts +3 -1
- package/dist/components/conversation/realtime-session/realtime-session.class.js +2 -1
- package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
- package/dist/components/conversation/streaming-text/markdown-detection.d.ts +2 -0
- package/dist/components/conversation/streaming-text/markdown-detection.js +4 -1
- package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +6 -2
- package/dist/components/conversation/streaming-text/streaming-text-base.class.js +3 -3
- package/dist/components/conversation/streaming-text/streaming-text-core.class.js +1 -1
- package/dist/components/conversation/streaming-text/streaming-text.class.js +1 -0
- package/dist/components/conversation/thread-list/thread-list.class.d.ts +34 -4
- package/dist/components/conversation/thread-list/thread-list.class.js +22 -15
- package/dist/components/conversation/thread-list/thread-list.d.ts +1 -1
- package/dist/components/conversation/thread-list/thread-list.js +1 -1
- package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
- package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +6 -2
- package/dist/components/conversation/transcript-feed/transcript-feed.class.js +3 -2
- package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
- package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +3 -2
- package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -2
- package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
- package/dist/components/data/calendar/calendar.class.d.ts +5 -2
- package/dist/components/data/calendar/calendar.class.js +1 -1
- package/dist/components/data/data-grid/data-grid-processing.js +2 -2
- package/dist/components/data/data-grid/data-grid.class.d.ts +22 -8
- package/dist/components/data/data-grid/data-grid.class.js +20 -19
- package/dist/components/data/data-grid/data-grid.styles.js +1 -1
- package/dist/components/data/document-library/document-library.class.d.ts +31 -4
- package/dist/components/data/document-library/document-library.class.js +25 -12
- package/dist/components/data/document-library/document-library.styles.js +1 -1
- package/dist/components/data/file-tree/file-tree.class.d.ts +30 -6
- package/dist/components/data/file-tree/file-tree.class.js +4 -3
- package/dist/components/data/file-tree/file-tree.d.ts +1 -0
- package/dist/components/data/file-tree/file-tree.js +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +31 -6
- package/dist/components/data/flow-canvas/flow-canvas.class.js +40 -19
- package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
- package/dist/components/data/flow-canvas/flow-model.js +1 -1
- package/dist/components/data/flow-canvas/flow-source.js +1 -0
- package/dist/components/data/flow-canvas/flow-types.d.ts +4 -2
- package/dist/components/data/flow-canvas/flow-viewport-index.js +1 -0
- package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +9 -3
- package/dist/components/data/flow-minimap/flow-minimap.class.js +11 -2
- package/dist/components/data/flow-minimap/flow-minimap.styles.js +1 -1
- package/dist/components/data/funnel/funnel.class.d.ts +7 -3
- package/dist/components/data/funnel/funnel.class.js +2 -2
- package/dist/components/data/heatmap/calendar-grid.d.ts +1 -1
- package/dist/components/data/heatmap/calendar-grid.js +1 -1
- package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -1
- package/dist/components/data/heatmap/heatmap-limits.d.ts +1 -1
- package/dist/components/data/heatmap/heatmap-matrix-source-controller.js +1 -0
- package/dist/components/data/heatmap/heatmap-matrix-source.d.ts +5 -0
- package/dist/components/data/heatmap/heatmap-matrix-source.js +1 -0
- package/dist/components/data/heatmap/heatmap-scale.d.ts +0 -16
- package/dist/components/data/heatmap/heatmap-scale.js +1 -1
- package/dist/components/data/heatmap/heatmap.class.d.ts +40 -11
- package/dist/components/data/heatmap/heatmap.class.js +26 -6
- package/dist/components/data/heatmap/heatmap.styles.js +1 -1
- package/dist/components/data/pagination/pagination.class.js +1 -1
- package/dist/components/data/sequence-strip/sequence-strip-item.d.ts +17 -0
- package/dist/components/data/sequence-strip/sequence-strip-source-controller.js +1 -0
- package/dist/components/data/sequence-strip/sequence-strip-source.d.ts +5 -0
- package/dist/components/data/sequence-strip/sequence-strip-source.js +1 -0
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +24 -19
- package/dist/components/data/sequence-strip/sequence-strip.class.js +23 -4
- package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
- package/dist/components/data/sparkline/sparkline.class.d.ts +17 -4
- package/dist/components/data/sparkline/sparkline.class.js +3 -3
- package/dist/components/data/sparkline/sparkline.styles.js +1 -1
- package/dist/components/data/table/table.class.d.ts +14 -10
- package/dist/components/data/table/table.class.js +17 -16
- package/dist/components/data/timeline/timeline.class.d.ts +5 -2
- package/dist/components/data/timeline/timeline.class.js +1 -1
- package/dist/components/data/tree/tree-item.class.js +1 -1
- package/dist/components/data/tree/tree-owner-controller.js +1 -1
- package/dist/components/data/tree/tree.class.d.ts +28 -6
- package/dist/components/data/tree/tree.class.js +3 -3
- package/dist/components/data/tree/tree.d.ts +1 -0
- package/dist/components/data/tree/tree.js +1 -1
- package/dist/components/data/word-cloud/word-cloud.class.d.ts +17 -7
- package/dist/components/data/word-cloud/word-cloud.class.js +6 -4
- package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
- package/dist/components/forms/catalog-picker-base.d.ts +1 -1
- package/dist/components/forms/catalog-picker-base.js +6 -6
- package/dist/components/forms/catalog-picker-base.styles.js +1 -1
- package/dist/components/forms/combobox/combobox.class.d.ts +7 -3
- package/dist/components/forms/combobox/combobox.class.js +1 -1
- package/dist/components/forms/combobox/option.class.d.ts +4 -2
- package/dist/components/forms/combobox/option.class.js +2 -2
- package/dist/components/forms/country-picker/country-picker.class.d.ts +3 -1
- package/dist/components/forms/country-picker/country-picker.class.js +1 -1
- package/dist/components/forms/currency-picker/currency-picker.class.d.ts +2 -0
- package/dist/components/forms/currency-picker/currency-picker.class.js +1 -1
- package/dist/components/forms/currency-picker/currency-presentation.js +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +6 -2
- package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -2
- package/dist/components/forms/emoji-picker/emoji-picker.styles.js +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.d.ts +8 -2
- package/dist/components/forms/locale-picker/locale-picker.class.js +5 -4
- package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
- package/dist/components/forms/select/select.class.d.ts +11 -3
- package/dist/components/forms/select/select.class.js +4 -4
- package/dist/components/forms/time-zone-picker/time-zone-picker.class.d.ts +2 -0
- package/dist/components/forms/time-zone-picker/time-zone-picker.class.js +1 -1
- package/dist/components/forms/token-input/token-input.class.d.ts +6 -1
- package/dist/components/forms/token-input/token-input.class.js +15 -13
- package/dist/components/forms/unit-picker/unit-picker.class.d.ts +2 -0
- package/dist/components/forms/unit-picker/unit-picker.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail.class.d.ts +1 -1
- package/dist/components/layout/app-rail/app-rail.class.js +1 -1
- package/dist/components/layout/command-palette/command-palette.class.d.ts +5 -2
- package/dist/components/layout/command-palette/command-palette.class.js +2 -1
- package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
- package/dist/components/layout/menu/menu-item.class.d.ts +2 -2
- package/dist/components/layout/menu/menu-item.class.js +2 -2
- package/dist/components/layout/menu/menu.class.d.ts +1 -1
- package/dist/components/layout/menu/menu.class.js +1 -1
- package/dist/components/layout/menubar/menubar.class.d.ts +1 -1
- package/dist/components/layout/menubar/menubar.class.js +1 -1
- package/dist/components/layout/reorder-list/reorder-item.class.d.ts +2 -2
- package/dist/components/layout/reorder-list/reorder-item.class.js +2 -2
- package/dist/components/layout/reorder-list/reorder-list.class.d.ts +1 -1
- package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.d.ts +13 -9
- package/dist/components/layout/virtual-list/virtual-list.class.js +21 -17
- package/dist/components/media/av-player/av-cue-index.js +1 -0
- package/dist/components/media/av-player/av-cue-source.d.ts +13 -0
- package/dist/components/media/av-player/av-cue-source.js +1 -0
- package/dist/components/media/av-player/av-metadata.d.ts +2 -2
- package/dist/components/media/av-player/av-metadata.js +1 -1
- package/dist/components/media/av-player/av-player-cue-source-controller.js +1 -0
- package/dist/components/media/av-player/av-player.class.d.ts +34 -12
- package/dist/components/media/av-player/av-player.class.js +15 -10
- package/dist/components/media/flag/flag.class.js +1 -1
- package/dist/components/media/flag/language-map.js +1 -1
- package/dist/components/media/lightbox/lightbox-source.js +1 -0
- package/dist/components/media/lightbox/lightbox-types.d.ts +15 -0
- package/dist/components/media/lightbox/lightbox.class.d.ts +22 -21
- package/dist/components/media/lightbox/lightbox.class.js +6 -4
- package/dist/components/media/lightbox/lightbox.styles.js +1 -1
- package/dist/components/media/map/map-geojson-diff.d.ts +6 -6
- package/dist/components/media/map/map-geojson-diff.js +1 -1
- package/dist/components/media/map/map-loader.d.ts +5 -1
- package/dist/components/media/map/map.class.d.ts +24 -6
- package/dist/components/media/map/map.class.js +2 -2
- package/dist/components/media/map/map.styles.js +1 -1
- package/dist/components/media/video-playlist/video-playlist.class.d.ts +2 -1
- package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
- package/dist/components/overlays/chip/chip.class.d.ts +1 -1
- package/dist/components/overlays/chip/chip.class.js +1 -1
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +30 -8
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +22 -8
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
- package/dist/components/retrieval/graph/graph-canvas.js +1 -1
- package/dist/components/retrieval/graph/graph-source-composition.js +1 -0
- package/dist/components/retrieval/graph/graph-source-controller.js +1 -0
- package/dist/components/retrieval/graph/graph-spatial-controller.js +2 -2
- package/dist/components/retrieval/graph/graph-spatial-model.js +1 -0
- package/dist/components/retrieval/graph/graph-spatial.js +1 -1
- package/dist/components/retrieval/graph/graph.class.d.ts +31 -6
- package/dist/components/retrieval/graph/graph.class.js +26 -5
- package/dist/components/retrieval/graph/graph.d.ts +1 -1
- package/dist/components/retrieval/graph/graph.js +1 -1
- package/dist/components/retrieval/graph/graph.styles.js +1 -1
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +33 -4
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +27 -17
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.d.ts +1 -1
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.js +1 -1
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +1 -1
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +27 -4
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +29 -14
- package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +17 -3
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +15 -10
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +24 -5
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +17 -10
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.d.ts +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.js +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
- package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
- package/dist/components/retrieval/mind-map/mind-map-model.js +1 -0
- package/dist/components/retrieval/mind-map/mind-map.class.d.ts +27 -4
- package/dist/components/retrieval/mind-map/mind-map.class.js +11 -7
- package/dist/components/retrieval/mind-map/mind-map.d.ts +1 -0
- package/dist/components/retrieval/mind-map/mind-map.js +1 -1
- package/dist/components/retrieval/mind-map/mind-map.styles.js +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +24 -2
- package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +17 -3
- package/dist/components/retrieval/neighbor-list/neighbor-list.d.ts +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.js +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
- package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +8 -4
- package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +11 -7
- package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.styles.js +1 -1
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.d.ts +12 -6
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +30 -17
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results-model.js +1 -0
- package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +46 -5
- package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +31 -9
- package/dist/components/retrieval/retrieval-results/retrieval-results.d.ts +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results.js +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +1 -1
- package/dist/components/utility/diff-view/diff-view.class.d.ts +16 -8
- package/dist/components/utility/diff-view/diff-view.class.js +3 -2
- package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
- package/dist/components/utility/json-viewer/json-viewer.class.d.ts +31 -3
- package/dist/components/utility/json-viewer/json-viewer.class.js +13 -4
- package/dist/components/utility/json-viewer/json-viewer.d.ts +1 -0
- package/dist/components/utility/json-viewer/json-viewer.js +1 -1
- package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
- package/dist/components/utility/mention-popover/mention-popover.class.d.ts +6 -4
- package/dist/components/utility/mention-popover/mention-popover.class.js +6 -5
- package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +34 -7
- package/dist/components/viewers/csv-viewer/csv-viewer.class.js +9 -7
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +28 -4
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +12 -11
- package/dist/components/viewers/geojson-view/geojson-viewer.class.d.ts +3 -1
- package/dist/components/viewers/geojson-view/geojson-viewer.class.js +17 -16
- package/dist/components/viewers/geojson-view/geojson-viewer.d.ts +1 -1
- package/dist/components/viewers/geojson-view/geojson-viewer.js +1 -1
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +31 -5
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +11 -8
- package/dist/components/viewers/table-viewer-shared.js +19 -3
- package/dist/components/viewers/viewer-search-limits.js +1 -1
- package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +35 -3
- package/dist/components/viewers/xml-viewer/xml-viewer.class.js +20 -5
- package/dist/components/viewers/xml-viewer/xml-viewer.d.ts +1 -1
- package/dist/components/viewers/xml-viewer/xml-viewer.js +1 -1
- package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +1 -1
- package/dist/countries.js +1 -1
- package/dist/data-sources.d.ts +34 -0
- package/dist/data-sources.js +1 -0
- package/dist/events.d.ts +51 -7
- package/dist/framework-types.d.ts +1 -1
- package/dist/internal/accessibility-visibility.d.ts +4 -2
- package/dist/internal/accessibility-visibility.js +1 -1
- package/dist/internal/accessible-text-controller.js +1 -1
- package/dist/internal/anchor-target.js +2 -2
- package/dist/internal/catalog-picker.d.ts +1 -7
- package/dist/internal/catalog-picker.js +1 -1
- package/dist/internal/collection-snapshot.js +1 -1
- package/dist/internal/default-strings/agent-tools.generated.js +1 -1
- package/dist/internal/default-strings/charts.generated.js +1 -1
- package/dist/internal/default-strings/conversation.generated.js +1 -1
- package/dist/internal/default-strings/data.generated.js +1 -1
- package/dist/internal/default-strings/forms.generated.js +1 -1
- package/dist/internal/default-strings/layout.generated.js +1 -1
- package/dist/internal/default-strings/media.generated.js +1 -1
- package/dist/internal/default-strings/retrieval.generated.js +1 -1
- package/dist/internal/default-strings/shared.generated.js +1 -1
- package/dist/internal/default-strings/utility.generated.js +1 -1
- package/dist/internal/delimited-data.js +1 -1
- package/dist/internal/fixed-containing-block.js +1 -1
- package/dist/internal/flow-scene-envelope.js +1 -0
- package/dist/internal/graph-scene-controller.js +1 -0
- package/dist/internal/hierarchy-source-controller.js +1 -0
- package/dist/internal/hierarchy-source-view.js +29 -0
- package/dist/internal/hierarchy-source-view.styles.js +1 -0
- package/dist/internal/inherited-attribute-hub.d.ts +6 -0
- package/dist/internal/inherited-attribute-hub.js +1 -1
- package/dist/internal/intl-cache.js +1 -1
- package/dist/internal/keyed-index.js +1 -0
- package/dist/internal/localization-types.d.ts +1 -1
- package/dist/internal/localization.js +2 -2
- package/dist/internal/lyra-element.d.ts +2 -2
- package/dist/internal/lyra-element.js +3 -2
- package/dist/internal/native-modal-context.js +1 -1
- package/dist/internal/option-selection.js +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/internal/positioner.js +1 -1
- package/dist/internal/resource-loader.d.ts +2 -0
- package/dist/internal/resource-loader.js +1 -1
- package/dist/internal/scoped-definitions.generated.js +1 -1
- package/dist/internal/search-haystack.js +1 -0
- package/dist/internal/selection-catalog.d.ts +5 -0
- package/dist/internal/selection-catalog.js +1 -1
- package/dist/internal/shiki-language-sources.js +1 -0
- package/dist/internal/source-page-controller.js +1 -0
- package/dist/internal/source-page-scope.js +1 -0
- package/dist/internal/source-request-controller.js +1 -0
- package/dist/internal/source-window-controller.js +1 -0
- package/dist/internal/spatial-source-controller.js +1 -0
- package/dist/internal/text-quote.d.ts +2 -6
- package/dist/internal/text-quote.js +1 -1
- package/dist/internal/theme-watcher.js +1 -1
- package/dist/internal/virtual-list-composition.js +1 -0
- package/dist/lyra.d.ts +1 -1
- package/dist/lyra.js +1 -1
- package/dist/testing/interaction-drivers.js +1 -1
- package/dist/testing/lyra-tag-event-map.js +1 -1
- package/dist/units.js +1 -1
- package/dist/utilities/data-preparation.d.ts +56 -0
- package/dist/utilities/data-preparation.js +1 -0
- package/dist/utilities/data-spatial.d.ts +26 -0
- package/dist/utilities/data-spatial.js +1 -0
- package/dist/utilities/index.d.ts +1 -1
- package/dist/utilities/index.js +1 -1
- package/llms/components/lr-activity-feed.md +7 -2
- package/llms/components/lr-agent-trace.md +49 -9
- package/llms/components/lr-agent-workspace.md +15 -8
- package/llms/components/lr-av-player.md +180 -10
- package/llms/components/lr-bar-chart.md +1 -1
- package/llms/components/lr-box-plot.md +8 -0
- package/llms/components/lr-bubble-chart.md +1 -1
- package/llms/components/lr-calendar.md +26 -3
- package/llms/components/lr-chart.md +310 -23
- package/llms/components/lr-chat-viewport.md +6 -0
- package/llms/components/lr-code-block-core.md +12 -7
- package/llms/components/lr-code-block.md +23 -9
- package/llms/components/lr-combobox.md +27 -15
- package/llms/components/lr-command-palette.md +16 -3
- package/llms/components/lr-country-picker.md +23 -6
- package/llms/components/lr-csv-viewer.md +95 -12
- package/llms/components/lr-currency-picker.md +23 -3
- package/llms/components/lr-data-grid.md +24 -6
- package/llms/components/lr-dataset-viewer.md +92 -11
- package/llms/components/lr-dialog.md +1 -1
- package/llms/components/lr-diff-view.md +19 -6
- package/llms/components/lr-document-library.md +60 -5
- package/llms/components/lr-doughnut-chart.md +1 -1
- package/llms/components/lr-embedding-explorer.md +89 -9
- package/llms/components/lr-emoji-picker.md +7 -2
- package/llms/components/lr-eval-dataset.md +56 -7
- package/llms/components/lr-eval-result.md +89 -4
- package/llms/components/lr-export-button.md +1 -1
- package/llms/components/lr-file-tree.md +60 -6
- package/llms/components/lr-flag.md +5 -2
- package/llms/components/lr-flow-canvas.md +152 -14
- package/llms/components/lr-flow-minimap.md +32 -4
- package/llms/components/lr-funnel.md +14 -0
- package/llms/components/lr-geojson-viewer.md +27 -10
- package/llms/components/lr-graph.md +43 -7
- package/llms/components/lr-heatmap.md +161 -5
- package/llms/components/lr-histogram.md +55 -9
- package/llms/components/lr-ingestion-queue.md +54 -3
- package/llms/components/lr-json-viewer.md +87 -7
- package/llms/components/lr-knowledge-base-admin.md +60 -4
- package/llms/components/lr-knowledge-base.md +121 -9
- package/llms/components/lr-knowledge-graph-explorer.md +106 -11
- package/llms/components/lr-lightbox.md +42 -6
- package/llms/components/lr-line-chart.md +28 -5
- package/llms/components/lr-lite-chart.md +96 -31
- package/llms/components/lr-locale-picker.md +6 -4
- package/llms/components/lr-map.md +67 -8
- package/llms/components/lr-markdown-core.md +10 -5
- package/llms/components/lr-markdown.md +23 -6
- package/llms/components/lr-mention-popover.md +11 -6
- package/llms/components/lr-mind-map.md +91 -10
- package/llms/components/lr-model-select.md +8 -4
- package/llms/components/lr-model-settings-panel.md +10 -2
- package/llms/components/lr-navigation-menu.md +1 -1
- package/llms/components/lr-neighbor-list.md +69 -2
- package/llms/components/lr-pie-chart.md +1 -1
- package/llms/components/lr-polar-area-chart.md +1 -1
- package/llms/components/lr-prompt-input.md +9 -2
- package/llms/components/lr-prompt-queue.md +11 -3
- package/llms/components/lr-radar-chart.md +1 -1
- package/llms/components/lr-rag-eval-dashboard.md +9 -2
- package/llms/components/lr-realtime-session.md +6 -2
- package/llms/components/lr-reorder-list.md +4 -0
- package/llms/components/lr-retrieval-compare.md +9 -4
- package/llms/components/lr-retrieval-results.md +104 -6
- package/llms/components/lr-scatter-chart.md +1 -1
- package/llms/components/lr-select.md +20 -10
- package/llms/components/lr-sequence-strip.md +92 -2
- package/llms/components/lr-span-waterfall.md +78 -8
- package/llms/components/lr-sparkline.md +42 -11
- package/llms/components/lr-spreadsheet-viewer.md +109 -14
- package/llms/components/lr-streaming-text-core.md +4 -2
- package/llms/components/lr-streaming-text.md +5 -1
- package/llms/components/lr-table.md +96 -115
- package/llms/components/lr-task-list.md +93 -9
- package/llms/components/lr-terminal.md +9 -0
- package/llms/components/lr-test-results.md +77 -3
- package/llms/components/lr-thread-list.md +86 -1
- package/llms/components/lr-time-zone-picker.md +8 -3
- package/llms/components/lr-timeline.md +5 -0
- package/llms/components/lr-token-input.md +7 -2
- package/llms/components/lr-tool-timeline.md +13 -4
- package/llms/components/lr-trace-tree.md +96 -10
- package/llms/components/lr-transcript-feed.md +9 -2
- package/llms/components/lr-tree.md +87 -15
- package/llms/components/lr-unit-picker.md +8 -3
- package/llms/components/lr-video-playlist.md +2 -0
- package/llms/components/lr-virtual-list.md +17 -8
- package/llms/components/lr-voice-picker.md +8 -3
- package/llms/components/lr-word-cloud.md +128 -12
- package/llms/components/lr-xml-viewer.md +106 -9
- package/llms/index.md +1 -1
- package/llms/peers.md +1 -1
- package/llms/shared/events-and-types.md +725 -264
- package/llms/shared/forms-and-accessibility.md +3 -17
- package/llms/shared/imports-and-registration.md +3 -17
- package/llms/shared/localization-and-rtl.md +0 -2
- package/llms/shared/styles-and-tokens.md +27 -36
- package/llms/shared/testing-and-utilities.md +4 -5
- package/llms/shared.md +770 -349
- package/llms.txt +1 -2
- package/locales.json +139 -139
- package/package.json +13 -4
- package/registrations.json +1 -1
- package/skills/compose-lyra-interfaces/SKILL.md +6 -8
- package/skills/lyra-ui/SKILL.md +20 -51
- package/skills/lyra-ui/commands/review.md +16 -33
- package/skills/lyra-ui/commands/update.md +6 -5
- package/skills/lyra-ui/online-api.md +15 -0
- package/skills/lyra-ui/reporting.md +2 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type{MarkdownStreamingRender}from'../markdown/markdown-shared.js';import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';import{type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{ChatComposerStatus,ChatComposerWrap}from'../chat-composer/chat-composer.class.js';import type{AgentRunMetric}from'../../agent-tools/agent-run/agent-run.class.js';export type{AgentRunMetric}from'../../agent-tools/agent-run/agent-run.class.js';import type{ContextInspectorSegment}from'../../agent-tools/context-inspector/context-inspector.class.js';export type{ContextInspectorSegment}from'../../agent-tools/context-inspector/context-inspector.class.js';import type{AgentRun,CancelEventDetail,ChatMessage,Citation,CitationSelectEventDetail,GroundingAssessment,RetrievalChunk,RetryEventDetail}from'../../../ai/types.js';import type{RetrievalResultsSelectDetail}from'../../retrieval/retrieval-results/retrieval-results.class.js';import type{ToolTimelineEntry,ToolTimelineApprovalDetail}from'../../agent-tools/tool-timeline/tool-timeline.class.js';export type{ToolTimelineEntry}from'../../agent-tools/tool-timeline/tool-timeline.class.js';export interface LyraAgentWorkspaceEventMap{'lr-input':CustomEvent<{value:string;}>;'lr-submit':CustomEvent<{value:string;}>;'lr-stop':CustomEvent<null>;'lr-message-retry':CustomEvent<{messageId:string;}>;'lr-follow-change':CustomEvent<{following:boolean;}>;'lr-retrieval-select':CustomEvent<LyraEventDetailSnapshot<RetrievalResultsSelectDetail>>;'lr-citation-select':CustomEvent<LyraEventDetailSnapshot<CitationSelectEventDetail>>;'lr-tool-approval-decide-request':CustomEvent<ToolTimelineApprovalDetail>;'lr-cancel':CustomEvent<CancelEventDetail>;'lr-run-retry':CustomEvent<RetryEventDetail>;}
|
|
1
|
+
import type{MarkdownStreamingRender}from'../markdown/markdown-shared.js';import type{LyraEventDetailSnapshot}from'../../../internal/lyra-element.js';import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{ChatComposerStatus,ChatComposerWrap}from'../chat-composer/chat-composer.class.js';import type{AgentRunMetric}from'../../agent-tools/agent-run/agent-run.class.js';export type{AgentRunMetric}from'../../agent-tools/agent-run/agent-run.class.js';import type{ContextInspectorSegment}from'../../agent-tools/context-inspector/context-inspector.class.js';export type{ContextInspectorSegment}from'../../agent-tools/context-inspector/context-inspector.class.js';import type{AgentRun,CancelEventDetail,ChatMessage,Citation,CitationSelectEventDetail,GroundingAssessment,RetrievalChunk,RetryEventDetail}from'../../../ai/types.js';import type{RetrievalResultsSelectDetail}from'../../retrieval/retrieval-results/retrieval-results.class.js';import type{ToolTimelineEntry,ToolTimelineApprovalDetail}from'../../agent-tools/tool-timeline/tool-timeline.class.js';export type{ToolTimelineEntry}from'../../agent-tools/tool-timeline/tool-timeline.class.js';export interface LyraAgentWorkspaceEventMap{'lr-input':CustomEvent<{value:string;}>;'lr-submit':CustomEvent<{value:string;}>;'lr-stop':CustomEvent<null>;'lr-message-retry':CustomEvent<{messageId:string;}>;'lr-follow-change':CustomEvent<{following:boolean;}>;'lr-retrieval-select':CustomEvent<LyraEventDetailSnapshot<RetrievalResultsSelectDetail>>;'lr-citation-select':CustomEvent<LyraEventDetailSnapshot<CitationSelectEventDetail>>;'lr-tool-approval-decide-request':CustomEvent<ToolTimelineApprovalDetail>;'lr-cancel':CustomEvent<CancelEventDetail>;'lr-run-retry':CustomEvent<RetryEventDetail>;}
|
|
2
2
|
/**
|
|
3
3
|
* `<lr-agent-workspace>` — a responsive, controlled shell for an AI conversation and its
|
|
4
4
|
* supporting agent state. It renders the transcript and composer in the main pane, and composes
|
|
@@ -11,7 +11,9 @@ import type{MarkdownStreamingRender}from'../markdown/markdown-shared.js';import
|
|
|
11
11
|
* `messages` slot. The `details` slot similarly replaces the built-in details pane while keeping
|
|
12
12
|
* the responsive shell. Empty and duplicate message ids normalize first-wins before the bounded
|
|
13
13
|
* window is chosen; at most the latest 500 valid messages are materialized. Applications needing
|
|
14
|
-
* a larger retained transcript can supply a virtualized `messages` slot.
|
|
14
|
+
* a larger retained transcript can supply a virtualized `messages` slot. Messages and tools retain
|
|
15
|
+
* the newest admitted tail; unread indices remain relative to the original message input. Assigned
|
|
16
|
+
* messages/details slots suppress fallback work. Original collection loss is disclosed in input-limit.
|
|
15
17
|
* Composer value, follow state, and retrieval selection are request-only:
|
|
16
18
|
* child events are forwarded, but the workspace never writes those public
|
|
17
19
|
* properties. The host applies accepted state back to the component.
|
|
@@ -51,6 +53,7 @@ import type{MarkdownStreamingRender}from'../markdown/markdown-shared.js';import
|
|
|
51
53
|
* @event lr-tool-approval-decide-request - Forwarded from the built-in tool timeline.
|
|
52
54
|
* @event lr-cancel - Forwarded from the built-in agent run.
|
|
53
55
|
* @event lr-run-retry - Forwarded from the built-in agent run.
|
|
56
|
+
* @csspart input-limit - Original collection admission-loss notices.
|
|
54
57
|
* @csspart base - The root workspace wrapper.
|
|
55
58
|
* @csspart header - The workspace heading and header-actions slot.
|
|
56
59
|
* @csspart heading - The visible workspace heading.
|
|
@@ -132,7 +135,7 @@ composerReadOnly:boolean;composerMinLength?:number;composerMaxLength?:number;
|
|
|
132
135
|
composerSpellcheck:boolean;composerAutocapitalize:string;private composerAutocorrectValue;
|
|
133
136
|
/** Native autocorrect state for the built-in composer.
|
|
134
137
|
* @default true */
|
|
135
|
-
get composerAutocorrect():boolean;set composerAutocorrect(next:boolean|string);composerWrap:ChatComposerWrap;composerAutocomplete:string;composerInputMode:string;composerEnterKeyHint:string;private hasSlotted;private builtInToolTimeline;
|
|
138
|
+
get composerAutocorrect():boolean;set composerAutocorrect(next:boolean|string);composerWrap:ChatComposerWrap;composerAutocomplete:string;composerInputMode:string;composerEnterKeyHint:string;private readonly inputAnnouncements;private lastInputNotice;private inputNoticeMounted;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected updated(changed:PropertyValues):void;private inputLimitMessages;private hasSlotted;private builtInToolTimeline;
|
|
136
139
|
/** Closes a vetoed approval in the built-in tool timeline after the host persists its decision.
|
|
137
140
|
* No-op when that timeline or a pending approval is absent, including with a custom details slot. */
|
|
138
141
|
finalizePendingApproval():void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{guard}from"lit/directives/guard.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteCount}from"../../../internal/numbers.js";import{tag}from"../../../internal/prefix.js";import{normalizeChatComposerStatus}from"../chat-composer/chat-composer.class.js";import{styles}from"./agent-workspace.styles.js";import{autocorrectConverter,normalizeAutocorrect,trueDefaultBooleanConverter}from"../../../internal/converters.js";import{lengthLimitConverter}from"../../../internal/length-constraints.js";import{LYRA_DEFAULT_agentWorkspaceContext,LYRA_DEFAULT_agentWorkspaceConversation,LYRA_DEFAULT_agentWorkspaceDetails,LYRA_DEFAULT_agentWorkspaceEmpty,LYRA_DEFAULT_agentWorkspaceGrounding,LYRA_DEFAULT_agentWorkspaceLabel,LYRA_DEFAULT_agentWorkspaceRetrieval,LYRA_DEFAULT_agentWorkspaceRun,LYRA_DEFAULT_agentWorkspaceTools,LYRA_DEFAULT_composerPlaceholder}from"../../../internal/default-strings/conversation.generated.js";const MAX_RENDERED_MESSAGES=500,projections=new WeakMap;function firstByWorkspaceIdentity(items,identity){const known=projections.get(items);if(known?.identity===identity)return known.result;const result=[],seen=new Set;for(const item of items){let id;try{id=identity(item)}catch{continue}typeof id!="string"||id.trim()===""||seen.has(id)||(seen.add(id),result.push(item))}return projections.set(items,{identity,result}),result}const workspaceId=item=>item.id,toolIdentity=entry=>{const id=entry.id;if(typeof id!="string"||id.trim()==="")return;const sourceKey=entry.sourceKey;return`${typeof sourceKey=="string"?sourceKey:""}\0${id}`};class LyraAgentWorkspace extends LyraElement{constructor(){super(...arguments),this.streamingRender="plain",this.accessibleLabel=null,this.messages=[],this.run=null,this.metrics=[],this.tools=[],this.retrievalChunks=[],this.selectedRetrievalChunkIds=[],this.retrievalLoading=!1,this.retrievalHasMore=!1,this.retrievalErrorText="",this.groundingAssessment=null,this.citations=[],this.contextSegments=[],this.contextTotal=0,this.follow=!0,this.unreadStartIndex=null,this.withoutDetails=!1,this.withoutComposer=!1,this.composerValue="",this.composerStatusValue="idle",this.composerMinRows=1,this.composerMaxRows=8,this.composerSubmitDisabled=!1,this.composerWithoutStop=!1,this.composerWithoutEnterSubmit=!1,this.composerReadOnly=!1,this.composerSpellcheck=!0,this.composerAutocapitalize="",this.composerAutocorrectValue=!0,this.composerWrap="soft",this.composerAutocomplete="",this.composerInputMode="",this.composerEnterKeyHint="",this.onRetrievalSelect=event=>{event.stopPropagation(),this.emit("lr-retrieval-select",{chunkIds:event.detail.selectedChunkIds,chunks:event.detail.chunks})},this.onRetrievalSelectAlias=event=>{event.stopPropagation()},this.onMessageRetry=event=>{event.stopPropagation(),event.detail.messageId&&this.emit("lr-message-retry",{messageId:event.detail.messageId})},this.onNamedSlotChange=()=>{this.requestUpdate()}}static{this.defaultStrings={...super.defaultStrings,agentWorkspaceContext:LYRA_DEFAULT_agentWorkspaceContext,agentWorkspaceConversation:LYRA_DEFAULT_agentWorkspaceConversation,agentWorkspaceDetails:LYRA_DEFAULT_agentWorkspaceDetails,agentWorkspaceEmpty:LYRA_DEFAULT_agentWorkspaceEmpty,agentWorkspaceGrounding:LYRA_DEFAULT_agentWorkspaceGrounding,agentWorkspaceLabel:LYRA_DEFAULT_agentWorkspaceLabel,agentWorkspaceRetrieval:LYRA_DEFAULT_agentWorkspaceRetrieval,agentWorkspaceRun:LYRA_DEFAULT_agentWorkspaceRun,agentWorkspaceTools:LYRA_DEFAULT_agentWorkspaceTools,composerPlaceholder:LYRA_DEFAULT_composerPlaceholder}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-retrieval-select"])}static{this.ownedCollectionProperties=Object.freeze(["messages","run","metrics","tools","retrievalChunks","selectedRetrievalChunkIds","groundingAssessment","citations","contextSegments"])}static{this.appendOrderedCollectionProperties=Object.freeze(["messages"])}static{this.styles=[LyraElement.styles,styles]}get composerStatus(){return this.composerStatusValue}set composerStatus(value){const previous=this.composerStatusValue;this.composerStatusValue=normalizeChatComposerStatus(value),this.requestUpdate("composerStatus",previous)}get composerAutocorrect(){return this.composerAutocorrectValue}set composerAutocorrect(next){const previous=this.composerAutocorrectValue;this.composerAutocorrectValue=normalizeAutocorrect(next),this.requestUpdate("composerAutocorrect",previous)}hasSlotted(name){return Array.from(this.children).some(element=>element.getAttribute("slot")===name)}builtInToolTimeline(){return this.withoutDetails||this.hasSlotted("details")?null:this.renderRoot?.querySelector(tag("tool-timeline"))??null}finalizePendingApproval(){this.builtInToolTimeline()?.finalizePendingApproval()}revertPendingApproval(){this.builtInToolTimeline()?.revertPendingApproval()}get safeContextTotal(){return finiteCount(this.contextTotal)}get effectiveTools(){return firstByWorkspaceIdentity(this.tools,toolIdentity)}get effectiveRetrievalChunks(){return firstByWorkspaceIdentity(this.retrievalChunks,workspaceId)}get effectiveCitations(){return firstByWorkspaceIdentity(this.citations,workspaceId)}get effectiveContextSegments(){return firstByWorkspaceIdentity(this.contextSegments,workspaceId)}get effectiveMessages(){const source=this.messages;if(this.messagesMemo?.source===source)return this.messagesMemo.result;const seen=new Set,messages=[];for(let sourceIndex=0;sourceIndex<source.length;sourceIndex++){const message=source[sourceIndex];if(!message)continue;const id=message?.id;typeof id!="string"||id.trim()===""||seen.has(id)||(seen.add(id),messages.push({message,sourceIndex}))}return this.messagesMemo={source,result:messages},messages}get safeUnreadStartIndex(){if(this.unreadStartIndex==null)return null;const normalized=finiteCount(this.unreadStartIndex);if(this.hasSlotted("messages"))return normalized;const messages=this.effectiveMessages,effectiveIndex=messages.filter(({sourceIndex})=>sourceIndex<normalized).length;return Math.max(0,effectiveIndex-this.messageWindowOffsetFor(messages))}get safeComposerMinRows(){return Math.max(1,finiteCount(this.composerMinRows,1))}get safeComposerMaxRows(){return Math.max(this.safeComposerMinRows,finiteCount(this.composerMaxRows,8))}stopOwnedEvent(event){event.stopPropagation()}renderMessage(message){return html`
|
|
1
|
+
import{__decorate}from"tslib";import{collectionSupport,publicCollectionTruncation}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{guard}from"lit/directives/guard.js";import{LyraElement}from"../../../internal/lyra-element.js";import{finiteCount}from"../../../internal/numbers.js";import{tag}from"../../../internal/prefix.js";import{normalizeChatComposerStatus}from"../chat-composer/chat-composer.class.js";import{styles}from"./agent-workspace.styles.js";import{autocorrectConverter,normalizeAutocorrect,trueDefaultBooleanConverter}from"../../../internal/converters.js";import{lengthLimitConverter}from"../../../internal/length-constraints.js";import{LYRA_DEFAULT_agentWorkspaceContext,LYRA_DEFAULT_agentWorkspaceConversation,LYRA_DEFAULT_agentWorkspaceDetails,LYRA_DEFAULT_agentWorkspaceEmpty,LYRA_DEFAULT_agentWorkspaceGrounding,LYRA_DEFAULT_agentWorkspaceInputLimit,LYRA_DEFAULT_agentWorkspaceLabel,LYRA_DEFAULT_agentWorkspaceRetrieval,LYRA_DEFAULT_agentWorkspaceRun,LYRA_DEFAULT_agentWorkspaceTools,LYRA_DEFAULT_composerPlaceholder}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_progress,LYRA_DEFAULT_restore,LYRA_DEFAULT_search,LYRA_DEFAULT_select}from"../../../internal/default-strings/shared.generated.js";const MAX_RENDERED_MESSAGES=500,projections=new WeakMap;function firstByWorkspaceIdentity(items,identity){const known=projections.get(items);if(known?.identity===identity)return known.result;const result=[],seen=new Set;for(const item of items){let id;try{id=identity(item)}catch{continue}typeof id!="string"||id.trim()===""||seen.has(id)||(seen.add(id),result.push(item))}return projections.set(items,{identity,result}),result}const workspaceId=item=>item.id,toolIdentity=entry=>{const id=entry.id;if(typeof id!="string"||id.trim()==="")return;const sourceKey=entry.sourceKey;return`${typeof sourceKey=="string"?sourceKey:""}\0${id}`};class LyraAgentWorkspace extends LyraElement{constructor(){super(...arguments),this.streamingRender="plain",this.accessibleLabel=null,this.messages=[],this.run=null,this.metrics=[],this.tools=[],this.retrievalChunks=[],this.selectedRetrievalChunkIds=[],this.retrievalLoading=!1,this.retrievalHasMore=!1,this.retrievalErrorText="",this.groundingAssessment=null,this.citations=[],this.contextSegments=[],this.contextTotal=0,this.follow=!0,this.unreadStartIndex=null,this.withoutDetails=!1,this.withoutComposer=!1,this.composerValue="",this.composerStatusValue="idle",this.composerMinRows=1,this.composerMaxRows=8,this.composerSubmitDisabled=!1,this.composerWithoutStop=!1,this.composerWithoutEnterSubmit=!1,this.composerReadOnly=!1,this.composerSpellcheck=!0,this.composerAutocapitalize="",this.composerAutocorrectValue=!0,this.composerWrap="soft",this.composerAutocomplete="",this.composerInputMode="",this.composerEnterKeyHint="",this.inputAnnouncements=new AnnouncementSinkController(this),this.lastInputNotice="",this.inputNoticeMounted=!1,this.onRetrievalSelect=event=>{event.stopPropagation(),this.emit("lr-retrieval-select",{chunkIds:event.detail.selectedChunkIds,chunks:event.detail.chunks})},this.onRetrievalSelectAlias=event=>{event.stopPropagation()},this.onMessageRetry=event=>{event.stopPropagation(),event.detail.messageId&&this.emit("lr-message-retry",{messageId:event.detail.messageId})},this.onNamedSlotChange=()=>{this.requestUpdate()}}static{this.defaultStrings={...super.defaultStrings,agentWorkspaceContext:LYRA_DEFAULT_agentWorkspaceContext,agentWorkspaceConversation:LYRA_DEFAULT_agentWorkspaceConversation,agentWorkspaceDetails:LYRA_DEFAULT_agentWorkspaceDetails,agentWorkspaceEmpty:LYRA_DEFAULT_agentWorkspaceEmpty,agentWorkspaceGrounding:LYRA_DEFAULT_agentWorkspaceGrounding,agentWorkspaceInputLimit:LYRA_DEFAULT_agentWorkspaceInputLimit,agentWorkspaceLabel:LYRA_DEFAULT_agentWorkspaceLabel,agentWorkspaceRetrieval:LYRA_DEFAULT_agentWorkspaceRetrieval,agentWorkspaceRun:LYRA_DEFAULT_agentWorkspaceRun,agentWorkspaceTools:LYRA_DEFAULT_agentWorkspaceTools,collapse:LYRA_DEFAULT_collapse,composerPlaceholder:LYRA_DEFAULT_composerPlaceholder,copy:LYRA_DEFAULT_copy,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,progress:LYRA_DEFAULT_progress,restore:LYRA_DEFAULT_restore,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-retrieval-select"])}static{this.ownedCollectionProperties=Object.freeze(["messages","run","metrics","tools","retrievalChunks","selectedRetrievalChunkIds","groundingAssessment","citations","contextSegments"])}static{this.appendOrderedCollectionProperties=Object.freeze(["messages","tools"])}static{this.styles=[LyraElement.styles,styles]}get composerStatus(){return this.composerStatusValue}set composerStatus(value){const previous=this.composerStatusValue;this.composerStatusValue=normalizeChatComposerStatus(value),this.requestUpdate("composerStatus",previous)}get composerAutocorrect(){return this.composerAutocorrectValue}set composerAutocorrect(next){const previous=this.composerAutocorrectValue;this.composerAutocorrectValue=normalizeAutocorrect(next),this.requestUpdate("composerAutocorrect",previous)}connectedCallback(){super.connectedCallback(),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){super.disconnectedCallback(),this.inputNoticeMounted=!1}adoptedCallback(){super.adoptedCallback(),this.inputAnnouncements.adopted()}updated(changed){super.updated(changed);const notice=this.inputLimitMessages().join(" ");this.inputNoticeMounted&¬ice&¬ice!==this.lastInputNotice&&this.inputAnnouncements.announcePolite(notice),this.lastInputNotice=notice,this.inputNoticeMounted=!0}inputLimitMessages(){const labels={messages:"agentWorkspaceConversation",tools:"agentWorkspaceTools",metrics:"agentWorkspaceRun",retrievalChunks:"agentWorkspaceRetrieval",selectedRetrievalChunkIds:"agentWorkspaceRetrieval",citations:"agentWorkspaceGrounding",contextSegments:"agentWorkspaceContext"},format=getNumberFormat(this.effectiveLocale);return Object.entries(labels).flatMap(([property2,label])=>{const loss=publicCollectionTruncation(this,property2);return loss?[this.localize("agentWorkspaceInputLimit",void 0,{collection:this.localize(label),count:format.format(loss.retained),total:format.format(loss.source)})]:[]})}hasSlotted(name){return Array.from(this.children).some(element=>element.getAttribute("slot")===name)}builtInToolTimeline(){return this.withoutDetails||this.hasSlotted("details")?null:this.renderRoot?.querySelector(tag("tool-timeline"))??null}finalizePendingApproval(){this.builtInToolTimeline()?.finalizePendingApproval()}revertPendingApproval(){this.builtInToolTimeline()?.revertPendingApproval()}get safeContextTotal(){return finiteCount(this.contextTotal)}get effectiveTools(){return firstByWorkspaceIdentity(this.tools,toolIdentity)}get effectiveRetrievalChunks(){return firstByWorkspaceIdentity(this.retrievalChunks,workspaceId)}get effectiveCitations(){return firstByWorkspaceIdentity(this.citations,workspaceId)}get effectiveContextSegments(){return firstByWorkspaceIdentity(this.contextSegments,workspaceId)}get effectiveMessages(){const source=this.messages;if(this.messagesMemo?.source===source)return this.messagesMemo.result;const loss=publicCollectionTruncation(this,"messages"),sourceOffset=loss?.kept==="newest"?loss.source-source.length:0,seen=new Set,messages=[];for(let sourceIndex=0;sourceIndex<source.length;sourceIndex++){const message=source[sourceIndex];if(!message)continue;const id=message?.id;typeof id!="string"||id.trim()===""||seen.has(id)||(seen.add(id),messages.push({message,sourceIndex:sourceOffset+sourceIndex}))}return this.messagesMemo={source,result:messages},messages}get safeUnreadStartIndex(){if(this.unreadStartIndex==null)return null;const normalized=finiteCount(this.unreadStartIndex);if(this.hasSlotted("messages"))return normalized;const messages=this.effectiveMessages,effectiveIndex=messages.filter(({sourceIndex})=>sourceIndex<normalized).length;return Math.max(0,effectiveIndex-this.messageWindowOffsetFor(messages))}get safeComposerMinRows(){return Math.max(1,finiteCount(this.composerMinRows,1))}get safeComposerMaxRows(){return Math.max(this.safeComposerMinRows,finiteCount(this.composerMaxRows,8))}stopOwnedEvent(event){event.stopPropagation()}renderMessage(message){return html`
|
|
2
2
|
<lr-chat-message
|
|
3
3
|
part="messages message"
|
|
4
4
|
.messageRole=${message.role}
|
|
@@ -28,7 +28,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
28
28
|
${retrievalChunks.length>0||this.retrievalLoading||this.retrievalErrorText?html`<section part="section">
|
|
29
29
|
<h3 part="section-heading">${this.localize("agentWorkspaceRetrieval")}</h3>
|
|
30
30
|
<lr-retrieval-results
|
|
31
|
-
.chunks=${retrievalChunks}
|
|
31
|
+
.chunks=${guard([retrievalChunks],()=>retrievalChunks)}
|
|
32
32
|
.selectedChunkIds=${this.selectedRetrievalChunkIds}
|
|
33
33
|
.loading=${this.retrievalLoading}
|
|
34
34
|
.hasMore=${this.retrievalHasMore}
|
|
@@ -52,10 +52,11 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
52
52
|
></lr-context-inspector>
|
|
53
53
|
</section>`:nothing}
|
|
54
54
|
</div>
|
|
55
|
-
`}get hasBuiltInDetails(){return!!(this.run||this.effectiveTools.length>0||this.effectiveRetrievalChunks.length>0||this.retrievalLoading||this.retrievalErrorText||this.groundingAssessment||this.effectiveCitations.length>0||this.effectiveContextSegments.length>0)}render(){const label=this.accessibleLabel??(this.label==null?this.localize("agentWorkspaceLabel"):this.label),heading=this.label==null?this.localize("agentWorkspaceLabel"):this.label,
|
|
55
|
+
`}get hasBuiltInDetails(){return!!(this.run||this.effectiveTools.length>0||this.effectiveRetrievalChunks.length>0||this.retrievalLoading||this.retrievalErrorText||this.groundingAssessment||this.effectiveCitations.length>0||this.effectiveContextSegments.length>0)}render(){const label=this.accessibleLabel??(this.label==null?this.localize("agentWorkspaceLabel"):this.label),heading=this.label==null?this.localize("agentWorkspaceLabel"):this.label,hasSlottedDetails=this.hasSlotted("details"),hasDetails=hasSlottedDetails||!this.withoutDetails&&this.hasBuiltInDetails,hasSlottedComposer=this.hasSlotted("composer");return html`
|
|
56
56
|
<div part="base" role="region" aria-label=${label}>
|
|
57
57
|
<div part="header">
|
|
58
58
|
<h2 part="heading">${heading}</h2>
|
|
59
|
+
${this.inputLimitMessages().map(notice=>html`<p part="input-limit" role="note">${notice}</p>`)}
|
|
59
60
|
<span part="header-actions" ?hidden=${!this.hasSlotted("header-actions")}
|
|
60
61
|
><slot name="header-actions" @slotchange=${this.onNamedSlotChange}></slot
|
|
61
62
|
></span>
|
|
@@ -69,7 +70,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
69
70
|
aria-label=${this.localize("agentWorkspaceConversation")}
|
|
70
71
|
>
|
|
71
72
|
<slot name="messages" @slotchange=${this.onNamedSlotChange}
|
|
72
|
-
>${this.renderMessages()}</slot
|
|
73
|
+
>${this.hasSlotted("messages")?nothing:this.renderMessages()}</slot
|
|
73
74
|
>
|
|
74
75
|
</lr-chat-viewport>
|
|
75
76
|
</section>
|
|
@@ -79,7 +80,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
79
80
|
?hidden=${!hasDetails}
|
|
80
81
|
>
|
|
81
82
|
<slot name="details" @slotchange=${this.onNamedSlotChange}
|
|
82
|
-
>${this.withoutDetails?
|
|
83
|
+
>${!this.withoutDetails&&!hasSlottedDetails?this.renderDetails():nothing}</slot
|
|
83
84
|
>
|
|
84
85
|
</aside>
|
|
85
86
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{css}from"lit";import{mediumContainerQuery}from"../../../internal/container-breakpoints.styles.js";const styles=css` :host { display: block; min-inline-size: 0; min-block-size: 0; block-size: 100%; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); } [part='base'] { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; min-inline-size: 0; min-block-size: 0; block-size: 100%; overflow: hidden; border: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); border-radius: var(--lr-radius); background: var(--lr-color-surface); color: var(--lr-color-text); } [part='header'] { display: flex; align-items: center; flex-wrap: wrap; gap: var(--lr-space-s); min-inline-size: 0; padding: var(--lr-space-s) var(--lr-space-m); border-block-end: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); } [part='heading'] { min-inline-size: 0; margin: 0; font-size: var(--lr-font-size-m); font-weight: var(--lr-font-weight-semibold); overflow-wrap: anywhere; } [part='header-actions']:where(:not([hidden])) { display: flex; align-items: center; flex-wrap: wrap; gap: var(--lr-space-xs); min-inline-size: 0; max-inline-size: 100%; margin-inline-start: auto; } slot[name='header-actions'] { display: block; min-inline-size: 0; max-inline-size: 100%; } slot[name='header-actions']::slotted(*) { min-inline-size: 0; max-inline-size: 100%; } [part='body'] { display: grid; grid-template-columns: minmax(0, 1fr) minmax(var(--lr-size-16rem), var(--lr-size-24rem)); min-inline-size: 0; min-block-size: 0; } [part='body'][data-details='false'] { grid-template-columns: minmax(0, 1fr); } [part='conversation'] { display: flex; min-inline-size: 0; min-block-size: 0; } [part='viewport'] { flex: 1 1 auto; min-inline-size: 0; min-block-size: 0; } [part~='messages'] { display: block; min-inline-size: 0; max-inline-size: 100%; margin-block-end: var(--lr-space-m); } slot[name='messages']::slotted(*) { display: block; min-inline-size: 0; max-inline-size: 100%; margin-block-end: var(--lr-space-m); } slot[name='messages']::slotted([hidden]:not([hidden='until-found' i])) { display: none; } [part='messages-empty'] { margin-block: auto; } [part='details'] { min-inline-size: 0; min-block-size: 0; overflow: auto; padding: var(--lr-space-m); border-inline-start: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); background: var(--lr-color-surface-raised); } [part='details-content'] { display: flex; flex-direction: column; gap: var(--lr-space-l); min-inline-size: 0; } [part='section'] { display: flex; flex-direction: column; gap: var(--lr-space-s); min-inline-size: 0; } [part='section-heading'] { margin: 0; font-size: var(--lr-font-size-sm); font-weight: var(--lr-font-weight-semibold); } [part='section'] > * { min-inline-size: 0; } [part='composer'] { min-inline-size: 0; padding: var(--lr-space-s) var(--lr-space-m); border-block-start: var(--lr-border-width-thin) solid var(--lr-color-border); background: var(--lr-color-surface); } [part='composer-input'] { display: block; max-inline-size: var(--lr-size-48rem); margin-inline: auto; } @container (max-inline-size: 48rem) { [part='body'] { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); } [part='body'][data-details='true'] { grid-template-rows: minmax(0, 1fr) minmax(0, 45%); } [part='details'] { border-block-start: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); border-inline-start: 0; } } @container ${mediumContainerQuery} { [part='header'], [part='composer'] { padding-inline: var(--lr-space-s); } [part='details'] { padding: var(--lr-space-s); } } `;export{styles};
|
|
1
|
+
import{css}from"lit";import{mediumContainerQuery}from"../../../internal/container-breakpoints.styles.js";const styles=css` [part='input-limit'], [part='slices-limit'] { margin: 0; font-size: var(--lr-font-size-sm); color: var(--lr-color-text-quiet); overflow-wrap: anywhere; } [part='input-limit'] { flex-basis: 100%; } :host { display: block; min-inline-size: 0; min-block-size: 0; block-size: 100%; container-type: inline-size; contain-intrinsic-inline-size: var(--lr-size-20rem); } [part='base'] { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; min-inline-size: 0; min-block-size: 0; block-size: 100%; overflow: hidden; border: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); border-radius: var(--lr-radius); background: var(--lr-color-surface); color: var(--lr-color-text); } [part='header'] { display: flex; align-items: center; flex-wrap: wrap; gap: var(--lr-space-s); min-inline-size: 0; padding: var(--lr-space-s) var(--lr-space-m); border-block-end: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); } [part='heading'] { min-inline-size: 0; margin: 0; font-size: var(--lr-font-size-m); font-weight: var(--lr-font-weight-semibold); overflow-wrap: anywhere; } [part='header-actions']:where(:not([hidden])) { display: flex; align-items: center; flex-wrap: wrap; gap: var(--lr-space-xs); min-inline-size: 0; max-inline-size: 100%; margin-inline-start: auto; } slot[name='header-actions'] { display: block; min-inline-size: 0; max-inline-size: 100%; } slot[name='header-actions']::slotted(*) { min-inline-size: 0; max-inline-size: 100%; } [part='body'] { display: grid; grid-template-columns: minmax(0, 1fr) minmax(var(--lr-size-16rem), var(--lr-size-24rem)); min-inline-size: 0; min-block-size: 0; } [part='body'][data-details='false'] { grid-template-columns: minmax(0, 1fr); } [part='conversation'] { display: flex; min-inline-size: 0; min-block-size: 0; } [part='viewport'] { flex: 1 1 auto; min-inline-size: 0; min-block-size: 0; } [part~='messages'] { display: block; min-inline-size: 0; max-inline-size: 100%; margin-block-end: var(--lr-space-m); } slot[name='messages']::slotted(*) { display: block; min-inline-size: 0; max-inline-size: 100%; margin-block-end: var(--lr-space-m); } slot[name='messages']::slotted([hidden]:not([hidden='until-found' i])) { display: none; } [part='messages-empty'] { margin-block: auto; } [part='details'] { min-inline-size: 0; min-block-size: 0; overflow: auto; padding: var(--lr-space-m); border-inline-start: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); background: var(--lr-color-surface-raised); } [part='details-content'] { display: flex; flex-direction: column; gap: var(--lr-space-l); min-inline-size: 0; } [part='section'] { display: flex; flex-direction: column; gap: var(--lr-space-s); min-inline-size: 0; } [part='section-heading'] { margin: 0; font-size: var(--lr-font-size-sm); font-weight: var(--lr-font-weight-semibold); } [part='section'] > * { min-inline-size: 0; } [part='composer'] { min-inline-size: 0; padding: var(--lr-space-s) var(--lr-space-m); border-block-start: var(--lr-border-width-thin) solid var(--lr-color-border); background: var(--lr-color-surface); } [part='composer-input'] { display: block; max-inline-size: var(--lr-size-48rem); margin-inline: auto; } @container (max-inline-size: 48rem) { [part='body'] { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); } [part='body'][data-details='true'] { grid-template-rows: minmax(0, 1fr) minmax(0, 45%); } [part='details'] { border-block-start: var(--lr-border-width-thin) solid var(--lr-color-border-subtle); border-inline-start: 0; } } @container ${mediumContainerQuery} { [part='header'], [part='composer'] { padding-inline: var(--lr-space-s); } [part='details'] { padding: var(--lr-space-s); } } `;export{styles};
|
|
@@ -14,6 +14,10 @@ import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from
|
|
|
14
14
|
* own scroll container already has; a consumer's own rule or inline style setting
|
|
15
15
|
* `--lr-virtual-list-height` on the list still wins.
|
|
16
16
|
*
|
|
17
|
+
* A slotted virtual list retains its normal first-10,000 `.items` admission policy. Supply a
|
|
18
|
+
* bounded window of the newest messages in chronological order, or use its indexed `.source` for a long
|
|
19
|
+
* transcript; this viewport reads the list count without copying or capping that source.
|
|
20
|
+
*
|
|
17
21
|
* **Follow/release state machine.** While `follow` is engaged, content growth re-scrolls to the end.
|
|
18
22
|
* Release happens only on a *user-intent* gesture (wheel, touchmove, scrollbar-drag, or
|
|
19
23
|
* PageUp/ArrowUp/Home while the log region has focus) that leaves the view more than
|
|
@@ -40,6 +44,10 @@ import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from
|
|
|
40
44
|
* the boundary row at the viewport's bottom edge, hiding the unread content the jump is meant to
|
|
41
45
|
* reveal, not just changing how precisely it lands).
|
|
42
46
|
*
|
|
47
|
+
* Indexed transcript growth updates follow and unread counts even when physical scroll travel is
|
|
48
|
+
* capped. Refresh a mutated indexed source with the child list's `requestUpdate()`. Growth keeps
|
|
49
|
+
* user-released follow disengaged; reconnect reads the current count again.
|
|
50
|
+
*
|
|
43
51
|
* Renders no messages and computes no unread state itself -- the host supplies `unreadStartIndex`;
|
|
44
52
|
* no virtualization of its own (`<lr-virtual-list>`); not a generic overflow surface
|
|
45
53
|
* (`<lr-scroller>`); no message semantics (`<lr-chat-message>`).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{HostDescriptionController}from"../../../internal/aria-controls.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{finiteCount,finiteRange}from"../../../internal/numbers.js";import{styles}from"./chat-viewport.styles.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{composedAccessibilityText}from"../../../internal/accessibility-visibility.js";import{applyComposedFocusRepair,captureComposedFocusRepair,collectComposedFocusTargets}from"../../../internal/focus-navigation.js";import{LYRA_DEFAULT_chatViewportLabel,LYRA_DEFAULT_newMessages,LYRA_DEFAULT_newMessagesCount}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_jumpToLatest}from"../../../internal/default-strings/shared.generated.js";const virtualCount=list=>{const source=list.source??list.items;return Array.isArray(source)?source.length:finiteCount(source.count)};class LyraChatViewport extends LyraElement{constructor(){super(...arguments),this.hostDescription=new HostDescriptionController(this,()=>this.renderRoot.querySelector('[part="scroll"][role="log"]')),this.follow=!0,this.live="off",this.bottomThreshold=24,this.unreadStartIndex=null,this.accessibleLabel=null,this.unreadDividerTop=null,this.pendingUserIntent=!1,this.pendingUserIntentExpiryFrame=null,this.scrollbarDragActive=!1,this.isMounting=!0,this.announcements=new AnnouncementSinkController(this),this.growthFrame=null,this.armedMode=null,this.armGeneration=0,this.followFocusRepair=null,this.knownProjectedNodes=new WeakSet,this.messageElementsCache=null,this.markUserIntent=()=>{this.pendingUserIntent=!0,this.cancelPendingUserIntentExpiry();const owner=this.ownerDocument.defaultView;if(!owner){this.pendingUserIntent=!1;return}const firstFrame={owner,handle:0};firstFrame.handle=owner.requestAnimationFrame(()=>{if(this.pendingUserIntentExpiryFrame!==firstFrame)return;if(!this.isConnected||this.ownerDocument.defaultView!==owner){this.pendingUserIntentExpiryFrame=null,this.pendingUserIntent=!1;return}const secondFrame={owner,handle:0};secondFrame.handle=owner.requestAnimationFrame(()=>{this.pendingUserIntentExpiryFrame===secondFrame&&(this.pendingUserIntentExpiryFrame=null,this.pendingUserIntent=!1)}),this.pendingUserIntentExpiryFrame=secondFrame}),this.pendingUserIntentExpiryFrame=firstFrame},this.passiveIntent={handleEvent:()=>this.markUserIntent(),passive:!0},this.onPointerDown=event=>{const scroll=this.scrollEl;if(!scroll||event.button!==0||event.target!==scroll)return;const computed=getComputedStyle(scroll),borderLeft=Number.parseFloat(computed.borderLeftWidth)||0,borderRight=Number.parseFloat(computed.borderRightWidth)||0,gutter=scroll.offsetWidth-scroll.clientWidth-borderLeft-borderRight;if(gutter<=0)return;const rect=scroll.getBoundingClientRect();if(!(computed.direction==="rtl"?event.clientX<=rect.left+borderLeft+gutter:event.clientX>=rect.right-borderRight-gutter))return;this.scrollbarDragActive=!0;const owner=this.ownerDocument.defaultView;!owner||this.scrollbarDragWindow===owner||(this.releaseScrollbarDragListeners(),this.scrollbarDragWindow=owner,owner.addEventListener("pointerup",this.onPointerUp),owner.addEventListener("pointercancel",this.onPointerUp),owner.addEventListener("lostpointercapture",this.onPointerUp))},this.onPointerUp=()=>{this.scrollbarDragActive=!1,this.releaseScrollbarDragListeners()},this.onKeyDown=e=>{(e.key==="PageUp"||e.key==="ArrowUp"||e.key==="Home"||e.key===" "&&e.shiftKey)&&this.markUserIntent()},this.onScroll=()=>{const list=this.listenedVirtualList,el=list?list.scrollContainer:this.scrollEl;if(!el)return;if(el.scrollHeight-el.scrollTop-el.clientHeight<=this.effectiveBottomThreshold){this.clearUserIntent(),this.follow||(this.follow=!0);return}(this.consumeUserIntent()||this.scrollbarDragActive)&&this.follow&&(this.follow=!1)},this.onVirtualScroll=e=>{e.composedPath()[0]===this.listenedVirtualList&&this.onScroll()},this.onSlotChange=()=>{this.messageElementsCache=null,this.announceNewProjectedNodes();const wasVirtual=this.armedMode==="virtual";this.armObservers(),this.armedMode==="virtual"!==wasVirtual&&this.requestUpdate()},this.onContentMutations=records=>{this.scheduleGrowthTick();const sink=this.announcementSink;if(sink)for(const record of records)for(const node of record.addedNodes)this.knownProjectedNodes.has(node)||node instanceof Element&&node.hasAttribute("data-lr-chat-viewport-unread-boundary")||(this.knownProjectedNodes.add(node),node.parentNode===this&&this.announceProjectedNode(node,sink))}}static{this.defaultStrings={...super.defaultStrings,chatViewportLabel:LYRA_DEFAULT_chatViewportLabel,jumpToLatest:LYRA_DEFAULT_jumpToLatest,newMessages:LYRA_DEFAULT_newMessages,newMessagesCount:LYRA_DEFAULT_newMessagesCount}}static{this.styles=[LyraElement.styles,styles]}adoptedCallback(){super.adoptedCallback(),this.hostDescription.adopted(),this.announcements.adopted()}get announcementSink(){return this.announcements.setExclusiveChannel(this.livePoliteness),this.livePoliteness?this.announcements.current(this.livePoliteness):void 0}get livePoliteness(){return this.live==="polite"||this.live==="assertive"?this.live:void 0}get messageElements(){return this.messageElementsCache??=this.collectMessageElements()}collectMessageElements(){let elements=this.contentSlot?.assignedElements({flatten:!0})??Array.from(this.children);for(let depth=0;depth<4&&elements.some(element=>element.localName==="slot");depth++)elements=elements.flatMap(element=>element.localName==="slot"?element.assignedElements({flatten:!0}):[element]);return elements.filter(element=>!element.hasAttribute("data-lr-chat-viewport-unread-boundary"))}get virtualListEl(){const[only,...rest]=this.messageElements;return only&&rest.length===0&&"scrollToIndex"in only&&"scrollContainer"in only?only:null}get effectiveBottomThreshold(){return finiteRange(this.bottomThreshold,24,0)}get effectiveUnreadStartIndex(){return this.unreadStartIndex==null?null:finiteCount(this.unreadStartIndex)}connectedCallback(){super.connectedCallback(),this.announcements.setExclusiveChannel(this.livePoliteness),this.hasUpdated&&this.armObservers()}disconnectedCallback(){super.disconnectedCallback(),this.messageElementsCache=null,this.teardownObservers(),this.releaseScrollbarDragListeners(),this.clearUserIntent(),this.scrollbarDragActive=!1,this.followFocusRepair=null,this.unreadBoundaryEl?.remove(),this.unreadBoundaryEl=void 0}willUpdate(changed){if(super.willUpdate(changed),this.messageElementsCache=null,this.hasUpdated&&changed.has("follow")&&this.follow&&changed.get("follow")===!1){const pill=this.renderRoot.querySelector('[part="jump-pill"]');this.followFocusRepair=pill?captureComposedFocusRepair(pill,this.transcriptFocusOwner()):null}this.hasUpdated&&changed.has("unreadStartIndex")&&this.updateUnreadDividerPosition()}firstUpdated(changed){super.firstUpdated(changed),this.messageElementsCache=null,this.armObservers()}updated(changed){super.updated(changed),changed.has("live")&&this.announcements.setExclusiveChannel(this.livePoliteness),this.unreadBoundaryEl?.setAttribute("aria-label",this.localize("newMessages"));const wasMounting=this.isMounting;if(this.isMounting=!1,changed.has("follow")){if(this.follow){const behavior=wasMounting?"auto":this.pendingScrollBehavior??(prefersReducedMotion(this)?"auto":"smooth");this.pendingScrollBehavior=void 0,this.performScrollToEnd(behavior)}wasMounting||this.emit("lr-follow-change",{following:this.follow})}const focusRepair=this.followFocusRepair;this.followFocusRepair=null,focusRepair&&applyComposedFocusRepair(focusRepair)}transcriptFocusOwner(){const list=this.virtualListEl;return list?collectComposedFocusTargets(list,{includeRoot:!1,mode:"programmatic"}).elements[0]??null:this.scrollEl??null}scrollToBottom(options){const behavior=prefersReducedMotion(this)?"auto":options?.behavior??"smooth";this.follow?this.performScrollToEnd(behavior):(this.pendingScrollBehavior=behavior,this.follow=!0)}scrollToUnread(options){const unreadStartIndex=this.effectiveUnreadStartIndex;if(unreadStartIndex==null)return!1;this.messageElementsCache=null;const behavior=prefersReducedMotion(this)?"auto":options?.behavior??"smooth",list=this.virtualListEl;if(list)return unreadStartIndex>=virtualCount(list)?!1:(list.scrollToIndex(unreadStartIndex,{align:"start",behavior}),!0);const scrollEl=this.scrollEl;return!scrollEl||this.unreadDividerTop==null?!1:(scrollEl.scrollTo({top:this.unreadDividerTop,behavior}),!0)}performScrollToEnd(behavior){const list=this.listenedVirtualList;if(list){const count=virtualCount(list);count>0&&list.scrollToIndex(count-1,{align:"end",behavior});return}const el=this.scrollEl;el&&el.scrollTo({top:el.scrollHeight,behavior})}get totalCount(){const list=this.listenedVirtualList;return list?virtualCount(list):this.messageElements.length}get unreadCount(){const unreadStartIndex=this.effectiveUnreadStartIndex;return unreadStartIndex==null?0:Math.max(0,this.totalCount-unreadStartIndex)}pillLabel(){const count=this.unreadCount;return count<=0?this.localize("jumpToLatest"):this.localize("newMessagesCount",void 0,{count:getNumberFormat(this.effectiveLocale).format(count),pluralCount:count})}updateUnreadDividerPosition(){const unreadStartIndex=this.effectiveUnreadStartIndex;if(this.listenedVirtualList||unreadStartIndex==null){this.unreadDividerTop=null,this.syncSemanticUnreadBoundary();return}const content=this.contentEl,target=this.messageElements[unreadStartIndex];if(!target||!content){this.unreadDividerTop=null,this.syncSemanticUnreadBoundary();return}this.syncSemanticUnreadBoundary(target),this.unreadDividerTop=target.getBoundingClientRect().top-content.getBoundingClientRect().top}syncSemanticUnreadBoundary(target){if(!target||this.listenedVirtualList){this.unreadBoundaryEl?.remove(),this.unreadBoundaryEl=void 0;return}const parent=target.parentNode;if(!parent)return;const boundary=this.unreadBoundaryEl??this.ownerDocument.createElement("div");boundary.setAttribute("data-lr-chat-viewport-unread-boundary",""),boundary.setAttribute("role","separator"),boundary.setAttribute("aria-label",this.localize("newMessages"));const targetSlot=target.getAttribute("slot");targetSlot===null?boundary.removeAttribute("slot"):boundary.setAttribute("slot",targetSlot),(boundary.parentNode!==parent||boundary.nextSibling!==target)&&parent.insertBefore(boundary,target),this.unreadBoundaryEl=boundary,this.knownProjectedNodes.add(boundary)}cancelPendingUserIntentExpiry(){const frame=this.pendingUserIntentExpiryFrame;frame&&frame.owner.cancelAnimationFrame(frame.handle),this.pendingUserIntentExpiryFrame=null}clearUserIntent(){this.pendingUserIntent=!1,this.cancelPendingUserIntentExpiry()}consumeUserIntent(){const wasPending=this.pendingUserIntent;return this.clearUserIntent(),wasPending}releaseScrollbarDragListeners(){const owner=this.scrollbarDragWindow;owner&&(owner.removeEventListener("pointerup",this.onPointerUp),owner.removeEventListener("pointercancel",this.onPointerUp),owner.removeEventListener("lostpointercapture",this.onPointerUp),this.scrollbarDragWindow=void 0)}scheduleGrowthTick(){if(this.growthFrame)return;const owner=this.ownerDocument.defaultView;if(!owner)return;const frame={owner,handle:0};frame.handle=owner.requestAnimationFrame(()=>{this.growthFrame===frame&&(this.growthFrame=null,!(!this.isConnected||this.ownerDocument.defaultView!==owner)&&(this.updateUnreadDividerPosition(),this.follow&&this.performScrollToEnd("auto")))}),this.growthFrame=frame}announcementTextFor(node){const primary=composedAccessibilityText(node);if(node.nodeType!==Node.ELEMENT_NODE||!node.shadowRoot)return primary;const content=composedAccessibilityText(node.childNodes),normalizedPrimary=primary.replace(/\s+/g," ").trim(),normalizedContent=content.replace(/\s+/g," ").trim();return!normalizedContent||normalizedPrimary.includes(normalizedContent)?primary:primary?`${primary} ${content}`:content}announceProjectedNode(node,sink){const text=this.announcementTextFor(node).replace(/\s+/g," ").trim();if(text){sink.announce(text);return}node.nodeType===Node.ELEMENT_NODE&&node.localName.includes("-")&&this.announceAfterRender(node)}async announceAfterRender(node){const registry=node.ownerDocument.defaultView?.customElements;!node.matches(":defined")&®istry&&!registry.get(node.localName)&&await registry.whenDefined(node.localName);try{const pending=node.updateComplete;if(pending===null||typeof pending!="object"&&typeof pending!="function"||typeof pending.then!="function")return;await pending}catch{return}const sink=this.announcementSink;if(!sink||!this.isConnected||node.parentNode!==this)return;const text=this.announcementTextFor(node).replace(/\s+/g," ").trim();text&&sink.announce(text)}announceNewProjectedNodes(){const sink=this.announcementSink;for(const node of this.messageElements)this.knownProjectedNodes.has(node)||(this.knownProjectedNodes.add(node),!(!sink||!this.hasUpdated)&&this.announceProjectedNode(node,sink))}armObservers(){const owner=this.ownerDocument.defaultView,list=this.virtualListEl,mode=list?"virtual":"slotted";for(const node of this.messageElements)this.knownProjectedNodes.add(node);if(this.observerWindow===owner&&this.armedMode===mode&&(mode==="slotted"||this.listenedVirtualList===list))return;this.teardownObservers(),this.observerWindow=owner??void 0,this.armedMode=mode;const generation=++this.armGeneration;if(list){this.listenedVirtualList=list,list.addEventListener("lr-virtual-scroll",this.onVirtualScroll);const MutationObserverCtor=owner?.MutationObserver;list.updateComplete.then(()=>{const spacer=list.scrollContainer?.querySelector('[part="spacer"]');if(!spacer||!MutationObserverCtor||generation!==this.armGeneration)return;const observer=new MutationObserverCtor(()=>{this.contentMutationObserver===observer&&this.scheduleGrowthTick()});this.contentMutationObserver=observer,observer.observe(spacer,{attributeFilter:["style"]}),this.follow&&this.performScrollToEnd("auto")})}else{const content=this.contentEl;if(content){let baselineSeen=!1;const ResizeObserverCtor=owner?.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{if(!(!this.isConnected||this.ownerDocument.defaultView!==owner||this.contentResizeObserver!==observer)){if(!baselineSeen){baselineSeen=!0;return}this.scheduleGrowthTick()}}),this.contentResizeObserver=observer,this.contentResizeObserver.observe(content)}}const MutationObserverCtor=owner?.MutationObserver;if(MutationObserverCtor){let observer;observer=new MutationObserverCtor(records=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.contentMutationObserver!==observer||this.onContentMutations(records)}),this.contentMutationObserver=observer,this.contentMutationObserver.observe(this,{childList:!0})}}const scrollEl=this.scrollEl;if(scrollEl){let baselineSeen=!1;const ResizeObserverCtor=owner?.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{if(!(!this.isConnected||this.ownerDocument.defaultView!==owner||this.scrollResizeObserver!==observer)){if(!baselineSeen){baselineSeen=!0;return}this.follow&&this.performScrollToEnd("auto")}}),this.scrollResizeObserver=observer,this.scrollResizeObserver.observe(scrollEl)}}queueMicrotask(()=>{!this.isConnected||generation!==this.armGeneration||this.updateUnreadDividerPosition()})}teardownObservers(){this.scrollResizeObserver?.disconnect(),this.scrollResizeObserver=void 0,this.contentResizeObserver?.disconnect(),this.contentResizeObserver=void 0,this.contentMutationObserver?.disconnect(),this.contentMutationObserver=void 0,this.listenedVirtualList?.removeEventListener("lr-virtual-scroll",this.onVirtualScroll),this.listenedVirtualList=void 0,this.observerWindow=void 0,this.armedMode=null,this.armGeneration++;const frame=this.growthFrame;frame&&frame.owner.cancelAnimationFrame(frame.handle),this.growthFrame=null}render(){const label=this.accessibleLabel??(this.label==null?this.localize("chatViewportLabel"):this.label),virtual=this.virtualListEl!==null;return html`
|
|
1
|
+
import{__decorate}from"tslib";import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{HostDescriptionController}from"../../../internal/aria-controls.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{finiteCount,finiteRange}from"../../../internal/numbers.js";import{styles}from"./chat-viewport.styles.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{composedAccessibilityText}from"../../../internal/accessibility-visibility.js";import{applyComposedFocusRepair,captureComposedFocusRepair,collectComposedFocusTargets}from"../../../internal/focus-navigation.js";import{LYRA_DEFAULT_chatViewportLabel,LYRA_DEFAULT_newMessages,LYRA_DEFAULT_newMessagesCount}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_jumpToLatest}from"../../../internal/default-strings/shared.generated.js";const virtualCount=list=>{const source=list.source??list.items;return Array.isArray(source)?source.length:finiteCount(source.count)};class LyraChatViewport extends LyraElement{constructor(){super(...arguments),this.hostDescription=new HostDescriptionController(this,()=>this.renderRoot.querySelector('[part="scroll"][role="log"]')),this.follow=!0,this.live="off",this.bottomThreshold=24,this.unreadStartIndex=null,this.accessibleLabel=null,this.unreadDividerTop=null,this.pendingUserIntent=!1,this.pendingUserIntentExpiryFrame=null,this.scrollbarDragActive=!1,this.isMounting=!0,this.announcements=new AnnouncementSinkController(this),this.growthFrame=null,this.armedMode=null,this.armGeneration=0,this.followFocusRepair=null,this.knownProjectedNodes=new WeakSet,this.messageElementsCache=null,this.markUserIntent=()=>{this.pendingUserIntent=!0,this.cancelPendingUserIntentExpiry();const owner=this.ownerDocument.defaultView;if(!owner){this.pendingUserIntent=!1;return}const firstFrame={owner,handle:0};firstFrame.handle=owner.requestAnimationFrame(()=>{if(this.pendingUserIntentExpiryFrame!==firstFrame)return;if(!this.isConnected||this.ownerDocument.defaultView!==owner){this.pendingUserIntentExpiryFrame=null,this.pendingUserIntent=!1;return}const secondFrame={owner,handle:0};secondFrame.handle=owner.requestAnimationFrame(()=>{this.pendingUserIntentExpiryFrame===secondFrame&&(this.pendingUserIntentExpiryFrame=null,this.pendingUserIntent=!1)}),this.pendingUserIntentExpiryFrame=secondFrame}),this.pendingUserIntentExpiryFrame=firstFrame},this.passiveIntent={handleEvent:()=>this.markUserIntent(),passive:!0},this.onPointerDown=event=>{const scroll=this.scrollEl;if(!scroll||event.button!==0||event.target!==scroll)return;const computed=getComputedStyle(scroll),borderLeft=Number.parseFloat(computed.borderLeftWidth)||0,borderRight=Number.parseFloat(computed.borderRightWidth)||0,gutter=scroll.offsetWidth-scroll.clientWidth-borderLeft-borderRight;if(gutter<=0)return;const rect=scroll.getBoundingClientRect();if(!(computed.direction==="rtl"?event.clientX<=rect.left+borderLeft+gutter:event.clientX>=rect.right-borderRight-gutter))return;this.scrollbarDragActive=!0;const owner=this.ownerDocument.defaultView;!owner||this.scrollbarDragWindow===owner||(this.releaseScrollbarDragListeners(),this.scrollbarDragWindow=owner,owner.addEventListener("pointerup",this.onPointerUp),owner.addEventListener("pointercancel",this.onPointerUp),owner.addEventListener("lostpointercapture",this.onPointerUp))},this.onPointerUp=()=>{this.scrollbarDragActive=!1,this.releaseScrollbarDragListeners()},this.onKeyDown=e=>{(e.key==="PageUp"||e.key==="ArrowUp"||e.key==="Home"||e.key===" "&&e.shiftKey)&&this.markUserIntent()},this.onScroll=()=>{const list=this.listenedVirtualList,el=list?list.scrollContainer:this.scrollEl;if(!el)return;if(el.scrollHeight-el.scrollTop-el.clientHeight<=this.effectiveBottomThreshold){this.clearUserIntent(),this.follow||(this.follow=!0);return}(this.consumeUserIntent()||this.scrollbarDragActive)&&this.follow&&(this.follow=!1)},this.onVirtualScroll=e=>{e.composedPath()[0]===this.listenedVirtualList&&this.onScroll()},this.onSlotChange=()=>{this.messageElementsCache=null,this.announceNewProjectedNodes();const wasVirtual=this.armedMode==="virtual";this.armObservers(),this.armedMode==="virtual"!==wasVirtual&&this.requestUpdate()},this.onContentMutations=records=>{this.scheduleGrowthTick();const sink=this.announcementSink;if(sink)for(const record of records)for(const node of record.addedNodes)this.knownProjectedNodes.has(node)||node instanceof Element&&node.hasAttribute("data-lr-chat-viewport-unread-boundary")||(this.knownProjectedNodes.add(node),node.parentNode===this&&this.announceProjectedNode(node,sink))}}static{this.defaultStrings={...super.defaultStrings,chatViewportLabel:LYRA_DEFAULT_chatViewportLabel,jumpToLatest:LYRA_DEFAULT_jumpToLatest,newMessages:LYRA_DEFAULT_newMessages,newMessagesCount:LYRA_DEFAULT_newMessagesCount}}static{this.styles=[LyraElement.styles,styles]}adoptedCallback(){super.adoptedCallback(),this.hostDescription.adopted(),this.announcements.adopted()}get announcementSink(){return this.announcements.setExclusiveChannel(this.livePoliteness),this.livePoliteness?this.announcements.current(this.livePoliteness):void 0}get livePoliteness(){return this.live==="polite"||this.live==="assertive"?this.live:void 0}get messageElements(){return this.messageElementsCache??=this.collectMessageElements()}collectMessageElements(){let elements=this.contentSlot?.assignedElements({flatten:!0})??Array.from(this.children);for(let depth=0;depth<4&&elements.some(element=>element.localName==="slot");depth++)elements=elements.flatMap(element=>element.localName==="slot"?element.assignedElements({flatten:!0}):[element]);return elements.filter(element=>!element.hasAttribute("data-lr-chat-viewport-unread-boundary"))}get virtualListEl(){const[only,...rest]=this.messageElements;return only&&rest.length===0&&"scrollToIndex"in only&&"scrollContainer"in only?only:null}get effectiveBottomThreshold(){return finiteRange(this.bottomThreshold,24,0)}get effectiveUnreadStartIndex(){return this.unreadStartIndex==null?null:finiteCount(this.unreadStartIndex)}connectedCallback(){super.connectedCallback(),this.announcements.setExclusiveChannel(this.livePoliteness),this.hasUpdated&&this.armObservers()}disconnectedCallback(){super.disconnectedCallback(),this.messageElementsCache=null,this.teardownObservers(),this.releaseScrollbarDragListeners(),this.clearUserIntent(),this.scrollbarDragActive=!1,this.followFocusRepair=null,this.unreadBoundaryEl?.remove(),this.unreadBoundaryEl=void 0}willUpdate(changed){if(super.willUpdate(changed),this.messageElementsCache=null,this.hasUpdated&&changed.has("follow")&&this.follow&&changed.get("follow")===!1){const pill=this.renderRoot.querySelector('[part="jump-pill"]');this.followFocusRepair=pill?captureComposedFocusRepair(pill,this.transcriptFocusOwner()):null}this.hasUpdated&&changed.has("unreadStartIndex")&&this.updateUnreadDividerPosition()}firstUpdated(changed){super.firstUpdated(changed),this.messageElementsCache=null,this.armObservers()}updated(changed){super.updated(changed),changed.has("live")&&this.announcements.setExclusiveChannel(this.livePoliteness),this.unreadBoundaryEl?.setAttribute("aria-label",this.localize("newMessages"));const wasMounting=this.isMounting;if(this.isMounting=!1,changed.has("follow")){if(this.follow){const behavior=wasMounting?"auto":this.pendingScrollBehavior??(prefersReducedMotion(this)?"auto":"smooth");this.pendingScrollBehavior=void 0,this.performScrollToEnd(behavior)}wasMounting||this.emit("lr-follow-change",{following:this.follow})}const focusRepair=this.followFocusRepair;this.followFocusRepair=null,focusRepair&&applyComposedFocusRepair(focusRepair)}transcriptFocusOwner(){const list=this.virtualListEl;return list?collectComposedFocusTargets(list,{includeRoot:!1,mode:"programmatic"}).elements[0]??null:this.scrollEl??null}scrollToBottom(options){const behavior=prefersReducedMotion(this)?"auto":options?.behavior??"smooth";this.follow?this.performScrollToEnd(behavior):(this.pendingScrollBehavior=behavior,this.follow=!0)}scrollToUnread(options){const unreadStartIndex=this.effectiveUnreadStartIndex;if(unreadStartIndex==null)return!1;this.messageElementsCache=null;const behavior=prefersReducedMotion(this)?"auto":options?.behavior??"smooth",list=this.virtualListEl;if(list)return unreadStartIndex>=virtualCount(list)?!1:(list.scrollToIndex(unreadStartIndex,{align:"start",behavior}),!0);const scrollEl=this.scrollEl;return!scrollEl||this.unreadDividerTop==null?!1:(scrollEl.scrollTo({top:this.unreadDividerTop,behavior}),!0)}performScrollToEnd(behavior){const list=this.listenedVirtualList;if(list){const count=virtualCount(list);count>0&&list.scrollToIndex(count-1,{align:"end",behavior});return}const el=this.scrollEl;el&&el.scrollTo({top:el.scrollHeight,behavior})}get totalCount(){const list=this.listenedVirtualList;return list?virtualCount(list):this.messageElements.length}get unreadCount(){const unreadStartIndex=this.effectiveUnreadStartIndex;return unreadStartIndex==null?0:Math.max(0,this.totalCount-unreadStartIndex)}pillLabel(){const count=this.unreadCount;return count<=0?this.localize("jumpToLatest"):this.localize("newMessagesCount",void 0,{count:getNumberFormat(this.effectiveLocale).format(count),pluralCount:count})}updateUnreadDividerPosition(){const unreadStartIndex=this.effectiveUnreadStartIndex;if(this.listenedVirtualList||unreadStartIndex==null){this.unreadDividerTop=null,this.syncSemanticUnreadBoundary();return}const content=this.contentEl,target=this.messageElements[unreadStartIndex];if(!target||!content){this.unreadDividerTop=null,this.syncSemanticUnreadBoundary();return}this.syncSemanticUnreadBoundary(target),this.unreadDividerTop=target.getBoundingClientRect().top-content.getBoundingClientRect().top}syncSemanticUnreadBoundary(target){if(!target||this.listenedVirtualList){this.unreadBoundaryEl?.remove(),this.unreadBoundaryEl=void 0;return}const parent=target.parentNode;if(!parent)return;const boundary=this.unreadBoundaryEl??this.ownerDocument.createElement("div");boundary.setAttribute("data-lr-chat-viewport-unread-boundary",""),boundary.setAttribute("role","separator"),boundary.setAttribute("aria-label",this.localize("newMessages"));const targetSlot=target.getAttribute("slot");targetSlot===null?boundary.removeAttribute("slot"):boundary.setAttribute("slot",targetSlot),(boundary.parentNode!==parent||boundary.nextSibling!==target)&&parent.insertBefore(boundary,target),this.unreadBoundaryEl=boundary,this.knownProjectedNodes.add(boundary)}cancelPendingUserIntentExpiry(){const frame=this.pendingUserIntentExpiryFrame;frame&&frame.owner.cancelAnimationFrame(frame.handle),this.pendingUserIntentExpiryFrame=null}clearUserIntent(){this.pendingUserIntent=!1,this.cancelPendingUserIntentExpiry()}consumeUserIntent(){const wasPending=this.pendingUserIntent;return this.clearUserIntent(),wasPending}releaseScrollbarDragListeners(){const owner=this.scrollbarDragWindow;owner&&(owner.removeEventListener("pointerup",this.onPointerUp),owner.removeEventListener("pointercancel",this.onPointerUp),owner.removeEventListener("lostpointercapture",this.onPointerUp),this.scrollbarDragWindow=void 0)}scheduleGrowthTick(){if(this.growthFrame)return;const owner=this.ownerDocument.defaultView;if(!owner)return;const frame={owner,handle:0};frame.handle=owner.requestAnimationFrame(()=>{this.growthFrame===frame&&(this.growthFrame=null,!(!this.isConnected||this.ownerDocument.defaultView!==owner)&&(this.updateUnreadDividerPosition(),this.follow&&this.performScrollToEnd("auto"),this.requestUpdate()))}),this.growthFrame=frame}announcementTextFor(node){const primary=composedAccessibilityText(node);if(node.nodeType!==Node.ELEMENT_NODE||!node.shadowRoot)return primary;const content=composedAccessibilityText(node.childNodes),normalizedPrimary=primary.replace(/\s+/g," ").trim(),normalizedContent=content.replace(/\s+/g," ").trim();return!normalizedContent||normalizedPrimary.includes(normalizedContent)?primary:primary?`${primary} ${content}`:content}announceProjectedNode(node,sink){const text=this.announcementTextFor(node).replace(/\s+/g," ").trim();if(text){sink.announce(text);return}node.nodeType===Node.ELEMENT_NODE&&node.localName.includes("-")&&this.announceAfterRender(node)}async announceAfterRender(node){const registry=node.ownerDocument.defaultView?.customElements;!node.matches(":defined")&®istry&&!registry.get(node.localName)&&await registry.whenDefined(node.localName);try{const pending=node.updateComplete;if(pending===null||typeof pending!="object"&&typeof pending!="function"||typeof pending.then!="function")return;await pending}catch{return}const sink=this.announcementSink;if(!sink||!this.isConnected||node.parentNode!==this)return;const text=this.announcementTextFor(node).replace(/\s+/g," ").trim();text&&sink.announce(text)}announceNewProjectedNodes(){const sink=this.announcementSink;for(const node of this.messageElements)this.knownProjectedNodes.has(node)||(this.knownProjectedNodes.add(node),!(!sink||!this.hasUpdated)&&this.announceProjectedNode(node,sink))}armObservers(){const owner=this.ownerDocument.defaultView,list=this.virtualListEl,mode=list?"virtual":"slotted";if(this.observerWindow===owner&&this.armedMode===mode&&(mode==="slotted"||this.listenedVirtualList===list))return;for(const node of this.messageElements)this.knownProjectedNodes.add(node);this.teardownObservers(),this.observerWindow=owner??void 0,this.armedMode=mode;const generation=++this.armGeneration;if(list){this.listenedVirtualList=list,list.addEventListener("lr-virtual-scroll",this.onVirtualScroll);const MutationObserverCtor=owner?.MutationObserver;list.updateComplete.then(()=>{const spacer=list.scrollContainer?.querySelector('[part="spacer"]');if(!spacer||!MutationObserverCtor||generation!==this.armGeneration)return;const observer=new MutationObserverCtor(()=>{this.contentMutationObserver===observer&&this.scheduleGrowthTick()});this.contentMutationObserver=observer,observer.observe(spacer,{attributeFilter:["style","data-item-count"]}),this.requestUpdate(),this.follow&&this.performScrollToEnd("auto")})}else{const content=this.contentEl;if(content){let baselineSeen=!1;const ResizeObserverCtor=owner?.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{if(!(!this.isConnected||this.ownerDocument.defaultView!==owner||this.contentResizeObserver!==observer)){if(!baselineSeen){baselineSeen=!0;return}this.scheduleGrowthTick()}}),this.contentResizeObserver=observer,this.contentResizeObserver.observe(content)}}const MutationObserverCtor=owner?.MutationObserver;if(MutationObserverCtor){let observer;observer=new MutationObserverCtor(records=>{!this.isConnected||this.ownerDocument.defaultView!==owner||this.contentMutationObserver!==observer||this.onContentMutations(records)}),this.contentMutationObserver=observer,this.contentMutationObserver.observe(this,{childList:!0})}}const scrollEl=this.scrollEl;if(scrollEl){let baselineSeen=!1;const ResizeObserverCtor=owner?.ResizeObserver;if(ResizeObserverCtor){let observer;observer=new ResizeObserverCtor(()=>{if(!(!this.isConnected||this.ownerDocument.defaultView!==owner||this.scrollResizeObserver!==observer)){if(!baselineSeen){baselineSeen=!0;return}this.follow&&this.performScrollToEnd("auto")}}),this.scrollResizeObserver=observer,this.scrollResizeObserver.observe(scrollEl)}}queueMicrotask(()=>{!this.isConnected||generation!==this.armGeneration||this.updateUnreadDividerPosition()})}teardownObservers(){this.scrollResizeObserver?.disconnect(),this.scrollResizeObserver=void 0,this.contentResizeObserver?.disconnect(),this.contentResizeObserver=void 0,this.contentMutationObserver?.disconnect(),this.contentMutationObserver=void 0,this.listenedVirtualList?.removeEventListener("lr-virtual-scroll",this.onVirtualScroll),this.listenedVirtualList=void 0,this.observerWindow=void 0,this.armedMode=null,this.armGeneration++;const frame=this.growthFrame;frame&&frame.owner.cancelAnimationFrame(frame.handle),this.growthFrame=null}render(){const label=this.accessibleLabel??(this.label==null?this.localize("chatViewportLabel"):this.label),virtual=this.virtualListEl!==null;return html`
|
|
2
2
|
<div part="base" ?data-virtual=${virtual}>
|
|
3
3
|
<div
|
|
4
4
|
part="scroll"
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import type{PropertyValues,TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{LyraHighlight,LyraAnchor,TextSelectRect}from'../../viewers/document-viewer/anchors.js';import
|
|
1
|
+
import type{PropertyValues,TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{LyraHighlight,LyraAnchor,TextSelectRect}from'../../viewers/document-viewer/anchors.js';import{type ShikiHighlighter}from'./shiki-types.js';import{CodeBlockHeaderActionsController,CodeBlockInteractionController}from'./code-block-shared.js';import type{LyraClipboardWriteFailure,LyraClipboardWriteSuccess}from'../../../internal/clipboard.js';import type{LyraCodeBlockCopyAppearance,LyraCodeBlockToggleDetail}from'./code-block-shared.js';
|
|
2
2
|
/** Shared event contract retained by both public event-map names. */
|
|
3
3
|
export interface LyraCodeBlockBaseEventMap{'lr-copy':CustomEvent<LyraClipboardWriteSuccess>;'lr-error':CustomEvent<null>;'lr-copy-error':CustomEvent<LyraClipboardWriteFailure>;'lr-toggle-request':CustomEvent<LyraCodeBlockToggleDetail>;'lr-toggle':CustomEvent<LyraCodeBlockToggleDetail>;'lr-line-activate':CustomEvent<{line:number;}>;'lr-text-select':CustomEvent<{readonly text:string;readonly anchor:LyraAnchor;readonly rects:readonly TextSelectRect[];}>;}
|
|
4
4
|
/** Owns the shared behavior and template for the regular and build-lean code blocks.
|
|
5
5
|
* Subclasses supply their optional-peer loading policy and retain decorated public properties. */
|
|
6
|
-
export declare abstract class LyraCodeBlockBase extends LyraElement<LyraCodeBlockBaseEventMap>{protected static collectionSupport:import("../../../internal/lyra-element.js").LyraCollectionSupport;protected static readonly immutableEventDetails:readonly string[];abstract code:string;abstract language:string;abstract filename:string;abstract accessibleLabel:string|null;abstract collapsible:boolean;abstract collapsed:boolean;abstract withoutCopyButton:boolean;abstract copyAppearance:LyraCodeBlockCopyAppearance;abstract maxHeight:string;abstract lineNumbers:boolean;abstract highlightLines:string;abstract activatableLines:boolean;abstract get highlights():readonly LyraHighlight[];abstract set highlights(value:readonly LyraHighlight[]);abstract activeHighlightId:string|null;protected hasHeaderActions:boolean;protected focusedLine:number;protected highlightedHtml:string|null;protected shikiReady:boolean;protected justCopied:boolean;protected copyFailed:boolean;protected isDarkTheme:boolean;protected restoreFocusedLineAfterUpdate:boolean;protected highlightToken:number;protected readonly bodyId:string;protected readonly interactions:CodeBlockInteractionController;protected readonly headerActions:CodeBlockHeaderActionsController;constructor();connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;
|
|
6
|
+
export declare abstract class LyraCodeBlockBase extends LyraElement<LyraCodeBlockBaseEventMap>{protected static collectionSupport:import("../../../internal/lyra-element.js").LyraCollectionSupport;protected static readonly immutableEventDetails:readonly string[];abstract code:string;abstract language:string;abstract filename:string;abstract accessibleLabel:string|null;abstract collapsible:boolean;abstract collapsed:boolean;abstract withoutCopyButton:boolean;abstract copyAppearance:LyraCodeBlockCopyAppearance;abstract maxHeight:string;abstract lineNumbers:boolean;abstract highlightLines:string;abstract activatableLines:boolean;abstract get highlights():readonly LyraHighlight[];abstract set highlights(value:readonly LyraHighlight[]);abstract activeHighlightId:string|null;protected hasHeaderActions:boolean;protected focusedLine:number;protected highlightedHtml:string|null;protected shikiReady:boolean;protected justCopied:boolean;protected copyFailed:boolean;protected isDarkTheme:boolean;protected restoreFocusedLineAfterUpdate:boolean;protected highlightToken:number;private plainTemplate?;private plainKey;private countedCode?;private countedLines;private paintedCode?;private plainDomChanged;private paintedLines;private previousHighlighted;private previousActive;protected get highlightLimited():boolean;protected readonly bodyId:string;protected readonly interactions:CodeBlockInteractionController;protected readonly headerActions:CodeBlockHeaderActionsController;constructor();connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;
|
|
7
7
|
/** Resolves a `line-range` anchor (or a highlights id resolving to one) by scrolling the code
|
|
8
8
|
* body. */
|
|
9
9
|
scrollToAnchor(target:LyraAnchor|string):Promise<boolean>;
|
|
10
10
|
/** Recomputes Shiki palette selection after an imperative CSSOM theme change. */
|
|
11
|
-
refreshTheme():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;protected beforeHighlightUpdate(_changed:PropertyValues):void;protected abstract preSuppliedGrammar():unknown;
|
|
11
|
+
refreshTheme():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;protected beforeHighlightUpdate(_changed:PropertyValues):void;protected abstract preSuppliedGrammar():unknown;
|
|
12
|
+
/** Whether the active language has an explicitly supplied grammar or loader. */
|
|
13
|
+
protected hasPreSuppliedGrammar():boolean;protected abstract syncHighlight():void;protected abstract showsSkeleton():boolean;protected lineHighlightSet():Set<number>;protected activeHighlightLineSet():Set<number>;protected lineCount():number;protected tokenize(hl:ShikiHighlighter,lang:string):string|null;protected renderPlainCode():TemplateResult;private patchLineState;private cachedPlainCode;render():TemplateResult;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{CodeBlockHeaderActionsController,CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockLineHasFocus,codeBlockLineCount,codeBlockLineHighlightSet,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock}from"./code-block-shared.js";import{LYRA_DEFAULT_codeBlockLineLabel,LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_copied,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed}from"../../../internal/default-strings/shared.generated.js";class LyraCodeBlockBase extends LyraElement{static{this.defaultStrings={...super.defaultStrings,codeBlockLineLabel:LYRA_DEFAULT_codeBlockLineLabel,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}constructor(){super(),this.hasHeaderActions=!1,this.focusedLine=1,this.highlightedHtml=null,this.shikiReady=!1,this.justCopied=!1,this.copyFailed=!1,this.isDarkTheme=!1,this.restoreFocusedLineAfterUpdate=!1,this.highlightToken=0,this.bodyId=nextId("code-block-body"),this.interactions=new CodeBlockInteractionController({host:this,setFocusedLine:line=>{this.focusedLine=line},setJustCopied:value=>{this.justCopied=value},setCopyFailed:value=>{this.copyFailed=value},setDarkTheme:value=>{this.isDarkTheme=value},emitLineActivate:line=>this.emit("lr-line-activate",{line}),emitCopy:outcome=>this.emit("lr-copy",outcome),emitError:()=>this.emit("lr-error",null),emitCopyError:outcome=>this.emit("lr-copy-error",outcome),requestToggle:collapsed=>!this.emit("lr-toggle-request",{expanded:!collapsed},{cancelable:!0}).defaultPrevented,emitToggle:collapsed=>this.emit("lr-toggle",{expanded:!collapsed}),emitTextSelect:selection=>this.emit("lr-text-select",selection)}),this.headerActions=new CodeBlockHeaderActionsController({host:this,setHasHeaderActions:value=>{this.hasHeaderActions=value}}),new ThemeWatcher(this,()=>this.refreshTheme())}connectedCallback(){super.connectedCallback(),this.hasUpdated&&this.refreshTheme(),this.headerActions.observe()}disconnectedCallback(){this.highlightToken+=1,super.disconnectedCallback(),this.headerActions.disconnect(),this.interactions.disconnect(),this.highlightedHtml=null}adoptedCallback(){super.adoptedCallback(),this.interactions.disconnect()}async scrollToAnchor(target){return scrollCodeBlockToAnchor(this,target)}refreshTheme(){this.interactions.refreshTheme()}willUpdate(changed){super.willUpdate(changed),this.seedFirstRenderState(()=>this.refreshTheme()),this.headerActions.sync(),this.restoreFocusedLineAfterUpdate=codeBlockLineHasFocus(this),changed.has("code")&&(this.focusedLine=clampCodeBlockFocusedLine(this.focusedLine,this.lineCount())),this.beforeHighlightUpdate(changed),this.interactions.needsHighlightResync(changed,this.effectiveLocale,this.localize("codeBlockLineLabel"))&&(this.shikiReady||this.
|
|
1
|
+
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{SHIKI_SOURCE_MAX_CODE_UNITS}from"./shiki-types.js";import{CodeBlockHeaderActionsController,CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockLineHasFocus,codeBlockLineCount,codeBlockLineHighlightSet,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock}from"./code-block-shared.js";import{LYRA_DEFAULT_codeBlockHighlightLimit,LYRA_DEFAULT_codeBlockLineLabel,LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_copied,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed}from"../../../internal/default-strings/shared.generated.js";class LyraCodeBlockBase extends LyraElement{static{this.defaultStrings={...super.defaultStrings,codeBlockHighlightLimit:LYRA_DEFAULT_codeBlockHighlightLimit,codeBlockLineLabel:LYRA_DEFAULT_codeBlockLineLabel,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}get highlightLimited(){return(this.code??"").length>SHIKI_SOURCE_MAX_CODE_UNITS}constructor(){super(),this.hasHeaderActions=!1,this.focusedLine=1,this.highlightedHtml=null,this.shikiReady=!1,this.justCopied=!1,this.copyFailed=!1,this.isDarkTheme=!1,this.restoreFocusedLineAfterUpdate=!1,this.highlightToken=0,this.plainKey=[],this.countedLines=1,this.plainDomChanged=!1,this.paintedLines=new Map,this.previousHighlighted=new Set,this.previousActive=new Set,this.bodyId=nextId("code-block-body"),this.interactions=new CodeBlockInteractionController({host:this,setFocusedLine:line=>{this.focusedLine=line},setJustCopied:value=>{this.justCopied=value},setCopyFailed:value=>{this.copyFailed=value},setDarkTheme:value=>{this.isDarkTheme=value},emitLineActivate:line=>this.emit("lr-line-activate",{line}),emitCopy:outcome=>this.emit("lr-copy",outcome),emitError:()=>this.emit("lr-error",null),emitCopyError:outcome=>this.emit("lr-copy-error",outcome),requestToggle:collapsed=>!this.emit("lr-toggle-request",{expanded:!collapsed},{cancelable:!0}).defaultPrevented,emitToggle:collapsed=>this.emit("lr-toggle",{expanded:!collapsed}),emitTextSelect:selection=>this.emit("lr-text-select",selection)}),this.headerActions=new CodeBlockHeaderActionsController({host:this,setHasHeaderActions:value=>{this.hasHeaderActions=value}}),new ThemeWatcher(this,()=>this.refreshTheme())}connectedCallback(){super.connectedCallback(),this.hasUpdated&&this.refreshTheme(),this.headerActions.observe()}disconnectedCallback(){this.highlightToken+=1,super.disconnectedCallback(),this.headerActions.disconnect(),this.interactions.disconnect(),this.highlightedHtml=null}adoptedCallback(){super.adoptedCallback(),this.interactions.disconnect()}async scrollToAnchor(target){return scrollCodeBlockToAnchor(this,target)}refreshTheme(){this.interactions.refreshTheme()}willUpdate(changed){super.willUpdate(changed),this.seedFirstRenderState(()=>this.refreshTheme()),this.headerActions.sync(),this.restoreFocusedLineAfterUpdate=codeBlockLineHasFocus(this),changed.has("code")&&(this.plainTemplate=void 0,this.plainKey=[],this.focusedLine=clampCodeBlockFocusedLine(this.focusedLine,this.lineCount())),this.beforeHighlightUpdate(changed),this.interactions.needsHighlightResync(changed,this.effectiveLocale,this.localize("codeBlockLineLabel"))&&(this.highlightLimited?(this.highlightToken++,this.highlightedHtml=null):this.shikiReady||this.hasPreSuppliedGrammar()?this.syncHighlight():this.highlightedHtml=null)}updated(changed){super.updated(changed),applyCodeBlockAriaBusy(this,!this.highlightLimited&&this.showsSkeleton()),this.patchLineState(),this.interactions.syncLineButtons(this.focusedLine,this.plainDomChanged),this.plainDomChanged=!1,this.restoreFocusedLineAfterUpdate&&(restoreCodeBlockLineFocus(this,this.focusedLine),this.restoreFocusedLineAfterUpdate=!1)}beforeHighlightUpdate(_changed){}hasPreSuppliedGrammar(){return!!this.preSuppliedGrammar()}lineHighlightSet(){return codeBlockLineHighlightSet(this.highlightLines??"",this.highlights,this.lineCount())}activeHighlightLineSet(){return codeBlockActiveHighlightLineSet(this.highlights,this.activeHighlightId,this.lineCount())}lineCount(){const code=this.code??"";return code!==this.countedCode&&(this.countedCode=code,this.countedLines=codeBlockLineCount(code)),this.countedLines}tokenize(hl,lang){return this.highlightLimited?null:tokenizeCodeBlock(hl,{code:this.code??"",lang,lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line)})}renderPlainCode(){return renderCodeBlockPlainCode({code:this.code??"",lineNumbers:this.lineNumbers,activatableLines:this.activatableLines,focusedLine:this.focusedLine,highlightedLines:this.lineHighlightSet(),activeLines:this.activeHighlightLineSet(),localize:this.localize.bind(this),lineLabel:line=>this.localize("codeBlockLineLabel",void 0,{line:getNumberFormat(this.effectiveLocale).format(line)}),lineNumberText:line=>getNumberFormat(this.effectiveLocale).format(line),onLineActivate:line=>this.interactions.onLineActivate(line),onLineKeyDown:(event,line)=>this.interactions.onLineKeyDown(event,line)})}patchLineState(){const code=this.renderRoot.querySelector("code");if(code!==this.paintedCode||this.plainDomChanged){this.paintedCode=code,this.paintedLines.clear();for(const line of code?.querySelectorAll(".line[data-line]")??[])line.removeAttribute("data-highlighted"),line.removeAttribute("data-active"),line.part.remove("line-highlight"),this.paintedLines.set(Number(line.dataset.line),line)}const highlighted=this.lineHighlightSet(),active=this.activeHighlightLineSet(),changed=new Set([...this.previousHighlighted,...highlighted,...this.previousActive,...active]);for(const number of changed){const line=this.paintedLines.get(number);line&&(line.toggleAttribute("data-highlighted",highlighted.has(number)),line.toggleAttribute("data-active",active.has(number)),highlighted.has(number)?line.part.add("line-highlight"):line.part.remove("line-highlight"))}this.previousHighlighted=highlighted,this.previousActive=active}cachedPlainCode(){const key=[this.code,this.lineNumbers,this.activatableLines,this.effectiveLocale,this.localize("codeBlockLineLabel")];return(!this.plainTemplate||key.some((value,index)=>value!==this.plainKey[index]))&&(this.plainDomChanged=!0,this.plainKey=key,this.plainTemplate=this.renderPlainCode()),this.plainTemplate}render(){return renderCodeBlockShell({filename:this.filename,language:this.language,copyable:!this.withoutCopyButton,copyAppearance:this.copyAppearance,hasHeaderActions:this.hasHeaderActions,collapsible:this.collapsible,collapsed:this.collapsed,justCopied:this.justCopied,copyFailed:this.copyFailed,bodyId:this.bodyId,accessibleLabel:this.accessibleLabel,maxHeight:this.maxHeight,isDarkTheme:this.isDarkTheme,showSkeleton:!this.highlightLimited&&this.showsSkeleton(),highlightLimited:this.highlightLimited&&!!this.language,highlightedHtml:this.highlightedHtml,lineNumbers:this.lineNumbers,localize:this.localize.bind(this),renderPlainCode:()=>this.cachedPlainCode(),onToggle:this.interactions.toggleCollapsed,onCopy:this.interactions.copy,onBodyMouseUp:this.interactions.onBodyMouseUp,onBodyClick:this.interactions.onBodyClick,onBodyKeyDown:this.interactions.onBodyKeyDown,onBodyFocusIn:this.interactions.onBodyFocusIn})}}__decorate([state()],LyraCodeBlockBase.prototype,"hasHeaderActions",void 0),__decorate([state()],LyraCodeBlockBase.prototype,"highlightedHtml",void 0),__decorate([state()],LyraCodeBlockBase.prototype,"shikiReady",void 0),__decorate([state()],LyraCodeBlockBase.prototype,"justCopied",void 0),__decorate([state()],LyraCodeBlockBase.prototype,"copyFailed",void 0),__decorate([state()],LyraCodeBlockBase.prototype,"isDarkTheme",void 0);export{LyraCodeBlockBase};
|
|
@@ -87,6 +87,7 @@ import type{PropertyValues}from'lit';import{type ShikiLanguageSource}from'./shik
|
|
|
87
87
|
* `collapsed`.
|
|
88
88
|
* @csspart pre - The rendered `<pre>` — shiki's own in the highlighted path,
|
|
89
89
|
* this component's own plain one in the fallback path.
|
|
90
|
+
* @csspart limit - The localized notice when source exceeds the syntax-highlighting ceiling.
|
|
90
91
|
* @csspart code - The rendered `<code>`, same split as `pre` above.
|
|
91
92
|
* @csspart line-highlight - A line marked by `highlight-lines` or a `line-range` entry in
|
|
92
93
|
* `highlights`.
|
|
@@ -126,7 +127,9 @@ export declare class LyraCodeBlockCore extends LyraCodeBlockBase{protected stati
|
|
|
126
127
|
* in-place mutation of a caller's grammar object can never silently change what this instance
|
|
127
128
|
* has already handed to `loadShikiHighlighterCore()`. */
|
|
128
129
|
protected static readonly ownedCollectionProperties:readonly string[];static styles:import("lit").CSSResultGroup[];
|
|
129
|
-
/** The raw source text. Removing the attribute renders an empty code block.
|
|
130
|
+
/** The raw source text. Removing the attribute renders an empty code block. Source above
|
|
131
|
+
* 8,192 UTF-16 code units renders in full as plain text with a localized `limit` notice;
|
|
132
|
+
* the ceiling is checked before synchronous syntax tokenization. */
|
|
130
133
|
code:string;
|
|
131
134
|
/** A shiki-recognized language id or alias (e.g. `"javascript"`,
|
|
132
135
|
* `"python"`, `"json"`). When unset, or when it isn't a key in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{property}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{snapshotLyraHighlights}from"../../../internal/highlight-collection.js";import{ensureShikiLanguageLoaded,loadShikiHighlighterCore,normalizeShikiLanguage,resolvedShikiLanguages}from"./shiki-types.js";import{styles}from"./code-block.styles.js";import{LyraCodeBlockBase}from"./code-block-base.class.js";import{codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton}from"./code-block-shared.js";import"../../overlays/skeleton/skeleton.class.js";import{LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_copied,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed}from"../../../internal/default-strings/shared.generated.js";class LyraCodeBlockCore extends LyraCodeBlockBase{constructor(){super(...arguments),this.code="",this.language="",this.filename="",this.accessibleLabel=null,this.collapsible=!1,this.collapsed=!1,this.withoutCopyButton=!1,this.copyAppearance="text",this.maxHeight="",this.lineNumbers=!1,this.highlightLines="",this.activatableLines=!1,this._highlights=snapshotLyraHighlights([]),this.activeHighlightId=null,this.anchorKinds=["line-range"],this.languages={},this.highlighterGeneration=0}static{this.defaultStrings={...super.defaultStrings,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}static{this.ownedCollectionProperties=Object.freeze(["languages"])}static{this.styles=[LyraElement.styles,styles]}get highlights(){return this._highlights}set highlights(value){const previous=this._highlights;this._highlights=snapshotLyraHighlights(value),this.requestUpdate("highlights",previous)}connectedCallback(){super.connectedCallback();const languages=this.languages,generation=this.activateLanguages(languages);Object.keys(languages).length!==0&&loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(()=>{!this.isConnected||generation!==this.highlighterGeneration||languages!==this.languages||(this.shikiReady=!0,this.syncHighlight())})}disconnectedCallback(){super.disconnectedCallback(),this.activeLanguages=void 0,this.highlighterGeneration+=1,this.shikiReady=!1}preSuppliedGrammar(){return codeBlockPreSuppliedGrammar(this.languages,this.language??"")}beforeHighlightUpdate(changed){changed.has("languages")&&this.activateLanguages(this.languages)}async scrollToAnchor(target){return super.scrollToAnchor(target)}refreshTheme(){super.refreshTheme()}showsSkeleton(){return codeBlockShowsSkeleton(this.shikiReady,this.language,!!this.preSuppliedGrammar())}activateLanguages(languages){return this.activeLanguages===languages?this.highlighterGeneration:(this.activeLanguages=languages,this.highlighterGeneration+=1,this.highlightToken+=1,this.shikiReady=!1,this.highlightedHtml=null,this.highlighterGeneration)}syncHighlight(){const languages=this.languages,generation=this.activateLanguages(languages),token=++this.highlightToken,lang=normalizeShikiLanguage(this.language??"");if(!lang){this.highlightedHtml=null;return}const source=languages?.[lang]??languages?.[this.language];if(source===void 0){this.highlightedHtml=null;return}this.highlightedHtml=null,loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(async hl=>{if(token!==this.highlightToken||generation!==this.highlighterGeneration||languages!==this.languages)return;if(!hl){if(!this.isConnected)return;this.shikiReady=!0,this.highlightedHtml=null;return}const loaded=await ensureShikiLanguageLoaded(hl,lang,source);token===this.highlightToken&&(generation!==this.highlighterGeneration||languages!==this.languages||this.isConnected&&(this.shikiReady=!0,this.highlightedHtml=loaded?this.tokenize(hl,lang):null))})}}__decorate([property()],LyraCodeBlockCore.prototype,"code",void 0),__decorate([property()],LyraCodeBlockCore.prototype,"language",void 0),__decorate([property()],LyraCodeBlockCore.prototype,"filename",void 0),__decorate([property({attribute:"aria-label"})],LyraCodeBlockCore.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlockCore.prototype,"collapsible",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlockCore.prototype,"collapsed",void 0),__decorate([property({type:Boolean,attribute:"without-copy-button",reflect:!0})],LyraCodeBlockCore.prototype,"withoutCopyButton",void 0),__decorate([property({attribute:"copy-appearance",reflect:!0})],LyraCodeBlockCore.prototype,"copyAppearance",void 0),__decorate([property({attribute:"max-height"})],LyraCodeBlockCore.prototype,"maxHeight",void 0),__decorate([property({type:Boolean,attribute:"line-numbers",reflect:!0})],LyraCodeBlockCore.prototype,"lineNumbers",void 0),__decorate([property({attribute:"highlight-lines"})],LyraCodeBlockCore.prototype,"highlightLines",void 0),__decorate([property({type:Boolean,attribute:"activatable-lines"})],LyraCodeBlockCore.prototype,"activatableLines",void 0),__decorate([property({attribute:!1})],LyraCodeBlockCore.prototype,"highlights",null),__decorate([property({attribute:"active-highlight-id"})],LyraCodeBlockCore.prototype,"activeHighlightId",void 0),__decorate([property({attribute:!1})],LyraCodeBlockCore.prototype,"languages",void 0);export{LyraCodeBlockCore};
|
|
1
|
+
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{property}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{snapshotLyraHighlights}from"../../../internal/highlight-collection.js";import{ensureShikiLanguageLoaded,loadShikiHighlighterCore,normalizeShikiLanguage,resolvedShikiLanguages}from"./shiki-types.js";import{styles}from"./code-block.styles.js";import{LyraCodeBlockBase}from"./code-block-base.class.js";import{codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton}from"./code-block-shared.js";import"../../overlays/skeleton/skeleton.class.js";import{LYRA_DEFAULT_codeBlockHighlightLimit,LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_copied,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed}from"../../../internal/default-strings/shared.generated.js";class LyraCodeBlockCore extends LyraCodeBlockBase{constructor(){super(...arguments),this.code="",this.language="",this.filename="",this.accessibleLabel=null,this.collapsible=!1,this.collapsed=!1,this.withoutCopyButton=!1,this.copyAppearance="text",this.maxHeight="",this.lineNumbers=!1,this.highlightLines="",this.activatableLines=!1,this._highlights=snapshotLyraHighlights([]),this.activeHighlightId=null,this.anchorKinds=["line-range"],this.languages={},this.highlighterGeneration=0}static{this.defaultStrings={...super.defaultStrings,codeBlockHighlightLimit:LYRA_DEFAULT_codeBlockHighlightLimit,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}static{this.ownedCollectionProperties=Object.freeze(["languages"])}static{this.styles=[LyraElement.styles,styles]}get highlights(){return this._highlights}set highlights(value){const previous=this._highlights;this._highlights=snapshotLyraHighlights(value),this.requestUpdate("highlights",previous)}connectedCallback(){super.connectedCallback();const languages=this.languages,generation=this.activateLanguages(languages);Object.keys(languages).length!==0&&loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(()=>{!this.isConnected||generation!==this.highlighterGeneration||languages!==this.languages||(this.shikiReady=!0,this.syncHighlight())})}disconnectedCallback(){super.disconnectedCallback(),this.activeLanguages=void 0,this.highlighterGeneration+=1,this.shikiReady=!1}preSuppliedGrammar(){return codeBlockPreSuppliedGrammar(this.languages,this.language??"")}beforeHighlightUpdate(changed){changed.has("languages")&&this.activateLanguages(this.languages)}async scrollToAnchor(target){return super.scrollToAnchor(target)}refreshTheme(){super.refreshTheme()}showsSkeleton(){return codeBlockShowsSkeleton(this.shikiReady,this.language,!!this.preSuppliedGrammar())}activateLanguages(languages){return this.activeLanguages===languages?this.highlighterGeneration:(this.activeLanguages=languages,this.highlighterGeneration+=1,this.highlightToken+=1,this.shikiReady=!1,this.highlightedHtml=null,this.highlighterGeneration)}syncHighlight(){const languages=this.languages,generation=this.activateLanguages(languages),token=++this.highlightToken,lang=normalizeShikiLanguage(this.language??"");if(!lang||this.highlightLimited){this.highlightedHtml=null;return}const source=languages?.[lang]??languages?.[this.language];if(source===void 0){this.highlightedHtml=null;return}this.highlightedHtml=null,loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(async hl=>{if(token!==this.highlightToken||generation!==this.highlighterGeneration||languages!==this.languages)return;if(!hl){if(!this.isConnected)return;this.shikiReady=!0,this.highlightedHtml=null;return}const loaded=await ensureShikiLanguageLoaded(hl,lang,source);token===this.highlightToken&&(generation!==this.highlighterGeneration||languages!==this.languages||this.isConnected&&(this.shikiReady=!0,this.highlightedHtml=loaded?this.tokenize(hl,lang):null))})}}__decorate([property()],LyraCodeBlockCore.prototype,"code",void 0),__decorate([property()],LyraCodeBlockCore.prototype,"language",void 0),__decorate([property()],LyraCodeBlockCore.prototype,"filename",void 0),__decorate([property({attribute:"aria-label"})],LyraCodeBlockCore.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlockCore.prototype,"collapsible",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlockCore.prototype,"collapsed",void 0),__decorate([property({type:Boolean,attribute:"without-copy-button",reflect:!0})],LyraCodeBlockCore.prototype,"withoutCopyButton",void 0),__decorate([property({attribute:"copy-appearance",reflect:!0})],LyraCodeBlockCore.prototype,"copyAppearance",void 0),__decorate([property({attribute:"max-height"})],LyraCodeBlockCore.prototype,"maxHeight",void 0),__decorate([property({type:Boolean,attribute:"line-numbers",reflect:!0})],LyraCodeBlockCore.prototype,"lineNumbers",void 0),__decorate([property({attribute:"highlight-lines"})],LyraCodeBlockCore.prototype,"highlightLines",void 0),__decorate([property({type:Boolean,attribute:"activatable-lines"})],LyraCodeBlockCore.prototype,"activatableLines",void 0),__decorate([property({attribute:!1})],LyraCodeBlockCore.prototype,"highlights",null),__decorate([property({attribute:"active-highlight-id"})],LyraCodeBlockCore.prototype,"activeHighlightId",void 0),__decorate([property({attribute:!1})],LyraCodeBlockCore.prototype,"languages",void 0);export{LyraCodeBlockCore};
|
|
@@ -124,7 +124,7 @@ expanded:boolean;}export interface CodeBlockShellOptions{filename:string;languag
|
|
|
124
124
|
* a code block that has nothing else to put in it. */
|
|
125
125
|
hasHeaderActions:boolean;collapsible:boolean;collapsed:boolean;justCopied:boolean;copyFailed:boolean;bodyId:string;
|
|
126
126
|
/** Wins over the filename/language-derived default -- the host's own `aria-label`. */
|
|
127
|
-
accessibleLabel:string|null;maxHeight:string;isDarkTheme:boolean;showSkeleton:boolean;
|
|
127
|
+
accessibleLabel:string|null;maxHeight:string;isDarkTheme:boolean;showSkeleton:boolean;highlightLimited?:boolean;
|
|
128
128
|
/** shiki's own markup for this render, or `null` for the plain-text fallback path. */
|
|
129
129
|
highlightedHtml:string|null;lineNumbers:boolean;localize:LyraLocalizeFn;renderPlainCode:()=>TemplateResult;onToggle:()=>void;onCopy:()=>void;onBodyMouseUp:(e:MouseEvent)=>void;onBodyClick:(e:MouseEvent)=>void;onBodyKeyDown:(e:KeyboardEvent)=>void;onBodyFocusIn:(e:FocusEvent)=>void;}
|
|
130
130
|
/**
|
|
@@ -145,7 +145,7 @@ export declare function renderCodeBlockShell(options:CodeBlockShellOptions):Temp
|
|
|
145
145
|
* controller widens neither component's own API. */
|
|
146
146
|
interface CodeBlockInteractionHost extends HTMLElement{readonly renderRoot:HTMLElement|DocumentFragment;readonly updateComplete:Promise<boolean>;readonly code:string;collapsed:boolean;}
|
|
147
147
|
/** The reactive writes and event emissions the controller cannot perform itself: each component
|
|
148
|
-
* keeps `
|
|
148
|
+
* keeps `justCopied`/`isDarkTheme` as its own `@state()` and retains the focused line
|
|
149
149
|
* and its own typed `emit()`, and hands those in as callbacks. */
|
|
150
150
|
export interface CodeBlockInteractionOptions{host:CodeBlockInteractionHost;setFocusedLine:(line:number)=>void;setJustCopied:(value:boolean)=>void;setCopyFailed:(value:boolean)=>void;setDarkTheme:(value:boolean)=>void;emitLineActivate:(line:number)=>void;emitCopy:(outcome:LyraClipboardWriteSuccess)=>void;emitError:()=>void;emitCopyError:(outcome:LyraClipboardWriteFailure)=>void;requestToggle:(collapsed:boolean)=>boolean;emitToggle:(collapsed:boolean)=>void;emitTextSelect:(selection:CodeBlockSelection)=>void;}
|
|
151
151
|
/**
|
|
@@ -161,7 +161,7 @@ export interface CodeBlockInteractionOptions{host:CodeBlockInteractionHost;setFo
|
|
|
161
161
|
* rendered stay as each component's own `@state()`, written through the callbacks above so Lit
|
|
162
162
|
* still sees them change.
|
|
163
163
|
*/
|
|
164
|
-
export declare class CodeBlockInteractionController{private readonly options;private copyTimer?;private copyGeneration;private highlightedLocale?;private highlightedLineLabel?;
|
|
164
|
+
export declare class CodeBlockInteractionController{private readonly options;private copyTimer?;private copyGeneration;private lineButtons;private lineSource?;private focusedLine;private countedCode?;private countedLines;private highlightedLocale?;private highlightedLineLabel?;
|
|
165
165
|
/** Localized gutter markup is cached with the effective catalog label and number locale. */
|
|
166
166
|
needsHighlightResync(changed:PropertyValues,locale:string,lineLabel:string):boolean;constructor(options:CodeBlockInteractionOptions);
|
|
167
167
|
/** Re-resolves token colors after an imperative CSSOM/adopted-stylesheet theme change. */
|
|
@@ -172,7 +172,9 @@ cancelCopyTimer():void;
|
|
|
172
172
|
disconnect():void;private setCopyStatus;
|
|
173
173
|
/** Moves the roving tab stop to `line`, both in the component's state and on the rendered
|
|
174
174
|
* gutter buttons (which Lit will not have re-rendered yet). */
|
|
175
|
-
setFocusedLine(line:number):void;
|
|
175
|
+
setFocusedLine(line:number):void;
|
|
176
|
+
/** Rebuilds the gutter index only when the source DOM is replaced. */
|
|
177
|
+
syncLineButtons(focusedLine:number,force?:boolean):void;onLineActivate:(line:number)=>void;onLineKeyDown:(e:KeyboardEvent,line:number)=>void;onBodyClick:(e:MouseEvent)=>void;onBodyKeyDown:(e:KeyboardEvent)=>void;onBodyFocusIn:(e:FocusEvent)=>void;
|
|
176
178
|
/** Anchors a text selection ending inside `[part="body"]` to the `line-range` it spans, so a
|
|
177
179
|
* host can persist or otherwise act on it. Fires nothing when there's no active selection. */
|
|
178
180
|
onBodyMouseUp:()=>void;copy:()=>Promise<void>;toggleCollapsed:()=>void;}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{html,nothing}from"lit";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{activeElementIn,shadowFocusTarget}from"../../../internal/active-element.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{chevronIcon}from"../../../internal/icons.js";import{svg}from"lit";import{prefersReducedMotion}from"../../../internal/motion.js";import{styleMap}from"lit/directives/style-map.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{boundedSelectionRects,boundedSelectionText}from"../../../internal/text-quote.js";import{writeClipboardText}from"../../../internal/clipboard.js";import{normalizeShikiLanguage,SHIKI_THEMES}from"./shiki-types.js";import{COPY_FEEDBACK_MS}from"../../../internal/copy-feedback.js";import{resolveIsDarkTheme}from"./shiki-dark-theme.js";const INVALID_HIGHLIGHT_LINES_WARNING_KEY="lyra-code-block-invalid-highlight-lines",INVALID_HIGHLIGHT_LINES_WARNING="<lr-code-block> and <lr-code-block-core>: invalid highlight-lines entries are ignored; use one-based line numbers or ranges such as `3-5,7`.";function codeBlockToggleLabel(localize,collapsed){return localize(collapsed?"expandCode":"collapseCode")}function codeBlockCopyLabel(localize,justCopied,copyFailed){return localize(copyFailed?"copyFailed":justCopied?"copiedToClipboard":"copyCode")}function codeBlockBodyLabel(localize,filename,language){return filename||(language?localize("codeRegionWithLanguage",void 0,{language}):localize("codeRegion"))}function addBoundedLineRange(lines,start,end,maxLine){if(!Number.isFinite(start)||!Number.isFinite(end)||maxLine<1)return;const low=Math.max(1,Math.min(Math.trunc(start),Math.trunc(end))),high=Math.min(Math.trunc(maxLine),Math.max(Math.trunc(start),Math.trunc(end)));for(let line=low;line<=high;line++)lines.add(line)}const CODE_BLOCK_COPY_CONFIRM_MS=COPY_FEEDBACK_MS;function codeBlockLineCount(code){return code.split(/\r\n|\r|\n/).length}function clampCodeBlockFocusedLine(focusedLine,lineCount){return Math.min(Math.max(1,focusedLine),lineCount)}function codeBlockLineHasFocus(host){return shadowFocusTarget(host)?.matches('[data-line][part~="line-button"]')??!1}function restoreCodeBlockLineFocus(host,line){const shadowActive=shadowFocusTarget(host);if(shadowActive)return shadowActive.matches('[data-line][part~="line-button"]');const documentActive=activeElementIn(host.ownerDocument);if(documentActive&&documentActive!==host.ownerDocument.body&&documentActive!==host)return!1;const target=host.renderRoot.querySelector(`[data-line="${line}"][part~="line-button"]`);return target?.focus(),shadowFocusTarget(host)===target}function codeBlockLineHighlightSet(highlightLines,highlights,maxLine){const merged=parseHighlightLines(highlightLines,maxLine);if(!Array.isArray(highlights))return merged;for(const highlight of highlights){const anchor=lineRangeAnchor(highlight);if(!anchor)continue;const end=anchor.end??anchor.start;addBoundedLineRange(merged,anchor.start,end,maxLine)}return merged}function lineRangeAnchor(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const anchor=value.anchor;return anchor===null||typeof anchor!="object"||Array.isArray(anchor)?void 0:anchor.kind==="line-range"?anchor:void 0}catch{return}}function lineRangeAnchorById(highlights,id){if(Array.isArray(highlights))for(const highlight of highlights)try{if(highlight!==null&&typeof highlight=="object"&&highlight.id===id){const anchor=lineRangeAnchor(highlight);if(anchor)return anchor}}catch{}}function codeBlockActiveHighlightLineSet(highlights,activeHighlightId,maxLine){const result=new Set,anchor=lineRangeAnchorById(highlights,activeHighlightId);if(!anchor)return result;const end=anchor.end??anchor.start;return addBoundedLineRange(result,anchor.start,end,maxLine),result}function codeBlockPreSuppliedGrammar(languages,language){const normalized=normalizeShikiLanguage(language);return languages?.[normalized]??languages?.[language]}async function scrollCodeBlockToAnchor(host,target){const anchor=typeof target=="string"?lineRangeAnchorById(host.highlights,target):target;if(!anchor||anchor.kind!=="line-range"||anchor.start<1||anchor.start>codeBlockLineCount(host.code??""))return!1;await host.updateComplete;const body=host.renderRoot.querySelector('[part="body"]'),lineEl=host.renderRoot.querySelector(`[data-line="${anchor.start}"]`);if(!body||!lineEl)return!1;const offset=lineEl.offsetTop-body.clientHeight/2,reducedMotion=!body.ownerDocument.defaultView||prefersReducedMotion(body);return body.scrollTo({top:Math.max(0,offset),behavior:reducedMotion?"auto":"smooth"}),!0}function codeBlockEventLine(e){const target=e.composedPath()[0];if(typeof target!="object"||target===null||target.nodeType!==1||typeof target.localName!="string"||typeof target.closest!="function")return null;const lineElement=target.closest('[data-line][part~="line-button"]'),line=Number(lineElement?.dataset.line);return Number.isInteger(line)&&line>=1?line:null}function codeBlockLineKeyAction(key,line,total){if(key==="Enter"||key===" ")return{kind:"activate"};let next=null;return key==="ArrowDown"?next=Math.min(total,line+1):key==="ArrowUp"?next=Math.max(1,line-1):key==="Home"?next=1:key==="End"&&(next=total),next===null||next===line?null:{kind:"move",line:next}}function codeBlockSelectionAnchor(shadowRoot){if(!shadowRoot)return null;const ownerDocument=shadowRoot.ownerDocument,globalSelection=ownerDocument.defaultView?.getSelection();let range=null;if(globalSelection?.getComposedRanges){const[composed]=globalSelection.getComposedRanges({shadowRoots:[shadowRoot]});composed&&(composed.startContainer!==composed.endContainer||composed.startOffset!==composed.endOffset)&&(range=ownerDocument.createRange(),range.setStart(composed.startContainer,composed.startOffset),range.setEnd(composed.endContainer,composed.endOffset))}const selection=shadowRoot.getSelection?.()??globalSelection;if(!range){if(!selection||selection.isCollapsed||selection.rangeCount===0)return null;range=selection.getRangeAt(0)}const text=boundedSelectionText(range);if(!text)return null;const lineOf=node=>{const attr=(node.nodeType===Node.ELEMENT_NODE?node:node.parentElement)?.closest("[data-line]")?.getAttribute("data-line");return attr==null?null:Number(attr)},start=lineOf(range.startContainer),end=lineOf(range.endContainer);return start===null||end===null?null:{text,anchor:{kind:"line-range",start:Math.min(start,end),end:Math.max(start,end)},rects:boundedSelectionRects(range)}}function codeBlockNeedsHighlightResync(changed){return changed.has("code")||changed.has("language")||changed.has("languages")||changed.has("
|
|
1
|
+
import{SHIKI_SOURCE_MAX_CODE_UNITS}from"./shiki-types.js";import{html,nothing}from"lit";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{activeElementIn,shadowFocusTarget}from"../../../internal/active-element.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{chevronIcon}from"../../../internal/icons.js";import{svg}from"lit";import{prefersReducedMotion}from"../../../internal/motion.js";import{styleMap}from"lit/directives/style-map.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{boundedSelectionRects,boundedSelectionText}from"../../../internal/text-quote.js";import{writeClipboardText}from"../../../internal/clipboard.js";import{normalizeShikiLanguage,SHIKI_THEMES}from"./shiki-types.js";import{COPY_FEEDBACK_MS}from"../../../internal/copy-feedback.js";import{resolveIsDarkTheme}from"./shiki-dark-theme.js";const INVALID_HIGHLIGHT_LINES_WARNING_KEY="lyra-code-block-invalid-highlight-lines",INVALID_HIGHLIGHT_LINES_WARNING="<lr-code-block> and <lr-code-block-core>: invalid highlight-lines entries are ignored; use one-based line numbers or ranges such as `3-5,7`.";function codeBlockToggleLabel(localize,collapsed){return localize(collapsed?"expandCode":"collapseCode")}function codeBlockCopyLabel(localize,justCopied,copyFailed){return localize(copyFailed?"copyFailed":justCopied?"copiedToClipboard":"copyCode")}function codeBlockBodyLabel(localize,filename,language){return filename||(language?localize("codeRegionWithLanguage",void 0,{language}):localize("codeRegion"))}function addBoundedLineRange(lines,start,end,maxLine){if(!Number.isFinite(start)||!Number.isFinite(end)||maxLine<1)return;const low=Math.max(1,Math.min(Math.trunc(start),Math.trunc(end))),high=Math.min(Math.trunc(maxLine),Math.max(Math.trunc(start),Math.trunc(end)));for(let line=low;line<=high;line++)lines.add(line)}const CODE_BLOCK_COPY_CONFIRM_MS=COPY_FEEDBACK_MS;function codeBlockLineCount(code){return code.split(/\r\n|\r|\n/).length}function clampCodeBlockFocusedLine(focusedLine,lineCount){return Math.min(Math.max(1,focusedLine),lineCount)}function codeBlockLineHasFocus(host){return shadowFocusTarget(host)?.matches('[data-line][part~="line-button"]')??!1}function restoreCodeBlockLineFocus(host,line){const shadowActive=shadowFocusTarget(host);if(shadowActive)return shadowActive.matches('[data-line][part~="line-button"]');const documentActive=activeElementIn(host.ownerDocument);if(documentActive&&documentActive!==host.ownerDocument.body&&documentActive!==host)return!1;const target=host.renderRoot.querySelector(`[data-line="${line}"][part~="line-button"]`);return target?.focus(),shadowFocusTarget(host)===target}function codeBlockLineHighlightSet(highlightLines,highlights,maxLine){const merged=parseHighlightLines(highlightLines,maxLine);if(!Array.isArray(highlights))return merged;for(const highlight of highlights){const anchor=lineRangeAnchor(highlight);if(!anchor)continue;const end=anchor.end??anchor.start;addBoundedLineRange(merged,anchor.start,end,maxLine)}return merged}function lineRangeAnchor(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const anchor=value.anchor;return anchor===null||typeof anchor!="object"||Array.isArray(anchor)?void 0:anchor.kind==="line-range"?anchor:void 0}catch{return}}function lineRangeAnchorById(highlights,id){if(Array.isArray(highlights))for(const highlight of highlights)try{if(highlight!==null&&typeof highlight=="object"&&highlight.id===id){const anchor=lineRangeAnchor(highlight);if(anchor)return anchor}}catch{}}function codeBlockActiveHighlightLineSet(highlights,activeHighlightId,maxLine){const result=new Set,anchor=lineRangeAnchorById(highlights,activeHighlightId);if(!anchor)return result;const end=anchor.end??anchor.start;return addBoundedLineRange(result,anchor.start,end,maxLine),result}function codeBlockPreSuppliedGrammar(languages,language){const normalized=normalizeShikiLanguage(language);return languages?.[normalized]??languages?.[language]}async function scrollCodeBlockToAnchor(host,target){const anchor=typeof target=="string"?lineRangeAnchorById(host.highlights,target):target;if(!anchor||anchor.kind!=="line-range"||anchor.start<1||anchor.start>codeBlockLineCount(host.code??""))return!1;await host.updateComplete;const body=host.renderRoot.querySelector('[part="body"]'),lineEl=host.renderRoot.querySelector(`[data-line="${anchor.start}"]`);if(!body||!lineEl)return!1;const offset=lineEl.offsetTop-body.clientHeight/2,reducedMotion=!body.ownerDocument.defaultView||prefersReducedMotion(body);return body.scrollTo({top:Math.max(0,offset),behavior:reducedMotion?"auto":"smooth"}),!0}function codeBlockEventLine(e){const target=e.composedPath()[0];if(typeof target!="object"||target===null||target.nodeType!==1||typeof target.localName!="string"||typeof target.closest!="function")return null;const lineElement=target.closest('[data-line][part~="line-button"]'),line=Number(lineElement?.dataset.line);return Number.isInteger(line)&&line>=1?line:null}function codeBlockLineKeyAction(key,line,total){if(key==="Enter"||key===" ")return{kind:"activate"};let next=null;return key==="ArrowDown"?next=Math.min(total,line+1):key==="ArrowUp"?next=Math.max(1,line-1):key==="Home"?next=1:key==="End"&&(next=total),next===null||next===line?null:{kind:"move",line:next}}function codeBlockSelectionAnchor(shadowRoot){if(!shadowRoot)return null;const ownerDocument=shadowRoot.ownerDocument,globalSelection=ownerDocument.defaultView?.getSelection();let range=null;if(globalSelection?.getComposedRanges){const[composed]=globalSelection.getComposedRanges({shadowRoots:[shadowRoot]});composed&&(composed.startContainer!==composed.endContainer||composed.startOffset!==composed.endOffset)&&(range=ownerDocument.createRange(),range.setStart(composed.startContainer,composed.startOffset),range.setEnd(composed.endContainer,composed.endOffset))}const selection=shadowRoot.getSelection?.()??globalSelection;if(!range){if(!selection||selection.isCollapsed||selection.rangeCount===0)return null;range=selection.getRangeAt(0)}const text=boundedSelectionText(range);if(!text)return null;const lineOf=node=>{const attr=(node.nodeType===Node.ELEMENT_NODE?node:node.parentElement)?.closest("[data-line]")?.getAttribute("data-line");return attr==null?null:Number(attr)},start=lineOf(range.startContainer),end=lineOf(range.endContainer);return start===null||end===null?null:{text,anchor:{kind:"line-range",start:Math.min(start,end),end:Math.max(start,end)},rects:boundedSelectionRects(range)}}function codeBlockNeedsHighlightResync(changed){return changed.has("code")||changed.has("language")||changed.has("languages")||changed.has("languageLoaders")||changed.has("lineNumbers")||changed.has("activatableLines")}function codeBlockShowsSkeleton(shikiReady,language,loaderPending){return!shikiReady&&!!language&&loaderPending}function applyCodeBlockAriaBusy(host,showingSkeleton){showingSkeleton?host.setAttribute("aria-busy","true"):host.removeAttribute("aria-busy")}function tokenizeCodeBlock(hl,options){if(options.code.length>SHIKI_SOURCE_MAX_CODE_UNITS)return null;try{return hl.codeToHtml(options.code,{lang:options.lang,themes:SHIKI_THEMES,transformers:[codeBlockLineTransformer(options)]})}catch{return null}}function parseHighlightLines(spec,maxLine=Number.MAX_SAFE_INTEGER){const lines=new Set;for(const raw of spec.split(",")){const segment=raw.trim();if(!segment)continue;const rangeMatch=/^(\d+)\s*-\s*(\d+)$/.exec(segment);if(rangeMatch){const a=Number(rangeMatch[1]),b=Number(rangeMatch[2]);addBoundedLineRange(lines,a,b,maxLine);continue}const single=/^(\d+)$/.exec(segment);if(single){addBoundedLineRange(lines,Number(single[1]),Number(single[1]),maxLine);continue}devWarnOnce(INVALID_HIGHLIGHT_LINES_WARNING_KEY,INVALID_HIGHLIGHT_LINES_WARNING)}return lines}function codeBlockLineTransformer(options){return{name:"lr-code-block-parts",pre(node){if(node.properties.part=["pre"],options.lineNumbers){const classValue=node.properties.class,classes=Array.isArray(classValue)?classValue.map(String):classValue?[String(classValue)]:[];node.properties.class=[...classes,"line-numbers"]}delete node.properties.tabindex},code(node){node.properties.part=["code"]},line(node,line){node.properties["data-line"]=String(line);const parts=[],contentNode=node,children=contentNode.children??[];contentNode.children=children;let gutter;options.activatableLines&&options.lineNumbers?gutter={type:"element",tagName:"button",properties:{type:"button",class:["line-gutter"],part:["line-button"],"data-line":String(line),tabindex:String(options.focusedLine===line?0:-1),"aria-label":options.lineLabel(line)},children:[{type:"text",value:options.lineNumberText(line)}]}:options.lineNumbers&&(gutter={type:"element",tagName:"span",properties:{class:["line-number"],"aria-hidden":"true"},children:[{type:"text",value:options.lineNumberText(line)}]});const source={type:"element",tagName:"span",properties:{class:["line-source"]},children:[...children]};children.splice(0,children.length,...gutter?[gutter,source]:[source]),options.highlightedLines.has(line)&&(parts.push("line-highlight"),node.properties["data-highlighted"]=""),parts.length>0&&(node.properties.part=parts),options.activeLines.has(line)&&(node.properties["data-active"]="")}}}function renderCodeBlockPlainCode(options){const lines=options.code.split(/\r\n|\r|\n/),interactive=options.activatableLines&&options.lineNumbers;return html`<code
|
|
2
2
|
part="code"
|
|
3
3
|
class=${options.lineNumbers?"line-numbered-code":nothing}
|
|
4
4
|
>${lines.map((line,index)=>{const lineNumber=index+1,isHighlighted=options.highlightedLines.has(lineNumber),isActive=options.activeLines.has(lineNumber),part=isHighlighted?"line-highlight":nothing,gutter=interactive?html`<button
|
|
@@ -81,6 +81,7 @@ import{html,nothing}from"lit";import{unsafeHTML}from"lit/directives/unsafe-html.
|
|
|
81
81
|
@focusin=${options.onBodyFocusIn}
|
|
82
82
|
>
|
|
83
83
|
${options.showSkeleton?html`<lr-skeleton shape="rect" .announce=${!1}></lr-skeleton>`:options.highlightedHtml!==null?unsafeHTML(options.highlightedHtml):html`<pre part="pre" class=${options.lineNumbers?"line-numbers":nothing}>${options.renderPlainCode()}</pre>`}
|
|
84
|
+
${options.highlightLimited?html`<div part="limit" role="note">${options.localize("codeBlockHighlightLimit")}</div>`:nothing}
|
|
84
85
|
</div>
|
|
85
86
|
</div>
|
|
86
|
-
`}class CodeBlockInteractionController{needsHighlightResync(changed,locale,lineLabel){const localizationChanged=this.highlightedLocale!==locale||this.highlightedLineLabel!==lineLabel;return this.highlightedLocale=locale,this.highlightedLineLabel=lineLabel,localizationChanged||codeBlockNeedsHighlightResync(changed)}constructor(options){this.options=options,this.copyGeneration=0,this.onLineActivate=line=>{this.setFocusedLine(line),this.options.emitLineActivate(line)},this.onLineKeyDown=(e,line)=>{const{host}=this.options
|
|
87
|
+
`}class CodeBlockInteractionController{needsHighlightResync(changed,locale,lineLabel){const localizationChanged=this.highlightedLocale!==locale||this.highlightedLineLabel!==lineLabel;return this.highlightedLocale=locale,this.highlightedLineLabel=lineLabel,localizationChanged||codeBlockNeedsHighlightResync(changed)}constructor(options){this.options=options,this.copyGeneration=0,this.lineButtons=new Map,this.focusedLine=1,this.countedLines=1,this.onLineActivate=line=>{this.setFocusedLine(line),this.options.emitLineActivate(line)},this.onLineKeyDown=(e,line)=>{const{host}=this.options;host.code!==this.countedCode&&(this.countedCode=host.code,this.countedLines=codeBlockLineCount(host.code??""));const action=codeBlockLineKeyAction(e.key,line,this.countedLines);if(action===null)return;if(e.preventDefault(),action.kind==="activate"){this.onLineActivate(line);return}const next=action.line;this.setFocusedLine(next),host.updateComplete.then(()=>{this.lineButtons.get(next)?.focus()})},this.onBodyClick=e=>{if(e.composedPath()[0]?.closest?.("button[data-inline-handler]"))return;const line=codeBlockEventLine(e);line!==null&&this.onLineActivate(line)},this.onBodyKeyDown=e=>{if(e.composedPath()[0]?.closest?.("button[data-inline-handler]"))return;const line=codeBlockEventLine(e);line!==null&&this.onLineKeyDown(e,line)},this.onBodyFocusIn=e=>{const line=codeBlockEventLine(e);line!==null&&this.setFocusedLine(line)},this.onBodyMouseUp=()=>{const selection=codeBlockSelectionAnchor(this.options.host.shadowRoot);selection&&this.options.emitTextSelect(selection)},this.copy=async()=>{const{host}=this.options,owner=host.isConnected?host.ownerDocument.defaultView:null,text=host.code??"",generation=++this.copyGeneration;this.cancelCopyTimer(),this.setCopyStatus("rest");const outcome=await writeClipboardText(owner,text);if(!owner||!host.isConnected||host.ownerDocument.defaultView!==owner||generation!==this.copyGeneration)return;outcome.ok?(this.options.emitCopy(outcome),this.setCopyStatus("success")):(this.setCopyStatus("error"),this.options.emitError(),this.options.emitCopyError(outcome));let handle=0;handle=owner.setTimeout(()=>{this.copyTimer?.owner!==owner||this.copyTimer.handle!==handle||!host.isConnected||host.ownerDocument.defaultView!==owner||generation!==this.copyGeneration||(this.copyTimer=void 0,this.setCopyStatus("rest"))},CODE_BLOCK_COPY_CONFIRM_MS),this.copyTimer={owner,handle}},this.toggleCollapsed=()=>{const{host}=this.options,collapsed=!host.collapsed;this.options.requestToggle(collapsed)&&(host.collapsed=collapsed,this.options.emitToggle(host.collapsed))}}refreshTheme(){this.options.setDarkTheme(resolveIsDarkTheme(this.options.host))}cancelCopyTimer(){const timer=this.copyTimer;this.copyTimer=void 0,timer&&timer.owner.clearTimeout(timer.handle)}disconnect(){this.copyGeneration++,this.cancelCopyTimer(),this.options.setJustCopied(!1),this.options.setCopyFailed(!1)}setCopyStatus(status){this.options.setJustCopied(status==="success"),this.options.setCopyFailed(status==="error")}setFocusedLine(line){line!==this.focusedLine&&(this.lineButtons.get(this.focusedLine)?.setAttribute("tabindex","-1"),this.focusedLine=line,this.options.setFocusedLine(line),this.lineButtons.get(line)?.setAttribute("tabindex","0"))}syncLineButtons(focusedLine,force=!1){const source=this.options.host.renderRoot.querySelector("code");if(!(!force&&source===this.lineSource)){this.lineSource=source,this.lineButtons.clear(),this.focusedLine=focusedLine,this.countedCode=this.options.host.code,this.countedLines=codeBlockLineCount(this.countedCode??"");for(const button of source?.querySelectorAll('[part~="line-button"][data-line]')??[]){const line=Number(button.dataset.line);this.lineButtons.set(line,button),button.tabIndex=line===focusedLine?0:-1}}}}function codeBlockHasHeaderActions(host){return Array.from(host.children).some(child=>child.getAttribute("slot")==="header-actions")}class CodeBlockHeaderActionsController{constructor(options){this.options=options}sync(){this.options.setHasHeaderActions(codeBlockHasHeaderActions(this.options.host))}observe(){this.observer||typeof MutationObserver>"u"||(this.sync(),this.observer=new MutationObserver(()=>this.sync()),this.observer.observe(this.options.host,{childList:!0,attributes:!0,attributeFilter:["slot"],subtree:!0}))}disconnect(){this.observer?.disconnect(),this.observer=void 0}}export{CodeBlockHeaderActionsController,CodeBlockInteractionController,applyCodeBlockAriaBusy,clampCodeBlockFocusedLine,codeBlockActiveHighlightLineSet,codeBlockEventLine,codeBlockLineCount,codeBlockLineHasFocus,codeBlockLineHighlightSet,codeBlockLineTransformer,codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton,parseHighlightLines,renderCodeBlockPlainCode,renderCodeBlockShell,restoreCodeBlockLineFocus,scrollCodeBlockToAnchor,tokenizeCodeBlock};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{type ShikiLanguageInput}from'./
|
|
1
|
+
import{type ShikiLanguageInput,type ShikiLanguageLoader}from'./shiki-types.js';import type{LyraCodeBlockCopyAppearance}from'./code-block-shared.js';import{LyraCodeBlockBase,type LyraCodeBlockBaseEventMap}from'./code-block-base.class.js';export type{LyraCodeBlockToggleDetail}from'./code-block-shared.js';import type{LyraAnchor,LyraHighlight}from'../../viewers/document-viewer/anchors.js';import'../../overlays/skeleton/skeleton.class.js';export interface LyraCodeBlockEventMap extends LyraCodeBlockBaseEventMap{}
|
|
2
2
|
/**
|
|
3
3
|
* `<lr-code-block>` — fenced code display with optional lazy syntax
|
|
4
4
|
* highlighting and a copy button. No highlighting grammar ships in this
|
|
@@ -104,6 +104,7 @@ import{type ShikiLanguageInput}from'./code-loader.js';import type{LyraCodeBlockC
|
|
|
104
104
|
* `collapsed`.
|
|
105
105
|
* @csspart pre - The rendered `<pre>` — shiki's own in the highlighted path,
|
|
106
106
|
* this component's own plain one in the fallback path.
|
|
107
|
+
* @csspart limit - The localized notice when source exceeds the syntax-highlighting ceiling.
|
|
107
108
|
* @csspart code - The rendered `<code>`, same split as `pre` above.
|
|
108
109
|
* @csspart line-highlight - A line marked by `highlight-lines` or a `line-range` entry in
|
|
109
110
|
* `highlights`.
|
|
@@ -144,7 +145,9 @@ import{type ShikiLanguageInput}from'./code-loader.js';import type{LyraCodeBlockC
|
|
|
144
145
|
* @since 4.0.0
|
|
145
146
|
*/
|
|
146
147
|
export declare class LyraCodeBlock extends LyraCodeBlockBase{protected static collectionSupport:import("../../../internal/lyra-element.js").LyraCollectionSupport;protected static readonly immutableEventDetails:readonly string[];static styles:import("lit").CSSResultGroup[];
|
|
147
|
-
/** The raw source text. Removing the attribute renders an empty code block.
|
|
148
|
+
/** The raw source text. Removing the attribute renders an empty code block. Source above
|
|
149
|
+
* 8,192 UTF-16 code units renders in full as plain text with a localized `limit` notice;
|
|
150
|
+
* the ceiling is checked before synchronous syntax tokenization. */
|
|
148
151
|
code:string;
|
|
149
152
|
/** A shiki-recognized language id or alias (e.g. `"javascript"`,
|
|
150
153
|
* `"python"`, `"json"`). When unset, or when shiki doesn't recognize it,
|
|
@@ -201,11 +204,15 @@ readonly anchorKinds:readonly LyraAnchor['kind'][];
|
|
|
201
204
|
* `loadLanguage()` import entirely for that language — see the class doc
|
|
202
205
|
* above for the build-output rationale. A `language` value absent from
|
|
203
206
|
* this map (or left unset, or when `languages` itself is unset) falls
|
|
204
|
-
* back to that default dynamic-import path unchanged. For
|
|
207
|
+
* back to that default dynamic-import path unchanged. For an
|
|
205
208
|
* annotation, use `import type { ShikiLanguageInput } from
|
|
206
209
|
* '@aceshooting/lyra-ui/components/lr-code-block.js'`;
|
|
207
210
|
* this granular type-only import emits no registration side effect. */
|
|
208
|
-
languages?:Readonly<Record<string,ShikiLanguageInput>>;
|
|
211
|
+
languages?:Readonly<Record<string,ShikiLanguageInput>>;
|
|
212
|
+
/** Optional lazy grammar loaders, resolved only when their language is requested. Concrete
|
|
213
|
+
* `languages` entries take priority on duplicate keys. Unset preserves the default highlighter
|
|
214
|
+
* and concrete-grammar paths. Assign a new map object after changing entries. */
|
|
215
|
+
languageLoaders?:Readonly<Record<string,ShikiLanguageLoader>>;private highlighter?;private defaultHighlighterLoading;connectedCallback():void;private ensureDefaultHighlighter;protected preSuppliedGrammar():ShikiLanguageInput|undefined;protected hasPreSuppliedGrammar():boolean;protected showsSkeleton():boolean;
|
|
209
216
|
/** Resolves a `line-range` anchor (or a `highlights` id string resolving to one) by scrolling
|
|
210
217
|
* its start line into view within `[part="body"]`. Resolves `false` when the anchor isn't a
|
|
211
218
|
* `line-range`, the id isn't found, or the start line is out of bounds. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{property}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{snapshotLyraHighlights}from"../../../internal/highlight-collection.js";import{loadShikiHighlighter,loadShikiLanguage,loadShikiHighlighterCore,normalizeShikiLanguage,shikiHasLoadedLanguage}from"./code-loader.js";import{styles}from"./code-block.styles.js";import{LyraCodeBlockBase}from"./code-block-base.class.js";import{codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton}from"./code-block-shared.js";import"../../overlays/skeleton/skeleton.class.js";import{LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_copied,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed}from"../../../internal/default-strings/shared.generated.js";class LyraCodeBlock extends LyraCodeBlockBase{constructor(){super(...arguments),this.code="",this.language="",this.filename="",this.accessibleLabel=null,this.collapsible=!1,this.collapsed=!1,this.withoutCopyButton=!1,this.copyAppearance="text",this.maxHeight="",this.lineNumbers=!1,this.highlightLines="",this.activatableLines=!1,this._highlights=snapshotLyraHighlights([]),this.activeHighlightId=null,this.anchorKinds=["line-range"],this.defaultHighlighterLoading=!1}static{this.defaultStrings={...super.defaultStrings,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}static{this.styles=[LyraElement.styles,styles]}get highlights(){return this._highlights}set highlights(value){const previous=this._highlights;this._highlights=snapshotLyraHighlights(value),this.requestUpdate("highlights",previous)}connectedCallback(){super.connectedCallback(),this.ensureDefaultHighlighter(),(this.
|
|
1
|
+
import{__decorate}from"tslib";import{combineShikiLanguageSources}from"../../../internal/shiki-language-sources.js";import{resolvedShikiLanguages,ensureShikiLanguageLoaded}from"./shiki-types.js";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{property}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{snapshotLyraHighlights}from"../../../internal/highlight-collection.js";import{loadShikiHighlighter,loadShikiLanguage,loadShikiHighlighterCore,normalizeShikiLanguage,shikiHasLoadedLanguage}from"./code-loader.js";import{styles}from"./code-block.styles.js";import{LyraCodeBlockBase}from"./code-block-base.class.js";import{codeBlockPreSuppliedGrammar,codeBlockShowsSkeleton}from"./code-block-shared.js";import"../../overlays/skeleton/skeleton.class.js";import{LYRA_DEFAULT_codeBlockHighlightLimit,LYRA_DEFAULT_codeRegion,LYRA_DEFAULT_codeRegionWithLanguage,LYRA_DEFAULT_collapseCode,LYRA_DEFAULT_copiedToClipboard,LYRA_DEFAULT_copyCode,LYRA_DEFAULT_expandCode}from"../../../internal/default-strings/conversation.generated.js";import{LYRA_DEFAULT_copied,LYRA_DEFAULT_copy,LYRA_DEFAULT_copyFailed}from"../../../internal/default-strings/shared.generated.js";class LyraCodeBlock extends LyraCodeBlockBase{constructor(){super(...arguments),this.code="",this.language="",this.filename="",this.accessibleLabel=null,this.collapsible=!1,this.collapsed=!1,this.withoutCopyButton=!1,this.copyAppearance="text",this.maxHeight="",this.lineNumbers=!1,this.highlightLines="",this.activatableLines=!1,this._highlights=snapshotLyraHighlights([]),this.activeHighlightId=null,this.anchorKinds=["line-range"],this.defaultHighlighterLoading=!1}static{this.defaultStrings={...super.defaultStrings,codeBlockHighlightLimit:LYRA_DEFAULT_codeBlockHighlightLimit,codeRegion:LYRA_DEFAULT_codeRegion,codeRegionWithLanguage:LYRA_DEFAULT_codeRegionWithLanguage,collapseCode:LYRA_DEFAULT_collapseCode,copied:LYRA_DEFAULT_copied,copiedToClipboard:LYRA_DEFAULT_copiedToClipboard,copy:LYRA_DEFAULT_copy,copyCode:LYRA_DEFAULT_copyCode,copyFailed:LYRA_DEFAULT_copyFailed,expandCode:LYRA_DEFAULT_expandCode}}static{this.collectionSupport=collectionSupport}static{this.immutableEventDetails=Object.freeze(["lr-text-select"])}static{this.styles=[LyraElement.styles,styles]}get highlights(){return this._highlights}set highlights(value){const previous=this._highlights;this._highlights=snapshotLyraHighlights(value),this.requestUpdate("highlights",previous)}connectedCallback(){super.connectedCallback(),this.ensureDefaultHighlighter(),(this.hasPreSuppliedGrammar()||this.highlighter)&&this.syncHighlight()}ensureDefaultHighlighter(){!this.isConnected||this.highlighter!==void 0||this.defaultHighlighterLoading||(this.defaultHighlighterLoading=!0,loadShikiHighlighter().then(hl=>{this.defaultHighlighterLoading=!1,this.isConnected&&(this.highlighter=hl,this.shikiReady=!0,this.syncHighlight())}))}preSuppliedGrammar(){return codeBlockPreSuppliedGrammar(this.languages,this.language??"")}hasPreSuppliedGrammar(){return!!(this.preSuppliedGrammar()||this.languageLoaders&&codeBlockPreSuppliedGrammar(combineShikiLanguageSources(this.languages,this.languageLoaders),this.language??""))}showsSkeleton(){return codeBlockShowsSkeleton(this.shikiReady,this.language,!this.hasPreSuppliedGrammar())}async scrollToAnchor(target){return super.scrollToAnchor(target)}refreshTheme(){super.refreshTheme()}syncHighlight(){const token=++this.highlightToken,lang=normalizeShikiLanguage(this.language??"");if(!lang||this.highlightLimited){this.highlightedHtml=null;return}const languages=combineShikiLanguageSources(this.languages,this.languageLoaders),source=languages?.[lang]??languages?.[this.language];if(languages&&source){this.highlightedHtml=null,loadShikiHighlighterCore(resolvedShikiLanguages(languages)).then(async hl2=>{if(token!==this.highlightToken||!this.isConnected)return;const loaded=hl2&&await ensureShikiLanguageLoaded(hl2,lang,source);token!==this.highlightToken||!this.isConnected||(this.highlightedHtml=loaded&&hl2?this.tokenize(hl2,lang):null)});return}const hl=this.highlighter;if(!hl){this.highlightedHtml=null;return}if(shikiHasLoadedLanguage(hl,lang)){this.highlightedHtml=this.tokenize(hl,lang);return}this.highlightedHtml=null,loadShikiLanguage(hl,lang).then(ok=>{token===this.highlightToken&&this.isConnected&&(this.highlightedHtml=ok?this.tokenize(hl,lang):null)})}}__decorate([property()],LyraCodeBlock.prototype,"code",void 0),__decorate([property()],LyraCodeBlock.prototype,"language",void 0),__decorate([property()],LyraCodeBlock.prototype,"filename",void 0),__decorate([property({attribute:"aria-label"})],LyraCodeBlock.prototype,"accessibleLabel",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlock.prototype,"collapsible",void 0),__decorate([property({type:Boolean,reflect:!0})],LyraCodeBlock.prototype,"collapsed",void 0),__decorate([property({type:Boolean,attribute:"without-copy-button",reflect:!0})],LyraCodeBlock.prototype,"withoutCopyButton",void 0),__decorate([property({attribute:"copy-appearance",reflect:!0})],LyraCodeBlock.prototype,"copyAppearance",void 0),__decorate([property({attribute:"max-height"})],LyraCodeBlock.prototype,"maxHeight",void 0),__decorate([property({type:Boolean,attribute:"line-numbers",reflect:!0})],LyraCodeBlock.prototype,"lineNumbers",void 0),__decorate([property({attribute:"highlight-lines"})],LyraCodeBlock.prototype,"highlightLines",void 0),__decorate([property({type:Boolean,attribute:"activatable-lines"})],LyraCodeBlock.prototype,"activatableLines",void 0),__decorate([property({attribute:!1})],LyraCodeBlock.prototype,"highlights",null),__decorate([property({attribute:"active-highlight-id"})],LyraCodeBlock.prototype,"activeHighlightId",void 0),__decorate([property({attribute:!1})],LyraCodeBlock.prototype,"languages",void 0),__decorate([property({attribute:!1})],LyraCodeBlock.prototype,"languageLoaders",void 0);export{LyraCodeBlock};
|