@aceshooting/lyra-ui 26.0.0 → 27.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 +63 -675
- package/README.md +281 -1130
- package/design-tokens.json +1 -1
- package/dist/ai/types.d.ts +5 -5
- package/dist/autoloader.js +1 -1
- package/dist/cli/agent-registry.mjs +1 -0
- package/dist/cli/component-inventory.mjs +1 -1
- package/dist/cli/init-agents.mjs +40 -0
- package/dist/cli/is-main-module.mjs +1 -0
- package/dist/cli/lyra-rename-ledger.mjs +1 -1
- package/dist/cli/lyra-ui.mjs +11 -0
- package/dist/cli/migrate-wa.mjs +4 -2
- package/dist/cli/migration-contract.json +1 -1
- package/dist/cli/migration-renames.mjs +1 -1
- package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.d.ts +1 -1
- package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js +2 -2
- package/dist/components/agent-tools/approval-queue/approval-queue.class.js +1 -1
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +2 -2
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
- package/dist/components/agent-tools/connector-manager/connector-manager.class.d.ts +4 -2
- package/dist/components/agent-tools/connector-manager/connector-manager.class.js +6 -3
- package/dist/components/agent-tools/connector-manager/connector-manager.d.ts +1 -1
- package/dist/components/agent-tools/connector-manager/connector-manager.js +1 -1
- package/dist/components/agent-tools/connector-manager/connector-manager.styles.js +1 -1
- package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts +2 -2
- package/dist/components/agent-tools/context-inspector/context-inspector.class.js +6 -6
- package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +8 -33
- package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +27 -4
- package/dist/components/agent-tools/eval-dataset/eval-dataset.d.ts +1 -1
- package/dist/components/agent-tools/eval-dataset/eval-dataset.js +1 -1
- package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js +1 -1
- package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +1 -1
- package/dist/components/agent-tools/permission-grant/permission-grant.class.d.ts +4 -2
- package/dist/components/agent-tools/permission-grant/permission-grant.class.js +6 -3
- package/dist/components/agent-tools/permission-grant/permission-grant.d.ts +1 -1
- package/dist/components/agent-tools/permission-grant/permission-grant.js +1 -1
- package/dist/components/agent-tools/permission-grant/permission-grant.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 +2 -2
- package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +3 -1
- package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +1 -1
- package/dist/components/agent-tools/stack-trace/stack-trace.class.js +1 -1
- package/dist/components/agent-tools/task-list/task-list.class.d.ts +2 -2
- package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
- package/dist/components/agent-tools/terminal/terminal.class.d.ts +1 -1
- package/dist/components/agent-tools/terminal/terminal.class.js +4 -4
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts +15 -9
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +1 -1
- package/dist/components/agent-tools/tool-call-block/tool-call-block.class.d.ts +2 -2
- package/dist/components/agent-tools/tool-call-block/tool-call-block.class.js +1 -1
- package/dist/components/agent-tools/tool-call-block/tool-call-block.styles.js +1 -1
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +2 -7
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.styles.js +1 -1
- package/dist/components/agent-tools/tool-param-form/tool-param-constraints.js +1 -1
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +3 -5
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +1 -1
- package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.d.ts +2 -5
- 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 +4 -12
- package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts +2 -2
- package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js +1 -1
- package/dist/components/agent-tools/tool-status.d.ts +7 -0
- package/dist/components/agent-tools/tool-status.styles.js +1 -0
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -1
- package/dist/components/agent-tools/tool-timeline/tool-timeline.d.ts +1 -1
- package/dist/components/agent-tools/tool-timeline/tool-timeline.js +1 -1
- package/dist/components/agent-tools/trace-tree/trace-tree.class.js +2 -2
- package/dist/components/charts/chart/box-plot.class.d.ts +1 -1
- package/dist/components/charts/chart/box-plot.class.js +1 -1
- package/dist/components/charts/chart/box-plot.styles.js +1 -1
- package/dist/components/charts/chart/chart-surface-shared.js +1 -0
- package/dist/components/charts/chart/chart-surface.styles.js +1 -1
- package/dist/components/charts/chart/chart-table-sampling.js +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +2 -2
- package/dist/components/charts/chart/chart.class.js +2 -2
- package/dist/components/charts/chart/chart.styles.js +1 -1
- package/dist/components/charts/chart/histogram.class.js +1 -1
- package/dist/components/charts/chart/lite-chart.class.d.ts +1 -1
- package/dist/components/charts/chart/lite-chart.class.js +4 -4
- package/dist/components/conversation/catalog-picker-element.d.ts +28 -13
- package/dist/components/conversation/catalog-picker-element.js +1 -1
- package/dist/components/conversation/catalog-picker-trigger.styles.js +1 -0
- package/dist/components/conversation/chat-message/chat-message.class.js +1 -1
- package/dist/components/conversation/chat-message/chat-message.styles.js +1 -1
- package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +1 -1
- package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
- package/dist/components/conversation/code-block/code-block-shared.js +1 -1
- package/dist/components/conversation/conversation-item/conversation-item.class.js +1 -1
- package/dist/components/conversation/generation-metrics/generation-metrics.class.js +2 -2
- package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
- package/dist/components/conversation/markdown/markdown-code-header.js +1 -1
- package/dist/components/conversation/message-actions/message-actions.class.js +1 -1
- package/dist/components/conversation/model-select/model-select.class.d.ts +7 -34
- package/dist/components/conversation/model-select/model-select.class.js +3 -3
- package/dist/components/conversation/model-select/model-select.styles.js +1 -1
- package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +7 -2
- package/dist/components/conversation/prompt-input/prompt-input.class.js +5 -2
- package/dist/components/conversation/prompt-queue/prompt-queue.class.js +1 -1
- package/dist/components/conversation/realtime-session/realtime-session.class.js +1 -1
- package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
- package/dist/components/conversation/stream-status/stream-status.class.js +1 -1
- package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +10 -27
- package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -3
- package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
- package/dist/components/data/condition-builder/condition-builder.class.js +1 -1
- package/dist/components/data/data-grid/data-grid.class.js +1 -1
- package/dist/components/data/document-library/document-library.class.d.ts +2 -2
- package/dist/components/data/document-library/document-library.class.js +2 -2
- package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +3 -3
- package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
- package/dist/components/data/heatmap/heatmap.class.js +2 -2
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +1 -1
- package/dist/components/data/sequence-strip/sequence-strip.class.js +1 -1
- package/dist/components/data/table/table.class.d.ts +10 -195
- package/dist/components/data/table/table.class.js +2 -2
- 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.class.js +1 -1
- package/dist/components/forms/button/button.class.d.ts +3 -3
- package/dist/components/forms/button/button.class.js +1 -1
- package/dist/components/forms/catalog-picker-base.js +1 -1
- package/dist/components/forms/checkbox/checkbox.class.d.ts +13 -34
- package/dist/components/forms/checkbox/checkbox.class.js +3 -3
- package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +3 -3
- package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
- package/dist/components/forms/code-editor/code-editor.class.js +1 -1
- package/dist/components/forms/color-picker/color-picker.class.js +1 -1
- package/dist/components/forms/combobox/combobox.class.d.ts +6 -6
- package/dist/components/forms/combobox/combobox.class.js +3 -2
- package/dist/components/forms/combobox/option.class.d.ts +3 -0
- package/dist/components/forms/combobox/option.class.js +2 -2
- package/dist/components/forms/date-picker/date-input.class.d.ts +10 -11
- package/dist/components/forms/date-picker/date-input.class.js +4 -3
- package/dist/components/forms/date-picker/date-input.styles.js +1 -1
- package/dist/components/forms/date-picker/date-picker.class.d.ts +6 -0
- package/dist/components/forms/date-picker/date-picker.class.js +1 -1
- 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.styles.js +1 -1
- package/dist/components/forms/input/time-input.class.d.ts +1 -1
- package/dist/components/forms/input/time-input.class.js +1 -1
- package/dist/components/forms/input/time-input.styles.js +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.d.ts +5 -5
- package/dist/components/forms/locale-picker/locale-picker.class.js +1 -1
- package/dist/components/forms/otp-input/otp-input.class.js +1 -0
- package/dist/components/forms/phone-input/phone-input.class.d.ts +7 -9
- package/dist/components/forms/phone-input/phone-input.class.js +6 -5
- package/dist/components/forms/phone-input/phone-input.styles.js +1 -1
- package/dist/components/forms/radio/radio-group.class.d.ts +4 -4
- package/dist/components/forms/radio/radio-group.class.js +1 -1
- package/dist/components/forms/radio/radio.class.d.ts +11 -19
- package/dist/components/forms/radio/radio.class.js +2 -2
- package/dist/components/forms/rubric-form/rubric-form.class.d.ts +3 -5
- package/dist/components/forms/rubric-form/rubric-form.class.js +1 -1
- package/dist/components/forms/select/select.class.d.ts +5 -7
- package/dist/components/forms/select/select.class.js +3 -2
- package/dist/components/forms/slider/slider.class.d.ts +3 -3
- package/dist/components/forms/slider/slider.class.js +1 -1
- package/dist/components/forms/slider/slider.styles.js +1 -1
- package/dist/components/forms/swatch-picker/swatch-picker.class.js +1 -1
- package/dist/components/forms/switch/switch.class.d.ts +11 -36
- package/dist/components/forms/switch/switch.class.js +2 -2
- package/dist/components/forms/textarea/textarea.class.js +1 -0
- package/dist/components/forms/textarea/textarea.styles.js +1 -1
- package/dist/components/forms/time-range/time-range.class.d.ts +5 -3
- package/dist/components/forms/time-range/time-range.class.js +1 -1
- package/dist/components/forms/time-range/time-range.styles.js +1 -1
- package/dist/components/forms/toggle-group/toggle-group.class.d.ts +2 -2
- package/dist/components/forms/toggle-group/toggle-group.class.js +1 -1
- package/dist/components/forms/token-input/token-input.class.d.ts +3 -3
- package/dist/components/forms/token-input/token-input.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail-item.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail.class.d.ts +2 -2
- package/dist/components/layout/app-rail/app-rail.class.js +1 -1
- package/dist/components/layout/breadcrumb/breadcrumb-item.class.js +1 -1
- package/dist/components/layout/card/card.class.js +1 -1
- package/dist/components/layout/carousel/carousel.class.js +1 -1
- package/dist/components/layout/command-palette/command-palette.class.d.ts +6 -2
- package/dist/components/layout/command-palette/command-palette.class.js +1 -1
- package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
- package/dist/components/layout/details/accordion.class.js +1 -1
- package/dist/components/layout/dock-panel/dock-panel.class.d.ts +1 -1
- package/dist/components/layout/dock-panel/dock-panel.class.js +1 -1
- package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +2 -2
- package/dist/components/layout/filter-bar/filter-bar.class.d.ts +3 -2
- package/dist/components/layout/filter-bar/filter-bar.class.js +18 -15
- package/dist/components/layout/filter-bar/filter-bar.styles.js +1 -1
- package/dist/components/layout/menu/menu.class.d.ts +1 -1
- package/dist/components/layout/menu/menu.class.js +1 -1
- package/dist/components/layout/multi-split/multi-split.class.d.ts +1 -1
- package/dist/components/layout/multi-split/multi-split.class.js +1 -1
- package/dist/components/layout/navigation-menu-item/navigation-menu-item.class.js +1 -1
- package/dist/components/layout/page/page.class.d.ts +1 -1
- package/dist/components/layout/page/page.class.js +1 -1
- package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts +1 -1
- package/dist/components/layout/responsive-panel/responsive-panel.class.js +1 -1
- package/dist/components/layout/scroller/scroller.class.js +1 -1
- package/dist/components/layout/segmented/segmented.class.js +1 -1
- package/dist/components/layout/stepper/stepper.class.js +2 -2
- package/dist/components/layout/tab-group/tab-group.class.js +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.d.ts +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.js +1 -1
- package/dist/components/layout/widget/widget.class.d.ts +1 -1
- package/dist/components/layout/widget/widget.class.js +3 -3
- package/dist/components/media/drop-zone/drop-zone.class.d.ts +10 -0
- package/dist/components/media/drop-zone/drop-zone.class.js +2 -2
- package/dist/components/media/file-input/file-input.class.d.ts +3 -3
- package/dist/components/media/file-input/file-input.class.js +2 -2
- package/dist/components/media/file-input/file-intake.d.ts +5 -1
- package/dist/components/media/file-input/file-intake.js +1 -1
- package/dist/components/media/flag/flag.class.js +1 -1
- package/dist/components/media/image-viewer/image-viewer.styles.js +1 -1
- package/dist/components/media/lightbox/lightbox.class.js +1 -1
- package/dist/components/media/map/map.class.js +2 -2
- package/dist/components/media/qr-code/qr-code-loader.js +1 -1
- package/dist/components/media/qr-code/qr-code.class.js +1 -1
- package/dist/components/media/video/video.class.js +3 -3
- package/dist/components/media/video-playlist/video-playlist.class.js +1 -1
- package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts +2 -2
- package/dist/components/media/zoomable-frame/zoomable-frame.class.js +1 -1
- package/dist/components/overlays/alert/alert.class.d.ts +3 -3
- package/dist/components/overlays/alert/alert.class.js +1 -1
- package/dist/components/overlays/badge/badge.class.d.ts +2 -2
- package/dist/components/overlays/badge/badge.class.js +1 -1
- package/dist/components/overlays/badge/tag.class.d.ts +3 -1
- package/dist/components/overlays/badge/tag.class.js +3 -2
- package/dist/components/overlays/badge/tag.styles.js +1 -1
- package/dist/components/overlays/callout/callout.class.d.ts +2 -2
- package/dist/components/overlays/callout/callout.class.js +1 -1
- package/dist/components/overlays/chip/chip.class.d.ts +4 -2
- package/dist/components/overlays/chip/chip.class.js +2 -2
- package/dist/components/overlays/dialog/dialog.class.d.ts +1 -1
- package/dist/components/overlays/dialog/dialog.class.js +1 -1
- package/dist/components/overlays/overlay/overlay-shared.d.ts +9 -0
- package/dist/components/overlays/overlay/overlay-shared.js +1 -1
- package/dist/components/overlays/overlay/popover.class.d.ts +2 -2
- package/dist/components/overlays/overlay/popover.class.js +1 -1
- package/dist/components/overlays/overlay/tooltip.class.d.ts +1 -1
- package/dist/components/overlays/overlay/tooltip.class.js +1 -1
- package/dist/components/overlays/progress/progress-bar.class.d.ts +5 -22
- package/dist/components/overlays/progress/progress-bar.class.js +4 -4
- package/dist/components/overlays/progress/progress-base.d.ts +25 -0
- package/dist/components/overlays/progress/progress-base.js +1 -0
- package/dist/components/overlays/progress/progress-ring.class.d.ts +3 -24
- package/dist/components/overlays/progress/progress-ring.class.js +4 -4
- package/dist/components/overlays/rating/rating.class.d.ts +3 -3
- package/dist/components/overlays/rating/rating.class.js +1 -1
- package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.d.ts +4 -2
- package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js +4 -4
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +1 -1
- package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts +1 -1
- package/dist/components/retrieval/graph/graph-canvas.js +1 -1
- package/dist/components/retrieval/graph/graph-model.js +1 -1
- package/dist/components/retrieval/graph/graph.class.d.ts +1 -3
- package/dist/components/retrieval/graph/graph.class.js +1 -1
- package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +1 -1
- package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +2 -2
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +1 -1
- package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +2 -2
- package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +1 -1
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +1 -0
- package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +2 -1
- package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +6 -2
- package/dist/components/retrieval/memory-panel/memory-panel.class.js +2 -2
- package/dist/components/retrieval/memory-panel/memory-panel.styles.js +1 -1
- package/dist/components/retrieval/node-palette/node-palette.class.js +1 -1
- package/dist/components/retrieval/path-strip/path-strip.class.js +1 -1
- package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts +1 -1
- package/dist/components/retrieval/research-progress/research-progress.class.d.ts +5 -1
- package/dist/components/retrieval/research-progress/research-progress.class.js +3 -3
- package/dist/components/retrieval/research-progress/research-progress.d.ts +1 -1
- package/dist/components/retrieval/research-progress/research-progress.js +1 -1
- package/dist/components/retrieval/research-progress/research-progress.styles.js +1 -1
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.d.ts +6 -2
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.class.js +2 -2
- package/dist/components/retrieval/retrieval-compare/retrieval-compare.styles.js +1 -1
- package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +2 -2
- package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +3 -2
- package/dist/components/retrieval/retrieval-search/retrieval-search.class.js +3 -3
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.d.ts +6 -2
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +2 -2
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.styles.js +1 -1
- package/dist/components/retrieval/source-picker/source-picker.class.js +1 -1
- package/dist/components/utility/copy-button/copy-button.class.js +1 -1
- package/dist/components/utility/diff-view/diff-view.class.js +1 -1
- package/dist/components/utility/export-button/export-button.class.d.ts +1 -1
- package/dist/components/utility/export-button/export-button.class.js +1 -1
- package/dist/components/utility/icon/dompurify-loader.js +1 -1
- package/dist/components/utility/json-viewer/json-viewer.class.js +2 -2
- package/dist/components/utility/known-date/known-date.class.js +1 -1
- 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/utility/random-content/random-content.class.d.ts +1 -1
- package/dist/components/utility/random-content/random-content.class.js +1 -1
- package/dist/components/utility/tour/tour.class.d.ts +1 -1
- package/dist/components/utility/tour/tour.class.js +1 -1
- package/dist/components/viewers/archive-viewer/archive-viewer.class.js +1 -1
- package/dist/components/viewers/archive-viewer/archive-viewer.styles.js +1 -1
- package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts +3 -1
- package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +1 -1
- package/dist/components/viewers/contact-viewer/contact-viewer.class.d.ts +3 -1
- package/dist/components/viewers/contact-viewer/contact-viewer.class.js +1 -1
- package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +2 -2
- package/dist/components/viewers/csv-viewer/csv-viewer.class.js +4 -18
- package/dist/components/viewers/csv-viewer/csv-viewer.styles.js +1 -1
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +2 -2
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +4 -18
- package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js +1 -1
- package/dist/components/viewers/document-preview/document-preview.class.d.ts +1 -1
- package/dist/components/viewers/document-preview/document-preview.class.js +3 -16
- package/dist/components/viewers/document-viewer/ooxml-part-guard.js +1 -0
- package/dist/components/viewers/docx-viewer/docx-loader.js +1 -1
- package/dist/components/viewers/docx-viewer/docx-resource-guard.js +1 -1
- package/dist/components/viewers/docx-viewer/docx-viewer.class.d.ts +3 -3
- package/dist/components/viewers/docx-viewer/docx-viewer.class.js +3 -3
- package/dist/components/viewers/ebook-viewer/ebook-loader.js +1 -1
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +1 -1
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +2 -1
- package/dist/components/viewers/ebook-viewer/epub-resource-guard.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/geojson-view/geojson-viewer.class.d.ts +1 -4
- package/dist/components/viewers/geojson-view/geojson-viewer.class.js +1 -1
- package/dist/components/viewers/highlight-layer/highlight-layer.class.js +1 -1
- package/dist/components/viewers/html-viewer/html-viewer.class.d.ts +3 -1
- package/dist/components/viewers/html-viewer/html-viewer.class.js +1 -1
- package/dist/components/viewers/html-viewer/html-viewer.styles.js +1 -1
- package/dist/components/viewers/notebook-viewer/dompurify-loader.js +1 -1
- package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
- package/dist/components/viewers/page-rail/page-rail.class.js +2 -2
- package/dist/components/viewers/passive-markup.js +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-loader.js +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +2 -2
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +4 -4
- package/dist/components/viewers/pptx-viewer/pptx-loader.js +1 -1
- package/dist/components/viewers/pptx-viewer/pptx-resource-guard.js +1 -1
- package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +1 -1
- package/dist/components/viewers/region-highlight-layer.js +15 -2
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +2 -2
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +4 -18
- package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.styles.js +1 -1
- package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts +1 -1
- package/dist/components/viewers/svg-viewer/svg-viewer.class.js +2 -15
- package/dist/components/viewers/svg-viewer/svg-viewer.styles.js +1 -1
- package/dist/components/viewers/table-viewer-shared.js +15 -1
- package/dist/components/viewers/table-viewer-shared.styles.js +1 -0
- package/dist/events.d.ts +19 -18
- package/dist/framework-types.d.ts +1 -1
- package/dist/internal/accessibility-visibility.d.ts +3 -1
- package/dist/internal/accessibility-visibility.js +1 -1
- package/dist/internal/accessible-text-controller.js +1 -1
- package/dist/internal/active-element.d.ts +11 -0
- package/dist/internal/active-element.js +1 -1
- package/dist/internal/adjacent-runs.js +1 -1
- package/dist/internal/approval-wait-until.d.ts +7 -0
- package/dist/internal/approval-wait-until.js +1 -0
- package/dist/internal/aria-controls.js +1 -1
- package/dist/internal/catalog-picker.d.ts +2 -2
- package/dist/internal/catalog-picker.js +1 -1
- package/dist/internal/composed-tree.d.ts +18 -0
- package/dist/internal/composed-tree.js +1 -1
- package/dist/internal/copy-feedback.js +1 -0
- package/dist/internal/css-length.js +1 -1
- package/dist/internal/css-motion-time.js +1 -1
- package/dist/internal/css-number.js +1 -0
- package/dist/internal/default-strings.generated.js +1 -1
- package/dist/internal/deferred-focus-return.d.ts +33 -0
- package/dist/internal/deferred-focus-return.js +1 -1
- package/dist/internal/fixed-containing-block.js +1 -1
- package/dist/internal/form-associated.d.ts +38 -2
- package/dist/internal/form-associated.js +1 -1
- package/dist/internal/form-control-element.d.ts +13 -0
- package/dist/internal/form-control-element.js +1 -0
- package/dist/internal/form-control.styles.js +1 -1
- package/dist/internal/inherited-attribute-hub.js +1 -1
- package/dist/internal/locale-loaders.generated.js +1 -1
- package/dist/internal/localization-types.d.ts +1 -1
- package/dist/internal/localization.js +1 -1
- package/dist/internal/modal-surface-controller.js +1 -1
- package/dist/internal/object-guards.js +1 -1
- package/dist/internal/optional-peer-capabilities.d.ts +3 -1
- package/dist/internal/optional-peer-capabilities.js +1 -1
- package/dist/internal/orientation-breakpoint.js +1 -1
- package/dist/internal/overlay-manager.d.ts +6 -1
- package/dist/internal/overlay-manager.js +1 -1
- package/dist/internal/overlay-stack.d.ts +7 -3
- package/dist/internal/overlay-stack.js +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/internal/persisted-restore.js +1 -1
- package/dist/internal/popup-controller.js +1 -0
- package/dist/internal/rendered-tree-traversal.d.ts +3 -1
- package/dist/internal/rendered-tree-traversal.js +1 -1
- package/dist/internal/retry-forwarder.js +1 -0
- package/dist/internal/roving-toolbar.js +1 -1
- package/dist/internal/scoped-definitions.generated.js +1 -1
- package/dist/internal/score-tiers.d.ts +4 -0
- package/dist/internal/score-tiers.js +1 -0
- package/dist/internal/semantic-variant.d.ts +7 -0
- package/dist/internal/semantic-variant.js +1 -0
- package/dist/internal/shared-unions.d.ts +1 -1
- package/dist/internal/viewer-search.js +1 -1
- package/dist/lyra.d.ts +1 -1
- package/dist/testing/happy-dom-shims.d.ts +18 -0
- package/dist/testing/happy-dom-shims.js +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.js +1 -1
- package/llms/components/lr-accordion-item.md +1 -1
- package/llms/components/lr-accordion.md +1 -1
- package/llms/components/lr-alert.md +2 -2
- package/llms/components/lr-app-rail-group.md +1 -1
- package/llms/components/lr-app-rail-item.md +1 -1
- package/llms/components/lr-app-rail.md +1 -1
- package/llms/components/lr-attachment-chip.md +1 -10
- package/llms/components/lr-attachment-trigger.md +0 -10
- package/llms/components/lr-avatar.md +4 -8
- package/llms/components/lr-badge.md +16 -20
- package/llms/components/lr-box-plot.md +1 -1
- package/llms/components/lr-breadcrumb-item.md +1 -1
- package/llms/components/lr-breadcrumb.md +1 -1
- package/llms/components/lr-button-group.md +1 -1
- package/llms/components/lr-button.md +1 -1
- package/llms/components/lr-calendar.md +1 -1
- package/llms/components/lr-callout.md +3 -13
- package/llms/components/lr-card.md +1 -1
- package/llms/components/lr-carousel-item.md +1 -1
- package/llms/components/lr-carousel.md +1 -1
- package/llms/components/lr-chart.md +5 -7
- package/llms/components/lr-checkbox-group.md +1 -1
- package/llms/components/lr-checkbox.md +2 -1
- package/llms/components/lr-chip.md +3 -17
- package/llms/components/lr-chunk-inspector.md +2 -1
- package/llms/components/lr-citation-badge.md +2 -2
- package/llms/components/lr-code-block.md +0 -10
- package/llms/components/lr-code-editor.md +1 -1
- package/llms/components/lr-color-picker.md +1 -1
- package/llms/components/lr-combobox.md +6 -3
- package/llms/components/lr-command-palette.md +5 -2
- package/llms/components/lr-commit-card.md +1 -3
- package/llms/components/lr-condition-builder.md +1 -1
- package/llms/components/lr-confirm-bar.md +7 -13
- package/llms/components/lr-connector-manager.md +3 -1
- package/llms/components/lr-context-inspector.md +1 -1
- package/llms/components/lr-context-meter.md +1 -1
- package/llms/components/lr-control-group.md +1 -1
- package/llms/components/lr-copy-button.md +8 -10
- package/llms/components/lr-country-picker.md +1 -1
- package/llms/components/lr-currency-picker.md +1 -1
- package/llms/components/lr-dashboard-grid.md +1 -1
- package/llms/components/lr-data-grid.md +1 -1
- package/llms/components/lr-date-input.md +1 -1
- package/llms/components/lr-date-picker.md +11 -4
- package/llms/components/lr-details.md +1 -1
- package/llms/components/lr-dialog.md +8 -31
- package/llms/components/lr-diff-view.md +1 -1
- package/llms/components/lr-divider.md +1 -1
- package/llms/components/lr-dock-panel.md +1 -1
- package/llms/components/lr-document-library.md +1 -1
- package/llms/components/lr-drawer.md +1 -13
- package/llms/components/lr-drilldown-panel.md +1 -1
- package/llms/components/lr-drop-zone.md +4 -0
- package/llms/components/lr-dropdown-item.md +1 -1
- package/llms/components/lr-ebook-viewer.md +4 -3
- package/llms/components/lr-emoji-picker.md +1 -1
- package/llms/components/lr-entity-chip.md +2 -2
- package/llms/components/lr-env-list.md +1 -1
- package/llms/components/lr-eval-dataset.md +4 -19
- package/llms/components/lr-export-button.md +3 -3
- package/llms/components/lr-file-icon.md +0 -5
- package/llms/components/lr-file-input.md +3 -5
- package/llms/components/lr-file-tree.md +1 -1
- package/llms/components/lr-filter-bar.md +5 -1
- package/llms/components/lr-flag.md +1 -2
- package/llms/components/lr-flow-canvas.md +1 -1
- package/llms/components/lr-flow-controls.md +1 -1
- package/llms/components/lr-flow-minimap.md +2 -2
- package/llms/components/lr-flow-node.md +1 -1
- package/llms/components/lr-flow-run-status.md +1 -1
- package/llms/components/lr-format-bytes.md +2 -3
- package/llms/components/lr-format-date.md +2 -3
- package/llms/components/lr-format-number.md +1 -1
- package/llms/components/lr-funnel.md +1 -1
- package/llms/components/lr-gauge.md +1 -1
- package/llms/components/lr-generation-metrics.md +1 -1
- package/llms/components/lr-graph-query-builder.md +1 -1
- package/llms/components/lr-heatmap.md +1 -1
- package/llms/components/lr-icon-button.md +1 -1
- package/llms/components/lr-icon.md +1 -1
- package/llms/components/lr-input.md +1 -1
- package/llms/components/lr-intersection-observer.md +1 -1
- package/llms/components/lr-json-viewer.md +1 -1
- package/llms/components/lr-knowledge-graph-explorer.md +2 -2
- package/llms/components/lr-known-date.md +1 -1
- package/llms/components/lr-lite-chart.md +3 -4
- package/llms/components/lr-live-region.md +1 -1
- package/llms/components/lr-locale-picker.md +1 -1
- package/llms/components/lr-map.md +1 -3
- package/llms/components/lr-media-card.md +1 -10
- package/llms/components/lr-memory-panel.md +2 -0
- package/llms/components/lr-mention-popover.md +3 -3
- package/llms/components/lr-menu-item.md +1 -1
- package/llms/components/lr-menu-label.md +1 -1
- package/llms/components/lr-menu.md +1 -1
- package/llms/components/lr-menubar-item.md +1 -1
- package/llms/components/lr-menubar.md +1 -1
- package/llms/components/lr-message-actions.md +1 -11
- package/llms/components/lr-message-parts.md +3 -5
- package/llms/components/lr-model-select.md +2 -4
- package/llms/components/lr-multi-split.md +1 -1
- package/llms/components/lr-mutation-observer.md +2 -2
- package/llms/components/lr-native-time-input.md +1 -1
- package/llms/components/lr-navigation-menu-item.md +1 -1
- package/llms/components/lr-navigation-menu.md +1 -1
- package/llms/components/lr-number-input.md +1 -1
- package/llms/components/lr-option.md +1 -1
- package/llms/components/lr-otp-input.md +1 -1
- package/llms/components/lr-page.md +1 -1
- package/llms/components/lr-pagination.md +1 -1
- package/llms/components/lr-pan-zoom.md +1 -3
- package/llms/components/lr-permission-grant.md +3 -1
- package/llms/components/lr-phone-input.md +7 -5
- package/llms/components/lr-poll-status.md +1 -1
- package/llms/components/lr-popover.md +5 -9
- package/llms/components/lr-popup.md +1 -3
- package/llms/components/lr-progress-bar.md +2 -1
- package/llms/components/lr-progress-ring.md +4 -8
- package/llms/components/lr-prompt-input.md +3 -1
- package/llms/components/lr-prompt-studio.md +4 -4
- package/llms/components/lr-radio-button.md +2 -2
- package/llms/components/lr-radio-group.md +1 -1
- package/llms/components/lr-radio.md +3 -2
- package/llms/components/lr-random-content.md +1 -1
- package/llms/components/lr-rating.md +2 -3
- package/llms/components/lr-relative-time.md +2 -3
- package/llms/components/lr-reorder-item.md +1 -1
- package/llms/components/lr-reorder-list.md +1 -1
- package/llms/components/lr-research-progress.md +2 -0
- package/llms/components/lr-resize-observer.md +1 -1
- package/llms/components/lr-responsive-panel.md +1 -1
- package/llms/components/lr-retrieval-compare.md +2 -0
- package/llms/components/lr-retrieval-trace.md +2 -0
- package/llms/components/lr-rubric-form.md +1 -1
- package/llms/components/lr-scroller.md +1 -1
- package/llms/components/lr-segmented.md +1 -1
- package/llms/components/lr-select.md +1 -1
- package/llms/components/lr-sequence-playback.md +1 -2
- package/llms/components/lr-sequence-strip.md +1 -1
- package/llms/components/lr-signature-pad.md +1 -1
- package/llms/components/lr-skeleton.md +2 -4
- package/llms/components/lr-slider.md +1 -1
- package/llms/components/lr-sparkline.md +1 -1
- package/llms/components/lr-split-panel.md +1 -1
- package/llms/components/lr-stat.md +1 -1
- package/llms/components/lr-stepper.md +1 -1
- package/llms/components/lr-swatch-picker.md +1 -1
- package/llms/components/lr-switch.md +2 -1
- package/llms/components/lr-tab-group.md +1 -1
- package/llms/components/lr-tab-panel.md +1 -1
- package/llms/components/lr-tab.md +1 -1
- package/llms/components/lr-table.md +3 -3
- package/llms/components/lr-task-list.md +3 -3
- package/llms/components/lr-test-results.md +2 -4
- package/llms/components/lr-textarea.md +1 -1
- package/llms/components/lr-time-input.md +1 -1
- package/llms/components/lr-time-range.md +5 -4
- package/llms/components/lr-time-zone-picker.md +1 -1
- package/llms/components/lr-timeline-item.md +1 -1
- package/llms/components/lr-timeline.md +1 -1
- package/llms/components/lr-toggle-group.md +1 -1
- package/llms/components/lr-toggle.md +1 -1
- package/llms/components/lr-token-input.md +1 -1
- package/llms/components/lr-tool-approval-dialog.md +12 -10
- package/llms/components/lr-tool-call-block.md +1 -1
- package/llms/components/lr-tool-call-chip.md +1 -3
- package/llms/components/lr-tool-result-view.md +3 -3
- package/llms/components/lr-tool-timeline.md +2 -2
- package/llms/components/lr-tooltip.md +8 -11
- package/llms/components/lr-tour.md +2 -2
- package/llms/components/lr-tree-item.md +1 -1
- package/llms/components/lr-tree.md +1 -1
- package/llms/components/lr-unit-picker.md +1 -1
- package/llms/components/lr-usage-badge.md +1 -3
- package/llms/components/lr-video.md +1 -2
- package/llms/components/lr-virtual-list.md +1 -1
- package/llms/components/lr-visually-hidden.md +1 -1
- package/llms/components/lr-voice-picker.md +1 -1
- package/llms/components/lr-widget.md +1 -1
- package/llms/components/lr-word-cloud.md +1 -1
- package/llms/components/lr-zoomable-frame.md +1 -6
- package/llms/migration.md +96 -2
- package/llms/peers.md +3 -2
- package/llms/shared/ai-and-peers.md +2 -2
- package/llms/shared/events-and-types.md +4 -1
- package/llms/shared/imports-and-registration.md +2 -2
- package/llms/shared/localization-and-rtl.md +18 -18
- package/llms/shared/styles-and-tokens.md +1 -1
- package/llms/shared/testing-and-utilities.md +44 -43
- package/llms/shared.md +71 -67
- package/llms.txt +14 -12
- package/locales.json +1002 -1002
- package/package.json +16 -6879
- package/registrations.json +1 -1
- package/skills/compose-lyra-interfaces/SKILL.md +60 -0
- package/skills/compose-lyra-interfaces/agents/openai.yaml +4 -0
- package/skills/compose-lyra-interfaces/references/composition-patterns.md +77 -0
- package/skills/lyra-ui/SKILL.md +145 -0
- package/skills/lyra-ui/commands/frontend.md +37 -0
- package/skills/lyra-ui/commands/migrate.md +44 -0
- package/skills/lyra-ui/commands/new-component.md +19 -0
- package/skills/lyra-ui/commands/review.md +247 -0
- package/skills/lyra-ui/commands/update.md +30 -0
- package/skills/lyra-ui/reporting.md +137 -0
- package/custom-elements.json +0 -1
- package/dist/internal/side-effect-only.d.ts +0 -1
- package/dist/translations/am/agent-tools.js +0 -1
- package/dist/translations/am/charts.js +0 -1
- package/dist/translations/am/conversation.js +0 -1
- package/dist/translations/am/data.js +0 -1
- package/dist/translations/am/forms.js +0 -1
- package/dist/translations/am/layout.js +0 -1
- package/dist/translations/am/media.js +0 -1
- package/dist/translations/am/overlays.js +0 -1
- package/dist/translations/am/retrieval.js +0 -1
- package/dist/translations/am/shared.js +0 -1
- package/dist/translations/am/utility.js +0 -1
- package/dist/translations/am/viewers.js +0 -5
- package/dist/translations/am.js +0 -1
- package/dist/translations/ar/agent-tools.js +0 -1
- package/dist/translations/ar/charts.js +0 -1
- package/dist/translations/ar/conversation.js +0 -1
- package/dist/translations/ar/data.js +0 -1
- package/dist/translations/ar/forms.js +0 -1
- package/dist/translations/ar/layout.js +0 -1
- package/dist/translations/ar/media.js +0 -1
- package/dist/translations/ar/overlays.js +0 -1
- package/dist/translations/ar/retrieval.js +0 -1
- package/dist/translations/ar/shared.js +0 -1
- package/dist/translations/ar/utility.js +0 -1
- package/dist/translations/ar/viewers.js +0 -5
- package/dist/translations/ar.js +0 -1
- package/dist/translations/bho/agent-tools.js +0 -1
- package/dist/translations/bho/charts.js +0 -1
- package/dist/translations/bho/conversation.js +0 -1
- package/dist/translations/bho/data.js +0 -1
- package/dist/translations/bho/forms.js +0 -1
- package/dist/translations/bho/layout.js +0 -1
- package/dist/translations/bho/media.js +0 -1
- package/dist/translations/bho/overlays.js +0 -1
- package/dist/translations/bho/retrieval.js +0 -1
- package/dist/translations/bho/shared.js +0 -1
- package/dist/translations/bho/utility.js +0 -1
- package/dist/translations/bho/viewers.js +0 -5
- package/dist/translations/bho.js +0 -1
- package/dist/translations/bn/agent-tools.js +0 -1
- package/dist/translations/bn/charts.js +0 -1
- package/dist/translations/bn/conversation.js +0 -1
- package/dist/translations/bn/data.js +0 -1
- package/dist/translations/bn/forms.js +0 -1
- package/dist/translations/bn/layout.js +0 -1
- package/dist/translations/bn/media.js +0 -1
- package/dist/translations/bn/overlays.js +0 -1
- package/dist/translations/bn/retrieval.js +0 -1
- package/dist/translations/bn/shared.js +0 -1
- package/dist/translations/bn/utility.js +0 -1
- package/dist/translations/bn/viewers.js +0 -5
- package/dist/translations/bn.js +0 -1
- package/dist/translations/cs/agent-tools.js +0 -1
- package/dist/translations/cs/charts.js +0 -1
- package/dist/translations/cs/conversation.js +0 -1
- package/dist/translations/cs/data.js +0 -1
- package/dist/translations/cs/forms.js +0 -1
- package/dist/translations/cs/layout.js +0 -1
- package/dist/translations/cs/media.js +0 -1
- package/dist/translations/cs/overlays.js +0 -1
- package/dist/translations/cs/retrieval.js +0 -1
- package/dist/translations/cs/shared.js +0 -1
- package/dist/translations/cs/utility.js +0 -1
- package/dist/translations/cs/viewers.js +0 -5
- package/dist/translations/cs.js +0 -1
- package/dist/translations/da/agent-tools.js +0 -1
- package/dist/translations/da/charts.js +0 -1
- package/dist/translations/da/conversation.js +0 -1
- package/dist/translations/da/data.js +0 -1
- package/dist/translations/da/forms.js +0 -1
- package/dist/translations/da/layout.js +0 -1
- package/dist/translations/da/media.js +0 -1
- package/dist/translations/da/overlays.js +0 -1
- package/dist/translations/da/retrieval.js +0 -1
- package/dist/translations/da/shared.js +0 -1
- package/dist/translations/da/utility.js +0 -1
- package/dist/translations/da/viewers.js +0 -5
- package/dist/translations/da.js +0 -1
- package/dist/translations/de/agent-tools.js +0 -1
- package/dist/translations/de/charts.js +0 -1
- package/dist/translations/de/conversation.js +0 -1
- package/dist/translations/de/data.js +0 -1
- package/dist/translations/de/forms.js +0 -1
- package/dist/translations/de/layout.js +0 -1
- package/dist/translations/de/media.js +0 -1
- package/dist/translations/de/overlays.js +0 -1
- package/dist/translations/de/retrieval.js +0 -1
- package/dist/translations/de/shared.js +0 -1
- package/dist/translations/de/utility.js +0 -1
- package/dist/translations/de/viewers.js +0 -5
- package/dist/translations/de-CH/agent-tools.js +0 -1
- package/dist/translations/de-CH/charts.js +0 -1
- package/dist/translations/de-CH/conversation.js +0 -1
- package/dist/translations/de-CH/data.js +0 -1
- package/dist/translations/de-CH/forms.js +0 -1
- package/dist/translations/de-CH/layout.js +0 -1
- package/dist/translations/de-CH/media.js +0 -1
- package/dist/translations/de-CH/overlays.js +0 -1
- package/dist/translations/de-CH/retrieval.js +0 -1
- package/dist/translations/de-CH/shared.js +0 -1
- package/dist/translations/de-CH/utility.js +0 -1
- package/dist/translations/de-CH/viewers.js +0 -1
- package/dist/translations/de-CH.js +0 -1
- package/dist/translations/de.js +0 -1
- package/dist/translations/el/agent-tools.js +0 -1
- package/dist/translations/el/charts.js +0 -1
- package/dist/translations/el/conversation.js +0 -1
- package/dist/translations/el/data.js +0 -1
- package/dist/translations/el/forms.js +0 -1
- package/dist/translations/el/layout.js +0 -1
- package/dist/translations/el/media.js +0 -1
- package/dist/translations/el/overlays.js +0 -1
- package/dist/translations/el/retrieval.js +0 -1
- package/dist/translations/el/shared.js +0 -1
- package/dist/translations/el/utility.js +0 -1
- package/dist/translations/el/viewers.js +0 -5
- package/dist/translations/el.js +0 -1
- package/dist/translations/es/agent-tools.js +0 -1
- package/dist/translations/es/charts.js +0 -1
- package/dist/translations/es/conversation.js +0 -1
- package/dist/translations/es/data.js +0 -1
- package/dist/translations/es/forms.js +0 -1
- package/dist/translations/es/layout.js +0 -1
- package/dist/translations/es/media.js +0 -1
- package/dist/translations/es/overlays.js +0 -1
- package/dist/translations/es/retrieval.js +0 -1
- package/dist/translations/es/shared.js +0 -1
- package/dist/translations/es/utility.js +0 -1
- package/dist/translations/es/viewers.js +0 -5
- package/dist/translations/es.js +0 -1
- package/dist/translations/fa/agent-tools.js +0 -1
- package/dist/translations/fa/charts.js +0 -1
- package/dist/translations/fa/conversation.js +0 -1
- package/dist/translations/fa/data.js +0 -1
- package/dist/translations/fa/forms.js +0 -1
- package/dist/translations/fa/layout.js +0 -1
- package/dist/translations/fa/media.js +0 -1
- package/dist/translations/fa/overlays.js +0 -1
- package/dist/translations/fa/retrieval.js +0 -1
- package/dist/translations/fa/shared.js +0 -1
- package/dist/translations/fa/utility.js +0 -1
- package/dist/translations/fa/viewers.js +0 -5
- package/dist/translations/fa-AF/agent-tools.js +0 -1
- package/dist/translations/fa-AF/charts.js +0 -1
- package/dist/translations/fa-AF/conversation.js +0 -1
- package/dist/translations/fa-AF/data.js +0 -1
- package/dist/translations/fa-AF/forms.js +0 -1
- package/dist/translations/fa-AF/layout.js +0 -1
- package/dist/translations/fa-AF/media.js +0 -1
- package/dist/translations/fa-AF/overlays.js +0 -1
- package/dist/translations/fa-AF/retrieval.js +0 -1
- package/dist/translations/fa-AF/shared.js +0 -1
- package/dist/translations/fa-AF/utility.js +0 -1
- package/dist/translations/fa-AF/viewers.js +0 -5
- package/dist/translations/fa-AF.js +0 -1
- package/dist/translations/fa.js +0 -1
- package/dist/translations/fi/agent-tools.js +0 -1
- package/dist/translations/fi/charts.js +0 -1
- package/dist/translations/fi/conversation.js +0 -1
- package/dist/translations/fi/data.js +0 -1
- package/dist/translations/fi/forms.js +0 -1
- package/dist/translations/fi/layout.js +0 -1
- package/dist/translations/fi/media.js +0 -1
- package/dist/translations/fi/overlays.js +0 -1
- package/dist/translations/fi/retrieval.js +0 -1
- package/dist/translations/fi/shared.js +0 -1
- package/dist/translations/fi/utility.js +0 -1
- package/dist/translations/fi/viewers.js +0 -5
- package/dist/translations/fi.js +0 -1
- package/dist/translations/fr/agent-tools.js +0 -1
- package/dist/translations/fr/charts.js +0 -1
- package/dist/translations/fr/conversation.js +0 -1
- package/dist/translations/fr/data.js +0 -1
- package/dist/translations/fr/forms.js +0 -1
- package/dist/translations/fr/layout.js +0 -1
- package/dist/translations/fr/media.js +0 -1
- package/dist/translations/fr/overlays.js +0 -1
- package/dist/translations/fr/retrieval.js +0 -1
- package/dist/translations/fr/shared.js +0 -1
- package/dist/translations/fr/utility.js +0 -1
- package/dist/translations/fr/viewers.js +0 -5
- package/dist/translations/fr.js +0 -1
- package/dist/translations/gu/agent-tools.js +0 -1
- package/dist/translations/gu/charts.js +0 -1
- package/dist/translations/gu/conversation.js +0 -1
- package/dist/translations/gu/data.js +0 -1
- package/dist/translations/gu/forms.js +0 -1
- package/dist/translations/gu/layout.js +0 -1
- package/dist/translations/gu/media.js +0 -1
- package/dist/translations/gu/overlays.js +0 -1
- package/dist/translations/gu/retrieval.js +0 -1
- package/dist/translations/gu/shared.js +0 -1
- package/dist/translations/gu/utility.js +0 -1
- package/dist/translations/gu/viewers.js +0 -5
- package/dist/translations/gu.js +0 -1
- package/dist/translations/ha/agent-tools.js +0 -1
- package/dist/translations/ha/charts.js +0 -1
- package/dist/translations/ha/conversation.js +0 -1
- package/dist/translations/ha/data.js +0 -1
- package/dist/translations/ha/forms.js +0 -1
- package/dist/translations/ha/layout.js +0 -1
- package/dist/translations/ha/media.js +0 -1
- package/dist/translations/ha/overlays.js +0 -1
- package/dist/translations/ha/retrieval.js +0 -1
- package/dist/translations/ha/shared.js +0 -1
- package/dist/translations/ha/utility.js +0 -1
- package/dist/translations/ha/viewers.js +0 -5
- package/dist/translations/ha.js +0 -1
- package/dist/translations/he/agent-tools.js +0 -1
- package/dist/translations/he/charts.js +0 -1
- package/dist/translations/he/conversation.js +0 -1
- package/dist/translations/he/data.js +0 -1
- package/dist/translations/he/forms.js +0 -1
- package/dist/translations/he/layout.js +0 -1
- package/dist/translations/he/media.js +0 -1
- package/dist/translations/he/overlays.js +0 -1
- package/dist/translations/he/retrieval.js +0 -1
- package/dist/translations/he/shared.js +0 -1
- package/dist/translations/he/utility.js +0 -1
- package/dist/translations/he/viewers.js +0 -5
- package/dist/translations/he.js +0 -1
- package/dist/translations/hi/agent-tools.js +0 -1
- package/dist/translations/hi/charts.js +0 -1
- package/dist/translations/hi/conversation.js +0 -1
- package/dist/translations/hi/data.js +0 -1
- package/dist/translations/hi/forms.js +0 -1
- package/dist/translations/hi/layout.js +0 -1
- package/dist/translations/hi/media.js +0 -1
- package/dist/translations/hi/overlays.js +0 -1
- package/dist/translations/hi/retrieval.js +0 -1
- package/dist/translations/hi/shared.js +0 -1
- package/dist/translations/hi/utility.js +0 -1
- package/dist/translations/hi/viewers.js +0 -5
- package/dist/translations/hi.js +0 -1
- package/dist/translations/hr/agent-tools.js +0 -1
- package/dist/translations/hr/charts.js +0 -1
- package/dist/translations/hr/conversation.js +0 -1
- package/dist/translations/hr/data.js +0 -1
- package/dist/translations/hr/forms.js +0 -1
- package/dist/translations/hr/layout.js +0 -1
- package/dist/translations/hr/media.js +0 -1
- package/dist/translations/hr/overlays.js +0 -1
- package/dist/translations/hr/retrieval.js +0 -1
- package/dist/translations/hr/shared.js +0 -1
- package/dist/translations/hr/utility.js +0 -1
- package/dist/translations/hr/viewers.js +0 -5
- package/dist/translations/hr.js +0 -1
- package/dist/translations/hu/agent-tools.js +0 -1
- package/dist/translations/hu/charts.js +0 -1
- package/dist/translations/hu/conversation.js +0 -1
- package/dist/translations/hu/data.js +0 -1
- package/dist/translations/hu/forms.js +0 -1
- package/dist/translations/hu/layout.js +0 -1
- package/dist/translations/hu/media.js +0 -1
- package/dist/translations/hu/overlays.js +0 -1
- package/dist/translations/hu/retrieval.js +0 -1
- package/dist/translations/hu/shared.js +0 -1
- package/dist/translations/hu/utility.js +0 -1
- package/dist/translations/hu/viewers.js +0 -5
- package/dist/translations/hu.js +0 -1
- package/dist/translations/id/agent-tools.js +0 -1
- package/dist/translations/id/charts.js +0 -1
- package/dist/translations/id/conversation.js +0 -1
- package/dist/translations/id/data.js +0 -1
- package/dist/translations/id/forms.js +0 -1
- package/dist/translations/id/layout.js +0 -1
- package/dist/translations/id/media.js +0 -1
- package/dist/translations/id/overlays.js +0 -1
- package/dist/translations/id/retrieval.js +0 -1
- package/dist/translations/id/shared.js +0 -1
- package/dist/translations/id/utility.js +0 -1
- package/dist/translations/id/viewers.js +0 -5
- package/dist/translations/id.js +0 -1
- package/dist/translations/ig/agent-tools.js +0 -1
- package/dist/translations/ig/charts.js +0 -1
- package/dist/translations/ig/conversation.js +0 -1
- package/dist/translations/ig/data.js +0 -1
- package/dist/translations/ig/forms.js +0 -1
- package/dist/translations/ig/layout.js +0 -1
- package/dist/translations/ig/media.js +0 -1
- package/dist/translations/ig/overlays.js +0 -1
- package/dist/translations/ig/retrieval.js +0 -1
- package/dist/translations/ig/shared.js +0 -1
- package/dist/translations/ig/utility.js +0 -1
- package/dist/translations/ig/viewers.js +0 -5
- package/dist/translations/ig.js +0 -1
- package/dist/translations/it/agent-tools.js +0 -1
- package/dist/translations/it/charts.js +0 -1
- package/dist/translations/it/conversation.js +0 -1
- package/dist/translations/it/data.js +0 -1
- package/dist/translations/it/forms.js +0 -1
- package/dist/translations/it/layout.js +0 -1
- package/dist/translations/it/media.js +0 -1
- package/dist/translations/it/overlays.js +0 -1
- package/dist/translations/it/retrieval.js +0 -1
- package/dist/translations/it/shared.js +0 -1
- package/dist/translations/it/utility.js +0 -1
- package/dist/translations/it/viewers.js +0 -5
- package/dist/translations/it.js +0 -1
- package/dist/translations/ja/agent-tools.js +0 -1
- package/dist/translations/ja/charts.js +0 -1
- package/dist/translations/ja/conversation.js +0 -1
- package/dist/translations/ja/data.js +0 -1
- package/dist/translations/ja/forms.js +0 -1
- package/dist/translations/ja/layout.js +0 -1
- package/dist/translations/ja/media.js +0 -1
- package/dist/translations/ja/overlays.js +0 -1
- package/dist/translations/ja/retrieval.js +0 -1
- package/dist/translations/ja/shared.js +0 -1
- package/dist/translations/ja/utility.js +0 -1
- package/dist/translations/ja/viewers.js +0 -4
- package/dist/translations/ja.js +0 -1
- package/dist/translations/jv/agent-tools.js +0 -1
- package/dist/translations/jv/charts.js +0 -1
- package/dist/translations/jv/conversation.js +0 -1
- package/dist/translations/jv/data.js +0 -1
- package/dist/translations/jv/forms.js +0 -1
- package/dist/translations/jv/layout.js +0 -1
- package/dist/translations/jv/media.js +0 -1
- package/dist/translations/jv/overlays.js +0 -1
- package/dist/translations/jv/retrieval.js +0 -1
- package/dist/translations/jv/shared.js +0 -1
- package/dist/translations/jv/utility.js +0 -1
- package/dist/translations/jv/viewers.js +0 -5
- package/dist/translations/jv.js +0 -1
- package/dist/translations/kk/agent-tools.js +0 -1
- package/dist/translations/kk/charts.js +0 -1
- package/dist/translations/kk/conversation.js +0 -1
- package/dist/translations/kk/data.js +0 -1
- package/dist/translations/kk/forms.js +0 -1
- package/dist/translations/kk/layout.js +0 -1
- package/dist/translations/kk/media.js +0 -1
- package/dist/translations/kk/overlays.js +0 -1
- package/dist/translations/kk/retrieval.js +0 -1
- package/dist/translations/kk/shared.js +0 -1
- package/dist/translations/kk/utility.js +0 -1
- package/dist/translations/kk/viewers.js +0 -5
- package/dist/translations/kk.js +0 -1
- package/dist/translations/kn/agent-tools.js +0 -1
- package/dist/translations/kn/charts.js +0 -1
- package/dist/translations/kn/conversation.js +0 -1
- package/dist/translations/kn/data.js +0 -1
- package/dist/translations/kn/forms.js +0 -1
- package/dist/translations/kn/layout.js +0 -1
- package/dist/translations/kn/media.js +0 -1
- package/dist/translations/kn/overlays.js +0 -1
- package/dist/translations/kn/retrieval.js +0 -1
- package/dist/translations/kn/shared.js +0 -1
- package/dist/translations/kn/utility.js +0 -1
- package/dist/translations/kn/viewers.js +0 -5
- package/dist/translations/kn.js +0 -1
- package/dist/translations/ko/agent-tools.js +0 -1
- package/dist/translations/ko/charts.js +0 -1
- package/dist/translations/ko/conversation.js +0 -1
- package/dist/translations/ko/data.js +0 -1
- package/dist/translations/ko/forms.js +0 -1
- package/dist/translations/ko/layout.js +0 -1
- package/dist/translations/ko/media.js +0 -1
- package/dist/translations/ko/overlays.js +0 -1
- package/dist/translations/ko/retrieval.js +0 -1
- package/dist/translations/ko/shared.js +0 -1
- package/dist/translations/ko/utility.js +0 -1
- package/dist/translations/ko/viewers.js +0 -5
- package/dist/translations/ko.js +0 -1
- package/dist/translations/ln/agent-tools.js +0 -1
- package/dist/translations/ln/charts.js +0 -1
- package/dist/translations/ln/conversation.js +0 -1
- package/dist/translations/ln/data.js +0 -1
- package/dist/translations/ln/forms.js +0 -1
- package/dist/translations/ln/layout.js +0 -1
- package/dist/translations/ln/media.js +0 -1
- package/dist/translations/ln/overlays.js +0 -1
- package/dist/translations/ln/retrieval.js +0 -1
- package/dist/translations/ln/shared.js +0 -1
- package/dist/translations/ln/utility.js +0 -1
- package/dist/translations/ln/viewers.js +0 -5
- package/dist/translations/ln.js +0 -1
- package/dist/translations/ml/agent-tools.js +0 -1
- package/dist/translations/ml/charts.js +0 -1
- package/dist/translations/ml/conversation.js +0 -1
- package/dist/translations/ml/data.js +0 -1
- package/dist/translations/ml/forms.js +0 -1
- package/dist/translations/ml/layout.js +0 -1
- package/dist/translations/ml/media.js +0 -1
- package/dist/translations/ml/overlays.js +0 -1
- package/dist/translations/ml/retrieval.js +0 -1
- package/dist/translations/ml/shared.js +0 -1
- package/dist/translations/ml/utility.js +0 -1
- package/dist/translations/ml/viewers.js +0 -5
- package/dist/translations/ml.js +0 -1
- package/dist/translations/mr/agent-tools.js +0 -1
- package/dist/translations/mr/charts.js +0 -1
- package/dist/translations/mr/conversation.js +0 -1
- package/dist/translations/mr/data.js +0 -1
- package/dist/translations/mr/forms.js +0 -1
- package/dist/translations/mr/layout.js +0 -1
- package/dist/translations/mr/media.js +0 -1
- package/dist/translations/mr/overlays.js +0 -1
- package/dist/translations/mr/retrieval.js +0 -1
- package/dist/translations/mr/shared.js +0 -1
- package/dist/translations/mr/utility.js +0 -1
- package/dist/translations/mr/viewers.js +0 -5
- package/dist/translations/mr.js +0 -1
- package/dist/translations/ms/agent-tools.js +0 -1
- package/dist/translations/ms/charts.js +0 -1
- package/dist/translations/ms/conversation.js +0 -1
- package/dist/translations/ms/data.js +0 -1
- package/dist/translations/ms/forms.js +0 -1
- package/dist/translations/ms/layout.js +0 -1
- package/dist/translations/ms/media.js +0 -1
- package/dist/translations/ms/overlays.js +0 -1
- package/dist/translations/ms/retrieval.js +0 -1
- package/dist/translations/ms/shared.js +0 -1
- package/dist/translations/ms/utility.js +0 -1
- package/dist/translations/ms/viewers.js +0 -5
- package/dist/translations/ms.js +0 -1
- package/dist/translations/my/agent-tools.js +0 -1
- package/dist/translations/my/charts.js +0 -1
- package/dist/translations/my/conversation.js +0 -1
- package/dist/translations/my/data.js +0 -1
- package/dist/translations/my/forms.js +0 -1
- package/dist/translations/my/layout.js +0 -1
- package/dist/translations/my/media.js +0 -1
- package/dist/translations/my/overlays.js +0 -1
- package/dist/translations/my/retrieval.js +0 -1
- package/dist/translations/my/shared.js +0 -1
- package/dist/translations/my/utility.js +0 -1
- package/dist/translations/my/viewers.js +0 -5
- package/dist/translations/my.js +0 -1
- package/dist/translations/nb/agent-tools.js +0 -1
- package/dist/translations/nb/charts.js +0 -1
- package/dist/translations/nb/conversation.js +0 -1
- package/dist/translations/nb/data.js +0 -1
- package/dist/translations/nb/forms.js +0 -1
- package/dist/translations/nb/layout.js +0 -1
- package/dist/translations/nb/media.js +0 -1
- package/dist/translations/nb/overlays.js +0 -1
- package/dist/translations/nb/retrieval.js +0 -1
- package/dist/translations/nb/shared.js +0 -1
- package/dist/translations/nb/utility.js +0 -1
- package/dist/translations/nb/viewers.js +0 -5
- package/dist/translations/nb.js +0 -1
- package/dist/translations/ne/agent-tools.js +0 -1
- package/dist/translations/ne/charts.js +0 -1
- package/dist/translations/ne/conversation.js +0 -1
- package/dist/translations/ne/data.js +0 -1
- package/dist/translations/ne/forms.js +0 -1
- package/dist/translations/ne/layout.js +0 -1
- package/dist/translations/ne/media.js +0 -1
- package/dist/translations/ne/overlays.js +0 -1
- package/dist/translations/ne/retrieval.js +0 -1
- package/dist/translations/ne/shared.js +0 -1
- package/dist/translations/ne/utility.js +0 -1
- package/dist/translations/ne/viewers.js +0 -5
- package/dist/translations/ne.js +0 -1
- package/dist/translations/nl/agent-tools.js +0 -1
- package/dist/translations/nl/charts.js +0 -1
- package/dist/translations/nl/conversation.js +0 -1
- package/dist/translations/nl/data.js +0 -1
- package/dist/translations/nl/forms.js +0 -1
- package/dist/translations/nl/layout.js +0 -1
- package/dist/translations/nl/media.js +0 -1
- package/dist/translations/nl/overlays.js +0 -1
- package/dist/translations/nl/retrieval.js +0 -1
- package/dist/translations/nl/shared.js +0 -1
- package/dist/translations/nl/utility.js +0 -1
- package/dist/translations/nl/viewers.js +0 -5
- package/dist/translations/nl.js +0 -1
- package/dist/translations/nn/agent-tools.js +0 -1
- package/dist/translations/nn/charts.js +0 -1
- package/dist/translations/nn/conversation.js +0 -1
- package/dist/translations/nn/data.js +0 -1
- package/dist/translations/nn/forms.js +0 -1
- package/dist/translations/nn/layout.js +0 -1
- package/dist/translations/nn/media.js +0 -1
- package/dist/translations/nn/overlays.js +0 -1
- package/dist/translations/nn/retrieval.js +0 -1
- package/dist/translations/nn/shared.js +0 -1
- package/dist/translations/nn/utility.js +0 -1
- package/dist/translations/nn/viewers.js +0 -5
- package/dist/translations/nn.js +0 -1
- package/dist/translations/om/agent-tools.js +0 -1
- package/dist/translations/om/charts.js +0 -1
- package/dist/translations/om/conversation.js +0 -1
- package/dist/translations/om/data.js +0 -1
- package/dist/translations/om/forms.js +0 -1
- package/dist/translations/om/layout.js +0 -1
- package/dist/translations/om/media.js +0 -1
- package/dist/translations/om/overlays.js +0 -1
- package/dist/translations/om/retrieval.js +0 -1
- package/dist/translations/om/shared.js +0 -1
- package/dist/translations/om/utility.js +0 -1
- package/dist/translations/om/viewers.js +0 -5
- package/dist/translations/om.js +0 -1
- package/dist/translations/or/agent-tools.js +0 -1
- package/dist/translations/or/charts.js +0 -1
- package/dist/translations/or/conversation.js +0 -1
- package/dist/translations/or/data.js +0 -1
- package/dist/translations/or/forms.js +0 -1
- package/dist/translations/or/layout.js +0 -1
- package/dist/translations/or/media.js +0 -1
- package/dist/translations/or/overlays.js +0 -1
- package/dist/translations/or/retrieval.js +0 -1
- package/dist/translations/or/shared.js +0 -1
- package/dist/translations/or/utility.js +0 -1
- package/dist/translations/or/viewers.js +0 -5
- package/dist/translations/or.js +0 -1
- package/dist/translations/pa/agent-tools.js +0 -1
- package/dist/translations/pa/charts.js +0 -1
- package/dist/translations/pa/conversation.js +0 -1
- package/dist/translations/pa/data.js +0 -1
- package/dist/translations/pa/forms.js +0 -1
- package/dist/translations/pa/layout.js +0 -1
- package/dist/translations/pa/media.js +0 -1
- package/dist/translations/pa/overlays.js +0 -1
- package/dist/translations/pa/retrieval.js +0 -1
- package/dist/translations/pa/shared.js +0 -1
- package/dist/translations/pa/utility.js +0 -1
- package/dist/translations/pa/viewers.js +0 -5
- package/dist/translations/pa.js +0 -1
- package/dist/translations/pcm/agent-tools.js +0 -1
- package/dist/translations/pcm/charts.js +0 -1
- package/dist/translations/pcm/conversation.js +0 -1
- package/dist/translations/pcm/data.js +0 -1
- package/dist/translations/pcm/forms.js +0 -1
- package/dist/translations/pcm/layout.js +0 -1
- package/dist/translations/pcm/media.js +0 -1
- package/dist/translations/pcm/overlays.js +0 -1
- package/dist/translations/pcm/retrieval.js +0 -1
- package/dist/translations/pcm/shared.js +0 -1
- package/dist/translations/pcm/utility.js +0 -1
- package/dist/translations/pcm/viewers.js +0 -5
- package/dist/translations/pcm.js +0 -1
- package/dist/translations/pl/agent-tools.js +0 -1
- package/dist/translations/pl/charts.js +0 -1
- package/dist/translations/pl/conversation.js +0 -1
- package/dist/translations/pl/data.js +0 -1
- package/dist/translations/pl/forms.js +0 -1
- package/dist/translations/pl/layout.js +0 -1
- package/dist/translations/pl/media.js +0 -1
- package/dist/translations/pl/overlays.js +0 -1
- package/dist/translations/pl/retrieval.js +0 -1
- package/dist/translations/pl/shared.js +0 -1
- package/dist/translations/pl/utility.js +0 -1
- package/dist/translations/pl/viewers.js +0 -5
- package/dist/translations/pl.js +0 -1
- package/dist/translations/pnb/agent-tools.js +0 -1
- package/dist/translations/pnb/charts.js +0 -1
- package/dist/translations/pnb/conversation.js +0 -1
- package/dist/translations/pnb/data.js +0 -1
- package/dist/translations/pnb/forms.js +0 -1
- package/dist/translations/pnb/layout.js +0 -1
- package/dist/translations/pnb/media.js +0 -1
- package/dist/translations/pnb/overlays.js +0 -1
- package/dist/translations/pnb/retrieval.js +0 -1
- package/dist/translations/pnb/shared.js +0 -1
- package/dist/translations/pnb/utility.js +0 -1
- package/dist/translations/pnb/viewers.js +0 -5
- package/dist/translations/pnb.js +0 -1
- package/dist/translations/ps/agent-tools.js +0 -1
- package/dist/translations/ps/charts.js +0 -1
- package/dist/translations/ps/conversation.js +0 -1
- package/dist/translations/ps/data.js +0 -1
- package/dist/translations/ps/forms.js +0 -1
- package/dist/translations/ps/layout.js +0 -1
- package/dist/translations/ps/media.js +0 -1
- package/dist/translations/ps/overlays.js +0 -1
- package/dist/translations/ps/retrieval.js +0 -1
- package/dist/translations/ps/shared.js +0 -1
- package/dist/translations/ps/utility.js +0 -1
- package/dist/translations/ps/viewers.js +0 -5
- package/dist/translations/ps.js +0 -1
- package/dist/translations/pt-BR/agent-tools.js +0 -1
- package/dist/translations/pt-BR/charts.js +0 -1
- package/dist/translations/pt-BR/conversation.js +0 -1
- package/dist/translations/pt-BR/data.js +0 -1
- package/dist/translations/pt-BR/forms.js +0 -1
- package/dist/translations/pt-BR/layout.js +0 -1
- package/dist/translations/pt-BR/media.js +0 -1
- package/dist/translations/pt-BR/overlays.js +0 -1
- package/dist/translations/pt-BR/retrieval.js +0 -1
- package/dist/translations/pt-BR/shared.js +0 -1
- package/dist/translations/pt-BR/utility.js +0 -1
- package/dist/translations/pt-BR/viewers.js +0 -5
- package/dist/translations/pt-BR.js +0 -1
- package/dist/translations/pt-PT/agent-tools.js +0 -1
- package/dist/translations/pt-PT/charts.js +0 -1
- package/dist/translations/pt-PT/conversation.js +0 -1
- package/dist/translations/pt-PT/data.js +0 -1
- package/dist/translations/pt-PT/forms.js +0 -1
- package/dist/translations/pt-PT/layout.js +0 -1
- package/dist/translations/pt-PT/media.js +0 -1
- package/dist/translations/pt-PT/overlays.js +0 -1
- package/dist/translations/pt-PT/retrieval.js +0 -1
- package/dist/translations/pt-PT/shared.js +0 -1
- package/dist/translations/pt-PT/utility.js +0 -1
- package/dist/translations/pt-PT/viewers.js +0 -5
- package/dist/translations/pt-PT.js +0 -1
- package/dist/translations/ro/agent-tools.js +0 -1
- package/dist/translations/ro/charts.js +0 -1
- package/dist/translations/ro/conversation.js +0 -1
- package/dist/translations/ro/data.js +0 -1
- package/dist/translations/ro/forms.js +0 -1
- package/dist/translations/ro/layout.js +0 -1
- package/dist/translations/ro/media.js +0 -1
- package/dist/translations/ro/overlays.js +0 -1
- package/dist/translations/ro/retrieval.js +0 -1
- package/dist/translations/ro/shared.js +0 -1
- package/dist/translations/ro/utility.js +0 -1
- package/dist/translations/ro/viewers.js +0 -5
- package/dist/translations/ro.js +0 -1
- package/dist/translations/ru/agent-tools.js +0 -1
- package/dist/translations/ru/charts.js +0 -1
- package/dist/translations/ru/conversation.js +0 -1
- package/dist/translations/ru/data.js +0 -1
- package/dist/translations/ru/forms.js +0 -1
- package/dist/translations/ru/layout.js +0 -1
- package/dist/translations/ru/media.js +0 -1
- package/dist/translations/ru/overlays.js +0 -1
- package/dist/translations/ru/retrieval.js +0 -1
- package/dist/translations/ru/shared.js +0 -1
- package/dist/translations/ru/utility.js +0 -1
- package/dist/translations/ru/viewers.js +0 -5
- package/dist/translations/ru.js +0 -1
- package/dist/translations/sd/agent-tools.js +0 -1
- package/dist/translations/sd/charts.js +0 -1
- package/dist/translations/sd/conversation.js +0 -1
- package/dist/translations/sd/data.js +0 -1
- package/dist/translations/sd/forms.js +0 -1
- package/dist/translations/sd/layout.js +0 -1
- package/dist/translations/sd/media.js +0 -1
- package/dist/translations/sd/overlays.js +0 -1
- package/dist/translations/sd/retrieval.js +0 -1
- package/dist/translations/sd/shared.js +0 -1
- package/dist/translations/sd/utility.js +0 -1
- package/dist/translations/sd/viewers.js +0 -5
- package/dist/translations/sd.js +0 -1
- package/dist/translations/sl/agent-tools.js +0 -1
- package/dist/translations/sl/charts.js +0 -1
- package/dist/translations/sl/conversation.js +0 -1
- package/dist/translations/sl/data.js +0 -1
- package/dist/translations/sl/forms.js +0 -1
- package/dist/translations/sl/layout.js +0 -1
- package/dist/translations/sl/media.js +0 -1
- package/dist/translations/sl/overlays.js +0 -1
- package/dist/translations/sl/retrieval.js +0 -1
- package/dist/translations/sl/shared.js +0 -1
- package/dist/translations/sl/utility.js +0 -1
- package/dist/translations/sl/viewers.js +0 -5
- package/dist/translations/sl.js +0 -1
- package/dist/translations/su/agent-tools.js +0 -1
- package/dist/translations/su/charts.js +0 -1
- package/dist/translations/su/conversation.js +0 -1
- package/dist/translations/su/data.js +0 -1
- package/dist/translations/su/forms.js +0 -1
- package/dist/translations/su/layout.js +0 -1
- package/dist/translations/su/media.js +0 -1
- package/dist/translations/su/overlays.js +0 -1
- package/dist/translations/su/retrieval.js +0 -1
- package/dist/translations/su/shared.js +0 -1
- package/dist/translations/su/utility.js +0 -1
- package/dist/translations/su/viewers.js +0 -5
- package/dist/translations/su.js +0 -1
- package/dist/translations/sv/agent-tools.js +0 -1
- package/dist/translations/sv/charts.js +0 -1
- package/dist/translations/sv/conversation.js +0 -1
- package/dist/translations/sv/data.js +0 -1
- package/dist/translations/sv/forms.js +0 -1
- package/dist/translations/sv/layout.js +0 -1
- package/dist/translations/sv/media.js +0 -1
- package/dist/translations/sv/overlays.js +0 -1
- package/dist/translations/sv/retrieval.js +0 -1
- package/dist/translations/sv/shared.js +0 -1
- package/dist/translations/sv/utility.js +0 -1
- package/dist/translations/sv/viewers.js +0 -5
- package/dist/translations/sv.js +0 -1
- package/dist/translations/sw/agent-tools.js +0 -1
- package/dist/translations/sw/charts.js +0 -1
- package/dist/translations/sw/conversation.js +0 -1
- package/dist/translations/sw/data.js +0 -1
- package/dist/translations/sw/forms.js +0 -1
- package/dist/translations/sw/layout.js +0 -1
- package/dist/translations/sw/media.js +0 -1
- package/dist/translations/sw/overlays.js +0 -1
- package/dist/translations/sw/retrieval.js +0 -1
- package/dist/translations/sw/shared.js +0 -1
- package/dist/translations/sw/utility.js +0 -1
- package/dist/translations/sw/viewers.js +0 -5
- package/dist/translations/sw.js +0 -1
- package/dist/translations/ta/agent-tools.js +0 -1
- package/dist/translations/ta/charts.js +0 -1
- package/dist/translations/ta/conversation.js +0 -1
- package/dist/translations/ta/data.js +0 -1
- package/dist/translations/ta/forms.js +0 -1
- package/dist/translations/ta/layout.js +0 -1
- package/dist/translations/ta/media.js +0 -1
- package/dist/translations/ta/overlays.js +0 -1
- package/dist/translations/ta/retrieval.js +0 -1
- package/dist/translations/ta/shared.js +0 -1
- package/dist/translations/ta/utility.js +0 -1
- package/dist/translations/ta/viewers.js +0 -5
- package/dist/translations/ta.js +0 -1
- package/dist/translations/te/agent-tools.js +0 -1
- package/dist/translations/te/charts.js +0 -1
- package/dist/translations/te/conversation.js +0 -1
- package/dist/translations/te/data.js +0 -1
- package/dist/translations/te/forms.js +0 -1
- package/dist/translations/te/layout.js +0 -1
- package/dist/translations/te/media.js +0 -1
- package/dist/translations/te/overlays.js +0 -1
- package/dist/translations/te/retrieval.js +0 -1
- package/dist/translations/te/shared.js +0 -1
- package/dist/translations/te/utility.js +0 -1
- package/dist/translations/te/viewers.js +0 -5
- package/dist/translations/te.js +0 -1
- package/dist/translations/th/agent-tools.js +0 -1
- package/dist/translations/th/charts.js +0 -1
- package/dist/translations/th/conversation.js +0 -1
- package/dist/translations/th/data.js +0 -1
- package/dist/translations/th/forms.js +0 -1
- package/dist/translations/th/layout.js +0 -1
- package/dist/translations/th/media.js +0 -1
- package/dist/translations/th/overlays.js +0 -1
- package/dist/translations/th/retrieval.js +0 -1
- package/dist/translations/th/shared.js +0 -1
- package/dist/translations/th/utility.js +0 -1
- package/dist/translations/th/viewers.js +0 -5
- package/dist/translations/th.js +0 -1
- package/dist/translations/tl/agent-tools.js +0 -1
- package/dist/translations/tl/charts.js +0 -1
- package/dist/translations/tl/conversation.js +0 -1
- package/dist/translations/tl/data.js +0 -1
- package/dist/translations/tl/forms.js +0 -1
- package/dist/translations/tl/layout.js +0 -1
- package/dist/translations/tl/media.js +0 -1
- package/dist/translations/tl/overlays.js +0 -1
- package/dist/translations/tl/retrieval.js +0 -1
- package/dist/translations/tl/shared.js +0 -1
- package/dist/translations/tl/utility.js +0 -1
- package/dist/translations/tl/viewers.js +0 -5
- package/dist/translations/tl.js +0 -1
- package/dist/translations/tr/agent-tools.js +0 -1
- package/dist/translations/tr/charts.js +0 -1
- package/dist/translations/tr/conversation.js +0 -1
- package/dist/translations/tr/data.js +0 -1
- package/dist/translations/tr/forms.js +0 -1
- package/dist/translations/tr/layout.js +0 -1
- package/dist/translations/tr/media.js +0 -1
- package/dist/translations/tr/overlays.js +0 -1
- package/dist/translations/tr/retrieval.js +0 -1
- package/dist/translations/tr/shared.js +0 -1
- package/dist/translations/tr/utility.js +0 -1
- package/dist/translations/tr/viewers.js +0 -5
- package/dist/translations/tr.js +0 -1
- package/dist/translations/uk/agent-tools.js +0 -1
- package/dist/translations/uk/charts.js +0 -1
- package/dist/translations/uk/conversation.js +0 -1
- package/dist/translations/uk/data.js +0 -1
- package/dist/translations/uk/forms.js +0 -1
- package/dist/translations/uk/layout.js +0 -1
- package/dist/translations/uk/media.js +0 -1
- package/dist/translations/uk/overlays.js +0 -1
- package/dist/translations/uk/retrieval.js +0 -1
- package/dist/translations/uk/shared.js +0 -1
- package/dist/translations/uk/utility.js +0 -1
- package/dist/translations/uk/viewers.js +0 -5
- package/dist/translations/uk.js +0 -1
- package/dist/translations/ur/agent-tools.js +0 -1
- package/dist/translations/ur/charts.js +0 -1
- package/dist/translations/ur/conversation.js +0 -1
- package/dist/translations/ur/data.js +0 -1
- package/dist/translations/ur/forms.js +0 -1
- package/dist/translations/ur/layout.js +0 -1
- package/dist/translations/ur/media.js +0 -1
- package/dist/translations/ur/overlays.js +0 -1
- package/dist/translations/ur/retrieval.js +0 -1
- package/dist/translations/ur/shared.js +0 -1
- package/dist/translations/ur/utility.js +0 -1
- package/dist/translations/ur/viewers.js +0 -5
- package/dist/translations/ur.js +0 -1
- package/dist/translations/uz/agent-tools.js +0 -1
- package/dist/translations/uz/charts.js +0 -1
- package/dist/translations/uz/conversation.js +0 -1
- package/dist/translations/uz/data.js +0 -1
- package/dist/translations/uz/forms.js +0 -1
- package/dist/translations/uz/layout.js +0 -1
- package/dist/translations/uz/media.js +0 -1
- package/dist/translations/uz/overlays.js +0 -1
- package/dist/translations/uz/retrieval.js +0 -1
- package/dist/translations/uz/shared.js +0 -1
- package/dist/translations/uz/utility.js +0 -1
- package/dist/translations/uz/viewers.js +0 -5
- package/dist/translations/uz.js +0 -1
- package/dist/translations/vi/agent-tools.js +0 -1
- package/dist/translations/vi/charts.js +0 -1
- package/dist/translations/vi/conversation.js +0 -1
- package/dist/translations/vi/data.js +0 -1
- package/dist/translations/vi/forms.js +0 -1
- package/dist/translations/vi/layout.js +0 -1
- package/dist/translations/vi/media.js +0 -1
- package/dist/translations/vi/overlays.js +0 -1
- package/dist/translations/vi/retrieval.js +0 -1
- package/dist/translations/vi/shared.js +0 -1
- package/dist/translations/vi/utility.js +0 -1
- package/dist/translations/vi/viewers.js +0 -5
- package/dist/translations/vi.js +0 -1
- package/dist/translations/yo/agent-tools.js +0 -1
- package/dist/translations/yo/charts.js +0 -1
- package/dist/translations/yo/conversation.js +0 -1
- package/dist/translations/yo/data.js +0 -1
- package/dist/translations/yo/forms.js +0 -1
- package/dist/translations/yo/layout.js +0 -1
- package/dist/translations/yo/media.js +0 -1
- package/dist/translations/yo/overlays.js +0 -1
- package/dist/translations/yo/retrieval.js +0 -1
- package/dist/translations/yo/shared.js +0 -1
- package/dist/translations/yo/utility.js +0 -1
- package/dist/translations/yo/viewers.js +0 -5
- package/dist/translations/yo.js +0 -1
- package/dist/translations/zh-CN/agent-tools.js +0 -1
- package/dist/translations/zh-CN/charts.js +0 -1
- package/dist/translations/zh-CN/conversation.js +0 -1
- package/dist/translations/zh-CN/data.js +0 -1
- package/dist/translations/zh-CN/forms.js +0 -1
- package/dist/translations/zh-CN/layout.js +0 -1
- package/dist/translations/zh-CN/media.js +0 -1
- package/dist/translations/zh-CN/overlays.js +0 -1
- package/dist/translations/zh-CN/retrieval.js +0 -1
- package/dist/translations/zh-CN/shared.js +0 -1
- package/dist/translations/zh-CN/utility.js +0 -1
- package/dist/translations/zh-CN/viewers.js +0 -5
- package/dist/translations/zh-CN.js +0 -1
- package/dist/translations/zh-TW/agent-tools.js +0 -1
- package/dist/translations/zh-TW/charts.js +0 -1
- package/dist/translations/zh-TW/conversation.js +0 -1
- package/dist/translations/zh-TW/data.js +0 -1
- package/dist/translations/zh-TW/forms.js +0 -1
- package/dist/translations/zh-TW/layout.js +0 -1
- package/dist/translations/zh-TW/media.js +0 -1
- package/dist/translations/zh-TW/overlays.js +0 -1
- package/dist/translations/zh-TW/retrieval.js +0 -1
- package/dist/translations/zh-TW/shared.js +0 -1
- package/dist/translations/zh-TW/utility.js +0 -1
- package/dist/translations/zh-TW/viewers.js +0 -5
- package/dist/translations/zh-TW.js +0 -1
- package/dist/translations/zu/agent-tools.js +0 -1
- package/dist/translations/zu/charts.js +0 -1
- package/dist/translations/zu/conversation.js +0 -1
- package/dist/translations/zu/data.js +0 -1
- package/dist/translations/zu/forms.js +0 -1
- package/dist/translations/zu/layout.js +0 -1
- package/dist/translations/zu/media.js +0 -1
- package/dist/translations/zu/overlays.js +0 -1
- package/dist/translations/zu/retrieval.js +0 -1
- package/dist/translations/zu/shared.js +0 -1
- package/dist/translations/zu/utility.js +0 -1
- package/dist/translations/zu/viewers.js +0 -5
- package/dist/translations/zu.js +0 -1
- package/vscode-css-data.json +0 -1
- package/vscode-html-data.json +0 -1
- package/web-types.json +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import{VOID_HTML_TAGS,camelCase,commentRanges,finalizeEdits,findTagEnd,kebabCase,lineStarts,localMigrationKey,locationAt,memberStyle,moduleSpecifierContext,parseNamedModuleBindings,parseTagAttributes,regexEscape,reportEntry,scanAllOpeningTags,scanLocalMigrationHazards,serializeLocalDefault,skipBalanced}from"./migration-analysis.mjs";import{invariant}from"./migration-contract.mjs";import{htmlCommentEnd}from"./html-comments.mjs";const RENAME_REVIEW="RENAME_REVIEW",RENAME_TARGET_SHARED_REVIEW="RENAME_TARGET_SHARED_REVIEW",NAME_GAINED_OWNER_REVIEW="NAME_GAINED_OWNER_REVIEW",POLARITY_REVIEW="POLARITY_REVIEW",DETAIL_SHAPE_REVIEW="DETAIL_SHAPE_REVIEW",DETAIL_FIELD_REVIEW="DETAIL_FIELD_REVIEW",DEPRECATED_MEMBER_REVIEW="DEPRECATED_MEMBER_REVIEW",DEPRECATED_CONTENT_REVIEW="DEPRECATED_CONTENT_REVIEW",RENAME_CONFLICT_REVIEW="RENAME_CONFLICT_REVIEW",UNUSED_ACKNOWLEDGEMENT="UNUSED_ACKNOWLEDGEMENT",REVIEW_ACKNOWLEDGEMENT=/lyra-migrate-reviewed:\s*([^\n]*)/g,ACKNOWLEDGEMENT_TOKEN=/^([A-Z][A-Z0-9_]*):(\S+)$/,DEFAULT_SLOT_LABEL="#default",LISTENER_CALL_BEFORE=/(?:\b(?:add|remove)EventListener|\bHostListener)\s*\(\s*$/,LISTENER_RECEIVER_BEFORE=/([A-Za-z_$][\w$]*(?:\s*(?:\?\.|\.)\s*#?[A-Za-z_$][\w$]*|\s*\([^()\n]*\)|\s*!(?!=))*)\s*(?:\?\.|\.)\s*(?:add|remove)EventListener\s*\(\s*$/,LISTENER_HANDLER_AFTER=/^\s*,\s*([A-Za-z_$][\w$]*(?:\s*(?:\?\.|\.)\s*#?[A-Za-z_$][\w$]*)*)\s*[,)]/,EVENT_CONSTRUCTION=/\bnew\s+(?:CustomEvent|Event)\s*(?:<[^>\n]+>)?\(\s*(['"`])(lr-[a-z0-9]+(?:-[a-z0-9]+)*)\1/g,TAG_API_CALL_BEFORE=/(?:\b(?:createElement|querySelector(?:All)?|closest|matches|unsafeStatic|literal)|\bcustomElements\s*\.\s*(?:get|whenDefined|define))\s*(?:<[^>\n]+>)?\(\s*$/,ANCHORED_MEMBER=/\b(?:querySelector|closest|createElement)\s*(?:<[^>\n]+>)?\(\s*(['"`])(lr-[a-z0-9]+(?:-[a-z0-9]+)*)\1\s*\)\s*!?\s*(?:\?\.|\.)\s*([A-Za-z_$][\w$]*)/g,ATTRIBUTE_METHODS=new Set(["setAttribute","getAttribute","hasAttribute","removeAttribute","toggleAttribute"]),LISTENER_METHODS=new Set(["addEventListener","removeEventListener"]),STYLESHEET_FILE=/\.(?:css|scss|sass|less|pcss|styl)$/i,MARKUP_FILE=/\.(?:html?|xhtml|md|markdown|vue|svelte)$/i,ATTRIBUTE_SEMANTICS_FILE=/\.(?:html?|xhtml|md|markdown)$/i,LIT_TEMPLATE_FILE=/\.(?:[cm]?[jt]s)$/i,SELECTOR_LOOKBEHIND=256,ackName=member=>member===""?DEFAULT_SLOT_LABEL:String(member);function mergeRanges(ranges){const merged=[];for(const[start,end]of[...ranges].sort((left,right)=>left[0]-right[0])){const last=merged.at(-1);last&&start<=last[1]?last[1]=Math.max(last[1],end):merged.push([start,end])}return merged}function rangeTester(merged){return offset=>{let low=0,high=merged.length-1;for(;low<=high;){const middle=low+high>>1;if(merged[middle][1]<=offset)low=middle+1;else if(merged[middle][0]>offset)high=middle-1;else return!0}return!1}}function templateLiteralEnd(text,open){let index=open+1;for(;index<text.length;){const character=text[index];if(character==="\\")index+=2;else{if(character==="`")return index+1;character==="$"&&text[index+1]==="{"?index=templateExpressionEnd(text,index+2):index+=1}}return text.length}function templateExpressionEnd(text,index){let depth=1;for(;index<text.length;){const character=text[index];if(character==="`"){index=templateLiteralEnd(text,index);continue}if(character==='"'||character==="'"){for(index+=1;index<text.length&&text[index]!==character&&text[index]!==`
|
|
2
2
|
`;)index+=text[index]==="\\"?2:1;index+=1;continue}if(character==="{")depth+=1;else if(character==="}"&&--depth===0)return index+1;index+=1}return text.length}function templateLiteralRanges(text,inComment){const ranges=[];let index=0;for(;index<text.length;){const character=text[index];if(inComment(index))index+=1;else if(character==="`"){const end=templateLiteralEnd(text,index);ranges.push([index,end]),index=end}else if(character==='"'||character==="'"){for(index+=1;index<text.length&&text[index]!==character&&text[index]!==`
|
|
3
3
|
`;)index+=text[index]==="\\"?2:1;index+=1}else index+=1}return ranges}function taggedTemplateRanges(text,tags,inComment){const ranges=[];for(const match of text.matchAll(new RegExp(`\\b(?:${tags.join("|")})\\s*\``,"g"))){if(inComment(match.index))continue;const open=match.index+match[0].length-1;ranges.push([open,templateLiteralEnd(text,open)])}return mergeRanges(ranges)}function renameIgnoredRanges(text,file){const base=mergeRanges(commentRanges(text)),inBase=rangeTester(base),extra=[],addHtmlComments=(start,end)=>{let index=text.indexOf("<!--",start);for(;index>=0&&index<end;){const finish=htmlCommentEnd(text,index,end);inBase(index)||extra.push([index,finish]),index=text.indexOf("<!--",finish)}};if(MARKUP_FILE.test(file))addHtmlComments(0,text.length);else if(!STYLESHEET_FILE.test(file))for(const[start,end]of templateLiteralRanges(text,inBase))addHtmlComments(start,end);return mergeRanges([...base,...extra])}function scanReviewAcknowledgements(text,ignoredRanges,starts,openingTokens){const tokenAt=new Map(openingTokens.map(token=>[token.start,token])),records=[],byLine=new Map,cover=(line,record)=>{const list=byLine.get(line)??[];list.includes(record)||list.push(record),byLine.set(line,list)};for(const[start,end]of ignoredRanges){const body=text.slice(start,end);if(!body.includes("lyra-migrate-reviewed:"))continue;const firstLine=locationAt(starts,start).line,lastLine=locationAt(starts,Math.max(start,end-1)).line;let next=end;for(;next<text.length&&/[\s}]/.test(text[next]);)next+=1;const followingTag=tokenAt.get(next),standalone=/^\s*\{?\s*$/.test(text.slice(starts[firstLine-1],start));for(const match of body.matchAll(REVIEW_ACKNOWLEDGEMENT)){const tokens=match[1].replace(/(?:\*\/|--!?>)[\s\S]*$/,"").split(/[\s,]+/).filter(Boolean),record={offset:start+match.index,entries:tokens.map(token=>{const parsed=ACKNOWLEDGEMENT_TOKEN.exec(token);return{token,code:parsed?.[1]??null,name:parsed?.[2]??null,used:!1}})};records.push(record);for(let line=firstLine;line<=lastLine;line+=1)cover(line,record);if(standalone&&cover(lastLine+1,record),followingTag){const tagLast=locationAt(starts,followingTag.end).line;for(let line=locationAt(starts,followingTag.start).line;line<=tagLast;line+=1)cover(line,record)}}}return{consume(line,code,member){const name=ackName(member);for(const record of byLine.get(line)??[]){const entry=record.entries.find(candidate=>candidate.code===code&&candidate.name===name);if(entry)return entry.used=!0,!0}return!1},unused:()=>records.flatMap(record=>record.entries.filter(entry=>!entry.used).map(entry=>({offset:record.offset,entry})))}}function quotedStringRanges(text,inComment){const ranges=[];let index=0;for(;index<text.length;){const quote=text[index];if(inComment(index)||quote!=='"'&"e!=="'"&"e!=="`"){index+=1;continue}const start=index;for(index+=1;index<text.length&&text[index]!==quote&&(quote==="`"||text[index]!==`
|
|
4
|
-
`);)text[index]==="\\"&&(index+=1),index+=1;index+=1,quote!=="`"&&ranges.push([start,index])}return ranges}function stylesheetRanges(text,file,inComment){if(STYLESHEET_FILE.test(file))return[[0,text.length]];const ranges=[];for(const match of text.matchAll(/<style(?:\s[^>]*)?>[\s\S]*?<\/style\s*>/gi))ranges.push([match.index,match.index+match[0].length]);return mergeRanges([...ranges,...taggedTemplateRanges(text,["css"],inComment)])}function compoundTypeBefore(text,index){let start=index,brackets=0,parens=0;const limit=Math.max(0,index-SELECTOR_LOOKBEHIND);for(;start>limit;){const character=text[start-1];if(character==="]")brackets+=1;else if(character==="["){if(brackets===0)break;brackets-=1}else if(character===")")parens+=1;else if(character==="("){if(parens===0)break;parens-=1}else if(brackets===0&&parens===0&&/[\s,>+~{};'"`]/.test(character))break;start-=1}if(start===limit&&limit>0)return null;const compound=text.slice(start,index);return(/^:global\(\s*([A-Za-z][\w-]*)\s*\)$/.exec(compound)??/^([A-Za-z][\w-]*)/.exec(compound))?.[1].toLowerCase()??null}function mentionedTags(text,tags,inComment){const found=new Set;for(const tag of tags)for(const match of text.matchAll(new RegExp(`(?<![\\w-])${tag}(?![\\w-])`,"g")))if(!inComment(match.index)){found.add(tag);break}return found}function elementPairs(text,tag,inComment){const pairs=[],stack=[];for(const match of text.matchAll(new RegExp(`<(/)?${tag}(?=[\\s/>])`,"g"))){if(inComment(match.index))continue;const end=findTagEnd(text,match.index+match[0].length);if(!(end<0))if(match[1]){const opening=stack.pop();opening&&pairs.push({opening,closingStart:match.index})}else/\/\s*>$/.test(text.slice(match.index,end+1))||stack.push({start:match.index,end})}return pairs}function directChildTokens(text,start,end,inComment){const children=[],stack=[],pattern=/<(\/)?([A-Za-z][\w.:-]*)(?=[\s/>])/g;pattern.lastIndex=start;for(let match=pattern.exec(text);match&&match.index<end;match=pattern.exec(text)){if(inComment(match.index))continue;const tokenEnd=findTagEnd(text,match.index+match[0].length);if(tokenEnd<0||tokenEnd>=end)break;const name=match[2].toLowerCase();if(match[1]){const index=stack.lastIndexOf(name);index>=0&&(stack.length=index)}else{const nameStart=match.index+1;stack.length===0&&children.push({tag:name,start:match.index,nameStart,nameEnd:nameStart+match[2].length,end:tokenEnd}),!/\/\s*>$/.test(text.slice(match.index,tokenEnd+1))&&!VOID_HTML_TAGS.has(name)&&stack.push(name)}pattern.lastIndex=tokenEnd+1}return children}function openingTagBraceGroups(text,token){const groups=[];let index=token.nameEnd,quote=null;for(;index<token.end;){const character=text[index];if(quote){character==="\\"?index+=1:character===quote&&(quote=null),index+=1;continue}if(character==='"'||character==="'")quote=character;else if(character==="{"){const end=skipBalanced(text,index,"{","}");!/=\s*$/.test(text.slice(token.nameEnd,index))&&text[index-1]!=="$"&&groups.push({start:index,end,body:text.slice(index+1,end-1).trim()}),index=end;continue}index+=1}return groups}function markupEventName(rawName){if(/^\(lr-[a-z0-9-]+\)$/.test(rawName))return{name:rawName.slice(1,-1),offset:1};if(/^onlr-/.test(rawName))return{name:rawName.slice(2).replace(/Capture$/,""),offset:2};for(const[prefix,separator]of[["@","."],["v-on:","."],["on:","|"]])if(rawName.startsWith(prefix))return{name:rawName.slice(prefix.length).split(separator)[0],offset:prefix.length};return null}function markupMemberBinding(attribute){const raw=attribute.rawName;let match;if(raw.startsWith("?"))return{form:"attribute",offset:1,name:raw.slice(1),dynamic:!0};if(match=/^\[attr\.([^\]]+)\]$/.exec(raw))return{form:"attribute",offset:6,name:match[1],dynamic:!0};if(match=/^\[([A-Za-z_$][\w$]*)\]$/.exec(raw))return{form:"property",offset:1,name:match[1],dynamic:!0};if(raw.startsWith("."))return{form:"property",offset:1,name:raw.slice(1),dynamic:!0};if(raw.startsWith("bind:"))return{form:"property",offset:5,name:raw.slice(5).split("|")[0],dynamic:!0};for(const prefix of["v-bind:",":"])if(raw.startsWith(prefix))return{form:"member",offset:prefix.length,name:raw.slice(prefix.length).split(".")[0],dynamic:!0};if(!/^[A-Za-z][\w-]*$/.test(raw)||/^onlr-/.test(raw))return null;const dynamic=attribute.valueKind==="expression"||/\$\{|\{\{/.test(attribute.value??"");return{form:/[A-Z]/.test(raw)?"property":"attribute",offset:0,name:raw,dynamic}}function attributeEnd(text,attribute){if(attribute.valueEnd===null)return attribute.nameEnd;const quote=text[attribute.valueStart-1];return(quote==='"'||quote==="'")&&text[attribute.valueEnd]===quote?attribute.valueEnd+1:attribute.valueEnd}function boundMemberNames(attributes){const names=new Set;for(const attribute of attributes){const binding=markupMemberBinding(attribute);binding&&names.add(kebabCase(binding.name))}return names}function sortReportEntries(entries,codeKey){return entries.sort((left,right)=>left.line-right.line||left.column-right.column||String(left[codeKey]).localeCompare(String(right[codeKey])))}function reportModuleReviews(text,file,reviews,openingTokens,inComment,warn){if(!reviews.length)return;const packageName="@aceshooting/lyra-ui",specifierOf=subpath=>`${packageName}${subpath.slice(1)}`,named=reviews.filter(entry=>["function","type","constant","class"].includes(entry.kind)),report=(offset,review,context="")=>warn(offset,{member:review.name,code:"DEPRECATED_MODULE_REVIEW",target:review.replacement,message:`${context}${review.kind} ${review.module?`${review.module}#`:""}${review.name} ${review.removedIn?`was removed in ${review.removedIn}`:`is deprecated and scheduled for removal in ${review.removalNotBefore}`}; review ${review.replacement}.`}),namedFor=specifier=>named.filter(entry=>specifier===packageName||specifier===specifierOf(entry.module)),strings=quotedStringRanges(text,inComment),templates=templateLiteralRanges(text,inComment),stringStarts=new Set([...strings,...templates.filter(([start,end])=>!text.slice(start,end).includes("${"))].map(([start])=>start)),inString=rangeTester(strings),inLiteral=rangeTester(mergeRanges([...strings,...templates])),inCss=rangeTester(stylesheetRanges(text,file,inComment)),inMarkup=offset=>openingTokens.some(token=>offset>=token.nameEnd&&offset<token.end),opaque=(offset,specifier,entries)=>{entries.length&&warn(offset,{member:specifier,code:"MODULE_NAMESPACE_REVIEW",target:[...new Set(entries.map(entry=>entry.replacement))].join("; "),message:`Review the namespace or dynamic import of ${specifier} for deprecated exports ${entries.map(entry=>entry.name).join(", ")}. They cannot be safely renamed through aliases; the earliest removal is ${entries.map(entry=>entry.removalNotBefore).sort()[0]}.`})},bindings=/\b(?:import|export)\s+(?:type\s+)?(?:[$A-Z_a-z][$\w]*\s*,\s*)?\{(?<bindings>[^{};]*)\}\s*from\s*(?<quote>['"])(?<source>@aceshooting\/lyra-ui(?:\/[^'"\s]+)?)\k<quote>/g,handledSpecifiers=new Set;for(const match of text.matchAll(bindings)){if(inComment(match.index)||inLiteral(match.index))continue;const available=namedFor(match.groups.source),bodyStart=match.index+match[0].indexOf("{")+1;for(const binding of parseNamedModuleBindings(match.groups.bindings)){const review=available.find(entry=>entry.name===binding.imported);if(!review)continue;const member=[...match.groups.bindings.matchAll(new RegExp(`(?<![$\\w])${regexEscape(binding.imported)}(?![$\\w])`,"g"))].find(candidate=>!inComment(bodyStart+candidate.index));member&&report(bodyStart+member.index,review)}handledSpecifiers.add(match.index+match[0].lastIndexOf(match.groups.source)-1)}for(const match of text.matchAll(/(['"])(@aceshooting\/lyra-ui(?:\/[^'"\s]+)?)\1/g)){if(inComment(match.index))continue;const markup=inMarkup(match.index),css=inCss(match.index);if(!stringStarts.has(match.index)&&!markup&&!css)continue;const before=text.slice(Math.max(0,match.index-500),match.index),context=moduleSpecifierContext(text,match.index),cssImport=css&&/@import\s+(?:url\(\s*)?$/.test(before),resource=markup&&/\b(?:href|src)\s*=\s*$/.test(before);if(!context&&!cssImport&&!resource)continue;const specifier=match[2];for(const review of reviews)(review.kind==="entry-point"||review.kind==="stylesheet")&&specifier===specifierOf(review.name)&&report(match.index+1,review);if(handledSpecifiers.has(match.index)||!context||context.sideEffect)continue;const available=namedFor(specifier);if(context.kind==="binding"&&/\bexport\s+(?:type\s+)?\*\s*(?:as\s+[$A-Z_a-z][$\w]*\s*)?from\s*$/.test(before))for(const review of available)report(match.index+1,review,"This re-export includes ");else opaque(match.index+1,specifier,available)}for(const match of text.matchAll(/@import\s+url\(\s*(@aceshooting\/lyra-ui\/[^\s)'";]+)\s*\)/g))if(!(inComment(match.index)||!inCss(match.index)))for(const review of reviews)review.kind==="stylesheet"&&match[1]===specifierOf(review.name)&&report(match.index+match[0].indexOf(match[1]),review);for(const review of reviews)if(review.kind==="window-event")for(const match of text.matchAll(new RegExp(`(['"\\x60])(${regexEscape(review.name)})\\1`,"g"))){if(inComment(match.index))continue;const before=text.slice(Math.max(0,match.index-200),match.index);(LISTENER_CALL_BEFORE.test(before)||/\bnew\s+(?:CustomEvent|Event)\s*(?:<[^>\n]+>)?\(\s*$/.test(before))&&stringStarts.has(match.index)&&report(match.index+1,review)}else if(review.kind==="root-attribute"){const attributeOffsets=new Set;for(const token of openingTokens)for(const attribute of parseTagAttributes(text,token))attribute.rawName.replace(/^\[attr\.(.+)\]$/,"$1").replace(/^(?:v-bind:|bind:|[?:])/,"")===review.name&&!inString(attribute.nameStart)&&attributeOffsets.add(attribute.nameStart+attribute.rawName.indexOf(review.name));for(const match of text.matchAll(new RegExp(`(?<![\\w-])${regexEscape(review.name)}(?![\\w-])`,"g"))){if(inComment(match.index))continue;const offset=match.index,before=text.slice(Math.max(0,offset-180),offset),after=text.slice(offset+review.name.length),literalApi=/\b(?:getAttribute|setAttribute|hasAttribute|removeAttribute|toggleAttribute)\s*\(\s*['"`]$/.test(before),selector=/\[\s*$/.test(before)&&/^\s*(?:[~|^$*]?=|\])/.test(after),markup=attributeOffsets.has(offset);(literalApi&&stringStarts.has(offset-1)||selector&&(inCss(offset)||inString(offset))||markup)&&report(offset,review)}const datasetName=review.name.slice(5).replace(/-([a-z])/g,(_match,letter)=>letter.toUpperCase()),dataset=new RegExp(`\\bdataset\\s*(?:\\.\\s*${regexEscape(datasetName)}\\b|\\[\\s*(['"])${regexEscape(datasetName)}\\1\\s*\\])`,"g");for(const match of text.matchAll(dataset))!inComment(match.index)&&!inLiteral(match.index)&&report(match.index,review)}}function migrateRenameText(original,contract,options){const file=options.file??"<memory>",origin=options.origin,profile=contract.renameProfiles.get(origin);invariant(profile,`unknown migration origin ${String(origin)}`);const result={content:original,changes:[],warnings:[],acknowledged:0,usage:{webawesome:{automatic:0,manual:0},shoelace:{automatic:0,manual:0}},blockedMappings:new Set,blockedEcosystems:new Set,bareImportEcosystems:new Set,blockedLocalMigrations:new Set,constructedEvents:new Set};if(profile.isEmpty)return result;const starts=lineStarts(original),ignoredRanges=renameIgnoredRanges(original,file),inComment=rangeTester(ignoredRanges),openingTokens=scanAllOpeningTags(original,ignoredRanges,inComment),acknowledgements=scanReviewAcknowledgements(original,ignoredRanges,starts,openingTokens),litTemplates=LIT_TEMPLATE_FILE.test(file)?rangeTester(taggedTemplateRanges(original,["html","svg"],inComment)):()=>!1,inLiteral=rangeTester(mergeRanges([...quotedStringRanges(original,inComment),...templateLiteralRanges(original,inComment)])),inCss=rangeTester(stylesheetRanges(original,file,inComment)),attributeSemantics=offset=>ATTRIBUTE_SEMANTICS_FILE.test(file)||litTemplates(offset),release=`Lyra ${profile.toMajor}`,removal=`${profile.aliasRemovalMajor}.0.0`;for(const match of original.matchAll(EVENT_CONSTRUCTION))!inComment(match.index)&&profile.renamesNamed("event",match[2]).length&&result.constructedEvents.add(match[2]);const constructedEvents=new Set([...options.constructedEvents??[],...result.constructedEvents]),listenerIdentity=(quote,name)=>{const receiver=LISTENER_RECEIVER_BEFORE.exec(original.slice(Math.max(0,quote-200),quote))?.[1],handler=LISTENER_HANDLER_AFTER.exec(original.slice(quote+name.length+2,quote+name.length+202))?.[1];return receiver&&handler?`${receiver.replace(/\s+/g,"")}\0${handler.replace(/\s+/g,"")}`:null},listenedNames=new Map;if(profile.data.renames.some(entry=>entry.kind==="event"))for(const match of original.matchAll(/(['"`])(lr-[a-z0-9]+(?:-[a-z0-9]+)*)\1/g)){if(inComment(match.index)||!LISTENER_CALL_BEFORE.test(original.slice(Math.max(0,match.index-120),match.index)))continue;const identity=listenerIdentity(match.index,match[2]);identity&&listenedNames.set(identity,new Set([...listenedNames.get(identity)??[],match[2]]))}const sameHandlerListens=(quote,name)=>{if(!listenedNames.size)return!1;const names=listenedNames.get(listenerIdentity(quote,name));return!!names&&profile.renamesNamed("event",name).some(entry=>names.has(entry.to))},edits=[],seenWarnings=new Set,handledStrings=new Set,handledMembers=new Set,unique=values=>[...new Set(values)],list=values=>unique(values).join(", "),soleTag=entries=>unique(entries.map(entry=>entry.tag)).length===1?entries[0].tag:null,hint=(code,member)=>`After review, mark the site with a "lyra-migrate-reviewed: ${code}:${ackName(member)}" comment.`,rewrite=(start,end,replacement,{tag,member,action,target,message})=>{edits.push({start,end,replacement}),result.changes.push(reportEntry({textStarts:starts,file,offset:start,origin,upstreamTag:tag,upstreamMember:member,action,target,message}))},warn=(offset,{tag=null,member,code,target=null,message})=>{const key=`${offset}:${code}:${member}`;if(!seenWarnings.has(key)){if(seenWarnings.add(key),acknowledgements.consume(locationAt(starts,offset).line,code,member)){result.acknowledged+=1;return}result.warnings.push(reportEntry({textStarts:starts,file,offset,origin,upstreamTag:tag,upstreamMember:member,action:"manual-review",target,warningCode:code,message:`${message} ${hint(code,member)}`}))}},reviewMessage=review=>`${review.kind==="component"?`<${review.tag}>`:review.kind==="slot"&&review.name===""?`Content in the default slot of ${review.tag}`:`The ${review.tag} ${review.kind} ${review.name}`} ${review.removedIn?`was removed in ${review.removedIn}`:`is deprecated and scheduled for removal in ${review.removalNotBefore}`}; migrate to ${review.replacement} by hand.`,reportReview=(offset,review)=>warn(offset,{tag:review.tag,member:review.name,code:DEPRECATED_MEMBER_REVIEW,target:review.replacement,message:reviewMessage(review)}),reportPropertyChange=(offset,entry)=>warn(offset,{tag:entry.tag,member:entry.property,code:"PROPERTY_CHANGE_REVIEW",target:entry.property,message:`Review ${entry.tag}.${entry.property} for ${release}: ${entry.summary}`});reportModuleReviews(original,file,profile.data.moduleReviews,openingTokens,inComment,warn);const unownedReviews=(kind,name,offset,owner)=>{const own=owner?profile.reviewFor(owner,kind,name):null;if(own)reportReview(offset,own);else if(!profile.exposes(kind,name,owner))for(const review of profile.reviewsNamed(kind,name))reportReview(offset,review)},label=kind=>kind==="css-property"?"custom property":kind,detailNote=name=>{const details=profile.detailsNamed(name);return details.length?` Its ${release} detail also changed: ${details.map(entry=>`${entry.tag}: ${entry.summary}`).join(" ")}`:""},unownedMove=({kind,name,start,context,rewritable,action})=>{const renames=profile.renamesNamed(kind,name),targets=unique(renames.map(entry=>entry.to)),constructed=kind==="event"&&constructedEvents.has(name);if(rewritable&&!constructed&&profile.isGlobal(kind,name))return rewrite(start,start+name.length,targets[0],{tag:soleTag(renames),member:name,action,target:targets[0],message:`Rename ${name} to ${targets[0]}; every component exposing it renamed it, and no other component uses ${targets[0]}.`}),targets[0];const sourceKeepers=unique(targets.flatMap(to=>profile.sourceKeepers(kind,name,to))).filter(tag=>!renames.some(entry=>entry.tag===tag)),targetKeepers=unique(targets.flatMap(to=>profile.targetKeepers(kind,name,to))),shared=targets.length===1&&!sourceKeepers.length&&targetKeepers.length>0&&!renames.some(entry=>entry.polarity);return warn(start,{tag:soleTag(renames),member:name,code:shared?RENAME_TARGET_SHARED_REVIEW:RENAME_REVIEW,target:targets.join(" | "),message:(kind==="css-property"?"Custom properties inherit into nested components. ":context==="listener"?"This listener does not prove which element it listens to. ":"This string may name an event of any component. ")+`${list(renames.map(entry=>entry.tag))} renamed the ${label(kind)} ${name} to ${targets.join(" or ")}`+(sourceKeepers.length?`, while ${list(sourceKeepers)} still ${sourceKeepers.length===1?"uses":"use"} ${name}`:"")+(targetKeepers.length?`; ${list(targetKeepers)} already ${targetKeepers.length===1?"uses":"use"} ${targets.join(" and ")}, which this site would start reaching`:"")+(constructed?`; the scanned code also dispatches ${name} itself, so its listeners and dispatches must move together`:"")+`. Update it by hand for the components it is meant for; ${name} keeps working until ${removal}.`+(kind==="event"?detailNote(targets[0]):"")}),null},eventMove=(name,owner,rewritable=!0)=>{if(constructedEvents.has(name))return null;const own=owner?profile.renameFor(owner,"event",name):null;return own?profile.targetKeepers("event",name,own.to).length?null:own.to:!rewritable||!profile.renamesNamed("event",name).length||profile.exposes("event",name,owner)?null:profile.isGlobal("event",name)?profile.renamesNamed("event",name)[0].to:null},conflictMessage=(conflict,subject,to)=>conflict==="same-handler"?`${subject} already listens to ${to} with this same handler; renamed, the two identical registrations would collapse into one, so the handler would run once per activation instead of twice. Rename or remove this call, and its add or remove counterpart, together by hand.`:`${subject} already listens to ${to}; merge the two handlers by hand.`,eventSite=({name,start,owner,context,rewritable=!0,conflict=!1})=>{const retired=owner?profile.retiredEventFor(owner,name):null,retiredCandidates=retired?[retired]:profile.exposes("event",name,owner)?[]:profile.retiredEventsNamed(name);retiredCandidates.length&&warn(start,{tag:retired?owner:soleTag(retiredCandidates),member:name,code:"RETIRED_EVENT_REVIEW",target:unique(retiredCandidates.map(entry=>entry.replacement)).join(", "),message:`${name} is no longer dispatched by ${list(retiredCandidates.map(entry=>entry.tag))} in ${release}. `+retiredCandidates.map(entry=>`${entry.tag}: use ${entry.replacement}. ${entry.summary}`).join(" ")+" Review this listener and its matching removal together; keep unrelated events with the same spelling, check nested event targets, and merge any existing canonical listener without dropping or duplicating handler calls."});const own=owner?profile.renameFor(owner,"event",name):null;let current=name;if(own){const keepers=profile.targetKeepers("event",name,own.to);if(constructedEvents.has(name))warn(start,{tag:owner,member:name,code:RENAME_REVIEW,target:own.to,message:`Not renamed: the scanned code dispatches ${name} itself, so this listener would stop hearing it. Rename the dispatch and its listeners to ${own.to} together; ${name} keeps working until ${removal}.${detailNote(own.to)}`});else if(keepers.length)warn(start,{tag:owner,member:name,code:RENAME_TARGET_SHARED_REVIEW,target:own.to,message:`Not renamed: ${list(keepers)} also ${keepers.length===1?"dispatches":"dispatch"} ${own.to}, so this listener would start receiving their events when they are nested inside this ${owner}. Rename it by hand and ignore events whose target is not this ${owner}; ${name} keeps working until ${removal}.${detailNote(own.to)}`});else if(conflict)warn(start,{tag:owner,member:name,code:RENAME_CONFLICT_REVIEW,target:own.to,message:`${conflictMessage(conflict,`This ${owner}`,own.to)} ${name} keeps working until ${removal}.`});else{const narrowed=profile.sourceKeepers("event",name,own.to).filter(tag=>tag!==owner);rewrite(start,start+name.length,own.to,{tag:owner,member:name,action:"rewrite-event",target:own.to,message:`Rename the ${owner} event ${name} to ${own.to}.`+(narrowed.length?` ${list(narrowed)} still ${narrowed.length===1?"dispatches":"dispatch"} ${name}; this listener stops hearing theirs from nested elements.`:"")}),current=own.to}}else profile.renamesNamed("event",name).length&&!profile.exposes("event",name,owner)&&(conflict?warn(start,{tag:soleTag(profile.renamesNamed("event",name)),member:name,code:RENAME_CONFLICT_REVIEW,target:profile.renamesNamed("event",name)[0].to,message:conflictMessage(conflict,conflict==="same-handler"?"This receiver":"This element",profile.renamesNamed("event",name)[0].to)}):current=unownedMove({kind:"event",name,start,context,rewritable,action:"rewrite-event"})??name);const details=profile.detailsNamed(current),ownDetail=owner?profile.detailFor(owner,current):null;if(ownDetail||details.length&&!profile.exposes("event",current,owner)){const affected=ownDetail?[ownDetail]:details;warn(start,{tag:ownDetail?owner:soleTag(affected),member:current,code:DETAIL_SHAPE_REVIEW,target:current,message:`The ${current} event detail changed in ${release} and cannot be aliased: `+affected.map(entry=>`${entry.tag}: ${entry.summary}`).join(" ")+` Update this handler if it reads the detail of ${ownDetail?`the ${owner} event`:"one of these components"}.`})}const gained=current===name?profile.gainedOwners("event",name):[];gained.length&&!profile.exposes("event",name,owner)&&warn(start,{tag:soleTag(gained.map(tag=>({tag}))),member:name,code:NAME_GAINED_OWNER_REVIEW,target:name,message:`In ${release}, ${list(gained)} also ${gained.length===1?"dispatches":"dispatch"} ${name}. This ${context} does not prove which element it listens to, so it may start receiving those events; ignore them by event target if it should not.`}),unownedReviews("event",name,start,owner)},reportedDetailFieldOffsets=new Set,detailFieldAccess=/\b([A-Za-z_$][\w$]*)\s*(?:\?\.|\.)\s*detail\s*(?:\?\.|\.)\s*(open|collapsed)\b/g,reportDetailField=(field,start,owner=null,event=null)=>{if(reportedDetailFieldOffsets.has(start))return;const exact=owner&&event?profile.detailFieldFor(owner,event):null;if(exact&&exact.field===field){const target=exact.relation==="equal"?"detail.expanded":"!detail.expanded",relation=exact.relation==="equal"?"carries the same value as":"is the inverse of",removal2=exact.removedIn?` It was removed in ${exact.removedIn}.`:" This notice does not assert that the field was removed.";warn(start,{tag:owner,member:field,code:DETAIL_FIELD_REVIEW,target,message:`The ${owner} ${event} detail field ${field} is deprecated: it ${relation} detail.expanded (${exact.notice}). Read ${target} in this handler by hand; no field rewrite was applied.${removal2}`}),reportedDetailFieldOffsets.add(start);return}const candidates=event?profile.detailFieldsNamed(event).filter(entry=>entry.field===field):[],possible=candidates.length?candidates:(profile.data.detailFields??[]).filter(entry=>entry.field===field);if(!possible.length)return;const possibilities=[...new Set(possible.map(entry=>`${entry.tag}/${entry.event} (${entry.relation})`))];warn(start,{tag:null,member:field,code:DETAIL_FIELD_REVIEW,target:null,message:`This detail.${field} read has no proven Lyra tag and event. Matching published field contracts are ${possibilities.join(", ")}; identify the runtime detail type and migrate it by hand. No field rewrite was applied.`}),reportedDetailFieldOffsets.add(start)},inspectMarkupDetailFields=(owner,event,attribute)=>{if(attribute.valueStart===null||attribute.valueEnd===null)return;const value=original.slice(attribute.valueStart,attribute.valueEnd);for(const match of value.matchAll(detailFieldAccess)){const start=attribute.valueStart+match.index+match[0].lastIndexOf(match[2]);reportDetailField(match[2],start,owner,event)}};for(const token of openingTokens){const owner=token.tag.toLowerCase();for(const attribute of parseTagAttributes(original,token)){const event=markupEventName(attribute.rawName);event&&/^lr-/u.test(event.name)&&inspectMarkupDetailFields(owner,event.name,attribute)}}const memberSite=({owner,kind,name,start,forms,dynamic,removal:removalRange})=>{const propertyChange=forms.filter(([candidateKind])=>candidateKind==="property").map(([,candidate])=>profile.propertyChangeFor(owner,candidate)).find(Boolean);propertyChange&&reportPropertyChange(start,propertyChange);const review=forms.map(([candidateKind,candidate])=>profile.reviewFor(owner,candidateKind,candidate)).find(Boolean);review&&reportReview(start,review);const rule=forms.map(([candidateKind,candidate])=>profile.renameFor(owner,candidateKind,candidate)).find(Boolean);if(!rule)return null;if(rule.polarity==="inverted"&&(dynamic||!removalRange)){const target=kind==="binding"?memberStyle(name,rule.to):rule.to;return warn(start,{tag:owner,member:rule.from,code:POLARITY_REVIEW,target:rule.to,message:`${target} is the inverse of ${name} on ${owner}, and this ${kind==="binding"?"binding":kind==="property"?"property access":"attribute binding"} is not a static attribute. Bind the negated value to ${target} by hand; ${name} keeps working until ${removal}.`}),null}return rule},renamedMembers=owner=>unique([...profile.data.renames.filter(entry=>entry.tag===owner&&["attribute","property","event"].includes(entry.kind)).map(entry=>entry.from),...profile.data.reviews.filter(entry=>entry.tag===owner&&["attribute","property","event"].includes(entry.kind)).map(entry=>entry.name),...profile.data.retiredEvents.filter(entry=>entry.tag===owner).map(entry=>entry.event),...profile.data.propertyChanges.filter(entry=>entry.tag===owner).map(entry=>entry.property)]),defaultTokens=[];for(const token of openingTokens){const owner=token.tag.toLowerCase(),attributes=parseTagAttributes(original,token),lyraOwner=profile.tags.has(owner),bound=lyraOwner?boundMemberNames(attributes):null,finalNames=new Map,planned=attributes.map(attribute=>{const event=markupEventName(attribute.rawName);let finalRaw=attribute.rawName;if(event&&/^lr-/.test(event.name)){const to=eventMove(event.name,owner);to&&(finalRaw=attribute.rawName.slice(0,event.offset)+to+attribute.rawName.slice(event.offset+event.name.length))}else if(lyraOwner){const binding=markupMemberBinding(attribute),rule=binding&&!binding.form.startsWith("member")&&profile.renameFor(owner,binding.form,binding.name);rule&&!rule.polarity&&(finalRaw=attribute.rawName.slice(0,binding.offset)+rule.to+attribute.rawName.slice(binding.offset+binding.name.length))}const key=finalRaw.toLowerCase();return finalNames.set(key,(finalNames.get(key)??0)+1),{attribute,event,key,renamed:finalRaw!==attribute.rawName}});if(lyraOwner&&renamedMembers(owner).length)for(const group of openingTagBraceGroups(original,token)){const shorthand=/^[A-Za-z_$][\w$]*$/.exec(group.body)?.[0];if(!shorthand){warn(group.start,{tag:owner,member:owner,code:"DYNAMIC_VALUE_REVIEW",target:null,message:`This spread on ${owner} may carry renamed or deprecated members (${list(renamedMembers(owner))}); rename them where the object is built.`});continue}const forms=[["property",camelCase(shorthand)],["attribute",kebabCase(shorthand)]],review=forms.map(([kind,name])=>profile.reviewFor(owner,kind,name)).find(Boolean);review&&reportReview(group.start+1,review);const propertyChange=profile.propertyChangeFor(owner,camelCase(shorthand));propertyChange&&reportPropertyChange(group.start+1,propertyChange);const rule=forms.map(([kind,name])=>profile.renameFor(owner,kind,name)).find(Boolean);rule&&warn(group.start+1,{tag:owner,member:rule.from,code:rule.polarity?POLARITY_REVIEW:RENAME_REVIEW,target:rule.to,message:`The shorthand {${shorthand}} binds the deprecated ${owner} ${rule.kind} ${rule.from}; write ${memberStyle(shorthand,rule.to)}={${rule.polarity?`!${shorthand}`:shorthand}} by hand.`})}for(const{attribute,event,key,renamed}of planned){if(event){/^lr-/.test(event.name)&&(inspectMarkupDetailFields(owner,event.name,attribute),eventSite({name:event.name,start:attribute.nameStart+event.offset,owner,context:"listener",conflict:renamed&&finalNames.get(key)>1}));continue}if(!lyraOwner)continue;if(/^v-(?:bind|on)$/.test(attribute.rawName)||attribute.rawName.startsWith("${")&&!/^\$\{\s*ref\s*\(/.test(attribute.rawName)){renamedMembers(owner).length&&warn(attribute.nameStart,{tag:owner,member:owner,code:"DYNAMIC_VALUE_REVIEW",target:null,message:`This object binding on ${owner} may carry renamed or deprecated members (${list(renamedMembers(owner))}); rename them where the object is built.`});continue}if(attribute.rawName==="exportparts"){if(attribute.valueKind!=="literal"||/\$\{|\{\{/.test(attribute.value??""))continue;for(const match of(attribute.value??"").matchAll(/([^,\s:]+)(\s*:\s*[^,\s]+)?/g)){const inner=match[1],start2=attribute.valueStart+match.index,review=profile.reviewFor(owner,"part",inner);review&&reportReview(start2,review);const rule2=profile.renameFor(owner,"part",inner);rule2&&rewrite(start2,start2+inner.length,match[2]?rule2.to:`${rule2.to}:${inner}`,{tag:owner,member:inner,action:"rewrite-part",target:rule2.to,message:match[2]?`Forward the renamed ${owner} part ${rule2.to} under the same exported name.`:`Forward the renamed ${owner} part ${rule2.to} under its previous exported name ${inner}.`})}continue}const binding=markupMemberBinding(attribute);if(!binding)continue;const forms=binding.form==="member"?[["property",camelCase(binding.name)],["attribute",kebabCase(binding.name)]]:[[binding.form,binding.name]],start=attribute.nameStart+binding.offset,staticAttribute=binding.form==="attribute"&&binding.offset===0&&!binding.dynamic,rule=memberSite({owner,kind:binding.form==="member"?"binding":binding.form,name:binding.name,start,forms,dynamic:binding.dynamic,removal:staticAttribute});if(!rule)continue;if(bound.has(kebabCase(rule.to))||renamed&&finalNames.get(key)>1){warn(start,{tag:owner,member:rule.from,code:RENAME_CONFLICT_REVIEW,target:rule.to,message:`This ${owner} already binds ${rule.to}; remove the deprecated ${rule.from} binding by hand.`});continue}if(rule.polarity==="inverted"){if(!attributeSemantics(token.start)){warn(start,{tag:owner,member:rule.from,code:POLARITY_REVIEW,target:rule.to,message:`${rule.to} is the inverse of ${rule.from}. In this template syntax a static value may be assigned to the ${camelCase(rule.from)} property as a string, where "false" is truthy, so set ${rule.to} by hand.`});continue}if(profile.preservedDefaultsFor(owner).some(entry=>entry.attribute===rule.to&&entry.value===!0)){warn(start,{tag:owner,member:rule.from,code:POLARITY_REVIEW,target:rule.to,message:`${rule.from} has a preserved absent default, so removing an explicit attribute would let a later run insert ${rule.to}. Review this value using the old converter (a presence boolean treats even "false" as true), then migrate it by hand after the default migration is complete.`});continue}const value=attribute.value??"",end=attributeEnd(original,attribute);if(value===""||value==="true"||value===rule.from){let removeFrom=attribute.nameStart;for(;removeFrom>0&&/\s/.test(original[removeFrom-1]);)removeFrom-=1;rewrite(removeFrom,end,"",{tag:owner,member:rule.from,action:"remove-attribute",target:rule.to,message:`Remove ${rule.from}: it restated the ${owner} default, and ${rule.to} is off by default.`})}else value==="false"?rewrite(attribute.nameStart,end,rule.to,{tag:owner,member:rule.from,action:"rewrite-attribute",target:rule.to,message:`Replace ${rule.from}="false" with the presence of ${rule.to}.`}):warn(start,{tag:owner,member:rule.from,code:POLARITY_REVIEW,target:rule.to,message:`${rule.from}="${attribute.value}" is not a boolean literal; set ${rule.to} to its inverse by hand.`});continue}const target=binding.form==="member"?memberStyle(binding.name,rule.to):rule.to;rewrite(start,start+binding.name.length,target,{tag:owner,member:rule.from,action:`rewrite-${rule.kind}`,target:rule.to,message:`Rename the ${owner} ${rule.kind} ${rule.from} to ${rule.to}.`})}lyraOwner&&profile.defaultsFor(owner).length&&defaultTokens.push({token,owner,bound})}const slotTags=[...profile.tags].filter(tag=>profile.slotContentFor(tag).length||[...profile.data.renames,...profile.data.reviews].some(entry=>entry.tag===tag&&entry.kind==="slot"));for(const tag of slotTags)for(const pair of elementPairs(original,tag,inComment))for(const child of directChildTokens(original,pair.opening.end+1,pair.closingStart,inComment)){let slot="",start=child.nameStart;for(const attribute of parseTagAttributes(original,child))if(attribute.rawName==="slot")slot=attribute.valueKind==="literal"?attribute.value??"":null,start=attribute.valueStart??attribute.nameStart;else if(attribute.rawName==="v-slot")slot="";else{const prefix=["v-slot:","#"].find(candidate=>attribute.rawName.startsWith(candidate));prefix&&(slot=attribute.rawName.slice(prefix.length),start=attribute.nameStart+prefix.length,slot==="default"&&(slot=""))}if(slot===null)continue;const review=profile.reviewFor(tag,"slot",slot);review&&reportReview(start,review);const rule=slot===""?null:profile.renameFor(tag,"slot",slot);if(rule&&rewrite(start,start+slot.length,rule.to,{tag,member:slot,action:"rewrite-slot",target:rule.to,message:`Rename the ${tag} slot ${slot} to ${rule.to}.`}),child.tag!=="template")for(const content of profile.slotContentFor(tag)){if(content.slot!==slot)continue;const listed=(content.report??content.allow).includes(child.tag);(content.report?!listed:listed)||warn(child.nameStart,{tag,member:child.tag,code:DEPRECATED_CONTENT_REVIEW,target:null,message:`<${child.tag}> in ${slot===""?"the default slot":`the ${slot} slot`} of ${tag}: ${content.summary}`})}}for(const match of original.matchAll(/::part\(([^)]*)\)/g)){if(inComment(match.index))continue;const owner=compoundTypeBefore(original,match.index),listStart=match.index+7;for(const nameMatch of match[1].matchAll(/\S+/g)){const name=nameMatch[0],start=listStart+nameMatch.index,own=owner?profile.renameFor(owner,"part",name):null;if(own)rewrite(start,start+name.length,own.to,{tag:owner,member:name,action:"rewrite-part",target:own.to,message:`Rename the ${owner} part ${name} to ${own.to}.`});else if(profile.renamesNamed("part",name).length&&!profile.exposes("part",name,owner)){const renames=profile.renamesNamed("part",name),keepers=profile.exposers("part",name).filter(tag=>!renames.some(entry=>entry.tag===tag));warn(start,{tag:soleTag(renames),member:name,code:RENAME_REVIEW,target:list(renames.map(entry=>entry.to)),message:`This ::part() selector does not name the component that owns the part. ${list(renames.map(entry=>entry.tag))} renamed the part ${name} to ${list(renames.map(entry=>entry.to))}`+(keepers.length?`, while ${list(keepers)} still ${keepers.length===1?"exposes":"expose"} ${name}`:"")+". Rename it where the selector reaches a renamed component directly; a part forwarded through exportparts keeps its exported name."})}else if(profile.gainedOwners("part",name).length&&!owner?.startsWith("lr-")){const gained=profile.gainedOwners("part",name);warn(start,{tag:soleTag(gained.map(tag=>({tag}))),member:name,code:NAME_GAINED_OWNER_REVIEW,target:name,message:`In ${release}, ${list(gained)} also ${gained.length===1?"exposes":"expose"} the part ${name}, so this selector may start matching it.`})}unownedReviews("part",name,start,owner)}}const cssNames=new Set([...profile.data.renames.filter(entry=>entry.kind==="css-property").flatMap(entry=>[entry.from,entry.to]),...profile.data.reviews.filter(entry=>entry.kind==="css-property").map(entry=>entry.name)]);if(cssNames.size)for(const match of original.matchAll(/(?<![\w-])--[A-Za-z0-9_-]+/g)){const name=match[0];if(!cssNames.has(name)||inComment(match.index))continue;profile.renamesNamed("css-property",name).length&&unownedMove({kind:"css-property",name,start:match.index,context:"custom property",rewritable:!0,action:"rewrite-css-property"});const declaration=/^\s*['"]?\s*:/.test(original.slice(match.index+name.length,match.index+name.length+16))||/setProperty\s*\(\s*['"`]$/.test(original.slice(Math.max(0,match.index-24),match.index)),gained=profile.gainedOwners("css-property",name);declaration&&gained.length&&warn(match.index,{tag:soleTag(gained.map(tag=>({tag}))),member:name,code:NAME_GAINED_OWNER_REVIEW,target:name,message:`In ${release}, ${list(gained)} also ${gained.length===1?"reads":"read"} ${name}, so this declaration now reaches them when they are nested below it.`});for(const review of profile.reviewsNamed("css-property",name))reportReview(match.index,review)}for(const match of original.matchAll(/\[\s*([A-Za-z_][\w-]*)(?=\s*(?:[~|^$*]?=|\]))/g)){if(inComment(match.index))continue;const owner=compoundTypeBefore(original,match.index);if(!owner||!profile.tags.has(owner))continue;const name=match[1],start=match.index+match[0].length-name.length,review=profile.reviewFor(owner,"attribute",name);review&&reportReview(start,review);const rule=profile.renameFor(owner,"attribute",name);if(rule){if(rule.polarity==="inverted"){warn(start,{tag:owner,member:name,code:POLARITY_REVIEW,target:rule.to,message:`${rule.to} is the inverse of ${name}; rewrite this ${owner} selector to test the opposite state (for example :not([${rule.to}])).`});continue}if(!rule.reflects){warn(start,{tag:owner,member:name,code:RENAME_REVIEW,target:rule.to,message:`${owner} does not reflect ${rule.to}, so [${rule.to}] matches only where markup sets it. Rename this selector once every place that sets ${name} (markup, setAttribute) sets ${rule.to} instead.`});continue}rewrite(start,start+name.length,rule.to,{tag:owner,member:name,action:"rewrite-attribute",target:rule.to,message:`Rename the ${owner} attribute selector [${name}] to [${rule.to}]; ${owner} reflects ${rule.to}.`})}}for(const match of original.matchAll(/:state\(\s*([a-z][a-z0-9-]*)\s*\)/g)){if(inComment(match.index))continue;const owner=compoundTypeBefore(original,match.index),review=owner?profile.reviewFor(owner,"css-state",match[1]):null;review&&reportReview(match.index+match[0].indexOf(match[1]),review)}for(const review of profile.data.reviews.filter(entry=>entry.kind==="component"))for(const match of original.matchAll(new RegExp(`(?<![\\w-])${review.tag}(?![\\w-])`,"g")))inComment(match.index)||original.slice(match.index-2,match.index)==="</"||reportReview(match.index,review);const anchoredDetailListener=/(?:document\.)?querySelector\(\s*(['"])(lr-[a-z0-9-]+)\1\s*\)\s*!?\s*\.\s*addEventListener\(\s*(['"])(lr-[a-z0-9-]+)\3\s*,/g,unownedDetailListener=/[A-Za-z_$][\w$]*\s*\.\s*addEventListener\(\s*(['"])(lr-[a-z0-9-]+)\1\s*,/g,scriptListenerAt=offset=>{const start=Math.max(0,offset-4096),prefix=original.slice(start,offset);let result2=null;for(const pattern of[anchoredDetailListener,unownedDetailListener]){pattern.lastIndex=0;for(const match of prefix.matchAll(pattern)){const event=pattern===anchoredDetailListener?match[4]:match[2],callbackStart=match.index+match[0].length,callback=prefix.slice(callbackStart);!/=>|\bfunction\b/u.test(callback)||/\)\s*;/u.test(callback)||(!result2||match.index>=result2.index)&&(result2={owner:pattern===anchoredDetailListener?match[2]:null,event,index:match.index})}}return result2};for(const match of original.matchAll(detailFieldAccess)){const offset=match.index+match[0].lastIndexOf(match[2]);if(reportedDetailFieldOffsets.has(offset)||inComment(offset)||inLiteral(offset)||inCss(offset))continue;const listener=scriptListenerAt(offset);reportDetailField(match[2],offset,listener?.owner??null,listener?.event??null)}for(const match of original.matchAll(ANCHORED_MEMBER)){if(inComment(match.index))continue;const owner=match[2],member=match[3],start=match.index+match[0].length-member.length,after=start+member.length;if(handledMembers.add(start),LISTENER_METHODS.has(member)||ATTRIBUTE_METHODS.has(member)){const call=/^\s*\(\s*(['"`])([^'"`\n]+)\1/.exec(original.slice(after,after+200));if(!call)continue;const valueStart=after+call[0].length-1-call[2].length;if(handledStrings.add(valueStart-1),LISTENER_METHODS.has(member)){eventSite({name:call[2],start:valueStart,owner,context:"listener",conflict:sameHandlerListens(valueStart-1,call[2])&&"same-handler"});continue}const rule2=memberSite({owner,kind:"attribute",name:call[2],start:valueStart,forms:[["attribute",call[2]]],dynamic:!0});rule2&&rewrite(valueStart,valueStart+call[2].length,rule2.to,{tag:owner,member:rule2.from,action:"rewrite-attribute",target:rule2.to,message:`Rename the ${owner} attribute ${rule2.from} to ${rule2.to}.`});continue}if(!profile.tags.has(owner))continue;if(/^\s*\(/.test(original.slice(after,after+64))){const review=profile.reviewFor(owner,"method",member);review&&reportReview(start,review);continue}const rule=memberSite({owner,kind:"property",name:member,start,forms:[["property",member]],dynamic:!0});rule&&rewrite(start,after,rule.to,{tag:owner,member:rule.from,action:"rewrite-property",target:rule.to,message:`Rename the ${owner} property ${rule.from} to ${rule.to}.`})}const eventNameMatters=name=>profile.renamesNamed("event",name).length||profile.detailsNamed(name).length||profile.retiredEventsNamed(name).length||profile.reviewsNamed("event",name).length||profile.gainedOwners("event",name).length;for(const match of original.matchAll(/(['"`])(?:(window|document|body):)?(lr-[a-z0-9]+(?:-[a-z0-9]+)*)\1/g)){const name=match[3];if(handledStrings.has(match.index)||inComment(match.index)||!eventNameMatters(name))continue;const before=original.slice(Math.max(0,match.index-120),match.index);if(!match[2]&&TAG_API_CALL_BEFORE.test(before))continue;const listener=LISTENER_CALL_BEFORE.test(before);eventSite({name,start:match.index+1+(match[2]?match[2].length+1:0),owner:null,context:listener?"listener":"event name string",rewritable:listener,conflict:listener&&!match[2]&&sameHandlerListens(match.index,name)&&"same-handler"})}const mentioned=mentionedTags(original,profile.tags,inComment),accessRules=new Map,addAccess=(name,candidate)=>accessRules.set(name,[...accessRules.get(name)??[],candidate]);for(const entry of profile.data.renames)entry.kind==="property"&&mentioned.has(entry.tag)&&addAccess(entry.from,{tag:entry.tag,rule:entry,call:!1});for(const entry of profile.data.reviews)(entry.kind==="property"||entry.kind==="method")&&mentioned.has(entry.tag)&&addAccess(entry.name,{tag:entry.tag,review:entry,call:entry.kind==="method"});for(const entry of profile.data.propertyChanges)mentioned.has(entry.tag)&&addAccess(entry.property,{tag:entry.tag,propertyChange:entry,call:!1});if(accessRules.size){const inString=rangeTester(mergeRanges(quotedStringRanges(original,inComment))),inStylesheet=rangeTester(stylesheetRanges(original,file,inComment)),inToken=rangeTester(mergeRanges(openingTokens.map(token=>[token.start+1,token.end])));for(const match of original.matchAll(/(?<=[\w$)\]])\s*(?:\?\.|!?\.)\s*([A-Za-z_$][\w$]*)/g)){const name=match[1],candidates=accessRules.get(name);if(!candidates)continue;const start=match.index+match[0].length-name.length;if(handledMembers.has(start)||reportedDetailFieldOffsets.has(start)||inComment(start)||inString(start)||inStylesheet(start)||inToken(start))continue;const call=/^\s*\(/.test(original.slice(start+name.length,start+name.length+64));for(const candidate of candidates){if(candidate.call!==call)continue;if(candidate.propertyChange){reportPropertyChange(start,candidate.propertyChange);continue}if(candidate.review){reportReview(start,candidate.review);continue}const{rule}=candidate;warn(start,{tag:rule.tag,member:name,code:rule.polarity?POLARITY_REVIEW:RENAME_REVIEW,target:rule.to,message:`If this reads or writes an ${rule.tag}, ${rule.polarity?`use the inverse property .${rule.to}`:`rename .${name} to .${rule.to}`}; .${name} keeps working until ${removal}.`})}}}for(const match of original.matchAll(/\.\s*(?:set|get|has|remove|toggle)Attribute\s*\(\s*(['"`])([a-z][a-z0-9-]*)\1/g)){const name=match[2],start=match.index+match[0].length-1-name.length;if(!(handledStrings.has(start-1)||inComment(match.index)))for(const tag of mentioned){const review=profile.reviewFor(tag,"attribute",name);review&&reportReview(start,review);const rule=profile.renameFor(tag,"attribute",name);rule&&warn(start,{tag,member:name,code:rule.polarity?POLARITY_REVIEW:RENAME_REVIEW,target:rule.to,message:`If this element is an ${tag}, ${rule.polarity?`use the inverse attribute ${rule.to}`:`rename ${name} to ${rule.to}`}; ${name} keeps working until ${removal}.`})}}if(profile.data.defaults.length){const defaultProfiles=new Map([...new Set(profile.data.defaults.map(entry=>entry.tag))].map(tag=>[tag,{origin,tag,defaults:profile.defaultsFor(tag).map(entry=>({member:entry.attribute,value:entry.value}))}])),hazards=scanLocalMigrationHazards(original,defaultProfiles,ignoredRanges,defaultTokens.map(({token})=>({...token,tag:token.tag.toLowerCase()}))),blocked=new Set([...options.blockedLocalMigrations??[],...hazards.blocked]);result.blockedLocalMigrations=hazards.blocked;for(const use of hazards.uses)warn(use.offset,{tag:use.tag,member:use.tag,code:use.warningCode,target:use.tag,message:use.message});for(const{token,owner,bound}of defaultTokens){const missing=profile.defaultsFor(owner).filter(entry=>!profile.defaultAliasesFor(owner,entry.attribute).some(name=>bound.has(name)));if(!missing.length)continue;if(blocked.has(localMigrationKey(origin,owner))){warn(token.nameStart,{tag:owner,member:owner,code:"MAPPING_REVIEW_BLOCKED",target:owner,message:`${owner} did not receive its Lyra ${profile.fromMajor} defaults (${missing.map(entry=>`${entry.attribute}=${String(entry.value)}`).join(", ")}) because the scanned target set accesses it through a DOM alias or an opaque attribute spread. Add them by hand where the previous default matters.`});continue}const insertions=[];for(const entry of missing)insertions.push(serializeLocalDefault({member:entry.attribute,value:entry.value})),result.changes.push(reportEntry({textStarts:starts,file,offset:token.end,origin,upstreamTag:owner,upstreamMember:entry.attribute,action:"insert-default",target:`${entry.attribute}=${String(entry.value)}`,message:`Insert ${entry.attribute} to preserve the Lyra ${profile.fromMajor} default.`}));if(insertions.length){const insertionOffset=original[token.end-1]==="/"?token.end-1:token.end,replacement=/\s/.test(original[insertionOffset-1])?`${insertions.join(" ")} `:` ${insertions.join(" ")}`;edits.push({start:insertionOffset,end:insertionOffset,replacement})}}}if(!profile.skipped.length)for(const{offset,entry}of acknowledgements.unused()){const key=`${offset}:${UNUSED_ACKNOWLEDGEMENT}:${entry.token}`;seenWarnings.has(key)||(seenWarnings.add(key),result.warnings.push(reportEntry({textStarts:starts,file,offset,origin,upstreamTag:null,upstreamMember:entry.token,action:"manual-review",target:null,warningCode:UNUSED_ACKNOWLEDGEMENT,message:entry.code?`The acknowledgement ${entry.token} matches no report on the lines it covers; remove it.`:`The acknowledgement ${entry.token} is not of the form CODE:name, for example DETAIL_SHAPE_REVIEW:lr-close.`})))}return result.content=finalizeEdits(original,edits),sortReportEntries(result.changes,"action"),sortReportEntries(result.warnings,"warningCode"),result}export{migrateRenameText};
|
|
4
|
+
`);)text[index]==="\\"&&(index+=1),index+=1;index+=1,quote!=="`"&&ranges.push([start,index])}return ranges}function stylesheetRanges(text,file,inComment){if(STYLESHEET_FILE.test(file))return[[0,text.length]];const ranges=[];for(const match of text.matchAll(/<style(?:\s[^>]*)?>[\s\S]*?<\/style\s*>/gi))ranges.push([match.index,match.index+match[0].length]);return mergeRanges([...ranges,...taggedTemplateRanges(text,["css"],inComment)])}function compoundTypeBefore(text,index){let start=index,brackets=0,parens=0;const limit=Math.max(0,index-SELECTOR_LOOKBEHIND);for(;start>limit;){const character=text[start-1];if(character==="]")brackets+=1;else if(character==="["){if(brackets===0)break;brackets-=1}else if(character===")")parens+=1;else if(character==="("){if(parens===0)break;parens-=1}else if(brackets===0&&parens===0&&/[\s,>+~{};'"`]/.test(character))break;start-=1}if(start===limit&&limit>0)return null;const compound=text.slice(start,index);return(/^:global\(\s*([A-Za-z][\w-]*)\s*\)$/.exec(compound)??/^([A-Za-z][\w-]*)/.exec(compound))?.[1].toLowerCase()??null}function mentionedTags(text,tags,inComment){const found=new Set;for(const tag of tags)for(const match of text.matchAll(new RegExp(`(?<![\\w-])${tag}(?![\\w-])`,"g")))if(!inComment(match.index)){found.add(tag);break}return found}function elementPairs(text,tag,inComment){const pairs=[],stack=[];for(const match of text.matchAll(new RegExp(`<(/)?${tag}(?=[\\s/>])`,"g"))){if(inComment(match.index))continue;const end=findTagEnd(text,match.index+match[0].length);if(!(end<0))if(match[1]){const opening=stack.pop();opening&&pairs.push({opening,closingStart:match.index})}else/\/\s*>$/.test(text.slice(match.index,end+1))||stack.push({start:match.index,end})}return pairs}function directChildTokens(text,start,end,inComment){const children=[],stack=[],pattern=/<(\/)?([A-Za-z][\w.:-]*)(?=[\s/>])/g;pattern.lastIndex=start;for(let match=pattern.exec(text);match&&match.index<end;match=pattern.exec(text)){if(inComment(match.index))continue;const tokenEnd=findTagEnd(text,match.index+match[0].length);if(tokenEnd<0||tokenEnd>=end)break;const name=match[2].toLowerCase();if(match[1]){const index=stack.lastIndexOf(name);index>=0&&(stack.length=index)}else{const nameStart=match.index+1;stack.length===0&&children.push({tag:name,start:match.index,nameStart,nameEnd:nameStart+match[2].length,end:tokenEnd}),!/\/\s*>$/.test(text.slice(match.index,tokenEnd+1))&&!VOID_HTML_TAGS.has(name)&&stack.push(name)}pattern.lastIndex=tokenEnd+1}return children}function openingTagBraceGroups(text,token){const groups=[];let index=token.nameEnd,quote=null;for(;index<token.end;){const character=text[index];if(quote){character==="\\"?index+=1:character===quote&&(quote=null),index+=1;continue}if(character==='"'||character==="'")quote=character;else if(character==="{"){const end=skipBalanced(text,index,"{","}");!/=\s*$/.test(text.slice(token.nameEnd,index))&&text[index-1]!=="$"&&groups.push({start:index,end,body:text.slice(index+1,end-1).trim()}),index=end;continue}index+=1}return groups}function markupEventName(rawName){if(/^\(lr-[a-z0-9-]+\)$/.test(rawName))return{name:rawName.slice(1,-1),offset:1};if(/^onlr-/.test(rawName))return{name:rawName.slice(2).replace(/Capture$/,""),offset:2};for(const[prefix,separator]of[["@","."],["v-on:","."],["on:","|"]])if(rawName.startsWith(prefix))return{name:rawName.slice(prefix.length).split(separator)[0],offset:prefix.length};return null}function markupMemberBinding(attribute){const raw=attribute.rawName;let match;if(raw.startsWith("?"))return{form:"attribute",offset:1,name:raw.slice(1),dynamic:!0};if(match=/^\[attr\.([^\]]+)\]$/.exec(raw))return{form:"attribute",offset:6,name:match[1],dynamic:!0};if(match=/^\[([A-Za-z_$][\w$]*)\]$/.exec(raw))return{form:"property",offset:1,name:match[1],dynamic:!0};if(raw.startsWith("."))return{form:"property",offset:1,name:raw.slice(1),dynamic:!0};if(raw.startsWith("bind:"))return{form:"property",offset:5,name:raw.slice(5).split("|")[0],dynamic:!0};for(const prefix of["v-bind:",":"])if(raw.startsWith(prefix))return{form:"member",offset:prefix.length,name:raw.slice(prefix.length).split(".")[0],dynamic:!0};if(!/^[A-Za-z][\w-]*$/.test(raw)||/^onlr-/.test(raw))return null;const dynamic=attribute.valueKind==="expression"||/\$\{|\{\{/.test(attribute.value??"");return{form:/[A-Z]/.test(raw)?"property":"attribute",offset:0,name:raw,dynamic}}function attributeEnd(text,attribute){if(attribute.valueEnd===null)return attribute.nameEnd;const quote=text[attribute.valueStart-1];return(quote==='"'||quote==="'")&&text[attribute.valueEnd]===quote?attribute.valueEnd+1:attribute.valueEnd}function boundMemberNames(attributes){const names=new Set;for(const attribute of attributes){const binding=markupMemberBinding(attribute);binding&&names.add(kebabCase(binding.name))}return names}function sortReportEntries(entries,codeKey){return entries.sort((left,right)=>left.line-right.line||left.column-right.column||String(left[codeKey]).localeCompare(String(right[codeKey])))}function reportModuleReviews(text,file,reviews,openingTokens,inComment,warn){if(!reviews.length)return;const packageName="@aceshooting/lyra-ui",specifierOf=subpath=>`${packageName}${subpath.slice(1)}`,named=reviews.filter(entry=>["function","type","constant","class"].includes(entry.kind)),report=(offset,review,context="")=>warn(offset,{member:review.name,code:"DEPRECATED_MODULE_REVIEW",target:review.replacement,message:`${context}${review.kind} ${review.module?`${review.module}#`:""}${review.name} ${review.removedIn?`was removed in ${review.removedIn}`:`is deprecated and scheduled for removal in ${review.removalNotBefore}`}; review ${review.replacement}.`}),namedFor=specifier=>named.filter(entry=>specifier===packageName||specifier===specifierOf(entry.module)),strings=quotedStringRanges(text,inComment),templates=templateLiteralRanges(text,inComment),stringStarts=new Set([...strings,...templates.filter(([start,end])=>!text.slice(start,end).includes("${"))].map(([start])=>start)),inString=rangeTester(strings),inLiteral=rangeTester(mergeRanges([...strings,...templates])),inCss=rangeTester(stylesheetRanges(text,file,inComment)),inMarkup=offset=>openingTokens.some(token=>offset>=token.nameEnd&&offset<token.end),opaque=(offset,specifier,entries)=>{entries.length&&warn(offset,{member:specifier,code:"MODULE_NAMESPACE_REVIEW",target:[...new Set(entries.map(entry=>entry.replacement))].join("; "),message:`Review the namespace or dynamic import of ${specifier} for deprecated exports ${entries.map(entry=>entry.name).join(", ")}. They cannot be safely renamed through aliases; the earliest removal is ${entries.map(entry=>entry.removalNotBefore).sort()[0]}.`})},bindings=/\b(?:import|export)\s+(?:type\s+)?(?:[$A-Z_a-z][$\w]*\s*,\s*)?\{(?<bindings>[^{};]*)\}\s*from\s*(?<quote>['"])(?<source>@aceshooting\/lyra-ui(?:\/[^'"\s]+)?)\k<quote>/g,handledSpecifiers=new Set;for(const match of text.matchAll(bindings)){if(inComment(match.index)||inLiteral(match.index))continue;const available=namedFor(match.groups.source),bodyStart=match.index+match[0].indexOf("{")+1;for(const binding of parseNamedModuleBindings(match.groups.bindings)){const review=available.find(entry=>entry.name===binding.imported);if(!review)continue;const member=[...match.groups.bindings.matchAll(new RegExp(`(?<![$\\w])${regexEscape(binding.imported)}(?![$\\w])`,"g"))].find(candidate=>!inComment(bodyStart+candidate.index));member&&report(bodyStart+member.index,review)}handledSpecifiers.add(match.index+match[0].lastIndexOf(match.groups.source)-1)}for(const match of text.matchAll(/(['"])(@aceshooting\/lyra-ui(?:\/[^'"\s]+)?)\1/g)){if(inComment(match.index))continue;const markup=inMarkup(match.index),css=inCss(match.index);if(!stringStarts.has(match.index)&&!markup&&!css)continue;const before=text.slice(Math.max(0,match.index-500),match.index),context=moduleSpecifierContext(text,match.index),cssImport=css&&/@import\s+(?:url\(\s*)?$/.test(before),resource=markup&&/\b(?:href|src)\s*=\s*$/.test(before);if(!context&&!cssImport&&!resource)continue;const specifier=match[2];for(const review of reviews)(review.kind==="entry-point"||review.kind==="stylesheet")&&specifier===specifierOf(review.name)&&report(match.index+1,review);if(handledSpecifiers.has(match.index)||!context||context.sideEffect)continue;const available=namedFor(specifier);if(context.kind==="binding"&&/\bexport\s+(?:type\s+)?\*\s*(?:as\s+[$A-Z_a-z][$\w]*\s*)?from\s*$/.test(before))for(const review of available)report(match.index+1,review,"This re-export includes ");else opaque(match.index+1,specifier,available)}for(const match of text.matchAll(/@import\s+url\(\s*(@aceshooting\/lyra-ui\/[^\s)'";]+)\s*\)/g))if(!(inComment(match.index)||!inCss(match.index)))for(const review of reviews)review.kind==="stylesheet"&&match[1]===specifierOf(review.name)&&report(match.index+match[0].indexOf(match[1]),review);for(const review of reviews)if(review.kind==="window-event")for(const match of text.matchAll(new RegExp(`(['"\\x60])(${regexEscape(review.name)})\\1`,"g"))){if(inComment(match.index))continue;const before=text.slice(Math.max(0,match.index-200),match.index);(LISTENER_CALL_BEFORE.test(before)||/\bnew\s+(?:CustomEvent|Event)\s*(?:<[^>\n]+>)?\(\s*$/.test(before))&&stringStarts.has(match.index)&&report(match.index+1,review)}else if(review.kind==="root-attribute"){const attributeOffsets=new Set;for(const token of openingTokens)for(const attribute of parseTagAttributes(text,token))attribute.rawName.replace(/^\[attr\.(.+)\]$/,"$1").replace(/^(?:v-bind:|bind:|[?:])/,"")===review.name&&!inString(attribute.nameStart)&&attributeOffsets.add(attribute.nameStart+attribute.rawName.indexOf(review.name));for(const match of text.matchAll(new RegExp(`(?<![\\w-])${regexEscape(review.name)}(?![\\w-])`,"g"))){if(inComment(match.index))continue;const offset=match.index,before=text.slice(Math.max(0,offset-180),offset),after=text.slice(offset+review.name.length),literalApi=/\b(?:getAttribute|setAttribute|hasAttribute|removeAttribute|toggleAttribute)\s*\(\s*['"`]$/.test(before),selector=/\[\s*$/.test(before)&&/^\s*(?:[~|^$*]?=|\])/.test(after),markup=attributeOffsets.has(offset);(literalApi&&stringStarts.has(offset-1)||selector&&(inCss(offset)||inString(offset))||markup)&&report(offset,review)}const datasetName=review.name.slice(5).replace(/-([a-z])/g,(_match,letter)=>letter.toUpperCase()),dataset=new RegExp(`\\bdataset\\s*(?:\\.\\s*${regexEscape(datasetName)}\\b|\\[\\s*(['"])${regexEscape(datasetName)}\\1\\s*\\])`,"g");for(const match of text.matchAll(dataset))!inComment(match.index)&&!inLiteral(match.index)&&report(match.index,review)}}const GLOBAL_REVIEW="GLOBAL_REVIEW",LYRA_PACKAGE="@aceshooting/lyra-ui",NODE_MODULES_LEAD=/(?:^|\/)node_modules\/$/,JSON_FILE=/\.json$/i,IDENTIFIER="[$A-Za-z_][$\\w]*";function applyGlobals(text,file,entries,{inComment,inCss,openingTokens,rewrite,warn}){const modules=entries.filter(entry=>entry.kind==="module"),exported=entries.filter(entry=>entry.kind==="export"),localeKeys=entries.filter(entry=>entry.kind==="locale-key"),review=(offset,entry,member,message)=>warn(offset,{member,code:GLOBAL_REVIEW,target:entry.to,message});if(modules.length){const inMarkup=offset=>openingTokens.some(token=>offset>=token.nameEnd&&offset<token.end),handle=(entry,specifierStart,specifier,safe)=>{safe?rewrite(specifierStart,specifierStart+entry.from.length,entry.to,{tag:null,member:specifier,action:"rewrite-module",target:entry.to,message:`Rewrite ${entry.from} to ${entry.to}: ${entry.summary}`}):review(specifierStart,entry,specifier,`${specifier} is not provably a module specifier here (or is computed): ${entry.summary} Use ${entry.to}${entry.prefix?"...":""} instead.`)},entryFor=specifier=>modules.find(entry=>entry.prefix?specifier.startsWith(entry.from)&&!(entry.except??[]).some(prefix=>specifier.startsWith(prefix)):specifier===entry.from);for(const match of text.matchAll(/(['"`])([^'"`\n]*?@aceshooting\/lyra-ui\/[^'"`\n]*)\1/g)){if(inComment(match.index))continue;const at=match[2].indexOf("@aceshooting/"),lead=match[2].slice(0,at);if(lead&&!NODE_MODULES_LEAD.test(lead))continue;const specifier=match[2].slice(at),entry=entryFor(specifier);if(!entry)continue;const specifierStart=match.index+1+at,before=text.slice(Math.max(0,match.index-500),match.index),context=moduleSpecifierContext(text,match.index),cssImport=inCss(match.index)&&/@import\s+(?:url\(\s*)?$/.test(before),resource=inMarkup(match.index)&&/\b(?:href|src)\s*=\s*$/.test(before),safe=!specifier.includes("${")&&!!(lead||JSON_FILE.test(file)||context||cssImport||resource);handle(entry,specifierStart,specifier,safe)}for(const match of text.matchAll(/@import\s+url\(\s*(@aceshooting\/lyra-ui\/[^\s)'";]+)\s*\)/g)){const entry=entryFor(match[1]);inComment(match.index)||!inCss(match.index)||!entry||handle(entry,match.index+match[0].indexOf(match[1]),match[1],!0)}}if(exported.length){const bindingsPattern=new RegExp(`\\b(?:import|export)\\s+(?:type\\s+)?(?:${IDENTIFIER}\\s*,\\s*)?\\{(?<body>[^{};]*)\\}\\s*from\\s*(?<quote>['"])(?<source>${regexEscape(LYRA_PACKAGE)}(?:\\/[^'"\\s]+)?)\\k<quote>`,"g"),segment=new RegExp(`^(\\s*(?:type\\s+)?)(${IDENTIFIER})(\\s+as\\s+${IDENTIFIER})?\\s*$`,"d");for(const match of text.matchAll(bindingsPattern)){if(inComment(match.index))continue;const bodyStart=match.index+match[0].indexOf("{")+1;for(const part of match.groups.body.matchAll(/[^,]+/g)){const parsed=segment.exec(part[0]),entry=parsed&&exported.find(candidate=>candidate.from===parsed[2]);if(!entry)continue;const nameStart=bodyStart+part.index+parsed.indices[2][0];inComment(nameStart)||(match.groups.source===LYRA_PACKAGE?rewrite(nameStart,nameStart+entry.from.length,parsed[3]?entry.to:`${entry.to} as ${entry.from}`,{tag:null,member:entry.from,action:"rewrite-export",target:entry.to,message:`${entry.from} no longer exists; import ${entry.to}${parsed[3]?"":` as ${entry.from}`}: ${entry.summary}`}):review(nameStart,entry,entry.from,`${entry.from} is not exported by ${match.groups.source} any more: ${entry.summary} Import ${entry.to} from ${LYRA_PACKAGE}.`))}}const receivers=[...[...text.matchAll(new RegExp(`import\\s+(?:type\\s+)?\\*\\s+as\\s+(${IDENTIFIER})\\s+from\\s*(['"])${regexEscape(LYRA_PACKAGE)}\\2`,"g"))].map(match=>match[1]).map(regexEscape),`import\\(\\s*['"]${regexEscape(LYRA_PACKAGE)}['"]\\s*\\)`];for(const entry of exported)for(const match of text.matchAll(new RegExp(`(?<![$\\w.])(?:${receivers.join("|")})\\s*\\.\\s*${entry.from}(?![$\\w])`,"g")))inComment(match.index)||review(match.index+match[0].lastIndexOf(entry.from),entry,entry.from,`${entry.from} no longer exists: ${entry.summary} Use ${entry.to}.`)}for(const entry of entries.filter(candidate=>candidate.kind==="css-property")){const pattern=new RegExp(`${regexEscape(entry.from)}${entry.prefix?"[\\w-]*":"(?![\\w-])"}`,"g");for(const match of text.matchAll(pattern))inComment(match.index)||review(match.index,entry,match[0],`The custom property ${match[0]} was removed: ${entry.summary} Use ${entry.to}.`)}const parts=entries.filter(candidate=>candidate.kind==="part");if(parts.length)for(const match of text.matchAll(/::part\(([^)]*)\)/g)){if(inComment(match.index))continue;const names=match[1].trim().split(/\s+/),type=compoundTypeBefore(text,match.index);for(const entry of parts)!names.includes(entry.from)||!(type===entry.tag||!type&&text.includes(entry.tag))||review(match.index+match[0].indexOf(entry.from),entry,entry.from,`The ${entry.tag} part ${entry.from} changed: ${entry.summary} ${entry.to}`)}if(localeKeys.length&&/registerLyraLocale|bridgeLyraLocale|\.strings\b|@aceshooting\/lyra-ui/.test(text))for(const entry of localeKeys)for(const match of text.matchAll(new RegExp(`(?<![$\\w.-])${entry.from}(?![$\\w-])`,"g"))){const before=text[match.index-1]??"",after=text.slice(match.index+entry.from.length,match.index+entry.from.length+12),quoted=/['"`]/.test(before)&&/^['"`]/.test(after);inComment(match.index)||!(quoted||/^\s*:/.test(after))||review(match.index,entry,entry.from,`The localization key ${entry.from} was removed; use ${entry.to}: ${entry.summary}`)}}function migrateRenameText(original,contract,options){const file=options.file??"<memory>",origin=options.origin,profile=contract.renameProfiles.get(origin);invariant(profile,`unknown migration origin ${String(origin)}`);const result={content:original,changes:[],warnings:[],acknowledged:0,usage:{webawesome:{automatic:0,manual:0},shoelace:{automatic:0,manual:0}},blockedMappings:new Set,blockedEcosystems:new Set,bareImportEcosystems:new Set,blockedLocalMigrations:new Set,constructedEvents:new Set};if(profile.isEmpty)return result;const starts=lineStarts(original),ignoredRanges=renameIgnoredRanges(original,file),inComment=rangeTester(ignoredRanges),openingTokens=scanAllOpeningTags(original,ignoredRanges,inComment),acknowledgements=scanReviewAcknowledgements(original,ignoredRanges,starts,openingTokens),litTemplates=LIT_TEMPLATE_FILE.test(file)?rangeTester(taggedTemplateRanges(original,["html","svg"],inComment)):()=>!1,inLiteral=rangeTester(mergeRanges([...quotedStringRanges(original,inComment),...templateLiteralRanges(original,inComment)])),inCss=rangeTester(stylesheetRanges(original,file,inComment)),attributeSemantics=offset=>ATTRIBUTE_SEMANTICS_FILE.test(file)||litTemplates(offset),release=`Lyra ${profile.toMajor}`,removal=`${profile.aliasRemovalMajor}.0.0`;for(const match of original.matchAll(EVENT_CONSTRUCTION))!inComment(match.index)&&profile.renamesNamed("event",match[2]).length&&result.constructedEvents.add(match[2]);const constructedEvents=new Set([...options.constructedEvents??[],...result.constructedEvents]),listenerIdentity=(quote,name)=>{const receiver=LISTENER_RECEIVER_BEFORE.exec(original.slice(Math.max(0,quote-200),quote))?.[1],handler=LISTENER_HANDLER_AFTER.exec(original.slice(quote+name.length+2,quote+name.length+202))?.[1];return receiver&&handler?`${receiver.replace(/\s+/g,"")}\0${handler.replace(/\s+/g,"")}`:null},listenedNames=new Map;if(profile.data.renames.some(entry=>entry.kind==="event"))for(const match of original.matchAll(/(['"`])(lr-[a-z0-9]+(?:-[a-z0-9]+)*)\1/g)){if(inComment(match.index)||!LISTENER_CALL_BEFORE.test(original.slice(Math.max(0,match.index-120),match.index)))continue;const identity=listenerIdentity(match.index,match[2]);identity&&listenedNames.set(identity,new Set([...listenedNames.get(identity)??[],match[2]]))}const sameHandlerListens=(quote,name)=>{if(!listenedNames.size)return!1;const names=listenedNames.get(listenerIdentity(quote,name));return!!names&&profile.renamesNamed("event",name).some(entry=>names.has(entry.to))},edits=[],seenWarnings=new Set,handledStrings=new Set,handledMembers=new Set,unique=values=>[...new Set(values)],list=values=>unique(values).join(", "),soleTag=entries=>unique(entries.map(entry=>entry.tag)).length===1?entries[0].tag:null,hint=(code,member)=>`After review, mark the site with a "lyra-migrate-reviewed: ${code}:${ackName(member)}" comment.`,rewrite=(start,end,replacement,{tag,member,action,target,message})=>{edits.push({start,end,replacement}),result.changes.push(reportEntry({textStarts:starts,file,offset:start,origin,upstreamTag:tag,upstreamMember:member,action,target,message}))},warn=(offset,{tag=null,member,code,target=null,message})=>{const key=`${offset}:${code}:${member}`;if(!seenWarnings.has(key)){if(seenWarnings.add(key),acknowledgements.consume(locationAt(starts,offset).line,code,member)){result.acknowledged+=1;return}result.warnings.push(reportEntry({textStarts:starts,file,offset,origin,upstreamTag:tag,upstreamMember:member,action:"manual-review",target,warningCode:code,message:`${message} ${hint(code,member)}`}))}},reviewMessage=review=>`${review.kind==="component"?`<${review.tag}>`:review.kind==="slot"&&review.name===""?`Content in the default slot of ${review.tag}`:`The ${review.tag} ${review.kind} ${review.name}`} ${review.removedIn?`was removed in ${review.removedIn}`:`is deprecated and scheduled for removal in ${review.removalNotBefore}`}; migrate to ${review.replacement} by hand.`,reportReview=(offset,review)=>warn(offset,{tag:review.tag,member:review.name,code:DEPRECATED_MEMBER_REVIEW,target:review.replacement,message:reviewMessage(review)}),reportPropertyChange=(offset,entry)=>warn(offset,{tag:entry.tag,member:entry.property,code:"PROPERTY_CHANGE_REVIEW",target:entry.property,message:`Review ${entry.tag}.${entry.property} for ${release}: ${entry.summary}`});reportModuleReviews(original,file,profile.data.moduleReviews,openingTokens,inComment,warn),applyGlobals(original,file,profile.data.globals,{inComment,inCss,openingTokens,rewrite,warn});const unownedReviews=(kind,name,offset,owner)=>{const own=owner?profile.reviewFor(owner,kind,name):null;if(own)reportReview(offset,own);else if(!profile.exposes(kind,name,owner))for(const review of profile.reviewsNamed(kind,name))reportReview(offset,review)},label=kind=>kind==="css-property"?"custom property":kind,detailNote=name=>{const details=profile.detailsNamed(name);return details.length?` Its ${release} detail also changed: ${details.map(entry=>`${entry.tag}: ${entry.summary}`).join(" ")}`:""},unownedMove=({kind,name,start,context,rewritable,action})=>{const renames=profile.renamesNamed(kind,name),targets=unique(renames.map(entry=>entry.to)),constructed=kind==="event"&&constructedEvents.has(name);if(rewritable&&!constructed&&profile.isGlobal(kind,name))return rewrite(start,start+name.length,targets[0],{tag:soleTag(renames),member:name,action,target:targets[0],message:`Rename ${name} to ${targets[0]}; every component exposing it renamed it, and no other component uses ${targets[0]}.`}),targets[0];const sourceKeepers=unique(targets.flatMap(to=>profile.sourceKeepers(kind,name,to))).filter(tag=>!renames.some(entry=>entry.tag===tag)),targetKeepers=unique(targets.flatMap(to=>profile.targetKeepers(kind,name,to))),shared=targets.length===1&&!sourceKeepers.length&&targetKeepers.length>0&&!renames.some(entry=>entry.polarity);return warn(start,{tag:soleTag(renames),member:name,code:shared?RENAME_TARGET_SHARED_REVIEW:RENAME_REVIEW,target:targets.join(" | "),message:(kind==="css-property"?"Custom properties inherit into nested components. ":context==="listener"?"This listener does not prove which element it listens to. ":"This string may name an event of any component. ")+`${list(renames.map(entry=>entry.tag))} renamed the ${label(kind)} ${name} to ${targets.join(" or ")}`+(sourceKeepers.length?`, while ${list(sourceKeepers)} still ${sourceKeepers.length===1?"uses":"use"} ${name}`:"")+(targetKeepers.length?`; ${list(targetKeepers)} already ${targetKeepers.length===1?"uses":"use"} ${targets.join(" and ")}, which this site would start reaching`:"")+(constructed?`; the scanned code also dispatches ${name} itself, so its listeners and dispatches must move together`:"")+`. Update it by hand for the components it is meant for; ${name} keeps working until ${removal}.`+(kind==="event"?detailNote(targets[0]):"")}),null},eventMove=(name,owner,rewritable=!0)=>{if(constructedEvents.has(name))return null;const own=owner?profile.renameFor(owner,"event",name):null;return own?profile.targetKeepers("event",name,own.to).length?null:own.to:!rewritable||!profile.renamesNamed("event",name).length||profile.exposes("event",name,owner)?null:profile.isGlobal("event",name)?profile.renamesNamed("event",name)[0].to:null},conflictMessage=(conflict,subject,to)=>conflict==="same-handler"?`${subject} already listens to ${to} with this same handler; renamed, the two identical registrations would collapse into one, so the handler would run once per activation instead of twice. Rename or remove this call, and its add or remove counterpart, together by hand.`:`${subject} already listens to ${to}; merge the two handlers by hand.`,eventSite=({name,start,owner,context,rewritable=!0,conflict=!1})=>{const retired=owner?profile.retiredEventFor(owner,name):null,retiredCandidates=retired?[retired]:profile.exposes("event",name,owner)?[]:profile.retiredEventsNamed(name);retiredCandidates.length&&warn(start,{tag:retired?owner:soleTag(retiredCandidates),member:name,code:"RETIRED_EVENT_REVIEW",target:unique(retiredCandidates.map(entry=>entry.replacement)).join(", "),message:`${name} is no longer dispatched by ${list(retiredCandidates.map(entry=>entry.tag))} in ${release}. `+retiredCandidates.map(entry=>`${entry.tag}: use ${entry.replacement}. ${entry.summary}`).join(" ")+" Review this listener and its matching removal together; keep unrelated events with the same spelling, check nested event targets, and merge any existing canonical listener without dropping or duplicating handler calls."});const own=owner?profile.renameFor(owner,"event",name):null;let current=name;if(own){const keepers=profile.targetKeepers("event",name,own.to);if(constructedEvents.has(name))warn(start,{tag:owner,member:name,code:RENAME_REVIEW,target:own.to,message:`Not renamed: the scanned code dispatches ${name} itself, so this listener would stop hearing it. Rename the dispatch and its listeners to ${own.to} together; ${name} keeps working until ${removal}.${detailNote(own.to)}`});else if(keepers.length)warn(start,{tag:owner,member:name,code:RENAME_TARGET_SHARED_REVIEW,target:own.to,message:`Not renamed: ${list(keepers)} also ${keepers.length===1?"dispatches":"dispatch"} ${own.to}, so this listener would start receiving their events when they are nested inside this ${owner}. Rename it by hand and ignore events whose target is not this ${owner}; ${name} keeps working until ${removal}.${detailNote(own.to)}`});else if(conflict)warn(start,{tag:owner,member:name,code:RENAME_CONFLICT_REVIEW,target:own.to,message:`${conflictMessage(conflict,`This ${owner}`,own.to)} ${name} keeps working until ${removal}.`});else{const narrowed=profile.sourceKeepers("event",name,own.to).filter(tag=>tag!==owner);rewrite(start,start+name.length,own.to,{tag:owner,member:name,action:"rewrite-event",target:own.to,message:`Rename the ${owner} event ${name} to ${own.to}.`+(narrowed.length?` ${list(narrowed)} still ${narrowed.length===1?"dispatches":"dispatch"} ${name}; this listener stops hearing theirs from nested elements.`:"")}),current=own.to}}else profile.renamesNamed("event",name).length&&!profile.exposes("event",name,owner)&&(conflict?warn(start,{tag:soleTag(profile.renamesNamed("event",name)),member:name,code:RENAME_CONFLICT_REVIEW,target:profile.renamesNamed("event",name)[0].to,message:conflictMessage(conflict,conflict==="same-handler"?"This receiver":"This element",profile.renamesNamed("event",name)[0].to)}):current=unownedMove({kind:"event",name,start,context,rewritable,action:"rewrite-event"})??name);const details=profile.detailsNamed(current),ownDetail=owner?profile.detailFor(owner,current):null;if(ownDetail||details.length&&!profile.exposes("event",current,owner)){const affected=ownDetail?[ownDetail]:details;warn(start,{tag:ownDetail?owner:soleTag(affected),member:current,code:DETAIL_SHAPE_REVIEW,target:current,message:`The ${current} event detail changed in ${release} and cannot be aliased: `+affected.map(entry=>`${entry.tag}: ${entry.summary}`).join(" ")+` Update this handler if it reads the detail of ${ownDetail?`the ${owner} event`:"one of these components"}.`})}const gained=current===name?profile.gainedOwners("event",name):[];gained.length&&!profile.exposes("event",name,owner)&&warn(start,{tag:soleTag(gained.map(tag=>({tag}))),member:name,code:NAME_GAINED_OWNER_REVIEW,target:name,message:`In ${release}, ${list(gained)} also ${gained.length===1?"dispatches":"dispatch"} ${name}. This ${context} does not prove which element it listens to, so it may start receiving those events; ignore them by event target if it should not.`}),unownedReviews("event",name,start,owner)},reportedDetailFieldOffsets=new Set,detailFieldAccess=/\b([A-Za-z_$][\w$]*)\s*(?:\?\.|\.)\s*detail\s*(?:\?\.|\.)\s*(open|collapsed)\b/g,reportDetailField=(field,start,owner=null,event=null)=>{if(reportedDetailFieldOffsets.has(start))return;const exact=owner&&event?profile.detailFieldFor(owner,event):null;if(exact&&exact.field===field){const target=exact.relation==="equal"?"detail.expanded":"!detail.expanded",relation=exact.relation==="equal"?"carries the same value as":"is the inverse of",removal2=exact.removedIn?` It was removed in ${exact.removedIn}.`:" This notice does not assert that the field was removed.";warn(start,{tag:owner,member:field,code:DETAIL_FIELD_REVIEW,target,message:`The ${owner} ${event} detail field ${field} is deprecated: it ${relation} detail.expanded (${exact.notice}). Read ${target} in this handler by hand; no field rewrite was applied.${removal2}`}),reportedDetailFieldOffsets.add(start);return}const candidates=event?profile.detailFieldsNamed(event).filter(entry=>entry.field===field):[],possible=candidates.length?candidates:(profile.data.detailFields??[]).filter(entry=>entry.field===field);if(!possible.length)return;const possibilities=[...new Set(possible.map(entry=>`${entry.tag}/${entry.event} (${entry.relation})`))];warn(start,{tag:null,member:field,code:DETAIL_FIELD_REVIEW,target:null,message:`This detail.${field} read has no proven Lyra tag and event. Matching published field contracts are ${possibilities.join(", ")}; identify the runtime detail type and migrate it by hand. No field rewrite was applied.`}),reportedDetailFieldOffsets.add(start)},inspectMarkupDetailFields=(owner,event,attribute)=>{if(attribute.valueStart===null||attribute.valueEnd===null)return;const value=original.slice(attribute.valueStart,attribute.valueEnd);for(const match of value.matchAll(detailFieldAccess)){const start=attribute.valueStart+match.index+match[0].lastIndexOf(match[2]);reportDetailField(match[2],start,owner,event)}};for(const token of openingTokens){const owner=token.tag.toLowerCase();for(const attribute of parseTagAttributes(original,token)){const event=markupEventName(attribute.rawName);event&&/^lr-/u.test(event.name)&&inspectMarkupDetailFields(owner,event.name,attribute)}}const memberSite=({owner,kind,name,start,forms,dynamic,removal:removalRange})=>{const propertyChange=forms.filter(([candidateKind])=>candidateKind==="property").map(([,candidate])=>profile.propertyChangeFor(owner,candidate)).find(Boolean);propertyChange&&reportPropertyChange(start,propertyChange);const review=forms.map(([candidateKind,candidate])=>profile.reviewFor(owner,candidateKind,candidate)).find(Boolean);review&&reportReview(start,review);const rule=forms.map(([candidateKind,candidate])=>profile.renameFor(owner,candidateKind,candidate)).find(Boolean);if(!rule)return null;if(rule.polarity==="inverted"&&(dynamic||!removalRange)){const target=kind==="binding"?memberStyle(name,rule.to):rule.to;return warn(start,{tag:owner,member:rule.from,code:POLARITY_REVIEW,target:rule.to,message:`${target} is the inverse of ${name} on ${owner}, and this ${kind==="binding"?"binding":kind==="property"?"property access":"attribute binding"} is not a static attribute. Bind the negated value to ${target} by hand; ${name} keeps working until ${removal}.`}),null}return rule},renamedMembers=owner=>unique([...profile.data.renames.filter(entry=>entry.tag===owner&&["attribute","property","event"].includes(entry.kind)).map(entry=>entry.from),...profile.data.reviews.filter(entry=>entry.tag===owner&&["attribute","property","event"].includes(entry.kind)).map(entry=>entry.name),...profile.data.retiredEvents.filter(entry=>entry.tag===owner).map(entry=>entry.event),...profile.data.propertyChanges.filter(entry=>entry.tag===owner).flatMap(entry=>[entry.property,...entry.former?[entry.former]:[]])]),defaultTokens=[];for(const token of openingTokens){const owner=token.tag.toLowerCase(),attributes=parseTagAttributes(original,token),lyraOwner=profile.tags.has(owner),bound=lyraOwner?boundMemberNames(attributes):null,finalNames=new Map,planned=attributes.map(attribute=>{const event=markupEventName(attribute.rawName);let finalRaw=attribute.rawName;if(event&&/^lr-/.test(event.name)){const to=eventMove(event.name,owner);to&&(finalRaw=attribute.rawName.slice(0,event.offset)+to+attribute.rawName.slice(event.offset+event.name.length))}else if(lyraOwner){const binding=markupMemberBinding(attribute),rule=binding&&!binding.form.startsWith("member")&&profile.renameFor(owner,binding.form,binding.name);rule&&!rule.polarity&&(finalRaw=attribute.rawName.slice(0,binding.offset)+rule.to+attribute.rawName.slice(binding.offset+binding.name.length))}const key=finalRaw.toLowerCase();return finalNames.set(key,(finalNames.get(key)??0)+1),{attribute,event,key,renamed:finalRaw!==attribute.rawName}});if(lyraOwner&&renamedMembers(owner).length)for(const group of openingTagBraceGroups(original,token)){const shorthand=/^[A-Za-z_$][\w$]*$/.exec(group.body)?.[0];if(!shorthand){warn(group.start,{tag:owner,member:owner,code:"DYNAMIC_VALUE_REVIEW",target:null,message:`This spread on ${owner} may carry renamed or deprecated members (${list(renamedMembers(owner))}); rename them where the object is built.`});continue}const forms=[["property",camelCase(shorthand)],["attribute",kebabCase(shorthand)]],review=forms.map(([kind,name])=>profile.reviewFor(owner,kind,name)).find(Boolean);review&&reportReview(group.start+1,review);const propertyChange=profile.propertyChangeFor(owner,camelCase(shorthand));propertyChange&&reportPropertyChange(group.start+1,propertyChange);const rule=forms.map(([kind,name])=>profile.renameFor(owner,kind,name)).find(Boolean);rule&&warn(group.start+1,{tag:owner,member:rule.from,code:rule.polarity?POLARITY_REVIEW:RENAME_REVIEW,target:rule.to,message:`The shorthand {${shorthand}} binds the deprecated ${owner} ${rule.kind} ${rule.from}; write ${memberStyle(shorthand,rule.to)}={${rule.polarity?`!${shorthand}`:shorthand}} by hand.`})}for(const{attribute,event,key,renamed}of planned){if(event){/^lr-/.test(event.name)&&(inspectMarkupDetailFields(owner,event.name,attribute),eventSite({name:event.name,start:attribute.nameStart+event.offset,owner,context:"listener",conflict:renamed&&finalNames.get(key)>1}));continue}if(!lyraOwner)continue;if(/^v-(?:bind|on)$/.test(attribute.rawName)||attribute.rawName.startsWith("${")&&!/^\$\{\s*ref\s*\(/.test(attribute.rawName)){renamedMembers(owner).length&&warn(attribute.nameStart,{tag:owner,member:owner,code:"DYNAMIC_VALUE_REVIEW",target:null,message:`This object binding on ${owner} may carry renamed or deprecated members (${list(renamedMembers(owner))}); rename them where the object is built.`});continue}if(attribute.rawName==="exportparts"){if(attribute.valueKind!=="literal"||/\$\{|\{\{/.test(attribute.value??""))continue;for(const match of(attribute.value??"").matchAll(/([^,\s:]+)(\s*:\s*[^,\s]+)?/g)){const inner=match[1],start2=attribute.valueStart+match.index,review=profile.reviewFor(owner,"part",inner);review&&reportReview(start2,review);const rule2=profile.renameFor(owner,"part",inner);rule2&&rewrite(start2,start2+inner.length,match[2]?rule2.to:`${rule2.to}:${inner}`,{tag:owner,member:inner,action:"rewrite-part",target:rule2.to,message:match[2]?`Forward the renamed ${owner} part ${rule2.to} under the same exported name.`:`Forward the renamed ${owner} part ${rule2.to} under its previous exported name ${inner}.`})}continue}const binding=markupMemberBinding(attribute);if(!binding)continue;const forms=binding.form==="member"?[["property",camelCase(binding.name)],["attribute",kebabCase(binding.name)]]:[[binding.form,binding.name]],start=attribute.nameStart+binding.offset,staticAttribute=binding.form==="attribute"&&binding.offset===0&&!binding.dynamic,rule=memberSite({owner,kind:binding.form==="member"?"binding":binding.form,name:binding.name,start,forms,dynamic:binding.dynamic,removal:staticAttribute});if(!rule)continue;if(bound.has(kebabCase(rule.to))||renamed&&finalNames.get(key)>1){warn(start,{tag:owner,member:rule.from,code:RENAME_CONFLICT_REVIEW,target:rule.to,message:`This ${owner} already binds ${rule.to}; remove the deprecated ${rule.from} binding by hand.`});continue}if(rule.polarity==="inverted"){if(!attributeSemantics(token.start)){warn(start,{tag:owner,member:rule.from,code:POLARITY_REVIEW,target:rule.to,message:`${rule.to} is the inverse of ${rule.from}. In this template syntax a static value may be assigned to the ${camelCase(rule.from)} property as a string, where "false" is truthy, so set ${rule.to} by hand.`});continue}if(profile.preservedDefaultsFor(owner).some(entry=>entry.attribute===rule.to&&entry.value===!0)){warn(start,{tag:owner,member:rule.from,code:POLARITY_REVIEW,target:rule.to,message:`${rule.from} has a preserved absent default, so removing an explicit attribute would let a later run insert ${rule.to}. Review this value using the old converter (a presence boolean treats even "false" as true), then migrate it by hand after the default migration is complete.`});continue}const value=attribute.value??"",end=attributeEnd(original,attribute);if(value===""||value==="true"||value===rule.from){let removeFrom=attribute.nameStart;for(;removeFrom>0&&/\s/.test(original[removeFrom-1]);)removeFrom-=1;rewrite(removeFrom,end,"",{tag:owner,member:rule.from,action:"remove-attribute",target:rule.to,message:`Remove ${rule.from}: it restated the ${owner} default, and ${rule.to} is off by default.`})}else value==="false"?rewrite(attribute.nameStart,end,rule.to,{tag:owner,member:rule.from,action:"rewrite-attribute",target:rule.to,message:`Replace ${rule.from}="false" with the presence of ${rule.to}.`}):warn(start,{tag:owner,member:rule.from,code:POLARITY_REVIEW,target:rule.to,message:`${rule.from}="${attribute.value}" is not a boolean literal; set ${rule.to} to its inverse by hand.`});continue}const target=binding.form==="member"?memberStyle(binding.name,rule.to):rule.to;rewrite(start,start+binding.name.length,target,{tag:owner,member:rule.from,action:`rewrite-${rule.kind}`,target:rule.to,message:`Rename the ${owner} ${rule.kind} ${rule.from} to ${rule.to}.`})}lyraOwner&&profile.defaultsFor(owner).length&&defaultTokens.push({token,owner,bound})}const slotTags=[...profile.tags].filter(tag=>profile.slotContentFor(tag).length||[...profile.data.renames,...profile.data.reviews].some(entry=>entry.tag===tag&&entry.kind==="slot"));for(const tag of slotTags)for(const pair of elementPairs(original,tag,inComment))for(const child of directChildTokens(original,pair.opening.end+1,pair.closingStart,inComment)){let slot="",start=child.nameStart;for(const attribute of parseTagAttributes(original,child))if(attribute.rawName==="slot")slot=attribute.valueKind==="literal"?attribute.value??"":null,start=attribute.valueStart??attribute.nameStart;else if(attribute.rawName==="v-slot")slot="";else{const prefix=["v-slot:","#"].find(candidate=>attribute.rawName.startsWith(candidate));prefix&&(slot=attribute.rawName.slice(prefix.length),start=attribute.nameStart+prefix.length,slot==="default"&&(slot=""))}if(slot===null)continue;const review=profile.reviewFor(tag,"slot",slot);review&&reportReview(start,review);const rule=slot===""?null:profile.renameFor(tag,"slot",slot);if(rule&&rewrite(start,start+slot.length,rule.to,{tag,member:slot,action:"rewrite-slot",target:rule.to,message:`Rename the ${tag} slot ${slot} to ${rule.to}.`}),child.tag!=="template")for(const content of profile.slotContentFor(tag)){if(content.slot!==slot)continue;const listed=(content.report??content.allow).includes(child.tag);(content.report?!listed:listed)||warn(child.nameStart,{tag,member:child.tag,code:DEPRECATED_CONTENT_REVIEW,target:null,message:`<${child.tag}> in ${slot===""?"the default slot":`the ${slot} slot`} of ${tag}: ${content.summary}`})}}for(const match of original.matchAll(/::part\(([^)]*)\)/g)){if(inComment(match.index))continue;const owner=compoundTypeBefore(original,match.index),listStart=match.index+7;for(const nameMatch of match[1].matchAll(/\S+/g)){const name=nameMatch[0],start=listStart+nameMatch.index,own=owner?profile.renameFor(owner,"part",name):null;if(own)rewrite(start,start+name.length,own.to,{tag:owner,member:name,action:"rewrite-part",target:own.to,message:`Rename the ${owner} part ${name} to ${own.to}.`});else if(profile.renamesNamed("part",name).length&&!profile.exposes("part",name,owner)){const renames=profile.renamesNamed("part",name),keepers=profile.exposers("part",name).filter(tag=>!renames.some(entry=>entry.tag===tag));warn(start,{tag:soleTag(renames),member:name,code:RENAME_REVIEW,target:list(renames.map(entry=>entry.to)),message:`This ::part() selector does not name the component that owns the part. ${list(renames.map(entry=>entry.tag))} renamed the part ${name} to ${list(renames.map(entry=>entry.to))}`+(keepers.length?`, while ${list(keepers)} still ${keepers.length===1?"exposes":"expose"} ${name}`:"")+". Rename it where the selector reaches a renamed component directly; a part forwarded through exportparts keeps its exported name."})}else if(profile.gainedOwners("part",name).length&&!owner?.startsWith("lr-")){const gained=profile.gainedOwners("part",name);warn(start,{tag:soleTag(gained.map(tag=>({tag}))),member:name,code:NAME_GAINED_OWNER_REVIEW,target:name,message:`In ${release}, ${list(gained)} also ${gained.length===1?"exposes":"expose"} the part ${name}, so this selector may start matching it.`})}unownedReviews("part",name,start,owner)}}const cssNames=new Set([...profile.data.renames.filter(entry=>entry.kind==="css-property").flatMap(entry=>[entry.from,entry.to]),...profile.data.reviews.filter(entry=>entry.kind==="css-property").map(entry=>entry.name)]);if(cssNames.size)for(const match of original.matchAll(/(?<![\w-])--[A-Za-z0-9_-]+/g)){const name=match[0];if(!cssNames.has(name)||inComment(match.index))continue;profile.renamesNamed("css-property",name).length&&unownedMove({kind:"css-property",name,start:match.index,context:"custom property",rewritable:!0,action:"rewrite-css-property"});const declaration=/^\s*['"]?\s*:/.test(original.slice(match.index+name.length,match.index+name.length+16))||/setProperty\s*\(\s*['"`]$/.test(original.slice(Math.max(0,match.index-24),match.index)),gained=profile.gainedOwners("css-property",name);declaration&&gained.length&&warn(match.index,{tag:soleTag(gained.map(tag=>({tag}))),member:name,code:NAME_GAINED_OWNER_REVIEW,target:name,message:`In ${release}, ${list(gained)} also ${gained.length===1?"reads":"read"} ${name}, so this declaration now reaches them when they are nested below it.`});for(const review of profile.reviewsNamed("css-property",name))reportReview(match.index,review)}for(const match of original.matchAll(/\[\s*([A-Za-z_][\w-]*)(?=\s*(?:[~|^$*]?=|\]))/g)){if(inComment(match.index))continue;const owner=compoundTypeBefore(original,match.index);if(!owner||!profile.tags.has(owner))continue;const name=match[1],start=match.index+match[0].length-name.length,review=profile.reviewFor(owner,"attribute",name);review&&reportReview(start,review);const rule=profile.renameFor(owner,"attribute",name);if(rule){if(rule.polarity==="inverted"){warn(start,{tag:owner,member:name,code:POLARITY_REVIEW,target:rule.to,message:`${rule.to} is the inverse of ${name}; rewrite this ${owner} selector to test the opposite state (for example :not([${rule.to}])).`});continue}if(!rule.reflects){warn(start,{tag:owner,member:name,code:RENAME_REVIEW,target:rule.to,message:`${owner} does not reflect ${rule.to}, so [${rule.to}] matches only where markup sets it. Rename this selector once every place that sets ${name} (markup, setAttribute) sets ${rule.to} instead.`});continue}rewrite(start,start+name.length,rule.to,{tag:owner,member:name,action:"rewrite-attribute",target:rule.to,message:`Rename the ${owner} attribute selector [${name}] to [${rule.to}]; ${owner} reflects ${rule.to}.`})}}for(const match of original.matchAll(/:state\(\s*([a-z][a-z0-9-]*)\s*\)/g)){if(inComment(match.index))continue;const owner=compoundTypeBefore(original,match.index),review=owner?profile.reviewFor(owner,"css-state",match[1]):null;review&&reportReview(match.index+match[0].indexOf(match[1]),review)}for(const review of profile.data.reviews.filter(entry=>entry.kind==="component"))for(const match of original.matchAll(new RegExp(`(?<![\\w-])${review.tag}(?![\\w-])`,"g")))inComment(match.index)||original.slice(match.index-2,match.index)==="</"||reportReview(match.index,review);const anchoredDetailListener=/(?:document\.)?querySelector\(\s*(['"])(lr-[a-z0-9-]+)\1\s*\)\s*!?\s*\.\s*addEventListener\(\s*(['"])(lr-[a-z0-9-]+)\3\s*,/g,unownedDetailListener=/[A-Za-z_$][\w$]*\s*\.\s*addEventListener\(\s*(['"])(lr-[a-z0-9-]+)\1\s*,/g,scriptListenerAt=offset=>{const start=Math.max(0,offset-4096),prefix=original.slice(start,offset);let result2=null;for(const pattern of[anchoredDetailListener,unownedDetailListener]){pattern.lastIndex=0;for(const match of prefix.matchAll(pattern)){const event=pattern===anchoredDetailListener?match[4]:match[2],callbackStart=match.index+match[0].length,callback=prefix.slice(callbackStart);!/=>|\bfunction\b/u.test(callback)||/\)\s*;/u.test(callback)||(!result2||match.index>=result2.index)&&(result2={owner:pattern===anchoredDetailListener?match[2]:null,event,index:match.index})}}return result2};for(const match of original.matchAll(detailFieldAccess)){const offset=match.index+match[0].lastIndexOf(match[2]);if(reportedDetailFieldOffsets.has(offset)||inComment(offset)||inLiteral(offset)||inCss(offset))continue;const listener=scriptListenerAt(offset);reportDetailField(match[2],offset,listener?.owner??null,listener?.event??null)}for(const match of original.matchAll(ANCHORED_MEMBER)){if(inComment(match.index))continue;const owner=match[2],member=match[3],start=match.index+match[0].length-member.length,after=start+member.length;if(handledMembers.add(start),LISTENER_METHODS.has(member)||ATTRIBUTE_METHODS.has(member)){const call=/^\s*\(\s*(['"`])([^'"`\n]+)\1/.exec(original.slice(after,after+200));if(!call)continue;const valueStart=after+call[0].length-1-call[2].length;if(handledStrings.add(valueStart-1),LISTENER_METHODS.has(member)){eventSite({name:call[2],start:valueStart,owner,context:"listener",conflict:sameHandlerListens(valueStart-1,call[2])&&"same-handler"});continue}const rule2=memberSite({owner,kind:"attribute",name:call[2],start:valueStart,forms:[["attribute",call[2]]],dynamic:!0});rule2&&rewrite(valueStart,valueStart+call[2].length,rule2.to,{tag:owner,member:rule2.from,action:"rewrite-attribute",target:rule2.to,message:`Rename the ${owner} attribute ${rule2.from} to ${rule2.to}.`});continue}if(!profile.tags.has(owner))continue;if(/^\s*\(/.test(original.slice(after,after+64))){const review=profile.reviewFor(owner,"method",member);review&&reportReview(start,review);continue}const rule=memberSite({owner,kind:"property",name:member,start,forms:[["property",member]],dynamic:!0});rule&&rewrite(start,after,rule.to,{tag:owner,member:rule.from,action:"rewrite-property",target:rule.to,message:`Rename the ${owner} property ${rule.from} to ${rule.to}.`})}const eventNameMatters=name=>profile.renamesNamed("event",name).length||profile.detailsNamed(name).length||profile.retiredEventsNamed(name).length||profile.reviewsNamed("event",name).length||profile.gainedOwners("event",name).length;for(const match of original.matchAll(/(['"`])(?:(window|document|body):)?(lr-[a-z0-9]+(?:-[a-z0-9]+)*)\1/g)){const name=match[3];if(handledStrings.has(match.index)||inComment(match.index)||!eventNameMatters(name))continue;const before=original.slice(Math.max(0,match.index-120),match.index);if(!match[2]&&TAG_API_CALL_BEFORE.test(before))continue;const listener=LISTENER_CALL_BEFORE.test(before);eventSite({name,start:match.index+1+(match[2]?match[2].length+1:0),owner:null,context:listener?"listener":"event name string",rewritable:listener,conflict:listener&&!match[2]&&sameHandlerListens(match.index,name)&&"same-handler"})}const mentioned=mentionedTags(original,profile.tags,inComment),accessRules=new Map,addAccess=(name,candidate)=>accessRules.set(name,[...accessRules.get(name)??[],candidate]);for(const entry of profile.data.renames)entry.kind==="property"&&mentioned.has(entry.tag)&&addAccess(entry.from,{tag:entry.tag,rule:entry,call:!1});for(const entry of profile.data.reviews)(entry.kind==="property"||entry.kind==="method")&&mentioned.has(entry.tag)&&addAccess(entry.name,{tag:entry.tag,review:entry,call:entry.kind==="method"});for(const entry of profile.data.propertyChanges)if(mentioned.has(entry.tag))for(const name of[entry.property,...entry.former?[entry.former]:[]])addAccess(name,{tag:entry.tag,propertyChange:entry,call:!1});if(accessRules.size){const inString=rangeTester(mergeRanges(quotedStringRanges(original,inComment))),inStylesheet=rangeTester(stylesheetRanges(original,file,inComment)),inToken=rangeTester(mergeRanges(openingTokens.map(token=>[token.start+1,token.end])));for(const match of original.matchAll(/(?<=[\w$)\]])\s*(?:\?\.|!?\.)\s*([A-Za-z_$][\w$]*)/g)){const name=match[1],candidates=accessRules.get(name);if(!candidates)continue;const start=match.index+match[0].length-name.length;if(handledMembers.has(start)||reportedDetailFieldOffsets.has(start)||inComment(start)||inString(start)||inStylesheet(start)||inToken(start))continue;const call=/^\s*\(/.test(original.slice(start+name.length,start+name.length+64));for(const candidate of candidates){if(candidate.call!==call)continue;if(candidate.propertyChange){reportPropertyChange(start,candidate.propertyChange);continue}if(candidate.review){reportReview(start,candidate.review);continue}const{rule}=candidate;warn(start,{tag:rule.tag,member:name,code:rule.polarity?POLARITY_REVIEW:RENAME_REVIEW,target:rule.to,message:`If this reads or writes an ${rule.tag}, ${rule.polarity?`use the inverse property .${rule.to}`:`rename .${name} to .${rule.to}`}; .${name} keeps working until ${removal}.`})}}}for(const match of original.matchAll(/\.\s*(?:set|get|has|remove|toggle)Attribute\s*\(\s*(['"`])([a-z][a-z0-9-]*)\1/g)){const name=match[2],start=match.index+match[0].length-1-name.length;if(!(handledStrings.has(start-1)||inComment(match.index)))for(const tag of mentioned){const review=profile.reviewFor(tag,"attribute",name);review&&reportReview(start,review);const rule=profile.renameFor(tag,"attribute",name);rule&&warn(start,{tag,member:name,code:rule.polarity?POLARITY_REVIEW:RENAME_REVIEW,target:rule.to,message:`If this element is an ${tag}, ${rule.polarity?`use the inverse attribute ${rule.to}`:`rename ${name} to ${rule.to}`}; ${name} keeps working until ${removal}.`})}}if(profile.data.defaults.length){const defaultProfiles=new Map([...new Set(profile.data.defaults.map(entry=>entry.tag))].map(tag=>[tag,{origin,tag,defaults:profile.defaultsFor(tag).map(entry=>({member:entry.attribute,value:entry.value}))}])),hazards=scanLocalMigrationHazards(original,defaultProfiles,ignoredRanges,defaultTokens.map(({token})=>({...token,tag:token.tag.toLowerCase()}))),blocked=new Set([...options.blockedLocalMigrations??[],...hazards.blocked]);result.blockedLocalMigrations=hazards.blocked;for(const use of hazards.uses)warn(use.offset,{tag:use.tag,member:use.tag,code:use.warningCode,target:use.tag,message:use.message});for(const{token,owner,bound}of defaultTokens){const missing=profile.defaultsFor(owner).filter(entry=>!profile.defaultAliasesFor(owner,entry.attribute).some(name=>bound.has(name)));if(!missing.length)continue;if(blocked.has(localMigrationKey(origin,owner))){warn(token.nameStart,{tag:owner,member:owner,code:"MAPPING_REVIEW_BLOCKED",target:owner,message:`${owner} did not receive its Lyra ${profile.fromMajor} defaults (${missing.map(entry=>`${entry.attribute}=${String(entry.value)}`).join(", ")}) because the scanned target set accesses it through a DOM alias or an opaque attribute spread. Add them by hand where the previous default matters.`});continue}const insertions=[];for(const entry of missing)insertions.push(serializeLocalDefault({member:entry.attribute,value:entry.value})),result.changes.push(reportEntry({textStarts:starts,file,offset:token.end,origin,upstreamTag:owner,upstreamMember:entry.attribute,action:"insert-default",target:`${entry.attribute}=${String(entry.value)}`,message:`Insert ${entry.attribute} to preserve the Lyra ${profile.fromMajor} default.`}));if(insertions.length){const insertionOffset=original[token.end-1]==="/"?token.end-1:token.end,replacement=/\s/.test(original[insertionOffset-1])?`${insertions.join(" ")} `:` ${insertions.join(" ")}`;edits.push({start:insertionOffset,end:insertionOffset,replacement})}}}if(!profile.skipped.length)for(const{offset,entry}of acknowledgements.unused()){const key=`${offset}:${UNUSED_ACKNOWLEDGEMENT}:${entry.token}`;seenWarnings.has(key)||(seenWarnings.add(key),result.warnings.push(reportEntry({textStarts:starts,file,offset,origin,upstreamTag:null,upstreamMember:entry.token,action:"manual-review",target:null,warningCode:UNUSED_ACKNOWLEDGEMENT,message:entry.code?`The acknowledgement ${entry.token} matches no report on the lines it covers; remove it.`:`The acknowledgement ${entry.token} is not of the form CODE:name, for example DETAIL_SHAPE_REVIEW:lr-close.`})))}return result.content=finalizeEdits(original,edits),sortReportEntries(result.changes,"action"),sortReportEntries(result.warnings,"warningCode"),result}export{migrateRenameText};
|
|
@@ -53,4 +53,4 @@ headingLevel:LyraHeadingLevel;
|
|
|
53
53
|
withoutChart:boolean;chartHeight:string;
|
|
54
54
|
/** Maximum history entries rendered into both the run list and trend chart. Clamped to 1–500. The
|
|
55
55
|
* first N runs in input order are kept, so pass newest-first history to chart the most recent runs. */
|
|
56
|
-
maxRenderedRuns:number;private get normalizedMetrics();private get normalizedRuns();private get activeMetric();private statusLabel;private formatMetric;private renderRuns;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-agent-eval-dashboard':LyraAgentEvalDashboard;}}
|
|
56
|
+
maxRenderedRuns:number;private metricsFor?;private metricsCache;private runsFor?;private runsCache;private get normalizedMetrics();private get normalizedRuns();private slicedFor?;private chartFor?;private chartCache;private chartInputs;private get activeMetric();private statusLabel;private formatMetric;private renderRuns;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-agent-eval-dashboard':LyraAgentEvalDashboard;}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{formatShortDuration}from"../../../internal/duration.js";import{AGENT_STATUS_VARIANTS}from"../../../internal/agent-status-variants.js";import{styles}from"./agent-eval-dashboard.styles.js";import{finiteCount}from"../../../internal/numbers.js";import{agentStatusKind,agentStatusLabel,agentStatusMessage,agentStatusVariant}from"../agent-status-presentation.js";import{agentStatusText}from"../../../internal/agent-status-text.js";import{overallSemanticLabel}from"../semantic-owner.js";import{resolveHeadingLevel}from"../../../internal/heading-level.js";import{firstByIdentity}from"../collection-identity.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{LYRA_DEFAULT_agentRunStatusCancelled,LYRA_DEFAULT_agentRunStatusCollecting,LYRA_DEFAULT_agentRunStatusDone,LYRA_DEFAULT_agentRunStatusIdle,LYRA_DEFAULT_agentRunStatusQueued,LYRA_DEFAULT_agentRunStatusWaitingApproval,LYRA_DEFAULT_agentRunStatusWaitingInput,LYRA_DEFAULT_chartValueLabel,LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_details,LYRA_DEFAULT_durationMilliseconds,LYRA_DEFAULT_durationSeconds,LYRA_DEFAULT_evaluationDashboardLabel,LYRA_DEFAULT_evaluationDashboardNoRuns,LYRA_DEFAULT_evaluationDashboardRunsLabel,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_ragEvalDashboardRunsLimit,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_statusError,LYRA_DEFAULT_statusRunning}from"../../../internal/default-strings.generated.js";class LyraAgentEvalDashboard extends LyraElement{constructor(){super(...arguments),this.limitAnnouncements=new AnnouncementSinkController(this,{eager:["polite"]}),this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.projectedRunsTruncated=!1,this.metrics=[],this.runs=[],this.metricId=null,this.currency="USD",this.headingLevel="2",this.withoutChart=!1,this.chartHeight="220px",this.maxRenderedRuns=100}static{this.defaultStrings={...super.defaultStrings,agentRunStatusCancelled:LYRA_DEFAULT_agentRunStatusCancelled,agentRunStatusCollecting:LYRA_DEFAULT_agentRunStatusCollecting,agentRunStatusDone:LYRA_DEFAULT_agentRunStatusDone,agentRunStatusIdle:LYRA_DEFAULT_agentRunStatusIdle,agentRunStatusQueued:LYRA_DEFAULT_agentRunStatusQueued,agentRunStatusWaitingApproval:LYRA_DEFAULT_agentRunStatusWaitingApproval,agentRunStatusWaitingInput:LYRA_DEFAULT_agentRunStatusWaitingInput,chartValueLabel:LYRA_DEFAULT_chartValueLabel,collapse:LYRA_DEFAULT_collapse,copy:LYRA_DEFAULT_copy,details:LYRA_DEFAULT_details,durationMilliseconds:LYRA_DEFAULT_durationMilliseconds,durationSeconds:LYRA_DEFAULT_durationSeconds,evaluationDashboardLabel:LYRA_DEFAULT_evaluationDashboardLabel,evaluationDashboardNoRuns:LYRA_DEFAULT_evaluationDashboardNoRuns,evaluationDashboardRunsLabel:LYRA_DEFAULT_evaluationDashboardRunsLabel,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,ragEvalDashboardRunsLimit:LYRA_DEFAULT_ragEvalDashboardRunsLimit,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,statusError:LYRA_DEFAULT_statusError,statusRunning:LYRA_DEFAULT_statusRunning}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["metrics","runs"])}static{this.immutableEventDetails=Object.freeze(["lr-run-activate"])}static{this.styles=[LyraElement.styles,styles]}adoptedCallback(){super.adoptedCallback(),this.limitAnnouncements.adopted()}updated(changed){super.updated(changed),this.limitAnnouncementInitialized&&this.projectedRunsTruncated&&!this.previouslyTruncated&&this.limitAnnouncements.announcePolite(this.localize("ragEvalDashboardRunsLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(Math.max(1,finiteCount(this.maxRenderedRuns,100,500)))})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.projectedRunsTruncated}get normalizedMetrics(){return firstByIdentity(Array.isArray(this.metrics)?this.metrics:[],metric=>metric.id)}get normalizedRuns(){return firstByIdentity(Array.isArray(this.runs)?this.runs:[],run=>run.id)}get activeMetric(){const metrics=this.normalizedMetrics;return this.metricId===null?metrics[0]:metrics.find(metric=>metric.id===this.metricId)??metrics[0]}statusLabel(status){return agentStatusLabel(status)??agentStatusText(this.localize.bind(this),agentStatusKind(status))}formatMetric(metric,value=metric.value){const safe=Number.isFinite(value)?value:0;switch(metric.format){case"percent":return getNumberFormat(this.effectiveLocale,{style:"percent",maximumFractionDigits:1}).format(safe);case"milliseconds":return formatShortDuration(this.localize.bind(this),this.effectiveLocale,safe);case"currency":try{return getNumberFormat(this.effectiveLocale,{style:"currency",currency:this.currency,maximumFractionDigits:2}).format(safe)}catch{return getNumberFormat(this.effectiveLocale,{style:"currency",currency:"USD",maximumFractionDigits:2}).format(safe)}default:return getNumberFormat(this.effectiveLocale,{maximumFractionDigits:2}).format(safe)}}renderRuns(runs){if(!runs.length)return html`<p part="empty">${this.localize("evaluationDashboardNoRuns")}</p>`;const active=this.activeMetric,level=resolveHeadingLevel(this.headingLevel??"2"),runsLevel=level&&String(Math.min(6,Number(level)+1));return html`<section part="runs" aria-label=${this.localize("evaluationDashboardRunsLabel")}><div part="runs-heading" role=${runsLevel?"heading":nothing} aria-level=${runsLevel||nothing}>${this.localize("evaluationDashboardRunsLabel")}</div>${repeat(runs,run=>run.id,run=>{const kind=agentStatusKind(run.status),message=agentStatusMessage(run.status);return html`<button part="run" type="button" @click=${()=>this.emit("lr-run-activate",{runId:run.id,run})}><span part="run-label">${run.label}</span><span part="run-meta"><lr-badge part="run-status" variant=${agentStatusVariant(run.status,AGENT_STATUS_VARIANTS[kind]??"neutral")}>${this.statusLabel(run.status)}</lr-badge>${message!==void 0?html`<span part="run-status-message">${message}</span>`:nothing}${active&&run.metrics?.[active.id]!=null?html`<span>${this.formatMetric(active,run.metrics[active.id])}</span>`:nothing}</span></button>`})}</section>`}render(){const label=this.label==null?this.localize("evaluationDashboardLabel"):this.label,semanticLabel=overallSemanticLabel(this,label),active=this.activeMetric,allRuns=this.normalizedRuns,
|
|
1
|
+
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{formatShortDuration}from"../../../internal/duration.js";import{AGENT_STATUS_VARIANTS}from"../../../internal/agent-status-variants.js";import{styles}from"./agent-eval-dashboard.styles.js";import{finiteCount}from"../../../internal/numbers.js";import{agentStatusKind,agentStatusLabel,agentStatusMessage,agentStatusVariant}from"../agent-status-presentation.js";import{agentStatusText}from"../../../internal/agent-status-text.js";import{overallSemanticLabel}from"../semantic-owner.js";import{resolveHeadingLevel}from"../../../internal/heading-level.js";import{firstByIdentity}from"../collection-identity.js";import{AnnouncementSinkController}from"../../../internal/announcer.js";import{LYRA_DEFAULT_agentRunStatusCancelled,LYRA_DEFAULT_agentRunStatusCollecting,LYRA_DEFAULT_agentRunStatusDone,LYRA_DEFAULT_agentRunStatusIdle,LYRA_DEFAULT_agentRunStatusQueued,LYRA_DEFAULT_agentRunStatusWaitingApproval,LYRA_DEFAULT_agentRunStatusWaitingInput,LYRA_DEFAULT_chartValueLabel,LYRA_DEFAULT_collapse,LYRA_DEFAULT_copy,LYRA_DEFAULT_details,LYRA_DEFAULT_durationMilliseconds,LYRA_DEFAULT_durationSeconds,LYRA_DEFAULT_evaluationDashboardLabel,LYRA_DEFAULT_evaluationDashboardNoRuns,LYRA_DEFAULT_evaluationDashboardRunsLabel,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_ragEvalDashboardRunsLimit,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_statusError,LYRA_DEFAULT_statusRunning}from"../../../internal/default-strings.generated.js";class LyraAgentEvalDashboard extends LyraElement{constructor(){super(...arguments),this.limitAnnouncements=new AnnouncementSinkController(this,{eager:["polite"]}),this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.projectedRunsTruncated=!1,this.metrics=[],this.runs=[],this.metricId=null,this.currency="USD",this.headingLevel="2",this.withoutChart=!1,this.chartHeight="220px",this.maxRenderedRuns=100,this.metricsCache=[],this.runsCache=[],this.chartCache={labels:[],datasets:[]}}static{this.defaultStrings={...super.defaultStrings,agentRunStatusCancelled:LYRA_DEFAULT_agentRunStatusCancelled,agentRunStatusCollecting:LYRA_DEFAULT_agentRunStatusCollecting,agentRunStatusDone:LYRA_DEFAULT_agentRunStatusDone,agentRunStatusIdle:LYRA_DEFAULT_agentRunStatusIdle,agentRunStatusQueued:LYRA_DEFAULT_agentRunStatusQueued,agentRunStatusWaitingApproval:LYRA_DEFAULT_agentRunStatusWaitingApproval,agentRunStatusWaitingInput:LYRA_DEFAULT_agentRunStatusWaitingInput,chartValueLabel:LYRA_DEFAULT_chartValueLabel,collapse:LYRA_DEFAULT_collapse,copy:LYRA_DEFAULT_copy,details:LYRA_DEFAULT_details,durationMilliseconds:LYRA_DEFAULT_durationMilliseconds,durationSeconds:LYRA_DEFAULT_durationSeconds,evaluationDashboardLabel:LYRA_DEFAULT_evaluationDashboardLabel,evaluationDashboardNoRuns:LYRA_DEFAULT_evaluationDashboardNoRuns,evaluationDashboardRunsLabel:LYRA_DEFAULT_evaluationDashboardRunsLabel,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,ragEvalDashboardRunsLimit:LYRA_DEFAULT_ragEvalDashboardRunsLimit,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,statusError:LYRA_DEFAULT_statusError,statusRunning:LYRA_DEFAULT_statusRunning}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["metrics","runs"])}static{this.immutableEventDetails=Object.freeze(["lr-run-activate"])}static{this.styles=[LyraElement.styles,styles]}adoptedCallback(){super.adoptedCallback(),this.limitAnnouncements.adopted()}updated(changed){super.updated(changed),this.limitAnnouncementInitialized&&this.projectedRunsTruncated&&!this.previouslyTruncated&&this.limitAnnouncements.announcePolite(this.localize("ragEvalDashboardRunsLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(Math.max(1,finiteCount(this.maxRenderedRuns,100,500)))})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.projectedRunsTruncated}get normalizedMetrics(){return this.metricsFor!==this.metrics&&(this.metricsFor=this.metrics,this.metricsCache=firstByIdentity(Array.isArray(this.metrics)?this.metrics:[],metric=>metric.id)),this.metricsCache}get normalizedRuns(){return this.runsFor!==this.runs&&(this.runsFor=this.runs,this.runsCache=firstByIdentity(Array.isArray(this.runs)?this.runs:[],run=>run.id)),this.runsCache}chartInputs(runs,active){if(this.chartFor?.runs!==runs||this.chartFor.active!==active){this.chartFor={runs,active};const values=runs.map(run=>{const value=active?run.metrics?.[active.id]:void 0;return value!=null&&Number.isFinite(value)?value:null});this.chartCache={labels:runs.map(run=>run.label),datasets:active?[{label:active.label,data:values}]:[]}}return this.chartCache}get activeMetric(){const metrics=this.normalizedMetrics;return this.metricId===null?metrics[0]:metrics.find(metric=>metric.id===this.metricId)??metrics[0]}statusLabel(status){return agentStatusLabel(status)??agentStatusText(this.localize.bind(this),agentStatusKind(status))}formatMetric(metric,value=metric.value){const safe=Number.isFinite(value)?value:0;switch(metric.format){case"percent":return getNumberFormat(this.effectiveLocale,{style:"percent",maximumFractionDigits:1}).format(safe);case"milliseconds":return formatShortDuration(this.localize.bind(this),this.effectiveLocale,safe);case"currency":try{return getNumberFormat(this.effectiveLocale,{style:"currency",currency:this.currency,maximumFractionDigits:2}).format(safe)}catch{return getNumberFormat(this.effectiveLocale,{style:"currency",currency:"USD",maximumFractionDigits:2}).format(safe)}default:return getNumberFormat(this.effectiveLocale,{maximumFractionDigits:2}).format(safe)}}renderRuns(runs){if(!runs.length)return html`<p part="empty">${this.localize("evaluationDashboardNoRuns")}</p>`;const active=this.activeMetric,level=resolveHeadingLevel(this.headingLevel??"2"),runsLevel=level&&String(Math.min(6,Number(level)+1));return html`<section part="runs" aria-label=${this.localize("evaluationDashboardRunsLabel")}><div part="runs-heading" role=${runsLevel?"heading":nothing} aria-level=${runsLevel||nothing}>${this.localize("evaluationDashboardRunsLabel")}</div>${repeat(runs,run=>run.id,run=>{const kind=agentStatusKind(run.status),message=agentStatusMessage(run.status);return html`<button part="run" type="button" @click=${()=>this.emit("lr-run-activate",{runId:run.id,run})}><span part="run-label">${run.label}</span><span part="run-meta"><lr-badge part="run-status" variant=${agentStatusVariant(run.status,AGENT_STATUS_VARIANTS[kind]??"neutral")}>${this.statusLabel(run.status)}</lr-badge>${message!==void 0?html`<span part="run-status-message">${message}</span>`:nothing}${active&&run.metrics?.[active.id]!=null?html`<span>${this.formatMetric(active,run.metrics[active.id])}</span>`:nothing}</span></button>`})}</section>`}render(){const label=this.label==null?this.localize("evaluationDashboardLabel"):this.label,semanticLabel=overallSemanticLabel(this,label),active=this.activeMetric,allRuns=this.normalizedRuns,limit=Math.max(1,finiteCount(this.maxRenderedRuns,100,500));(this.slicedFor?.source!==allRuns||this.slicedFor.limit!==limit)&&(this.slicedFor={source:allRuns,limit,runs:allRuns.slice(0,limit)});const runs=this.slicedFor.runs;this.projectedRunsTruncated=allRuns.length>runs.length;const metrics=this.normalizedMetrics,level=resolveHeadingLevel(this.headingLevel??"2");return html`<section part="base" aria-label=${semanticLabel??nothing}>
|
|
2
2
|
${label===""?nothing:html`<div part="heading" role=${level?"heading":nothing} aria-level=${level??nothing}>${label}</div>`}
|
|
3
3
|
${metrics.length?html`<div part="metrics">${repeat(metrics,metric=>metric.id,metric=>{const value=this.formatMetric(metric);return html`<button
|
|
4
4
|
part="metric"
|
|
@@ -8,7 +8,7 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
8
8
|
aria-label=${this.localize("chartValueLabel",void 0,{label:metric.label,value})}
|
|
9
9
|
@click=${()=>{this.emit("lr-metric-change-request",{metricId:metric.id}),this.emit("lr-metric-change",{metricId:metric.id})}}
|
|
10
10
|
><lr-stat frame="plain" .label=${metric.label} .value=${value}></lr-stat></button>`})}</div>`:nothing}
|
|
11
|
-
${!this.withoutChart&&active&&runs.length?html`<div part="chart"><lr-lite-chart type="line" .height=${this.chartHeight} .labels=${
|
|
11
|
+
${!this.withoutChart&&active&&runs.length?html`<div part="chart"><lr-lite-chart type="line" .height=${this.chartHeight} .labels=${this.chartInputs(runs,active).labels} .datasets=${this.chartInputs(runs,active).datasets} with-legend aria-label=${active.label}></lr-lite-chart></div>`:nothing}
|
|
12
12
|
${this.renderRuns(runs)}
|
|
13
13
|
${this.projectedRunsTruncated?html`<p part="limit" role="note">${this.localize("ragEvalDashboardRunsLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(runs.length)})}</p>`:nothing}
|
|
14
14
|
</section>`}}__decorate([property({attribute:!1})],LyraAgentEvalDashboard.prototype,"metrics",void 0),__decorate([property({attribute:!1})],LyraAgentEvalDashboard.prototype,"runs",void 0),__decorate([property({attribute:"metric-id"})],LyraAgentEvalDashboard.prototype,"metricId",void 0),__decorate([property()],LyraAgentEvalDashboard.prototype,"currency",void 0),__decorate([property()],LyraAgentEvalDashboard.prototype,"label",void 0),__decorate([property({attribute:"heading-level"})],LyraAgentEvalDashboard.prototype,"headingLevel",void 0),__decorate([property({type:Boolean,attribute:"without-chart",reflect:!0})],LyraAgentEvalDashboard.prototype,"withoutChart",void 0),__decorate([property({attribute:"chart-height"})],LyraAgentEvalDashboard.prototype,"chartHeight",void 0),__decorate([property({type:Number,attribute:"max-rendered-runs"})],LyraAgentEvalDashboard.prototype,"maxRenderedRuns",void 0);export{LyraAgentEvalDashboard};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,query}from"lit/decorators.js";import{keyed}from"lit/directives/keyed.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{deepActiveElementIn}from"../../../internal/active-element.js";import{focusFirstAvailable}from"../../../internal/focus-navigation.js";import{styles}from"./approval-queue.styles.js";import{overallSemanticLabel}from"../semantic-owner.js";import{firstByIdentity}from"../collection-identity.js";import{LYRA_DEFAULT_approvalQueueEmpty,LYRA_DEFAULT_approvalQueueLabel,LYRA_DEFAULT_approvalQueueLimit,LYRA_DEFAULT_approvalQueueOpen,LYRA_DEFAULT_approvalQueuePending,LYRA_DEFAULT_approvalQueuePendingCount,LYRA_DEFAULT_confirmApproved,LYRA_DEFAULT_confirmDenied}from"../../../internal/default-strings.generated.js";const MAX_RENDERED_REQUESTS=500,normalizedRequestCache=new WeakMap;class LyraApprovalQueue extends LyraElement{constructor(){super(...arguments),this.requests=[],this.selectedInvocationId=null,this.open=!1,this.readonly=!1,this.nestedCloseInvocationId=null,this.decidedInvocationIds=new Set,this.settledAnnouncements=[],this.focusAnchorId=null,this.decisionDispatching=!1}static{this.defaultStrings={...super.defaultStrings,approvalQueueEmpty:LYRA_DEFAULT_approvalQueueEmpty,approvalQueueLabel:LYRA_DEFAULT_approvalQueueLabel,approvalQueueLimit:LYRA_DEFAULT_approvalQueueLimit,approvalQueueOpen:LYRA_DEFAULT_approvalQueueOpen,approvalQueuePending:LYRA_DEFAULT_approvalQueuePending,approvalQueuePendingCount:LYRA_DEFAULT_approvalQueuePendingCount,confirmApproved:LYRA_DEFAULT_confirmApproved,confirmDenied:LYRA_DEFAULT_confirmDenied}}emitApprovalDecisionRequest(detail){return this.emit("lr-approval-decision-request",Object.freeze(detail),{cancelable:!0})}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["requests"])}static{this.styles=[LyraElement.styles,styles]}connectedCallback(){super.connectedCallback(),this.sink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this})}disconnectedCallback(){super.disconnectedCallback(),this.sink?.release(),this.sink=void 0,this.decidedInvocationIds.clear(),this.settledAnnouncements=[]}get pendingApproval(){return this.dialogEl?.pendingAction??null}finalizePendingApproval(){const pending=this.pendingApproval;pending&&this.dialogEl?.close(pending)}revertPendingApproval(){this.dialogEl&&(this.dialogEl.pendingAction=null)}normalizedRequestsFor(value){if(!Array.isArray(value))return[];let normalized=normalizedRequestCache.get(value);return normalized||(normalized=firstByIdentity(value,request=>request.id),Object.isFrozen(value)&&normalizedRequestCache.set(value,normalized)),normalized}stableDialogArgs(request){let json="";try{json=JSON.stringify(request.args)??""}catch{}const previous=this.dialogArgs;return json&&previous?.id===request.id&&previous.json===json?previous.args:(this.dialogArgs={id:request.id,json,args:request.args},request.args)}get normalizedRequests(){return this.normalizedRequestsFor(this.requests)}get selectedRequest(){return this.normalizedRequests.find(request=>request.id===this.selectedInvocationId)}willUpdate(changed){if(super.willUpdate(changed),changed.has("requests")&&this.hasUpdated&&this.prepareRequestsUpdate(),!changed.has("requests")&&!changed.has("selectedInvocationId"))return;const selectedInvocationId=this.selectedInvocationId,selected=this.selectedRequest;if(selected&&(selected.status??"pending")==="pending")return;const previousSelected=selectedInvocationId!==null&&changed.has("requests")?this.normalizedRequestsFor(changed.get("requests")).find(request=>request.id===selectedInvocationId):void 0,invalidated=this.hasUpdated&&!changed.has("selectedInvocationId")&&selectedInvocationId!==null&&previousSelected!==void 0&&(previousSelected.status??"pending")==="pending",nestedCloseInSameCycle=this.nestedCloseInvocationId===selectedInvocationId;this.selectedInvocationId=null,this.open=!1,invalidated&&!nestedCloseInSameCycle&&this.emit("lr-approval-close",{invocationId:selectedInvocationId,reason:"request-invalidated"})}updated(changed){super.updated(changed),this.nestedCloseInvocationId=null;const anchorId=this.focusAnchorId;this.focusAnchorId=null;const active=deepActiveElementIn(this.ownerDocument);if(anchorId!==null&&(!active||active===this.ownerDocument.body||active.disabled)){const rows=[...this.renderRoot.querySelectorAll('[part~="request"]')],index=rows.findIndex(row=>row.dataset.requestId===anchorId);focusFirstAvailable([...rows.slice(index+1),...rows.slice(0,Math.max(index,0)).reverse(),this.countEl])}for(const text of this.settledAnnouncements.splice(0))this.sink?.announce(text)}prepareRequestsUpdate(){const active=this
|
|
1
|
+
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property,query}from"lit/decorators.js";import{keyed}from"lit/directives/keyed.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{deepActiveElementIn,shadowFocusTarget}from"../../../internal/active-element.js";import{focusFirstAvailable}from"../../../internal/focus-navigation.js";import{styles}from"./approval-queue.styles.js";import{overallSemanticLabel}from"../semantic-owner.js";import{firstByIdentity}from"../collection-identity.js";import{LYRA_DEFAULT_approvalQueueEmpty,LYRA_DEFAULT_approvalQueueLabel,LYRA_DEFAULT_approvalQueueLimit,LYRA_DEFAULT_approvalQueueOpen,LYRA_DEFAULT_approvalQueuePending,LYRA_DEFAULT_approvalQueuePendingCount,LYRA_DEFAULT_confirmApproved,LYRA_DEFAULT_confirmDenied}from"../../../internal/default-strings.generated.js";const MAX_RENDERED_REQUESTS=500,normalizedRequestCache=new WeakMap;class LyraApprovalQueue extends LyraElement{constructor(){super(...arguments),this.requests=[],this.selectedInvocationId=null,this.open=!1,this.readonly=!1,this.nestedCloseInvocationId=null,this.decidedInvocationIds=new Set,this.settledAnnouncements=[],this.focusAnchorId=null,this.decisionDispatching=!1}static{this.defaultStrings={...super.defaultStrings,approvalQueueEmpty:LYRA_DEFAULT_approvalQueueEmpty,approvalQueueLabel:LYRA_DEFAULT_approvalQueueLabel,approvalQueueLimit:LYRA_DEFAULT_approvalQueueLimit,approvalQueueOpen:LYRA_DEFAULT_approvalQueueOpen,approvalQueuePending:LYRA_DEFAULT_approvalQueuePending,approvalQueuePendingCount:LYRA_DEFAULT_approvalQueuePendingCount,confirmApproved:LYRA_DEFAULT_confirmApproved,confirmDenied:LYRA_DEFAULT_confirmDenied}}emitApprovalDecisionRequest(detail){return this.emit("lr-approval-decision-request",Object.freeze(detail),{cancelable:!0})}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["requests"])}static{this.styles=[LyraElement.styles,styles]}connectedCallback(){super.connectedCallback(),this.sink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this})}disconnectedCallback(){super.disconnectedCallback(),this.sink?.release(),this.sink=void 0,this.decidedInvocationIds.clear(),this.settledAnnouncements=[]}get pendingApproval(){return this.dialogEl?.pendingAction??null}finalizePendingApproval(){const pending=this.pendingApproval;pending&&this.dialogEl?.close(pending)}revertPendingApproval(){this.dialogEl&&(this.dialogEl.pendingAction=null)}normalizedRequestsFor(value){if(!Array.isArray(value))return[];let normalized=normalizedRequestCache.get(value);return normalized||(normalized=firstByIdentity(value,request=>request.id),Object.isFrozen(value)&&normalizedRequestCache.set(value,normalized)),normalized}stableDialogArgs(request){let json="";try{json=JSON.stringify(request.args)??""}catch{}const previous=this.dialogArgs;return json&&previous?.id===request.id&&previous.json===json?previous.args:(this.dialogArgs={id:request.id,json,args:request.args},request.args)}get normalizedRequests(){return this.normalizedRequestsFor(this.requests)}get selectedRequest(){return this.normalizedRequests.find(request=>request.id===this.selectedInvocationId)}willUpdate(changed){if(super.willUpdate(changed),changed.has("requests")&&this.hasUpdated&&this.prepareRequestsUpdate(),!changed.has("requests")&&!changed.has("selectedInvocationId"))return;const selectedInvocationId=this.selectedInvocationId,selected=this.selectedRequest;if(selected&&(selected.status??"pending")==="pending")return;const previousSelected=selectedInvocationId!==null&&changed.has("requests")?this.normalizedRequestsFor(changed.get("requests")).find(request=>request.id===selectedInvocationId):void 0,invalidated=this.hasUpdated&&!changed.has("selectedInvocationId")&&selectedInvocationId!==null&&previousSelected!==void 0&&(previousSelected.status??"pending")==="pending",nestedCloseInSameCycle=this.nestedCloseInvocationId===selectedInvocationId;this.selectedInvocationId=null,this.open=!1,invalidated&&!nestedCloseInSameCycle&&this.emit("lr-approval-close",{invocationId:selectedInvocationId,reason:"request-invalidated"})}updated(changed){super.updated(changed),this.nestedCloseInvocationId=null;const anchorId=this.focusAnchorId;this.focusAnchorId=null;const active=deepActiveElementIn(this.ownerDocument);if(anchorId!==null&&(!active||active===this.ownerDocument.body||active.disabled)){const rows=[...this.renderRoot.querySelectorAll('[part~="request"]')],index=rows.findIndex(row=>row.dataset.requestId===anchorId);focusFirstAvailable([...rows.slice(index+1),...rows.slice(0,Math.max(index,0)).reverse(),this.countEl])}for(const text of this.settledAnnouncements.splice(0))this.sink?.announce(text)}prepareRequestsUpdate(){const active=shadowFocusTarget(this);this.focusAnchorId=active&&active===this.dialogEl?this.selectedInvocationId:active?.dataset.requestId??null;for(const id of this.decidedInvocationIds){const request=this.normalizedRequests.find(candidate=>candidate.id===id),status=request&&(request.status??"pending");status!=="pending"&&(this.decidedInvocationIds.delete(id),status&&this.settledAnnouncements.push(this.statusLabel(status)))}}pendingCount(){return this.normalizedRequests.filter(request=>(request.status??"pending")==="pending").length}formatCount(value){return getNumberFormat(this.effectiveLocale).format(value)}statusLabel(status){return status==="approved"?this.localize("confirmApproved"):status==="denied"?this.localize("confirmDenied"):this.localize("approvalQueuePending")}statusVariant(status){return status==="approved"?"success":status==="denied"?"danger":"warning"}select(request){(request.status??"pending")==="pending"&&(this.selectedInvocationId=request.id,this.open=!0,this.emit("lr-approval-select",{invocationId:request.id}))}onApprove(request,event){if(!this.decisionDispatching){this.decisionDispatching=!0;try{if(event.stopPropagation(),(request.status??"pending")!=="pending")return;this.decidedInvocationIds.add(request.id),this.emitApprovalDecisionRequest({invocationId:request.id,approved:!0,args:event.detail.args}).defaultPrevented&&event.preventDefault()}finally{this.decisionDispatching=!1}}}onDeny(request,event){if(!this.decisionDispatching){this.decisionDispatching=!0;try{if(event.stopPropagation(),(request.status??"pending")!=="pending")return;this.decidedInvocationIds.add(request.id),this.emitApprovalDecisionRequest({invocationId:request.id,approved:!1}).defaultPrevented&&event.preventDefault()}finally{this.decisionDispatching=!1}}}onClose(request,event){if(event.stopPropagation(),this.nestedCloseInvocationId=request.id,request.id===this.selectedInvocationId){const wasOpen=this.open;this.open=!1,wasOpen||this.requestUpdate()}else this.requestUpdate();this.emit("lr-approval-close",{invocationId:request.id,reason:event.detail.reason})}renderRequest(request){const status=request.status??"pending",statusId=`approval-queue-status-${request.id}`;return html`<div role="listitem"><button
|
|
2
2
|
part="request"
|
|
3
3
|
type="button"
|
|
4
4
|
data-request-id=${request.id}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{LyraFrame,LyraVariant,LyraSize}from'../../../internal/variants.js';import{type LyraHeadingLevel}from'../../../internal/heading-level.js';import'../../layout/details/details.class.js';import'../../utility/json-viewer/json-viewer.class.js';import'../../utility/live-region/live-region.class.js';import'../../forms/button/button.class.js';import{type ApprovalAction,type ApprovalDecision}from'../approval-state.js';export type ConfirmBarDecision=ApprovalDecision|null;
|
|
1
|
+
import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import type{LyraFrame,LyraVariant,LyraSize}from'../../../internal/variants.js';import{type LyraHeadingLevel}from'../../../internal/heading-level.js';import'../../layout/details/details.class.js';import'../../utility/json-viewer/json-viewer.class.js';import'../../utility/live-region/live-region.class.js';import'../../forms/button/button.class.js';import{type ApprovalAction,type ApprovalDecision}from'../approval-state.js';import{type ApprovalWaitUntil}from'../../../internal/approval-wait-until.js';export type ConfirmBarDecision=ApprovalDecision|null;
|
|
2
2
|
/** A genuine two-member subset of the shared `LyraVariant` vocabulary: a confirmation is either
|
|
3
3
|
* routine or destructive, and `brand`/`success`/`warning` have no meaning for a proposal awaiting
|
|
4
4
|
* a yes/no. Spelled as an `Extract` of the shared union rather than a re-declared literal pair so
|
|
@@ -21,7 +21,7 @@ export type ConfirmBarReturnFocusTarget=HTMLElement|null|(()=>HTMLElement|null);
|
|
|
21
21
|
* finalizes the decision, a rejection restores the undecided state. Calling it more than once (from
|
|
22
22
|
* one listener or several) waits for all of them.
|
|
23
23
|
*/
|
|
24
|
-
export type ConfirmBarWaitUntil=
|
|
24
|
+
export type ConfirmBarWaitUntil=ApprovalWaitUntil;export interface LyraConfirmBarEventMap{'lr-approve-request':CustomEvent<{args:unknown;waitUntil:ConfirmBarWaitUntil;}>;'lr-deny-request':CustomEvent<{waitUntil:ConfirmBarWaitUntil;}>;'lr-decision-settled':CustomEvent<{decision:ApprovalDecision;}>;}
|
|
25
25
|
/**
|
|
26
26
|
* `<lr-confirm-bar>` — an inline, non-modal approve/deny block for one proposed action: the
|
|
27
27
|
* in-flow sibling of `<lr-tool-approval-dialog>` for confirmations that should sit in the
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{html,nothing,svg}from"lit";import{property,query,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{renderApproveAction,renderDenyAction}from"../approval-action-buttons.js";import{hasRealContent,hostAriaLabel,nextId}from"../../../internal/a11y.js";import{resolveHeadingLevel}from"../../../internal/heading-level.js";import{deferComposedFocusRepair,focusFirstAvailable,isComposedFocusAvailable,repairComposedFocus}from"../../../internal/focus-navigation.js";import{
|
|
1
|
+
import{__decorate}from"tslib";import{html,nothing,svg}from"lit";import{property,query,state}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{renderApproveAction,renderDenyAction}from"../approval-action-buttons.js";import{hasRealContent,hostAriaLabel,nextId}from"../../../internal/a11y.js";import{resolveHeadingLevel}from"../../../internal/heading-level.js";import{deferComposedFocusRepair,focusFirstAvailable,isComposedFocusAvailable,repairComposedFocus}from"../../../internal/focus-navigation.js";import{markVetoGuardWrite,VetoWriteGuard}from"../../../internal/veto-write-guard.js";import{resolveLocalizedParts}from"../../../internal/localization-runtime.js";import{optionalLiteralSetConverter}from"../../../internal/converters.js";import"../../layout/details/details.class.js";import"../../utility/json-viewer/json-viewer.class.js";import"../../utility/live-region/live-region.class.js";import"../../forms/button/button.class.js";import{styles}from"./confirm-bar.styles.js";import{approvalAction}from"../approval-state.js";import{createWaitUntil}from"../../../internal/approval-wait-until.js";import{LYRA_DEFAULT_approve,LYRA_DEFAULT_collapse,LYRA_DEFAULT_confirmApproved,LYRA_DEFAULT_confirmApprovedAnnounce,LYRA_DEFAULT_confirmDenied,LYRA_DEFAULT_confirmDeniedAnnounce,LYRA_DEFAULT_date,LYRA_DEFAULT_deny,LYRA_DEFAULT_details,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_progress,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_toolApprovalArgsLabel,LYRA_DEFAULT_toolApprovalGenericTool,LYRA_DEFAULT_toolApprovalHeading,LYRA_DEFAULT_viewerSearchActiveMatch,LYRA_DEFAULT_viewerSearchMatchCount,LYRA_DEFAULT_viewerSearchNoMatches}from"../../../internal/default-strings.generated.js";const CONFIRM_BAR_DECISION=optionalLiteralSetConverter(["approved","denied"]),CONFIRM_BAR_PENDING_ACTION=optionalLiteralSetConverter(["approve","deny"]),ICON_VIEW_BOX="0 0 24 24",ICON_STROKE_WIDTH="1.75";function approvedIcon(){return svg`
|
|
2
2
|
<svg width="1em" height="1em" viewBox=${ICON_VIEW_BOX} fill="none" stroke="currentColor" stroke-width=${ICON_STROKE_WIDTH} stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
|
|
3
3
|
<circle cx="12" cy="12" r="9"></circle>
|
|
4
4
|
<polyline points="8 12.5 11 15.5 16 9.5"></polyline>
|
|
@@ -9,7 +9,7 @@ import{__decorate}from"tslib";import{html,nothing,svg}from"lit";import{property,
|
|
|
9
9
|
<line x1="9" y1="9" x2="15" y2="15"></line>
|
|
10
10
|
<line x1="15" y1="9" x2="9" y2="15"></line>
|
|
11
11
|
</svg>
|
|
12
|
-
`}class LyraConfirmBar extends LyraElement{constructor(){super(...arguments),this.toolName="",this.heading="",this.headingLevel="none",this.args=void 0,this._decision=null,this._pending=null,this.dispatchWriteGuard=new VetoWriteGuard,this.disabled=!1,this.variant="neutral",this.size="m",this.frame="card",this.autofocus=!1,this.escapeDenies=!1,this.returnFocusTo=null,this.hasBodySlot=!1,this.headingId=nextId("confirm-bar-heading"),this.deferralGeneration=0,this.onBodySlotChange=e=>{this.hasBodySlot=hasRealContent(e.target.assignedNodes({flatten:!0}))},this.onBaseKeyDown=event=>{if(!this.escapeDenies||event.key!=="Escape")return;const path=event.composedPath(),inOpenPopup=path.slice(0,path.indexOf(this)).some(node=>node instanceof Element&&node.hasAttribute("open"));if(event.defaultPrevented||event.isComposing||inOpenPopup)return;const decisionBefore=this.decision,pendingBefore=this.pendingAction;this.decide("denied"),(this.decision!==decisionBefore||this.pendingAction!==pendingBefore)&&event.stopPropagation()},this.decisionDispatching=!1}static{this.defaultStrings={...super.defaultStrings,approve:LYRA_DEFAULT_approve,collapse:LYRA_DEFAULT_collapse,confirmApproved:LYRA_DEFAULT_confirmApproved,confirmApprovedAnnounce:LYRA_DEFAULT_confirmApprovedAnnounce,confirmDenied:LYRA_DEFAULT_confirmDenied,confirmDeniedAnnounce:LYRA_DEFAULT_confirmDeniedAnnounce,date:LYRA_DEFAULT_date,deny:LYRA_DEFAULT_deny,details:LYRA_DEFAULT_details,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,progress:LYRA_DEFAULT_progress,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,toolApprovalArgsLabel:LYRA_DEFAULT_toolApprovalArgsLabel,toolApprovalGenericTool:LYRA_DEFAULT_toolApprovalGenericTool,toolApprovalHeading:LYRA_DEFAULT_toolApprovalHeading}}emitApproveRequest(detail){return this.emit("lr-approve-request",Object.freeze(detail),{cancelable:!0})}emitDenyRequest(detail){return this.emit("lr-deny-request",Object.freeze(detail),{cancelable:!0})}static{this.styles=[LyraElement.styles,styles]}get decision(){return this._decision}set decision(value){const previous=this._decision;this._decision=CONFIRM_BAR_DECISION.normalizeReflected(this,"decision",value)??null,markVetoGuardWrite(this.dispatchWriteGuard),this.requestUpdate("decision",previous)}get pendingAction(){return this._pending}set pendingAction(value){const previous=this._pending;this._pending=CONFIRM_BAR_PENDING_ACTION.normalizeReflected(this,"pending-action",value)??null,markVetoGuardWrite(this.dispatchWriteGuard),this.requestUpdate("pendingAction",previous)}willUpdate(changed){if(super.willUpdate(changed),!this.hasUpdated){const defaultSlotNodes=Array.from(this.childNodes).filter(node=>node.nodeType!==Node.ELEMENT_NODE||!node.getAttribute("slot"));this.hasBodySlot=hasRealContent(defaultSlotNodes)}changed.has("decision")&&changed.get("decision")!==void 0&&this.decision!=null&&this.pendingAction!=null&&(this.handOffDecidedFocus(),this.pendingAction=null)}firstUpdated(changed){super.firstUpdated(changed),this.autofocus&&this.focusInitial()}focusInitial(){this.updateComplete.then(async()=>{if(!this.isConnected)return;const deny=this.renderRoot.querySelector('[part="deny-button"]');if(await deny?.updateComplete,!this.isConnected)return;(deny&&isComposedFocusAvailable(deny)?deny:this.statusEl)?.focus()})}decide(next){if(!this.decisionDispatching){this.decisionDispatching=!0;try{if(this.disabled||this.decision!=null||this.pendingAction!=null)return;const
|
|
12
|
+
`}class LyraConfirmBar extends LyraElement{constructor(){super(...arguments),this.toolName="",this.heading="",this.headingLevel="none",this.args=void 0,this._decision=null,this._pending=null,this.dispatchWriteGuard=new VetoWriteGuard,this.disabled=!1,this.variant="neutral",this.size="m",this.frame="card",this.autofocus=!1,this.escapeDenies=!1,this.returnFocusTo=null,this.hasBodySlot=!1,this.headingId=nextId("confirm-bar-heading"),this.deferralGeneration=0,this.onBodySlotChange=e=>{this.hasBodySlot=hasRealContent(e.target.assignedNodes({flatten:!0}))},this.onBaseKeyDown=event=>{if(!this.escapeDenies||event.key!=="Escape")return;const path=event.composedPath(),inOpenPopup=path.slice(0,path.indexOf(this)).some(node=>node instanceof Element&&node.hasAttribute("open"));if(event.defaultPrevented||event.isComposing||inOpenPopup)return;const decisionBefore=this.decision,pendingBefore=this.pendingAction;this.decide("denied"),(this.decision!==decisionBefore||this.pendingAction!==pendingBefore)&&event.stopPropagation()},this.decisionDispatching=!1}static{this.defaultStrings={...super.defaultStrings,approve:LYRA_DEFAULT_approve,collapse:LYRA_DEFAULT_collapse,confirmApproved:LYRA_DEFAULT_confirmApproved,confirmApprovedAnnounce:LYRA_DEFAULT_confirmApprovedAnnounce,confirmDenied:LYRA_DEFAULT_confirmDenied,confirmDeniedAnnounce:LYRA_DEFAULT_confirmDeniedAnnounce,date:LYRA_DEFAULT_date,deny:LYRA_DEFAULT_deny,details:LYRA_DEFAULT_details,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,progress:LYRA_DEFAULT_progress,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,toolApprovalArgsLabel:LYRA_DEFAULT_toolApprovalArgsLabel,toolApprovalGenericTool:LYRA_DEFAULT_toolApprovalGenericTool,toolApprovalHeading:LYRA_DEFAULT_toolApprovalHeading,viewerSearchActiveMatch:LYRA_DEFAULT_viewerSearchActiveMatch,viewerSearchMatchCount:LYRA_DEFAULT_viewerSearchMatchCount,viewerSearchNoMatches:LYRA_DEFAULT_viewerSearchNoMatches}}emitApproveRequest(detail){return this.emit("lr-approve-request",Object.freeze(detail),{cancelable:!0})}emitDenyRequest(detail){return this.emit("lr-deny-request",Object.freeze(detail),{cancelable:!0})}static{this.styles=[LyraElement.styles,styles]}get decision(){return this._decision}set decision(value){const previous=this._decision;this._decision=CONFIRM_BAR_DECISION.normalizeReflected(this,"decision",value)??null,markVetoGuardWrite(this.dispatchWriteGuard),this.requestUpdate("decision",previous)}get pendingAction(){return this._pending}set pendingAction(value){const previous=this._pending;this._pending=CONFIRM_BAR_PENDING_ACTION.normalizeReflected(this,"pending-action",value)??null,markVetoGuardWrite(this.dispatchWriteGuard),this.requestUpdate("pendingAction",previous)}willUpdate(changed){if(super.willUpdate(changed),!this.hasUpdated){const defaultSlotNodes=Array.from(this.childNodes).filter(node=>node.nodeType!==Node.ELEMENT_NODE||!node.getAttribute("slot"));this.hasBodySlot=hasRealContent(defaultSlotNodes)}changed.has("decision")&&changed.get("decision")!==void 0&&this.decision!=null&&this.pendingAction!=null&&(this.handOffDecidedFocus(),this.pendingAction=null)}firstUpdated(changed){super.firstUpdated(changed),this.autofocus&&this.focusInitial()}focusInitial(){this.updateComplete.then(async()=>{if(!this.isConnected)return;const deny=this.renderRoot.querySelector('[part="deny-button"]');if(await deny?.updateComplete,!this.isConnected)return;(deny&&isComposedFocusAvailable(deny)?deny:this.statusEl)?.focus()})}decide(next){if(!this.decisionDispatching){this.decisionDispatching=!0;try{if(this.disabled||this.decision!=null||this.pendingAction!=null)return;const{waitUntil,deferrals,seal}=createWaitUntil("confirm-bar");this.dispatchWriteGuard.open();const event=next==="approved"?this.emitApproveRequest({args:this.args,waitUntil}):this.emitDenyRequest({waitUntil});seal();const listenerResolvedItself=this.dispatchWriteGuard.touched;if(deferrals.length>0||event.defaultPrevented){if(this.statusEl?.focus(),listenerResolvedItself){for(const deferral of deferrals)deferral.catch(()=>{});return}this.pendingAction=approvalAction(next),deferrals.length>0&&this.awaitDeferredDecision(Promise.all(deferrals),next);return}if(listenerResolvedItself)return;this.handOffDecidedFocus(),this.decision=next}finally{this.decisionDispatching=!1}}}awaitDeferredDecision(promise,next){const action=approvalAction(next);this.deferralGeneration+=1;const generation=this.deferralGeneration,stillOurs=()=>generation===this.deferralGeneration&&this.decision==null&&this.pendingAction===action;promise.then(()=>{stillOurs()&&(this.decision=next)},()=>{stillOurs()&&(this.pendingAction=null,this.returnFocusAfterBounce(action))})}returnFocusAfterBounce(action){this.updateComplete.then(()=>{!this.isConnected||this.decision!=null||this.pendingAction!=null||repairComposedFocus(this,()=>this.renderRoot.querySelector(`[part="${action}-button"]`))})}resolvedReturnFocusTarget(){const target=this.returnFocusTo;return typeof target=="function"?target():target}handOffDecidedFocus(){const target=this.resolvedReturnFocusTarget();target&&focusFirstAvailable([target])||(focusFirstAvailable([this.statusEl]),typeof this.returnFocusTo=="function"&&this.statusEl&&deferComposedFocusRepair(this,this.statusEl,()=>this.resolvedReturnFocusTarget()))}updated(changed){super.updated(changed);const decision=this.decision;if(changed.has("decision")&&changed.get("decision")!==void 0&&decision!=null){const key=decision==="approved"?"confirmApprovedAnnounce":"confirmDeniedAnnounce";this.liveRegion?.announce(this.localize(key),{force:!0}),this.emit("lr-decision-settled",{decision})}}renderHeading(){if(this.heading)return html`${this.heading}`;const toolName=this.toolName||this.localize("toolApprovalGenericTool"),template=this.localize("toolApprovalHeading"),pieces=resolveLocalizedParts(template,marker=>this.localize("toolApprovalHeading",void 0,{tool:marker}));return html`${pieces.map((piece,index)=>index<pieces.length-1?html`${piece}<span part="tool-name" dir="auto">${toolName}</span>`:piece)}`}statusText(){return this.decision==="approved"?this.localize("confirmApproved"):this.localize("confirmDenied")}stopNestedLifecycle(event){event.stopPropagation()}render(){const decided=this.decision!=null,hostLabel=hostAriaLabel(this),headingLevel=resolveHeadingLevel(this.headingLevel??"none");return html`
|
|
13
13
|
<div
|
|
14
14
|
part="base"
|
|
15
15
|
role="group"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';export type AgentConnectorKind='mcp'|'connector';export type AgentConnectorStatus='disconnected'|'connecting'|'connected'|'error';export type ConnectorAction='connect'|'disconnect'|'retry';
|
|
1
|
+
import{type PropertyValues,type TemplateResult}from'lit';import{LyraElement}from'../../../internal/lyra-element.js';import'../../forms/button/button.class.js';export type AgentConnectorKind='mcp'|'connector';export type AgentConnectorStatus='disconnected'|'connecting'|'connected'|'error';export type ConnectorAction='connect'|'disconnect'|'retry';
|
|
2
2
|
/** Host-owned connector metadata. `error`, when present, is already localized host text. */
|
|
3
3
|
export interface AgentConnector{id:string;name:string;description?:string;kind:AgentConnectorKind;status:AgentConnectorStatus;error?:string;}export interface LyraConnectorManagerEventMap{'lr-connector-action':CustomEvent<{connectorId:string;action:ConnectorAction;}>;}
|
|
4
4
|
/**
|
|
@@ -24,7 +24,9 @@ export interface AgentConnector{id:string;name:string;description?:string;kind:A
|
|
|
24
24
|
* @csspart description - Optional host-supplied description.
|
|
25
25
|
* @csspart status - The localized controlled connection status (`tabindex="-1"`).
|
|
26
26
|
* @csspart error - Optional host-localized error text.
|
|
27
|
-
* @csspart action - The
|
|
27
|
+
* @csspart action - The action `<lr-button>`, themed through the shared `--lr-button-*` tokens.
|
|
28
|
+
* @csspart action-base - The action button's internal control (forwarded from `<lr-button>`).
|
|
29
|
+
* @csspart action-label - The action button's label wrapper (forwarded from `<lr-button>`).
|
|
28
30
|
* @csspart empty - The empty state.
|
|
29
31
|
* @csspart limit - Localized notice shown when more than 100 valid connectors are supplied.
|
|
30
32
|
* @status experimental
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{styles}from"./connector-manager.styles.js";import{firstByIdentity}from"../collection-identity.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_connectorManagerConnect,LYRA_DEFAULT_connectorManagerConnectFor,LYRA_DEFAULT_connectorManagerDisconnect,LYRA_DEFAULT_connectorManagerDisconnectFor,LYRA_DEFAULT_connectorManagerEmpty,LYRA_DEFAULT_connectorManagerKindConnector,LYRA_DEFAULT_connectorManagerKindMcp,LYRA_DEFAULT_connectorManagerLabel,LYRA_DEFAULT_connectorManagerLimit,LYRA_DEFAULT_connectorManagerRetryFor,LYRA_DEFAULT_connectorManagerStatusConnected,LYRA_DEFAULT_connectorManagerStatusConnecting,LYRA_DEFAULT_connectorManagerStatusDisconnected,LYRA_DEFAULT_copy,LYRA_DEFAULT_details,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_retry,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_statusError}from"../../../internal/default-strings.generated.js";const MAX_RENDERED_CONNECTORS=100,KINDS=["mcp","connector"],STATUSES=["disconnected","connecting","connected","error"],KIND_LABEL_KEY={mcp:"connectorManagerKindMcp",connector:"connectorManagerKindConnector"},STATUS_LABEL_KEY={disconnected:"connectorManagerStatusDisconnected",connecting:"connectorManagerStatusConnecting",connected:"connectorManagerStatusConnected",error:"statusError"},ACTION_LABEL_KEY={connect:"connectorManagerConnect",disconnect:"connectorManagerDisconnect",retry:"retry"},ACTION_ACCESSIBLE_LABEL_KEY={connect:"connectorManagerConnectFor",disconnect:"connectorManagerDisconnectFor",retry:"connectorManagerRetryFor"};class LyraConnectorManager extends LyraElement{constructor(){super(...arguments),this.connectors=[],this.disabled=!1,this.dispatchingAction=!1,this.actedConnectorId=null,this.pendingAnnouncement="",this.focusedRowId=null}static{this.defaultStrings={...super.defaultStrings,collapse:LYRA_DEFAULT_collapse,connectorManagerConnect:LYRA_DEFAULT_connectorManagerConnect,connectorManagerConnectFor:LYRA_DEFAULT_connectorManagerConnectFor,connectorManagerDisconnect:LYRA_DEFAULT_connectorManagerDisconnect,connectorManagerDisconnectFor:LYRA_DEFAULT_connectorManagerDisconnectFor,connectorManagerEmpty:LYRA_DEFAULT_connectorManagerEmpty,connectorManagerKindConnector:LYRA_DEFAULT_connectorManagerKindConnector,connectorManagerKindMcp:LYRA_DEFAULT_connectorManagerKindMcp,connectorManagerLabel:LYRA_DEFAULT_connectorManagerLabel,connectorManagerLimit:LYRA_DEFAULT_connectorManagerLimit,connectorManagerRetryFor:LYRA_DEFAULT_connectorManagerRetryFor,connectorManagerStatusConnected:LYRA_DEFAULT_connectorManagerStatusConnected,connectorManagerStatusConnecting:LYRA_DEFAULT_connectorManagerStatusConnecting,connectorManagerStatusDisconnected:LYRA_DEFAULT_connectorManagerStatusDisconnected,copy:LYRA_DEFAULT_copy,details:LYRA_DEFAULT_details,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,retry:LYRA_DEFAULT_retry,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,statusError:LYRA_DEFAULT_statusError}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["connectors"])}static{this.styles=[LyraElement.styles,styles]}connectedCallback(){super.connectedCallback(),this.sink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this})}disconnectedCallback(){super.disconnectedCallback(),this.sink?.release(),this.sink=void 0,this.actedConnectorId=null,this.pendingAnnouncement=""}rowPart(connectorId,part){for(const row of this.renderRoot.querySelectorAll('[part~="connector"]'))if(row.dataset.connectorId===connectorId)return row.querySelector(`[part~="${part}"]`);return null}willUpdate(changed){if(super.willUpdate(changed),!this.hasUpdated||!changed.has("connectors"))return;this.focusedRowId=this
|
|
1
|
+
import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/collection-snapshot.js";import{html,nothing}from"lit";import{property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{hostAriaLabel}from"../../../internal/a11y.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{styles}from"./connector-manager.styles.js";import"../../forms/button/button.class.js";import{firstByIdentity}from"../collection-identity.js";import{shadowFocusTarget}from"../../../internal/active-element.js";import{LYRA_DEFAULT_collapse,LYRA_DEFAULT_connectorManagerConnect,LYRA_DEFAULT_connectorManagerConnectFor,LYRA_DEFAULT_connectorManagerDisconnect,LYRA_DEFAULT_connectorManagerDisconnectFor,LYRA_DEFAULT_connectorManagerEmpty,LYRA_DEFAULT_connectorManagerKindConnector,LYRA_DEFAULT_connectorManagerKindMcp,LYRA_DEFAULT_connectorManagerLabel,LYRA_DEFAULT_connectorManagerLimit,LYRA_DEFAULT_connectorManagerRetryFor,LYRA_DEFAULT_connectorManagerStatusConnected,LYRA_DEFAULT_connectorManagerStatusConnecting,LYRA_DEFAULT_connectorManagerStatusDisconnected,LYRA_DEFAULT_copy,LYRA_DEFAULT_date,LYRA_DEFAULT_details,LYRA_DEFAULT_loading,LYRA_DEFAULT_map,LYRA_DEFAULT_navigation,LYRA_DEFAULT_open,LYRA_DEFAULT_progress,LYRA_DEFAULT_retry,LYRA_DEFAULT_search,LYRA_DEFAULT_select,LYRA_DEFAULT_statusError}from"../../../internal/default-strings.generated.js";const MAX_RENDERED_CONNECTORS=100,KINDS=["mcp","connector"],STATUSES=["disconnected","connecting","connected","error"],KIND_LABEL_KEY={mcp:"connectorManagerKindMcp",connector:"connectorManagerKindConnector"},STATUS_LABEL_KEY={disconnected:"connectorManagerStatusDisconnected",connecting:"connectorManagerStatusConnecting",connected:"connectorManagerStatusConnected",error:"statusError"},ACTION_LABEL_KEY={connect:"connectorManagerConnect",disconnect:"connectorManagerDisconnect",retry:"retry"},ACTION_ACCESSIBLE_LABEL_KEY={connect:"connectorManagerConnectFor",disconnect:"connectorManagerDisconnectFor",retry:"connectorManagerRetryFor"};class LyraConnectorManager extends LyraElement{constructor(){super(...arguments),this.connectors=[],this.disabled=!1,this.dispatchingAction=!1,this.actedConnectorId=null,this.pendingAnnouncement="",this.focusedRowId=null}static{this.defaultStrings={...super.defaultStrings,collapse:LYRA_DEFAULT_collapse,connectorManagerConnect:LYRA_DEFAULT_connectorManagerConnect,connectorManagerConnectFor:LYRA_DEFAULT_connectorManagerConnectFor,connectorManagerDisconnect:LYRA_DEFAULT_connectorManagerDisconnect,connectorManagerDisconnectFor:LYRA_DEFAULT_connectorManagerDisconnectFor,connectorManagerEmpty:LYRA_DEFAULT_connectorManagerEmpty,connectorManagerKindConnector:LYRA_DEFAULT_connectorManagerKindConnector,connectorManagerKindMcp:LYRA_DEFAULT_connectorManagerKindMcp,connectorManagerLabel:LYRA_DEFAULT_connectorManagerLabel,connectorManagerLimit:LYRA_DEFAULT_connectorManagerLimit,connectorManagerRetryFor:LYRA_DEFAULT_connectorManagerRetryFor,connectorManagerStatusConnected:LYRA_DEFAULT_connectorManagerStatusConnected,connectorManagerStatusConnecting:LYRA_DEFAULT_connectorManagerStatusConnecting,connectorManagerStatusDisconnected:LYRA_DEFAULT_connectorManagerStatusDisconnected,copy:LYRA_DEFAULT_copy,date:LYRA_DEFAULT_date,details:LYRA_DEFAULT_details,loading:LYRA_DEFAULT_loading,map:LYRA_DEFAULT_map,navigation:LYRA_DEFAULT_navigation,open:LYRA_DEFAULT_open,progress:LYRA_DEFAULT_progress,retry:LYRA_DEFAULT_retry,search:LYRA_DEFAULT_search,select:LYRA_DEFAULT_select,statusError:LYRA_DEFAULT_statusError}}static{this.collectionSupport=collectionSupport}static{this.ownedCollectionProperties=Object.freeze(["connectors"])}static{this.styles=[LyraElement.styles,styles]}connectedCallback(){super.connectedCallback(),this.sink??=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this})}disconnectedCallback(){super.disconnectedCallback(),this.sink?.release(),this.sink=void 0,this.actedConnectorId=null,this.pendingAnnouncement=""}rowPart(connectorId,part){for(const row of this.renderRoot.querySelectorAll('[part~="connector"]'))if(row.dataset.connectorId===connectorId)return row.querySelector(`[part~="${part}"]`);return null}willUpdate(changed){if(super.willUpdate(changed),!this.hasUpdated||!changed.has("connectors"))return;this.focusedRowId=shadowFocusTarget(this)?.closest('[part~="connector"]')?.dataset.connectorId??null;const acted=this.actedConnectorId;if(acted===null)return;const previous=this.normalizedConnectorsFrom(changed.get("connectors")).find(item=>item.id===acted),current=this.normalizedConnectors.find(item=>item.id===acted);current?(previous?.status!==current.status||previous.error!==current.error)&&(this.pendingAnnouncement=current.status==="error"&¤t.error?current.error:this.localize(STATUS_LABEL_KEY[current.status]),current.status!=="connecting"&&(this.actedConnectorId=null)):this.actedConnectorId=null}updated(changed){super.updated(changed);const id=this.focusedRowId;if(this.focusedRowId=null,id!==null){const status=this.rowPart(id,"status"),active=shadowFocusTarget(this),action=this.rowPart(id,"action");if(!active||active===status){const target=action&&!action.disabled?action:status,moveFocus=()=>{const current=shadowFocusTarget(this);this.isConnected&&(!current||current===status)&&target?.focus()};target===action&&action?.updateComplete?action.updateComplete.then(moveFocus):moveFocus()}}this.pendingAnnouncement&&(this.sink?.announce(this.pendingAnnouncement),this.pendingAnnouncement="")}get normalizedConnectors(){return this.normalizedConnectorsFrom(this.connectors)}normalizedConnectorsFrom(source){const valid=(Array.isArray(source)?source:[]).filter(connector=>{try{return!!(connector&&typeof connector.name=="string"&&KINDS.includes(connector.kind)&&STATUSES.includes(connector.status))}catch{return!1}});return firstByIdentity(valid,connector=>connector.id)}actionFor(connector){return connector.status==="disconnected"?"connect":connector.status==="connected"?"disconnect":connector.status==="error"?"retry":null}requestAction(connector,action){const current=this.normalizedConnectors.find(item=>item.id===connector.id);if(!(this.disabled||!current||this.actionFor(current)!==action||this.dispatchingAction)){this.dispatchingAction=!0,this.actedConnectorId=current.id;try{this.emit("lr-connector-action",{connectorId:current.id,action})}finally{this.dispatchingAction=!1}}}renderConnector(connector){const action=this.actionFor(connector);return html`
|
|
2
2
|
<div part="connector" role="listitem" data-connector-id=${connector.id}>
|
|
3
3
|
<div part="connector-copy">
|
|
4
4
|
<span part="name">${connector.name}</span>
|
|
@@ -8,13 +8,16 @@ import{__decorate}from"tslib";import{collectionSupport}from"../../../internal/co
|
|
|
8
8
|
</div>
|
|
9
9
|
<div part="connector-controls">
|
|
10
10
|
<span part="status" tabindex="-1" data-status=${connector.status}>${this.localize(STATUS_LABEL_KEY[connector.status])}</span>
|
|
11
|
-
${action?html`<button
|
|
11
|
+
${action?html`<lr-button
|
|
12
12
|
part="action"
|
|
13
|
+
variant="neutral"
|
|
14
|
+
appearance="outlined"
|
|
13
15
|
type="button"
|
|
16
|
+
exportparts="base:action-base, label:action-label"
|
|
14
17
|
aria-label=${this.localize(ACTION_ACCESSIBLE_LABEL_KEY[action],void 0,{name:connector.name})}
|
|
15
18
|
?disabled=${this.disabled}
|
|
16
19
|
@click=${()=>this.requestAction(connector,action)}
|
|
17
|
-
>${this.localize(ACTION_LABEL_KEY[action])}</button>`:nothing}
|
|
20
|
+
>${this.localize(ACTION_LABEL_KEY[action])}</lr-button>`:nothing}
|
|
18
21
|
</div>
|
|
19
22
|
</div>
|
|
20
23
|
`}render(){const connectors=this.normalizedConnectors,visibleLabel=this.label==null?this.localize("connectorManagerLabel"):this.label,hostLabel=hostAriaLabel(this);return html`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** @deprecated Import @aceshooting/lyra-ui/components/lr-connector-manager.js to register this component. */
|
|
2
|
-
export*from'./connector-manager.class.js';
|
|
2
|
+
export*from'./connector-manager.class.js';import'../../forms/button/button.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./connector-manager.class.js";import{LyraConnectorManager}from"./connector-manager.class.js";import{defineElement}from"../../../internal/prefix.js";defineElement("connector-manager",LyraConnectorManager);
|
|
1
|
+
export*from"./connector-manager.class.js";import"../../forms/button/button.js";import{LyraConnectorManager}from"./connector-manager.class.js";import{defineElement}from"../../../internal/prefix.js";defineElement("connector-manager",LyraConnectorManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{panelListItem}from"../../../internal/layout-fragments.styles.js";import{
|
|
1
|
+
import{panelListItem}from"../../../internal/layout-fragments.styles.js";import{focusRing,panelFrame}from"../../../internal/interactive-control.styles.js";import{css}from"lit";const styles=css` :host { display: block; min-inline-size: 0; max-inline-size: 100%; } [part='base'] { ${panelFrame} } [part='legend'] { max-inline-size: 100%; padding-inline: var(--lr-space-2xs); font-size: var(--lr-font-size-lg); font-weight: var(--lr-font-weight-semibold); overflow-wrap: anywhere; } [part='list'] { display: flex; min-inline-size: 0; max-inline-size: 100%; flex-direction: column; } [part='connector'] { ${panelListItem} grid-template-columns: minmax(0, 1fr) auto; } [part='connector-copy'] { display: flex; min-inline-size: 0; max-inline-size: 100%; flex-direction: column; gap: var(--lr-space-2xs); } [part='name'] { font-weight: var(--lr-font-weight-semibold); overflow-wrap: anywhere; } [part='kind'], [part='description'], [part='error'] { max-inline-size: 100%; color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-sm); overflow-wrap: anywhere; } [part='error'] { color: var(--lr-color-danger); } [part='connector-controls'] { display: flex; min-inline-size: 0; max-inline-size: 100%; flex-wrap: wrap; gap: var(--lr-space-xs); align-items: center; justify-content: end; } [part='status'] { max-inline-size: 100%; font-size: var(--lr-font-size-sm); overflow-wrap: anywhere; } [part='status']:focus-visible { ${focusRing} } [part='empty'], [part='limit'] { color: var(--lr-color-text-quiet); font-size: var(--lr-font-size-sm); overflow-wrap: anywhere; } `;export{styles};
|
|
@@ -92,8 +92,8 @@ segments:readonly ContextInspectorSegment[];
|
|
|
92
92
|
/** The full token budget `segments` are measured against — passed straight through to `<lr-context-meter>`'s own `total`. */
|
|
93
93
|
total:number;
|
|
94
94
|
/** Accessible group name, and the embedded `<lr-context-meter>`'s own visible caption, e.g. "128K context window". */
|
|
95
|
-
label
|
|
95
|
+
label?:string;
|
|
96
96
|
/** Export format(s) offered by the embedded `<lr-export-button>` — a single id renders a plain button, more than one a format-choice menu. */
|
|
97
97
|
exportFormats:readonly LyraExportFormatOption[];
|
|
98
98
|
/** Download filename (no extension) passed through to `<lr-export-button>`. */
|
|
99
|
-
exportFilename:string;private normalizedFor?;private normalizedCache;private get normalizedSegments();private
|
|
99
|
+
exportFilename:string;private normalizedFor?;private normalizedCache;private get normalizedSegments();private derived?;private get derivedViews();private get safeTotal();private renderSegmentText;private renderTruncationBoundary;private renderSegment;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-context-inspector':LyraContextInspector;}}
|