@aceshooting/lyra-ui 7.3.0 → 7.4.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 +88 -0
- package/custom-elements.json +1703 -379
- package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts.map +1 -1
- package/dist/components/agent-tools/activity-feed/activity-feed.class.js +1 -0
- package/dist/components/agent-tools/activity-feed/activity-feed.class.js.map +1 -1
- package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts.map +1 -1
- package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -0
- package/dist/components/agent-tools/approval-queue/approval-queue.class.js.map +1 -1
- package/dist/components/agent-tools/browser-frame/browser-frame.styles.d.ts.map +1 -1
- package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +3 -0
- package/dist/components/agent-tools/browser-frame/browser-frame.styles.js.map +1 -1
- package/dist/components/agent-tools/commit-card/commit-card.class.d.ts +3 -0
- package/dist/components/agent-tools/commit-card/commit-card.class.d.ts.map +1 -1
- package/dist/components/agent-tools/commit-card/commit-card.class.js +21 -1
- package/dist/components/agent-tools/commit-card/commit-card.class.js.map +1 -1
- package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts.map +1 -1
- package/dist/components/agent-tools/compare-panel/compare-panel.class.js +7 -1
- package/dist/components/agent-tools/compare-panel/compare-panel.class.js.map +1 -1
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +4 -0
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts.map +1 -1
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +4 -0
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js.map +1 -1
- package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js +2 -2
- package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts +2 -0
- package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts.map +1 -1
- package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +24 -9
- package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js.map +1 -1
- package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.d.ts.map +1 -1
- package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.js +23 -2
- package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.js.map +1 -1
- package/dist/components/agent-tools/result-card/result-card.class.d.ts +4 -0
- package/dist/components/agent-tools/result-card/result-card.class.d.ts.map +1 -1
- package/dist/components/agent-tools/result-card/result-card.class.js +4 -0
- package/dist/components/agent-tools/result-card/result-card.class.js.map +1 -1
- package/dist/components/agent-tools/result-card/result-card.styles.d.ts.map +1 -1
- package/dist/components/agent-tools/result-card/result-card.styles.js +2 -0
- package/dist/components/agent-tools/result-card/result-card.styles.js.map +1 -1
- package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +2 -0
- package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts.map +1 -1
- package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +2 -0
- package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js.map +1 -1
- package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.d.ts.map +1 -1
- package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js +4 -0
- package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js.map +1 -1
- package/dist/components/agent-tools/subagent-panel/subagent-panel.class.d.ts +6 -1
- package/dist/components/agent-tools/subagent-panel/subagent-panel.class.d.ts.map +1 -1
- package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +61 -3
- package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js.map +1 -1
- package/dist/components/agent-tools/task-list/task-list.class.d.ts +2 -0
- package/dist/components/agent-tools/task-list/task-list.class.d.ts.map +1 -1
- package/dist/components/agent-tools/task-list/task-list.class.js +2 -0
- package/dist/components/agent-tools/task-list/task-list.class.js.map +1 -1
- package/dist/components/agent-tools/task-list/task-list.styles.d.ts.map +1 -1
- package/dist/components/agent-tools/task-list/task-list.styles.js +1 -0
- package/dist/components/agent-tools/task-list/task-list.styles.js.map +1 -1
- package/dist/components/agent-tools/test-results/test-results.class.d.ts.map +1 -1
- package/dist/components/agent-tools/test-results/test-results.class.js +15 -10
- package/dist/components/agent-tools/test-results/test-results.class.js.map +1 -1
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +3 -0
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts.map +1 -1
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +5 -0
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js.map +1 -1
- package/dist/components/charts/chart/box-plot.class.d.ts.map +1 -1
- package/dist/components/charts/chart/box-plot.class.js +31 -0
- package/dist/components/charts/chart/box-plot.class.js.map +1 -1
- package/dist/components/charts/chart/chart-loader.d.ts +2 -2
- package/dist/components/charts/chart/chart-loader.d.ts.map +1 -1
- package/dist/components/charts/chart/chart-loader.js +7 -1
- package/dist/components/charts/chart/chart-loader.js.map +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +5 -1
- package/dist/components/charts/chart/chart.class.d.ts.map +1 -1
- package/dist/components/charts/chart/chart.class.js +17 -2
- package/dist/components/charts/chart/chart.class.js.map +1 -1
- package/dist/components/charts/chart/chart.styles.d.ts.map +1 -1
- package/dist/components/charts/chart/chart.styles.js +5 -1
- package/dist/components/charts/chart/chart.styles.js.map +1 -1
- package/dist/components/charts/chart/lite-chart.class.d.ts.map +1 -1
- package/dist/components/charts/chart/lite-chart.class.js +2 -0
- package/dist/components/charts/chart/lite-chart.class.js.map +1 -1
- package/dist/components/conversation/code-block/code-block-core.class.d.ts +7 -8
- package/dist/components/conversation/code-block/code-block-core.class.d.ts.map +1 -1
- package/dist/components/conversation/code-block/code-block-core.class.js +75 -227
- package/dist/components/conversation/code-block/code-block-core.class.js.map +1 -1
- package/dist/components/conversation/code-block/code-block-shared.d.ts +173 -7
- package/dist/components/conversation/code-block/code-block-shared.d.ts.map +1 -1
- package/dist/components/conversation/code-block/code-block-shared.js +312 -6
- package/dist/components/conversation/code-block/code-block-shared.js.map +1 -1
- package/dist/components/conversation/code-block/code-block.class.d.ts +6 -7
- package/dist/components/conversation/code-block/code-block.class.d.ts.map +1 -1
- package/dist/components/conversation/code-block/code-block.class.js +70 -231
- package/dist/components/conversation/code-block/code-block.class.js.map +1 -1
- package/dist/components/conversation/markdown/markdown-core.class.d.ts +9 -22
- package/dist/components/conversation/markdown/markdown-core.class.d.ts.map +1 -1
- package/dist/components/conversation/markdown/markdown-core.class.js +87 -314
- package/dist/components/conversation/markdown/markdown-core.class.js.map +1 -1
- package/dist/components/conversation/markdown/markdown-shared.d.ts +213 -9
- package/dist/components/conversation/markdown/markdown-shared.d.ts.map +1 -1
- package/dist/components/conversation/markdown/markdown-shared.js +362 -8
- package/dist/components/conversation/markdown/markdown-shared.js.map +1 -1
- package/dist/components/conversation/markdown/markdown.class.d.ts +9 -22
- package/dist/components/conversation/markdown/markdown.class.d.ts.map +1 -1
- package/dist/components/conversation/markdown/markdown.class.js +81 -311
- package/dist/components/conversation/markdown/markdown.class.js.map +1 -1
- package/dist/components/conversation/message-feedback/message-feedback.class.d.ts.map +1 -1
- package/dist/components/conversation/message-feedback/message-feedback.class.js +4 -1
- package/dist/components/conversation/message-feedback/message-feedback.class.js.map +1 -1
- package/dist/components/conversation/prompt-input/prompt-input.styles.d.ts.map +1 -1
- package/dist/components/conversation/prompt-input/prompt-input.styles.js +9 -2
- package/dist/components/conversation/prompt-input/prompt-input.styles.js.map +1 -1
- package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts.map +1 -1
- package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +8 -1
- package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js.map +1 -1
- package/dist/components/conversation/voice-picker/voice-picker.class.d.ts.map +1 -1
- package/dist/components/conversation/voice-picker/voice-picker.class.js +5 -1
- package/dist/components/conversation/voice-picker/voice-picker.class.js.map +1 -1
- package/dist/components/data/document-library/document-library.class.d.ts.map +1 -1
- package/dist/components/data/document-library/document-library.class.js +4 -1
- package/dist/components/data/document-library/document-library.class.js.map +1 -1
- package/dist/components/data/env-list/env-list.styles.d.ts.map +1 -1
- package/dist/components/data/env-list/env-list.styles.js +5 -0
- package/dist/components/data/env-list/env-list.styles.js.map +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.js.map +1 -1
- package/dist/components/data/flow-minimap/flow-minimap.styles.d.ts.map +1 -1
- package/dist/components/data/flow-minimap/flow-minimap.styles.js +6 -0
- package/dist/components/data/flow-minimap/flow-minimap.styles.js.map +1 -1
- package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts.map +1 -1
- package/dist/components/data/graph-query-builder/graph-query-builder.class.js +10 -1
- package/dist/components/data/graph-query-builder/graph-query-builder.class.js.map +1 -1
- package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
- package/dist/components/data/heatmap/heatmap.class.js +17 -2
- package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
- package/dist/components/data/pagination/pagination.class.d.ts +2 -0
- package/dist/components/data/pagination/pagination.class.d.ts.map +1 -1
- package/dist/components/data/pagination/pagination.class.js +2 -0
- package/dist/components/data/pagination/pagination.class.js.map +1 -1
- package/dist/components/data/pagination/pagination.styles.d.ts.map +1 -1
- package/dist/components/data/pagination/pagination.styles.js +7 -2
- package/dist/components/data/pagination/pagination.styles.js.map +1 -1
- package/dist/components/data/table/table.class.d.ts +7 -2
- package/dist/components/data/table/table.class.d.ts.map +1 -1
- package/dist/components/data/table/table.class.js +40 -6
- package/dist/components/data/table/table.class.js.map +1 -1
- package/dist/components/data/tree/tree-node.class.d.ts +2 -0
- package/dist/components/data/tree/tree-node.class.d.ts.map +1 -1
- package/dist/components/data/tree/tree-node.class.js +2 -0
- package/dist/components/data/tree/tree-node.class.js.map +1 -1
- package/dist/components/forms/color-picker/color-picker.class.d.ts.map +1 -1
- package/dist/components/forms/color-picker/color-picker.class.js +9 -0
- package/dist/components/forms/color-picker/color-picker.class.js.map +1 -1
- package/dist/components/forms/date-picker/date-picker.class.d.ts +2 -0
- package/dist/components/forms/date-picker/date-picker.class.d.ts.map +1 -1
- package/dist/components/forms/date-picker/date-picker.class.js +2 -0
- package/dist/components/forms/date-picker/date-picker.class.js.map +1 -1
- package/dist/components/forms/date-picker/date-picker.styles.d.ts.map +1 -1
- package/dist/components/forms/date-picker/date-picker.styles.js +8 -3
- package/dist/components/forms/date-picker/date-picker.styles.js.map +1 -1
- package/dist/components/forms/emoji-picker/emoji-data-loader.js +28 -2
- package/dist/components/forms/emoji-picker/emoji-data-loader.js.map +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +4 -0
- package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts.map +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.js +8 -2
- package/dist/components/forms/emoji-picker/emoji-picker.class.js.map +1 -1
- package/dist/components/forms/emoji-picker/emoji-types.d.ts +9 -0
- package/dist/components/forms/emoji-picker/emoji-types.d.ts.map +1 -1
- package/dist/components/forms/input/input.styles.d.ts.map +1 -1
- package/dist/components/forms/input/input.styles.js +17 -4
- package/dist/components/forms/input/input.styles.js.map +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.d.ts +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.d.ts.map +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.js +3 -1
- package/dist/components/forms/locale-picker/locale-picker.class.js.map +1 -1
- package/dist/components/forms/radio/radio.class.d.ts +5 -0
- package/dist/components/forms/radio/radio.class.d.ts.map +1 -1
- package/dist/components/forms/radio/radio.class.js +5 -0
- package/dist/components/forms/radio/radio.class.js.map +1 -1
- package/dist/components/forms/radio/radio.styles.d.ts.map +1 -1
- package/dist/components/forms/radio/radio.styles.js +5 -2
- package/dist/components/forms/radio/radio.styles.js.map +1 -1
- package/dist/components/forms/select/select.class.d.ts +9 -1
- package/dist/components/forms/select/select.class.d.ts.map +1 -1
- package/dist/components/forms/select/select.class.js +9 -1
- package/dist/components/forms/select/select.class.js.map +1 -1
- package/dist/components/forms/slider/slider.class.d.ts +8 -0
- package/dist/components/forms/slider/slider.class.d.ts.map +1 -1
- package/dist/components/forms/slider/slider.class.js +14 -0
- package/dist/components/forms/slider/slider.class.js.map +1 -1
- package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +12 -0
- package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts.map +1 -1
- package/dist/components/forms/swatch-picker/swatch-picker.class.js +22 -0
- package/dist/components/forms/swatch-picker/swatch-picker.class.js.map +1 -1
- package/dist/components/forms/time-range/time-range.class.d.ts +9 -0
- package/dist/components/forms/time-range/time-range.class.d.ts.map +1 -1
- package/dist/components/forms/time-range/time-range.class.js +15 -0
- package/dist/components/forms/time-range/time-range.class.js.map +1 -1
- package/dist/components/layout/button-group/button-group.styles.d.ts.map +1 -1
- package/dist/components/layout/button-group/button-group.styles.js +10 -1
- package/dist/components/layout/button-group/button-group.styles.js.map +1 -1
- package/dist/components/layout/drilldown-panel/drilldown-panel.class.d.ts.map +1 -1
- package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +5 -1
- package/dist/components/layout/drilldown-panel/drilldown-panel.class.js.map +1 -1
- package/dist/components/layout/filter-bar/filter-bar.class.d.ts.map +1 -1
- package/dist/components/layout/filter-bar/filter-bar.class.js +4 -1
- package/dist/components/layout/filter-bar/filter-bar.class.js.map +1 -1
- package/dist/components/layout/split/split.class.d.ts +8 -0
- package/dist/components/layout/split/split.class.d.ts.map +1 -1
- package/dist/components/layout/split/split.class.js +8 -0
- package/dist/components/layout/split/split.class.js.map +1 -1
- package/dist/components/layout/split/split.styles.d.ts.map +1 -1
- package/dist/components/layout/split/split.styles.js +26 -10
- package/dist/components/layout/split/split.styles.js.map +1 -1
- package/dist/components/layout/widget/widget.class.d.ts +4 -0
- package/dist/components/layout/widget/widget.class.d.ts.map +1 -1
- package/dist/components/layout/widget/widget.class.js +4 -0
- package/dist/components/layout/widget/widget.class.js.map +1 -1
- package/dist/components/layout/widget/widget.styles.d.ts.map +1 -1
- package/dist/components/layout/widget/widget.styles.js +9 -3
- package/dist/components/layout/widget/widget.styles.js.map +1 -1
- package/dist/components/media/flag/flag.class.d.ts +1 -1
- package/dist/components/media/flag/flag.class.d.ts.map +1 -1
- package/dist/components/media/flag/flag.class.js +2 -1
- package/dist/components/media/flag/flag.class.js.map +1 -1
- package/dist/components/media/image-viewer/image-viewer.styles.d.ts.map +1 -1
- package/dist/components/media/image-viewer/image-viewer.styles.js +1 -0
- package/dist/components/media/image-viewer/image-viewer.styles.js.map +1 -1
- package/dist/components/overlays/chip/chip-group.class.d.ts +4 -0
- package/dist/components/overlays/chip/chip-group.class.d.ts.map +1 -1
- package/dist/components/overlays/chip/chip-group.class.js +4 -0
- package/dist/components/overlays/chip/chip-group.class.js.map +1 -1
- package/dist/components/overlays/chip/chip-group.styles.d.ts.map +1 -1
- package/dist/components/overlays/chip/chip-group.styles.js +7 -2
- package/dist/components/overlays/chip/chip-group.styles.js.map +1 -1
- package/dist/components/overlays/rating/rating.styles.d.ts.map +1 -1
- package/dist/components/overlays/rating/rating.styles.js +11 -4
- package/dist/components/overlays/rating/rating.styles.js.map +1 -1
- package/dist/components/retrieval/claim-evidence/claim-evidence.class.d.ts.map +1 -1
- package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +4 -1
- package/dist/components/retrieval/claim-evidence/claim-evidence.class.js.map +1 -1
- package/dist/components/retrieval/graph/graph-canvas.d.ts +25 -0
- package/dist/components/retrieval/graph/graph-canvas.d.ts.map +1 -1
- package/dist/components/retrieval/graph/graph-canvas.js +30 -1
- package/dist/components/retrieval/graph/graph-canvas.js.map +1 -1
- package/dist/components/retrieval/graph/graph.class.d.ts +2 -1
- package/dist/components/retrieval/graph/graph.class.d.ts.map +1 -1
- package/dist/components/retrieval/graph/graph.class.js +12 -1
- package/dist/components/retrieval/graph/graph.class.js.map +1 -1
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +5 -0
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts.map +1 -1
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +5 -0
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js.map +1 -1
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.d.ts.map +1 -1
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +7 -3
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js.map +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts.map +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +10 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js.map +1 -1
- package/dist/components/utility/diff-view/diff-view.styles.d.ts.map +1 -1
- package/dist/components/utility/diff-view/diff-view.styles.js +11 -0
- package/dist/components/utility/diff-view/diff-view.styles.js.map +1 -1
- package/dist/components/viewers/archive-viewer/archive-viewer-register.js +16 -3
- package/dist/components/viewers/archive-viewer/archive-viewer-register.js.map +1 -1
- package/dist/components/viewers/document-viewer/document-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/document-viewer/document-viewer.class.js +1 -0
- package/dist/components/viewers/document-viewer/document-viewer.class.js.map +1 -1
- package/dist/components/viewers/docx-viewer/docx-viewer.js +6 -1
- package/dist/components/viewers/docx-viewer/docx-viewer.js.map +1 -1
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +10 -4
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +31 -6
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js.map +1 -1
- package/dist/components/viewers/html-viewer/html-viewer.js +7 -0
- package/dist/components/viewers/html-viewer/html-viewer.js.map +1 -1
- package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +3 -0
- package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +7 -1
- package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js.map +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +4 -0
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +8 -4
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js.map +1 -1
- package/dist/components/viewers/pptx-viewer/pptx-viewer.js +11 -1
- package/dist/components/viewers/pptx-viewer/pptx-viewer.js.map +1 -1
- package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts +29 -17
- package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/svg-viewer/svg-viewer.class.js +27 -22
- package/dist/components/viewers/svg-viewer/svg-viewer.class.js.map +1 -1
- package/dist/components/viewers/svg-viewer/svg-viewer.d.ts.map +1 -1
- package/dist/components/viewers/svg-viewer/svg-viewer.js +7 -6
- package/dist/components/viewers/svg-viewer/svg-viewer.js.map +1 -1
- package/dist/internal/form-associated.d.ts +21 -0
- package/dist/internal/form-associated.d.ts.map +1 -1
- package/dist/internal/form-associated.js +25 -8
- package/dist/internal/form-associated.js.map +1 -1
- package/dist/internal/localization.d.ts +1 -1
- package/dist/internal/localization.d.ts.map +1 -1
- package/dist/internal/localization.js +17 -0
- package/dist/internal/localization.js.map +1 -1
- package/llms/components/lr-agent-run.md +3 -2
- package/llms/components/lr-approval-queue.md +6 -1
- package/llms/components/lr-archive-viewer.md +6 -2
- package/llms/components/lr-artifact-panel.md +7 -3
- package/llms/components/lr-attachment-chip.md +8 -6
- package/llms/components/lr-avatar.md +6 -4
- package/llms/components/lr-bar-chart.md +4 -2
- package/llms/components/lr-bubble-chart.md +4 -2
- package/llms/components/lr-button-group.md +10 -0
- package/llms/components/lr-button.md +11 -6
- package/llms/components/lr-chart.md +8 -2
- package/llms/components/lr-chip-group.md +9 -2
- package/llms/components/lr-chip.md +8 -1
- package/llms/components/lr-commit-card.md +11 -3
- package/llms/components/lr-confirm-bar.md +9 -1
- package/llms/components/lr-date-input.md +4 -0
- package/llms/components/lr-date-picker.md +5 -1
- package/llms/components/lr-document-viewer.md +1 -1
- package/llms/components/lr-doughnut-chart.md +4 -2
- package/llms/components/lr-emoji-picker.md +16 -4
- package/llms/components/lr-export-button.md +2 -1
- package/llms/components/lr-flag.md +9 -5
- package/llms/components/lr-graph-query-builder.md +6 -5
- package/llms/components/lr-heatmap.md +12 -7
- package/llms/components/lr-histogram.md +3 -2
- package/llms/components/lr-html-viewer.md +4 -1
- package/llms/components/lr-json-viewer.md +2 -1
- package/llms/components/lr-knowledge-base-admin.md +10 -1
- package/llms/components/lr-known-date.md +8 -4
- package/llms/components/lr-line-chart.md +4 -2
- package/llms/components/lr-locale-picker.md +1 -1
- package/llms/components/lr-model-select.md +3 -0
- package/llms/components/lr-notebook-viewer.md +4 -2
- package/llms/components/lr-pagination.md +6 -3
- package/llms/components/lr-pdf-viewer.md +5 -2
- package/llms/components/lr-pie-chart.md +4 -2
- package/llms/components/lr-polar-area-chart.md +4 -2
- package/llms/components/lr-pptx-viewer.md +3 -1
- package/llms/components/lr-push-to-talk.md +4 -0
- package/llms/components/lr-radar-chart.md +4 -2
- package/llms/components/lr-radio.md +7 -1
- package/llms/components/lr-result-card.md +9 -3
- package/llms/components/lr-result-field.md +8 -2
- package/llms/components/lr-retrieval-results.md +12 -7
- package/llms/components/lr-scatter-chart.md +4 -2
- package/llms/components/lr-schema-viewer.md +13 -1
- package/llms/components/lr-sequence-strip.md +21 -16
- package/llms/components/lr-slider.md +4 -0
- package/llms/components/lr-split.md +9 -1
- package/llms/components/lr-stepper.md +5 -3
- package/llms/components/lr-svg-viewer.md +24 -8
- package/llms/components/lr-table.md +21 -3
- package/llms/components/lr-task-list.md +7 -3
- package/llms/components/lr-terminal.md +10 -4
- package/llms/components/lr-time-range.md +6 -0
- package/llms/components/lr-tool-call-chip.md +4 -3
- package/llms/components/lr-tool-param-form.md +7 -2
- package/llms/components/lr-tool-result-dialog.md +2 -1
- package/llms/components/lr-tree-node.md +1 -1
- package/llms/components/lr-widget.md +6 -1
- package/llms/shared.md +1 -1
- package/llms-full.txt +353 -117
- package/package.json +7 -4
- package/vscode-css-data.json +141 -1
- package/vscode-html-data.json +29 -36
- package/web-types.json +111 -35
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
2
|
+
* Everything `<lr-markdown>` and `<lr-markdown-core>` parse, render and compute identically: the
|
|
3
|
+
* whole `marked` renderer contract (`parseMarkdownDocument()`), the `highlightCache` LRU helpers
|
|
4
|
+
* around it, the optional-peer load/sanitize/fallback pipeline (`renderMarkdownDocument()`), the
|
|
5
|
+
* `katex` resolution state, `fragment`/`text-quote` anchor application, highlight painting and
|
|
6
|
+
* hit-testing, the internal-link contract, and the rendered `[part="content"]` template itself.
|
|
7
|
+
*
|
|
8
|
+
* The two components differ in exactly one axis -- *which* shiki loader highlights a fenced block
|
|
9
|
+
* (the full ~200-language dynamic-import table plus a per-language `loadLanguage()`, vs.
|
|
10
|
+
* `shiki/core` seeded from a pre-supplied `languages` map), which is why `highlightPending()` stays
|
|
11
|
+
* on each class. Everything else was previously duplicated verbatim across both ~890-line class
|
|
12
|
+
* files, mirroring the same drift risk `code-block-shared.ts` was created to end for the
|
|
13
|
+
* `<lr-code-block>` / `<lr-code-block-core>` pair. A fix or behavior change now has exactly one
|
|
14
|
+
* place to land.
|
|
15
|
+
*
|
|
16
|
+
* Nothing here may `import` a *value* from `code-loader.js`'s full-table half
|
|
17
|
+
* (`loadShikiHighlighter`/`loadShikiLanguage`): `<lr-markdown-core>`'s build-leanness claim rests on
|
|
18
|
+
* its own module graph never reaching that call, and this module is in that graph.
|
|
10
19
|
*/
|
|
20
|
+
import { type TemplateResult } from 'lit';
|
|
11
21
|
import type { OptionalPeerApi } from '../../../internal/optional-peer-types.js';
|
|
12
|
-
import type
|
|
22
|
+
import { type HighlightHandle } from '../../../internal/text-highlights.js';
|
|
23
|
+
import type { LyraAnchor, LyraHighlight } from '../../viewers/document-viewer/anchors.js';
|
|
24
|
+
import { type MarkdownDeps } from './markdown-loader.js';
|
|
25
|
+
import { type KatexApi } from './katex-loader.js';
|
|
13
26
|
export declare function escapeHtml(text: string): string;
|
|
14
27
|
/**
|
|
15
28
|
* Mirrors marked's own default `link()` renderer's `cleanUrl()`: a malformed
|
|
@@ -90,4 +103,195 @@ export declare function parseMarkdownDocument(options: ParseMarkdownOptions): {
|
|
|
90
103
|
html: string;
|
|
91
104
|
hadMathFallback: boolean;
|
|
92
105
|
};
|
|
106
|
+
/**
|
|
107
|
+
* One variant's `katex` bookkeeping. Deliberately *per-variant* rather than one process-wide
|
|
108
|
+
* singleton: each of `<lr-markdown>`/`<lr-markdown-core>` creates exactly one of these at its own
|
|
109
|
+
* module scope, reproducing the four module-level bindings each class file used to declare for
|
|
110
|
+
* itself. Sharing a single instance across both would also share `loadStarted`, so a
|
|
111
|
+
* `<lr-markdown>` that started the load would suppress a `<lr-markdown-core>`'s own
|
|
112
|
+
* re-render-on-resolve on the same page (and vice versa) -- a behavior change this extraction has
|
|
113
|
+
* no reason to make. The underlying `getKatex()` promise is page-cached anyway, so two states cost
|
|
114
|
+
* one load.
|
|
115
|
+
*/
|
|
116
|
+
export interface MarkdownKatexState {
|
|
117
|
+
/** Test-only override bypassing the real dynamic `import('katex')` and the module cache
|
|
118
|
+
* entirely -- `undefined` (the default) defers to the resolved module. */
|
|
119
|
+
setForTesting(katex: KatexApi | null | undefined): void;
|
|
120
|
+
/** The katex module to render this pass's math with, or `null` for the literal-TeX fallback
|
|
121
|
+
* (peer missing *or* still loading -- the fallback is the same either way). */
|
|
122
|
+
getIfLoaded(): KatexApi | null;
|
|
123
|
+
/** Whether the load has definitively finished with no peer available -- distinct from
|
|
124
|
+
* `getIfLoaded()` returning falsy, which also covers a load that's merely still in flight. Used
|
|
125
|
+
* only to decide whether a literal fallback should also report `lr-render-error`. */
|
|
126
|
+
isConfirmedMissing(): boolean;
|
|
127
|
+
/** Kicks off the shared page-wide `getKatex()` load the first time math needs it, at most once.
|
|
128
|
+
* Skipped entirely while `setForTesting()` is active -- that seam controls math-rendering
|
|
129
|
+
* behavior directly and must never race a real, unmocked `import('katex')` settling underneath
|
|
130
|
+
* it. `onResolved` runs after the module lands; the caller still guards its own liveness. */
|
|
131
|
+
startLoad(onResolved: () => void): void;
|
|
132
|
+
}
|
|
133
|
+
export declare function createMarkdownKatexState(): MarkdownKatexState;
|
|
134
|
+
/**
|
|
135
|
+
* Rewrites shiki's generated `<pre>`/`<code>` hast nodes so the highlighted output keeps the
|
|
136
|
+
* markdown viewers' own `part="code-block"` hook and a `language-${lang}` class on `<code>` --
|
|
137
|
+
* matching the plain-render output shape exactly, so existing consumer CSS targeting either keeps
|
|
138
|
+
* working whether or not a given block ended up highlighted. A separate, purpose-built function
|
|
139
|
+
* from `code-block-shared.ts`'s own `codeBlockLineTransformer` -- that one targets
|
|
140
|
+
* `<lr-code-block>`'s `part="pre"`/`part="code"`/line-numbers contract, which doesn't apply here.
|
|
141
|
+
*/
|
|
142
|
+
export declare function markdownCodeTransformer(lang: string): {
|
|
143
|
+
name: string;
|
|
144
|
+
pre(node: OptionalPeerApi): void;
|
|
145
|
+
code(node: OptionalPeerApi): void;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Tokenizes one pending fenced block with an already-resolved highlighter and returns the exact
|
|
149
|
+
* string to cache (trailing newline included, matching the plain `code()` renderer's own output).
|
|
150
|
+
* `null` means "leave this key uncached" -- the caller records it in `failedHighlightKeys` so the
|
|
151
|
+
* block keeps its plain fallback permanently rather than being rediscovered as pending forever.
|
|
152
|
+
* Shared by both variants' `highlightPending()`; only the *loading* half above it differs.
|
|
153
|
+
*/
|
|
154
|
+
export declare function tokenizeMarkdownHighlight(hl: OptionalPeerApi, pending: PendingHighlight): string | null;
|
|
155
|
+
/**
|
|
156
|
+
* `connectedCallback()`'s optional-peer load for both variants. `eagerLoad` only takes the
|
|
157
|
+
* synchronous path when the shared `marked`/`dompurify` module cache has *already* settled (see
|
|
158
|
+
* `getMarkdownDepsIfLoaded()`'s doc) -- otherwise it falls through to the same async path as the
|
|
159
|
+
* default, since a dynamic `import()` can't be made synchronous from scratch.
|
|
160
|
+
*
|
|
161
|
+
* The (module-cached, page-lifetime) `loadMarkdownDeps()` promise can resolve after the instance
|
|
162
|
+
* was removed from the DOM -- e.g. a markdown viewer inside a conditionally-rendered chat message
|
|
163
|
+
* or a virtualized list. Without the `isConnected` guard, a detached instance would still have its
|
|
164
|
+
* deps applied and a render scheduled that no one will ever see. Mirrors `chart.ts`'s own
|
|
165
|
+
* `connectedCallback()` guard for the identical race.
|
|
166
|
+
*/
|
|
167
|
+
export declare function beginMarkdownDepsLoad(host: {
|
|
168
|
+
readonly eagerLoad: boolean;
|
|
169
|
+
readonly isConnected: boolean;
|
|
170
|
+
}, apply: (deps: MarkdownDeps) => void): void;
|
|
171
|
+
/** Every property whose change means the document has to be reparsed. `languagesOnly` is listed
|
|
172
|
+
* for `<lr-markdown>`; `<lr-markdown-core>` has no such property, so it simply never appears in
|
|
173
|
+
* that component's changed map. */
|
|
174
|
+
export declare function markdownNeedsReparse(changed: Map<PropertyKey, unknown>): boolean;
|
|
175
|
+
/** Whether the *highlighting* configuration changed, invalidating in-flight work and the
|
|
176
|
+
* permanently-failed key set. */
|
|
177
|
+
export declare function markdownHighlightConfigChanged(changed: Map<PropertyKey, unknown>): boolean;
|
|
178
|
+
/** Whether the *grammar set* changed, additionally invalidating already-highlighted output. */
|
|
179
|
+
export declare function markdownLanguageSetChanged(changed: Map<PropertyKey, unknown>): boolean;
|
|
180
|
+
/** The rendered outcome of one `renderMarkdownDocument()` pass. `headingTree` is non-`null`
|
|
181
|
+
* whenever the parse itself succeeded -- including the `fallback` produced by a missing
|
|
182
|
+
* `dompurify`, which still computed a real outline before refusing to render. */
|
|
183
|
+
export type MarkdownRenderOutcome = {
|
|
184
|
+
status: 'fallback';
|
|
185
|
+
error: unknown;
|
|
186
|
+
headingTree: MarkdownHeadingItem[] | null;
|
|
187
|
+
} | {
|
|
188
|
+
status: 'rendered';
|
|
189
|
+
html: string;
|
|
190
|
+
headingTree: MarkdownHeadingItem[];
|
|
191
|
+
/** A math token rendered its literal TeX fallback *and* the peer is confirmed missing --
|
|
192
|
+
* worth one `lr-render-error`. A fallback while the load is merely still in flight is the
|
|
193
|
+
* same one-microtask transient window every other optional peer here has, and reporting it
|
|
194
|
+
* would be a false positive. */
|
|
195
|
+
mathFailed: boolean;
|
|
196
|
+
pendingKeys: PendingHighlight[];
|
|
197
|
+
};
|
|
198
|
+
export interface RenderMarkdownOptions {
|
|
199
|
+
/** This variant's own tag, for the peer-failure diagnostics below. */
|
|
200
|
+
tag: 'lr-markdown' | 'lr-markdown-core';
|
|
201
|
+
deps: MarkdownDeps;
|
|
202
|
+
sanitize: boolean;
|
|
203
|
+
math: boolean;
|
|
204
|
+
/** The instance's own `parseMarkdown()` -- see `ParseMarkdownOptions` for what it resolves. */
|
|
205
|
+
parse: (marked: OptionalPeerApi, pendingKeys: PendingHighlight[], headingTreeOut: MarkdownHeadingItem[]) => {
|
|
206
|
+
html: string;
|
|
207
|
+
hadMathFallback: boolean;
|
|
208
|
+
};
|
|
209
|
+
/** Runs immediately after a successful parse, before sanitization -- where each instance kicks
|
|
210
|
+
* off its variant's katex load. */
|
|
211
|
+
onParsed: () => void;
|
|
212
|
+
isKatexConfirmedMissing: () => boolean;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* The optional-peer load / parse / sanitize / fallback pipeline both variants run, returning what
|
|
216
|
+
* changed rather than mutating the instance -- the caller owns every `@state` assignment and every
|
|
217
|
+
* event, so this stays a pure function of its inputs.
|
|
218
|
+
*
|
|
219
|
+
* Rendering never ships unsanitized or broken markup silently: a missing/throwing `marked`, or a
|
|
220
|
+
* missing `dompurify` while `sanitize` is on, both fall back to plain text plus `lr-render-error`;
|
|
221
|
+
* an explicit `sanitize="false"` renders marked's raw output regardless of whether `dompurify` is
|
|
222
|
+
* installed, because the consumer opted out.
|
|
223
|
+
*/
|
|
224
|
+
export declare function renderMarkdownDocument(options: RenderMarkdownOptions): MarkdownRenderOutcome;
|
|
225
|
+
/** The `lr-render-error` payload for a permanently-missing `katex` peer while `math` is set. */
|
|
226
|
+
export declare function markdownMathPeerError(tag: 'lr-markdown' | 'lr-markdown-core'): Error;
|
|
227
|
+
/** Mirrors "the document is not final" onto the host as `aria-busy`, so assistive technology knows
|
|
228
|
+
* the rendered output is still resolving (peers loading, or `streaming` still on). */
|
|
229
|
+
export declare function applyMarkdownAriaBusy(host: Element, busy: boolean): void;
|
|
230
|
+
/**
|
|
231
|
+
* Scrolls a `fragment` anchor's heading into view. `headingAnchors` may be off, so the target
|
|
232
|
+
* heading might carry no `id` attribute in the DOM at all -- and even with it on, DOMPurify's
|
|
233
|
+
* DOM-clobbering protection strips a slug colliding with a real `document` property name. Both
|
|
234
|
+
* cases fall back to re-deriving the same slug order `getHeadingTree()` was built in and matching
|
|
235
|
+
* by position instead of by attribute.
|
|
236
|
+
*/
|
|
237
|
+
export declare function applyMarkdownFragmentAnchor(root: Element, anchor: Extract<LyraAnchor, {
|
|
238
|
+
kind: 'fragment';
|
|
239
|
+
}>, headingTree: readonly MarkdownHeadingItem[]): boolean;
|
|
240
|
+
/** Scrolls a `text-quote` anchor's resolved range into view, centered. */
|
|
241
|
+
export declare function applyMarkdownTextQuoteAnchor(root: Element, anchor: Extract<LyraAnchor, {
|
|
242
|
+
kind: 'text-quote';
|
|
243
|
+
}>): boolean;
|
|
244
|
+
/** One `text-quote` highlight resolved against the currently rendered content. */
|
|
245
|
+
export interface ResolvedHighlightRange {
|
|
246
|
+
id: string;
|
|
247
|
+
range: Range;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Re-resolves every `text-quote` highlight against the current rendered content and repaints via
|
|
251
|
+
* the caller's `acquireHighlightHandle()` handle -- resolution is always by quote text, never by
|
|
252
|
+
* node identity, so a highlight set before its quote exists in `content` yet (e.g. mid-`streaming`)
|
|
253
|
+
* simply paints nothing until a later render's text actually contains it. `fragment` highlights
|
|
254
|
+
* aren't painted (there is no literal span of text to wrap/underline for a whole section).
|
|
255
|
+
* Returns the resolved ranges for `hitTestHighlightRanges()` to activate against.
|
|
256
|
+
*/
|
|
257
|
+
export declare function repaintMarkdownHighlights(options: {
|
|
258
|
+
root: Element;
|
|
259
|
+
handle: HighlightHandle;
|
|
260
|
+
highlights: readonly LyraHighlight[];
|
|
261
|
+
activeHighlightId: string | null;
|
|
262
|
+
}): ResolvedHighlightRange[];
|
|
263
|
+
/**
|
|
264
|
+
* Hit-tests a click point against every currently-resolved highlight's `getClientRects()`, topmost
|
|
265
|
+
* (last-resolved) first. The CSS Custom Highlight API paints ranges without creating any DOM element
|
|
266
|
+
* to attach a click listener to, so this is the only activation path that works identically on both
|
|
267
|
+
* paint paths -- mirrors `<lr-pdf-viewer>`'s own coordinate-based `onPageClick()` hit-test for the
|
|
268
|
+
* same reason (its own painted highlights sit under a text layer that intercepts most pointer
|
|
269
|
+
* events).
|
|
270
|
+
*/
|
|
271
|
+
export declare function hitTestHighlightRanges(ranges: readonly ResolvedHighlightRange[], x: number, y: number): string | null;
|
|
272
|
+
/** The `href` of the rendered link a click landed on, when `internal-link-prefix` claims it --
|
|
273
|
+
* `null` for every other click, including one on an ordinary external link.
|
|
274
|
+
*
|
|
275
|
+
* Compared against the raw `href` *attribute*, not the `.href` IDL property: the property is
|
|
276
|
+
* always browser-resolved to an absolute URL (e.g. "https://example.com/docs") even for a
|
|
277
|
+
* relative/prefixed path, which would never match a relative `internal-link-prefix`. */
|
|
278
|
+
export declare function internalLinkHrefFrom(e: MouseEvent, prefix: string): string | null;
|
|
279
|
+
export interface MarkdownContentOptions {
|
|
280
|
+
/** The Markdown source -- also the plain-text fallback rendering when `renderedHtml` is `null`. */
|
|
281
|
+
content: string;
|
|
282
|
+
/** Sanitized (or deliberately unsanitized) HTML, or `null` for the plain-text fallback: peers
|
|
283
|
+
* still loading, or a render attempt just fell back after a failure. The two states look
|
|
284
|
+
* identical on purpose -- a consumer distinguishes them via `lr-render-error`. */
|
|
285
|
+
renderedHtml: string | null;
|
|
286
|
+
/** The host's own `aria-label`, forwarded to the element that actually owns `role="document"` --
|
|
287
|
+
* a host `aria-label` doesn't reach shadow internals on its own. */
|
|
288
|
+
hostAriaLabel: string | null;
|
|
289
|
+
onClick: (e: MouseEvent) => void;
|
|
290
|
+
/** `DocumentAnchorTarget`'s `renderAnchorLiveRegion()` output. */
|
|
291
|
+
liveRegion: unknown;
|
|
292
|
+
}
|
|
293
|
+
/** The rendered tree both variants produce: one `[part="content"]` wrapper plus the anchor-target
|
|
294
|
+
* live region. Only non-empty content is focusable -- an empty document is not a scrollable region
|
|
295
|
+
* worth a tab stop. */
|
|
296
|
+
export declare function renderMarkdownContent(options: MarkdownContentOptions): TemplateResult;
|
|
93
297
|
//# sourceMappingURL=markdown-shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-shared.d.ts","sourceRoot":"","sources":["../../../../src/components/conversation/markdown/markdown-shared.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"markdown-shared.d.ts","sourceRoot":"","sources":["../../../../src/components/conversation/markdown/markdown-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
2
|
+
* Everything `<lr-markdown>` and `<lr-markdown-core>` parse, render and compute identically: the
|
|
3
|
+
* whole `marked` renderer contract (`parseMarkdownDocument()`), the `highlightCache` LRU helpers
|
|
4
|
+
* around it, the optional-peer load/sanitize/fallback pipeline (`renderMarkdownDocument()`), the
|
|
5
|
+
* `katex` resolution state, `fragment`/`text-quote` anchor application, highlight painting and
|
|
6
|
+
* hit-testing, the internal-link contract, and the rendered `[part="content"]` template itself.
|
|
7
|
+
*
|
|
8
|
+
* The two components differ in exactly one axis -- *which* shiki loader highlights a fenced block
|
|
9
|
+
* (the full ~200-language dynamic-import table plus a per-language `loadLanguage()`, vs.
|
|
10
|
+
* `shiki/core` seeded from a pre-supplied `languages` map), which is why `highlightPending()` stays
|
|
11
|
+
* on each class. Everything else was previously duplicated verbatim across both ~890-line class
|
|
12
|
+
* files, mirroring the same drift risk `code-block-shared.ts` was created to end for the
|
|
13
|
+
* `<lr-code-block>` / `<lr-code-block-core>` pair. A fix or behavior change now has exactly one
|
|
14
|
+
* place to land.
|
|
15
|
+
*
|
|
16
|
+
* Nothing here may `import` a *value* from `code-loader.js`'s full-table half
|
|
17
|
+
* (`loadShikiHighlighter`/`loadShikiLanguage`): `<lr-markdown-core>`'s build-leanness claim rests on
|
|
18
|
+
* its own module graph never reaching that call, and this module is in that graph.
|
|
10
19
|
*/
|
|
20
|
+
import { html, nothing } from 'lit';
|
|
21
|
+
import { unsafeHTML } from 'lit/directives/unsafe-html.js';
|
|
11
22
|
import { Slugger } from '../../../internal/slugger.js';
|
|
12
23
|
import { finiteInteger } from '../../../internal/numbers.js';
|
|
24
|
+
import { prefersReducedMotion } from '../../../internal/motion.js';
|
|
25
|
+
import { scopeFromElement, resolveTextQuote } from '../../../internal/text-quote.js';
|
|
26
|
+
import { supportsCustomHighlights } from '../../../internal/text-highlights.js';
|
|
27
|
+
import { normalizeShikiLanguage, SHIKI_THEMES } from '../code-block/code-loader.js';
|
|
28
|
+
import { loadMarkdownDeps, getMarkdownDepsIfLoaded } from './markdown-loader.js';
|
|
29
|
+
import { getKatex } from './katex-loader.js';
|
|
13
30
|
const HTML_ESCAPES = {
|
|
14
31
|
'&': '&',
|
|
15
32
|
'<': '<',
|
|
@@ -250,4 +267,341 @@ export function parseMarkdownDocument(options) {
|
|
|
250
267
|
});
|
|
251
268
|
return { html: instance.parse(content, { gfm, async: false }), hadMathFallback };
|
|
252
269
|
}
|
|
270
|
+
export function createMarkdownKatexState() {
|
|
271
|
+
// `undefined` means no load has been kicked off yet, `null` that one finished but the peer isn't
|
|
272
|
+
// installed -- kept distinguishable from `loadStarted` so "in flight" and "confirmed missing"
|
|
273
|
+
// never collapse into the same falsy value.
|
|
274
|
+
let resolved;
|
|
275
|
+
let loadStarted = false;
|
|
276
|
+
let override;
|
|
277
|
+
return {
|
|
278
|
+
setForTesting(katex) {
|
|
279
|
+
override = katex;
|
|
280
|
+
},
|
|
281
|
+
getIfLoaded() {
|
|
282
|
+
return override !== undefined ? override : (resolved ?? null);
|
|
283
|
+
},
|
|
284
|
+
isConfirmedMissing() {
|
|
285
|
+
return (override !== undefined ? override : resolved) === null;
|
|
286
|
+
},
|
|
287
|
+
startLoad(onResolved) {
|
|
288
|
+
if (loadStarted || override !== undefined)
|
|
289
|
+
return;
|
|
290
|
+
loadStarted = true;
|
|
291
|
+
void getKatex().then((katex) => {
|
|
292
|
+
resolved = katex;
|
|
293
|
+
onResolved();
|
|
294
|
+
});
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// -- fenced-code highlighting -------------------------------------------------------------------
|
|
299
|
+
/**
|
|
300
|
+
* Rewrites shiki's generated `<pre>`/`<code>` hast nodes so the highlighted output keeps the
|
|
301
|
+
* markdown viewers' own `part="code-block"` hook and a `language-${lang}` class on `<code>` --
|
|
302
|
+
* matching the plain-render output shape exactly, so existing consumer CSS targeting either keeps
|
|
303
|
+
* working whether or not a given block ended up highlighted. A separate, purpose-built function
|
|
304
|
+
* from `code-block-shared.ts`'s own `codeBlockLineTransformer` -- that one targets
|
|
305
|
+
* `<lr-code-block>`'s `part="pre"`/`part="code"`/line-numbers contract, which doesn't apply here.
|
|
306
|
+
*/
|
|
307
|
+
export function markdownCodeTransformer(lang) {
|
|
308
|
+
return {
|
|
309
|
+
name: 'lr-markdown-code-block',
|
|
310
|
+
pre(node) {
|
|
311
|
+
node.properties.part = ['code-block'];
|
|
312
|
+
node.properties.tabindex = '0';
|
|
313
|
+
},
|
|
314
|
+
code(node) {
|
|
315
|
+
const classes = Array.isArray(node.properties.class)
|
|
316
|
+
? node.properties.class
|
|
317
|
+
: node.properties.class
|
|
318
|
+
? [node.properties.class]
|
|
319
|
+
: [];
|
|
320
|
+
node.properties.class = [...classes, `language-${lang}`];
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Tokenizes one pending fenced block with an already-resolved highlighter and returns the exact
|
|
326
|
+
* string to cache (trailing newline included, matching the plain `code()` renderer's own output).
|
|
327
|
+
* `null` means "leave this key uncached" -- the caller records it in `failedHighlightKeys` so the
|
|
328
|
+
* block keeps its plain fallback permanently rather than being rediscovered as pending forever.
|
|
329
|
+
* Shared by both variants' `highlightPending()`; only the *loading* half above it differs.
|
|
330
|
+
*/
|
|
331
|
+
export function tokenizeMarkdownHighlight(hl, pending) {
|
|
332
|
+
try {
|
|
333
|
+
const highlighted = hl.codeToHtml(pending.code, {
|
|
334
|
+
lang: normalizeShikiLanguage(pending.lang),
|
|
335
|
+
themes: SHIKI_THEMES,
|
|
336
|
+
transformers: [markdownCodeTransformer(pending.lang)],
|
|
337
|
+
});
|
|
338
|
+
return `${highlighted}\n`;
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
// Tokenization failed for a reason other than an unrecognized grammar (each variant's loader
|
|
342
|
+
// reports that itself) -- same effect either way: permanent plain fallback for this block.
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// -- the render pipeline ------------------------------------------------------------------------
|
|
347
|
+
/**
|
|
348
|
+
* `connectedCallback()`'s optional-peer load for both variants. `eagerLoad` only takes the
|
|
349
|
+
* synchronous path when the shared `marked`/`dompurify` module cache has *already* settled (see
|
|
350
|
+
* `getMarkdownDepsIfLoaded()`'s doc) -- otherwise it falls through to the same async path as the
|
|
351
|
+
* default, since a dynamic `import()` can't be made synchronous from scratch.
|
|
352
|
+
*
|
|
353
|
+
* The (module-cached, page-lifetime) `loadMarkdownDeps()` promise can resolve after the instance
|
|
354
|
+
* was removed from the DOM -- e.g. a markdown viewer inside a conditionally-rendered chat message
|
|
355
|
+
* or a virtualized list. Without the `isConnected` guard, a detached instance would still have its
|
|
356
|
+
* deps applied and a render scheduled that no one will ever see. Mirrors `chart.ts`'s own
|
|
357
|
+
* `connectedCallback()` guard for the identical race.
|
|
358
|
+
*/
|
|
359
|
+
export function beginMarkdownDepsLoad(host, apply) {
|
|
360
|
+
if (host.eagerLoad) {
|
|
361
|
+
const alreadyLoaded = getMarkdownDepsIfLoaded();
|
|
362
|
+
if (alreadyLoaded) {
|
|
363
|
+
apply(alreadyLoaded);
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
void loadMarkdownDeps().then((resolved) => {
|
|
368
|
+
if (!host.isConnected)
|
|
369
|
+
return;
|
|
370
|
+
apply(resolved);
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
/** Every property whose change means the document has to be reparsed. `languagesOnly` is listed
|
|
374
|
+
* for `<lr-markdown>`; `<lr-markdown-core>` has no such property, so it simply never appears in
|
|
375
|
+
* that component's changed map. */
|
|
376
|
+
export function markdownNeedsReparse(changed) {
|
|
377
|
+
return (changed.has('content') ||
|
|
378
|
+
changed.has('sanitize') ||
|
|
379
|
+
changed.has('gfm') ||
|
|
380
|
+
changed.has('linkTarget') ||
|
|
381
|
+
changed.has('headingOffset') ||
|
|
382
|
+
changed.has('escapeHtml') ||
|
|
383
|
+
changed.has('streaming') ||
|
|
384
|
+
changed.has('headingAnchors') ||
|
|
385
|
+
changed.has('math') ||
|
|
386
|
+
changed.has('highlightCode') ||
|
|
387
|
+
changed.has('languages') ||
|
|
388
|
+
changed.has('languagesOnly'));
|
|
389
|
+
}
|
|
390
|
+
/** Whether the *highlighting* configuration changed, invalidating in-flight work and the
|
|
391
|
+
* permanently-failed key set. */
|
|
392
|
+
export function markdownHighlightConfigChanged(changed) {
|
|
393
|
+
return changed.has('highlightCode') || changed.has('languages') || changed.has('languagesOnly');
|
|
394
|
+
}
|
|
395
|
+
/** Whether the *grammar set* changed, additionally invalidating already-highlighted output. */
|
|
396
|
+
export function markdownLanguageSetChanged(changed) {
|
|
397
|
+
return changed.has('languages') || changed.has('languagesOnly');
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* The optional-peer load / parse / sanitize / fallback pipeline both variants run, returning what
|
|
401
|
+
* changed rather than mutating the instance -- the caller owns every `@state` assignment and every
|
|
402
|
+
* event, so this stays a pure function of its inputs.
|
|
403
|
+
*
|
|
404
|
+
* Rendering never ships unsanitized or broken markup silently: a missing/throwing `marked`, or a
|
|
405
|
+
* missing `dompurify` while `sanitize` is on, both fall back to plain text plus `lr-render-error`;
|
|
406
|
+
* an explicit `sanitize="false"` renders marked's raw output regardless of whether `dompurify` is
|
|
407
|
+
* installed, because the consumer opted out.
|
|
408
|
+
*/
|
|
409
|
+
export function renderMarkdownDocument(options) {
|
|
410
|
+
const { deps, tag } = options;
|
|
411
|
+
if (!deps.marked) {
|
|
412
|
+
// markdown-loader.ts already logged the specific import failure.
|
|
413
|
+
return {
|
|
414
|
+
status: 'fallback',
|
|
415
|
+
error: new Error(`<${tag}> could not render: the "marked" peer dependency failed to load.`),
|
|
416
|
+
headingTree: null,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
const pendingKeys = [];
|
|
420
|
+
const headingTree = [];
|
|
421
|
+
let rawHtml;
|
|
422
|
+
let hadMathFallback;
|
|
423
|
+
try {
|
|
424
|
+
const parsed = options.parse(deps.marked, pendingKeys, headingTree);
|
|
425
|
+
rawHtml = parsed.html;
|
|
426
|
+
hadMathFallback = parsed.hadMathFallback;
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
return { status: 'fallback', error, headingTree: null };
|
|
430
|
+
}
|
|
431
|
+
options.onParsed();
|
|
432
|
+
const mathFailed = hadMathFallback && options.isKatexConfirmedMissing();
|
|
433
|
+
if (!options.sanitize) {
|
|
434
|
+
// Consumer explicitly opted out of sanitization -- dompurify's presence or absence is
|
|
435
|
+
// irrelevant to this path.
|
|
436
|
+
return { status: 'rendered', html: rawHtml, headingTree, mathFailed, pendingKeys };
|
|
437
|
+
}
|
|
438
|
+
if (!deps.DOMPurify) {
|
|
439
|
+
const error = new Error(`<${tag}> could not render: sanitize is enabled (the default) but the "dompurify" peer ` +
|
|
440
|
+
'dependency failed to load — refusing to render unsanitized HTML. Install it with `pnpm add ' +
|
|
441
|
+
'dompurify`, or set sanitize="false" to explicitly opt out of sanitization.');
|
|
442
|
+
console.warn(error.message);
|
|
443
|
+
return { status: 'fallback', error, headingTree };
|
|
444
|
+
}
|
|
445
|
+
// `target` is not in DOMPurify's default attribute allowlist (unlike `part`/`rel`/`class`, which
|
|
446
|
+
// already are) -- without ADD_ATTR here, every rendered link's target="..." would be silently
|
|
447
|
+
// stripped even though the anchor itself survives sanitization. 'style' joins it because shiki's
|
|
448
|
+
// per-token output carries inline style="color:..." (theme colors), equally absent from the
|
|
449
|
+
// default allowlist. `semantics`/`annotation` join only when `math` is on -- the only KaTeX
|
|
450
|
+
// MathML output elements outside the default allowlist. `annotation-xml` is deliberately never
|
|
451
|
+
// added: KaTeX's own MathML output never emits it, and DOMPurify's default allowlist already
|
|
452
|
+
// treats it as a namespace-switching element worth keeping stripped.
|
|
453
|
+
const sanitized = deps.DOMPurify.sanitize(rawHtml, {
|
|
454
|
+
ADD_ATTR: ['target', 'style'],
|
|
455
|
+
...(options.math ? { ADD_TAGS: ['semantics', 'annotation'] } : {}),
|
|
456
|
+
});
|
|
457
|
+
return { status: 'rendered', html: sanitized, headingTree, mathFailed, pendingKeys };
|
|
458
|
+
}
|
|
459
|
+
/** The `lr-render-error` payload for a permanently-missing `katex` peer while `math` is set. */
|
|
460
|
+
export function markdownMathPeerError(tag) {
|
|
461
|
+
return new Error(`<${tag}> needs the optional peer dependency \`katex\` to render math (the \`math\` property is set) — install it with \`pnpm add katex\`.`);
|
|
462
|
+
}
|
|
463
|
+
/** Mirrors "the document is not final" onto the host as `aria-busy`, so assistive technology knows
|
|
464
|
+
* the rendered output is still resolving (peers loading, or `streaming` still on). */
|
|
465
|
+
export function applyMarkdownAriaBusy(host, busy) {
|
|
466
|
+
if (busy)
|
|
467
|
+
host.setAttribute('aria-busy', 'true');
|
|
468
|
+
else
|
|
469
|
+
host.removeAttribute('aria-busy');
|
|
470
|
+
}
|
|
471
|
+
// -- anchors ------------------------------------------------------------------------------------
|
|
472
|
+
/**
|
|
473
|
+
* Scrolls a `fragment` anchor's heading into view. `headingAnchors` may be off, so the target
|
|
474
|
+
* heading might carry no `id` attribute in the DOM at all -- and even with it on, DOMPurify's
|
|
475
|
+
* DOM-clobbering protection strips a slug colliding with a real `document` property name. Both
|
|
476
|
+
* cases fall back to re-deriving the same slug order `getHeadingTree()` was built in and matching
|
|
477
|
+
* by position instead of by attribute.
|
|
478
|
+
*/
|
|
479
|
+
export function applyMarkdownFragmentAnchor(root, anchor, headingTree) {
|
|
480
|
+
if (!anchor.id)
|
|
481
|
+
return false;
|
|
482
|
+
const index = headingTree.findIndex((h) => h.id === anchor.id);
|
|
483
|
+
if (index < 0)
|
|
484
|
+
return false;
|
|
485
|
+
const el = root.querySelector(`#${CSS.escape(anchor.id)}`) ?? root.querySelectorAll('h1, h2, h3, h4, h5, h6')[index];
|
|
486
|
+
if (!el)
|
|
487
|
+
return false;
|
|
488
|
+
el.scrollIntoView({ behavior: prefersReducedMotion() ? 'auto' : 'smooth', block: 'start' });
|
|
489
|
+
return true;
|
|
490
|
+
}
|
|
491
|
+
/** Scrolls a `text-quote` anchor's resolved range into view, centered. */
|
|
492
|
+
export function applyMarkdownTextQuoteAnchor(root, anchor) {
|
|
493
|
+
const range = resolveTextQuote(scopeFromElement(root), anchor);
|
|
494
|
+
if (!range)
|
|
495
|
+
return false;
|
|
496
|
+
const target = range.startContainer.nodeType === Node.ELEMENT_NODE
|
|
497
|
+
? range.startContainer
|
|
498
|
+
: range.startContainer.parentElement;
|
|
499
|
+
(target ?? root).scrollIntoView({ behavior: prefersReducedMotion() ? 'auto' : 'smooth', block: 'center' });
|
|
500
|
+
return true;
|
|
501
|
+
}
|
|
502
|
+
// -- highlight painting ---------------------------------------------------------------------------
|
|
503
|
+
/** Every `LyraHighlightTone`, used to always call `HighlightHandle.setRanges()` once per tone on
|
|
504
|
+
* every repaint (with an empty array for an unused tone) -- `setRanges()` replaces a tone's ranges
|
|
505
|
+
* wholesale per call, so a tone this pass has nothing for still needs an explicit empty call to
|
|
506
|
+
* clear whatever it painted last pass. */
|
|
507
|
+
const HIGHLIGHT_TONES = ['accent', 'success', 'warning', 'danger', 'neutral'];
|
|
508
|
+
/**
|
|
509
|
+
* Re-resolves every `text-quote` highlight against the current rendered content and repaints via
|
|
510
|
+
* the caller's `acquireHighlightHandle()` handle -- resolution is always by quote text, never by
|
|
511
|
+
* node identity, so a highlight set before its quote exists in `content` yet (e.g. mid-`streaming`)
|
|
512
|
+
* simply paints nothing until a later render's text actually contains it. `fragment` highlights
|
|
513
|
+
* aren't painted (there is no literal span of text to wrap/underline for a whole section).
|
|
514
|
+
* Returns the resolved ranges for `hitTestHighlightRanges()` to activate against.
|
|
515
|
+
*/
|
|
516
|
+
export function repaintMarkdownHighlights(options) {
|
|
517
|
+
const resolved = [];
|
|
518
|
+
const scope = scopeFromElement(options.root);
|
|
519
|
+
const rangesByTone = new Map(HIGHLIGHT_TONES.map((tone) => [tone, []]));
|
|
520
|
+
let activeRange = null;
|
|
521
|
+
for (const highlight of options.highlights) {
|
|
522
|
+
if (highlight.anchor.kind !== 'text-quote')
|
|
523
|
+
continue;
|
|
524
|
+
const range = resolveTextQuote(scope, highlight.anchor);
|
|
525
|
+
if (!range)
|
|
526
|
+
continue;
|
|
527
|
+
rangesByTone.get(highlight.tone ?? 'accent').push(range);
|
|
528
|
+
resolved.push({ id: highlight.id, range });
|
|
529
|
+
if (highlight.id === options.activeHighlightId)
|
|
530
|
+
activeRange = range;
|
|
531
|
+
}
|
|
532
|
+
for (const [tone, ranges] of rangesByTone)
|
|
533
|
+
options.handle.setRanges(tone, ranges);
|
|
534
|
+
options.handle.setActive(activeRange);
|
|
535
|
+
if (!supportsCustomHighlights()) {
|
|
536
|
+
// The `<mark>`-wrap fallback creates real elements but carries no `part` of its own (the module
|
|
537
|
+
// is shared by every adopting viewer, so it can't know this component's part naming) -- stamped
|
|
538
|
+
// here so a consumer can still target `::part(highlight)` in browsers lacking the CSS Custom
|
|
539
|
+
// Highlight API. Nothing to stamp on the API path: no DOM element is created there.
|
|
540
|
+
for (const mark of options.root.querySelectorAll('mark[data-lr-highlight-tone]')) {
|
|
541
|
+
if (!mark.hasAttribute('part'))
|
|
542
|
+
mark.setAttribute('part', 'highlight');
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
return resolved;
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Hit-tests a click point against every currently-resolved highlight's `getClientRects()`, topmost
|
|
549
|
+
* (last-resolved) first. The CSS Custom Highlight API paints ranges without creating any DOM element
|
|
550
|
+
* to attach a click listener to, so this is the only activation path that works identically on both
|
|
551
|
+
* paint paths -- mirrors `<lr-pdf-viewer>`'s own coordinate-based `onPageClick()` hit-test for the
|
|
552
|
+
* same reason (its own painted highlights sit under a text layer that intercepts most pointer
|
|
553
|
+
* events).
|
|
554
|
+
*/
|
|
555
|
+
export function hitTestHighlightRanges(ranges, x, y) {
|
|
556
|
+
for (let i = ranges.length - 1; i >= 0; i--) {
|
|
557
|
+
const hit = ranges[i];
|
|
558
|
+
if (!hit)
|
|
559
|
+
continue; // unreachable: counted loop, i is in [0, length - 1]
|
|
560
|
+
for (const rect of hit.range.getClientRects()) {
|
|
561
|
+
if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom)
|
|
562
|
+
return hit.id;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
return null;
|
|
566
|
+
}
|
|
567
|
+
// -- rendering ------------------------------------------------------------------------------------
|
|
568
|
+
/** The `href` of the rendered link a click landed on, when `internal-link-prefix` claims it --
|
|
569
|
+
* `null` for every other click, including one on an ordinary external link.
|
|
570
|
+
*
|
|
571
|
+
* Compared against the raw `href` *attribute*, not the `.href` IDL property: the property is
|
|
572
|
+
* always browser-resolved to an absolute URL (e.g. "https://example.com/docs") even for a
|
|
573
|
+
* relative/prefixed path, which would never match a relative `internal-link-prefix`. */
|
|
574
|
+
export function internalLinkHrefFrom(e, prefix) {
|
|
575
|
+
if (!prefix)
|
|
576
|
+
return null;
|
|
577
|
+
const anchor = e.composedPath().find((el) => el instanceof HTMLAnchorElement);
|
|
578
|
+
if (!anchor)
|
|
579
|
+
return null;
|
|
580
|
+
const href = anchor.getAttribute('href') ?? '';
|
|
581
|
+
return href.startsWith(prefix) ? href : null;
|
|
582
|
+
}
|
|
583
|
+
/** The rendered tree both variants produce: one `[part="content"]` wrapper plus the anchor-target
|
|
584
|
+
* live region. Only non-empty content is focusable -- an empty document is not a scrollable region
|
|
585
|
+
* worth a tab stop. */
|
|
586
|
+
export function renderMarkdownContent(options) {
|
|
587
|
+
const isFallback = options.renderedHtml === null;
|
|
588
|
+
// Indented two levels deeper than this function body on purpose. `[part='content'][data-fallback]`
|
|
589
|
+
// is `white-space: pre-wrap` (markdown.styles.ts), so the literal indentation around the binding
|
|
590
|
+
// below is *rendered* whitespace in the plain-text fallback state -- keeping the exact text both
|
|
591
|
+
// class files used before the extraction keeps that state pixel-identical.
|
|
592
|
+
// prettier-ignore
|
|
593
|
+
return html `
|
|
594
|
+
<div
|
|
595
|
+
part="content"
|
|
596
|
+
role="document"
|
|
597
|
+
tabindex=${options.content.trim() ? '0' : nothing}
|
|
598
|
+
aria-label=${options.hostAriaLabel || nothing}
|
|
599
|
+
?data-fallback=${isFallback}
|
|
600
|
+
@click=${options.onClick}
|
|
601
|
+
>
|
|
602
|
+
${isFallback ? options.content : unsafeHTML(options.renderedHtml)}
|
|
603
|
+
</div>
|
|
604
|
+
${options.liveRegion}
|
|
605
|
+
`;
|
|
606
|
+
}
|
|
253
607
|
//# sourceMappingURL=markdown-shared.js.map
|