@aceshooting/lyra-ui 13.0.0 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +212 -0
- package/custom-elements.json +1 -1
- package/dist/cli/migration-contract.json +1 -1
- package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +23 -15
- package/dist/components/agent-tools/activity-feed/activity-feed.class.js +9 -6
- package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +12 -3
- package/dist/components/agent-tools/agent-trace/agent-trace.class.js +2 -1
- package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +4 -2
- package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -1
- package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +1 -1
- package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts +1 -1
- package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +7 -7
- package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +5 -5
- package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +23 -10
- package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +13 -6
- package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +3 -3
- package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +1 -1
- package/dist/components/agent-tools/stack-trace/stack-trace-parse.js +3 -3
- package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +1 -1
- package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -1
- package/dist/components/agent-tools/task-list/task-list.class.d.ts +1 -2
- package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
- package/dist/components/agent-tools/terminal/terminal.class.d.ts +10 -1
- package/dist/components/agent-tools/terminal/terminal.class.js +3 -3
- package/dist/components/agent-tools/terminal/terminal.styles.js +1 -1
- package/dist/components/agent-tools/test-results/test-results.class.d.ts +4 -2
- package/dist/components/agent-tools/test-results/test-results.class.js +2 -2
- package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts +2 -0
- package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +1 -1
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +1 -1
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +1 -1
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +3 -2
- package/dist/components/agent-tools/tool-param-form/tool-param-form.d.ts +1 -1
- package/dist/components/agent-tools/tool-param-form/tool-param-form.js +1 -1
- package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.styles.js +1 -1
- package/dist/components/agent-tools/tool-result-view/registry.d.ts +2 -1
- package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts +1 -1
- package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js +1 -1
- package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts +18 -12
- package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +6 -6
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +9 -3
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -1
- package/dist/components/agent-tools/trace-tree/span.js +1 -1
- package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +1 -1
- package/dist/components/charts/chart/box-plot.class.d.ts +10 -3
- package/dist/components/charts/chart/box-plot.class.js +9 -9
- package/dist/components/charts/chart/box-plot.styles.js +1 -1
- package/dist/components/charts/chart/chart-core-loader.js +1 -1
- package/dist/components/charts/chart/chart-feature-loader.js +1 -1
- package/dist/components/charts/chart/chart-preload.d.ts +1 -1
- package/dist/components/charts/chart/chart-preload.js +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +27 -9
- package/dist/components/charts/chart/chart.class.js +23 -14
- package/dist/components/charts/chart/chart.styles.js +1 -1
- package/dist/components/charts/chart/histogram-bin.js +1 -1
- package/dist/components/charts/chart/lite-chart.class.js +7 -3
- package/dist/components/charts/chart/lite-chart.styles.js +1 -1
- package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +1 -1
- package/dist/components/conversation/agent-workspace/agent-workspace.class.js +2 -2
- package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +10 -5
- package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +1 -1
- package/dist/components/conversation/branch-picker/branch-picker.class.d.ts +4 -2
- package/dist/components/conversation/branch-picker/branch-picker.class.js +1 -1
- package/dist/components/conversation/branch-picker/branch-picker.styles.js +1 -1
- package/dist/components/conversation/chat-composer/chat-composer.class.d.ts +6 -2
- package/dist/components/conversation/chat-composer/chat-composer.class.js +3 -3
- package/dist/components/conversation/chat-composer/chat-composer.styles.js +1 -1
- package/dist/components/conversation/chat-message/chat-message.class.js +2 -2
- package/dist/components/conversation/chat-message/chat-message.styles.js +1 -1
- package/dist/components/conversation/chat-viewport/chat-viewport.styles.js +1 -1
- package/dist/components/conversation/code-block/code-block-shared.js +1 -1
- package/dist/components/conversation/code-block/code-block.styles.js +1 -1
- package/dist/components/conversation/code-block/code-loader.d.ts +1 -1
- package/dist/components/conversation/code-block/code-loader.js +1 -1
- package/dist/components/conversation/code-block/shiki-types.js +1 -1
- package/dist/components/conversation/conversation-item/conversation-item.styles.js +1 -1
- package/dist/components/conversation/generation-metrics/generation-metrics.styles.js +1 -1
- package/dist/components/conversation/markdown/katex-loader.d.ts +4 -4
- package/dist/components/conversation/markdown/katex-loader.js +1 -1
- package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
- package/dist/components/conversation/markdown/markdown-loader.d.ts +1 -1
- package/dist/components/conversation/markdown/markdown-loader.js +1 -1
- package/dist/components/conversation/markdown/markdown-shared.d.ts +6 -1
- package/dist/components/conversation/markdown/markdown-shared.js +5 -4
- package/dist/components/conversation/message-actions/message-actions.class.d.ts +16 -3
- package/dist/components/conversation/message-actions/message-actions.class.js +2 -2
- package/dist/components/conversation/message-actions/message-actions.styles.js +1 -1
- package/dist/components/conversation/message-actions/toolbar-actions.d.ts +3 -1
- package/dist/components/conversation/message-actions/toolbar-actions.js +1 -1
- package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +38 -15
- package/dist/components/conversation/message-feedback/message-feedback.class.js +7 -3
- package/dist/components/conversation/message-feedback/message-feedback.styles.js +1 -1
- package/dist/components/conversation/message-parts/message-parts.class.d.ts +7 -4
- package/dist/components/conversation/message-parts/message-parts.class.js +2 -2
- package/dist/components/conversation/message-parts/message-parts.styles.js +1 -1
- package/dist/components/conversation/model-select/model-select.class.d.ts +5 -2
- package/dist/components/conversation/model-select/model-select.class.js +5 -2
- package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts +3 -5
- package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +2 -1
- package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +9 -2
- package/dist/components/conversation/prompt-input/prompt-input.class.js +3 -3
- package/dist/components/conversation/prompt-input/prompt-input.styles.js +1 -1
- package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts +20 -4
- package/dist/components/conversation/prompt-queue/prompt-queue.class.js +1 -1
- package/dist/components/conversation/prompt-queue/prompt-queue.styles.js +1 -1
- package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts +17 -8
- package/dist/components/conversation/push-to-talk/push-to-talk.class.js +1 -1
- package/dist/components/conversation/push-to-talk/push-to-talk.styles.js +1 -1
- package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +6 -3
- package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
- package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.js +1 -1
- package/dist/components/conversation/thread-list/thread-list.class.d.ts +14 -4
- package/dist/components/conversation/thread-list/thread-list.class.js +11 -11
- package/dist/components/conversation/thread-list/thread-list.styles.js +1 -1
- package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +1 -1
- package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +12 -4
- package/dist/components/conversation/voice-picker/voice-picker.class.js +5 -2
- package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
- package/dist/components/data/calendar/calendar.class.d.ts +12 -4
- package/dist/components/data/calendar/calendar.class.js +2 -2
- package/dist/components/data/calendar/calendar.styles.js +1 -1
- package/dist/components/data/context-meter/context-meter.class.d.ts +3 -1
- package/dist/components/data/context-meter/context-meter.class.js +3 -3
- package/dist/components/data/data-grid/data-grid.class.d.ts +45 -4
- package/dist/components/data/data-grid/data-grid.class.js +25 -11
- package/dist/components/data/data-grid/data-grid.styles.js +1 -1
- package/dist/components/data/document-library/document-library.class.js +1 -1
- package/dist/components/data/env-list/env-list.class.js +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +19 -12
- package/dist/components/data/flow-canvas/flow-canvas.class.js +1 -2
- package/dist/components/data/flow-controls/flow-controls.styles.js +1 -1
- package/dist/components/data/flow-run-status/flow-run-status.class.js +1 -1
- package/dist/components/data/gauge/gauge.class.js +1 -1
- package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +1 -1
- package/dist/components/data/heatmap/heatmap.class.js +1 -1
- package/dist/components/data/sequence-strip/sequence-strip.class.js +1 -1
- package/dist/components/data/stat/stat.class.js +1 -1
- package/dist/components/data/table/table.class.d.ts +10 -14
- package/dist/components/data/table/table.class.js +4 -3
- package/dist/components/data/table/table.styles.js +1 -1
- package/dist/components/data/timeline/timeline.class.js +1 -1
- package/dist/components/data/tree/tree-item.styles.js +1 -1
- package/dist/components/data/word-cloud/word-cloud.class.js +1 -1
- package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +7 -2
- package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
- package/dist/components/forms/code-editor/code-editor.class.d.ts +8 -4
- package/dist/components/forms/code-editor/code-editor.class.js +16 -5
- package/dist/components/forms/code-editor/code-editor.styles.js +1 -1
- package/dist/components/forms/color-picker/color-picker.class.d.ts +1 -1
- package/dist/components/forms/color-picker/color-picker.class.js +1 -1
- package/dist/components/forms/combobox/combobox.styles.js +1 -1
- package/dist/components/forms/date-picker/date-input.class.js +1 -1
- package/dist/components/forms/date-picker/date-picker.class.d.ts +9 -2
- package/dist/components/forms/date-picker/date-picker.class.js +4 -4
- package/dist/components/forms/date-picker/date-picker.styles.js +1 -1
- package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.js +1 -1
- package/dist/components/forms/input/input.class.d.ts +11 -4
- package/dist/components/forms/input/input.class.js +7 -1
- package/dist/components/forms/input/time-input.class.d.ts +8 -2
- package/dist/components/forms/input/time-input.class.js +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.d.ts +17 -3
- package/dist/components/forms/locale-picker/locale-picker.class.js +1 -1
- package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
- package/dist/components/forms/rubric-form/rubric-form.class.js +1 -1
- package/dist/components/forms/select/select.styles.js +1 -1
- package/dist/components/forms/slider/slider.class.js +1 -1
- package/dist/components/forms/swatch-picker/swatch-picker.class.js +1 -1
- package/dist/components/forms/token-input/token-input.class.js +1 -1
- package/dist/components/forms/token-input/token-input.styles.js +1 -1
- package/dist/components/layout/app-rail/app-rail.class.d.ts +6 -4
- package/dist/components/layout/app-rail/app-rail.class.js +4 -3
- package/dist/components/layout/app-rail/app-rail.styles.js +1 -1
- package/dist/components/layout/command-palette/command-palette.class.d.ts +2 -2
- package/dist/components/layout/command-palette/command-palette.class.js +1 -1
- package/dist/components/layout/command-palette/command-palette.styles.js +1 -1
- package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
- package/dist/components/layout/details/details.class.d.ts +13 -12
- package/dist/components/layout/details/details.class.js +43 -34
- package/dist/components/layout/details/details.styles.js +1 -1
- package/dist/components/layout/dock-panel/dock-panel.class.d.ts +4 -3
- package/dist/components/layout/dock-panel/dock-panel.class.js +2 -1
- package/dist/components/layout/filter-bar/filter-bar.class.js +2 -2
- package/dist/components/layout/menu/menu-item.class.js +2 -2
- package/dist/components/layout/menu/menu.class.js +1 -1
- package/dist/components/layout/multi-split/multi-split.class.d.ts +10 -5
- package/dist/components/layout/multi-split/multi-split.class.js +2 -1
- package/dist/components/layout/scroller/scroller.class.d.ts +4 -4
- package/dist/components/layout/scroller/scroller.styles.js +1 -1
- package/dist/components/layout/split-panel/split-panel.class.d.ts +3 -2
- package/dist/components/layout/split-panel/split-panel.class.js +3 -2
- package/dist/components/layout/tab-group/tab-group.styles.js +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.js +2 -2
- package/dist/components/layout/widget/widget.styles.js +1 -1
- package/dist/components/media/file-input/file-input.styles.js +1 -1
- package/dist/components/media/flag/flag.class.js +1 -1
- package/dist/components/media/lightbox/lightbox.styles.js +1 -1
- package/dist/components/media/map/map-loader.js +1 -1
- package/dist/components/media/map/map.class.d.ts +17 -31
- package/dist/components/media/map/map.class.js +1 -1
- package/dist/components/media/qr-code/qr-code-loader.js +1 -1
- package/dist/components/media/qr-code/qr-code.class.d.ts +5 -2
- package/dist/components/media/qr-code/qr-code.class.js +2 -2
- package/dist/components/media/sequence-playback/sequence-playback.class.d.ts +2 -2
- package/dist/components/media/sequence-playback/sequence-playback.class.js +1 -1
- package/dist/components/overlays/alert/alert.styles.js +1 -1
- package/dist/components/overlays/callout/callout.styles.js +1 -1
- package/dist/components/overlays/dialog/dialog.styles.js +1 -1
- package/dist/components/overlays/kbd/kbd.class.js +1 -1
- package/dist/components/overlays/overlay/popover.class.js +1 -1
- package/dist/components/overlays/overlay/tooltip.class.js +1 -1
- package/dist/components/overlays/rating/rating.class.js +1 -1
- package/dist/components/overlays/toast/toast-item.class.js +1 -1
- package/dist/components/retrieval/claim-evidence/claim-evidence.class.d.ts +11 -5
- package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +3 -3
- package/dist/components/retrieval/graph/graph-loader.js +1 -1
- package/dist/components/retrieval/graph/graph.class.d.ts +1 -1
- package/dist/components/retrieval/graph/graph.class.js +10 -10
- package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts +4 -2
- package/dist/components/retrieval/graph-legend/graph-legend.class.js +1 -1
- package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +14 -6
- package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +7 -5
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +3 -2
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +4 -3
- package/dist/components/retrieval/knowledge-base/knowledge-base.styles.js +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +4 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +2 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
- package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +15 -6
- package/dist/components/retrieval/memory-panel/memory-panel.class.js +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +1 -1
- package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +1 -1
- package/dist/components/retrieval/node-palette/node-palette.class.d.ts +17 -12
- package/dist/components/retrieval/node-palette/node-palette.class.js +2 -2
- package/dist/components/retrieval/node-palette/node-palette.styles.js +1 -1
- package/dist/components/retrieval/path-strip/path-strip.class.js +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +5 -5
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
- package/dist/components/retrieval/source-picker/source-picker.class.js +1 -1
- package/dist/components/utility/copy-button/copy-button.class.d.ts +2 -1
- package/dist/components/utility/copy-button/copy-button.class.js +1 -1
- package/dist/components/utility/diff-view/diff-view.class.d.ts +4 -1
- package/dist/components/utility/diff-view/diff-view.class.js +1 -1
- package/dist/components/utility/export-button/export-button.class.d.ts +2 -2
- package/dist/components/utility/export-button/export-button.class.js +1 -1
- package/dist/components/utility/export-button/export-button.styles.js +1 -1
- package/dist/components/utility/format/format-date.class.js +1 -1
- package/dist/components/utility/format/relative-time.class.js +1 -1
- package/dist/components/utility/icon/dompurify-loader.js +1 -1
- package/dist/components/utility/icon/icon-library.js +1 -1
- package/dist/components/utility/intersection-observer/intersection-observer.class.js +1 -1
- package/dist/components/utility/json-viewer/json-viewer.class.d.ts +3 -1
- package/dist/components/utility/json-viewer/json-viewer.class.js +5 -5
- package/dist/components/utility/known-date/known-date.class.js +1 -1
- package/dist/components/utility/mention-popover/mention-popover.class.d.ts +29 -44
- package/dist/components/utility/mention-popover/mention-popover.class.js +1 -1
- package/dist/components/utility/mutation-observer/mutation-observer.class.js +1 -1
- package/dist/components/viewers/calendar-viewer/calendar-loader.js +1 -1
- package/dist/components/viewers/document-compare/document-compare.class.d.ts +11 -8
- package/dist/components/viewers/document-compare/document-compare.class.js +2 -2
- package/dist/components/viewers/document-preview/document-preview.class.d.ts +4 -2
- package/dist/components/viewers/document-preview/document-preview.class.js +4 -4
- package/dist/components/viewers/document-preview/document-preview.styles.js +1 -1
- package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +2 -0
- package/dist/components/viewers/document-viewer/document-viewer.styles.js +1 -1
- package/dist/components/viewers/docx-viewer/docx-loader.js +1 -1
- package/dist/components/viewers/docx-viewer/docx-viewer.class.js +1 -1
- package/dist/components/viewers/ebook-viewer/ebook-loader.d.ts +1 -1
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +2 -2
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
- package/dist/components/viewers/email-viewer/email-loader.js +1 -1
- package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +1 -1
- package/dist/components/viewers/email-viewer/email-viewer.class.js +2 -2
- package/dist/components/viewers/html-viewer/dompurify-loader.js +1 -1
- package/dist/components/viewers/notebook-viewer/dompurify-loader.js +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-loader.js +1 -1
- package/dist/components/viewers/pptx-viewer/pptx-loader.js +1 -1
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-loader.js +1 -1
- package/dist/components/viewers/svg-viewer/dompurify-loader.js +1 -1
- package/dist/components/viewers/viewer-loading.js +1 -1
- package/dist/components/viewers/viewer-search-limits.d.ts +2 -0
- package/dist/components/viewers/viewer-search-limits.js +1 -1
- package/dist/custom-elements-jsx.d.ts +1 -1
- package/dist/events.d.ts +13 -6
- package/dist/internal/aria-controls.d.ts +16 -13
- package/dist/internal/aria-controls.js +1 -1
- package/dist/internal/aria-reflection.js +1 -1
- package/dist/internal/catalog-picker.d.ts +2 -2
- package/dist/internal/catalog-picker.js +1 -1
- package/dist/internal/chart-annotation-registration.d.ts +1 -0
- package/dist/internal/chart-annotation-registration.js +1 -0
- package/dist/internal/data-descriptors.d.ts +13 -0
- package/dist/internal/data-descriptors.js +1 -0
- package/dist/internal/default-strings.generated.d.ts +1 -1
- package/dist/internal/default-strings.generated.js +2 -2
- package/dist/internal/dev-mode-attribute-warning.js +1 -1
- package/dist/internal/element-internals.d.ts +4 -3
- package/dist/internal/element-internals.js +1 -1
- package/dist/internal/highlight-collection.d.ts +2 -0
- package/dist/internal/highlight-collection.js +1 -1
- package/dist/internal/localization-types.d.ts +1 -1
- package/dist/internal/localization.js +2 -2
- package/dist/internal/lyra-element.d.ts +10 -1
- package/dist/internal/lyra-element.js +2 -1
- package/dist/internal/package-metadata.d.ts +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/internal/papaparse-loader.js +1 -1
- package/dist/internal/pseudo-localization.js +1 -1
- package/dist/internal/safe-css.js +1 -1
- package/dist/internal/step-value.d.ts +6 -0
- package/dist/internal/step-value.js +1 -0
- package/dist/internal/text-quote.js +1 -1
- package/dist/lyra.d.ts +1 -1
- package/dist/svelte.d.ts +1 -1
- package/dist/translations/ar.js +2 -2
- package/dist/translations/de.js +2 -2
- package/dist/translations/es.js +2 -2
- package/dist/translations/fa.js +2 -2
- package/dist/translations/fr.js +2 -2
- package/dist/translations/he.js +2 -2
- package/dist/translations/ja.js +2 -2
- package/dist/translations/pseudo/ar-XB.js +1 -1
- package/dist/translations/pt-BR.js +2 -2
- package/dist/translations/ru.js +2 -2
- package/dist/translations/zh-CN.js +2 -2
- package/dist/vue.d.ts +1 -1
- package/llms/components/lr-accordion-item.md +6 -5
- package/llms/components/lr-accordion.md +6 -5
- package/llms/components/lr-activity-feed.md +6 -5
- package/llms/components/lr-agent-run.md +1 -1
- package/llms/components/lr-agent-workspace.md +3 -2
- package/llms/components/lr-attachment-chip.md +2 -3
- package/llms/components/lr-audio-visualizer.md +9 -6
- package/llms/components/lr-bar-chart.md +2 -2
- package/llms/components/lr-box-plot.md +9 -6
- package/llms/components/lr-bubble-chart.md +2 -2
- package/llms/components/lr-calendar.md +10 -4
- package/llms/components/lr-chart.md +11 -5
- package/llms/components/lr-chat-composer.md +2 -1
- package/llms/components/lr-chunk-inspector.md +2 -2
- package/llms/components/lr-code-block-core.md +4 -4
- package/llms/components/lr-code-block.md +10 -14
- package/llms/components/lr-code-editor.md +2 -0
- package/llms/components/lr-copy-button.md +4 -1
- package/llms/components/lr-data-grid.md +11 -2
- package/llms/components/lr-date-input.md +4 -0
- package/llms/components/lr-date-picker.md +5 -1
- package/llms/components/lr-details.md +6 -5
- package/llms/components/lr-diff-view.md +6 -0
- package/llms/components/lr-document-compare.md +6 -2
- package/llms/components/lr-document-preview.md +11 -3
- package/llms/components/lr-document-viewer.md +5 -1
- package/llms/components/lr-docx-viewer.md +6 -0
- package/llms/components/lr-doughnut-chart.md +2 -2
- package/llms/components/lr-ebook-viewer.md +8 -3
- package/llms/components/lr-email-viewer.md +5 -0
- package/llms/components/lr-eval-dataset.md +2 -2
- package/llms/components/lr-export-button.md +9 -0
- package/llms/components/lr-file-input.md +5 -8
- package/llms/components/lr-format-date.md +3 -1
- package/llms/components/lr-graph-legend.md +4 -2
- package/llms/components/lr-grounding-summary.md +8 -8
- package/llms/components/lr-histogram.md +2 -2
- package/llms/components/lr-ingestion-queue.md +1 -1
- package/llms/components/lr-intersection-observer.md +9 -0
- package/llms/components/lr-json-viewer.md +6 -1
- package/llms/components/lr-knowledge-base.md +10 -1
- package/llms/components/lr-line-chart.md +2 -2
- package/llms/components/lr-lite-chart.md +8 -5
- package/llms/components/lr-locale-picker.md +6 -0
- package/llms/components/lr-map.md +15 -5
- package/llms/components/lr-markdown.md +7 -4
- package/llms/components/lr-media-card.md +0 -6
- package/llms/components/lr-mention-popover.md +12 -10
- package/llms/components/lr-message-actions.md +10 -3
- package/llms/components/lr-message-feedback.md +20 -7
- package/llms/components/lr-message-parts.md +3 -1
- package/llms/components/lr-model-select.md +5 -2
- package/llms/components/lr-multi-split.md +5 -1
- package/llms/components/lr-mutation-observer.md +8 -0
- package/llms/components/lr-node-palette.md +5 -2
- package/llms/components/lr-pie-chart.md +2 -2
- package/llms/components/lr-polar-area-chart.md +2 -2
- package/llms/components/lr-prompt-input.md +7 -3
- package/llms/components/lr-prompt-queue.md +6 -0
- package/llms/components/lr-push-to-talk.md +5 -0
- package/llms/components/lr-qr-code.md +6 -0
- package/llms/components/lr-radar-chart.md +2 -2
- package/llms/components/lr-rating.md +5 -0
- package/llms/components/lr-relative-time.md +2 -0
- package/llms/components/lr-result-card.md +3 -3
- package/llms/components/lr-result-field.md +3 -3
- package/llms/components/lr-retrieval-results.md +1 -1
- package/llms/components/lr-scatter-chart.md +2 -2
- package/llms/components/lr-scroller.md +5 -5
- package/llms/components/lr-sequence-playback.md +1 -2
- package/llms/components/lr-slider.md +3 -1
- package/llms/components/lr-streaming-text.md +2 -3
- package/llms/components/lr-terminal.md +14 -5
- package/llms/components/lr-thinking-panel.md +3 -1
- package/llms/components/lr-thread-list.md +20 -1
- package/llms/components/lr-tool-call-chip.md +2 -2
- package/llms/components/lr-tool-param-form.md +2 -2
- package/llms/components/lr-tool-result-view.md +2 -3
- package/llms/components/lr-tool-select-dialog.md +2 -2
- package/llms/components/lr-voice-picker.md +7 -2
- package/llms/components/lr-widget-renderer.md +12 -13
- package/llms/peers.md +5 -5
- package/llms/shared.md +74 -63
- package/llms-full.txt +629 -247
- package/package.json +21 -14
- package/vscode-css-data.json +1 -1
- package/vscode-html-data.json +1 -1
- package/web-types.json +1 -1
- package/dist/components/viewers/docx-viewer/fixtures/minimal-docx-fixture.d.ts +0 -1
- package/dist/components/viewers/docx-viewer/fixtures/minimal-docx-fixture.js +0 -1
- package/dist/components/viewers/ebook-viewer/fixtures/minimal-epub-fixture.d.ts +0 -1
- package/dist/components/viewers/ebook-viewer/fixtures/minimal-epub-fixture.js +0 -1
- package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.d.ts +0 -1
- package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{LyraElement}from"../../../internal/lyra-element.js";import{boundedViewerSearchQuery}from"../viewer-search-limits.js";import{srOnly}from"../../../internal/a11y.js";import{isAbortError,isResourceLimitError,LyraUserFacingError,readResponseArrayBuffer,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{invalidateLyraLocaleCache}from"../../../internal/localization-runtime.js";import{Slugger}from"../../../internal/slugger.js";import{DocumentAnchorTarget,prioritizedHighlightCandidates}from"../../../internal/anchor-target.js";import{buildQuoteAnchor,createTextQuoteIndex,emptyTextQuoteMatches,rangeFromTextQuoteMatch,rangesFromTextQuoteMatches,scopeFromElement,TEXT_QUOTE_LIMITS,TEXT_SELECTION_RECT_LIMIT}from"../../../internal/text-quote.js";import{acquireHighlightHandle,supportsCustomHighlights}from"../../../internal/text-highlights.js";import{loadDocxDeps}from"./docx-loader.js";import{assertDocxArchiveWithinLimits}from"./docx-resource-guard.js";import{styles}from"./docx-viewer.styles.js";import{ViewerAnnouncementController}from"../viewer-announcements.js";import{renderViewerLoading,viewerLoadingStyles}from"../viewer-loading.js";import{sanitizePassiveMarkup}from"../passive-markup.js";import{viewerSemanticLabel,viewerSemanticRole}from"../viewer-semantic-owner.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_documentPreviewEmpty,LYRA_DEFAULT_documentPreviewFailedToLoad,LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeDocument,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_documentViewerMissingSanitizer,LYRA_DEFAULT_docxViewerLabel,LYRA_DEFAULT_docxViewerMissingConverter,LYRA_DEFAULT_highlightWithLabel,LYRA_DEFAULT_loadingDocument}from"../../../internal/default-strings.generated.js";const HIGHLIGHT_TONES=["accent","success","warning","danger","neutral"],MAX_DOCX_SEARCH_MATCHES=1e3,MAX_DOCX_PAINTED_SEARCH_MATCHES=200,MAX_DOCX_PAINTED_HIGHLIGHTS=100;function nextDocxPaintNode(node,root){if(node.firstChild)return node.firstChild;let cursor=node;for(;cursor&&cursor!==root;){if(cursor.nextSibling)return cursor.nextSibling;cursor=cursor.parentNode}return null}function wrapRangeInSearchMarks(range,part,budget){const doc=range.startContainer.ownerDocument;if(!doc)return[];const textNodeType=doc.defaultView?.Node.TEXT_NODE??3;if(range.startContainer===range.endContainer&&range.startContainer.nodeType===textNodeType){const textNode=range.startContainer;if(budget.traversalNodes<=0||budget.codeUnits<=0||budget.marks<=0)return[];if(budget.traversalNodes--,textNode.data.length>budget.codeUnits)return budget.codeUnits=0,[];budget.codeUnits-=textNode.data.length;let target=textNode;if(range.endOffset<target.data.length&&target.splitText(range.endOffset),range.startOffset>0&&(target=target.splitText(range.startOffset)),!target.data)return[];const mark=doc.createElement("mark");return mark.setAttribute("part",part),target.parentNode?.insertBefore(mark,target),mark.appendChild(target),budget.marks--,[mark]}const ancestor=range.commonAncestorContainer,covered=[];let node=ancestor;for(;node&&budget.traversalNodes>0&&budget.codeUnits>0;){if(budget.traversalNodes--,node.nodeType===textNodeType){const textNode=node;if(textNode.data.length>budget.codeUnits){budget.codeUnits=0;break}budget.codeUnits-=textNode.data.length;try{if(textNode.data.length>0&&range.intersectsNode(textNode)&&(covered.push(textNode),covered.length>budget.marks))return[]}catch{return[]}}node=nextDocxPaintNode(node,ancestor)}if(node)return[];const marks=[];for(const textNode of covered){const start=textNode===range.startContainer?range.startOffset:0,end=textNode===range.endContainer?range.endOffset:textNode.data.length;let target=textNode;if(end<target.data.length&&target.splitText(end),start>0&&(target=target.splitText(start)),!target.data)continue;const mark=doc.createElement("mark");mark.setAttribute("part",part),target.parentNode?.insertBefore(mark,target),mark.appendChild(target),marks.push(mark),budget.marks--}return marks}function unwrapSearchMark(mark){const parent=mark.parentNode;if(!parent)return;const before=mark.previousSibling,firstMoved=mark.firstChild;for(;mark.firstChild;)parent.insertBefore(mark.firstChild,mark);const after=mark.nextSibling;parent.removeChild(mark);let cursor=before?.nodeType===3?before:firstMoved??after,localSteps=0;for(;cursor&&cursor.parentNode===parent&&localSteps++<4&&cursor.nodeType===3;){const text=cursor;if(text.data===""){const next2=text.nextSibling;text.remove(),cursor=next2;continue}const next=text.nextSibling;if(next?.nodeType!==3)break;text.appendData(next.data),next.remove()}}class LyraDocxViewerBase extends LyraElement{}class LyraDocxViewer extends DocumentAnchorTarget(LyraDocxViewerBase){constructor(){super(...arguments),this.src="",this.name="",this.maxHeight="",this.anchorKinds=["fragment","text-quote"],this.fetchState={kind:"idle"},this.searchMatches=emptyTextQuoteMatches(),this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.resolvedHighlightActions=[],this.generation=0,this.lastLoadSrc="",this.loadLibrary=loadDocxDeps,this.announcements=new ViewerAnnouncementController(this),this.headingTree=[],this.resolvedHighlightRanges=[],this.pendingResolvedHighlightActions=[],this.resolvedHighlightActionSyncPending=!1,this.searchQuery="",this.paintedSearchMarks=[],this.textIndexCache=null,this.textIndexMappingDirty=!1,this.onContentClick=e=>{const highlightId=this.hitTestHighlightAt(e.clientX,e.clientY);highlightId&&this.emit("lr-highlight-activate",{highlightId})}}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewFailedToLoad:LYRA_DEFAULT_documentPreviewFailedToLoad,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeDocument:LYRA_DEFAULT_documentPreviewTypeDocument,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,documentViewerMissingSanitizer:LYRA_DEFAULT_documentViewerMissingSanitizer,docxViewerLabel:LYRA_DEFAULT_docxViewerLabel,docxViewerMissingConverter:LYRA_DEFAULT_docxViewerMissingConverter,highlightWithLabel:LYRA_DEFAULT_highlightWithLabel,loadingDocument:LYRA_DEFAULT_loadingDocument}}static{this.styles=[LyraElement.styles,styles,srOnly,viewerLoadingStyles]}connectedCallback(){super.connectedCallback(),this.announcements.connect(),this.hasUpdated&&this.src.trim()&&this.src===this.lastLoadSrc&&this.scheduleAfterUpdate(()=>{this.load()})}disconnectedCallback(){this.generation++,this.resetResolvedHighlightActions(),this.announcements.disconnect(),super.disconnectedCallback(),this.highlightHandle?.release(),this.highlightHandle=void 0}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}willUpdate(changed){super.willUpdate(changed),(changed.has("src")||changed.has("highlights"))&&this.resetResolvedHighlightActions(),(changed.has("src")||changed.has("fetchState"))&&this.resetSearchForContentChange()}updated(changed){super.updated(changed);const locale=this.effectiveLocale,localeChanged=this.textIndexLocale!==void 0&&this.textIndexLocale!==locale;if(this.textIndexLocale=locale,localeChanged&&(this.textIndexCache=null),this.announcements.transition("load",this.fetchState.kind,this.fetchState.kind==="error"?this.fetchState.message:this.localize("loadingDocument")),changed.has("src")&&this.scheduleAfterUpdate(()=>{this.load()}),changed.has("fetchState")){const root=this.contentRoot();root&&this.bindTextSelection(root),this.textIndexCache=null,this.textIndexMappingDirty=!1}(changed.has("fetchState")||changed.has("highlights")||changed.has("activeHighlightId")||localeChanged&&this.highlights.length>0)&&this.repaintHighlights(),localeChanged&&this.searchQuery.trim()&&this.scheduleAfterUpdate(()=>{this.search(this.searchQuery)})}contentRoot(){return this.renderRoot.querySelector('[part="content"]')}resetSearchForContentChange(){const shouldEmit=this.searchQuery!==""||this.searchMatches.length>0||this.searchActiveIndex!==-1;this.searchQuery="",this.searchMatches=emptyTextQuoteMatches(),this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.clearSearchPaint(),shouldEmit&&this.emit("lr-search-change",{query:"",matchCount:0,matchCountExact:!0,activeIndex:-1})}async load(){const generation=++this.generation,signal=this.beginAbortableLoad();if(this.lastLoadSrc=this.src,!this.src){this.fetchState={kind:"idle"},this.headingTree=[];return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){this.failWithLocalizedMessage(this.localize("documentPreviewUrlNotAllowed"));return}this.fetchState={kind:"loading"};try{const response=await fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0);if(!this.isConnected||generation!==this.generation)return;if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);const arrayBuffer=await readResponseArrayBuffer(response);if(!this.isConnected||generation!==this.generation||(await assertDocxArchiveWithinLimits(arrayBuffer,void 0,void 0,{signal}),!this.isConnected||generation!==this.generation))return;const{mammoth,DOMPurify}=await this.loadLibrary();if(!this.isConnected||generation!==this.generation)return;if(!mammoth){this.failWithLocalizedMessage(this.localize("docxViewerMissingConverter"));return}if(!DOMPurify){this.failWithLocalizedMessage(this.localize("documentViewerMissingSanitizer"));return}const converted=await mammoth.convertToHtml({arrayBuffer});if(!this.isConnected||generation!==this.generation)return;const markup=sanitizePassiveMarkup(DOMPurify,converted.value,this.ownerDocument,"passive-document");if(!this.isConnected||generation!==this.generation)return;if(this.fetchState={kind:"loaded",markup:this.stampHeadings(markup)},converted.messages.length>0)for(const cause of converted.messages)this.emit("lr-viewer-diagnostic",{diagnostic:Object.freeze({code:"docx-conversion-message",severity:"warning",fatal:!1,source:"mammoth",cause})})}catch(error){if(isAbortError(error)||!this.isConnected||generation!==this.generation)return;this.fetchState={kind:"error",message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")},this.emit("lr-render-error",{error})}}failWithLocalizedMessage(message){const error=new LyraUserFacingError(message);this.fetchState={kind:"error",message},this.emit("lr-render-error",{error})}stampHeadings(sanitizedHtml){const DOMParserCtor=this.ownerDocument.defaultView?.DOMParser;if(!DOMParserCtor)throw new Error("DOMParser is unavailable without a browsing context.");const doc=new DOMParserCtor().parseFromString(sanitizedHtml,"text/html"),slugger=new Slugger,tree=[],walker=doc.createTreeWalker(doc.body,1);let inspected=0,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes&&(node=walker.nextNode());){inspected++;const heading=node;if(!/^H[1-6]$/.test(heading.tagName))continue;const level=Number(heading.tagName.slice(1)),label=(heading.textContent??"").trim(),slug=slugger.slug(label);slug&&(heading.id=slug),tree.push({id:slug,label,level})}return this.headingTree=tree,doc.body.innerHTML}getHeadingTree(){return[...this.headingTree]}async applyAnchor(anchor){const root=this.contentRoot();if(!root)return!1;switch(anchor.kind){case"fragment":return this.applyFragmentAnchor(root,anchor);case"text-quote":return this.applyTextQuoteAnchor(root,anchor);default:return!1}}applyFragmentAnchor(root,anchor){if(!anchor.id)return!1;let expectedIndex=-1;const headingLimit=Math.min(this.headingTree.length,TEXT_QUOTE_LIMITS.maxTraversalNodes);for(let index=0;index<headingLimit;index++)if(this.headingTree[index]?.id===anchor.id){expectedIndex=index;break}if(expectedIndex<0)return!1;const walker=root.ownerDocument.createTreeWalker(root,1);let inspected=0,headingIndex=0,idMatch=null,positionalMatch=null,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes&&(node=walker.nextNode());){inspected++;const heading=node;if(/^H[1-6]$/.test(heading.tagName)&&(heading.getAttribute("id")===anchor.id&&(idMatch??=heading),headingIndex===expectedIndex&&(positionalMatch=heading),headingIndex++,idMatch&&positionalMatch))break}const el=idMatch??positionalMatch;return el?(el.scrollIntoView({behavior:prefersReducedMotion(this.ownerDocument.defaultView)?"auto":"smooth",block:"start"}),!0):!1}applyTextQuoteAnchor(root,anchor){const{scope,index}=this.currentTextIndex(root),match=index.resolve(anchor),range=match?rangeFromTextQuoteMatch(scope,match):null;return range?(((range.startContainer.nodeType===Node.ELEMENT_NODE?range.startContainer:range.startContainer.parentElement)??root).scrollIntoView({behavior:prefersReducedMotion(this.ownerDocument.defaultView)?"auto":"smooth",block:"center"}),!0):!1}computeSelectionAnchor(range){const root=this.contentRoot();return root?buildQuoteAnchor(range,this.currentTextIndex(root).scope):null}ensureHighlightHandle(){return this.highlightHandle||(this.highlightHandle=acquireHighlightHandle(this,this.ownerDocument)),this.highlightHandle}repaintHighlights(){this.resolvedHighlightRanges=[];const root=this.contentRoot(),handle=this.ensureHighlightHandle();if(!root){this.syncResolvedHighlightActions([]);for(const tone of HIGHLIGHT_TONES)handle.setRanges(tone,[]);handle.setActive(null);return}const{scope,index}=this.currentTextIndex(root),workBudget=index.createWorkBudget(),rangesByTone=new Map(HIGHLIGHT_TONES.map(tone=>[tone,[]]));let activeRange=null;const candidates=prioritizedHighlightCandidates(this.highlights,this.activeHighlightId),resolved=[];for(const highlight of candidates){if(resolved.length>=MAX_DOCX_PAINTED_HIGHLIGHTS)break;if(highlight.anchor.kind!=="text-quote")continue;const match=index.resolve(highlight.anchor,workBudget);match&&resolved.push({highlight,match})}const resolvedRanges=rangesFromTextQuoteMatches(scope,resolved.map(({match})=>match));for(let position=0;position<resolved.length;position++){const{highlight}=resolved[position],range=resolvedRanges[position]??null;range&&(rangesByTone.get(highlight.tone??"accent").push(range),this.resolvedHighlightRanges.push({highlight,range}),highlight.id===this.activeHighlightId&&(activeRange=range))}this.syncResolvedHighlightActions(this.resolvedHighlightRanges.map(({highlight})=>highlight));for(const[tone,ranges]of rangesByTone)handle.setRanges(tone,ranges);if(handle.setActive(activeRange),!supportsCustomHighlights(this.ownerDocument)){const walker=root.ownerDocument.createTreeWalker(root,1);let inspected=0,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes+MAX_DOCX_PAINTED_HIGHLIGHTS&&(node=walker.nextNode());){inspected++;const mark=node;mark.localName==="mark"&&mark.hasAttribute("data-lr-highlight-tone")&&!mark.hasAttribute("part")&&mark.setAttribute("part","highlight")}this.textIndexMappingDirty=!0}}syncResolvedHighlightActions(highlights){this.pendingResolvedHighlightActions=[...new Set(highlights)],!this.resolvedHighlightActionSyncPending&&(this.resolvedHighlightActionSyncPending=!0,queueMicrotask(()=>{if(this.resolvedHighlightActionSyncPending=!1,!this.isConnected)return;const next=this.pendingResolvedHighlightActions;next.length===this.resolvedHighlightActions.length&&next.every((highlight,index)=>highlight===this.resolvedHighlightActions[index])||(this.resolvedHighlightActions=next)}))}resetResolvedHighlightActions(){this.resolvedHighlightRanges=[],this.pendingResolvedHighlightActions=[],this.resolvedHighlightActions=[]}hitTestHighlightAt(x,y){let remainingRects=TEXT_SELECTION_RECT_LIMIT;for(let i=this.resolvedHighlightRanges.length-1;i>=0;i--){const{highlight,range}=this.resolvedHighlightRanges[i];for(const rect of range.getClientRects()){if(remainingRects--<=0)return null;if(x>=rect.left&&x<=rect.right&&y>=rect.top&&y<=rect.bottom)return highlight.id}}return null}highlightActionLabel(highlight){return this.localize("highlightWithLabel",void 0,{label:highlight.label||(highlight.anchor.kind==="text-quote"?highlight.anchor.quote:highlight.id)})}activateHighlightAction(highlight){const resolved=this.resolvedHighlightRanges.find(entry=>entry.highlight===highlight);if(!resolved)return;const elementNode=this.ownerDocument.defaultView?.Node.ELEMENT_NODE??1;(resolved.range.commonAncestorContainer.nodeType===elementNode?resolved.range.commonAncestorContainer:resolved.range.commonAncestorContainer.parentElement)?.scrollIntoView?.({block:"nearest",behavior:"auto"}),this.activeHighlightId=highlight.id,this.emit("lr-highlight-activate",{highlightId:highlight.id})}renderHighlightActions(){const resolved=new Set(this.resolvedHighlightActions),highlights=this.highlights.filter(highlight=>highlight.anchor.kind==="text-quote"&&resolved.has(highlight));return highlights.length===0?nothing:html`
|
|
1
|
+
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{LyraElement}from"../../../internal/lyra-element.js";import{boundedViewerSearchQuery}from"../viewer-search-limits.js";import{srOnly}from"../../../internal/a11y.js";import{isAbortError,isResourceLimitError,LyraUserFacingError,readResponseArrayBuffer,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{invalidateLyraLocaleCache}from"../../../internal/localization-runtime.js";import{Slugger}from"../../../internal/slugger.js";import{DocumentAnchorTarget,prioritizedHighlightCandidates}from"../../../internal/anchor-target.js";import{buildQuoteAnchor,createTextQuoteIndex,emptyTextQuoteMatches,rangeFromTextQuoteMatch,rangesFromTextQuoteMatches,scopeFromElement,TEXT_QUOTE_LIMITS,TEXT_SELECTION_RECT_LIMIT}from"../../../internal/text-quote.js";import{acquireHighlightHandle,supportsCustomHighlights}from"../../../internal/text-highlights.js";import{loadDocxDeps}from"./docx-loader.js";import{assertDocxArchiveWithinLimits}from"./docx-resource-guard.js";import{styles}from"./docx-viewer.styles.js";import{ViewerAnnouncementController}from"../viewer-announcements.js";import{renderViewerLoading,viewerLoadingStyles}from"../viewer-loading.js";import{sanitizePassiveMarkup}from"../passive-markup.js";import{viewerSemanticLabel,viewerSemanticRole}from"../viewer-semantic-owner.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_documentPreviewEmpty,LYRA_DEFAULT_documentPreviewFailedToLoad,LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeDocument,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_documentViewerMissingSanitizer,LYRA_DEFAULT_docxViewerLabel,LYRA_DEFAULT_docxViewerMissingConverter,LYRA_DEFAULT_highlightWithLabel,LYRA_DEFAULT_loadingDocument}from"../../../internal/default-strings.generated.js";const HIGHLIGHT_TONES=["accent","success","warning","danger","neutral"],MAX_DOCX_SEARCH_MATCHES=1e3,MAX_DOCX_PAINTED_SEARCH_MATCHES=200,MAX_DOCX_PAINTED_HIGHLIGHTS=100,MAX_DOCX_CONVERSION_MESSAGES=100;function isArrayValue(value){try{return Array.isArray(value)}catch{return!1}}function normalizeDocxConversion(value){if(value===null||typeof value!="object"&&typeof value!="function")return null;const markup=getOwnDataDescriptor(value,"value"),diagnostics=getOwnDataDescriptor(value,"messages");if(markup===MISSING_OWN_DATA_DESCRIPTOR||markup===UNSAFE_OWN_DATA_DESCRIPTOR||diagnostics===MISSING_OWN_DATA_DESCRIPTOR||diagnostics===UNSAFE_OWN_DATA_DESCRIPTOR||typeof markup.value!="string"||!isArrayValue(diagnostics.value))return null;const length=getOwnDataDescriptor(diagnostics.value,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return null;const messages=[],count=Math.min(length.value,MAX_DOCX_CONVERSION_MESSAGES);for(let index=0;index<count;index+=1){const entry=getOwnDataDescriptor(diagnostics.value,String(index));entry===MISSING_OWN_DATA_DESCRIPTOR||entry===UNSAFE_OWN_DATA_DESCRIPTOR||messages.push(entry.value)}return Object.freeze({value:markup.value,messages:Object.freeze(messages)})}function nextDocxPaintNode(node,root){if(node.firstChild)return node.firstChild;let cursor=node;for(;cursor&&cursor!==root;){if(cursor.nextSibling)return cursor.nextSibling;cursor=cursor.parentNode}return null}function wrapRangeInSearchMarks(range,part,budget){const doc=range.startContainer.ownerDocument;if(!doc)return[];const textNodeType=doc.defaultView?.Node.TEXT_NODE??3;if(range.startContainer===range.endContainer&&range.startContainer.nodeType===textNodeType){const textNode=range.startContainer;if(budget.traversalNodes<=0||budget.codeUnits<=0||budget.marks<=0)return[];if(budget.traversalNodes--,textNode.data.length>budget.codeUnits)return budget.codeUnits=0,[];budget.codeUnits-=textNode.data.length;let target=textNode;if(range.endOffset<target.data.length&&target.splitText(range.endOffset),range.startOffset>0&&(target=target.splitText(range.startOffset)),!target.data)return[];const mark=doc.createElement("mark");return mark.setAttribute("part",part),target.parentNode?.insertBefore(mark,target),mark.appendChild(target),budget.marks--,[mark]}const ancestor=range.commonAncestorContainer,covered=[];let node=ancestor;for(;node&&budget.traversalNodes>0&&budget.codeUnits>0;){if(budget.traversalNodes--,node.nodeType===textNodeType){const textNode=node;if(textNode.data.length>budget.codeUnits){budget.codeUnits=0;break}budget.codeUnits-=textNode.data.length;try{if(textNode.data.length>0&&range.intersectsNode(textNode)&&(covered.push(textNode),covered.length>budget.marks))return[]}catch{return[]}}node=nextDocxPaintNode(node,ancestor)}if(node)return[];const marks=[];for(const textNode of covered){const start=textNode===range.startContainer?range.startOffset:0,end=textNode===range.endContainer?range.endOffset:textNode.data.length;let target=textNode;if(end<target.data.length&&target.splitText(end),start>0&&(target=target.splitText(start)),!target.data)continue;const mark=doc.createElement("mark");mark.setAttribute("part",part),target.parentNode?.insertBefore(mark,target),mark.appendChild(target),marks.push(mark),budget.marks--}return marks}function unwrapSearchMark(mark){const parent=mark.parentNode;if(!parent)return;const before=mark.previousSibling,firstMoved=mark.firstChild;for(;mark.firstChild;)parent.insertBefore(mark.firstChild,mark);const after=mark.nextSibling;parent.removeChild(mark);let cursor=before?.nodeType===3?before:firstMoved??after,localSteps=0;for(;cursor&&cursor.parentNode===parent&&localSteps++<4&&cursor.nodeType===3;){const text=cursor;if(text.data===""){const next2=text.nextSibling;text.remove(),cursor=next2;continue}const next=text.nextSibling;if(next?.nodeType!==3)break;text.appendData(next.data),next.remove()}}class LyraDocxViewerBase extends LyraElement{}class LyraDocxViewer extends DocumentAnchorTarget(LyraDocxViewerBase){constructor(){super(...arguments),this.src="",this.name="",this.maxHeight="",this.anchorKinds=["fragment","text-quote"],this.fetchState={kind:"idle"},this.searchMatches=emptyTextQuoteMatches(),this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.resolvedHighlightActions=[],this.generation=0,this.lastLoadSrc="",this.loadLibrary=loadDocxDeps,this.announcements=new ViewerAnnouncementController(this),this.headingTree=[],this.resolvedHighlightRanges=[],this.pendingResolvedHighlightActions=[],this.resolvedHighlightActionSyncPending=!1,this.searchQuery="",this.paintedSearchMarks=[],this.textIndexCache=null,this.textIndexMappingDirty=!1,this.onContentClick=e=>{const highlightId=this.hitTestHighlightAt(e.clientX,e.clientY);highlightId&&this.emit("lr-highlight-activate",{highlightId})}}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewFailedToLoad:LYRA_DEFAULT_documentPreviewFailedToLoad,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeDocument:LYRA_DEFAULT_documentPreviewTypeDocument,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,documentViewerMissingSanitizer:LYRA_DEFAULT_documentViewerMissingSanitizer,docxViewerLabel:LYRA_DEFAULT_docxViewerLabel,docxViewerMissingConverter:LYRA_DEFAULT_docxViewerMissingConverter,highlightWithLabel:LYRA_DEFAULT_highlightWithLabel,loadingDocument:LYRA_DEFAULT_loadingDocument}}static{this.styles=[LyraElement.styles,styles,srOnly,viewerLoadingStyles]}connectedCallback(){super.connectedCallback(),this.announcements.connect(),this.hasUpdated&&this.src.trim()&&this.src===this.lastLoadSrc&&this.scheduleAfterUpdate(()=>{this.load()})}disconnectedCallback(){this.generation++,this.resetResolvedHighlightActions(),this.announcements.disconnect(),super.disconnectedCallback(),this.highlightHandle?.release(),this.highlightHandle=void 0}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}willUpdate(changed){super.willUpdate(changed),(changed.has("src")||changed.has("highlights"))&&this.resetResolvedHighlightActions(),(changed.has("src")||changed.has("fetchState"))&&this.resetSearchForContentChange()}updated(changed){super.updated(changed);const locale=this.effectiveLocale,localeChanged=this.textIndexLocale!==void 0&&this.textIndexLocale!==locale;if(this.textIndexLocale=locale,localeChanged&&(this.textIndexCache=null),this.announcements.transition("load",this.fetchState.kind,this.fetchState.kind==="error"?this.fetchState.message:this.localize("loadingDocument")),changed.has("src")&&this.scheduleAfterUpdate(()=>{this.load()}),changed.has("fetchState")){const root=this.contentRoot();root&&this.bindTextSelection(root),this.textIndexCache=null,this.textIndexMappingDirty=!1}(changed.has("fetchState")||changed.has("highlights")||changed.has("activeHighlightId")||localeChanged&&this.highlights.length>0)&&this.repaintHighlights(),localeChanged&&this.searchQuery.trim()&&this.scheduleAfterUpdate(()=>{this.search(this.searchQuery)})}contentRoot(){return this.renderRoot.querySelector('[part="content"]')}resetSearchForContentChange(){const shouldEmit=this.searchQuery!==""||this.searchMatches.length>0||this.searchActiveIndex!==-1;this.searchQuery="",this.searchMatches=emptyTextQuoteMatches(),this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.clearSearchPaint(),shouldEmit&&this.emit("lr-search-change",{query:"",matchCount:0,matchCountExact:!0,activeIndex:-1})}async load(){const generation=++this.generation,signal=this.beginAbortableLoad();if(this.lastLoadSrc=this.src,!this.src){this.fetchState={kind:"idle"},this.headingTree=[];return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){this.failWithLocalizedMessage(this.localize("documentPreviewUrlNotAllowed"));return}this.fetchState={kind:"loading"};try{const response=await fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0);if(!this.isConnected||generation!==this.generation||this.ownerDocument.defaultView!==fetchTarget.view)return;if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);const arrayBuffer=await readResponseArrayBuffer(response);if(!this.isConnected||generation!==this.generation||this.ownerDocument.defaultView!==fetchTarget.view||(await assertDocxArchiveWithinLimits(arrayBuffer,void 0,void 0,{signal}),!this.isConnected||generation!==this.generation||this.ownerDocument.defaultView!==fetchTarget.view))return;const{mammoth,DOMPurify}=await this.loadLibrary();if(!this.isConnected||generation!==this.generation||this.ownerDocument.defaultView!==fetchTarget.view)return;if(!mammoth){this.failWithLocalizedMessage(this.localize("docxViewerMissingConverter"));return}if(!DOMPurify){this.failWithLocalizedMessage(this.localize("documentViewerMissingSanitizer"));return}const rawConverted=await mammoth.convertToHtml({arrayBuffer});if(!this.isConnected||generation!==this.generation||this.ownerDocument.defaultView!==fetchTarget.view)return;const converted=normalizeDocxConversion(rawConverted);if(!converted)throw new LyraUserFacingError(this.localize("documentPreviewFailedToLoad"));const markup=sanitizePassiveMarkup(DOMPurify,converted.value,this.ownerDocument,"passive-document");if(!this.isConnected||generation!==this.generation||this.ownerDocument.defaultView!==fetchTarget.view)return;this.fetchState={kind:"loaded",markup:this.stampHeadings(markup)};for(const cause of converted.messages)this.emit("lr-viewer-diagnostic",{diagnostic:Object.freeze({code:"docx-conversion-message",severity:"warning",fatal:!1,source:"mammoth",cause})})}catch(error){if(isAbortError(error)||!this.isConnected||generation!==this.generation||this.ownerDocument.defaultView!==fetchTarget.view)return;this.fetchState={kind:"error",message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")},this.emit("lr-render-error",{error})}}failWithLocalizedMessage(message){const error=new LyraUserFacingError(message);this.fetchState={kind:"error",message},this.emit("lr-render-error",{error})}stampHeadings(sanitizedHtml){const DOMParserCtor=this.ownerDocument.defaultView?.DOMParser;if(!DOMParserCtor)throw new Error("DOMParser is unavailable without a browsing context.");const doc=new DOMParserCtor().parseFromString(sanitizedHtml,"text/html"),slugger=new Slugger,tree=[],walker=doc.createTreeWalker(doc.body,1);let inspected=0,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes&&(node=walker.nextNode());){inspected++;const heading=node;if(!/^H[1-6]$/.test(heading.tagName))continue;const level=Number(heading.tagName.slice(1)),label=(heading.textContent??"").trim(),slug=slugger.slug(label);slug&&(heading.id=slug),tree.push({id:slug,label,level})}return this.headingTree=tree,doc.body.innerHTML}getHeadingTree(){return[...this.headingTree]}async applyAnchor(anchor){const root=this.contentRoot();if(!root)return!1;switch(anchor.kind){case"fragment":return this.applyFragmentAnchor(root,anchor);case"text-quote":return this.applyTextQuoteAnchor(root,anchor);default:return!1}}applyFragmentAnchor(root,anchor){if(!anchor.id)return!1;let expectedIndex=-1;const headingLimit=Math.min(this.headingTree.length,TEXT_QUOTE_LIMITS.maxTraversalNodes);for(let index=0;index<headingLimit;index++)if(this.headingTree[index]?.id===anchor.id){expectedIndex=index;break}if(expectedIndex<0)return!1;const walker=root.ownerDocument.createTreeWalker(root,1);let inspected=0,headingIndex=0,idMatch=null,positionalMatch=null,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes&&(node=walker.nextNode());){inspected++;const heading=node;if(/^H[1-6]$/.test(heading.tagName)&&(heading.getAttribute("id")===anchor.id&&(idMatch??=heading),headingIndex===expectedIndex&&(positionalMatch=heading),headingIndex++,idMatch&&positionalMatch))break}const el=idMatch??positionalMatch;return el?(el.scrollIntoView({behavior:prefersReducedMotion(this.ownerDocument.defaultView)?"auto":"smooth",block:"start"}),!0):!1}applyTextQuoteAnchor(root,anchor){const{scope,index}=this.currentTextIndex(root),match=index.resolve(anchor),range=match?rangeFromTextQuoteMatch(scope,match):null;return range?(((range.startContainer.nodeType===Node.ELEMENT_NODE?range.startContainer:range.startContainer.parentElement)??root).scrollIntoView({behavior:prefersReducedMotion(this.ownerDocument.defaultView)?"auto":"smooth",block:"center"}),!0):!1}computeSelectionAnchor(range){const root=this.contentRoot();return root?buildQuoteAnchor(range,this.currentTextIndex(root).scope):null}ensureHighlightHandle(){return this.highlightHandle||(this.highlightHandle=acquireHighlightHandle(this,this.ownerDocument)),this.highlightHandle}repaintHighlights(){this.resolvedHighlightRanges=[];const root=this.contentRoot(),handle=this.ensureHighlightHandle();if(!root){this.syncResolvedHighlightActions([]);for(const tone of HIGHLIGHT_TONES)handle.setRanges(tone,[]);handle.setActive(null);return}const{scope,index}=this.currentTextIndex(root),workBudget=index.createWorkBudget(),rangesByTone=new Map(HIGHLIGHT_TONES.map(tone=>[tone,[]]));let activeRange=null;const candidates=prioritizedHighlightCandidates(this.highlights,this.activeHighlightId),resolved=[];for(const highlight of candidates){if(resolved.length>=MAX_DOCX_PAINTED_HIGHLIGHTS)break;if(highlight.anchor.kind!=="text-quote")continue;const match=index.resolve(highlight.anchor,workBudget);match&&resolved.push({highlight,match})}const resolvedRanges=rangesFromTextQuoteMatches(scope,resolved.map(({match})=>match));for(let position=0;position<resolved.length;position++){const{highlight}=resolved[position],range=resolvedRanges[position]??null;range&&(rangesByTone.get(highlight.tone??"accent").push(range),this.resolvedHighlightRanges.push({highlight,range}),highlight.id===this.activeHighlightId&&(activeRange=range))}this.syncResolvedHighlightActions(this.resolvedHighlightRanges.map(({highlight})=>highlight));for(const[tone,ranges]of rangesByTone)handle.setRanges(tone,ranges);if(handle.setActive(activeRange),!supportsCustomHighlights(this.ownerDocument)){const walker=root.ownerDocument.createTreeWalker(root,1);let inspected=0,node;for(;inspected<TEXT_QUOTE_LIMITS.maxTraversalNodes+MAX_DOCX_PAINTED_HIGHLIGHTS&&(node=walker.nextNode());){inspected++;const mark=node;mark.localName==="mark"&&mark.hasAttribute("data-lr-highlight-tone")&&!mark.hasAttribute("part")&&mark.setAttribute("part","highlight")}this.textIndexMappingDirty=!0}}syncResolvedHighlightActions(highlights){this.pendingResolvedHighlightActions=[...new Set(highlights)],!this.resolvedHighlightActionSyncPending&&(this.resolvedHighlightActionSyncPending=!0,queueMicrotask(()=>{if(this.resolvedHighlightActionSyncPending=!1,!this.isConnected)return;const next=this.pendingResolvedHighlightActions;next.length===this.resolvedHighlightActions.length&&next.every((highlight,index)=>highlight===this.resolvedHighlightActions[index])||(this.resolvedHighlightActions=next)}))}resetResolvedHighlightActions(){this.resolvedHighlightRanges=[],this.pendingResolvedHighlightActions=[],this.resolvedHighlightActions=[]}hitTestHighlightAt(x,y){let remainingRects=TEXT_SELECTION_RECT_LIMIT;for(let i=this.resolvedHighlightRanges.length-1;i>=0;i--){const{highlight,range}=this.resolvedHighlightRanges[i];for(const rect of range.getClientRects()){if(remainingRects--<=0)return null;if(x>=rect.left&&x<=rect.right&&y>=rect.top&&y<=rect.bottom)return highlight.id}}return null}highlightActionLabel(highlight){return this.localize("highlightWithLabel",void 0,{label:highlight.label||(highlight.anchor.kind==="text-quote"?highlight.anchor.quote:highlight.id)})}activateHighlightAction(highlight){const resolved=this.resolvedHighlightRanges.find(entry=>entry.highlight===highlight);if(!resolved)return;const elementNode=this.ownerDocument.defaultView?.Node.ELEMENT_NODE??1;(resolved.range.commonAncestorContainer.nodeType===elementNode?resolved.range.commonAncestorContainer:resolved.range.commonAncestorContainer.parentElement)?.scrollIntoView?.({block:"nearest",behavior:"auto"}),this.activeHighlightId=highlight.id,this.emit("lr-highlight-activate",{highlightId:highlight.id})}renderHighlightActions(){const resolved=new Set(this.resolvedHighlightActions),highlights=this.highlights.filter(highlight=>highlight.anchor.kind==="text-quote"&&resolved.has(highlight));return highlights.length===0?nothing:html`
|
|
2
2
|
<div part="highlight-actions">
|
|
3
3
|
${highlights.map(highlight=>{const label=this.highlightActionLabel(highlight);return html`
|
|
4
4
|
<button
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
interface EpubNavigationItem{id?:string;href:string;label?:string;subitems?:EpubNavigationItem[];}interface EpubSearchResult{cfi:string;excerpt?:string;}interface EpubSpineItem{load(request?:unknown):Promise<unknown> |unknown;find(query:string):Promise<EpubSearchResult[]> |EpubSearchResult[];unload():void;}interface EpubContents{window?:Window;}interface EpubLocation{start?:{cfi?:string;href?:string;};}interface EpubAnnotations{highlight(cfi:string,data:Record<string,unknown>,callback?:(()=>void)|undefined,className?:string,styles?:Record<string,unknown>):unknown;remove(cfi:string,type:string):void;}interface EpubRendition{annotations:EpubAnnotations;display(target?:string):Promise<void>;prev():Promise<void>;next():Promise<void>;on(type:'relocated',callback:(location:EpubLocation)=>void):void;on(type:'selected',callback:(cfiRange:string,contents:EpubContents)=>void):void;}export interface EpubBook{ready:Promise<void>;navigation?:{toc?:EpubNavigationItem[];};spine?:{spineItems?:EpubSpineItem[];};load(...args:unknown[]):Promise<unknown>;renderTo(element:Element,options?:Record<string,unknown>):EpubRendition;destroy():void;}export type EpubFactory=(data:ArrayBuffer)=>EpubBook;export declare function loadEpubJs(importEpub?:()=>Promise<unknown>):Promise<EpubFactory|null>;export declare function getEpubJs():Promise<EpubFactory|null>;export{};
|
|
@@ -79,11 +79,11 @@ maxHeight:string;
|
|
|
79
79
|
location:string;
|
|
80
80
|
/** Anchor kinds this viewer resolves: `cfi` displays directly via `rendition.display()`;
|
|
81
81
|
* `text-quote` resolves by scanning the book's spine with epub.js's own `item.find()`. */
|
|
82
|
-
readonly anchorKinds:readonly['cfi','text-quote'];private ebookState;private searchMatches;private searchMatchCountExact;private searchActiveIndex;private readonly mountRef;private book?;private rendition?;private generation;private searchQuery;private lastSearchLocale;private searchGeneration;private pendingSearchResetEvent;private anchorOperationGeneration;
|
|
82
|
+
readonly anchorKinds:readonly['cfi','text-quote'];private ebookState;private searchMatches;private searchMatchCountExact;private searchActiveIndex;private readonly mountRef;private book?;private rendition?;private generation;private failedGeneration;private searchQuery;private lastSearchLocale;private searchGeneration;private pendingSearchResetEvent;private anchorOperationGeneration;
|
|
83
83
|
/** CFI most recently assigned by a peer `relocated` callback. Tracking the value rather than a
|
|
84
84
|
* boolean lets a controlled consumer replace `location` synchronously from
|
|
85
85
|
* `lr-location-change`: only the peer's exact CFI is suppressed as a display loop. */
|
|
86
|
-
private relocatedLocation?;private paintedHighlightCfis;private searchAnnotationCfi?;private readonly announcements;private readonly announcer;constructor();protected updated(changed:PropertyValues):void;protected willUpdate(changed:PropertyValues):void;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private teardown;private hasSearchState;private resetSearchState;private load;private failWithLocalizedMessage;private reportRenditionFailure;
|
|
86
|
+
private relocatedLocation?;private paintedHighlightCfis;private searchAnnotationCfi?;private readonly announcements;private readonly announcer;constructor();protected updated(changed:PropertyValues):void;protected willUpdate(changed:PropertyValues):void;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private teardown;private destroyBook;private isCurrentLoad;private isCurrentBookRendition;private failCurrentLoad;private hasSearchState;private resetSearchState;private load;private failWithLocalizedMessage;private reportRenditionFailure;
|
|
87
87
|
/** Maps selection geometry from an epub.js chapter viewport through every containing iframe
|
|
88
88
|
* into this component's owner viewport. `getClientRects()` is already scroll-adjusted; each
|
|
89
89
|
* frame's live border box and content viewport ratio add its position, border and CSS scale. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{createRef,ref}from"lit/directives/ref.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{isAbortError,isResourceLimitError,LyraUserFacingError,readResponseArrayBuffer,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{chevronIcon}from"../../../internal/icons.js";import{srOnly}from"../../../internal/a11y.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{Announcer}from"../../../internal/announcer.js";import{announceSearchResult}from"../../../internal/viewer-search.js";import{DocumentAnchorTarget,prioritizedHighlightCandidates}from"../../../internal/anchor-target.js";import{getEpubJs}from"./ebook-loader.js";import{assertEpubArchiveWithinLimits}from"./epub-resource-guard.js";import{styles}from"./ebook-viewer.styles.js";import{ViewerAnnouncementController}from"../viewer-announcements.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{boundedViewerSearchQuery,ViewerSearchWorkBudget,VIEWER_SEARCH_QUERY_LIMIT}from"../viewer-search-limits.js";import{boundedSelectionRects,boundedSelectionText}from"../../../internal/text-quote.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_collapse,LYRA_DEFAULT_details,LYRA_DEFAULT_documentPreviewEmpty,LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeDocument,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_ebookViewerLoadError,LYRA_DEFAULT_ebookViewerNextChapter,LYRA_DEFAULT_ebookViewerPreviousChapter,LYRA_DEFAULT_ebookViewerRegionLabel,LYRA_DEFAULT_loading,LYRA_DEFAULT_loadingDocument,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_next,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_previous,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_viewerSearchActiveMatch,LYRA_DEFAULT_viewerSearchMatchCount,LYRA_DEFAULT_viewerSearchNoMatches}from"../../../internal/default-strings.generated.js";const MAX_TOC_ITEMS=1e4,MAX_TOC_DEPTH=100,MAX_SEARCH_MATCHES=1e4,MAX_SEARCH_SPINE_ITEMS=1e3,MAX_PAINTED_HIGHLIGHTS=100,TONE_FILL_TOKEN={accent:{token:"--lr-color-brand-quiet",fallback:"#ddf4ff"},success:{token:"--lr-color-success-quiet",fallback:"#dafbe1"},warning:{token:"--lr-color-warning-quiet",fallback:"#fff8c5"},danger:{token:"--lr-color-danger-quiet",fallback:"#ffebe9"},neutral:{token:"--lr-color-surface-raised",fallback:"#f6f8fa"}},SEARCH_MATCH_FILL_TOKEN={token:"--lr-color-warning",fallback:"#9a6700"},ACTIVE_HIGHLIGHT_STROKE_TOKEN={token:"--lr-focus-ring-color",fallback:"#0969da"};class LyraEbookViewerBase extends LyraElement{}class LyraEbookViewer extends DocumentAnchorTarget(LyraEbookViewerBase){static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,collapse:LYRA_DEFAULT_collapse,details:LYRA_DEFAULT_details,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeDocument:LYRA_DEFAULT_documentPreviewTypeDocument,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,ebookViewerLoadError:LYRA_DEFAULT_ebookViewerLoadError,ebookViewerNextChapter:LYRA_DEFAULT_ebookViewerNextChapter,ebookViewerPreviousChapter:LYRA_DEFAULT_ebookViewerPreviousChapter,ebookViewerRegionLabel:LYRA_DEFAULT_ebookViewerRegionLabel,loading:LYRA_DEFAULT_loading,loadingDocument:LYRA_DEFAULT_loadingDocument,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,next:LYRA_DEFAULT_next,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,previous:LYRA_DEFAULT_previous,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,viewerSearchActiveMatch:LYRA_DEFAULT_viewerSearchActiveMatch,viewerSearchMatchCount:LYRA_DEFAULT_viewerSearchMatchCount,viewerSearchNoMatches:LYRA_DEFAULT_viewerSearchNoMatches}}static{this.styles=[LyraElement.styles,styles,srOnly]}constructor(){super(),this.src="",this.name="",this.accessibleLabel=null,this.maxHeight="",this.location="",this.anchorKinds=["cfi","text-quote"],this.ebookState={kind:"idle"},this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.mountRef=createRef(),this.generation=0,this.searchQuery="",this.lastSearchLocale="",this.searchGeneration=0,this.pendingSearchResetEvent=!1,this.anchorOperationGeneration=0,this.paintedHighlightCfis=[],this.announcements=new ViewerAnnouncementController(this),this.announcer=new Announcer({onFlush:text=>this.announcements.announcePolite(text)}),this.previous=()=>{this.runRenditionNavigation("previous")},this.next=()=>{this.runRenditionNavigation("next")},new ThemeWatcher(this,()=>this.repaintAnnotations())}updated(changed){if(super.updated(changed),this.announcements.transition("load",this.ebookState.kind,this.ebookState.kind==="error"?this.ebookState.message:this.localize("loadingDocument")),changed.has("src")&&this.scheduleAfterUpdate(()=>{this.load()}),changed.has("src")&&this.pendingSearchResetEvent&&(this.pendingSearchResetEvent=!1,this.emitSearchChange()),changed.has("location")){const fromRelocated=this.relocatedLocation===this.location;this.relocatedLocation=void 0,!fromRelocated&&this.rendition&&this.location&&this.displayLocation(this.location)}(changed.has("highlights")||changed.has("activeHighlightId"))&&this.rendition&&this.repaintAnnotations();const locale=this.effectiveLocale;if(locale!==this.lastSearchLocale){const shouldRecompute=this.searchQuery!=="";this.lastSearchLocale=locale,shouldRecompute&&this.scheduleAfterUpdate(()=>{this.search(this.searchQuery)},"search")}}willUpdate(changed){super.willUpdate(changed),changed.has("src")&&(this.pendingSearchResetEvent||=this.hasSearchState(),this.resetSearchState())}connectedCallback(){super.connectedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.announcements.connect(),this.hasUpdated&&this.src.trim()&&this.scheduleAfterUpdate(()=>{this.load()})}disconnectedCallback(){this.generation++,this.anchorOperationGeneration++,this.announcer.cancel(),this.announcements.disconnect(),this.teardown(),this.ebookState={kind:"idle"},super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.announcements.adopted()}teardown(){const shouldEmitSearchReset=this.hasSearchState();this.book?.destroy(),this.book=void 0,this.rendition=void 0,this.resetSearchState(),this.paintedHighlightCfis=[],shouldEmitSearchReset&&this.isConnected&&this.emitSearchChange()}hasSearchState(){return this.searchQuery!==""||this.searchMatches.length>0||!this.searchMatchCountExact||this.searchActiveIndex!==-1}resetSearchState(){this.searchGeneration++,this.searchQuery="",this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.searchAnnotationCfi=void 0}async load(){const generation=++this.generation,signal=this.beginAbortableLoad();if(this.teardown(),!this.src.trim()){this.ebookState={kind:"idle"};return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){this.failWithLocalizedMessage(this.localize("documentPreviewUrlNotAllowed"));return}this.ebookState={kind:"loading"};let data,factory;try{if([data,factory]=await Promise.all([fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0).then(response=>{if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);return readResponseArrayBuffer(response)}),getEpubJs()]),!this.isConnected||generation!==this.generation||(await assertEpubArchiveWithinLimits(data,void 0,void 0,{signal}),!this.isConnected||generation!==this.generation))return}catch(error){if(isAbortError(error)||!this.isConnected||generation!==this.generation)return;this.ebookState={kind:"error",message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"ebookViewerLoadError")},this.emit("lr-render-error",{error});return}if(!factory){this.failWithLocalizedMessage(this.localize("ebookViewerLoadError"));return}const mount=this.mountRef.value;if(!mount){this.failWithLocalizedMessage(this.localize("ebookViewerLoadError"));return}let candidateBook;try{const book=factory(data);candidateBook=book;const rendition=book.renderTo(mount,{width:"100%",height:"100%"});if(await book.ready,!this.isConnected||generation!==this.generation){book.destroy();return}if(await rendition.display(this.location||void 0),!this.isConnected||generation!==this.generation){book.destroy();return}rendition.on("relocated",loc=>{const cfi=loc?.start?.cfi??"",href=loc?.start?.href??"";!cfi||cfi===this.location||(this.relocatedLocation=cfi,this.location=cfi,this.emit("lr-location-change",{cfi,href}))}),rendition.on("selected",(cfiRange,contents)=>{const selection=contents?.window?.getSelection?.(),range=selection&&selection.rangeCount>0?selection.getRangeAt(0):null;if(!range)return;const text=boundedSelectionText(range);if(!text)return;const rects=this.translateSelectionRects(boundedSelectionRects(range),contents.window);this.emit("lr-text-select",{text,anchor:{kind:"cfi",cfi:cfiRange},rects})}),this.book=book,this.rendition=rendition,candidateBook=void 0,this.ebookState={kind:"ready"},this.repaintAnnotations()}catch(error){if(candidateBook?.destroy(),isAbortError(error)||!this.isConnected||generation!==this.generation)return;this.ebookState={kind:"error",message:this.localize("ebookViewerLoadError")},this.emit("lr-render-error",{error})}}failWithLocalizedMessage(message){const error=new LyraUserFacingError(message);this.ebookState={kind:"error",message},this.emit("lr-render-error",{error})}reportRenditionFailure(error,rendition,generation){!this.isConnected||generation!==this.generation||rendition!==this.rendition||(this.ebookState={kind:"error",message:this.localize("ebookViewerLoadError")},this.emit("lr-render-error",{error}))}translateSelectionRects(rects,sourceWindow){const ownerWindow=this.ownerDocument.defaultView;if(!ownerWindow||!sourceWindow)return[];const translated=[];for(const rect of rects){let x=Number(rect.x??rect.left),y=Number(rect.y??rect.top),width=Number(rect.width),height=Number(rect.height);if(![x,y,width,height].every(Number.isFinite))continue;let current=sourceWindow,valid=!0;for(;current&¤t!==ownerWindow;){if(!("frameElement"in current)){current=ownerWindow;break}let frameElement;try{frameElement=current.frameElement}catch{valid=!1;break}const frameWindow=frameElement?.ownerDocument.defaultView;if(!frameElement||!frameWindow||!(frameElement instanceof frameWindow.HTMLElement)){valid=!1;break}const frame=frameElement,frameRect=frame.getBoundingClientRect(),borderBoxWidth=frame.offsetWidth||frame.clientWidth,borderBoxHeight=frame.offsetHeight||frame.clientHeight,viewportWidth=current.innerWidth||frame.clientWidth,viewportHeight=current.innerHeight||frame.clientHeight;if(borderBoxWidth<=0||borderBoxHeight<=0||viewportWidth<=0||viewportHeight<=0){valid=!1;break}const borderScaleX=frameRect.width/borderBoxWidth,borderScaleY=frameRect.height/borderBoxHeight,contentScaleX=frame.clientWidth*borderScaleX/viewportWidth,contentScaleY=frame.clientHeight*borderScaleY/viewportHeight;x=frameRect.left+frame.clientLeft*borderScaleX+x*contentScaleX,y=frameRect.top+frame.clientTop*borderScaleY+y*contentScaleY,width*=contentScaleX,height*=contentScaleY,current=frame.ownerDocument.defaultView}!valid||current!==ownerWindow||translated.push(Object.freeze({x,y,width,height,top:y,right:x+width,bottom:y+height,left:x}))}return translated}displayLocation(location){const rendition=this.rendition;if(!rendition)return;const generation=this.generation;try{Promise.resolve(rendition.display(location)).catch(error=>{this.reportRenditionFailure(error,rendition,generation)})}catch(error){this.reportRenditionFailure(error,rendition,generation)}}runRenditionNavigation(action){const rendition=this.rendition;if(!rendition)return;const generation=this.generation;try{const task=action==="previous"?rendition.prev():rendition.next();Promise.resolve(task).catch(error=>{this.reportRenditionFailure(error,rendition,generation)})}catch(error){this.reportRenditionFailure(error,rendition,generation)}}async getToc(){const book=this.book;if(!book)return[];if(await book.ready,this.book!==book)return[];const items=[],seen=new WeakSet,stack=(book.navigation?.toc??[]).map(entry=>({entry,level:1})).reverse();for(;stack.length>0&&items.length<MAX_TOC_ITEMS;){const current=stack.pop(),{entry,level}=current;if(!(!entry||typeof entry!="object"||seen.has(entry))&&(seen.add(entry),items.push({id:entry.id||entry.href,label:String(entry.label??"").trim(),href:entry.href,level}),!(level>=MAX_TOC_DEPTH||!Array.isArray(entry.subitems))))for(let index=entry.subitems.length-1;index>=0;index--)stack.push({entry:entry.subitems[index],level:level+1})}return items}async scrollToAnchor(target){const operation=++this.anchorOperationGeneration;try{return await Object.getPrototypeOf(LyraEbookViewer.prototype).performScrollToAnchor.call(this,target)}catch(error){if(operation!==this.anchorOperationGeneration)return!1;const rendition=this.rendition;return rendition&&this.reportRenditionFailure(error,rendition,this.generation),this.emit("lr-anchor-result",{found:!1}),!1}}async applyAnchor(anchor){const rendition=this.rendition,operation=this.anchorOperationGeneration;if(!rendition)return!1;if(anchor.kind==="cfi")return operation!==this.anchorOperationGeneration||rendition!==this.rendition?!1:(await rendition.display(anchor.cfi),operation===this.anchorOperationGeneration&&rendition===this.rendition);if(anchor.kind==="text-quote"){const cfi=await this.findTextQuoteCfi(anchor.quote);return!cfi||operation!==this.anchorOperationGeneration||rendition!==this.rendition?!1:(await rendition.display(cfi),operation===this.anchorOperationGeneration&&rendition===this.rendition)}return!1}async findTextQuoteCfi(quote){const book=this.book,generation=this.generation,boundedQuery=boundedViewerSearchQuery(quote,this.effectiveLocale);if(!book||!boundedQuery.accepted||!boundedQuery.needle)return null;const work=new ViewerSearchWorkBudget,spineItems=book.spine?.spineItems??[],itemCount=Math.min(spineItems.length,MAX_SEARCH_SPINE_ITEMS);for(let itemIndex=0;itemIndex<itemCount;itemIndex++){const item=spineItems[itemIndex];if(!work.consume(""))return null;let loaded=!1;try{if(await item.load(book.load?.bind(book)),loaded=!0,!this.isConnected||generation!==this.generation||this.book!==book)return null;const results=await item.find(quote)??[];if(!this.isConnected||generation!==this.generation||this.book!==book)return null;for(const result of results){if(!work.consume(""))return null;if(!(!result||typeof result.cfi!="string"))return work.consume(result.cfi)?result.cfi:null}}catch{continue}finally{loaded&&item.unload()}}return null}repaintHighlights(){if(!this.rendition)return;const work=new ViewerSearchWorkBudget;for(const cfi of this.paintedHighlightCfis){if(!work.consume(cfi))break;this.rendition.annotations.remove(cfi,"highlight")}this.paintedHighlightCfis=[];let painted=0;for(const highlight of prioritizedHighlightCandidates(this.highlights,this.activeHighlightId)){if(highlight.anchor.kind!=="cfi")continue;if(painted>=MAX_PAINTED_HIGHLIGHTS)break;const cfi=highlight.anchor.cfi.trim();if(!cfi||cfi.length>VIEWER_SEARCH_QUERY_LIMIT||!work.consume(cfi))continue;const tone=highlight.tone??"accent",active=highlight.id===this.activeHighlightId,styles2=this.resolveHighlightFill(TONE_FILL_TOKEN[tone]);if(active){const forcedColors=this.ownerDocument.defaultView?.matchMedia?.("(forced-colors: active)").matches??!1;styles2.stroke=forcedColors?"CanvasText":this.resolveHighlightFill(ACTIVE_HIGHLIGHT_STROKE_TOKEN).fill,styles2["stroke-width"]="3",styles2["stroke-dasharray"]="2 1"}this.rendition.annotations.highlight(cfi,{id:highlight.id},()=>this.emit("lr-highlight-activate",{highlightId:highlight.id}),active?`lr-hl-${tone} lr-ebook-highlight-active`:`lr-hl-${tone}`,styles2),this.paintedHighlightCfis.push(cfi),painted++}}repaintSearchAnnotation(){const rendition=this.rendition,cfi=this.searchAnnotationCfi;!rendition||!cfi||(rendition.annotations.remove(cfi,"highlight"),rendition.annotations.highlight(cfi,{},void 0,"lr-ebook-search",this.resolveHighlightFill(SEARCH_MATCH_FILL_TOKEN)))}repaintAnnotations(){const rendition=this.rendition;if(rendition)try{this.repaintHighlights(),this.repaintSearchAnnotation()}catch(error){this.reportRenditionFailure(error,rendition,this.generation)}}async search(query){const generation=++this.searchGeneration,boundedQuery=boundedViewerSearchQuery(query,this.effectiveLocale);if(this.searchQuery=query,this.lastSearchLocale=this.effectiveLocale,this.clearSearchAnnotation(),!boundedQuery.accepted)return this.searchMatches=[],this.searchMatchCountExact=!1,this.searchActiveIndex=-1,this.emitSearchChange(),0;if(!this.book||!boundedQuery.needle)return this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.emitSearchChange(),0;const matches=[];let matchCountExact=!0,matchCeilingExceeded=!1;const book=this.book,work=new ViewerSearchWorkBudget,spineItems=book.spine?.spineItems??[],itemCount=Math.min(spineItems.length,MAX_SEARCH_SPINE_ITEMS);spineItems.length>itemCount&&(matchCountExact=!1);for(let itemIndex=0;itemIndex<itemCount;itemIndex++){const item=spineItems[itemIndex];if(generation!==this.searchGeneration)return this.searchMatches.length;if(!work.consume("")){matchCountExact=!1;break}let loaded=!1;try{if(await item.load(book.load?.bind(book)),loaded=!0,generation!==this.searchGeneration||this.book!==book)return this.searchMatches.length;const results=await item.find(query.trim())??[];if(generation!==this.searchGeneration||this.book!==book)return this.searchMatches.length;for(const r of results){if(!work.consume("")){matchCountExact=!1,matchCeilingExceeded=!0;break}if(!r||typeof r.cfi!="string")continue;const excerpt=typeof r.excerpt=="string"?r.excerpt:"";if(!work.consume(r.cfi)||!work.consume(excerpt)){matchCountExact=!1,matchCeilingExceeded=!0;break}if(matches.length===MAX_SEARCH_MATCHES){matchCountExact=!1,matchCeilingExceeded=!0;break}matches.push({cfi:r.cfi,excerpt})}}catch{matchCountExact=!1;continue}finally{loaded&&item.unload()}if(matchCeilingExceeded)break}return generation!==this.searchGeneration?this.searchMatches.length:(this.searchMatches=matches,this.searchMatchCountExact=matchCountExact,this.searchActiveIndex=matches.length>0?0:-1,this.emitSearchChange(),this.searchActiveIndex>=0&&await this.showSearchMatch(this.searchActiveIndex,generation),matches.length)}async searchNext(){if(!this.searchMatches.length)return!1;const generation=++this.searchGeneration;return this.searchActiveIndex=(this.searchActiveIndex+1)%this.searchMatches.length,this.emitSearchChange(),this.showSearchMatch(this.searchActiveIndex,generation)}async searchPrevious(){if(!this.searchMatches.length)return!1;const generation=++this.searchGeneration;return this.searchActiveIndex=(this.searchActiveIndex-1+this.searchMatches.length)%this.searchMatches.length,this.emitSearchChange(),this.showSearchMatch(this.searchActiveIndex,generation)}clearSearch(){this.searchGeneration++,this.searchQuery="",this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.clearSearchAnnotation(),this.emit("lr-search-change",{query:"",matchCount:0,matchCountExact:!0,activeIndex:-1})}clearSearchAnnotation(){this.searchAnnotationCfi&&this.rendition?.annotations.remove(this.searchAnnotationCfi,"highlight"),this.searchAnnotationCfi=void 0}async showSearchMatch(index,generation=this.searchGeneration){const match=this.searchMatches[index],rendition=this.rendition;if(!match||!rendition||generation!==this.searchGeneration)return!1;this.clearSearchAnnotation();try{await rendition.display(match.cfi)}catch(error){return generation===this.searchGeneration&&rendition===this.rendition&&this.reportRenditionFailure(error,rendition,this.generation),!1}if(generation!==this.searchGeneration||rendition!==this.rendition||this.searchMatches[index]!==match)return!1;try{rendition.annotations.highlight(match.cfi,{},void 0,"lr-ebook-search",this.resolveHighlightFill(SEARCH_MATCH_FILL_TOKEN))}catch(error){return this.reportRenditionFailure(error,rendition,this.generation),!1}return this.searchAnnotationCfi=match.cfi,!0}emitSearchChange(){this.emit("lr-search-change",{query:this.searchQuery,matchCount:this.searchMatches.length,matchCountExact:this.searchMatchCountExact,activeIndex:this.searchActiveIndex}),announceSearchResult((key,fallback,values)=>this.localize(key,fallback,values),this.announcer,this.effectiveLocale,this.searchMatches.length,this.searchActiveIndex)}resolveHighlightFill({token,fallback}){return{fill:(this.ownerDocument.defaultView?.getComputedStyle(this).getPropertyValue(token).trim()??"")||fallback}}renderStatus(){return this.ebookState.kind==="loading"?html`<p class="status-note">${this.localize("loadingDocument")}</p>`:this.ebookState.kind==="error"?html`<div part="error">${this.ebookState.message}</div>`:this.ebookState.kind==="idle"?html`<p class="status-note">${this.localize("documentPreviewEmpty",void 0,{type:this.localize("documentPreviewTypeDocument")})}</p>`:nothing}render(){const disabled=this.ebookState.kind!=="ready";return html`
|
|
1
|
+
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{createRef,ref}from"lit/directives/ref.js";import{styleMap}from"lit/directives/style-map.js";import{LyraElement}from"../../../internal/lyra-element.js";import{isAbortError,isResourceLimitError,LyraUserFacingError,readResponseArrayBuffer,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{chevronIcon}from"../../../internal/icons.js";import{srOnly}from"../../../internal/a11y.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{Announcer}from"../../../internal/announcer.js";import{announceSearchResult}from"../../../internal/viewer-search.js";import{DocumentAnchorTarget,prioritizedHighlightCandidates}from"../../../internal/anchor-target.js";import{getEpubJs}from"./ebook-loader.js";import{assertEpubArchiveWithinLimits}from"./epub-resource-guard.js";import{styles}from"./ebook-viewer.styles.js";import{ViewerAnnouncementController}from"../viewer-announcements.js";import{ThemeWatcher}from"../../../internal/theme-watcher.js";import{boundedViewerSearchQuery,ViewerSearchWorkBudget,VIEWER_SEARCH_QUERY_LIMIT}from"../viewer-search-limits.js";import{boundedSelectionRects,boundedSelectionText}from"../../../internal/text-quote.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_collapse,LYRA_DEFAULT_details,LYRA_DEFAULT_documentPreviewEmpty,LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeDocument,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_ebookViewerLoadError,LYRA_DEFAULT_ebookViewerNextChapter,LYRA_DEFAULT_ebookViewerPreviousChapter,LYRA_DEFAULT_ebookViewerRegionLabel,LYRA_DEFAULT_loading,LYRA_DEFAULT_loadingDocument,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_next,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_previous,LYRA_DEFAULT_remove,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_viewerSearchActiveMatch,LYRA_DEFAULT_viewerSearchMatchCount,LYRA_DEFAULT_viewerSearchNoMatches}from"../../../internal/default-strings.generated.js";const MAX_TOC_ITEMS=1e4,MAX_TOC_DEPTH=100,MAX_SEARCH_MATCHES=1e4,MAX_SEARCH_SPINE_ITEMS=1e3,MAX_FIND_RESULTS=1e4,MAX_PAINTED_HIGHLIGHTS=100,MAX_PEER_PROTOTYPES=100;function isObjectValue(value){return value!==null&&(typeof value=="object"||typeof value=="function")}function isArrayValue(value){try{return Array.isArray(value)}catch{return!1}}function inheritedDataDescriptor(value,key){let current=value;for(let depth=0;current&&depth<MAX_PEER_PROTOTYPES;depth+=1){let descriptor;try{descriptor=Object.getOwnPropertyDescriptor(current,key)}catch{return}if(descriptor)return"value"in descriptor?descriptor:void 0;try{current=Object.getPrototypeOf(current)}catch{return}}}function inheritedDataValue(value,key){return isObjectValue(value)?inheritedDataDescriptor(value,key)?.value:void 0}function savedCallable(value,key){if(!isObjectValue(value))return;const candidate=inheritedDataDescriptor(value,key)?.value;if(typeof candidate=="function")return(...args)=>Reflect.apply(candidate,value,args)}function savedThenable(value){const then=savedCallable(value,"then");if(then)return new Promise((resolve,reject)=>{try{then(()=>resolve(),reject)}catch(error){reject(error)}})}function taskFrom(call,...args){try{return savedThenable(call(...args))??Promise.resolve()}catch(error){return Promise.reject(error)}}function awaitPeerResult(value){const then=savedCallable(value,"then"),wrap=resolved=>Object.freeze({value:resolved});return then?new Promise((resolve,reject)=>{try{then(resolved=>resolve(wrap(resolved)),reject)}catch(error){reject(error)}}):Promise.resolve(wrap(value))}function normalizeBook(value){if(!isObjectValue(value))return;const ready=savedThenable(inheritedDataValue(value,"ready")),renderTo=savedCallable(value,"renderTo"),destroy=savedCallable(value,"destroy");if(!ready||!renderTo||!destroy)return;let navigationCaptured=!1,navigation;const getNavigation=()=>(navigationCaptured||(navigationCaptured=!0,navigation=inheritedDataValue(value,"navigation")),navigation),spine=inheritedDataValue(value,"spine"),load=savedCallable(value,"load");return Object.freeze({ready,...spine===void 0?{}:{spine},...load===void 0?{}:{load},getNavigation,renderTo:(element,options)=>renderTo(element,options),destroy:()=>{destroy()}})}function normalizeRendition(value){if(!isObjectValue(value))return;const display=savedCallable(value,"display"),prev=savedCallable(value,"prev"),next=savedCallable(value,"next"),on=savedCallable(value,"on"),annotationsValue=inheritedDataValue(value,"annotations"),highlight=savedCallable(annotationsValue,"highlight"),remove=savedCallable(annotationsValue,"remove");if(!(!display||!prev||!next||!on||!highlight||!remove))return Object.freeze({display:target=>taskFrom(display,target),prev:()=>taskFrom(prev),next:()=>taskFrom(next),on:(type,callback)=>{on(type,callback)},annotations:Object.freeze({highlight:(cfi,data,callback,className,styles2)=>highlight(cfi,data,callback,className,styles2),remove:(cfi,type)=>{remove(cfi,type)}})})}function normalizeSpineItem(value){const load=savedCallable(value,"load"),find=savedCallable(value,"find"),unload=savedCallable(value,"unload");if(!(!load||!find||!unload))return Object.freeze({load:request=>load(request),find:query=>find(query),unload:()=>{unload()}})}function projectSpineItems(book){const spineItems=inheritedDataValue(book.spine,"spineItems");if(!isArrayValue(spineItems))return Object.freeze({items:Object.freeze([]),exact:spineItems===void 0});const length=getOwnDataDescriptor(spineItems,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return Object.freeze({items:Object.freeze([]),exact:!1});const items=[];let exact=length.value<=MAX_SEARCH_SPINE_ITEMS;const count=Math.min(length.value,MAX_SEARCH_SPINE_ITEMS);for(let index=0;index<count;index+=1){const descriptor=getOwnDataDescriptor(spineItems,String(index));if(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR){exact=!1;continue}const item=normalizeSpineItem(descriptor.value);if(!item){exact=!1;continue}items.push(item)}return Object.freeze({items:Object.freeze(items),exact})}function projectFindResults(value,work){if(!isArrayValue(value))return Object.freeze({matches:Object.freeze([]),exact:!1});const length=getOwnDataDescriptor(value,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return Object.freeze({matches:Object.freeze([]),exact:!1});const matches=[];let exact=length.value<=MAX_FIND_RESULTS;const count=Math.min(length.value,MAX_FIND_RESULTS);for(let index=0;index<count;index+=1){const descriptor=getOwnDataDescriptor(value,String(index));if(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR||!isObjectValue(descriptor.value)){exact=!1;continue}const cfi=getOwnDataDescriptor(descriptor.value,"cfi"),excerpt=getOwnDataDescriptor(descriptor.value,"excerpt");if(cfi===MISSING_OWN_DATA_DESCRIPTOR||cfi===UNSAFE_OWN_DATA_DESCRIPTOR||typeof cfi.value!="string"){exact=!1;continue}if(!work.canConsume(cfi.value)||!work.consume(cfi.value)||cfi.value.trim()===""){exact=!1;continue}let excerptValue="";excerpt!==MISSING_OWN_DATA_DESCRIPTOR&&(excerpt===UNSAFE_OWN_DATA_DESCRIPTOR||typeof excerpt.value!="string"||!work.canConsume(excerpt.value)||!work.consume(excerpt.value)?exact=!1:excerptValue=excerpt.value),matches.push({cfi:cfi.value,excerpt:excerptValue})}return Object.freeze({matches:Object.freeze(matches),exact})}function pushTocEntries(value,level,budget,stack){if(!isArrayValue(value)||budget.positions>=MAX_TOC_ITEMS)return;const length=getOwnDataDescriptor(value,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return;const count=Math.min(length.value,MAX_TOC_ITEMS-budget.positions);for(let index=count-1;index>=0;index-=1){budget.positions+=1;const descriptor=getOwnDataDescriptor(value,String(index));descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR||stack.push({value:descriptor.value,level})}}function projectToc(value){const budget={positions:0,nodes:0,seen:new WeakSet},stack=[];pushTocEntries(value,1,budget,stack);const items=[];for(;stack.length>0&&budget.nodes<MAX_TOC_ITEMS;){const current=stack.pop();if(!isObjectValue(current.value)||budget.seen.has(current.value))continue;budget.seen.add(current.value),budget.nodes+=1;const href=getOwnDataDescriptor(current.value,"href"),id=getOwnDataDescriptor(current.value,"id"),label=getOwnDataDescriptor(current.value,"label"),children=getOwnDataDescriptor(current.value,"subitems");if(href!==MISSING_OWN_DATA_DESCRIPTOR&&href!==UNSAFE_OWN_DATA_DESCRIPTOR&&typeof href.value=="string"){const idValue=id!==MISSING_OWN_DATA_DESCRIPTOR&&id!==UNSAFE_OWN_DATA_DESCRIPTOR&&typeof id.value=="string"&&id.value!==""?id.value:href.value,labelValue=label!==MISSING_OWN_DATA_DESCRIPTOR&&label!==UNSAFE_OWN_DATA_DESCRIPTOR&&typeof label.value=="string"?label.value.trim():"";items.push({id:idValue,label:labelValue,href:href.value,level:current.level})}current.level<MAX_TOC_DEPTH&&children!==MISSING_OWN_DATA_DESCRIPTOR&&children!==UNSAFE_OWN_DATA_DESCRIPTOR&&pushTocEntries(children.value,current.level+1,budget,stack)}return Object.freeze(items)}const TONE_FILL_TOKEN={accent:{token:"--lr-color-brand-quiet",fallback:"#ddf4ff"},success:{token:"--lr-color-success-quiet",fallback:"#dafbe1"},warning:{token:"--lr-color-warning-quiet",fallback:"#fff8c5"},danger:{token:"--lr-color-danger-quiet",fallback:"#ffebe9"},neutral:{token:"--lr-color-surface-raised",fallback:"#f6f8fa"}},SEARCH_MATCH_FILL_TOKEN={token:"--lr-color-warning",fallback:"#9a6700"},ACTIVE_HIGHLIGHT_STROKE_TOKEN={token:"--lr-focus-ring-color",fallback:"#0969da"};class LyraEbookViewerBase extends LyraElement{}class LyraEbookViewer extends DocumentAnchorTarget(LyraEbookViewerBase){static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,collapse:LYRA_DEFAULT_collapse,details:LYRA_DEFAULT_details,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeDocument:LYRA_DEFAULT_documentPreviewTypeDocument,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,ebookViewerLoadError:LYRA_DEFAULT_ebookViewerLoadError,ebookViewerNextChapter:LYRA_DEFAULT_ebookViewerNextChapter,ebookViewerPreviousChapter:LYRA_DEFAULT_ebookViewerPreviousChapter,ebookViewerRegionLabel:LYRA_DEFAULT_ebookViewerRegionLabel,loading:LYRA_DEFAULT_loading,loadingDocument:LYRA_DEFAULT_loadingDocument,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,next:LYRA_DEFAULT_next,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,previous:LYRA_DEFAULT_previous,remove:LYRA_DEFAULT_remove,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,viewerSearchActiveMatch:LYRA_DEFAULT_viewerSearchActiveMatch,viewerSearchMatchCount:LYRA_DEFAULT_viewerSearchMatchCount,viewerSearchNoMatches:LYRA_DEFAULT_viewerSearchNoMatches}}static{this.styles=[LyraElement.styles,styles,srOnly]}constructor(){super(),this.src="",this.name="",this.accessibleLabel=null,this.maxHeight="",this.location="",this.anchorKinds=["cfi","text-quote"],this.ebookState={kind:"idle"},this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.mountRef=createRef(),this.generation=0,this.failedGeneration=-1,this.searchQuery="",this.lastSearchLocale="",this.searchGeneration=0,this.pendingSearchResetEvent=!1,this.anchorOperationGeneration=0,this.paintedHighlightCfis=[],this.announcements=new ViewerAnnouncementController(this),this.announcer=new Announcer({onFlush:text=>this.announcements.announcePolite(text)}),this.previous=()=>{this.runRenditionNavigation("previous")},this.next=()=>{this.runRenditionNavigation("next")},new ThemeWatcher(this,()=>this.repaintAnnotations())}updated(changed){if(super.updated(changed),this.announcements.transition("load",this.ebookState.kind,this.ebookState.kind==="error"?this.ebookState.message:this.localize("loadingDocument")),changed.has("src")&&this.scheduleAfterUpdate(()=>{this.load()}),changed.has("src")&&this.pendingSearchResetEvent&&(this.pendingSearchResetEvent=!1,this.emitSearchChange()),changed.has("location")){const fromRelocated=this.relocatedLocation===this.location;this.relocatedLocation=void 0,!fromRelocated&&this.rendition&&this.location&&this.displayLocation(this.location)}(changed.has("highlights")||changed.has("activeHighlightId"))&&this.rendition&&this.repaintAnnotations();const locale=this.effectiveLocale;if(locale!==this.lastSearchLocale){const shouldRecompute=this.searchQuery!=="";this.lastSearchLocale=locale,shouldRecompute&&this.scheduleAfterUpdate(()=>{this.search(this.searchQuery)},"search")}}willUpdate(changed){super.willUpdate(changed),changed.has("src")&&(this.pendingSearchResetEvent||=this.hasSearchState(),this.resetSearchState())}connectedCallback(){super.connectedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.announcements.connect(),this.hasUpdated&&this.src.trim()&&this.scheduleAfterUpdate(()=>{this.load()})}disconnectedCallback(){this.generation++,this.anchorOperationGeneration++,this.announcer.cancel(),this.announcements.disconnect(),this.teardown(),this.ebookState={kind:"idle"},super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback();const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.announcements.adopted()}teardown(){const shouldEmitSearchReset=this.hasSearchState();this.destroyBook(this.book),this.book=void 0,this.rendition=void 0,this.resetSearchState(),this.paintedHighlightCfis=[],shouldEmitSearchReset&&this.isConnected&&this.emitSearchChange()}destroyBook(book){try{book?.destroy()}catch{}}isCurrentLoad(generation,ownerView){return this.isConnected&&generation===this.generation&&this.ownerDocument.defaultView===ownerView}isCurrentBookRendition(generation,ownerView,book,rendition){return this.isConnected&&generation===this.generation&&this.ownerDocument.defaultView===ownerView&&this.book===book&&this.rendition===rendition}failCurrentLoad(error,message=this.localize("ebookViewerLoadError")){this.failedGeneration!==this.generation&&(this.failedGeneration=this.generation,this.ebookState={kind:"error",message},this.emit("lr-render-error",{error}))}hasSearchState(){return this.searchQuery!==""||this.searchMatches.length>0||!this.searchMatchCountExact||this.searchActiveIndex!==-1}resetSearchState(){this.searchGeneration++,this.searchQuery="",this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.searchAnnotationCfi=void 0}async load(){const generation=++this.generation,signal=this.beginAbortableLoad();if(this.teardown(),!this.src.trim()){this.ebookState={kind:"idle"};return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){this.failWithLocalizedMessage(this.localize("documentPreviewUrlNotAllowed"));return}this.ebookState={kind:"loading"};let data,factory;try{if([data,factory]=await Promise.all([fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0).then(response=>{if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);return readResponseArrayBuffer(response)}),getEpubJs()]),!this.isCurrentLoad(generation,fetchTarget.view)||(await assertEpubArchiveWithinLimits(data,void 0,void 0,{signal}),!this.isCurrentLoad(generation,fetchTarget.view)))return}catch(error){if(isAbortError(error)||!this.isCurrentLoad(generation,fetchTarget.view))return;this.failCurrentLoad(error,this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"ebookViewerLoadError"));return}if(!factory){this.failWithLocalizedMessage(this.localize("ebookViewerLoadError"));return}const mount=this.mountRef.value;if(!mount){this.failWithLocalizedMessage(this.localize("ebookViewerLoadError"));return}let candidateBook;try{const book=normalizeBook(factory(data));if(!book)throw new Error("EPUB peer returned an unusable book.");candidateBook=book;const rendition=normalizeRendition(book.renderTo(mount,{width:"100%",height:"100%"}));if(!rendition)throw new Error("EPUB peer returned an unusable rendition.");if(await book.ready,!this.isCurrentLoad(generation,fetchTarget.view)){this.destroyBook(book),candidateBook=void 0;return}if(book.getNavigation(),await rendition.display(this.location||void 0),!this.isCurrentLoad(generation,fetchTarget.view)){this.destroyBook(book),candidateBook=void 0;return}rendition.on("relocated",loc=>{if(!this.isCurrentBookRendition(generation,fetchTarget.view,book,rendition))return;const start=inheritedDataValue(loc,"start"),cfi=inheritedDataValue(start,"cfi"),href=inheritedDataValue(start,"href");typeof cfi!="string"||cfi.trim()===""||!cfi||cfi===this.location||(this.relocatedLocation=cfi,this.location=cfi,this.emit("lr-location-change",{cfi,href:typeof href=="string"?href:""}))}),rendition.on("selected",(cfiRange,contents)=>{if(!(!this.isCurrentBookRendition(generation,fetchTarget.view,book,rendition)||typeof cfiRange!="string"))try{const contentsWindow=inheritedDataValue(contents,"window"),selection=savedCallable(contentsWindow,"getSelection")?.(),rangeCount=inheritedDataValue(selection,"rangeCount"),getRangeAt=savedCallable(selection,"getRangeAt"),range=typeof rangeCount=="number"&&rangeCount>0&&getRangeAt?getRangeAt(0):null;if(!range)return;const text=boundedSelectionText(range);if(!text)return;const rects=this.translateSelectionRects(boundedSelectionRects(range),contentsWindow);this.emit("lr-text-select",{text,anchor:{kind:"cfi",cfi:cfiRange},rects})}catch{}}),this.book=book,this.rendition=rendition,candidateBook=void 0,this.ebookState={kind:"ready"},this.repaintAnnotations()}catch(error){if(this.destroyBook(candidateBook),isAbortError(error)||!this.isCurrentLoad(generation,fetchTarget.view))return;this.failCurrentLoad(error)}}failWithLocalizedMessage(message){const error=new LyraUserFacingError(message);this.failCurrentLoad(error,message)}reportRenditionFailure(error,rendition,generation,ownerView=this.ownerDocument.defaultView){!this.isConnected||generation!==this.generation||this.ownerDocument.defaultView!==ownerView||rendition!==this.rendition||this.failCurrentLoad(error)}translateSelectionRects(rects,sourceWindow){const ownerWindow=this.ownerDocument.defaultView;if(!ownerWindow||!sourceWindow)return[];const translated=[];for(const rect of rects){let x=Number(rect.x??rect.left),y=Number(rect.y??rect.top),width=Number(rect.width),height=Number(rect.height);if(![x,y,width,height].every(Number.isFinite))continue;let current=sourceWindow,valid=!0;for(;current&¤t!==ownerWindow;){if(!("frameElement"in current)){current=ownerWindow;break}let frameElement;try{frameElement=current.frameElement}catch{valid=!1;break}const frameWindow=frameElement?.ownerDocument.defaultView;if(!frameElement||!frameWindow||!(frameElement instanceof frameWindow.HTMLElement)){valid=!1;break}const frame=frameElement,frameRect=frame.getBoundingClientRect(),borderBoxWidth=frame.offsetWidth||frame.clientWidth,borderBoxHeight=frame.offsetHeight||frame.clientHeight,viewportWidth=current.innerWidth||frame.clientWidth,viewportHeight=current.innerHeight||frame.clientHeight;if(borderBoxWidth<=0||borderBoxHeight<=0||viewportWidth<=0||viewportHeight<=0){valid=!1;break}const borderScaleX=frameRect.width/borderBoxWidth,borderScaleY=frameRect.height/borderBoxHeight,contentScaleX=frame.clientWidth*borderScaleX/viewportWidth,contentScaleY=frame.clientHeight*borderScaleY/viewportHeight;x=frameRect.left+frame.clientLeft*borderScaleX+x*contentScaleX,y=frameRect.top+frame.clientTop*borderScaleY+y*contentScaleY,width*=contentScaleX,height*=contentScaleY,current=frame.ownerDocument.defaultView}!valid||current!==ownerWindow||translated.push(Object.freeze({x,y,width,height,top:y,right:x+width,bottom:y+height,left:x}))}return translated}displayLocation(location){const rendition=this.rendition;if(!rendition)return;const generation=this.generation,ownerView=this.ownerDocument.defaultView;if(ownerView)try{Promise.resolve(rendition.display(location)).catch(error=>{this.reportRenditionFailure(error,rendition,generation,ownerView)})}catch(error){this.reportRenditionFailure(error,rendition,generation,ownerView)}}runRenditionNavigation(action){const rendition=this.rendition;if(!rendition)return;const generation=this.generation,ownerView=this.ownerDocument.defaultView;if(ownerView)try{const task=action==="previous"?rendition.prev():rendition.next();Promise.resolve(task).catch(error=>{this.reportRenditionFailure(error,rendition,generation,ownerView)})}catch(error){this.reportRenditionFailure(error,rendition,generation,ownerView)}}async getToc(){const book=this.book,generation=this.generation,ownerView=this.ownerDocument.defaultView;if(!book||!ownerView)return[];try{await book.ready}catch{return[]}return!this.isCurrentLoad(generation,ownerView)||this.book!==book?[]:[...projectToc(inheritedDataValue(book.getNavigation(),"toc"))]}async scrollToAnchor(target){const operation=++this.anchorOperationGeneration,generation=this.generation,ownerView=this.ownerDocument.defaultView,book=this.book,rendition=this.rendition;try{return await Object.getPrototypeOf(LyraEbookViewer.prototype).performScrollToAnchor.call(this,target)}catch(error){return operation!==this.anchorOperationGeneration||!ownerView||!this.isCurrentLoad(generation,ownerView)||this.book!==book||this.rendition!==rendition||(rendition&&this.reportRenditionFailure(error,rendition,generation,ownerView),this.emit("lr-anchor-result",{found:!1})),!1}}async applyAnchor(anchor){const rendition=this.rendition,operation=this.anchorOperationGeneration,generation=this.generation,ownerView=this.ownerDocument.defaultView;if(!rendition||!ownerView)return!1;if(anchor.kind==="cfi")return operation!==this.anchorOperationGeneration||!this.isCurrentLoad(generation,ownerView)||rendition!==this.rendition?!1:(await rendition.display(anchor.cfi),operation===this.anchorOperationGeneration&&this.isCurrentLoad(generation,ownerView)&&rendition===this.rendition);if(anchor.kind==="text-quote"){const cfi=await this.findTextQuoteCfi(anchor.quote);return!cfi||operation!==this.anchorOperationGeneration||!this.isCurrentLoad(generation,ownerView)||rendition!==this.rendition?!1:(await rendition.display(cfi),operation===this.anchorOperationGeneration&&this.isCurrentLoad(generation,ownerView)&&rendition===this.rendition)}return!1}async findTextQuoteCfi(quote){const book=this.book,generation=this.generation,ownerView=this.ownerDocument.defaultView,boundedQuery=boundedViewerSearchQuery(quote,this.effectiveLocale);if(!book||!ownerView||!boundedQuery.accepted||!boundedQuery.needle)return null;const work=new ViewerSearchWorkBudget,spine=projectSpineItems(book);for(const item of spine.items){if(!work.consume(""))return null;let loaded=!1;try{if(await awaitPeerResult(item.load(book.load)),loaded=!0,!this.isCurrentLoad(generation,ownerView)||this.book!==book)return null;const{value:rawResults}=await awaitPeerResult(item.find(quote)),results=projectFindResults(rawResults,work);if(!this.isCurrentLoad(generation,ownerView)||this.book!==book)return null;for(const result of results.matches)return work.consume("")?result.cfi:null}catch{continue}finally{if(loaded)try{item.unload()}catch{}}}return null}repaintHighlights(){const rendition=this.rendition;if(!rendition)return;const book=this.book,generation=this.generation,ownerView=this.ownerDocument.defaultView,work=new ViewerSearchWorkBudget;for(const cfi of this.paintedHighlightCfis){if(!work.consume(cfi))break;rendition.annotations.remove(cfi,"highlight")}this.paintedHighlightCfis=[];let painted=0;for(const highlight of prioritizedHighlightCandidates(this.highlights,this.activeHighlightId)){if(highlight.anchor.kind!=="cfi")continue;if(painted>=MAX_PAINTED_HIGHLIGHTS)break;const cfi=highlight.anchor.cfi.trim();if(!cfi||cfi.length>VIEWER_SEARCH_QUERY_LIMIT||!work.consume(cfi))continue;const tone=highlight.tone??"accent",active=highlight.id===this.activeHighlightId,styles2=this.resolveHighlightFill(TONE_FILL_TOKEN[tone]);if(active){const forcedColors=this.ownerDocument.defaultView?.matchMedia?.("(forced-colors: active)").matches??!1;styles2.stroke=forcedColors?"CanvasText":this.resolveHighlightFill(ACTIVE_HIGHLIGHT_STROKE_TOKEN).fill,styles2["stroke-width"]="3",styles2["stroke-dasharray"]="2 1"}rendition.annotations.highlight(cfi,{id:highlight.id},()=>{!book||!ownerView||!this.isCurrentBookRendition(generation,ownerView,book,rendition)||this.emit("lr-highlight-activate",{highlightId:highlight.id})},active?`lr-hl-${tone} lr-ebook-highlight-active`:`lr-hl-${tone}`,styles2),this.paintedHighlightCfis.push(cfi),painted++}}repaintSearchAnnotation(){const rendition=this.rendition,cfi=this.searchAnnotationCfi;!rendition||!cfi||(rendition.annotations.remove(cfi,"highlight"),rendition.annotations.highlight(cfi,{},void 0,"lr-ebook-search",this.resolveHighlightFill(SEARCH_MATCH_FILL_TOKEN)))}repaintAnnotations(){const rendition=this.rendition;if(rendition)try{this.repaintHighlights(),this.repaintSearchAnnotation()}catch(error){this.reportRenditionFailure(error,rendition,this.generation)}}async search(query){const generation=++this.searchGeneration,ownerView=this.ownerDocument.defaultView,boundedQuery=boundedViewerSearchQuery(query,this.effectiveLocale);if(this.searchQuery=query,this.lastSearchLocale=this.effectiveLocale,this.clearSearchAnnotation(),!boundedQuery.accepted)return this.searchMatches=[],this.searchMatchCountExact=!1,this.searchActiveIndex=-1,this.emitSearchChange(),0;if(!this.book||!ownerView||!boundedQuery.needle)return this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.emitSearchChange(),0;const matches=[];let matchCountExact=!0,matchCeilingExceeded=!1;const book=this.book,work=new ViewerSearchWorkBudget,spine=projectSpineItems(book);spine.exact||(matchCountExact=!1);for(const item of spine.items){if(generation!==this.searchGeneration||this.ownerDocument.defaultView!==ownerView||!this.isConnected)return this.searchMatches.length;if(!work.consume("")){matchCountExact=!1;break}let loaded=!1;try{if(await awaitPeerResult(item.load(book.load)),loaded=!0,generation!==this.searchGeneration||this.ownerDocument.defaultView!==ownerView||!this.isConnected||this.book!==book)return this.searchMatches.length;const{value:rawResults}=await awaitPeerResult(item.find(query.trim())),results=projectFindResults(rawResults,work);if(generation!==this.searchGeneration||this.ownerDocument.defaultView!==ownerView||!this.isConnected||this.book!==book)return this.searchMatches.length;results.exact||(matchCountExact=!1);for(const r of results.matches){if(!work.consume("")){matchCountExact=!1,matchCeilingExceeded=!0;break}if(matches.length===MAX_SEARCH_MATCHES){matchCountExact=!1,matchCeilingExceeded=!0;break}matches.push(r)}}catch{matchCountExact=!1;continue}finally{if(loaded)try{item.unload()}catch{matchCountExact=!1}}if(matchCeilingExceeded)break}return generation!==this.searchGeneration||this.ownerDocument.defaultView!==ownerView||!this.isConnected||this.book!==book?this.searchMatches.length:(this.searchMatches=matches,this.searchMatchCountExact=matchCountExact,this.searchActiveIndex=matches.length>0?0:-1,this.emitSearchChange(),this.searchActiveIndex>=0&&await this.showSearchMatch(this.searchActiveIndex,generation,ownerView),matches.length)}async searchNext(){if(!this.searchMatches.length)return!1;const generation=++this.searchGeneration;return this.searchActiveIndex=(this.searchActiveIndex+1)%this.searchMatches.length,this.emitSearchChange(),this.showSearchMatch(this.searchActiveIndex,generation)}async searchPrevious(){if(!this.searchMatches.length)return!1;const generation=++this.searchGeneration;return this.searchActiveIndex=(this.searchActiveIndex-1+this.searchMatches.length)%this.searchMatches.length,this.emitSearchChange(),this.showSearchMatch(this.searchActiveIndex,generation)}clearSearch(){this.searchGeneration++,this.searchQuery="",this.searchMatches=[],this.searchMatchCountExact=!0,this.searchActiveIndex=-1,this.clearSearchAnnotation(),this.emit("lr-search-change",{query:"",matchCount:0,matchCountExact:!0,activeIndex:-1})}clearSearchAnnotation(){const cfi=this.searchAnnotationCfi;this.searchAnnotationCfi=void 0;const rendition=this.rendition,generation=this.generation,ownerView=this.ownerDocument.defaultView;if(!(!cfi||!rendition||!ownerView))try{rendition.annotations.remove(cfi,"highlight")}catch(error){this.reportRenditionFailure(error,rendition,generation,ownerView)}}async showSearchMatch(index,generation=this.searchGeneration,ownerView=this.ownerDocument.defaultView){const match=this.searchMatches[index],rendition=this.rendition;if(!match||!rendition||generation!==this.searchGeneration||!ownerView||!this.isConnected||this.ownerDocument.defaultView!==ownerView)return!1;this.clearSearchAnnotation();try{await rendition.display(match.cfi)}catch(error){return generation===this.searchGeneration&&rendition===this.rendition&&this.ownerDocument.defaultView===ownerView&&this.reportRenditionFailure(error,rendition,this.generation,ownerView),!1}if(generation!==this.searchGeneration||rendition!==this.rendition||this.searchMatches[index]!==match||!this.isConnected||this.ownerDocument.defaultView!==ownerView)return!1;try{rendition.annotations.highlight(match.cfi,{},void 0,"lr-ebook-search",this.resolveHighlightFill(SEARCH_MATCH_FILL_TOKEN))}catch(error){return this.reportRenditionFailure(error,rendition,this.generation,ownerView),!1}return this.searchAnnotationCfi=match.cfi,!0}emitSearchChange(){this.emit("lr-search-change",{query:this.searchQuery,matchCount:this.searchMatches.length,matchCountExact:this.searchMatchCountExact,activeIndex:this.searchActiveIndex}),announceSearchResult((key,fallback,values)=>this.localize(key,fallback,values),this.announcer,this.effectiveLocale,this.searchMatches.length,this.searchActiveIndex)}resolveHighlightFill({token,fallback}){return{fill:(this.ownerDocument.defaultView?.getComputedStyle(this).getPropertyValue(token).trim()??"")||fallback}}renderStatus(){return this.ebookState.kind==="loading"?html`<p class="status-note">${this.localize("loadingDocument")}</p>`:this.ebookState.kind==="error"?html`<div part="error">${this.ebookState.message}</div>`:this.ebookState.kind==="idle"?html`<p class="status-note">${this.localize("documentPreviewEmpty",void 0,{type:this.localize("documentPreviewTypeDocument")})}</p>`:nothing}render(){const disabled=this.ebookState.kind!=="ready";return html`
|
|
2
2
|
<div
|
|
3
3
|
part="base"
|
|
4
4
|
aria-busy=${this.ebookState.kind==="loading"?"true":"false"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";function isPostalMimeApi(value){return(typeof value=="object"||typeof value=="function")&&value!==null&&"parse"in value&&typeof value.parse=="function"}let depsPromise,resolvedDeps;async function loadEmailAndSanitizer(importPostalMime=()=>import("postal-mime"),importDompurify=()=>import("dompurify")){let PostalMime;try{PostalMime=resolveOptionalPeerCapability(await importPostalMime(),isPostalMimeApi)??void 0}catch(error){console.warn("<lr-email-viewer> needs the optional peer dependency `postal-mime` to parse .eml messages
|
|
1
|
+
import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";function isPostalMimeApi(value){return(typeof value=="object"||typeof value=="function")&&value!==null&&"parse"in value&&typeof value.parse=="function"}let depsPromise,resolvedDeps;async function loadEmailAndSanitizer(importPostalMime=()=>import("postal-mime"),importDompurify=()=>import("dompurify")){let PostalMime;try{PostalMime=resolveOptionalPeerCapability(await importPostalMime(),isPostalMimeApi)??void 0}catch(error){console.warn("<lr-email-viewer> needs the optional peer dependency `postal-mime` to parse .eml messages — install it with `pnpm add postal-mime`:",error)}let DOMPurify;try{DOMPurify=resolveOptionalPeerCapability(await importDompurify(),isHtmlSanitizer)??void 0}catch(error){console.warn("<lr-email-viewer> needs the optional peer dependency `dompurify` to sanitize HTML message bodies — install it with `pnpm add dompurify`:",error)}return{PostalMime,DOMPurify}}function loadEmailDeps(){return depsPromise||(depsPromise=loadEmailAndSanitizer().then(result=>(resolvedDeps=result,result))),depsPromise}function getEmailDepsIfLoaded(){return resolvedDeps}function clearEmailDepsCache(){depsPromise=void 0,resolvedDeps=void 0}function __setEmailDepsForTesting(deps){depsPromise=deps===void 0?void 0:Promise.resolve(deps),resolvedDeps=deps}export{__setEmailDepsForTesting,clearEmailDepsCache,getEmailDepsIfLoaded,loadEmailAndSanitizer,loadEmailDeps};
|
|
@@ -89,7 +89,7 @@ search(query:string):Promise<number>;searchNext():Promise<boolean>;searchPreviou
|
|
|
89
89
|
* change alone (no `bodyHtml`/index change) still flips the "Show/Hide quoted text" button text
|
|
90
90
|
* that {@link foldHtmlQuotes} bakes into the returned markup, so the cache must miss when either
|
|
91
91
|
* label would render differently. */
|
|
92
|
-
private foldedHtmlCache;protected textContentRoot():Element|null;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private load;private failWithLocalizedMessage;private parse;private formatAddress;private formatAddresses;private formatDate;private renderHeaders;private renderAttachments;private renderTextBody;private onBodyClick;
|
|
92
|
+
private foldedHtmlCache;protected textContentRoot():Element|null;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private load;private failWithLocalizedMessage;private isCurrentLoad;private parse;private formatAddress;private formatAddresses;private formatDate;private renderHeaders;private renderAttachments;private renderTextBody;private onBodyClick;
|
|
93
93
|
/** Cached wrapper around {@link foldHtmlQuotes} -- see {@link foldedHtmlCache}'s doc comment for
|
|
94
94
|
* what the cache key covers and why. A cache hit skips the `DOMParser().parseFromString()` +
|
|
95
95
|
* `QUOTE_SELECTOR` walk + `.innerHTML` re-serialization entirely, which otherwise re-ran on
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{srOnly}from"../../../internal/a11y.js";import{LyraElement}from"../../../internal/lyra-element.js";import{TextViewerTarget}from"../../../internal/text-viewer-target.js";import{isAbortError,isResourceLimitError,LyraUserFacingError,readResponseArrayBuffer,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{getDateTimeFormat,getListFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{formatFileSize,FILE_SIZE_UNIT_KEYS}from"../../media/attachment-chip/attachment-chip.class.js";import{loadEmailDeps}from"./email-loader.js";import{styles}from"./email-viewer.styles.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{activeElementIn}from"../../../internal/active-element.js";import{ViewerAnnouncementController}from"../viewer-announcements.js";import{renderViewerLoading,viewerLoadingStyles}from"../viewer-loading.js";import{sanitizePassiveMarkup}from"../passive-markup.js";import{viewerSemanticLabel,viewerSemanticRole}from"../viewer-semantic-owner.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_collapse,LYRA_DEFAULT_details,LYRA_DEFAULT_documentPreviewEmpty,LYRA_DEFAULT_documentPreviewFailedToLoad,LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeEmail,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_documentViewerMissingSanitizer,LYRA_DEFAULT_download,LYRA_DEFAULT_emailViewerAttachments,LYRA_DEFAULT_emailViewerDate,LYRA_DEFAULT_emailViewerFrom,LYRA_DEFAULT_emailViewerGroupAddress,LYRA_DEFAULT_emailViewerHideQuoted,LYRA_DEFAULT_emailViewerLabel,LYRA_DEFAULT_emailViewerMissingParser,LYRA_DEFAULT_emailViewerNoSubject,LYRA_DEFAULT_emailViewerOpenAttachment,LYRA_DEFAULT_emailViewerShowQuoted,LYRA_DEFAULT_emailViewerSubject,LYRA_DEFAULT_emailViewerTo,LYRA_DEFAULT_emailViewerUnnamedAttachment,LYRA_DEFAULT_fileSizeUnitB,LYRA_DEFAULT_fileSizeUnitGb,LYRA_DEFAULT_fileSizeUnitKb,LYRA_DEFAULT_fileSizeUnitMb,LYRA_DEFAULT_fileSizeUnitTb,LYRA_DEFAULT_loading,LYRA_DEFAULT_loadingDocument,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_search,LYRA_DEFAULT_select}from"../../../internal/default-strings.generated.js";function normalizeAttachmentContent(content){return content instanceof Uint8Array
|
|
1
|
+
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{unsafeHTML}from"lit/directives/unsafe-html.js";import{srOnly}from"../../../internal/a11y.js";import{LyraElement}from"../../../internal/lyra-element.js";import{TextViewerTarget}from"../../../internal/text-viewer-target.js";import{isAbortError,isResourceLimitError,LyraUserFacingError,readResponseArrayBuffer,resolveOwnerFetchTarget}from"../../../internal/resource-loader.js";import{getDateTimeFormat,getListFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{formatFileSize,FILE_SIZE_UNIT_KEYS}from"../../media/attachment-chip/attachment-chip.class.js";import{loadEmailDeps}from"./email-loader.js";import{styles}from"./email-viewer.styles.js";import{sanitizeCssLength}from"../../../internal/safe-css.js";import{activeElementIn}from"../../../internal/active-element.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{ViewerAnnouncementController}from"../viewer-announcements.js";import{renderViewerLoading,viewerLoadingStyles}from"../viewer-loading.js";import{sanitizePassiveMarkup}from"../passive-markup.js";import{viewerSemanticLabel,viewerSemanticRole}from"../viewer-semantic-owner.js";import{LYRA_DEFAULT_anchorJumped,LYRA_DEFAULT_anchorJumpedToPage,LYRA_DEFAULT_anchorNotFound,LYRA_DEFAULT_collapse,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_documentPreviewEmpty,LYRA_DEFAULT_documentPreviewFailedToLoad,LYRA_DEFAULT_documentPreviewResourceTooLarge,LYRA_DEFAULT_documentPreviewTypeEmail,LYRA_DEFAULT_documentPreviewUrlNotAllowed,LYRA_DEFAULT_documentViewerMissingSanitizer,LYRA_DEFAULT_download,LYRA_DEFAULT_emailViewerAttachments,LYRA_DEFAULT_emailViewerDate,LYRA_DEFAULT_emailViewerFrom,LYRA_DEFAULT_emailViewerGroupAddress,LYRA_DEFAULT_emailViewerHideQuoted,LYRA_DEFAULT_emailViewerLabel,LYRA_DEFAULT_emailViewerMissingParser,LYRA_DEFAULT_emailViewerNoSubject,LYRA_DEFAULT_emailViewerOpenAttachment,LYRA_DEFAULT_emailViewerShowQuoted,LYRA_DEFAULT_emailViewerSubject,LYRA_DEFAULT_emailViewerTo,LYRA_DEFAULT_emailViewerUnnamedAttachment,LYRA_DEFAULT_fileSizeUnitB,LYRA_DEFAULT_fileSizeUnitGb,LYRA_DEFAULT_fileSizeUnitKb,LYRA_DEFAULT_fileSizeUnitMb,LYRA_DEFAULT_fileSizeUnitTb,LYRA_DEFAULT_loading,LYRA_DEFAULT_loadingDocument,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_popover,LYRA_DEFAULT_search,LYRA_DEFAULT_select}from"../../../internal/default-strings.generated.js";const MAX_EMAIL_RECIPIENT_POSITIONS=1e4,MAX_EMAIL_RECIPIENT_DEPTH=100,MAX_EMAIL_ATTACHMENT_POSITIONS=1e4;function isArrayValue(value){try{return Array.isArray(value)}catch{return!1}}function isSafeRecord(value){if(value===null||typeof value!="object"||isArrayValue(value))return!1;try{const prototype=Object.getPrototypeOf(value);return prototype===null||Object.getPrototypeOf(prototype)===null}catch{return!1}}function optionalOwnString(value,key){const descriptor=getOwnDataDescriptor(value,key);return descriptor!==MISSING_OWN_DATA_DESCRIPTOR&&descriptor!==UNSAFE_OWN_DATA_DESCRIPTOR&&typeof descriptor.value=="string"?descriptor.value:void 0}function optionalOwnValue(value,key){const descriptor=getOwnDataDescriptor(value,key);return descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR?void 0:descriptor.value}function projectAddressList(value,budget,depth){if(!isArrayValue(value)||budget.positions>=MAX_EMAIL_RECIPIENT_POSITIONS)return[];const length=getOwnDataDescriptor(value,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return[];const addresses=[],count=Math.min(length.value,MAX_EMAIL_RECIPIENT_POSITIONS-budget.positions);for(let index=0;index<count;index+=1){budget.positions+=1;const descriptor=getOwnDataDescriptor(value,String(index));if(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR)continue;const address=projectAddress(descriptor.value,budget,depth);address&&addresses.push(address)}return addresses}function projectAddress(value,budget,depth){if(depth>MAX_EMAIL_RECIPIENT_DEPTH||budget.nodes>=MAX_EMAIL_RECIPIENT_POSITIONS||!isSafeRecord(value)||budget.seen.has(value))return;budget.seen.add(value),budget.nodes+=1;const name=optionalOwnString(value,"name"),address=optionalOwnString(value,"address"),groupValue=optionalOwnValue(value,"group"),group=groupValue===void 0?[]:projectAddressList(groupValue,budget,depth+1);if(!(name===void 0&&address===void 0&&group.length===0))return Object.freeze({...name===void 0?{}:{name},...address===void 0?{}:{address},...group.length===0?{}:{group:Object.freeze(group)}})}function normalizeAttachmentContent(content){try{if(typeof content=="string")return new TextEncoder().encode(content);if(content instanceof Uint8Array)return new Uint8Array(content);if(content instanceof ArrayBuffer)return new Uint8Array(content.slice(0))}catch{return}}function projectAttachments(value){if(!isArrayValue(value))return Object.freeze([]);const length=getOwnDataDescriptor(value,"length");if(length===MISSING_OWN_DATA_DESCRIPTOR||length===UNSAFE_OWN_DATA_DESCRIPTOR||typeof length.value!="number"||!Number.isSafeInteger(length.value)||length.value<0)return Object.freeze([]);const attachments=[],count=Math.min(length.value,MAX_EMAIL_ATTACHMENT_POSITIONS);for(let index=0;index<count;index+=1){const entry=getOwnDataDescriptor(value,String(index));if(entry===MISSING_OWN_DATA_DESCRIPTOR||entry===UNSAFE_OWN_DATA_DESCRIPTOR||!isSafeRecord(entry.value))continue;const content=normalizeAttachmentContent(optionalOwnValue(entry.value,"content"));if(!content)continue;const filename=optionalOwnString(entry.value,"filename")??"",mimeType=optionalOwnString(entry.value,"mimeType")??"";attachments.push(Object.freeze({filename,mimeType,size:content.byteLength,content}))}return Object.freeze(attachments)}function normalizeParsedEmail(value){if(!isSafeRecord(value))return null;const budget={positions:0,nodes:0,seen:new WeakSet},htmlValue=optionalOwnValue(value,"html"),textValue=optionalOwnValue(value,"text"),subjectValue=optionalOwnValue(value,"subject"),dateValue=optionalOwnValue(value,"date"),html2=typeof htmlValue=="string"?htmlValue:void 0,text=typeof textValue=="string"?textValue:void 0,subject=typeof subjectValue=="string"?subjectValue:void 0,date=typeof dateValue=="string"?dateValue:void 0,from=projectAddress(optionalOwnValue(value,"from"),budget,0),to=projectAddressList(optionalOwnValue(value,"to"),budget,0);return Object.freeze({...html2===void 0?{}:{html:html2},...text===void 0?{}:{text},...from===void 0?{}:{from},to:Object.freeze(to),...subject===void 0?{}:{subject},...date===void 0?{}:{date},attachments:projectAttachments(optionalOwnValue(value,"attachments"))})}function immutableAttachmentBlob(content,mimeType){const copied=new Uint8Array(content.byteLength);return copied.set(content),new Blob([copied],{type:mimeType})}class LyraEmailViewerBase extends LyraElement{static{this.immutableEventDetails=Object.freeze(["lr-attachment-open","lr-text-select"])}}function splitTrailingQuoteBlock(text){const lines=text.split(/\r\n|\r|\n/);let start=lines.length,quotedLineCount=0;for(let i=lines.length-1;i>=0;i--)if(lines[i].trimStart().startsWith(">"))start=i,quotedLineCount++;else if(lines[i].trim()==="")start=i;else break;return quotedLineCount<3?null:{visible:lines.slice(0,start).join(`
|
|
2
2
|
`),quoted:lines.slice(start).join(`
|
|
3
|
-
`)}}const QUOTE_SELECTOR='blockquote[type="cite" i], div.gmail_quote, div.yahoo_quoted, div[id^="divRplyFwdMsg"]';function parseHtmlDocument(html2,ownerDocument){const DOMParserCtor=ownerDocument.defaultView?.DOMParser;return DOMParserCtor?new DOMParserCtor().parseFromString(html2,"text/html"):null}function foldHtmlQuotes(html2,localize,expandedIndices,ownerDocument){const doc=parseHtmlDocument(html2,ownerDocument);return doc?(doc.body.querySelectorAll(QUOTE_SELECTOR).forEach((block,index)=>{const expanded=expandedIndices.includes(index);block.setAttribute("part","quoted"),expanded||block.setAttribute("hidden",""),block.setAttribute("data-quote-index",String(index));const button=doc.createElement("button");button.type="button",button.setAttribute("part","quote-toggle"),button.setAttribute("aria-expanded",String(expanded)),button.setAttribute("data-quote-toggle",String(index)),button.textContent=localize(expanded?"emailViewerHideQuoted":"emailViewerShowQuoted"),block.before(button)}),doc.body.innerHTML):html2}function isQuoteToggleElement(target){const candidate=target;return candidate.nodeType===1&&typeof candidate.hasAttribute=="function"&&candidate.hasAttribute("data-quote-toggle")}class LyraEmailViewer extends TextViewerTarget(LyraEmailViewerBase){constructor(){super(...arguments),this.src="",this.name="",this.maxHeight="",this.foldQuotes=!1,this.fetchState={kind:"idle"},this.textQuoteExpanded=!1,this.expandedHtmlQuoteIndices=[],this.generation=0,this.lastLoadSrc="",this.announcements=new ViewerAnnouncementController(this),this.foldedHtmlCache=null,this.onBodyClick=e=>{const target=e.composedPath().find(isQuoteToggleElement);if(!target)return;const index=target.getAttribute("data-quote-toggle"),block=this.renderRoot.querySelector(`[data-quote-index="${index}"]`),numericIndex=Number(index);if(!block||!Number.isInteger(numericIndex)||numericIndex<0)return;const restoreFocus=activeElementIn(this.shadowRoot)===target;this.expandedHtmlQuoteIndices=this.expandedHtmlQuoteIndices.includes(numericIndex)?this.expandedHtmlQuoteIndices.filter(value=>value!==numericIndex):[...this.expandedHtmlQuoteIndices,numericIndex],restoreFocus&&this.scheduleAfterUpdate(()=>{this.renderRoot.querySelector(`[data-quote-toggle="${numericIndex}"]`)?.focus()})}}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,collapse:LYRA_DEFAULT_collapse,details:LYRA_DEFAULT_details,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewFailedToLoad:LYRA_DEFAULT_documentPreviewFailedToLoad,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeEmail:LYRA_DEFAULT_documentPreviewTypeEmail,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,documentViewerMissingSanitizer:LYRA_DEFAULT_documentViewerMissingSanitizer,download:LYRA_DEFAULT_download,emailViewerAttachments:LYRA_DEFAULT_emailViewerAttachments,emailViewerDate:LYRA_DEFAULT_emailViewerDate,emailViewerFrom:LYRA_DEFAULT_emailViewerFrom,emailViewerGroupAddress:LYRA_DEFAULT_emailViewerGroupAddress,emailViewerHideQuoted:LYRA_DEFAULT_emailViewerHideQuoted,emailViewerLabel:LYRA_DEFAULT_emailViewerLabel,emailViewerMissingParser:LYRA_DEFAULT_emailViewerMissingParser,emailViewerNoSubject:LYRA_DEFAULT_emailViewerNoSubject,emailViewerOpenAttachment:LYRA_DEFAULT_emailViewerOpenAttachment,emailViewerShowQuoted:LYRA_DEFAULT_emailViewerShowQuoted,emailViewerSubject:LYRA_DEFAULT_emailViewerSubject,emailViewerTo:LYRA_DEFAULT_emailViewerTo,emailViewerUnnamedAttachment:LYRA_DEFAULT_emailViewerUnnamedAttachment,fileSizeUnitB:LYRA_DEFAULT_fileSizeUnitB,fileSizeUnitGb:LYRA_DEFAULT_fileSizeUnitGb,fileSizeUnitKb:LYRA_DEFAULT_fileSizeUnitKb,fileSizeUnitMb:LYRA_DEFAULT_fileSizeUnitMb,fileSizeUnitTb:LYRA_DEFAULT_fileSizeUnitTb,loading:LYRA_DEFAULT_loading,loadingDocument:LYRA_DEFAULT_loadingDocument,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select}}static{this.styles=[LyraElement.styles,styles,srOnly,viewerLoadingStyles]}async search(query){if(this.foldQuotes&&this.fetchState.kind==="loaded"&&query.trim()){const normalizedQuery=query.toLocaleLowerCase(this.effectiveLocale),{bodyHtml,bodyText}=this.fetchState.email;if(bodyHtml!==null){const doc=parseHtmlDocument(bodyHtml,this.ownerDocument),next=new Set(this.expandedHtmlQuoteIndices);doc?.body.querySelectorAll(QUOTE_SELECTOR).forEach((block,index)=>{(block.textContent??"").toLocaleLowerCase(this.effectiveLocale).includes(normalizedQuery)&&next.add(index)});const expanded=[...next];(expanded.length!==this.expandedHtmlQuoteIndices.length||expanded.some((value,index)=>value!==this.expandedHtmlQuoteIndices[index]))&&(this.expandedHtmlQuoteIndices=expanded,await this.updateComplete)}else if(bodyText!==null){const split=splitTrailingQuoteBlock(bodyText);split&&split.quoted.toLocaleLowerCase(this.effectiveLocale).includes(normalizedQuery)&&!this.textQuoteExpanded&&(this.textQuoteExpanded=!0,await this.updateComplete)}}return super.search(query)}async searchNext(){return super.searchNext()}async searchPrevious(){return super.searchPrevious()}clearSearch(){super.clearSearch()}textContentRoot(){return this.renderRoot.querySelector("[data-email-text-content]")}connectedCallback(){super.connectedCallback(),this.announcements.connect(),this.hasUpdated&&this.src.trim()&&this.src===this.lastLoadSrc&&this.scheduleAfterUpdate(()=>{this.load()})}disconnectedCallback(){this.generation++,this.textQuoteExpanded=!1,this.expandedHtmlQuoteIndices=[],this.foldedHtmlCache=null,this.announcements.disconnect(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}willUpdate(changed){super.willUpdate(changed),(changed.has("src")||changed.has("foldQuotes"))&&(this.textQuoteExpanded=!1,this.expandedHtmlQuoteIndices=[])}updated(changed){super.updated(changed),this.announcements.transition("load",this.fetchState.kind,this.fetchState.kind==="error"?this.fetchState.message:this.localize("loadingDocument")),changed.has("src")&&this.scheduleAfterUpdate(()=>{this.load()})}async load(){const generation=++this.generation,signal=this.beginAbortableLoad();if(this.lastLoadSrc=this.src,!this.src){this.fetchState={kind:"idle"};return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){this.failWithLocalizedMessage(this.localize("documentPreviewUrlNotAllowed"));return}this.fetchState={kind:"loading"};try{const response=await fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0);if(!this.
|
|
3
|
+
`)}}const QUOTE_SELECTOR='blockquote[type="cite" i], div.gmail_quote, div.yahoo_quoted, div[id^="divRplyFwdMsg"]';function parseHtmlDocument(html2,ownerDocument){const DOMParserCtor=ownerDocument.defaultView?.DOMParser;return DOMParserCtor?new DOMParserCtor().parseFromString(html2,"text/html"):null}function foldHtmlQuotes(html2,localize,expandedIndices,ownerDocument){const doc=parseHtmlDocument(html2,ownerDocument);return doc?(doc.body.querySelectorAll(QUOTE_SELECTOR).forEach((block,index)=>{const expanded=expandedIndices.includes(index);block.setAttribute("part","quoted"),expanded||block.setAttribute("hidden",""),block.setAttribute("data-quote-index",String(index));const button=doc.createElement("button");button.type="button",button.setAttribute("part","quote-toggle"),button.setAttribute("aria-expanded",String(expanded)),button.setAttribute("data-quote-toggle",String(index)),button.textContent=localize(expanded?"emailViewerHideQuoted":"emailViewerShowQuoted"),block.before(button)}),doc.body.innerHTML):html2}function isQuoteToggleElement(target){const candidate=target;return candidate.nodeType===1&&typeof candidate.hasAttribute=="function"&&candidate.hasAttribute("data-quote-toggle")}class LyraEmailViewer extends TextViewerTarget(LyraEmailViewerBase){constructor(){super(...arguments),this.src="",this.name="",this.maxHeight="",this.foldQuotes=!1,this.fetchState={kind:"idle"},this.textQuoteExpanded=!1,this.expandedHtmlQuoteIndices=[],this.generation=0,this.lastLoadSrc="",this.announcements=new ViewerAnnouncementController(this),this.foldedHtmlCache=null,this.onBodyClick=e=>{const target=e.composedPath().find(isQuoteToggleElement);if(!target)return;const index=target.getAttribute("data-quote-toggle"),block=this.renderRoot.querySelector(`[data-quote-index="${index}"]`),numericIndex=Number(index);if(!block||!Number.isInteger(numericIndex)||numericIndex<0)return;const restoreFocus=activeElementIn(this.shadowRoot)===target;this.expandedHtmlQuoteIndices=this.expandedHtmlQuoteIndices.includes(numericIndex)?this.expandedHtmlQuoteIndices.filter(value=>value!==numericIndex):[...this.expandedHtmlQuoteIndices,numericIndex],restoreFocus&&this.scheduleAfterUpdate(()=>{this.renderRoot.querySelector(`[data-quote-toggle="${numericIndex}"]`)?.focus()})}}static{this.defaultStrings={...super.defaultStrings,anchorJumped:LYRA_DEFAULT_anchorJumped,anchorJumpedToPage:LYRA_DEFAULT_anchorJumpedToPage,anchorNotFound:LYRA_DEFAULT_anchorNotFound,collapse:LYRA_DEFAULT_collapse,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,documentPreviewEmpty:LYRA_DEFAULT_documentPreviewEmpty,documentPreviewFailedToLoad:LYRA_DEFAULT_documentPreviewFailedToLoad,documentPreviewResourceTooLarge:LYRA_DEFAULT_documentPreviewResourceTooLarge,documentPreviewTypeEmail:LYRA_DEFAULT_documentPreviewTypeEmail,documentPreviewUrlNotAllowed:LYRA_DEFAULT_documentPreviewUrlNotAllowed,documentViewerMissingSanitizer:LYRA_DEFAULT_documentViewerMissingSanitizer,download:LYRA_DEFAULT_download,emailViewerAttachments:LYRA_DEFAULT_emailViewerAttachments,emailViewerDate:LYRA_DEFAULT_emailViewerDate,emailViewerFrom:LYRA_DEFAULT_emailViewerFrom,emailViewerGroupAddress:LYRA_DEFAULT_emailViewerGroupAddress,emailViewerHideQuoted:LYRA_DEFAULT_emailViewerHideQuoted,emailViewerLabel:LYRA_DEFAULT_emailViewerLabel,emailViewerMissingParser:LYRA_DEFAULT_emailViewerMissingParser,emailViewerNoSubject:LYRA_DEFAULT_emailViewerNoSubject,emailViewerOpenAttachment:LYRA_DEFAULT_emailViewerOpenAttachment,emailViewerShowQuoted:LYRA_DEFAULT_emailViewerShowQuoted,emailViewerSubject:LYRA_DEFAULT_emailViewerSubject,emailViewerTo:LYRA_DEFAULT_emailViewerTo,emailViewerUnnamedAttachment:LYRA_DEFAULT_emailViewerUnnamedAttachment,fileSizeUnitB:LYRA_DEFAULT_fileSizeUnitB,fileSizeUnitGb:LYRA_DEFAULT_fileSizeUnitGb,fileSizeUnitKb:LYRA_DEFAULT_fileSizeUnitKb,fileSizeUnitMb:LYRA_DEFAULT_fileSizeUnitMb,fileSizeUnitTb:LYRA_DEFAULT_fileSizeUnitTb,loading:LYRA_DEFAULT_loading,loadingDocument:LYRA_DEFAULT_loadingDocument,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,popover:LYRA_DEFAULT_popover,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select}}static{this.styles=[LyraElement.styles,styles,srOnly,viewerLoadingStyles]}async search(query){if(this.foldQuotes&&this.fetchState.kind==="loaded"&&query.trim()){const normalizedQuery=query.toLocaleLowerCase(this.effectiveLocale),{bodyHtml,bodyText}=this.fetchState.email;if(bodyHtml!==null){const doc=parseHtmlDocument(bodyHtml,this.ownerDocument),next=new Set(this.expandedHtmlQuoteIndices);doc?.body.querySelectorAll(QUOTE_SELECTOR).forEach((block,index)=>{(block.textContent??"").toLocaleLowerCase(this.effectiveLocale).includes(normalizedQuery)&&next.add(index)});const expanded=[...next];(expanded.length!==this.expandedHtmlQuoteIndices.length||expanded.some((value,index)=>value!==this.expandedHtmlQuoteIndices[index]))&&(this.expandedHtmlQuoteIndices=expanded,await this.updateComplete)}else if(bodyText!==null){const split=splitTrailingQuoteBlock(bodyText);split&&split.quoted.toLocaleLowerCase(this.effectiveLocale).includes(normalizedQuery)&&!this.textQuoteExpanded&&(this.textQuoteExpanded=!0,await this.updateComplete)}}return super.search(query)}async searchNext(){return super.searchNext()}async searchPrevious(){return super.searchPrevious()}clearSearch(){super.clearSearch()}textContentRoot(){return this.renderRoot.querySelector("[data-email-text-content]")}connectedCallback(){super.connectedCallback(),this.announcements.connect(),this.hasUpdated&&this.src.trim()&&this.src===this.lastLoadSrc&&this.scheduleAfterUpdate(()=>{this.load()})}disconnectedCallback(){this.generation++,this.textQuoteExpanded=!1,this.expandedHtmlQuoteIndices=[],this.foldedHtmlCache=null,this.announcements.disconnect(),super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.announcements.adopted()}willUpdate(changed){super.willUpdate(changed),(changed.has("src")||changed.has("foldQuotes"))&&(this.textQuoteExpanded=!1,this.expandedHtmlQuoteIndices=[])}updated(changed){super.updated(changed),this.announcements.transition("load",this.fetchState.kind,this.fetchState.kind==="error"?this.fetchState.message:this.localize("loadingDocument")),changed.has("src")&&this.scheduleAfterUpdate(()=>{this.load()})}async load(){const generation=++this.generation,signal=this.beginAbortableLoad();if(this.lastLoadSrc=this.src,!this.src){this.fetchState={kind:"idle"};return}const fetchTarget=resolveOwnerFetchTarget(this,this.src);if(!fetchTarget){this.failWithLocalizedMessage(this.localize("documentPreviewUrlNotAllowed"));return}this.fetchState={kind:"loading"};try{const response=await fetchTarget.view.fetch(fetchTarget.url,signal?{signal}:void 0);if(!this.isCurrentLoad(generation,fetchTarget.view))return;if(!response.ok)throw new Error(`${response.status} ${response.statusText}`);const buffer=await readResponseArrayBuffer(response);if(!this.isCurrentLoad(generation,fetchTarget.view))return;const result=await this.parse(buffer,generation,fetchTarget.view);result&&this.isCurrentLoad(generation,fetchTarget.view)&&(this.fetchState={kind:"loaded",...result})}catch(error){if(isAbortError(error)||!this.isCurrentLoad(generation,fetchTarget.view))return;this.fetchState={kind:"error",message:error instanceof LyraUserFacingError?error.message:this.localize(isResourceLimitError(error)?"documentPreviewResourceTooLarge":"documentPreviewFailedToLoad")},this.emit("lr-render-error",{error})}}failWithLocalizedMessage(message){const error=new LyraUserFacingError(message);this.fetchState={kind:"error",message},this.emit("lr-render-error",{error})}isCurrentLoad(generation,ownerView){return this.isConnected&&generation===this.generation&&this.ownerDocument.defaultView===ownerView}async parse(buffer,generation,ownerView){const{PostalMime,DOMPurify}=await loadEmailDeps();if(!this.isCurrentLoad(generation,ownerView))return null;if(!PostalMime)throw new LyraUserFacingError(this.localize("emailViewerMissingParser"));const rawParsed=await PostalMime.parse(buffer);if(!this.isCurrentLoad(generation,ownerView))return null;const parsed=normalizeParsedEmail(rawParsed);if(!parsed)throw new LyraUserFacingError(this.localize("documentPreviewFailedToLoad"));const bodyHtml=parsed.html!==void 0&&DOMPurify?sanitizePassiveMarkup(DOMPurify,parsed.html,this.ownerDocument,"passive-document"):null;if(!this.isCurrentLoad(generation,ownerView))return null;if(parsed.html&&!DOMPurify&&!parsed.text)throw new LyraUserFacingError(this.localize("documentViewerMissingSanitizer"));return{...parsed.from===void 0?{}:{fromAddress:parsed.from},toAddresses:parsed.to,email:{from:this.formatAddress(parsed.from),to:this.formatAddresses(parsed.to),subject:parsed.subject??"",date:parsed.date??"",bodyHtml,bodyText:bodyHtml?null:parsed.text??null,attachments:[...parsed.attachments]}}}formatAddress(value){if(!value)return"";if(value.group){const members=getListFormat(this.effectiveLocale,{style:"long",type:"conjunction"}).format(value.group.map(entry=>this.formatAddress(entry)).filter(Boolean));return value.name?this.localize("emailViewerGroupAddress",void 0,{name:value.name,members}):members}return value.name&&value.address?getListFormat(this.effectiveLocale,{style:"long",type:"unit"}).format([value.name,value.address]):value.address??value.name??""}formatAddresses(values){return getListFormat(this.effectiveLocale,{style:"long",type:"conjunction"}).format((values??[]).map(value=>this.formatAddress(value)).filter(Boolean))}formatDate(value){if(!value)return"";const date=new Date(value);return Number.isNaN(date.getTime())?value:getDateTimeFormat(this.effectiveLocale,{dateStyle:"medium",timeStyle:"short"}).format(date)}renderHeaders(email,fromAddress,toAddresses){return html`<div part="headers">
|
|
4
4
|
<span part="from-label">${this.localize("emailViewerFrom")}</span><span part="from">${fromAddress?this.formatAddress(fromAddress):email.from}</span>
|
|
5
5
|
<span part="to-label">${this.localize("emailViewerTo")}</span><span part="to">${toAddresses?this.formatAddresses(toAddresses):email.to}</span>
|
|
6
6
|
<span part="subject-label">${this.localize("emailViewerSubject")}</span><span part="subject">${email.subject||this.localize("emailViewerNoSubject")}</span>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";let sanitizer;async function loadHtmlSanitizerDeps(importDompurify=()=>import("dompurify")){try{const module=await importDompurify();return resolveOptionalPeerCapability(module,isHtmlSanitizer)}catch(error){return console.warn("<lr-html-viewer> needs the optional peer dependency `dompurify` to sanitize rendered HTML markup
|
|
1
|
+
import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";let sanitizer;async function loadHtmlSanitizerDeps(importDompurify=()=>import("dompurify")){try{const module=await importDompurify();return resolveOptionalPeerCapability(module,isHtmlSanitizer)}catch(error){return console.warn("<lr-html-viewer> needs the optional peer dependency `dompurify` to sanitize rendered HTML markup — install it with `pnpm add dompurify`:",error),null}}function loadHtmlSanitizer(){return sanitizer||(sanitizer=loadHtmlSanitizerDeps()),sanitizer}function clearHtmlSanitizerCache(){sanitizer=void 0}function __setHtmlSanitizerForTesting(value){sanitizer=value===void 0?void 0:Promise.resolve(value)}export{__setHtmlSanitizerForTesting,clearHtmlSanitizerCache,loadHtmlSanitizer,loadHtmlSanitizerDeps};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";let sanitizer;async function loadNotebookSanitizerDeps(importDompurify=()=>import("dompurify")){try{const module=await importDompurify();return resolveOptionalPeerCapability(module,isHtmlSanitizer)}catch
|
|
1
|
+
import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";const NOTEBOOK_SANITIZER_WARNING_KEY="lyra-notebook-viewer-sanitizer-unavailable",NOTEBOOK_SANITIZER_WARNING="<lr-notebook-viewer> could not load its optional dompurify peer.";let sanitizer;async function loadNotebookSanitizerDeps(importDompurify=()=>import("dompurify")){try{const module=await importDompurify();return resolveOptionalPeerCapability(module,isHtmlSanitizer)}catch{return devWarnOnce(NOTEBOOK_SANITIZER_WARNING_KEY,NOTEBOOK_SANITIZER_WARNING),null}}function loadNotebookSanitizer(){return sanitizer||(sanitizer=loadNotebookSanitizerDeps()),sanitizer}function clearNotebookSanitizerCache(){sanitizer=void 0}function __setNotebookSanitizerForTesting(value){sanitizer=value===void 0?void 0:Promise.resolve(value)}export{__setNotebookSanitizerForTesting,clearNotebookSanitizerCache,loadNotebookSanitizer,loadNotebookSanitizerDeps};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{unwrapOptionalPeerDefault}from"../../../internal/optional-peer-capabilities.js";function isPdfJsApi(value){return(typeof value=="object"||typeof value=="function")&&value!==null&&"getDocument"in value&&typeof value.getDocument=="function"&&"GlobalWorkerOptions"in value&&(typeof value.GlobalWorkerOptions=="object"||typeof value.GlobalWorkerOptions=="function")&&value.GlobalWorkerOptions!==null}let pdfjs;const PDF_WORKER_MODULE_SPECIFIER="pdfjs-dist/build/pdf.worker.min.mjs",ALLOWED_WORKER_PROTOCOLS=["http:","https:","blob:","file:"];function defaultWorkerModuleResolver(specifier){const resolver=import.meta.resolve;if(!resolver)return null;try{return resolver(specifier)}catch{return null}}function safeWorkerModuleUrl(value){if(!value)return null;try{const url=new URL(value);return ALLOWED_WORKER_PROTOCOLS.includes(url.protocol)?url.href:null}catch{return null}}function safeAuthoredWorkerUrl(value){if(!value)return null;try{const url=new URL(value,typeof document>"u"?void 0:document.baseURI);return ALLOWED_WORKER_PROTOCOLS.includes(url.protocol)?url.href:null}catch{return null}}function configurePdfJsWorker(pdfjsLib,authoredWorkerSrc,resolveWorkerModule){if(pdfjsLib.GlobalWorkerOptions.workerSrc)return;const workerSrc=safeAuthoredWorkerUrl(authoredWorkerSrc)??safeWorkerModuleUrl(resolveWorkerModule(PDF_WORKER_MODULE_SPECIFIER));workerSrc&&(pdfjsLib.GlobalWorkerOptions.workerSrc=workerSrc)}async function loadPdfJsDeps(importPdfjs=()=>import("pdfjs-dist"),resolveWorkerModule=defaultWorkerModuleResolver,workerSrc){try{const module=await importPdfjs(),direct=isPdfJsApi(module)?module:void 0,defaultExport=unwrapOptionalPeerDefault(module),pdfjsLib=direct??(isPdfJsApi(defaultExport)?defaultExport:null);return pdfjsLib?(configurePdfJsWorker(pdfjsLib,workerSrc,resolveWorkerModule),pdfjsLib):null}catch
|
|
1
|
+
import{unwrapOptionalPeerDefault}from"../../../internal/optional-peer-capabilities.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";const PDF_JS_WARNING_KEY="lyra-pdf-viewer-pdfjs-unavailable",PDF_JS_WARNING="<lr-pdf-viewer> could not load its optional pdfjs-dist peer.";function isPdfJsApi(value){return(typeof value=="object"||typeof value=="function")&&value!==null&&"getDocument"in value&&typeof value.getDocument=="function"&&"GlobalWorkerOptions"in value&&(typeof value.GlobalWorkerOptions=="object"||typeof value.GlobalWorkerOptions=="function")&&value.GlobalWorkerOptions!==null}let pdfjs;const PDF_WORKER_MODULE_SPECIFIER="pdfjs-dist/build/pdf.worker.min.mjs",ALLOWED_WORKER_PROTOCOLS=["http:","https:","blob:","file:"];function defaultWorkerModuleResolver(specifier){const resolver=import.meta.resolve;if(!resolver)return null;try{return resolver(specifier)}catch{return null}}function safeWorkerModuleUrl(value){if(!value)return null;try{const url=new URL(value);return ALLOWED_WORKER_PROTOCOLS.includes(url.protocol)?url.href:null}catch{return null}}function safeAuthoredWorkerUrl(value){if(!value)return null;try{const url=new URL(value,typeof document>"u"?void 0:document.baseURI);return ALLOWED_WORKER_PROTOCOLS.includes(url.protocol)?url.href:null}catch{return null}}function configurePdfJsWorker(pdfjsLib,authoredWorkerSrc,resolveWorkerModule){if(pdfjsLib.GlobalWorkerOptions.workerSrc)return;const workerSrc=safeAuthoredWorkerUrl(authoredWorkerSrc)??safeWorkerModuleUrl(resolveWorkerModule(PDF_WORKER_MODULE_SPECIFIER));workerSrc&&(pdfjsLib.GlobalWorkerOptions.workerSrc=workerSrc)}async function loadPdfJsDeps(importPdfjs=()=>import("pdfjs-dist"),resolveWorkerModule=defaultWorkerModuleResolver,workerSrc){try{const module=await importPdfjs(),direct=isPdfJsApi(module)?module:void 0,defaultExport=unwrapOptionalPeerDefault(module),pdfjsLib=direct??(isPdfJsApi(defaultExport)?defaultExport:null);return pdfjsLib?(configurePdfJsWorker(pdfjsLib,workerSrc,resolveWorkerModule),pdfjsLib):null}catch{return devWarnOnce(PDF_JS_WARNING_KEY,PDF_JS_WARNING),null}}function loadPdfJs(workerSrc){return pdfjs?pdfjs.then(pdfjsLib=>(pdfjsLib&&configurePdfJsWorker(pdfjsLib,workerSrc,defaultWorkerModuleResolver),pdfjsLib)):(pdfjs=loadPdfJsDeps(void 0,void 0,workerSrc),pdfjs)}function clearPdfJsCache(){pdfjs=void 0}export{clearPdfJsCache,loadPdfJs,loadPdfJsDeps};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";const MAX_SAFE_PPTX_ZIP_LIMITS={maxEntries:4e3,maxEntryUncompressedBytes:32*1024*1024,maxTotalUncompressedBytes:256*1024*1024,maxMediaBytes:192*1024*1024,maxConcurrency:8};let modulePromise;function hasPptxOpenCapability(value){if(typeof value!="object"&&typeof value!="function"||value===null)return!1;const viewer=value.PptxViewer;if(typeof viewer!="object"&&typeof viewer!="function"||viewer===null||typeof viewer.open!="function")return!1;const limits=value.RECOMMENDED_ZIP_LIMITS;return typeof limits!="object"||limits===null?!1:Object.keys(MAX_SAFE_PPTX_ZIP_LIMITS).every(key=>{const candidate=limits[key];return Number.isSafeInteger(candidate)&&candidate>0&&candidate<=MAX_SAFE_PPTX_ZIP_LIMITS[key]})}function adaptPptxViewer(value){if(typeof value!="object"&&typeof value!="function"||value===null)return null;const candidate=value;if(!Number.isSafeInteger(candidate.slideCount)||candidate.slideCount<0||!Number.isSafeInteger(candidate.currentSlideIndex)||typeof candidate.goToSlide!="function"||typeof candidate.searchText!="function"||typeof candidate.highlightSearchResult!="function"||typeof candidate.renderThumbnailToContainer!="function"||typeof candidate.clearSearchHighlights!="function"||typeof candidate.destroy!="function"||typeof candidate.addEventListener!="function"||typeof candidate.removeEventListener!="function")return null;const viewer=candidate,listeners=new Set;let destroyed=!1;const emit=event=>{for(const listener of listeners)listener(event)},onSlideChange=event=>{const index=event.detail?.index;typeof index=="number"&&Number.isSafeInteger(index)&&index>=0&&index<viewer.slideCount&&emit(Object.freeze({kind:"slide-change",index}))},onSlideError=event=>{const detail=event.detail,page=typeof detail?.index=="number"&&Number.isSafeInteger(detail.index)&&detail.index>=0&&detail.index<viewer.slideCount?detail.index+1:void 0,normalized={kind:"diagnostic",code:"pptx-slide-render-error",cause:detail?.error,fatal:detail?.fatal===!0,...page===void 0?{}:{page}};emit(Object.freeze(normalized))},onNodeError=event=>{const detail=event.detail,nodeId=typeof detail?.nodeId=="string"&&detail.nodeId.length<=1024?detail.nodeId:void 0,normalized={kind:"diagnostic",code:"pptx-node-render-error",cause:detail?.error,fatal:detail?.fatal===!0,...nodeId===void 0?{}:{nodeId}};emit(Object.freeze(normalized))};return viewer.addEventListener("slidechange",onSlideChange),viewer.addEventListener("slideerror",onSlideError),viewer.addEventListener("nodeerror",onNodeError),Object.freeze({get slideCount(){return viewer.slideCount},get currentSlideIndex(){return viewer.currentSlideIndex},goToSlide:async index=>{await viewer.goToSlide(index)},searchText:(query,options)=>viewer.searchText(query,options),highlightSearchResult:async(result,options)=>viewer.highlightSearchResult(result,options),renderThumbnailToContainer(index,container,options){if(!Number.isSafeInteger(index)||index<0||index>=viewer.slideCount)return null;const width=options?.width;if(width!==void 0&&(!Number.isFinite(width)||width<=0))return null;const raw=viewer.renderThumbnailToContainer(index,container,options);if(!raw||typeof raw.dispose!="function"||typeof raw.ready?.then!="function")return null;let disposed=!1;return Object.freeze({ready:Promise.resolve(raw.ready),dispose(){disposed||(disposed=!0,raw.dispose())}})},clearSearchHighlights:()=>viewer.clearSearchHighlights(),subscribe(listener){return destroyed?()=>{}:(listeners.add(listener),()=>listeners.delete(listener))},destroy(){destroyed||(destroyed=!0,viewer.removeEventListener("slidechange",onSlideChange),viewer.removeEventListener("slideerror",onSlideError),viewer.removeEventListener("nodeerror",onNodeError),listeners.clear(),viewer.destroy())}})}async function loadPptxRenderer(importer=()=>import("@aiden0z/pptx-renderer")){try{const module=await importer();return resolveOptionalPeerCapability(module,hasPptxOpenCapability)}catch
|
|
1
|
+
import{resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";const PPTX_RENDERER_WARNING_KEY="lyra-pptx-viewer-renderer-unavailable",PPTX_RENDERER_WARNING="<lr-pptx-viewer> could not load its optional @aiden0z/pptx-renderer peer.",MAX_SAFE_PPTX_ZIP_LIMITS={maxEntries:4e3,maxEntryUncompressedBytes:32*1024*1024,maxTotalUncompressedBytes:256*1024*1024,maxMediaBytes:192*1024*1024,maxConcurrency:8};let modulePromise;function hasPptxOpenCapability(value){if(typeof value!="object"&&typeof value!="function"||value===null)return!1;const viewer=value.PptxViewer;if(typeof viewer!="object"&&typeof viewer!="function"||viewer===null||typeof viewer.open!="function")return!1;const limits=value.RECOMMENDED_ZIP_LIMITS;return typeof limits!="object"||limits===null?!1:Object.keys(MAX_SAFE_PPTX_ZIP_LIMITS).every(key=>{const candidate=limits[key];return Number.isSafeInteger(candidate)&&candidate>0&&candidate<=MAX_SAFE_PPTX_ZIP_LIMITS[key]})}function adaptPptxViewer(value){if(typeof value!="object"&&typeof value!="function"||value===null)return null;const candidate=value;if(!Number.isSafeInteger(candidate.slideCount)||candidate.slideCount<0||!Number.isSafeInteger(candidate.currentSlideIndex)||typeof candidate.goToSlide!="function"||typeof candidate.searchText!="function"||typeof candidate.highlightSearchResult!="function"||typeof candidate.renderThumbnailToContainer!="function"||typeof candidate.clearSearchHighlights!="function"||typeof candidate.destroy!="function"||typeof candidate.addEventListener!="function"||typeof candidate.removeEventListener!="function")return null;const viewer=candidate,listeners=new Set;let destroyed=!1;const emit=event=>{for(const listener of listeners)listener(event)},onSlideChange=event=>{const index=event.detail?.index;typeof index=="number"&&Number.isSafeInteger(index)&&index>=0&&index<viewer.slideCount&&emit(Object.freeze({kind:"slide-change",index}))},onSlideError=event=>{const detail=event.detail,page=typeof detail?.index=="number"&&Number.isSafeInteger(detail.index)&&detail.index>=0&&detail.index<viewer.slideCount?detail.index+1:void 0,normalized={kind:"diagnostic",code:"pptx-slide-render-error",cause:detail?.error,fatal:detail?.fatal===!0,...page===void 0?{}:{page}};emit(Object.freeze(normalized))},onNodeError=event=>{const detail=event.detail,nodeId=typeof detail?.nodeId=="string"&&detail.nodeId.length<=1024?detail.nodeId:void 0,normalized={kind:"diagnostic",code:"pptx-node-render-error",cause:detail?.error,fatal:detail?.fatal===!0,...nodeId===void 0?{}:{nodeId}};emit(Object.freeze(normalized))};return viewer.addEventListener("slidechange",onSlideChange),viewer.addEventListener("slideerror",onSlideError),viewer.addEventListener("nodeerror",onNodeError),Object.freeze({get slideCount(){return viewer.slideCount},get currentSlideIndex(){return viewer.currentSlideIndex},goToSlide:async index=>{await viewer.goToSlide(index)},searchText:(query,options)=>viewer.searchText(query,options),highlightSearchResult:async(result,options)=>viewer.highlightSearchResult(result,options),renderThumbnailToContainer(index,container,options){if(!Number.isSafeInteger(index)||index<0||index>=viewer.slideCount)return null;const width=options?.width;if(width!==void 0&&(!Number.isFinite(width)||width<=0))return null;const raw=viewer.renderThumbnailToContainer(index,container,options);if(!raw||typeof raw.dispose!="function"||typeof raw.ready?.then!="function")return null;let disposed=!1;return Object.freeze({ready:Promise.resolve(raw.ready),dispose(){disposed||(disposed=!0,raw.dispose())}})},clearSearchHighlights:()=>viewer.clearSearchHighlights(),subscribe(listener){return destroyed?()=>{}:(listeners.add(listener),()=>listeners.delete(listener))},destroy(){destroyed||(destroyed=!0,viewer.removeEventListener("slidechange",onSlideChange),viewer.removeEventListener("slideerror",onSlideError),viewer.removeEventListener("nodeerror",onNodeError),listeners.clear(),viewer.destroy())}})}async function loadPptxRenderer(importer=()=>import("@aiden0z/pptx-renderer")){try{const module=await importer();return resolveOptionalPeerCapability(module,hasPptxOpenCapability)}catch{return devWarnOnce(PPTX_RENDERER_WARNING_KEY,PPTX_RENDERER_WARNING),null}}function getPptxRenderer(){return modulePromise||(modulePromise=loadPptxRenderer()),modulePromise}function __setPptxRendererForTesting(module){modulePromise=module===void 0?void 0:Promise.resolve(module)}export{__setPptxRendererForTesting,adaptPptxViewer,getPptxRenderer,loadPptxRenderer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{unwrapOptionalPeerDefault}from"../../../internal/optional-peer-capabilities.js";let cached;function isSheetJsApi(candidate){const api=candidate;return!!(api&&typeof api.read=="function"&&typeof api.utils?.sheet_to_json=="function")}async function loadSheetJs(importXlsx=()=>import("xlsx")){try{const module=await importXlsx();if(isSheetJsApi(module))return module;const candidate=unwrapOptionalPeerDefault(module);return isSheetJsApi(candidate)?candidate:null}catch
|
|
1
|
+
import{unwrapOptionalPeerDefault}from"../../../internal/optional-peer-capabilities.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";const SPREADSHEET_WARNING_KEY="lyra-spreadsheet-viewer-xlsx-unavailable",SPREADSHEET_WARNING="<lr-spreadsheet-viewer> could not load its optional xlsx peer.";let cached;function isSheetJsApi(candidate){const api=candidate;return!!(api&&typeof api.read=="function"&&typeof api.utils?.sheet_to_json=="function")}async function loadSheetJs(importXlsx=()=>import("xlsx")){try{const module=await importXlsx();if(isSheetJsApi(module))return module;const candidate=unwrapOptionalPeerDefault(module);return isSheetJsApi(candidate)?candidate:null}catch{return devWarnOnce(SPREADSHEET_WARNING_KEY,SPREADSHEET_WARNING),null}}function loadSheetJsCached(){return cached||(cached=loadSheetJs()),cached}function clearSheetJsCache(){cached=void 0}export{clearSheetJsCache,loadSheetJs,loadSheetJsCached};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";let sanitizer;async function loadSvgSanitizerDeps(importDompurify=()=>import("dompurify")){try{const module=await importDompurify();return resolveOptionalPeerCapability(module,isHtmlSanitizer)}catch
|
|
1
|
+
import{isHtmlSanitizer,resolveOptionalPeerCapability}from"../../../internal/optional-peer-capabilities.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";const SVG_SANITIZER_WARNING_KEY="lyra-svg-viewer-sanitizer-unavailable",SVG_SANITIZER_WARNING="<lr-svg-viewer> could not load its optional dompurify peer.";let sanitizer;async function loadSvgSanitizerDeps(importDompurify=()=>import("dompurify")){try{const module=await importDompurify();return resolveOptionalPeerCapability(module,isHtmlSanitizer)}catch{return devWarnOnce(SVG_SANITIZER_WARNING_KEY,SVG_SANITIZER_WARNING),null}}function loadSvgSanitizer(){return sanitizer||(sanitizer=loadSvgSanitizerDeps()),sanitizer}function clearSvgSanitizerCache(){sanitizer=void 0}export{clearSvgSanitizerCache,loadSvgSanitizer,loadSvgSanitizerDeps};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{css,html}from"lit";const viewerLoadingStyles=css`.viewer-loading{box-sizing:border-box;justify-content:center;align-items:center;gap:var(--lr-space-s);min-block-size:var(--lr-size-6rem);padding:var(--lr-space-l);color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-sm);text-align:center;flex-direction:column;display:flex}.viewer-loading-indicator{box-sizing:border-box;inline-size:var(--lr-size-2rem);block-size:var(--lr-size-2rem);border:var(--lr-border-width-thick) solid var(--lr-color-border);border-block-start-color:var(--lr-color-brand);animation:lr-viewer-loading-spin var(--lr-duration-
|
|
1
|
+
import{css,html}from"lit";const viewerLoadingStyles=css`.viewer-loading{box-sizing:border-box;justify-content:center;align-items:center;gap:var(--lr-space-s);min-block-size:var(--lr-size-6rem);padding:var(--lr-space-l);color:var(--lr-color-text-quiet);font-size:var(--lr-font-size-sm);text-align:center;flex-direction:column;display:flex}.viewer-loading-indicator{box-sizing:border-box;inline-size:var(--lr-size-2rem);block-size:var(--lr-size-2rem);border:var(--lr-border-width-thick) solid var(--lr-color-border);border-block-start-color:var(--lr-color-brand);animation:lr-viewer-loading-spin var(--lr-duration-ambient) var(--lr-easing-linear) infinite;border-radius:50%;display:block}@keyframes lr-viewer-loading-spin{to{transform:rotate(1turn)}}@media (prefers-reduced-motion:reduce){.viewer-loading-indicator{animation:none!important}}`;function renderViewerLoading(label){return html`<div part="spinner" class="viewer-loading">
|
|
2
2
|
<span class="viewer-loading-indicator" aria-hidden="true"></span>
|
|
3
3
|
<span class="viewer-loading-label">${label}</span>
|
|
4
4
|
</div>`}export{renderViewerLoading,viewerLoadingStyles};
|
|
@@ -4,5 +4,7 @@ export declare const VIEWER_SEARCH_QUERY_LIMIT:number;export declare const VIEWE
|
|
|
4
4
|
export declare class ViewerSearchWorkBudget{private remaining;complete:boolean;constructor(maxWork?:number);includes(value:string,needle:string,locale:string):boolean;
|
|
5
5
|
/** Charges a validation-only field without copying or locale-folding its contents. */
|
|
6
6
|
consume(value:string):boolean;
|
|
7
|
+
/** Reports whether a complete field can be admitted without mutating the remaining budget. */
|
|
8
|
+
canConsume(value:string):boolean;
|
|
7
9
|
/** Searches logical concatenation without first joining an attacker-sized string collection. */
|
|
8
10
|
includesJoined(values:Iterable<string>,needle:string,locale:string):boolean;get exhausted():boolean;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{TEXT_QUOTE_LIMITS}from"../../internal/text-quote.js";import{resolveIntlLocale}from"../../internal/intl-cache.js";const VIEWER_SEARCH_QUERY_LIMIT=TEXT_QUOTE_LIMITS.maxQueryCodeUnits,VIEWER_SEARCH_WORK_LIMIT=TEXT_QUOTE_LIMITS.maxSearchWorkCodeUnits;function boundedViewerSearchQuery(query,locale){if(query.length>VIEWER_SEARCH_QUERY_LIMIT)return{needle:"",accepted:!1};const needle=query.trim().toLocaleLowerCase(resolveIntlLocale(locale));return needle.length<=VIEWER_SEARCH_QUERY_LIMIT?{needle,accepted:!0}:{needle:"",accepted:!1}}class ViewerSearchWorkBudget{constructor(maxWork=VIEWER_SEARCH_WORK_LIMIT){this.complete=!0,this.remaining=Number.isFinite(maxWork)?Math.min(VIEWER_SEARCH_WORK_LIMIT,Math.max(0,Math.floor(maxWork))):VIEWER_SEARCH_WORK_LIMIT}includes(value,needle,locale){return this.includesJoined([value],needle,locale)}consume(value){if(this.remaining<=0)return this.complete=!1,!1;const cost=Math.max(1,value.length);return cost>this.remaining?(this.remaining=0,this.complete=!1,!1):(this.remaining-=cost,!0)}includesJoined(values,needle,locale){const chunks=[],availableWork=this.remaining;let retainedCodeUnits=0,asciiOnly=!0,inspectedAny=!1;for(const value of values){if(inspectedAny=!0,this.remaining<=0){this.complete=!1;break}if(value.length===0){this.remaining--;continue}const retainedLength=Math.min(value.length,this.remaining),chunk=value.slice(0,retainedLength);if(chunks.push(chunk),retainedCodeUnits+=retainedLength,asciiOnly&&/[^\x00-\x7f]/u.test(chunk)&&(asciiOnly=!1),this.remaining-=retainedLength,retainedLength!==value.length){this.complete=!1;break}}inspectedAny||(this.remaining<=0?this.complete=!1:this.remaining--);const maximumFoldedCodeUnits=asciiOnly?retainedCodeUnits:retainedCodeUnits*4;if(retainedCodeUnits+maximumFoldedCodeUnits>availableWork)return this.remaining=0,this.complete=!1,!1;const folded=chunks.join("").toLocaleLowerCase(resolveIntlLocale(locale));return folded.length>this.remaining?(this.remaining=0,this.complete=!1,!1):(this.remaining-=folded.length,folded.includes(needle))}get exhausted(){return this.remaining<=0}}export{VIEWER_SEARCH_QUERY_LIMIT,VIEWER_SEARCH_WORK_LIMIT,ViewerSearchWorkBudget,boundedViewerSearchQuery};
|
|
1
|
+
import{TEXT_QUOTE_LIMITS}from"../../internal/text-quote.js";import{resolveIntlLocale}from"../../internal/intl-cache.js";const VIEWER_SEARCH_QUERY_LIMIT=TEXT_QUOTE_LIMITS.maxQueryCodeUnits,VIEWER_SEARCH_WORK_LIMIT=TEXT_QUOTE_LIMITS.maxSearchWorkCodeUnits;function boundedViewerSearchQuery(query,locale){if(query.length>VIEWER_SEARCH_QUERY_LIMIT)return{needle:"",accepted:!1};const needle=query.trim().toLocaleLowerCase(resolveIntlLocale(locale));return needle.length<=VIEWER_SEARCH_QUERY_LIMIT?{needle,accepted:!0}:{needle:"",accepted:!1}}class ViewerSearchWorkBudget{constructor(maxWork=VIEWER_SEARCH_WORK_LIMIT){this.complete=!0,this.remaining=Number.isFinite(maxWork)?Math.min(VIEWER_SEARCH_WORK_LIMIT,Math.max(0,Math.floor(maxWork))):VIEWER_SEARCH_WORK_LIMIT}includes(value,needle,locale){return this.includesJoined([value],needle,locale)}consume(value){if(this.remaining<=0)return this.complete=!1,!1;const cost=Math.max(1,value.length);return cost>this.remaining?(this.remaining=0,this.complete=!1,!1):(this.remaining-=cost,!0)}canConsume(value){return this.remaining>0&&Math.max(1,value.length)<=this.remaining}includesJoined(values,needle,locale){const chunks=[],availableWork=this.remaining;let retainedCodeUnits=0,asciiOnly=!0,inspectedAny=!1;for(const value of values){if(inspectedAny=!0,this.remaining<=0){this.complete=!1;break}if(value.length===0){this.remaining--;continue}const retainedLength=Math.min(value.length,this.remaining),chunk=value.slice(0,retainedLength);if(chunks.push(chunk),retainedCodeUnits+=retainedLength,asciiOnly&&/[^\x00-\x7f]/u.test(chunk)&&(asciiOnly=!1),this.remaining-=retainedLength,retainedLength!==value.length){this.complete=!1;break}}inspectedAny||(this.remaining<=0?this.complete=!1:this.remaining--);const maximumFoldedCodeUnits=asciiOnly?retainedCodeUnits:retainedCodeUnits*4;if(retainedCodeUnits+maximumFoldedCodeUnits>availableWork)return this.remaining=0,this.complete=!1,!1;const folded=chunks.join("").toLocaleLowerCase(resolveIntlLocale(locale));return folded.length>this.remaining?(this.remaining=0,this.complete=!1,!1):(this.remaining-=folded.length,folded.includes(needle))}get exhausted(){return this.remaining<=0}}export{VIEWER_SEARCH_QUERY_LIMIT,VIEWER_SEARCH_WORK_LIMIT,ViewerSearchWorkBudget,boundedViewerSearchQuery};
|