@aceshooting/lyra-ui 16.0.0 → 18.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 +758 -0
- package/README.md +2 -2
- package/custom-elements.json +1 -1
- package/dist/cli/migration-contract.json +1 -1
- package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts +3 -3
- package/dist/components/agent-tools/browser-frame/browser-frame.class.js +2 -2
- package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +2 -2
- package/dist/components/agent-tools/compare-panel/compare-panel.class.js +3 -3
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +37 -13
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
- package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +4 -0
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +2 -2
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +3 -3
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +117 -17
- package/dist/components/charts/chart/chart.class.js +3 -3
- package/dist/components/charts/chart/histogram-bin.d.ts +5 -1
- package/dist/components/charts/chart/histogram-bin.js +1 -1
- package/dist/components/charts/chart/lite-chart.class.d.ts +9 -0
- package/dist/components/conversation/code-block/code-block.styles.js +1 -1
- package/dist/components/conversation/message-actions/message-actions.styles.js +1 -1
- package/dist/components/conversation/model-select/model-select.class.d.ts +13 -4
- package/dist/components/conversation/model-select/model-select.class.js +2 -1
- package/dist/components/conversation/model-select/model-select.styles.js +1 -1
- package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +40 -2
- package/dist/components/conversation/streaming-text/streaming-text-base.class.js +2 -2
- package/dist/components/conversation/streaming-text/streaming-text-core.class.d.ts +27 -3
- package/dist/components/conversation/streaming-text/streaming-text-core.class.js +11 -0
- package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +31 -3
- package/dist/components/conversation/streaming-text/streaming-text.class.js +11 -0
- package/dist/components/conversation/suggestion-chips/suggestion-chips.class.d.ts +30 -2
- package/dist/components/conversation/suggestion-chips/suggestion-chips.class.js +4 -3
- package/dist/components/conversation/suggestion-chips/suggestion-chips.styles.js +1 -1
- package/dist/components/conversation/thread-list/thread-list.class.js +1 -1
- package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
- package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.js +1 -1
- package/dist/components/conversation/usage-badge/usage-badge.class.d.ts +4 -0
- package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +16 -4
- package/dist/components/conversation/voice-picker/voice-picker.class.js +2 -1
- package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
- package/dist/components/data/context-meter/context-meter.class.d.ts +23 -4
- package/dist/components/data/context-meter/context-meter.class.js +10 -7
- package/dist/components/data/context-meter/context-meter.styles.js +1 -1
- package/dist/components/data/data-grid/data-grid.class.d.ts +5 -2
- package/dist/components/data/data-grid/data-grid.class.js +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +32 -5
- package/dist/components/data/flow-canvas/flow-canvas.class.js +3 -1
- package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
- package/dist/components/data/flow-canvas/flow-model.js +1 -1
- package/dist/components/data/flow-canvas/flow-types.d.ts +10 -1
- package/dist/components/data/gauge/gauge.class.d.ts +15 -2
- package/dist/components/data/gauge/gauge.class.js +20 -20
- package/dist/components/data/gauge/gauge.styles.js +1 -1
- package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +14 -5
- package/dist/components/data/graph-query-builder/graph-query-builder.class.js +2 -2
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +28 -2
- package/dist/components/data/sequence-strip/sequence-strip.class.js +3 -2
- package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
- package/dist/components/data/table/table.class.d.ts +155 -30
- package/dist/components/data/table/table.class.js +6 -4
- package/dist/components/data/table/table.styles.js +1 -1
- package/dist/components/data/timeline/timeline-item.class.d.ts +9 -1
- package/dist/components/data/timeline/timeline-item.class.js +2 -2
- package/dist/components/data/word-cloud/word-cloud.class.js +1 -1
- package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
- package/dist/components/forms/button/button.class.d.ts +30 -1
- package/dist/components/forms/button/button.class.js +2 -2
- package/dist/components/forms/checkbox/checkbox.class.d.ts +8 -6
- package/dist/components/forms/checkbox/checkbox.class.js +2 -2
- package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +7 -5
- package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
- package/dist/components/forms/color-picker/color-picker.class.d.ts +16 -2
- package/dist/components/forms/color-picker/color-picker.class.js +2 -2
- package/dist/components/forms/color-picker/color-picker.styles.js +1 -1
- package/dist/components/forms/combobox/combobox.class.d.ts +52 -7
- package/dist/components/forms/combobox/combobox.class.js +2 -2
- package/dist/components/forms/combobox/combobox.styles.js +1 -1
- package/dist/components/forms/date-picker/date-input.class.d.ts +4 -0
- package/dist/components/forms/date-picker/date-input.class.js +1 -1
- package/dist/components/forms/icon-button/icon-button.class.d.ts +20 -3
- package/dist/components/forms/icon-button/icon-button.class.js +1 -1
- package/dist/components/forms/icon-button/icon-button.styles.js +1 -1
- package/dist/components/forms/input/input.class.d.ts +5 -2
- package/dist/components/forms/input/input.class.js +1 -1
- package/dist/components/forms/input/time-input.class.d.ts +4 -0
- package/dist/components/forms/input/time-input.class.js +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.d.ts +11 -5
- package/dist/components/forms/locale-picker/locale-picker.class.js +1 -1
- package/dist/components/forms/otp-input/otp-input.class.d.ts +7 -2
- package/dist/components/forms/otp-input/otp-input.class.js +2 -2
- package/dist/components/forms/radio/radio-button.class.d.ts +2 -1
- package/dist/components/forms/radio/radio-group.class.d.ts +9 -4
- package/dist/components/forms/radio/radio-group.class.js +1 -1
- package/dist/components/forms/radio/radio.class.d.ts +13 -7
- package/dist/components/forms/radio/radio.class.js +1 -1
- package/dist/components/forms/rubric-form/rubric-form.class.d.ts +16 -6
- package/dist/components/forms/rubric-form/rubric-form.class.js +2 -2
- package/dist/components/forms/select/select.class.d.ts +50 -13
- package/dist/components/forms/select/select.class.js +2 -2
- package/dist/components/forms/slider/slider.class.d.ts +4 -2
- package/dist/components/forms/slider/slider.class.js +1 -1
- package/dist/components/forms/switch/switch.class.d.ts +8 -6
- package/dist/components/forms/switch/switch.class.js +1 -1
- package/dist/components/forms/textarea/textarea.class.d.ts +5 -3
- package/dist/components/forms/textarea/textarea.class.js +1 -1
- package/dist/components/forms/time-range/time-range.class.d.ts +12 -7
- 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/token-input/token-input.class.d.ts +6 -4
- package/dist/components/forms/token-input/token-input.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail-item.class.d.ts +109 -4
- package/dist/components/layout/app-rail/app-rail-item.class.js +34 -29
- package/dist/components/layout/app-rail/app-rail-item.styles.js +1 -1
- package/dist/components/layout/app-rail/app-rail.class.d.ts +25 -3
- package/dist/components/layout/app-rail/app-rail.styles.js +1 -1
- package/dist/components/layout/app-rail-group/app-rail-group.class.d.ts +2 -2
- package/dist/components/layout/app-rail-group/app-rail-group.class.js +2 -2
- package/dist/components/layout/carousel/carousel.class.d.ts +1 -1
- package/dist/components/layout/carousel/carousel.class.js +1 -1
- package/dist/components/layout/details/accordion.class.d.ts +2 -2
- package/dist/components/layout/details/accordion.class.js +2 -2
- package/dist/components/layout/filter-bar/filter-bar-register.d.ts +1 -0
- package/dist/components/layout/filter-bar/filter-bar-register.js +1 -0
- package/dist/components/layout/filter-bar/filter-bar.class.d.ts +153 -16
- package/dist/components/layout/filter-bar/filter-bar.class.js +8 -5
- package/dist/components/layout/menu/menu-item.class.d.ts +3 -3
- package/dist/components/layout/menu/menu-item.class.js +3 -3
- package/dist/components/layout/menu/menu.class.d.ts +5 -1
- package/dist/components/layout/menu/menu.class.js +2 -2
- package/dist/components/layout/reorder-list/reorder-item.styles.js +1 -1
- package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.d.ts +107 -2
- package/dist/components/layout/virtual-list/virtual-list.class.js +12 -7
- package/dist/components/media/attachment-trigger/attachment-trigger.styles.js +1 -1
- package/dist/components/media/avatar-group/avatar-group.class.d.ts +12 -1
- package/dist/components/media/avatar-group/avatar-group.class.js +2 -2
- package/dist/components/media/drop-zone/drop-zone.class.d.ts +32 -11
- package/dist/components/media/drop-zone/drop-zone.class.js +2 -2
- package/dist/components/media/file-input/file-input.class.d.ts +40 -19
- package/dist/components/media/file-input/file-input.class.js +2 -2
- package/dist/components/media/map/map.class.d.ts +138 -12
- package/dist/components/media/map/map.class.js +25 -20
- package/dist/components/media/map/map.styles.js +1 -1
- package/dist/components/overlays/callout/callout.styles.js +1 -1
- package/dist/components/overlays/dialog/dialog.styles.js +1 -1
- package/dist/components/overlays/overlay/dropdown.class.d.ts +13 -3
- package/dist/components/overlays/overlay/dropdown.class.js +2 -2
- package/dist/components/overlays/overlay/popover.class.d.ts +12 -3
- package/dist/components/overlays/overlay/popover.class.js +2 -2
- package/dist/components/overlays/rating/rating.class.d.ts +9 -7
- package/dist/components/overlays/rating/rating.class.js +1 -1
- package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +5 -1
- package/dist/components/retrieval/citation-badge/citation-badge.class.js +1 -1
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
- package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +5 -1
- package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
- package/dist/components/retrieval/graph-legend/graph-legend.styles.js +1 -1
- package/dist/components/retrieval/retrieval-value-format.js +1 -1
- package/dist/components/retrieval/source-list/source-list.styles.js +1 -1
- package/dist/components/utility/copy-button/copy-button.class.d.ts +23 -11
- package/dist/components/utility/copy-button/copy-button.class.js +2 -2
- package/dist/components/utility/copy-button/copy-button.styles.js +1 -1
- package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
- package/dist/components/utility/export-button/export-button.class.d.ts +4 -0
- package/dist/components/utility/export-button/export-button.class.js +1 -1
- package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
- package/dist/components/utility/known-date/known-date.class.js +1 -1
- package/dist/components/utility/mention-popover/mention-popover.class.d.ts +38 -3
- package/dist/components/utility/mention-popover/mention-popover.class.js +2 -1
- package/dist/components/utility/mention-popover/mention-popover.styles.js +1 -1
- package/dist/components/utility/poll-status/poll-status.styles.js +1 -1
- package/dist/components/utility/tour/tour.class.d.ts +4 -0
- package/dist/components/utility/tour/tour.class.js +1 -1
- package/dist/components/utility/tour/tour.styles.js +1 -1
- package/dist/components/viewers/document-preview/document-preview.class.js +2 -2
- package/dist/components/viewers/docx-viewer/docx-viewer.class.js +2 -2
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +2 -2
- package/dist/components/viewers/highlight-layer/highlight-layer.class.js +2 -2
- package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +2 -2
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +2 -2
- package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +2 -2
- package/dist/components/viewers/xml-viewer/xml-viewer.class.js +2 -2
- package/dist/custom-elements-jsx.d.ts +2 -2
- package/dist/events.d.ts +20 -13
- package/dist/internal/aggregate-file-limits.d.ts +33 -0
- package/dist/internal/aggregate-file-limits.js +1 -0
- package/dist/internal/catalog-picker.d.ts +15 -2
- package/dist/internal/catalog-picker.js +1 -1
- package/dist/internal/debounce-controller.d.ts +14 -0
- package/dist/internal/debounce-controller.js +1 -1
- package/dist/internal/default-strings.generated.d.ts +1 -1
- package/dist/internal/default-strings.generated.js +2 -2
- package/dist/internal/focus-navigation.d.ts +45 -0
- package/dist/internal/focus-navigation.js +1 -1
- package/dist/internal/form-associated.js +1 -1
- package/dist/internal/initial-slot-collection.d.ts +30 -0
- package/dist/internal/initial-slot-collection.js +1 -0
- package/dist/internal/intl-cache.js +1 -1
- package/dist/internal/invalid-event-alias.d.ts +46 -0
- package/dist/internal/invalid-event-alias.js +1 -1
- package/dist/internal/localization-runtime.d.ts +24 -0
- package/dist/internal/localization-runtime.js +1 -1
- package/dist/internal/localization-types.d.ts +1 -1
- package/dist/internal/localization.js +1 -1
- package/dist/internal/package-metadata.d.ts +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/internal/positioning-strategy.d.ts +3 -1
- package/dist/internal/state-part.d.ts +49 -0
- package/dist/internal/state-part.js +1 -0
- package/dist/internal/variants.styles.js +1 -1
- package/dist/lyra.d.ts +1 -1
- package/dist/lyra.js +1 -1
- package/dist/svelte.d.ts +2 -2
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/lyra-tag-event-map.d.ts +2 -2
- package/dist/testing/lyra-tag-event-map.js +1 -1
- package/dist/testing/wait-for-mount.d.ts +46 -0
- package/dist/testing/wait-for-mount.js +1 -0
- package/dist/theme/theme-bootstrap.js +1 -1
- package/dist/theme/theme.d.ts +11 -2
- package/dist/theme/theme.js +1 -1
- package/dist/translations/ar/layout.js +1 -1
- package/dist/translations/ar/retrieval.js +1 -1
- package/dist/translations/ar/shared.js +1 -1
- package/dist/translations/de/layout.js +1 -1
- package/dist/translations/de/retrieval.js +1 -1
- package/dist/translations/de/shared.js +1 -1
- package/dist/translations/es/layout.js +1 -1
- package/dist/translations/es/retrieval.js +1 -1
- package/dist/translations/es/shared.js +1 -1
- package/dist/translations/fa/layout.js +1 -1
- package/dist/translations/fa/retrieval.js +1 -1
- package/dist/translations/fa/shared.js +1 -1
- package/dist/translations/fr/layout.js +1 -1
- package/dist/translations/fr/retrieval.js +1 -1
- package/dist/translations/fr/shared.js +1 -1
- package/dist/translations/he/layout.js +1 -1
- package/dist/translations/he/retrieval.js +1 -1
- package/dist/translations/he/shared.js +1 -1
- package/dist/translations/it/layout.js +1 -1
- package/dist/translations/it/retrieval.js +1 -1
- package/dist/translations/it/shared.js +1 -1
- package/dist/translations/ja/layout.js +1 -1
- package/dist/translations/ja/retrieval.js +1 -1
- package/dist/translations/ja/shared.js +1 -1
- package/dist/translations/pt-BR/layout.js +1 -1
- package/dist/translations/pt-BR/retrieval.js +1 -1
- package/dist/translations/pt-BR/shared.js +1 -1
- package/dist/translations/ro/agent-tools.d.ts +1 -0
- package/dist/translations/ro/agent-tools.js +1 -0
- package/dist/translations/ro/charts.d.ts +1 -0
- package/dist/translations/ro/charts.js +1 -0
- package/dist/translations/ro/conversation.d.ts +1 -0
- package/dist/translations/ro/conversation.js +1 -0
- package/dist/translations/ro/data.d.ts +1 -0
- package/dist/translations/ro/data.js +1 -0
- package/dist/translations/ro/forms.d.ts +1 -0
- package/dist/translations/ro/forms.js +1 -0
- package/dist/translations/ro/layout.d.ts +1 -0
- package/dist/translations/ro/layout.js +1 -0
- package/dist/translations/ro/media.d.ts +1 -0
- package/dist/translations/ro/media.js +1 -0
- package/dist/translations/ro/overlays.d.ts +1 -0
- package/dist/translations/ro/overlays.js +1 -0
- package/dist/translations/ro/retrieval.d.ts +1 -0
- package/dist/translations/ro/retrieval.js +1 -0
- package/dist/translations/ro/shared.d.ts +1 -0
- package/dist/translations/ro/shared.js +1 -0
- package/dist/translations/ro/utility.d.ts +1 -0
- package/dist/translations/ro/utility.js +1 -0
- package/dist/translations/ro/viewers.d.ts +1 -0
- package/dist/translations/ro/viewers.js +5 -0
- package/dist/translations/ro.d.ts +1 -0
- package/dist/translations/ro.js +1 -0
- package/dist/translations/ru/layout.js +1 -1
- package/dist/translations/ru/retrieval.js +1 -1
- package/dist/translations/ru/shared.js +1 -1
- package/dist/translations/zh-CN/layout.js +1 -1
- package/dist/translations/zh-CN/retrieval.js +1 -1
- package/dist/translations/zh-CN/shared.js +1 -1
- package/dist/utilities/format.d.ts +17 -0
- package/dist/utilities/format.js +1 -1
- package/dist/vue.d.ts +2 -2
- package/llms/components/lr-app-rail-group.md +87 -10
- package/llms/components/lr-app-rail-item.md +88 -11
- package/llms/components/lr-app-rail.md +88 -11
- package/llms/components/lr-attachment-trigger.md +21 -0
- package/llms/components/lr-bar-chart.md +3 -2
- package/llms/components/lr-bubble-chart.md +3 -2
- package/llms/components/lr-button.md +5 -4
- package/llms/components/lr-callout.md +10 -0
- package/llms/components/lr-card.md +2 -1
- package/llms/components/lr-chart.md +43 -12
- package/llms/components/lr-citation-badge.md +7 -1
- package/llms/components/lr-code-block.md +21 -0
- package/llms/components/lr-color-picker.md +12 -7
- package/llms/components/lr-combobox.md +20 -1
- package/llms/components/lr-confirm-bar.md +36 -7
- package/llms/components/lr-context-meter.md +17 -4
- package/llms/components/lr-date-input.md +7 -1
- package/llms/components/lr-date-picker.md +6 -0
- package/llms/components/lr-dialog.md +21 -0
- package/llms/components/lr-doughnut-chart.md +3 -2
- package/llms/components/lr-drawer.md +10 -0
- package/llms/components/lr-drop-zone.md +16 -7
- package/llms/components/lr-dropdown-item.md +7 -0
- package/llms/components/lr-entity-chip.md +7 -1
- package/llms/components/lr-export-button.md +7 -1
- package/llms/components/lr-file-input.md +21 -10
- package/llms/components/lr-filter-bar.md +177 -18
- package/llms/components/lr-flow-canvas.md +16 -9
- package/llms/components/lr-gauge.md +22 -2
- package/llms/components/lr-histogram.md +7 -2
- package/llms/components/lr-icon-button.md +17 -8
- package/llms/components/lr-input.md +3 -1
- package/llms/components/lr-line-chart.md +3 -2
- package/llms/components/lr-lite-chart.md +13 -0
- package/llms/components/lr-locale-picker.md +7 -1
- package/llms/components/lr-map.md +63 -6
- package/llms/components/lr-mention-popover.md +16 -3
- package/llms/components/lr-menu-item.md +7 -0
- package/llms/components/lr-menu.md +8 -1
- package/llms/components/lr-message-actions.md +10 -0
- package/llms/components/lr-model-select.md +8 -3
- package/llms/components/lr-native-time-input.md +8 -1
- package/llms/components/lr-number-input.md +8 -1
- package/llms/components/lr-option.md +19 -0
- package/llms/components/lr-otp-input.md +6 -0
- package/llms/components/lr-pie-chart.md +3 -2
- package/llms/components/lr-polar-area-chart.md +3 -2
- package/llms/components/lr-prompt-input.md +2 -2
- package/llms/components/lr-radar-chart.md +3 -2
- package/llms/components/lr-reorder-item.md +12 -0
- package/llms/components/lr-reorder-list.md +12 -0
- package/llms/components/lr-scatter-chart.md +3 -2
- package/llms/components/lr-select.md +19 -2
- package/llms/components/lr-sequence-strip.md +10 -4
- package/llms/components/lr-streaming-text-core.md +28 -11
- package/llms/components/lr-streaming-text.md +41 -6
- package/llms/components/lr-suggestion-chips.md +8 -4
- package/llms/components/lr-table.md +47 -10
- package/llms/components/lr-textarea.md +1 -1
- package/llms/components/lr-time-input.md +7 -1
- package/llms/components/lr-tool-call-chip.md +7 -1
- package/llms/components/lr-tour.md +7 -1
- package/llms/components/lr-usage-badge.md +7 -1
- package/llms/components/lr-virtual-list.md +53 -0
- package/llms/components/lr-voice-picker.md +7 -3
- package/llms/shared.md +175 -19
- package/llms/tokens.md +17 -1
- package/llms-full.txt +1214 -169
- package/package.json +43 -3
- package/registrations.json +1 -1
- package/vscode-css-data.json +1 -1
- package/vscode-html-data.json +1 -1
- package/web-types.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,svg}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{acquireAnnouncementSink,Announcer}from"../../../internal/announcer.js";import{isRtl}from"../../../internal/rtl.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{layeredLayout}from"../../../internal/layered-layout.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{finiteNumber,finiteRange}from"../../../internal/numbers.js";import{isActionableElement}from"../../../internal/focus-navigation.js";import{resolveCssLength}from"../../../internal/css-length.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{tag}from"../../../internal/prefix.js";import{snapshotFlowDecorations,snapshotFlowEdges,snapshotFlowNodes,MAX_FLOW_COLLECTION_ENTRIES}from"./flow-model.js";import{FLOW_PALETTE_MIME_TYPE}from"./flow-types.js";import{styles}from"./flow-canvas.styles.js";import{LYRA_DEFAULT_flowCanvasLabel,LYRA_DEFAULT_flowCanvasLayoutLimit,LYRA_DEFAULT_flowCanvasSummary,LYRA_DEFAULT_flowConnectCancelled,LYRA_DEFAULT_flowConnectCommitted,LYRA_DEFAULT_flowConnectStarted,LYRA_DEFAULT_flowConnectTarget,LYRA_DEFAULT_flowEdge,LYRA_DEFAULT_flowEdgeList,LYRA_DEFAULT_flowEdgeWithLabel,LYRA_DEFAULT_flowItemAnnouncement,LYRA_DEFAULT_flowNode,LYRA_DEFAULT_flowNodeDeselected,LYRA_DEFAULT_flowNodeMoved,LYRA_DEFAULT_flowNodeSelected,LYRA_DEFAULT_flowSelectionCleared,LYRA_DEFAULT_noData}from"../../../internal/default-strings.generated.js";export*from"./flow-types.js";const FLOW_EDGE_TONES=["neutral","brand","success","warning","danger"],CONNECT_OFFSET_MIN=24,CONNECT_OFFSET_MAX=120,ZOOM_MULTIPLIER=1.2,DEFAULT_FIT_PADDING=24,KEYBOARD_PAN_STEP=32,UNMATCHED_AUTHORED_CARD_WARNING="lyra-flow-canvas-unmatched-authored-card";function toggledSelection(list,id){return list.includes(id)?list.filter(x=>x!==id):[...list,id]}function nodeTypePart(type){if(!type)return null;const normalized=type.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return normalized?`node-type-${/^\d/.test(normalized)?`type-${normalized}`:normalized}`:null}function isHtmlElement(value){if(typeof value!="object"||value===null)return!1;const element=value;return element.nodeType===1&&element.namespaceURI==="http://www.w3.org/1999/xhtml"}class LyraFlowCanvas extends LyraElement{constructor(){super(...arguments),this._nodes=Object.freeze([]),this._edges=Object.freeze([]),this._orientation="horizontal",this.nodesDraggable=!1,this.connectable=!1,this.droppable=!1,this.locked=!1,this._selectedNodeIds=Object.freeze([]),this._requestedSelectedNodeIds=Object.freeze([]),this._selectedEdgeIds=Object.freeze([]),this._requestedSelectedEdgeIds=Object.freeze([]),this.minZoom=.25,this.maxZoom=2,this.grid=8,this.layerGap=64,this.nodeGap=24,this._decorations=null,this.accessibleLabel=null,this.arrowMarkerIds={neutral:nextId("flow-canvas-arrow-neutral"),brand:nextId("flow-canvas-arrow-brand"),success:nextId("flow-canvas-arrow-success"),warning:nextId("flow-canvas-arrow-warning"),danger:nextId("flow-canvas-arrow-danger")},this.liveRegionId=nextId("flow-canvas-live"),this.announcer=new Announcer({onFlush:text=>{this.liveText=text,this.announcementSink?.announce(text)}}),this.liveText="",this.activeItemIndex=0,this.connecting=!1,this.layoutTruncated=!1,this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1,this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0,this.autoPositions=new Map,this.measuredSizes=new Map,this.observedNodeEls=new Set,this.authoredCardObserverGeneration=0,this.authoredCardSyncQueued=!1,this.authoredCardSlotLeases=new Map,this.layoutRaf=null,this.panX=0,this.panY=0,this.zoomLevel=1,this.viewportChangeRaf=null,this.hasFitOnce=!1,this.wheelMeasure=null,this.wheelMeasureRaf=null,this.nodeIncidentEdges=new Map,this.connectInvalidNodeId=null,this.companionCallbacks=new Set,this.companionRaf=null,this.onWheel=e=>{if(this.locked||!this.viewportEl)return;e.preventDefault(),this.wheelMeasure||(this.wheelMeasure={rect:this.viewportEl.getBoundingClientRect(),rtl:isRtl(this)},this.wheelMeasureRaf=this.requestOwnerAnimationFrame(()=>{this.wheelMeasure=null,this.wheelMeasureRaf=null}));const{rect,rtl}=this.wheelMeasure,localX=this.localWorldX(e.clientX,rect,rtl),localY=e.clientY-rect.top,factor=e.deltaY<0?ZOOM_MULTIPLIER:1/ZOOM_MULTIPLIER;this.zoomAtPoint(localX,localY,this.zoomLevel*factor)},this.onBackgroundPointerDown=e=>{this.locked||(this.panDrag={pointerId:e.pointerId,startClientX:e.clientX,startClientY:e.clientY,startPanX:this.panX,startPanY:this.panY,rtlFlip:this.orientation==="horizontal"&&isRtl(this)?-1:1},e.target.setPointerCapture?.(e.pointerId),this.viewportEl?.setAttribute("data-panning",""),this.connectedWindow?.addEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.addEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.addEventListener("lostpointercapture",this.onBackgroundPointerUp))},this.onBackgroundPointerMove=e=>{const drag=this.panDrag;if(!(!drag||e.pointerId!==drag.pointerId)){if(this.locked){this.endBackgroundPan(!0);return}this.panX=drag.startPanX+(e.clientX-drag.startClientX)*drag.rtlFlip,this.panY=drag.startPanY+(e.clientY-drag.startClientY),this.applyWorldTransform(),this.scheduleViewportChange()}},this.onBackgroundPointerUp=e=>{!this.panDrag||e.pointerId!==this.panDrag.pointerId||this.endBackgroundPan(this.locked||e.type!=="pointerup")},this.onViewportKeyDown=e=>{if(!(e.target!==this.viewportEl||this.locked))if(e.key==="+"||e.key==="=")e.preventDefault(),this.zoomIn();else if(e.key==="-"||e.key==="_")e.preventDefault(),this.zoomOut();else if(e.key==="0")e.preventDefault(),this.resetZoom();else if(e.key==="ArrowRight"){e.preventDefault();const rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;this.panBy(-KEYBOARD_PAN_STEP*rtlFlip,0)}else if(e.key==="ArrowLeft"){e.preventDefault();const rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;this.panBy(KEYBOARD_PAN_STEP*rtlFlip,0)}else e.key==="ArrowDown"?(e.preventDefault(),this.panBy(0,-KEYBOARD_PAN_STEP)):e.key==="ArrowUp"&&(e.preventDefault(),this.panBy(0,KEYBOARD_PAN_STEP))},this.onViewportDragOver=e=>{!this.droppable||this.locked||e.dataTransfer?.types.includes(FLOW_PALETTE_MIME_TYPE)&&(e.preventDefault(),e.dataTransfer.dropEffect="copy",this.viewportEl?.setAttribute("data-drop-active",""))},this.onViewportDragLeave=()=>{this.viewportEl?.removeAttribute("data-drop-active")},this.onViewportDrop=e=>{if(this.viewportEl?.removeAttribute("data-drop-active"),!this.droppable||this.locked)return;const raw=e.dataTransfer?.getData(FLOW_PALETTE_MIME_TYPE);if(!raw)return;e.preventDefault();const maxPayloadBytes=4096;if(raw.length>maxPayloadBytes)return;const TextEncoderCtor=this.ownerDocument.defaultView?.TextEncoder??globalThis.TextEncoder;if(TextEncoderCtor&&new TextEncoderCtor().encode(raw).byteLength>maxPayloadBytes)return;let payload;try{payload=JSON.parse(raw)}catch{return}if(typeof payload!="object"||payload===null||Array.isArray(payload)||Object.getPrototypeOf(payload)!==Object.prototype&&Object.getPrototypeOf(payload)!==null)return;const rawType=payload.type;if(typeof rawType!="string")return;const type=rawType.trim();if(!type||type.length>128)return;const contentPoint=this.toContentPoint(e.clientX,e.clientY);this.emit("lr-node-add",Object.freeze({type,position:Object.freeze({x:this.snap(contentPoint.x),y:this.snap(contentPoint.y)})}))},this.onNodePointerMove=e=>{const drag=this.nodeDrag;if(!drag||e.pointerId!==drag.pointerId)return;if(this.locked||!this.nodesDraggable){this.endNodeDrag(!1);return}const dx=(e.clientX-drag.startClientX)*drag.rtlFlip/this.zoomLevel,dy=(e.clientY-drag.startClientY)/this.zoomLevel,x=this.snap(drag.startX+dx),y=this.snap(drag.startY+dy);drag.wrapper.style.transform=`translate(${x}px, ${y}px)`,this.updateIncidentEdges(drag.nodeId,x,y),drag.currentX=x,drag.currentY=y},this.onNodePointerUp=e=>{const drag=this.nodeDrag;!drag||e.pointerId!==drag.pointerId||this.endNodeDrag(!this.locked&&e.type==="pointerup")},this.onWorldPointerDown=e=>{if(!this.connectable||this.locked||this.connectState)return;const path=e.composedPath(),handleEl=path.find(el=>isHtmlElement(el)&&el.dataset.handleKind==="output");if(!handleEl)return;const nodeId=this.nodeIdFromComposedPath(path),handleId=handleEl.dataset.handleId;!nodeId||!handleId||(e.stopPropagation(),this.startConnectGesture(nodeId,handleId,e.clientX,e.clientY))},this.onConnectPointerMove=e=>{if(!this.connectState)return;if(this.locked||!this.connectable){this.onConnectPointerCancel();return}const targetPt=this.connectContentPoint(e.clientX,e.clientY);this.connectionLineEl?.setAttribute("d",this.edgePathD(this.connectState.startPt,targetPt));const hoveredId=this.nodeIdFromComposedPath(e.composedPath()),invalid=hoveredId!=null&&this.isInvalidConnectTarget(hoveredId);this.connectInvalidNodeId&&this.connectInvalidNodeId!==(invalid?hoveredId:null)&&this.renderedNodeById(this.connectInvalidNodeId)?.removeAttribute("data-connect-invalid"),this.connectInvalidNodeId=invalid?hoveredId:null,invalid&&this.renderedNodeById(hoveredId)?.setAttribute("data-connect-invalid","")},this.onConnectPointerUp=e=>{if(!this.connectState)return;if(this.locked||!this.connectable){this.onConnectPointerCancel();return}const state2=this.connectState,path=e.composedPath(),targetNodeId=this.nodeIdFromComposedPath(path);if(this.endConnectGesture(),!targetNodeId||this.isInvalidConnectTargetFor(state2,targetNodeId)){this.announcer.announce(this.localize("flowConnectCancelled"));return}const targetHandle=path.find(el=>isHtmlElement(el)&&el.dataset.handleKind==="input")?.dataset.handleId??"in";this.emit("lr-connect",Object.freeze({source:state2.sourceId,target:targetNodeId,sourceHandle:state2.sourceHandle,targetHandle}));const sourceNode=this.nodes.find(node=>node.id===state2.sourceId),targetNode=this.nodes.find(node=>node.id===targetNodeId);this.announcer.announce(this.localize("flowConnectCommitted",void 0,{source:sourceNode?this.nodeAccessibleText(sourceNode):state2.sourceId,target:targetNode?this.nodeAccessibleText(targetNode):targetNodeId}))},this.onConnectPointerCancel=()=>{this.connectState&&(this.endConnectGesture(),this.announcer.announce(this.localize("flowConnectCancelled")))}}static{this.defaultStrings={...super.defaultStrings,flowCanvasLabel:LYRA_DEFAULT_flowCanvasLabel,flowCanvasLayoutLimit:LYRA_DEFAULT_flowCanvasLayoutLimit,flowCanvasSummary:LYRA_DEFAULT_flowCanvasSummary,flowConnectCancelled:LYRA_DEFAULT_flowConnectCancelled,flowConnectCommitted:LYRA_DEFAULT_flowConnectCommitted,flowConnectStarted:LYRA_DEFAULT_flowConnectStarted,flowConnectTarget:LYRA_DEFAULT_flowConnectTarget,flowEdge:LYRA_DEFAULT_flowEdge,flowEdgeList:LYRA_DEFAULT_flowEdgeList,flowEdgeWithLabel:LYRA_DEFAULT_flowEdgeWithLabel,flowItemAnnouncement:LYRA_DEFAULT_flowItemAnnouncement,flowNode:LYRA_DEFAULT_flowNode,flowNodeDeselected:LYRA_DEFAULT_flowNodeDeselected,flowNodeMoved:LYRA_DEFAULT_flowNodeMoved,flowNodeSelected:LYRA_DEFAULT_flowNodeSelected,flowSelectionCleared:LYRA_DEFAULT_flowSelectionCleared,noData:LYRA_DEFAULT_noData}}static{this.styles=[LyraElement.styles,styles,srOnly]}get nodes(){return this._nodes}set nodes(value){const previous=this._nodes;this._nodes=snapshotFlowNodes(value),this.requestUpdate("nodes",previous)}get edges(){return this._edges}set edges(value){const previous=this._edges;this._edges=snapshotFlowEdges(value),this.requestUpdate("edges",previous)}get orientation(){return this._orientation}set orientation(value){const previous=this._orientation,next=value==="vertical"?"vertical":"horizontal";this._orientation=next,(next!==previous||value!==next)&&this.requestUpdate("orientation",previous)}get selectedNodeIds(){return this._selectedNodeIds}set selectedNodeIds(value){const previous=this._selectedNodeIds;this._requestedSelectedNodeIds=this.sanitizeSelectionCandidates(value),this._selectedNodeIds=this.snapshotSelectedIds(this._requestedSelectedNodeIds,new Set(this.nodes.map(node=>node.id))),this.requestUpdate("selectedNodeIds",previous)}get selectedEdgeIds(){return this._selectedEdgeIds}set selectedEdgeIds(value){const previous=this._selectedEdgeIds;this._requestedSelectedEdgeIds=this.sanitizeSelectionCandidates(value),this._selectedEdgeIds=this.snapshotSelectedIds(this._requestedSelectedEdgeIds,new Set(this.edges.map(edge=>edge.id))),this.requestUpdate("selectedEdgeIds",previous)}sanitizeSelectionCandidates(value){if(!Array.isArray(value))return Object.freeze([]);const selected=[],seen=new Set;for(const candidate of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))typeof candidate!="string"||candidate.trim().length===0||seen.has(candidate)||(seen.add(candidate),selected.push(candidate));return Object.freeze(selected)}snapshotSelectedIds(value,validIds){const selected=value.filter(candidate=>validIds.has(candidate));return selected.length===value.length?value:Object.freeze(selected)}get decorations(){return this._decorations}set decorations(value){const previous=this._decorations;this._decorations=value==null?null:snapshotFlowDecorations(value),this.requestUpdate("decorations",previous)}get safeMinZoom(){return finiteRange(this.minZoom,.25,.001,1e3)}get safeMaxZoom(){return finiteRange(this.maxZoom,2,.001,1e3)}get effectiveZoomBounds(){return{min:Math.min(this.safeMinZoom,this.safeMaxZoom),max:Math.max(this.safeMinZoom,this.safeMaxZoom)}}get safeGrid(){return finiteRange(this.grid,8,0)}get safeLayerGap(){return finiteRange(this.layerGap,64,0)}get safeNodeGap(){return finiteRange(this.nodeGap,24,0)}connectedCallback(){super.connectedCallback();const ownerWindow=this.ownerDocument.defaultView;this.connectedWindow=ownerWindow??void 0,ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.syncAnnouncementSink();const ResizeObserverCtor=ownerWindow?.ResizeObserver;this.resizeObserver=ResizeObserverCtor?new ResizeObserverCtor(entries=>this.onNodesResized(entries)):void 0,this.bindAuthoredCardObserver(),this.syncAuthoredCards(),this.pushCardPropsAll(),this.hasUpdated&&(this.observeNodeWrappers(),this.nodes.length>0&&this.scheduleLayoutPass())}disconnectedCallback(){super.disconnectedCallback(),this.resetAuthoredCardObserver(),this.restoreAuthoredCardSlots(),this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1,this.announcer.cancel(),this.releaseAnnouncementSink(),this.liveText="",this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.observedNodeEls.clear(),this.layoutRaf!=null&&(this.cancelOwnerAnimationFrame(this.layoutRaf),this.layoutRaf=null),this.companionRaf!=null&&(this.cancelOwnerAnimationFrame(this.companionRaf),this.companionRaf=null),this.viewportChangeRaf!=null&&(this.cancelOwnerAnimationFrame(this.viewportChangeRaf),this.viewportChangeRaf=null),this.wheelMeasureRaf!=null&&(this.cancelOwnerAnimationFrame(this.wheelMeasureRaf),this.wheelMeasureRaf=null,this.wheelMeasure=null),this.panDrag=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onBackgroundPointerUp),this.nodeDrag=void 0,this.dragEdgeRefs=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onNodePointerUp),this.connectState=void 0,this.connecting=!1,this.connectInvalidNodeId=null,this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0,this.connectedWindow?.removeEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.removeEventListener("lostpointercapture",this.onConnectPointerCancel),this.connectedWindow=void 0}adoptedCallback(){super.adoptedCallback(),this.resetAuthoredCardObserver(),this.restoreAuthoredCardSlots(),this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1;const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.isConnected&&(this.bindAuthoredCardObserver(),this.scheduleAuthoredCardReconciliation(),this.nodes.length>0&&this.scheduleLayoutPass())}requestOwnerAnimationFrame(callback){const owner=this.ownerDocument.defaultView;return owner?{owner,handle:owner.requestAnimationFrame(callback)}:null}cancelOwnerAnimationFrame(frame){frame.owner.cancelAnimationFrame(frame.handle)}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){if(!this.isConnected){this.releaseAnnouncementSink();return}this.announcementSink?.element.ownerDocument!==this.ownerDocument&&(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}resetAuthoredCardObserver(){this.authoredCardObserverGeneration+=1,this.authoredCardObserver?.disconnect(),this.authoredCardObserver=void 0,this.authoredCardObserverDocument=void 0,this.authoredCardSyncQueued=!1}bindAuthoredCardObserver(){const ownerDocument=this.ownerDocument;if(!this.isConnected||this.authoredCardObserver&&this.authoredCardObserverDocument===ownerDocument)return;this.resetAuthoredCardObserver();const MutationObserverCtor=ownerDocument.defaultView?.MutationObserver;if(!MutationObserverCtor)return;const generation=this.authoredCardObserverGeneration,observer=new MutationObserverCtor(records=>{if(this.authoredCardObserver!==observer||this.authoredCardObserverDocument!==ownerDocument||this.authoredCardObserverGeneration!==generation||!this.isConnected||this.ownerDocument!==ownerDocument)return;records.some(record=>record.type==="childList"?record.target===this:record.type==="attributes"&&record.attributeName==="node-id"&&record.target.parentNode===this)&&this.scheduleAuthoredCardReconciliation()});observer.observe(this,{childList:!0,attributes:!0,attributeFilter:["node-id"],subtree:!0}),this.authoredCardObserver=observer,this.authoredCardObserverDocument=ownerDocument}scheduleAuthoredCardReconciliation(){const generation=this.authoredCardObserverGeneration,ownerDocument=this.authoredCardObserverDocument??this.ownerDocument;!this.isConnected||this.authoredCardSyncQueued||(this.authoredCardSyncQueued=!0,queueMicrotask(()=>{this.authoredCardObserverGeneration!==generation||!this.isConnected||this.ownerDocument!==ownerDocument||(this.authoredCardSyncQueued=!1,this.syncAuthoredCards(),this.pushCardPropsAll())}))}observeNodeWrappers(){for(const el of Array.from(this.renderRoot.querySelectorAll('[part="node"]')))this.observedNodeEls.has(el)||(this.observedNodeEls.add(el),this.resizeObserver?.observe(el))}willUpdate(changed){if(super.willUpdate(changed),changed.has("nodes")){this.cancelModelBoundGestures(),this.pruneNodeCaches(),this.syncAuthoredCards();const nodeIds=new Set(this.nodes.map(node=>node.id));this._selectedNodeIds=this.snapshotSelectedIds(this._requestedSelectedNodeIds,nodeIds)}if(changed.has("edges")){this.cancelModelBoundGestures();const edgeIds=new Set(this.edges.map(edge=>edge.id));this._selectedEdgeIds=this.snapshotSelectedIds(this._requestedSelectedEdgeIds,edgeIds)}if((changed.has("locked")&&this.locked||changed.has("orientation"))&&this.cancelActiveGestures(),changed.has("nodesDraggable")&&!this.nodesDraggable&&this.endNodeDrag(!1),changed.has("connectable")&&!this.connectable&&(this.onConnectPointerCancel(),this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0),changed.has("droppable")&&!this.droppable&&this.viewportEl?.removeAttribute("data-drop-active"),changed.has("grid")&&this.endNodeDrag(!1),changed.has("nodes")||changed.has("edges")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))for(const node of this.nodes)node.position||this.autoPositions.delete(node.id);(changed.has("nodes")||changed.has("selectedNodeIds")||changed.has("decorations")||changed.has("orientation"))&&this.pushCardPropsAll(changed)}pruneNodeCaches(){const nodeIds=new Set(this.nodes.map(node=>node.id));for(const id of this.autoPositions.keys())nodeIds.has(id)||this.autoPositions.delete(id);for(const id of this.measuredSizes.keys())nodeIds.has(id)||this.measuredSizes.delete(id);for(const element of this.observedNodeEls){const id=element.dataset.nodeId;id&&nodeIds.has(id)||(this.resizeObserver?.unobserve(element),this.observedNodeEls.delete(element))}}updated(changed){super.updated(changed),changed.has("edges")&&this.rebuildIncidentEdgesIndex(),changed.has("layoutTruncated")&&this.layoutLimitAnnouncementPending&&(this.layoutLimitAnnouncementPending=!1,this.isConnected&&this.layoutTruncated&&this.announcer.announce(this.localize("flowCanvasLayoutLimit"))),this.observeNodeWrappers(),(changed.has("nodes")||changed.has("edges")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))&&this.scheduleLayoutPass(),(changed.has("nodes")||changed.has("edges")||changed.has("decorations")||changed.has("minZoom")||changed.has("maxZoom")||changed.has("locked")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))&&this.scheduleCompanionNotify();const viewportEl=this.renderRoot.querySelector('[part="viewport"]');viewportEl&&viewportEl!==this.viewportEl&&(this.viewportEl=viewportEl,this.worldEl=this.renderRoot.querySelector(".world"),viewportEl.addEventListener("wheel",this.onWheel,{passive:!1}),viewportEl.addEventListener("keydown",this.onViewportKeyDown),viewportEl.addEventListener("dragover",this.onViewportDragOver),viewportEl.addEventListener("dragleave",this.onViewportDragLeave),viewportEl.addEventListener("drop",this.onViewportDrop),this.applyWorldTransform())}syncAuthoredCards(){const ids=new Set(this.nodes.map(node=>node.id)),adopted=new Set;for(const child of Array.from(this.children)){const nodeId=child.getAttribute("node-id");if(nodeId&&ids.has(nodeId)){this.leaseAuthoredCardSlot(child,nodeId),adopted.add(child);continue}this.releaseAuthoredCardSlot(child),nodeId&&devWarnOnce(UNMATCHED_AUTHORED_CARD_WARNING,"<lr-flow-canvas> has a direct child with a node-id that matches no node; it will not render.")}for(const child of[...this.authoredCardSlotLeases.keys()])adopted.has(child)||this.releaseAuthoredCardSlot(child)}leaseAuthoredCardSlot(child,nodeId){let lease=this.authoredCardSlotLeases.get(child);if(!lease){const slot2=child.getAttribute("slot");lease={authoredSlot:slot2,appliedSlot:slot2,authorOwnsSlot:!1},this.authoredCardSlotLeases.set(child,lease)}if(lease.authorOwnsSlot||child.getAttribute("slot")!==lease.appliedSlot){lease.authorOwnsSlot=!0;return}const slot=`node-${nodeId}`;child.getAttribute("slot")!==slot&&child.setAttribute("slot",slot),lease.appliedSlot=child.getAttribute("slot")}releaseAuthoredCardSlot(child){const lease=this.authoredCardSlotLeases.get(child);lease&&(!lease.authorOwnsSlot&&child.getAttribute("slot")===lease.appliedSlot&&(lease.authoredSlot===null?child.removeAttribute("slot"):child.setAttribute("slot",lease.authoredSlot)),this.authoredCardSlotLeases.delete(child))}restoreAuthoredCardSlots(){for(const child of[...this.authoredCardSlotLeases.keys()])this.releaseAuthoredCardSlot(child)}pushCardPropsAll(changed){const nodesChanged=changed?.has("nodes")??!0,selectionChanged=nodesChanged||changed?.has("selectedNodeIds")===!0,decorationsChanged=nodesChanged||changed?.has("decorations")===!0,orientationChanged=nodesChanged||changed?.has("orientation")===!0,cardsByNodeId=new Map;for(const child of Array.from(this.children)){const nodeId=child.getAttribute("node-id");nodeId&&this.authoredCardSlotLeases.has(child)&&cardsByNodeId.set(nodeId,child)}const selectedNodeIds=selectionChanged?new Set(this.selectedNodeIds):null;for(const node of this.nodes){const card=cardsByNodeId.get(node.id);if(card&&(nodesChanged&&(this.setCardProperty(card,"inputs",node.inputs??[{id:"in"}]),this.setCardProperty(card,"outputs",node.outputs??[{id:"out"}]),this.setCardProperty(card,"flowType",node.type??"")),orientationChanged&&this.setCardProperty(card,"orientation",this.orientation),selectedNodeIds&&this.setCardProperty(card,"selected",selectedNodeIds.has(node.id)),decorationsChanged)){const decoration=this.decorations?.[node.id];this.setCardProperty(card,"status",decoration?.status??null),this.setCardProperty(card,"progress",decoration?.progress??null),this.setCardProperty(card,"statusDetail",decoration?.detail??""),this.setCardProperty(card,"durationMs",decoration?.durationMs??null)}}}setCardProperty(card,property2,value){try{card[property2]=value}catch{}}nodePosition(node){const position=node.position??this.autoPositions.get(node.id)??{x:0,y:0};return{x:finiteNumber(position.x,0),y:finiteNumber(position.y,0)}}nodeSize(id){const measured=this.measuredSizes.get(id);if(measured)return measured;const ownerWindow=this.ownerDocument?.defaultView,host=this.renderedNodeById(id)??this,computed=ownerWindow?.getComputedStyle(host),customWidth=resolveCssLength(computed?.getPropertyValue("--lr-flow-canvas-node-fallback-inline-size").trim(),{host}),customHeight=resolveCssLength(computed?.getPropertyValue("--lr-flow-canvas-node-fallback-block-size").trim(),{host}),width=customWidth??(resolveCssLength(computed?.getPropertyValue("--lr-size-10rem").trim()||"10rem",{host})??0)+(resolveCssLength(computed?.getPropertyValue("--lr-size-1rem").trim()||"1rem",{host})??0),height=customHeight??resolveCssLength(computed?.getPropertyValue("--lr-size-4rem").trim()||"4rem",{host})??0;return{width,height}}resolvedNode(node){const pos=this.nodePosition(node),size=this.nodeSize(node.id);return{node,x:pos.x,y:pos.y,width:size.width,height:size.height}}handleOffset(count,index,span){return count<=1?span/2:span*(index+.5)/count}handlePoint(resolved,kind,handleId){const handles=kind==="input"?resolved.node.inputs??[{id:"in"}]:resolved.node.outputs??[{id:"out"}],index=handles.findIndex(h=>h.id===handleId),horizontal=this.orientation==="horizontal",edgeSpan=horizontal?resolved.height:resolved.width,offset=index>=0?this.handleOffset(handles.length,index,edgeSpan):edgeSpan/2;if(horizontal)return{x:kind==="input"?resolved.x:resolved.x+resolved.width,y:resolved.y+offset};const y=kind==="input"?resolved.y:resolved.y+resolved.height;return{x:resolved.x+offset,y}}edgePathD(sourcePt,targetPt){const dx=targetPt.x-sourcePt.x,dy=targetPt.y-sourcePt.y,distance=Math.hypot(dx,dy),offset=Math.min(CONNECT_OFFSET_MAX,Math.max(CONNECT_OFFSET_MIN,distance/2)),horizontal=this.orientation==="horizontal",c1x=sourcePt.x+(horizontal?offset:0),c1y=sourcePt.y+(horizontal?0:offset),c2x=targetPt.x-(horizontal?offset:0),c2y=targetPt.y-(horizontal?0:offset);return`M ${sourcePt.x} ${sourcePt.y} C ${c1x} ${c1y}, ${c2x} ${c2y}, ${targetPt.x} ${targetPt.y}`}nodeAccessibleText(node){if(node.accessibleLabel)return node.accessibleLabel;const label=typeof node.data?.label=="string"?node.data.label:node.id;return this.localize("flowNode",void 0,{label})}edgeAccessibleText(edge){const sourceNode=this.nodes.find(n=>n.id===edge.source),targetNode=this.nodes.find(n=>n.id===edge.target),source=sourceNode?this.nodeAccessibleText(sourceNode):edge.source,target=targetNode?this.nodeAccessibleText(targetNode):edge.target;return edge.label?this.localize("flowEdgeWithLabel",void 0,{label:edge.label,source,target}):this.localize("flowEdge",void 0,{source,target})}onNodesResized(entries){let changedAny=!1;for(const entry of entries){const id=entry.target.dataset.nodeId;if(!id)continue;const box=entry.borderBoxSize?.[0],width=box?box.inlineSize:entry.contentRect.width,height=box?box.blockSize:entry.contentRect.height,prev=this.measuredSizes.get(id);(!prev||prev.width!==width||prev.height!==height)&&(this.measuredSizes.set(id,{width,height}),changedAny=!0)}changedAny&&(this.scheduleLayoutPass(),this.scheduleCompanionNotify())}measureNodeWrappers(){for(const wrapper of Array.from(this.renderRoot.querySelectorAll('[part="node"]'))){const id=wrapper.dataset.nodeId;if(!id)continue;const rect=wrapper.getBoundingClientRect(),width=wrapper.offsetWidth||rect.width/Math.max(this.zoomLevel,Number.EPSILON),height=wrapper.offsetHeight||rect.height/Math.max(this.zoomLevel,Number.EPSILON);Number.isFinite(width)&&Number.isFinite(height)&&width>0&&height>0&&this.measuredSizes.set(id,{width,height})}}scheduleLayoutPass(){!this.isConnected||this.layoutRaf!=null||(this.layoutRaf=this.requestOwnerAnimationFrame(()=>{this.layoutRaf=null,this.isConnected&&(this.measureNodeWrappers(),this.runAutoLayoutIfNeeded(),this.requestUpdate(),!this.hasFitOnce&&this.nodes.length>0&&(this.hasFitOnce=!0,this.fit()))}))}setLayoutTruncated(truncated){const previous=this.layoutTruncated;if(this.layoutTruncated=truncated,truncated||(this.layoutLimitAnnouncementPending=!1),!(!this.isConnected||this.nodes.length===0)){if(!this.hasConnectedLayoutBaseline){this.hasConnectedLayoutBaseline=!0;return}!previous&&truncated&&(this.layoutLimitAnnouncementPending=!0)}}runAutoLayoutIfNeeded(){const unpositioned=this.nodes.filter(n=>!n.position);if(unpositioned.length===0){this.setLayoutTruncated(!1);return}const swap=this.orientation==="horizontal",graphNodes=this.nodes.map(n=>{const size=this.nodeSize(n.id);return{id:n.id,width:swap?size.height:size.width,height:swap?size.width:size.height}}),nodeIds=new Set(this.nodes.map(n=>n.id)),graphEdges=this.edges.filter(e=>nodeIds.has(e.source)&&nodeIds.has(e.target)).map(e=>({source:e.source,target:e.target})),fixedPositions=new Map;for(const n of this.nodes){if(!n.position||n.position.x<0||n.position.y<0)continue;const size=this.nodeSize(n.id),center={x:n.position.x+size.width/2,y:n.position.y+size.height/2};!Number.isSafeInteger(Math.trunc(center.x))||!Number.isSafeInteger(Math.trunc(center.y))||fixedPositions.set(n.id,swap?{x:center.y,y:center.x}:center)}const result=layeredLayout({nodes:graphNodes,edges:graphEdges,options:{gapX:this.safeNodeGap,gapY:this.safeLayerGap,fixedPositions}}),positions={};for(const n of unpositioned){const raw=result.positions.get(n.id);if(!raw)continue;const center=swap?{x:raw.y,y:raw.x}:{x:raw.x,y:raw.y},size=this.nodeSize(n.id),resolved={x:center.x-size.width/2,y:center.y-size.height/2};this.autoPositions.set(n.id,resolved),positions[n.id]=Object.freeze(resolved)}this.setLayoutTruncated(result.truncated),Object.keys(positions).length>0&&this.emit("lr-layout-change",Object.freeze({positions:Object.freeze(positions),truncated:result.truncated}))}get viewport(){return Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel})}set viewport(_value){}setViewport(next){this.locked||(this.panX=finiteNumber(next.x,this.panX),this.panY=finiteNumber(next.y,this.panY),this.zoomLevel=this.clampZoom(next.zoom),this.applyWorldTransform(),this.emit("lr-viewport-change",Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel})))}zoomIn(){this.locked||this.zoomAtCenter(this.zoomLevel*ZOOM_MULTIPLIER)}zoomOut(){this.locked||this.zoomAtCenter(this.zoomLevel/ZOOM_MULTIPLIER)}resetZoom(){this.locked||this.setViewport({x:this.panX,y:this.panY,zoom:1})}fit(options){if(this.locked||this.nodes.length===0)return;const padding=finiteRange(options?.padding??DEFAULT_FIT_PADDING,DEFAULT_FIT_PADDING,0);let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const node of this.nodes){const resolved=this.resolvedNode(node);minX=Math.min(minX,resolved.x),minY=Math.min(minY,resolved.y),maxX=Math.max(maxX,resolved.x+resolved.width),maxY=Math.max(maxY,resolved.y+resolved.height)}const rect=this.viewportEl?.getBoundingClientRect(),viewW=rect?.width??0,viewH=rect?.height??0,contentW=Math.max(1,maxX-minX),contentH=Math.max(1,maxY-minY),fitZoom=Math.min((viewW-padding*2)/contentW,(viewH-padding*2)/contentH),zoom=this.clampZoom(Number.isFinite(fitZoom)&&fitZoom>0?fitZoom:1);this.panX=viewW/2-(minX+contentW/2)*zoom,this.panY=viewH/2-(minY+contentH/2)*zoom,this.zoomLevel=zoom,this.applyWorldTransform(),this.scheduleViewportChange()}focusNode(id,options){if(this.locked)return;const node=this.nodes.find(n=>n.id===id);if(!node)return;const resolved=this.resolvedNode(node),rect=this.viewportEl?.getBoundingClientRect(),viewW=rect?.width??0,viewH=rect?.height??0,zoom=options?.zoom!=null?this.clampZoom(options.zoom):this.zoomLevel;this.panX=viewW/2-(resolved.x+resolved.width/2)*zoom,this.panY=viewH/2-(resolved.y+resolved.height/2)*zoom,this.zoomLevel=zoom,this.applyWorldTransform(),this.scheduleViewportChange(),this.focusActiveItem(this.spatialItemIndex("node",id))}toContentPoint(clientX,clientY){const rect=this.viewportEl?.getBoundingClientRect();if(!rect)return{x:0,y:0};const localX=this.localWorldX(clientX,rect),localY=clientY-rect.top;return{x:(localX-this.panX)/this.zoomLevel,y:(localY-this.panY)/this.zoomLevel}}registerCompanion(cb){return this.companionCallbacks.add(cb),this.scheduleCompanionNotify(),()=>{this.companionCallbacks.delete(cb)}}scheduleCompanionNotify(){this.companionRaf!=null||this.companionCallbacks.size===0||(this.companionRaf=this.requestOwnerAnimationFrame(()=>{this.companionRaf=null;for(const cb of this.companionCallbacks)cb(this.buildSnapshot())}))}buildSnapshot(){const rect=this.viewportEl?.getBoundingClientRect(),bounds=this.effectiveZoomBounds;return Object.freeze({nodes:Object.freeze(this.nodes.map(n=>{const resolved=this.resolvedNode(n);return Object.freeze({id:n.id,x:resolved.x,y:resolved.y,width:resolved.width,height:resolved.height,status:this.decorations?.[n.id]?.status})})),edges:Object.freeze(this.edges.map(e=>Object.freeze({id:e.id,source:e.source,target:e.target,status:this.decorations?.[e.id]?.status}))),viewport:Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel,width:rect?.width??0,height:rect?.height??0,minZoom:bounds.min,maxZoom:bounds.max}),locked:this.locked,orientation:this.orientation,layerGap:this.safeLayerGap,nodeGap:this.safeNodeGap})}clampZoom(z){const{min,max}=this.effectiveZoomBounds;return finiteRange(z,1,min,max)}applyWorldTransform(){this.worldEl&&(this.worldEl.style.transform=`translate(${this.panX}px, ${this.panY}px) scale(${this.zoomLevel})`),this.scheduleCompanionNotify()}scheduleViewportChange(){this.viewportChangeRaf==null&&(this.viewportChangeRaf=this.requestOwnerAnimationFrame(()=>{this.viewportChangeRaf=null,this.emit("lr-viewport-change",Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel}))}))}zoomAtCenter(nextZoom){const rect=this.viewportEl?.getBoundingClientRect();this.zoomAtPoint(rect?rect.width/2:0,rect?rect.height/2:0,nextZoom)}zoomAtPoint(localX,localY,nextZoom){const clamped=this.clampZoom(nextZoom);if(clamped===this.zoomLevel)return;const contentX=(localX-this.panX)/this.zoomLevel,contentY=(localY-this.panY)/this.zoomLevel;this.panX=localX-contentX*clamped,this.panY=localY-contentY*clamped,this.zoomLevel=clamped,this.applyWorldTransform(),this.scheduleViewportChange()}localWorldX(clientX,rect,rtl=isRtl(this)){const local=clientX-rect.left;return this.orientation==="horizontal"&&rtl?rect.width-local:local}endBackgroundPan(rollback){const drag=this.panDrag;drag&&(this.panDrag=void 0,this.viewportEl?.removeAttribute("data-panning"),this.connectedWindow?.removeEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onBackgroundPointerUp),rollback&&(this.panX!==drag.startPanX||this.panY!==drag.startPanY)&&(this.panX=drag.startPanX,this.panY=drag.startPanY,this.applyWorldTransform(),this.scheduleViewportChange()))}panBy(dx,dy){this.panX+=dx,this.panY+=dy,this.applyWorldTransform(),this.scheduleViewportChange()}spatialNodeOrder(){const horizontal=this.orientation==="horizontal";return[...this.nodes].sort((a,b)=>{const pa=this.resolvedNode(a),pb=this.resolvedNode(b),mainA=horizontal?pa.x:pa.y,mainB=horizontal?pb.x:pb.y;if(mainA!==mainB)return mainA-mainB;const crossA=horizontal?pa.y:pa.x,crossB=horizontal?pb.y:pb.x;return crossA-crossB})}focusableEdges(){const nodeIds=new Set(this.nodes.map(n=>n.id));return this.edges.filter(e=>nodeIds.has(e.source)&&nodeIds.has(e.target))}rovingItems(){return[...this.spatialNodeOrder().map(n=>({kind:"node",id:n.id})),...this.focusableEdges().map(e=>({kind:"edge",id:e.id}))]}itemCount(){return this.nodes.length+this.focusableEdges().length}normalizedItemIndex(index=this.activeItemIndex){const count=this.itemCount();return count?Math.min(Math.max(index,0),count-1):-1}itemAccessibleText(item){if(item.kind==="node"){const node=this.nodes.find(n=>n.id===item.id);return node?this.nodeAccessibleText(node):""}const edge=this.edges.find(e=>e.id===item.id);return edge?this.edgeAccessibleText(edge):""}spatialItemIndex(kind,id){return this.rovingItems().findIndex(it=>it.kind===kind&&it.id===id)}announceItem(index){const item=this.rovingItems()[index];item&&this.announcer.announce(this.localize("flowItemAnnouncement",void 0,{item:this.itemAccessibleText(item),index:this.formatNumber(index+1),total:this.formatNumber(this.itemCount())}))}formatNumber(value){return getNumberFormat(this.effectiveLocale).format(value)}onItemFocus(index){this.normalizedItemIndex(index)<0||(this.activeItemIndex=index,this.announceItem(index))}renderedElementByDataId(attribute,id){const renderRoot=this.renderRoot;if(!renderRoot)return null;const ownerCss=this.ownerDocument?.defaultView?.CSS,escape=ownerCss?.escape;if(typeof escape=="function")try{const match=renderRoot.querySelector(`[${attribute}="${escape.call(ownerCss,id)}"]`);if(match)return match}catch{}return[...renderRoot.querySelectorAll(`[${attribute}]`)].find(candidate=>candidate.getAttribute(attribute)===id)??null}renderedNodeById(id){return this.renderedElementByDataId("data-node-id",id)}renderedEdgeById(id){return this.renderedElementByDataId("data-edge-id",id)}focusActiveItem(index=this.activeItemIndex){const normalized=this.normalizedItemIndex(index);if(normalized<0)return;this.activeItemIndex=normalized,this.announceItem(normalized);const item=this.rovingItems()[normalized];item&&this.updateComplete.then(()=>{(item.kind==="node"?this.renderedNodeById(item.id)?.querySelector('[part="node-control"]'):this.renderedEdgeById(item.id)?.querySelector('[part="edge"]'))?.focus()})}applySelection(kind,id,additive){kind==="node"?(this.selectedNodeIds=additive?toggledSelection(this.selectedNodeIds,id):[id],additive||(this.selectedEdgeIds=[])):(this.selectedEdgeIds=additive?toggledSelection(this.selectedEdgeIds,id):[id],additive||(this.selectedNodeIds=[])),this.emit("lr-selection-change",Object.freeze({nodeIds:Object.freeze([...this.selectedNodeIds]),edgeIds:Object.freeze([...this.selectedEdgeIds])}));const selected=kind==="node"?this.selectedNodeIds.includes(id):this.selectedEdgeIds.includes(id),label=this.itemAccessibleText({kind,id});this.announcer.announce(this.localize(selected?"flowNodeSelected":"flowNodeDeselected",void 0,{label}))}clearSelection(){this.selectedNodeIds.length===0&&this.selectedEdgeIds.length===0||(this.selectedNodeIds=[],this.selectedEdgeIds=[],this.emit("lr-selection-change",Object.freeze({nodeIds:Object.freeze([]),edgeIds:Object.freeze([])})),this.announcer.announce(this.localize("flowSelectionCleared")))}deleteSelection(){!this.nodesDraggable&&!this.connectable&&!this.droppable||this.selectedNodeIds.length===0&&this.selectedEdgeIds.length===0||this.emit("lr-selection-delete",Object.freeze({nodeIds:Object.freeze([...this.selectedNodeIds]),edgeIds:Object.freeze([...this.selectedEdgeIds])}))}onNodeActivate(node,additive){this.emit("lr-node-activate",Object.freeze({nodeId:node.id})),this.applySelection("node",node.id,additive)}onNodeClick(event,node){const currentTarget=event.currentTarget;for(const entry of event.composedPath()){if(entry===currentTarget)break;if(entry&&typeof entry=="object"&&entry.nodeType===1&&isActionableElement(entry)){event.stopPropagation();return}}this.onNodeActivate(node,event.ctrlKey||event.metaKey)}onEdgeActivate(edge,additive){this.emit("lr-edge-activate",Object.freeze({edgeId:edge.id,source:edge.source,target:edge.target})),this.applySelection("edge",edge.id,additive)}onItemKeyDown(e,index,activate){const arrowKeys=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];if(this.nodesDraggable&&!this.locked&&(e.ctrlKey||e.metaKey)&&arrowKeys.includes(e.key)){const item=this.rovingItems()[index];if(item?.kind==="node"){e.preventDefault(),this.nudgeNode(item.id,e.key);return}}if(this.keyboardConnectSourceId){if(e.key==="Escape"){e.preventDefault(),this.cancelKeyboardConnect();return}if(e.key==="Enter"){e.preventDefault(),this.commitKeyboardConnect();return}const rtlForConnect=isRtl(this),forwardConnectKey=rtlForConnect?"ArrowLeft":"ArrowRight",backwardConnectKey=rtlForConnect?"ArrowRight":"ArrowLeft";if(e.key===forwardConnectKey||e.key==="ArrowDown"){e.preventDefault(),this.cycleKeyboardConnectTarget(1);return}if(e.key===backwardConnectKey||e.key==="ArrowUp"){e.preventDefault(),this.cycleKeyboardConnectTarget(-1);return}return}if(this.connectable&&!this.locked&&e.key==="c"&&e.target===e.currentTarget){const item=this.rovingItems()[index];if(item?.kind==="node"){e.preventDefault(),this.startKeyboardConnect(item.id);return}}if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.setActiveItemQuiet(index),activate(e.ctrlKey||e.metaKey);return}if(e.key==="Escape"){e.preventDefault(),e.target!==e.currentTarget?e.currentTarget.focus():this.clearSelection();return}if((e.key==="Delete"||e.key==="Backspace")&&e.target===e.currentTarget){e.preventDefault(),this.deleteSelection();return}const count=this.itemCount();if(!count)return;const rtl=isRtl(this),forwardKey=rtl?"ArrowLeft":"ArrowRight",backwardKey=rtl?"ArrowRight":"ArrowLeft";let next=index;if(e.key===forwardKey||e.key==="ArrowDown")next=Math.min(count-1,index+1);else if(e.key===backwardKey||e.key==="ArrowUp")next=Math.max(0,index-1);else if(e.key==="Home")next=0;else if(e.key==="End")next=count-1;else return;e.preventDefault(),this.focusActiveItem(next)}setActiveItemQuiet(index){const normalized=this.normalizedItemIndex(index);normalized>=0&&(this.activeItemIndex=normalized)}itemIndexMaps(){const items=this.rovingItems(),nodeIndex=new Map,edgeIndex=new Map;return items.forEach((item,i)=>{item.kind==="node"?nodeIndex.set(item.id,i):edgeIndex.set(item.id,i-nodeIndex.size)}),{nodeIndex,edgeIndex}}snap(value){const grid=this.safeGrid;return grid>0?Math.round(value/grid)*grid:value}rebuildIncidentEdgesIndex(){const map=new Map;for(const edge of this.edges)(map.get(edge.source)??map.set(edge.source,[]).get(edge.source)).push(edge.id),edge.target!==edge.source&&(map.get(edge.target)??map.set(edge.target,[]).get(edge.target)).push(edge.id);this.nodeIncidentEdges=map}buildDragEdgeRefs(nodeId){const refs=[];for(const edgeId of this.nodeIncidentEdges.get(nodeId)??[]){const edge=this.edges.find(e=>e.id===edgeId),sourceNode=edge&&this.nodes.find(n=>n.id===edge.source),targetNode=edge&&this.nodes.find(n=>n.id===edge.target);if(!edge||!sourceNode||!targetNode)continue;const group=this.renderedEdgeById(edgeId);refs.push({edge,sourceNode,targetNode,pathEl:group?.querySelector('[part="edge"]')??null,labelEl:group?.querySelector('[part="edge-label"]')??null})}return refs}updateIncidentEdges(nodeId,x,y){for(const{edge,sourceNode,targetNode,pathEl,labelEl}of this.dragEdgeRefs??[]){const sourceResolved=edge.source===nodeId?{...this.resolvedNode(sourceNode),x,y}:this.resolvedNode(sourceNode),targetResolved=edge.target===nodeId?{...this.resolvedNode(targetNode),x,y}:this.resolvedNode(targetNode),sourcePt=this.handlePoint(sourceResolved,"output",edge.sourceHandle??"out"),targetPt=this.handlePoint(targetResolved,"input",edge.targetHandle??"in");if(pathEl?.setAttribute("d",this.edgePathD(sourcePt,targetPt)),labelEl){const midX=(sourcePt.x+targetPt.x)/2;labelEl.setAttribute("x",String(midX)),labelEl.setAttribute("y",String((sourcePt.y+targetPt.y)/2)),this.orientation==="horizontal"&&isRtl(this)?labelEl.setAttribute("transform",`translate(${2*midX} 0) scale(-1 1)`):labelEl.removeAttribute("transform")}}}onNodePointerDown(e,node){if(!this.nodesDraggable||this.locked)return;const wrapper=e.currentTarget,interactive=e.target.closest('button, a[href], input, select, textarea, [role="button"], [tabindex]:not([part="node"])');if(interactive&&interactive!==wrapper&&wrapper.contains(interactive))return;e.stopPropagation();const start=this.nodePosition(node);this.nodeDrag={pointerId:e.pointerId,nodeId:node.id,startClientX:e.clientX,startClientY:e.clientY,startX:start.x,startY:start.y,wrapper,rtlFlip:this.orientation==="horizontal"&&isRtl(this)?-1:1},this.dragEdgeRefs=this.buildDragEdgeRefs(node.id),wrapper.setPointerCapture?.(e.pointerId),this.connectedWindow?.addEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.addEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.addEventListener("lostpointercapture",this.onNodePointerUp)}endNodeDrag(commit){const drag=this.nodeDrag;if(!drag)return;this.nodeDrag=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onNodePointerUp);const previous={x:drag.startX,y:drag.startY},position={x:drag.currentX??drag.startX,y:drag.currentY??drag.startY};commit&&this.nodesDraggable&&this.nodes.some(node=>node.id===drag.nodeId)&&(position.x!==previous.x||position.y!==previous.y)&&this.emit("lr-node-move",Object.freeze({nodeId:drag.nodeId,position:Object.freeze(position),previous:Object.freeze(previous)}));const resetNode=this.nodes.find(n=>n.id===drag.nodeId),resetPos=resetNode?this.nodePosition(resetNode):previous;drag.wrapper.style.transform=`translate(${resetPos.x}px, ${resetPos.y}px)`,this.updateIncidentEdges(drag.nodeId,resetPos.x,resetPos.y),this.dragEdgeRefs=void 0,this.requestUpdate()}nudgeNode(nodeId,key){const node=this.nodes.find(n=>n.id===nodeId);if(!node)return;const current=this.nodePosition(node),step=this.safeGrid>0?this.safeGrid:1,rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;let dx=0,dy=0;key==="ArrowRight"?dx=step*rtlFlip:key==="ArrowLeft"?dx=-step*rtlFlip:key==="ArrowDown"?dy=step:key==="ArrowUp"&&(dy=-step);const position={x:current.x+dx,y:current.y+dy};this.emit("lr-node-move",Object.freeze({nodeId,position:Object.freeze(position),previous:Object.freeze(current)})),this.announcer.announce(this.localize("flowNodeMoved",void 0,{label:this.nodeAccessibleText(node),x:this.formatNumber(position.x),y:this.formatNumber(position.y)})),this.requestUpdate()}nodeIdFromComposedPath(path){for(const el of path)if(isHtmlElement(el)&&el.getAttribute("part")==="node"&&el.dataset.nodeId)return el.dataset.nodeId;return null}isInvalidConnectTarget(hoveredId){return this.connectState?hoveredId===this.connectState.sourceId?!0:this.edges.some(e=>e.source===this.connectState.sourceId&&e.target===hoveredId):!1}startConnectGesture(nodeId,handleId,clientX,clientY){const sourceNode=this.nodes.find(n=>n.id===nodeId);if(!sourceNode)return;const startPt=this.handlePoint(this.resolvedNode(sourceNode),"output",handleId);this.connectState={sourceId:nodeId,sourceHandle:handleId,startPt,rect:this.viewportEl?.getBoundingClientRect()??null,rtl:isRtl(this)},this.connecting=!0,this.announcer.announce(this.localize("flowConnectStarted",void 0,{label:this.nodeAccessibleText(sourceNode)})),this.updateComplete.then(()=>{this.connectionLineEl=this.renderRoot.querySelector('[part="connection-line"]')??void 0,this.connectionLineEl?.setAttribute("d",this.edgePathD(startPt,this.connectContentPoint(clientX,clientY)))}),this.connectedWindow?.addEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.addEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.addEventListener("lostpointercapture",this.onConnectPointerCancel)}connectContentPoint(clientX,clientY){const state2=this.connectState;if(!state2?.rect)return{x:0,y:0};const localX=this.localWorldX(clientX,state2.rect,state2.rtl),localY=clientY-state2.rect.top;return{x:(localX-this.panX)/this.zoomLevel,y:(localY-this.panY)/this.zoomLevel}}isInvalidConnectTargetFor(state2,hoveredId){return hoveredId===state2.sourceId?!0:this.edges.some(e=>e.source===state2.sourceId&&e.target===hoveredId)}endConnectGesture(){this.connectInvalidNodeId&&(this.renderedNodeById(this.connectInvalidNodeId)?.removeAttribute("data-connect-invalid"),this.connectInvalidNodeId=null),this.connectState=void 0,this.connecting=!1,this.connectedWindow?.removeEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.removeEventListener("lostpointercapture",this.onConnectPointerCancel)}cancelActiveGestures(){this.endBackgroundPan(!0),this.cancelModelBoundGestures(),this.viewportEl?.removeAttribute("data-drop-active")}cancelModelBoundGestures(){this.endNodeDrag(!1),this.onConnectPointerCancel(),this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0}eligibleConnectTargets(sourceId){return this.nodes.filter(n=>n.id!==sourceId&&!this.edges.some(e=>e.source===sourceId&&e.target===n.id))}startKeyboardConnect(sourceId){if(this.eligibleConnectTargets(sourceId).length===0)return;const sourceNode=this.nodes.find(n=>n.id===sourceId);this.keyboardConnectSourceId=sourceId,this.keyboardConnectTargetIndex=0,sourceNode&&this.announceKeyboardConnectTarget()}cycleKeyboardConnectTarget(direction){if(!this.keyboardConnectSourceId)return;const targets=this.eligibleConnectTargets(this.keyboardConnectSourceId);targets.length!==0&&(this.keyboardConnectTargetIndex=(this.keyboardConnectTargetIndex+direction+targets.length)%targets.length,this.announceKeyboardConnectTarget())}announceKeyboardConnectTarget(){const sourceId=this.keyboardConnectSourceId;if(!sourceId)return;const source=this.nodes.find(node=>node.id===sourceId),targets=this.eligibleConnectTargets(sourceId),target=targets[this.keyboardConnectTargetIndex];!source||!target||this.announcer.announce(this.localize("flowConnectTarget",void 0,{source:this.nodeAccessibleText(source),target:this.nodeAccessibleText(target),index:this.formatNumber(this.keyboardConnectTargetIndex+1),total:this.formatNumber(targets.length)}))}isKeyboardConnectTarget(nodeId){return this.keyboardConnectSourceId?this.eligibleConnectTargets(this.keyboardConnectSourceId)[this.keyboardConnectTargetIndex]?.id===nodeId:!1}commitKeyboardConnect(){const sourceId=this.keyboardConnectSourceId;if(!sourceId)return;const target=this.eligibleConnectTargets(sourceId)[this.keyboardConnectTargetIndex];if(this.keyboardConnectSourceId=null,!target)return;const sourceOutputs=this.nodes.find(n=>n.id===sourceId)?.outputs??[{id:"out"}],targetInputs=target.inputs??[{id:"in"}];if(!this.connectable||this.locked)return;this.emit("lr-connect",Object.freeze({source:sourceId,target:target.id,sourceHandle:sourceOutputs[0]?.id??"out",targetHandle:targetInputs[0]?.id??"in"}));const source=this.nodes.find(node=>node.id===sourceId);this.announcer.announce(this.localize("flowConnectCommitted",void 0,{source:source?this.nodeAccessibleText(source):sourceId,target:this.nodeAccessibleText(target)}))}cancelKeyboardConnect(){this.keyboardConnectSourceId&&(this.keyboardConnectSourceId=null,this.announcer.announce(this.localize("flowConnectCancelled")))}statusTone(status){return status==="running"?"brand":status==="success"?"success":status==="error"?"danger":status==="denied"?"warning":"neutral"}edgeTone(edge){const decoration=this.decorations?.[edge.id];return decoration?this.statusTone(decoration.status):edge.tone??"neutral"}edgeIsRunning(edge){return this.decorations?.[edge.id]?.status==="running"}renderEdges(nodeIndex,edgeIndex){const resolvedById=new Map(this.nodes.map(n=>[n.id,this.resolvedNode(n)])),items=[],ownerWindow=this.ownerDocument?.defaultView,reducedMotion=!ownerWindow||prefersReducedMotion(ownerWindow),counterMirrorLabels=this.orientation==="horizontal"&&!!this.ownerDocument?.defaultView&&isRtl(this);for(const edge of this.edges){const sourceResolved=resolvedById.get(edge.source);if(!sourceResolved)continue;const targetResolved=resolvedById.get(edge.target),sourcePt=this.handlePoint(sourceResolved,"output",edge.sourceHandle??"out");if(!targetResolved){const stubPt={x:sourcePt.x+14,y:sourcePt.y+14};items.push(svg`<line
|
|
1
|
+
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing,svg}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{nextId,srOnly}from"../../../internal/a11y.js";import{acquireAnnouncementSink,Announcer}from"../../../internal/announcer.js";import{isRtl}from"../../../internal/rtl.js";import{prefersReducedMotion}from"../../../internal/motion.js";import{layeredLayout}from"../../../internal/layered-layout.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{finiteNumber,finiteRange}from"../../../internal/numbers.js";import{isActionableElement}from"../../../internal/focus-navigation.js";import{resolveCssLength}from"../../../internal/css-length.js";import{devWarnOnce}from"../../../internal/dev-mode-attribute-warning.js";import{tag}from"../../../internal/prefix.js";import{snapshotFlowDecorations,snapshotFlowEdges,snapshotFlowNodes,MAX_FLOW_COLLECTION_ENTRIES}from"./flow-model.js";import{FLOW_PALETTE_MIME_TYPE}from"./flow-types.js";import{styles}from"./flow-canvas.styles.js";import{LYRA_DEFAULT_flowCanvasLabel,LYRA_DEFAULT_flowCanvasLayoutLimit,LYRA_DEFAULT_flowCanvasSummary,LYRA_DEFAULT_flowConnectCancelled,LYRA_DEFAULT_flowConnectCommitted,LYRA_DEFAULT_flowConnectStarted,LYRA_DEFAULT_flowConnectTarget,LYRA_DEFAULT_flowEdge,LYRA_DEFAULT_flowEdgeList,LYRA_DEFAULT_flowEdgeWithLabel,LYRA_DEFAULT_flowItemAnnouncement,LYRA_DEFAULT_flowNode,LYRA_DEFAULT_flowNodeDeselected,LYRA_DEFAULT_flowNodeMoved,LYRA_DEFAULT_flowNodeSelected,LYRA_DEFAULT_flowSelectionCleared,LYRA_DEFAULT_noData}from"../../../internal/default-strings.generated.js";export*from"./flow-types.js";const FLOW_EDGE_TONES=["neutral","brand","success","warning","danger"],CONNECT_OFFSET_MIN=24,CONNECT_OFFSET_MAX=120,ZOOM_MULTIPLIER=1.2,DEFAULT_FIT_PADDING=24,KEYBOARD_PAN_STEP=32,UNMATCHED_AUTHORED_CARD_WARNING="lyra-flow-canvas-unmatched-authored-card";function toggledSelection(list,id){return list.includes(id)?list.filter(x=>x!==id):[...list,id]}function nodeTypePart(type){if(!type)return null;const normalized=type.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return normalized?`node-type-${/^\d/.test(normalized)?`type-${normalized}`:normalized}`:null}function isHtmlElement(value){if(typeof value!="object"||value===null)return!1;const element=value;return element.nodeType===1&&element.namespaceURI==="http://www.w3.org/1999/xhtml"}class LyraFlowCanvas extends LyraElement{constructor(){super(...arguments),this._nodes=Object.freeze([]),this._edges=Object.freeze([]),this._orientation="horizontal",this.nodesDraggable=!1,this.connectable=!1,this.droppable=!1,this.locked=!1,this._selectedNodeIds=Object.freeze([]),this._requestedSelectedNodeIds=Object.freeze([]),this._selectedEdgeIds=Object.freeze([]),this._requestedSelectedEdgeIds=Object.freeze([]),this.minZoom=.25,this.maxZoom=2,this.grid=8,this.layerGap=64,this.nodeGap=24,this._decorations=null,this.accessibleLabel=null,this.arrowMarkerIds={neutral:nextId("flow-canvas-arrow-neutral"),brand:nextId("flow-canvas-arrow-brand"),success:nextId("flow-canvas-arrow-success"),warning:nextId("flow-canvas-arrow-warning"),danger:nextId("flow-canvas-arrow-danger")},this.liveRegionId=nextId("flow-canvas-live"),this.announcer=new Announcer({onFlush:text=>{this.liveText=text,this.announcementSink?.announce(text)}}),this.liveText="",this.activeItemIndex=0,this.connecting=!1,this.layoutTruncated=!1,this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1,this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0,this.autoPositions=new Map,this.measuredSizes=new Map,this.observedNodeEls=new Set,this.authoredCardObserverGeneration=0,this.authoredCardSyncQueued=!1,this.authoredCardSlotLeases=new Map,this.layoutRaf=null,this.panX=0,this.panY=0,this.zoomLevel=1,this.viewportChangeRaf=null,this.hasFitOnce=!1,this.wheelMeasure=null,this.wheelMeasureRaf=null,this.nodeIncidentEdges=new Map,this.connectInvalidNodeId=null,this.companionCallbacks=new Set,this.companionRaf=null,this.onWheel=e=>{if(this.locked||!this.viewportEl)return;e.preventDefault(),this.wheelMeasure||(this.wheelMeasure={rect:this.viewportEl.getBoundingClientRect(),rtl:isRtl(this)},this.wheelMeasureRaf=this.requestOwnerAnimationFrame(()=>{this.wheelMeasure=null,this.wheelMeasureRaf=null}));const{rect,rtl}=this.wheelMeasure,localX=this.localWorldX(e.clientX,rect,rtl),localY=e.clientY-rect.top,factor=e.deltaY<0?ZOOM_MULTIPLIER:1/ZOOM_MULTIPLIER;this.zoomAtPoint(localX,localY,this.zoomLevel*factor)},this.onBackgroundPointerDown=e=>{this.locked||(this.panDrag={pointerId:e.pointerId,startClientX:e.clientX,startClientY:e.clientY,startPanX:this.panX,startPanY:this.panY,rtlFlip:this.orientation==="horizontal"&&isRtl(this)?-1:1},e.target.setPointerCapture?.(e.pointerId),this.viewportEl?.setAttribute("data-panning",""),this.connectedWindow?.addEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.addEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.addEventListener("lostpointercapture",this.onBackgroundPointerUp))},this.onBackgroundPointerMove=e=>{const drag=this.panDrag;if(!(!drag||e.pointerId!==drag.pointerId)){if(this.locked){this.endBackgroundPan(!0);return}this.panX=drag.startPanX+(e.clientX-drag.startClientX)*drag.rtlFlip,this.panY=drag.startPanY+(e.clientY-drag.startClientY),this.applyWorldTransform(),this.scheduleViewportChange()}},this.onBackgroundPointerUp=e=>{!this.panDrag||e.pointerId!==this.panDrag.pointerId||this.endBackgroundPan(this.locked||e.type!=="pointerup")},this.onViewportKeyDown=e=>{if(!(e.target!==this.viewportEl||this.locked))if(e.key==="+"||e.key==="=")e.preventDefault(),this.zoomIn();else if(e.key==="-"||e.key==="_")e.preventDefault(),this.zoomOut();else if(e.key==="0")e.preventDefault(),this.resetZoom();else if(e.key==="ArrowRight"){e.preventDefault();const rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;this.panBy(-KEYBOARD_PAN_STEP*rtlFlip,0)}else if(e.key==="ArrowLeft"){e.preventDefault();const rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;this.panBy(KEYBOARD_PAN_STEP*rtlFlip,0)}else e.key==="ArrowDown"?(e.preventDefault(),this.panBy(0,-KEYBOARD_PAN_STEP)):e.key==="ArrowUp"&&(e.preventDefault(),this.panBy(0,KEYBOARD_PAN_STEP))},this.onViewportDragOver=e=>{!this.droppable||this.locked||e.dataTransfer?.types.includes(FLOW_PALETTE_MIME_TYPE)&&(e.preventDefault(),e.dataTransfer.dropEffect="copy",this.viewportEl?.setAttribute("data-drop-active",""))},this.onViewportDragLeave=()=>{this.viewportEl?.removeAttribute("data-drop-active")},this.onViewportDrop=e=>{if(this.viewportEl?.removeAttribute("data-drop-active"),!this.droppable||this.locked)return;const raw=e.dataTransfer?.getData(FLOW_PALETTE_MIME_TYPE);if(!raw)return;e.preventDefault();const maxPayloadBytes=4096;if(raw.length>maxPayloadBytes)return;const TextEncoderCtor=this.ownerDocument.defaultView?.TextEncoder??globalThis.TextEncoder;if(TextEncoderCtor&&new TextEncoderCtor().encode(raw).byteLength>maxPayloadBytes)return;let payload;try{payload=JSON.parse(raw)}catch{return}if(typeof payload!="object"||payload===null||Array.isArray(payload)||Object.getPrototypeOf(payload)!==Object.prototype&&Object.getPrototypeOf(payload)!==null)return;const rawType=payload.type;if(typeof rawType!="string")return;const type=rawType.trim();if(!type||type.length>128)return;const contentPoint=this.toContentPoint(e.clientX,e.clientY);this.emit("lr-node-add",Object.freeze({type,position:Object.freeze({x:this.snap(contentPoint.x),y:this.snap(contentPoint.y)})}))},this.onNodePointerMove=e=>{const drag=this.nodeDrag;if(!drag||e.pointerId!==drag.pointerId)return;if(this.locked||!this.nodesDraggable){this.endNodeDrag(!1);return}const dx=(e.clientX-drag.startClientX)*drag.rtlFlip/this.zoomLevel,dy=(e.clientY-drag.startClientY)/this.zoomLevel,x=this.snap(drag.startX+dx),y=this.snap(drag.startY+dy);drag.wrapper.style.transform=`translate(${x}px, ${y}px)`,this.updateIncidentEdges(drag.nodeId,x,y),drag.currentX=x,drag.currentY=y},this.onNodePointerUp=e=>{const drag=this.nodeDrag;!drag||e.pointerId!==drag.pointerId||this.endNodeDrag(!this.locked&&e.type==="pointerup")},this.onWorldPointerDown=e=>{if(!this.connectable||this.locked||this.connectState)return;const path=e.composedPath(),handleEl=path.find(el=>isHtmlElement(el)&&el.dataset.handleKind==="output");if(!handleEl)return;const nodeId=this.nodeIdFromComposedPath(path),handleId=handleEl.dataset.handleId;!nodeId||!handleId||(e.stopPropagation(),this.startConnectGesture(nodeId,handleId,e.clientX,e.clientY))},this.onConnectPointerMove=e=>{if(!this.connectState)return;if(this.locked||!this.connectable){this.onConnectPointerCancel();return}const targetPt=this.connectContentPoint(e.clientX,e.clientY);this.connectionLineEl?.setAttribute("d",this.edgePathD(this.connectState.startPt,targetPt));const hoveredId=this.nodeIdFromComposedPath(e.composedPath()),invalid=hoveredId!=null&&this.isInvalidConnectTarget(hoveredId);this.connectInvalidNodeId&&this.connectInvalidNodeId!==(invalid?hoveredId:null)&&this.renderedNodeById(this.connectInvalidNodeId)?.removeAttribute("data-connect-invalid"),this.connectInvalidNodeId=invalid?hoveredId:null,invalid&&this.renderedNodeById(hoveredId)?.setAttribute("data-connect-invalid","")},this.onConnectPointerUp=e=>{if(!this.connectState)return;if(this.locked||!this.connectable){this.onConnectPointerCancel();return}const state2=this.connectState,path=e.composedPath(),targetNodeId=this.nodeIdFromComposedPath(path);if(this.endConnectGesture(),!targetNodeId||this.isInvalidConnectTargetFor(state2,targetNodeId)){this.announcer.announce(this.localize("flowConnectCancelled"));return}const targetHandle=path.find(el=>isHtmlElement(el)&&el.dataset.handleKind==="input")?.dataset.handleId??"in";this.emit("lr-connect",Object.freeze({source:state2.sourceId,target:targetNodeId,sourceHandle:state2.sourceHandle,targetHandle}));const sourceNode=this.nodes.find(node=>node.id===state2.sourceId),targetNode=this.nodes.find(node=>node.id===targetNodeId);this.announcer.announce(this.localize("flowConnectCommitted",void 0,{source:sourceNode?this.nodeAccessibleText(sourceNode):state2.sourceId,target:targetNode?this.nodeAccessibleText(targetNode):targetNodeId}))},this.onConnectPointerCancel=()=>{this.connectState&&(this.endConnectGesture(),this.announcer.announce(this.localize("flowConnectCancelled")))}}static{this.defaultStrings={...super.defaultStrings,flowCanvasLabel:LYRA_DEFAULT_flowCanvasLabel,flowCanvasLayoutLimit:LYRA_DEFAULT_flowCanvasLayoutLimit,flowCanvasSummary:LYRA_DEFAULT_flowCanvasSummary,flowConnectCancelled:LYRA_DEFAULT_flowConnectCancelled,flowConnectCommitted:LYRA_DEFAULT_flowConnectCommitted,flowConnectStarted:LYRA_DEFAULT_flowConnectStarted,flowConnectTarget:LYRA_DEFAULT_flowConnectTarget,flowEdge:LYRA_DEFAULT_flowEdge,flowEdgeList:LYRA_DEFAULT_flowEdgeList,flowEdgeWithLabel:LYRA_DEFAULT_flowEdgeWithLabel,flowItemAnnouncement:LYRA_DEFAULT_flowItemAnnouncement,flowNode:LYRA_DEFAULT_flowNode,flowNodeDeselected:LYRA_DEFAULT_flowNodeDeselected,flowNodeMoved:LYRA_DEFAULT_flowNodeMoved,flowNodeSelected:LYRA_DEFAULT_flowNodeSelected,flowSelectionCleared:LYRA_DEFAULT_flowSelectionCleared,noData:LYRA_DEFAULT_noData}}static{this.styles=[LyraElement.styles,styles,srOnly]}get nodes(){return this._nodes}set nodes(value){const previous=this._nodes;this._nodes=snapshotFlowNodes(value),this.requestUpdate("nodes",previous)}get edges(){return this._edges}set edges(value){const previous=this._edges;this._edges=snapshotFlowEdges(value),this.requestUpdate("edges",previous)}get orientation(){return this._orientation}set orientation(value){const previous=this._orientation,next=value==="vertical"?"vertical":"horizontal";this._orientation=next,(next!==previous||value!==next)&&this.requestUpdate("orientation",previous)}get selectedNodeIds(){return this._selectedNodeIds}set selectedNodeIds(value){const previous=this._selectedNodeIds;this._requestedSelectedNodeIds=this.sanitizeSelectionCandidates(value),this._selectedNodeIds=this.snapshotSelectedIds(this._requestedSelectedNodeIds,new Set(this.nodes.map(node=>node.id))),this.requestUpdate("selectedNodeIds",previous)}get selectedEdgeIds(){return this._selectedEdgeIds}set selectedEdgeIds(value){const previous=this._selectedEdgeIds;this._requestedSelectedEdgeIds=this.sanitizeSelectionCandidates(value),this._selectedEdgeIds=this.snapshotSelectedIds(this._requestedSelectedEdgeIds,new Set(this.edges.map(edge=>edge.id))),this.requestUpdate("selectedEdgeIds",previous)}sanitizeSelectionCandidates(value){if(!Array.isArray(value))return Object.freeze([]);const selected=[],seen=new Set;for(const candidate of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))typeof candidate!="string"||candidate.trim().length===0||seen.has(candidate)||(seen.add(candidate),selected.push(candidate));return Object.freeze(selected)}snapshotSelectedIds(value,validIds){const selected=value.filter(candidate=>validIds.has(candidate));return selected.length===value.length?value:Object.freeze(selected)}get decorations(){return this._decorations}set decorations(value){const previous=this._decorations;this._decorations=value==null?null:snapshotFlowDecorations(value),this.requestUpdate("decorations",previous)}get safeMinZoom(){return finiteRange(this.minZoom,.25,.001,1e3)}get safeMaxZoom(){return finiteRange(this.maxZoom,2,.001,1e3)}get effectiveZoomBounds(){return{min:Math.min(this.safeMinZoom,this.safeMaxZoom),max:Math.max(this.safeMinZoom,this.safeMaxZoom)}}get safeGrid(){return finiteRange(this.grid,8,0)}get safeLayerGap(){return finiteRange(this.layerGap,64,0)}get safeNodeGap(){return finiteRange(this.nodeGap,24,0)}connectedCallback(){super.connectedCallback();const ownerWindow=this.ownerDocument.defaultView;this.connectedWindow=ownerWindow??void 0,ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.syncAnnouncementSink();const ResizeObserverCtor=ownerWindow?.ResizeObserver;this.resizeObserver=ResizeObserverCtor?new ResizeObserverCtor(entries=>this.onNodesResized(entries)):void 0,this.bindAuthoredCardObserver(),this.syncAuthoredCards(),this.pushCardPropsAll(),this.hasUpdated&&(this.observeNodeWrappers(),this.nodes.length>0&&this.scheduleLayoutPass())}disconnectedCallback(){super.disconnectedCallback(),this.resetAuthoredCardObserver(),this.restoreAuthoredCardSlots(),this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1,this.announcer.cancel(),this.releaseAnnouncementSink(),this.liveText="",this.resizeObserver?.disconnect(),this.resizeObserver=void 0,this.observedNodeEls.clear(),this.layoutRaf!=null&&(this.cancelOwnerAnimationFrame(this.layoutRaf),this.layoutRaf=null),this.companionRaf!=null&&(this.cancelOwnerAnimationFrame(this.companionRaf),this.companionRaf=null),this.viewportChangeRaf!=null&&(this.cancelOwnerAnimationFrame(this.viewportChangeRaf),this.viewportChangeRaf=null),this.wheelMeasureRaf!=null&&(this.cancelOwnerAnimationFrame(this.wheelMeasureRaf),this.wheelMeasureRaf=null,this.wheelMeasure=null),this.panDrag=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onBackgroundPointerUp),this.nodeDrag=void 0,this.dragEdgeRefs=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onNodePointerUp),this.connectState=void 0,this.connecting=!1,this.connectInvalidNodeId=null,this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0,this.connectedWindow?.removeEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.removeEventListener("lostpointercapture",this.onConnectPointerCancel),this.connectedWindow=void 0}adoptedCallback(){super.adoptedCallback(),this.resetAuthoredCardObserver(),this.restoreAuthoredCardSlots(),this.hasConnectedLayoutBaseline=!1,this.layoutLimitAnnouncementPending=!1;const ownerWindow=this.ownerDocument.defaultView;ownerWindow&&this.announcer.setTimerHost(ownerWindow),this.isConnected&&(this.bindAuthoredCardObserver(),this.scheduleAuthoredCardReconciliation(),this.nodes.length>0&&this.scheduleLayoutPass())}requestOwnerAnimationFrame(callback){const owner=this.ownerDocument.defaultView;return owner?{owner,handle:owner.requestAnimationFrame(callback)}:null}cancelOwnerAnimationFrame(frame){frame.owner.cancelAnimationFrame(frame.handle)}releaseAnnouncementSink(){this.announcementSink?.release(),this.announcementSink=void 0}syncAnnouncementSink(){if(!this.isConnected){this.releaseAnnouncementSink();return}this.announcementSink?.element.ownerDocument!==this.ownerDocument&&(this.releaseAnnouncementSink(),this.announcementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}resetAuthoredCardObserver(){this.authoredCardObserverGeneration+=1,this.authoredCardObserver?.disconnect(),this.authoredCardObserver=void 0,this.authoredCardObserverDocument=void 0,this.authoredCardSyncQueued=!1}bindAuthoredCardObserver(){const ownerDocument=this.ownerDocument;if(!this.isConnected||this.authoredCardObserver&&this.authoredCardObserverDocument===ownerDocument)return;this.resetAuthoredCardObserver();const MutationObserverCtor=ownerDocument.defaultView?.MutationObserver;if(!MutationObserverCtor)return;const generation=this.authoredCardObserverGeneration,observer=new MutationObserverCtor(records=>{if(this.authoredCardObserver!==observer||this.authoredCardObserverDocument!==ownerDocument||this.authoredCardObserverGeneration!==generation||!this.isConnected||this.ownerDocument!==ownerDocument)return;records.some(record=>record.type==="childList"?record.target===this:record.type==="attributes"&&record.attributeName==="node-id"&&record.target.parentNode===this)&&this.scheduleAuthoredCardReconciliation()});observer.observe(this,{childList:!0,attributes:!0,attributeFilter:["node-id"],subtree:!0}),this.authoredCardObserver=observer,this.authoredCardObserverDocument=ownerDocument}scheduleAuthoredCardReconciliation(){const generation=this.authoredCardObserverGeneration,ownerDocument=this.authoredCardObserverDocument??this.ownerDocument;!this.isConnected||this.authoredCardSyncQueued||(this.authoredCardSyncQueued=!0,queueMicrotask(()=>{this.authoredCardObserverGeneration!==generation||!this.isConnected||this.ownerDocument!==ownerDocument||(this.authoredCardSyncQueued=!1,this.syncAuthoredCards(),this.pushCardPropsAll())}))}observeNodeWrappers(){for(const el of Array.from(this.renderRoot.querySelectorAll('[part="node"]')))this.observedNodeEls.has(el)||(this.observedNodeEls.add(el),this.resizeObserver?.observe(el))}willUpdate(changed){if(super.willUpdate(changed),changed.has("nodes")){this.cancelModelBoundGestures(),this.pruneNodeCaches(),this.syncAuthoredCards();const nodeIds=new Set(this.nodes.map(node=>node.id));this._selectedNodeIds=this.snapshotSelectedIds(this._requestedSelectedNodeIds,nodeIds)}if(changed.has("edges")){this.cancelModelBoundGestures();const edgeIds=new Set(this.edges.map(edge=>edge.id));this._selectedEdgeIds=this.snapshotSelectedIds(this._requestedSelectedEdgeIds,edgeIds)}if((changed.has("locked")&&this.locked||changed.has("orientation"))&&this.cancelActiveGestures(),changed.has("nodesDraggable")&&!this.nodesDraggable&&this.endNodeDrag(!1),changed.has("connectable")&&!this.connectable&&(this.onConnectPointerCancel(),this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0),changed.has("droppable")&&!this.droppable&&this.viewportEl?.removeAttribute("data-drop-active"),changed.has("grid")&&this.endNodeDrag(!1),changed.has("nodes")||changed.has("edges")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))for(const node of this.nodes)node.position||this.autoPositions.delete(node.id);(changed.has("nodes")||changed.has("selectedNodeIds")||changed.has("decorations")||changed.has("orientation"))&&this.pushCardPropsAll(changed)}pruneNodeCaches(){const nodeIds=new Set(this.nodes.map(node=>node.id));for(const id of this.autoPositions.keys())nodeIds.has(id)||this.autoPositions.delete(id);for(const id of this.measuredSizes.keys())nodeIds.has(id)||this.measuredSizes.delete(id);for(const element of this.observedNodeEls){const id=element.dataset.nodeId;id&&nodeIds.has(id)||(this.resizeObserver?.unobserve(element),this.observedNodeEls.delete(element))}}updated(changed){super.updated(changed),changed.has("edges")&&this.rebuildIncidentEdgesIndex(),changed.has("layoutTruncated")&&this.layoutLimitAnnouncementPending&&(this.layoutLimitAnnouncementPending=!1,this.isConnected&&this.layoutTruncated&&this.announcer.announce(this.localize("flowCanvasLayoutLimit"))),this.observeNodeWrappers(),(changed.has("nodes")||changed.has("edges")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))&&this.scheduleLayoutPass(),(changed.has("nodes")||changed.has("edges")||changed.has("decorations")||changed.has("minZoom")||changed.has("maxZoom")||changed.has("locked")||changed.has("orientation")||changed.has("layerGap")||changed.has("nodeGap"))&&this.scheduleCompanionNotify();const viewportEl=this.renderRoot.querySelector('[part="viewport"]');viewportEl&&viewportEl!==this.viewportEl&&(this.viewportEl=viewportEl,this.worldEl=this.renderRoot.querySelector(".world"),viewportEl.addEventListener("wheel",this.onWheel,{passive:!1}),viewportEl.addEventListener("keydown",this.onViewportKeyDown),viewportEl.addEventListener("dragover",this.onViewportDragOver),viewportEl.addEventListener("dragleave",this.onViewportDragLeave),viewportEl.addEventListener("drop",this.onViewportDrop),this.applyWorldTransform())}syncAuthoredCards(){const ids=new Set(this.nodes.map(node=>node.id)),adopted=new Set;for(const child of Array.from(this.children)){const nodeId=child.getAttribute("node-id");if(nodeId&&ids.has(nodeId)){this.leaseAuthoredCardSlot(child,nodeId),adopted.add(child);continue}this.releaseAuthoredCardSlot(child),nodeId&&devWarnOnce(UNMATCHED_AUTHORED_CARD_WARNING,"<lr-flow-canvas> has a direct child with a node-id that matches no node; it will not render.")}for(const child of[...this.authoredCardSlotLeases.keys()])adopted.has(child)||this.releaseAuthoredCardSlot(child)}leaseAuthoredCardSlot(child,nodeId){let lease=this.authoredCardSlotLeases.get(child);if(!lease){const slot2=child.getAttribute("slot");lease={authoredSlot:slot2,appliedSlot:slot2,authorOwnsSlot:!1},this.authoredCardSlotLeases.set(child,lease)}if(lease.authorOwnsSlot||child.getAttribute("slot")!==lease.appliedSlot){lease.authorOwnsSlot=!0;return}const slot=`node-${nodeId}`;child.getAttribute("slot")!==slot&&child.setAttribute("slot",slot),lease.appliedSlot=child.getAttribute("slot")}releaseAuthoredCardSlot(child){const lease=this.authoredCardSlotLeases.get(child);lease&&(!lease.authorOwnsSlot&&child.getAttribute("slot")===lease.appliedSlot&&(lease.authoredSlot===null?child.removeAttribute("slot"):child.setAttribute("slot",lease.authoredSlot)),this.authoredCardSlotLeases.delete(child))}restoreAuthoredCardSlots(){for(const child of[...this.authoredCardSlotLeases.keys()])this.releaseAuthoredCardSlot(child)}pushCardPropsAll(changed){const nodesChanged=changed?.has("nodes")??!0,selectionChanged=nodesChanged||changed?.has("selectedNodeIds")===!0,decorationsChanged=nodesChanged||changed?.has("decorations")===!0,orientationChanged=nodesChanged||changed?.has("orientation")===!0,cardsByNodeId=new Map;for(const child of Array.from(this.children)){const nodeId=child.getAttribute("node-id");nodeId&&this.authoredCardSlotLeases.has(child)&&cardsByNodeId.set(nodeId,child)}const selectedNodeIds=selectionChanged?new Set(this.selectedNodeIds):null;for(const node of this.nodes){const card=cardsByNodeId.get(node.id);if(card&&(nodesChanged&&(this.setCardProperty(card,"inputs",node.inputs??[{id:"in"}]),this.setCardProperty(card,"outputs",node.outputs??[{id:"out"}]),this.setCardProperty(card,"flowType",node.type??"")),orientationChanged&&this.setCardProperty(card,"orientation",this.orientation),selectedNodeIds&&this.setCardProperty(card,"selected",selectedNodeIds.has(node.id)),decorationsChanged)){const decoration=this.decorations?.[node.id];this.setCardProperty(card,"status",decoration?.status??null),this.setCardProperty(card,"progress",decoration?.progress??null),this.setCardProperty(card,"statusDetail",decoration?.detail??""),this.setCardProperty(card,"durationMs",decoration?.durationMs??null)}}}setCardProperty(card,property2,value){try{card[property2]=value}catch{}}nodePosition(node){const position=node.position??this.autoPositions.get(node.id)??{x:0,y:0};return{x:finiteNumber(position.x,0),y:finiteNumber(position.y,0)}}nodeSize(id){const measured=this.measuredSizes.get(id);if(measured)return measured;const ownerWindow=this.ownerDocument?.defaultView,host=this.renderedNodeById(id)??this,computed=ownerWindow?.getComputedStyle(host),customWidth=resolveCssLength(computed?.getPropertyValue("--lr-flow-canvas-node-fallback-inline-size").trim(),{host}),customHeight=resolveCssLength(computed?.getPropertyValue("--lr-flow-canvas-node-fallback-block-size").trim(),{host}),width=customWidth??(resolveCssLength(computed?.getPropertyValue("--lr-size-10rem").trim()||"10rem",{host})??0)+(resolveCssLength(computed?.getPropertyValue("--lr-size-1rem").trim()||"1rem",{host})??0),height=customHeight??resolveCssLength(computed?.getPropertyValue("--lr-size-4rem").trim()||"4rem",{host})??0;return{width,height}}resolvedNode(node){const pos=this.nodePosition(node),size=this.nodeSize(node.id);return{node,x:pos.x,y:pos.y,width:size.width,height:size.height}}handleOffset(count,index,span){return count<=1?span/2:span*(index+.5)/count}handlePoint(resolved,kind,handleId){const handles=kind==="input"?resolved.node.inputs??[{id:"in"}]:resolved.node.outputs??[{id:"out"}],index=handles.findIndex(h=>h.id===handleId),horizontal=this.orientation==="horizontal",edgeSpan=horizontal?resolved.height:resolved.width,offset=index>=0?this.handleOffset(handles.length,index,edgeSpan):edgeSpan/2;if(horizontal)return{x:kind==="input"?resolved.x:resolved.x+resolved.width,y:resolved.y+offset};const y=kind==="input"?resolved.y:resolved.y+resolved.height;return{x:resolved.x+offset,y}}edgePathD(sourcePt,targetPt){const dx=targetPt.x-sourcePt.x,dy=targetPt.y-sourcePt.y,distance=Math.hypot(dx,dy),offset=Math.min(CONNECT_OFFSET_MAX,Math.max(CONNECT_OFFSET_MIN,distance/2)),horizontal=this.orientation==="horizontal",c1x=sourcePt.x+(horizontal?offset:0),c1y=sourcePt.y+(horizontal?0:offset),c2x=targetPt.x-(horizontal?offset:0),c2y=targetPt.y-(horizontal?0:offset);return`M ${sourcePt.x} ${sourcePt.y} C ${c1x} ${c1y}, ${c2x} ${c2y}, ${targetPt.x} ${targetPt.y}`}nodeAccessibleText(node){if(node.accessibleLabel)return node.accessibleLabel;const label=typeof node.data?.label=="string"?node.data.label:node.id;return this.localize("flowNode",void 0,{label})}edgeAccessibleText(edge){const sourceNode=this.nodes.find(n=>n.id===edge.source),targetNode=this.nodes.find(n=>n.id===edge.target),source=sourceNode?this.nodeAccessibleText(sourceNode):edge.source,target=targetNode?this.nodeAccessibleText(targetNode):edge.target;return edge.label?this.localize("flowEdgeWithLabel",void 0,{label:edge.label,source,target}):this.localize("flowEdge",void 0,{source,target})}onNodesResized(entries){let changedAny=!1;for(const entry of entries){const id=entry.target.dataset.nodeId;if(!id)continue;const box=entry.borderBoxSize?.[0],width=box?box.inlineSize:entry.contentRect.width,height=box?box.blockSize:entry.contentRect.height,prev=this.measuredSizes.get(id);(!prev||prev.width!==width||prev.height!==height)&&(this.measuredSizes.set(id,{width,height}),changedAny=!0)}changedAny&&(this.scheduleLayoutPass(),this.scheduleCompanionNotify())}measureNodeWrappers(){for(const wrapper of Array.from(this.renderRoot.querySelectorAll('[part="node"]'))){const id=wrapper.dataset.nodeId;if(!id)continue;const rect=wrapper.getBoundingClientRect(),width=wrapper.offsetWidth||rect.width/Math.max(this.zoomLevel,Number.EPSILON),height=wrapper.offsetHeight||rect.height/Math.max(this.zoomLevel,Number.EPSILON);Number.isFinite(width)&&Number.isFinite(height)&&width>0&&height>0&&this.measuredSizes.set(id,{width,height})}}scheduleLayoutPass(){!this.isConnected||this.layoutRaf!=null||(this.layoutRaf=this.requestOwnerAnimationFrame(()=>{this.layoutRaf=null,this.isConnected&&(this.measureNodeWrappers(),this.runAutoLayoutIfNeeded(),this.requestUpdate(),!this.hasFitOnce&&this.nodes.length>0&&(this.hasFitOnce=!0,this.fit()))}))}setLayoutTruncated(truncated){const previous=this.layoutTruncated;if(this.layoutTruncated=truncated,truncated||(this.layoutLimitAnnouncementPending=!1),!(!this.isConnected||this.nodes.length===0)){if(!this.hasConnectedLayoutBaseline){this.hasConnectedLayoutBaseline=!0;return}!previous&&truncated&&(this.layoutLimitAnnouncementPending=!0)}}runAutoLayoutIfNeeded(){const unpositioned=this.nodes.filter(n=>!n.position);if(unpositioned.length===0){this.setLayoutTruncated(!1);return}const swap=this.orientation==="horizontal",graphNodes=this.nodes.map(n=>{const size=this.nodeSize(n.id);return{id:n.id,width:swap?size.height:size.width,height:swap?size.width:size.height}}),nodeIds=new Set(this.nodes.map(n=>n.id)),graphEdges=this.edges.filter(e=>nodeIds.has(e.source)&&nodeIds.has(e.target)).map(e=>({source:e.source,target:e.target})),fixedPositions=new Map;for(const n of this.nodes){if(!n.position||n.position.x<0||n.position.y<0)continue;const size=this.nodeSize(n.id),center={x:n.position.x+size.width/2,y:n.position.y+size.height/2};!Number.isSafeInteger(Math.trunc(center.x))||!Number.isSafeInteger(Math.trunc(center.y))||fixedPositions.set(n.id,swap?{x:center.y,y:center.x}:center)}const result=layeredLayout({nodes:graphNodes,edges:graphEdges,options:{gapX:this.safeNodeGap,gapY:this.safeLayerGap,fixedPositions}}),positions={};for(const n of unpositioned){const raw=result.positions.get(n.id);if(!raw)continue;const center=swap?{x:raw.y,y:raw.x}:{x:raw.x,y:raw.y},size=this.nodeSize(n.id),resolved={x:center.x-size.width/2,y:center.y-size.height/2};this.autoPositions.set(n.id,resolved),positions[n.id]=Object.freeze(resolved)}this.setLayoutTruncated(result.truncated),Object.keys(positions).length>0&&this.emit("lr-layout-change",Object.freeze({positions:Object.freeze(positions),truncated:result.truncated}))}get viewport(){return Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel})}set viewport(_value){}setViewport(next){this.locked||(this.panX=finiteNumber(next.x,this.panX),this.panY=finiteNumber(next.y,this.panY),this.zoomLevel=this.clampZoom(next.zoom),this.applyWorldTransform(),this.emit("lr-viewport-change",Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel})))}zoomIn(){this.locked||this.zoomAtCenter(this.zoomLevel*ZOOM_MULTIPLIER)}zoomOut(){this.locked||this.zoomAtCenter(this.zoomLevel/ZOOM_MULTIPLIER)}resetZoom(){this.locked||this.setViewport({x:this.panX,y:this.panY,zoom:1})}fit(options){if(this.locked||this.nodes.length===0)return;const padding=finiteRange(options?.padding??DEFAULT_FIT_PADDING,DEFAULT_FIT_PADDING,0);let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(const node of this.nodes){const resolved=this.resolvedNode(node);minX=Math.min(minX,resolved.x),minY=Math.min(minY,resolved.y),maxX=Math.max(maxX,resolved.x+resolved.width),maxY=Math.max(maxY,resolved.y+resolved.height)}const rect=this.viewportEl?.getBoundingClientRect(),viewW=rect?.width??0,viewH=rect?.height??0,contentW=Math.max(1,maxX-minX),contentH=Math.max(1,maxY-minY),fitZoom=Math.min((viewW-padding*2)/contentW,(viewH-padding*2)/contentH),zoom=this.clampZoom(Number.isFinite(fitZoom)&&fitZoom>0?fitZoom:1);this.panX=viewW/2-(minX+contentW/2)*zoom,this.panY=viewH/2-(minY+contentH/2)*zoom,this.zoomLevel=zoom,this.applyWorldTransform(),this.scheduleViewportChange()}focusNode(id,options){if(this.locked)return;const node=this.nodes.find(n=>n.id===id);if(!node)return;const resolved=this.resolvedNode(node),rect=this.viewportEl?.getBoundingClientRect(),viewW=rect?.width??0,viewH=rect?.height??0,zoom=options?.zoom!=null?this.clampZoom(options.zoom):this.zoomLevel;this.panX=viewW/2-(resolved.x+resolved.width/2)*zoom,this.panY=viewH/2-(resolved.y+resolved.height/2)*zoom,this.zoomLevel=zoom,this.applyWorldTransform(),this.scheduleViewportChange(),this.focusActiveItem(this.spatialItemIndex("node",id))}toContentPoint(clientX,clientY){const rect=this.viewportEl?.getBoundingClientRect();if(!rect)return{x:0,y:0};const localX=this.localWorldX(clientX,rect),localY=clientY-rect.top;return{x:(localX-this.panX)/this.zoomLevel,y:(localY-this.panY)/this.zoomLevel}}registerCompanion(cb){return this.companionCallbacks.add(cb),this.scheduleCompanionNotify(),()=>{this.companionCallbacks.delete(cb)}}scheduleCompanionNotify(){this.companionRaf!=null||this.companionCallbacks.size===0||(this.companionRaf=this.requestOwnerAnimationFrame(()=>{this.companionRaf=null;for(const cb of this.companionCallbacks)cb(this.buildSnapshot())}))}buildSnapshot(){const rect=this.viewportEl?.getBoundingClientRect(),bounds=this.effectiveZoomBounds;return Object.freeze({nodes:Object.freeze(this.nodes.map(n=>{const resolved=this.resolvedNode(n);return Object.freeze({id:n.id,x:resolved.x,y:resolved.y,width:resolved.width,height:resolved.height,status:this.decorations?.[n.id]?.status})})),edges:Object.freeze(this.edges.map(e=>Object.freeze({id:e.id,source:e.source,target:e.target,status:this.decorations?.[e.id]?.status}))),viewport:Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel,width:rect?.width??0,height:rect?.height??0,minZoom:bounds.min,maxZoom:bounds.max}),locked:this.locked,orientation:this.orientation,layerGap:this.safeLayerGap,nodeGap:this.safeNodeGap})}clampZoom(z){const{min,max}=this.effectiveZoomBounds;return finiteRange(z,1,min,max)}applyWorldTransform(){this.worldEl&&(this.worldEl.style.transform=`translate(${this.panX}px, ${this.panY}px) scale(${this.zoomLevel})`),this.scheduleCompanionNotify()}scheduleViewportChange(){this.viewportChangeRaf==null&&(this.viewportChangeRaf=this.requestOwnerAnimationFrame(()=>{this.viewportChangeRaf=null,this.emit("lr-viewport-change",Object.freeze({x:this.panX,y:this.panY,zoom:this.zoomLevel}))}))}zoomAtCenter(nextZoom){const rect=this.viewportEl?.getBoundingClientRect();this.zoomAtPoint(rect?rect.width/2:0,rect?rect.height/2:0,nextZoom)}zoomAtPoint(localX,localY,nextZoom){const clamped=this.clampZoom(nextZoom);if(clamped===this.zoomLevel)return;const contentX=(localX-this.panX)/this.zoomLevel,contentY=(localY-this.panY)/this.zoomLevel;this.panX=localX-contentX*clamped,this.panY=localY-contentY*clamped,this.zoomLevel=clamped,this.applyWorldTransform(),this.scheduleViewportChange()}localWorldX(clientX,rect,rtl=isRtl(this)){const local=clientX-rect.left;return this.orientation==="horizontal"&&rtl?rect.width-local:local}endBackgroundPan(rollback){const drag=this.panDrag;drag&&(this.panDrag=void 0,this.viewportEl?.removeAttribute("data-panning"),this.connectedWindow?.removeEventListener("pointermove",this.onBackgroundPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onBackgroundPointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onBackgroundPointerUp),rollback&&(this.panX!==drag.startPanX||this.panY!==drag.startPanY)&&(this.panX=drag.startPanX,this.panY=drag.startPanY,this.applyWorldTransform(),this.scheduleViewportChange()))}panBy(dx,dy){this.panX+=dx,this.panY+=dy,this.applyWorldTransform(),this.scheduleViewportChange()}spatialNodeOrder(){const horizontal=this.orientation==="horizontal";return[...this.nodes].sort((a,b)=>{const pa=this.resolvedNode(a),pb=this.resolvedNode(b),mainA=horizontal?pa.x:pa.y,mainB=horizontal?pb.x:pb.y;if(mainA!==mainB)return mainA-mainB;const crossA=horizontal?pa.y:pa.x,crossB=horizontal?pb.y:pb.x;return crossA-crossB})}focusableEdges(){const nodeIds=new Set(this.nodes.map(n=>n.id));return this.edges.filter(e=>nodeIds.has(e.source)&&nodeIds.has(e.target))}rovingItems(){return[...this.spatialNodeOrder().map(n=>({kind:"node",id:n.id})),...this.focusableEdges().map(e=>({kind:"edge",id:e.id}))]}itemCount(){return this.nodes.length+this.focusableEdges().length}isRovingItemDisabled(item){return item.kind==="node"&&this.nodes.find(n=>n.id===item.id)?.disabled===!0}normalizedItemIndex(index=this.activeItemIndex){const items=this.rovingItems(),count=items.length;if(!count)return-1;const clamped=Math.min(Math.max(index,0),count-1);if(!this.isRovingItemDisabled(items[clamped]))return clamped;for(let forward=clamped+1;forward<count;forward+=1)if(!this.isRovingItemDisabled(items[forward]))return forward;for(let backward=clamped-1;backward>=0;backward-=1)if(!this.isRovingItemDisabled(items[backward]))return backward;return-1}nextEnabledItemIndex(from,direction){const items=this.rovingItems(),count=items.length;if(!count)return-1;let index=Math.min(Math.max(from+direction,0),count-1);for(let steps=0;steps<count;steps+=1){if(!this.isRovingItemDisabled(items[index]))return index;if(index+=direction,index<0||index>=count)break}return from>=0&&from<count&&!this.isRovingItemDisabled(items[from])?from:-1}firstEnabledItemIndex(){return this.rovingItems().findIndex(item=>!this.isRovingItemDisabled(item))}lastEnabledItemIndex(){const items=this.rovingItems();for(let index=items.length-1;index>=0;index-=1)if(!this.isRovingItemDisabled(items[index]))return index;return-1}itemAccessibleText(item){if(item.kind==="node"){const node=this.nodes.find(n=>n.id===item.id);return node?this.nodeAccessibleText(node):""}const edge=this.edges.find(e=>e.id===item.id);return edge?this.edgeAccessibleText(edge):""}spatialItemIndex(kind,id){return this.rovingItems().findIndex(it=>it.kind===kind&&it.id===id)}announceItem(index){const item=this.rovingItems()[index];item&&this.announcer.announce(this.localize("flowItemAnnouncement",void 0,{item:this.itemAccessibleText(item),index:this.formatNumber(index+1),total:this.formatNumber(this.itemCount())}))}formatNumber(value){return getNumberFormat(this.effectiveLocale).format(value)}onItemFocus(index){this.normalizedItemIndex(index)<0||(this.activeItemIndex=index,this.announceItem(index))}renderedElementByDataId(attribute,id){const renderRoot=this.renderRoot;if(!renderRoot)return null;const ownerCss=this.ownerDocument?.defaultView?.CSS,escape=ownerCss?.escape;if(typeof escape=="function")try{const match=renderRoot.querySelector(`[${attribute}="${escape.call(ownerCss,id)}"]`);if(match)return match}catch{}return[...renderRoot.querySelectorAll(`[${attribute}]`)].find(candidate=>candidate.getAttribute(attribute)===id)??null}renderedNodeById(id){return this.renderedElementByDataId("data-node-id",id)}renderedEdgeById(id){return this.renderedElementByDataId("data-edge-id",id)}focusActiveItem(index=this.activeItemIndex){const normalized=this.normalizedItemIndex(index);if(normalized<0)return;this.activeItemIndex=normalized,this.announceItem(normalized);const item=this.rovingItems()[normalized];item&&this.updateComplete.then(()=>{(item.kind==="node"?this.renderedNodeById(item.id)?.querySelector('[part="node-control"]'):this.renderedEdgeById(item.id)?.querySelector('[part="edge"]'))?.focus()})}applySelection(kind,id,additive){kind==="node"?(this.selectedNodeIds=additive?toggledSelection(this.selectedNodeIds,id):[id],additive||(this.selectedEdgeIds=[])):(this.selectedEdgeIds=additive?toggledSelection(this.selectedEdgeIds,id):[id],additive||(this.selectedNodeIds=[])),this.emit("lr-selection-change",Object.freeze({nodeIds:Object.freeze([...this.selectedNodeIds]),edgeIds:Object.freeze([...this.selectedEdgeIds])}));const selected=kind==="node"?this.selectedNodeIds.includes(id):this.selectedEdgeIds.includes(id),label=this.itemAccessibleText({kind,id});this.announcer.announce(this.localize(selected?"flowNodeSelected":"flowNodeDeselected",void 0,{label}))}clearSelection(){this.selectedNodeIds.length===0&&this.selectedEdgeIds.length===0||(this.selectedNodeIds=[],this.selectedEdgeIds=[],this.emit("lr-selection-change",Object.freeze({nodeIds:Object.freeze([]),edgeIds:Object.freeze([])})),this.announcer.announce(this.localize("flowSelectionCleared")))}deleteSelection(){!this.nodesDraggable&&!this.connectable&&!this.droppable||this.selectedNodeIds.length===0&&this.selectedEdgeIds.length===0||this.emit("lr-selection-delete",Object.freeze({nodeIds:Object.freeze([...this.selectedNodeIds]),edgeIds:Object.freeze([...this.selectedEdgeIds])}))}onNodeActivate(node,additive){node.disabled||(this.emit("lr-node-activate",Object.freeze({nodeId:node.id})),this.applySelection("node",node.id,additive))}onNodeClick(event,node){const currentTarget=event.currentTarget;for(const entry of event.composedPath()){if(entry===currentTarget)break;if(entry&&typeof entry=="object"&&entry.nodeType===1&&isActionableElement(entry)){event.stopPropagation();return}}this.onNodeActivate(node,event.ctrlKey||event.metaKey)}onEdgeActivate(edge,additive){this.emit("lr-edge-activate",Object.freeze({edgeId:edge.id,source:edge.source,target:edge.target})),this.applySelection("edge",edge.id,additive)}onItemKeyDown(e,index,activate){const arrowKeys=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];if(this.nodesDraggable&&!this.locked&&(e.ctrlKey||e.metaKey)&&arrowKeys.includes(e.key)){const item=this.rovingItems()[index];if(item?.kind==="node"){e.preventDefault(),this.nudgeNode(item.id,e.key);return}}if(this.keyboardConnectSourceId){if(e.key==="Escape"){e.preventDefault(),this.cancelKeyboardConnect();return}if(e.key==="Enter"){e.preventDefault(),this.commitKeyboardConnect();return}const rtlForConnect=isRtl(this),forwardConnectKey=rtlForConnect?"ArrowLeft":"ArrowRight",backwardConnectKey=rtlForConnect?"ArrowRight":"ArrowLeft";if(e.key===forwardConnectKey||e.key==="ArrowDown"){e.preventDefault(),this.cycleKeyboardConnectTarget(1);return}if(e.key===backwardConnectKey||e.key==="ArrowUp"){e.preventDefault(),this.cycleKeyboardConnectTarget(-1);return}return}if(this.connectable&&!this.locked&&e.key==="c"&&e.target===e.currentTarget){const item=this.rovingItems()[index];if(item?.kind==="node"){e.preventDefault(),this.startKeyboardConnect(item.id);return}}if(e.key==="Enter"||e.key===" "){e.preventDefault(),this.setActiveItemQuiet(index),activate(e.ctrlKey||e.metaKey);return}if(e.key==="Escape"){e.preventDefault(),e.target!==e.currentTarget?e.currentTarget.focus():this.clearSelection();return}if((e.key==="Delete"||e.key==="Backspace")&&e.target===e.currentTarget){e.preventDefault(),this.deleteSelection();return}if(!this.itemCount())return;const rtl=isRtl(this),forwardKey=rtl?"ArrowLeft":"ArrowRight",backwardKey=rtl?"ArrowRight":"ArrowLeft";let next;if(e.key===forwardKey||e.key==="ArrowDown")next=this.nextEnabledItemIndex(index,1);else if(e.key===backwardKey||e.key==="ArrowUp")next=this.nextEnabledItemIndex(index,-1);else if(e.key==="Home")next=this.firstEnabledItemIndex();else if(e.key==="End")next=this.lastEnabledItemIndex();else return;e.preventDefault(),next>=0&&this.focusActiveItem(next)}setActiveItemQuiet(index){const normalized=this.normalizedItemIndex(index);normalized>=0&&(this.activeItemIndex=normalized)}itemIndexMaps(){const items=this.rovingItems(),nodeIndex=new Map,edgeIndex=new Map;return items.forEach((item,i)=>{item.kind==="node"?nodeIndex.set(item.id,i):edgeIndex.set(item.id,i-nodeIndex.size)}),{nodeIndex,edgeIndex}}snap(value){const grid=this.safeGrid;return grid>0?Math.round(value/grid)*grid:value}rebuildIncidentEdgesIndex(){const map=new Map;for(const edge of this.edges)(map.get(edge.source)??map.set(edge.source,[]).get(edge.source)).push(edge.id),edge.target!==edge.source&&(map.get(edge.target)??map.set(edge.target,[]).get(edge.target)).push(edge.id);this.nodeIncidentEdges=map}buildDragEdgeRefs(nodeId){const refs=[];for(const edgeId of this.nodeIncidentEdges.get(nodeId)??[]){const edge=this.edges.find(e=>e.id===edgeId),sourceNode=edge&&this.nodes.find(n=>n.id===edge.source),targetNode=edge&&this.nodes.find(n=>n.id===edge.target);if(!edge||!sourceNode||!targetNode)continue;const group=this.renderedEdgeById(edgeId);refs.push({edge,sourceNode,targetNode,pathEl:group?.querySelector('[part="edge"]')??null,labelEl:group?.querySelector('[part="edge-label"]')??null})}return refs}updateIncidentEdges(nodeId,x,y){for(const{edge,sourceNode,targetNode,pathEl,labelEl}of this.dragEdgeRefs??[]){const sourceResolved=edge.source===nodeId?{...this.resolvedNode(sourceNode),x,y}:this.resolvedNode(sourceNode),targetResolved=edge.target===nodeId?{...this.resolvedNode(targetNode),x,y}:this.resolvedNode(targetNode),sourcePt=this.handlePoint(sourceResolved,"output",edge.sourceHandle??"out"),targetPt=this.handlePoint(targetResolved,"input",edge.targetHandle??"in");if(pathEl?.setAttribute("d",this.edgePathD(sourcePt,targetPt)),labelEl){const midX=(sourcePt.x+targetPt.x)/2;labelEl.setAttribute("x",String(midX)),labelEl.setAttribute("y",String((sourcePt.y+targetPt.y)/2)),this.orientation==="horizontal"&&isRtl(this)?labelEl.setAttribute("transform",`translate(${2*midX} 0) scale(-1 1)`):labelEl.removeAttribute("transform")}}}onNodePointerDown(e,node){if(!this.nodesDraggable||this.locked||node.disabled)return;const wrapper=e.currentTarget,interactive=e.target.closest('button, a[href], input, select, textarea, [role="button"], [tabindex]:not([part="node"])');if(interactive&&interactive!==wrapper&&wrapper.contains(interactive))return;e.stopPropagation();const start=this.nodePosition(node);this.nodeDrag={pointerId:e.pointerId,nodeId:node.id,startClientX:e.clientX,startClientY:e.clientY,startX:start.x,startY:start.y,wrapper,rtlFlip:this.orientation==="horizontal"&&isRtl(this)?-1:1},this.dragEdgeRefs=this.buildDragEdgeRefs(node.id),wrapper.setPointerCapture?.(e.pointerId),this.connectedWindow?.addEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.addEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.addEventListener("lostpointercapture",this.onNodePointerUp)}endNodeDrag(commit){const drag=this.nodeDrag;if(!drag)return;this.nodeDrag=void 0,this.connectedWindow?.removeEventListener("pointermove",this.onNodePointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onNodePointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onNodePointerUp),this.connectedWindow?.removeEventListener("lostpointercapture",this.onNodePointerUp);const previous={x:drag.startX,y:drag.startY},position={x:drag.currentX??drag.startX,y:drag.currentY??drag.startY};commit&&this.nodesDraggable&&this.nodes.some(node=>node.id===drag.nodeId)&&(position.x!==previous.x||position.y!==previous.y)&&this.emit("lr-node-move",Object.freeze({nodeId:drag.nodeId,position:Object.freeze(position),previous:Object.freeze(previous)}));const resetNode=this.nodes.find(n=>n.id===drag.nodeId),resetPos=resetNode?this.nodePosition(resetNode):previous;drag.wrapper.style.transform=`translate(${resetPos.x}px, ${resetPos.y}px)`,this.updateIncidentEdges(drag.nodeId,resetPos.x,resetPos.y),this.dragEdgeRefs=void 0,this.requestUpdate()}nudgeNode(nodeId,key){const node=this.nodes.find(n=>n.id===nodeId);if(!node)return;const current=this.nodePosition(node),step=this.safeGrid>0?this.safeGrid:1,rtlFlip=this.orientation==="horizontal"&&isRtl(this)?-1:1;let dx=0,dy=0;key==="ArrowRight"?dx=step*rtlFlip:key==="ArrowLeft"?dx=-step*rtlFlip:key==="ArrowDown"?dy=step:key==="ArrowUp"&&(dy=-step);const position={x:current.x+dx,y:current.y+dy};this.emit("lr-node-move",Object.freeze({nodeId,position:Object.freeze(position),previous:Object.freeze(current)})),this.announcer.announce(this.localize("flowNodeMoved",void 0,{label:this.nodeAccessibleText(node),x:this.formatNumber(position.x),y:this.formatNumber(position.y)})),this.requestUpdate()}nodeIdFromComposedPath(path){for(const el of path)if(isHtmlElement(el)&&el.getAttribute("part")==="node"&&el.dataset.nodeId)return el.dataset.nodeId;return null}isInvalidConnectTarget(hoveredId){return this.connectState?hoveredId===this.connectState.sourceId||this.nodes.find(n=>n.id===hoveredId)?.disabled?!0:this.edges.some(e=>e.source===this.connectState.sourceId&&e.target===hoveredId):!1}startConnectGesture(nodeId,handleId,clientX,clientY){const sourceNode=this.nodes.find(n=>n.id===nodeId);if(!sourceNode||sourceNode.disabled)return;const startPt=this.handlePoint(this.resolvedNode(sourceNode),"output",handleId);this.connectState={sourceId:nodeId,sourceHandle:handleId,startPt,rect:this.viewportEl?.getBoundingClientRect()??null,rtl:isRtl(this)},this.connecting=!0,this.announcer.announce(this.localize("flowConnectStarted",void 0,{label:this.nodeAccessibleText(sourceNode)})),this.updateComplete.then(()=>{this.connectionLineEl=this.renderRoot.querySelector('[part="connection-line"]')??void 0,this.connectionLineEl?.setAttribute("d",this.edgePathD(startPt,this.connectContentPoint(clientX,clientY)))}),this.connectedWindow?.addEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.addEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.addEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.addEventListener("lostpointercapture",this.onConnectPointerCancel)}connectContentPoint(clientX,clientY){const state2=this.connectState;if(!state2?.rect)return{x:0,y:0};const localX=this.localWorldX(clientX,state2.rect,state2.rtl),localY=clientY-state2.rect.top;return{x:(localX-this.panX)/this.zoomLevel,y:(localY-this.panY)/this.zoomLevel}}isInvalidConnectTargetFor(state2,hoveredId){return hoveredId===state2.sourceId||this.nodes.find(n=>n.id===hoveredId)?.disabled?!0:this.edges.some(e=>e.source===state2.sourceId&&e.target===hoveredId)}endConnectGesture(){this.connectInvalidNodeId&&(this.renderedNodeById(this.connectInvalidNodeId)?.removeAttribute("data-connect-invalid"),this.connectInvalidNodeId=null),this.connectState=void 0,this.connecting=!1,this.connectedWindow?.removeEventListener("pointermove",this.onConnectPointerMove),this.connectedWindow?.removeEventListener("pointerup",this.onConnectPointerUp),this.connectedWindow?.removeEventListener("pointercancel",this.onConnectPointerCancel),this.connectedWindow?.removeEventListener("lostpointercapture",this.onConnectPointerCancel)}cancelActiveGestures(){this.endBackgroundPan(!0),this.cancelModelBoundGestures(),this.viewportEl?.removeAttribute("data-drop-active")}cancelModelBoundGestures(){this.endNodeDrag(!1),this.onConnectPointerCancel(),this.keyboardConnectSourceId=null,this.keyboardConnectTargetIndex=0}eligibleConnectTargets(sourceId){return this.nodes.filter(n=>n.id!==sourceId&&!n.disabled&&!this.edges.some(e=>e.source===sourceId&&e.target===n.id))}startKeyboardConnect(sourceId){const sourceNode=this.nodes.find(n=>n.id===sourceId);!sourceNode||sourceNode.disabled||this.eligibleConnectTargets(sourceId).length===0||(this.keyboardConnectSourceId=sourceId,this.keyboardConnectTargetIndex=0,sourceNode&&this.announceKeyboardConnectTarget())}cycleKeyboardConnectTarget(direction){if(!this.keyboardConnectSourceId)return;const targets=this.eligibleConnectTargets(this.keyboardConnectSourceId);targets.length!==0&&(this.keyboardConnectTargetIndex=(this.keyboardConnectTargetIndex+direction+targets.length)%targets.length,this.announceKeyboardConnectTarget())}announceKeyboardConnectTarget(){const sourceId=this.keyboardConnectSourceId;if(!sourceId)return;const source=this.nodes.find(node=>node.id===sourceId),targets=this.eligibleConnectTargets(sourceId),target=targets[this.keyboardConnectTargetIndex];!source||!target||this.announcer.announce(this.localize("flowConnectTarget",void 0,{source:this.nodeAccessibleText(source),target:this.nodeAccessibleText(target),index:this.formatNumber(this.keyboardConnectTargetIndex+1),total:this.formatNumber(targets.length)}))}isKeyboardConnectTarget(nodeId){return this.keyboardConnectSourceId?this.eligibleConnectTargets(this.keyboardConnectSourceId)[this.keyboardConnectTargetIndex]?.id===nodeId:!1}commitKeyboardConnect(){const sourceId=this.keyboardConnectSourceId;if(!sourceId)return;const target=this.eligibleConnectTargets(sourceId)[this.keyboardConnectTargetIndex];if(this.keyboardConnectSourceId=null,!target)return;const sourceOutputs=this.nodes.find(n=>n.id===sourceId)?.outputs??[{id:"out"}],targetInputs=target.inputs??[{id:"in"}];if(!this.connectable||this.locked)return;this.emit("lr-connect",Object.freeze({source:sourceId,target:target.id,sourceHandle:sourceOutputs[0]?.id??"out",targetHandle:targetInputs[0]?.id??"in"}));const source=this.nodes.find(node=>node.id===sourceId);this.announcer.announce(this.localize("flowConnectCommitted",void 0,{source:source?this.nodeAccessibleText(source):sourceId,target:this.nodeAccessibleText(target)}))}cancelKeyboardConnect(){this.keyboardConnectSourceId&&(this.keyboardConnectSourceId=null,this.announcer.announce(this.localize("flowConnectCancelled")))}statusTone(status){return status==="running"?"brand":status==="success"?"success":status==="error"?"danger":status==="denied"?"warning":"neutral"}edgeTone(edge){const decoration=this.decorations?.[edge.id];return decoration?this.statusTone(decoration.status):edge.tone??"neutral"}edgeIsRunning(edge){return this.decorations?.[edge.id]?.status==="running"}renderEdges(nodeIndex,edgeIndex){const resolvedById=new Map(this.nodes.map(n=>[n.id,this.resolvedNode(n)])),items=[],ownerWindow=this.ownerDocument?.defaultView,reducedMotion=!ownerWindow||prefersReducedMotion(ownerWindow),counterMirrorLabels=this.orientation==="horizontal"&&!!this.ownerDocument?.defaultView&&isRtl(this);for(const edge of this.edges){const sourceResolved=resolvedById.get(edge.source);if(!sourceResolved)continue;const targetResolved=resolvedById.get(edge.target),sourcePt=this.handlePoint(sourceResolved,"output",edge.sourceHandle??"out");if(!targetResolved){const stubPt={x:sourcePt.x+14,y:sourcePt.y+14};items.push(svg`<line
|
|
2
2
|
part="stub"
|
|
3
3
|
aria-hidden="true"
|
|
4
4
|
x1=${sourcePt.x} y1=${sourcePt.y}
|
|
@@ -41,6 +41,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
|
|
|
41
41
|
data-selected=${selected?"":nothing}
|
|
42
42
|
role="group"
|
|
43
43
|
aria-label=${this.nodeAccessibleText(node)}
|
|
44
|
+
aria-disabled=${node.disabled?"true":nothing}
|
|
44
45
|
style="transform:translate(${resolved.x}px,${resolved.y}px)"
|
|
45
46
|
@click=${e=>this.onNodeClick(e,node)}
|
|
46
47
|
@pointerdown=${e=>this.onNodePointerDown(e,node)}
|
|
@@ -49,6 +50,7 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
|
|
|
49
50
|
part="node-control"
|
|
50
51
|
class="sr-only"
|
|
51
52
|
type="button"
|
|
53
|
+
?disabled=${node.disabled===!0}
|
|
52
54
|
tabindex=${active?"0":"-1"}
|
|
53
55
|
aria-label=${this.nodeAccessibleText(node)}
|
|
54
56
|
aria-pressed=${selected?"true":"false"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{css}from"lit";const styles=css`:host{inline-size:100%;block-size:var(--lr-canvas-reserved-height,var(--lr-size-24rem));min-block-size:0;min-inline-size:0;display:block;position:relative;overflow:hidden}[part=base]{block-size:100%;inline-size:100%;position:relative}[part=viewport]{touch-action:none;cursor:grab;outline:none;block-size:100%;inline-size:100%;position:relative;overflow:hidden}[part=viewport]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(-1 * var(--lr-focus-ring-width))}[part=background],[part=edges]{position:absolute;inset:0}[part=edges]{pointer-events:none;block-size:100%;inline-size:100%;overflow:visible}[part=empty]{pointer-events:none;block-size:100%;inline-size:100%}[part=overlay-rail]{inset-inline:var(--lr-space-s);z-index:var(--lr-layer-content);align-items:flex-end;gap:var(--lr-space-s);pointer-events:none;flex-wrap:wrap;display:flex;position:absolute}[part=overlay-rail][data-edge=top]{inset-block-start:var(--lr-space-s)}[part=overlay-rail][data-edge=bottom]{inset-block-end:var(--lr-space-s)}.overlay-group{gap:var(--lr-space-s);pointer-events:auto;flex-wrap:wrap;max-inline-size:100%;display:flex}.overlay-group[data-align=end]{margin-inline-start:auto}[part=node]{will-change:transform;min-inline-size:var(--lr-size-1-5rem);min-block-size:var(--lr-size-1-5rem);position:absolute;inset-block-start:0;inset-inline-start:0}[part=node-control]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size)}.portable-node-card{align-items:stretch;gap:var(--lr-space-xs);min-inline-size:calc(var(--lr-size-10rem) + var(--lr-size-1rem));padding:var(--lr-space-s);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);box-shadow:var(--lr-shadow-s);display:flex}.portable-node-content{overflow-wrap:anywhere;flex-direction:column;flex:auto;min-inline-size:0;display:flex}.portable-handles{flex-direction:column;justify-content:space-around;display:flex}.portable-handles>span{inline-size:var(--lr-size-0-5rem);block-size:var(--lr-size-0-5rem);border-radius:var(--lr-radius-pill);background:var(--lr-color-border-strong)}[part=node]:focus-within{z-index:var(--lr-layer-content)}[part=edge]{fill:none;stroke:var(--lr-flow-canvas-edge-neutral-color,var(--lr-color-border));stroke-width:1.5px;pointer-events:stroke;cursor:pointer}[part=edge-hit-area]{fill:none;stroke:#0000;stroke-width:var(--lr-icon-button-size);pointer-events:stroke;cursor:pointer}[part=edge][data-tone=brand]{stroke:var(--lr-flow-canvas-edge-brand-color,var(--lr-color-brand))}[part=edge][data-tone=success]{stroke:var(--lr-flow-canvas-edge-success-color,var(--lr-color-success))}[part=edge][data-tone=warning]{stroke:var(--lr-flow-canvas-edge-warning-color,var(--lr-color-warning))}[part=edge][data-tone=danger]{stroke:var(--lr-flow-canvas-edge-danger-color,var(--lr-color-danger))}[part=arrowhead]{fill:var(--lr-flow-canvas-edge-neutral-color,var(--lr-color-border))}[part=arrowhead][data-tone=brand]{fill:var(--lr-flow-canvas-edge-brand-color,var(--lr-color-brand))}[part=arrowhead][data-tone=success]{fill:var(--lr-flow-canvas-edge-success-color,var(--lr-color-success))}[part=arrowhead][data-tone=warning]{fill:var(--lr-flow-canvas-edge-warning-color,var(--lr-color-warning))}[part=arrowhead][data-tone=danger]{fill:var(--lr-flow-canvas-edge-danger-color,var(--lr-color-danger))}[part=stub]{stroke:var(--lr-color-border);stroke-width:1.5px;stroke-dasharray:3 3;opacity:.6}[part=edge-label]{fill:var(--lr-color-text);font:var(--lr-font-size-xs) / 1 var(--lr-font);text-anchor:middle;stroke:var(--lr-color-surface);stroke-width:var(--lr-size-3px)}[part=layout-limit]{inset-inline:var(--lr-space-s);z-index:var(--lr-layer-content);max-inline-size:calc(100% - 2 * var(--lr-space-s));padding:var(--lr-space-2xs) var(--lr-space-s);border:var(--lr-border-width-thin) solid var(--lr-color-warning);border-radius:var(--lr-radius);background:var(--lr-color-surface);color:var(--lr-color-text);font-size:var(--lr-font-size-xs);overflow-wrap:anywhere;position:absolute;inset-block-end:var(--lr-space-s)}.world{transform-origin:0 0;will-change:transform;block-size:100%;inline-size:100%;position:absolute;inset-block-start:0;inset-inline-start:0}[part=background]{background-image:radial-gradient(circle, var(--lr-color-border) var(--lr-size-1px), transparent var(--lr-size-1px));background-size:var(--lr-flow-canvas-grid-size,var(--_lr-flow-canvas-grid-size,var(--lr-size-0-5rem))) var(--lr-flow-canvas-grid-size,var(--_lr-flow-canvas-grid-size,var(--lr-size-0-5rem)));cursor:grab;block-size:500%;inline-size:500%;position:absolute;inset-block-start:-200%;inset-inline-start:-200%}[part=viewport][data-panning] [part=background]{cursor:grabbing}[part=viewport][data-empty] .world{pointer-events:none}:host([locked]) [part=background]{cursor:default}:host([orientation=horizontal]:dir(rtl)) [part=viewport],:host([orientation=horizontal]:dir(rtl)) [part=node] ::slotted(*),:host([orientation=horizontal]:dir(rtl)) [part=node] [data-flow-canvas-default-card]{transform:scaleX(-1)}[part=node][data-selected]{outline:var(--lr-size-2px) solid var(--lr-flow-canvas-node-selected-outline-color,var(--lr-color-brand));outline-offset:var(--lr-size-2px);border-radius:var(--lr-radius)}[part=node]:hover{outline:var(--lr-size-1px) solid var(--lr-flow-canvas-node-hover-outline-color,var(--lr-color-border-strong));outline-offset:var(--lr-size-2px)}[part=node]:active{outline:var(--lr-size-2px) solid var(--lr-flow-canvas-node-hover-outline-color,var(--lr-color-border-strong));outline-offset:var(--lr-size-2px)}[part=edge][aria-pressed=true],[part=edge]:hover,[part=edge-hit-area]:hover+[part=edge]{stroke-width:2.5px}[part=edge]:active,[part=edge-hit-area]:active+[part=edge]{stroke-width:3.5px}[part=node]:has([part=node-control]:focus-visible),[part=edge]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=connection-line]{fill:none;stroke:var(--lr-flow-canvas-connection-line-color,var(--lr-color-brand));stroke-width:1.5px;stroke-dasharray:4 4;pointer-events:none}[part=node][data-connect-invalid]{outline:var(--lr-size-2px) solid var(--lr-flow-canvas-node-connect-invalid-outline-color,var(--lr-color-danger));outline-offset:var(--lr-size-2px)}[part=node][data-connect-target]{outline:var(--lr-size-2px) dashed var(--lr-flow-canvas-node-connect-target-outline-color,var(--lr-color-brand));outline-offset:var(--lr-size-2px)}[part=viewport][data-drop-active]{outline:var(--lr-size-2px) dashed var(--lr-flow-canvas-drop-active-outline-color,var(--lr-color-brand));outline-offset:calc(-1 * var(--lr-size-2px))}[part=viewport][data-drop-active]:focus-visible{box-shadow:inset 0 0 0 var(--lr-focus-ring-width) var(--lr-focus-ring-color)}[part=edge][data-running]{stroke-dasharray:6 4;animation:lr-flow-canvas-march var(--lr-flow-canvas-march-duration,var(--lr-duration-ambient)) linear infinite}[part=edge][data-running-static]{stroke-dasharray:6 4}@media (prefers-reduced-motion:reduce){[part=edge][data-running]{animation:none}}@keyframes lr-flow-canvas-march{to{stroke-dashoffset:-20px}}`;export{styles};
|
|
1
|
+
import{css}from"lit";const styles=css`:host{inline-size:100%;block-size:var(--lr-canvas-reserved-height,var(--lr-size-24rem));min-block-size:0;min-inline-size:0;display:block;position:relative;overflow:hidden}[part=base]{block-size:100%;inline-size:100%;position:relative}[part=viewport]{touch-action:none;cursor:grab;outline:none;block-size:100%;inline-size:100%;position:relative;overflow:hidden}[part=viewport]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:calc(-1 * var(--lr-focus-ring-width))}[part=background],[part=edges]{position:absolute;inset:0}[part=edges]{pointer-events:none;block-size:100%;inline-size:100%;overflow:visible}[part=empty]{pointer-events:none;block-size:100%;inline-size:100%}[part=overlay-rail]{inset-inline:var(--lr-space-s);z-index:var(--lr-layer-content);align-items:flex-end;gap:var(--lr-space-s);pointer-events:none;flex-wrap:wrap;display:flex;position:absolute}[part=overlay-rail][data-edge=top]{inset-block-start:var(--lr-space-s)}[part=overlay-rail][data-edge=bottom]{inset-block-end:var(--lr-space-s)}.overlay-group{gap:var(--lr-space-s);pointer-events:auto;flex-wrap:wrap;max-inline-size:100%;display:flex}.overlay-group[data-align=end]{margin-inline-start:auto}[part=node]{will-change:transform;min-inline-size:var(--lr-size-1-5rem);min-block-size:var(--lr-size-1-5rem);position:absolute;inset-block-start:0;inset-inline-start:0}[part=node-control]{min-inline-size:var(--lr-icon-button-size);min-block-size:var(--lr-icon-button-size)}.portable-node-card{align-items:stretch;gap:var(--lr-space-xs);min-inline-size:calc(var(--lr-size-10rem) + var(--lr-size-1rem));padding:var(--lr-space-s);border:var(--lr-border-width-thin) solid var(--lr-color-border);border-radius:var(--lr-radius);background:var(--lr-color-surface);box-shadow:var(--lr-shadow-s);display:flex}.portable-node-content{overflow-wrap:anywhere;flex-direction:column;flex:auto;min-inline-size:0;display:flex}.portable-handles{flex-direction:column;justify-content:space-around;display:flex}.portable-handles>span{inline-size:var(--lr-size-0-5rem);block-size:var(--lr-size-0-5rem);border-radius:var(--lr-radius-pill);background:var(--lr-color-border-strong)}[part=node]:focus-within{z-index:var(--lr-layer-content)}[part=edge]{fill:none;stroke:var(--lr-flow-canvas-edge-neutral-color,var(--lr-color-border));stroke-width:1.5px;pointer-events:stroke;cursor:pointer}[part=edge-hit-area]{fill:none;stroke:#0000;stroke-width:var(--lr-icon-button-size);pointer-events:stroke;cursor:pointer}[part=edge][data-tone=brand]{stroke:var(--lr-flow-canvas-edge-brand-color,var(--lr-color-brand))}[part=edge][data-tone=success]{stroke:var(--lr-flow-canvas-edge-success-color,var(--lr-color-success))}[part=edge][data-tone=warning]{stroke:var(--lr-flow-canvas-edge-warning-color,var(--lr-color-warning))}[part=edge][data-tone=danger]{stroke:var(--lr-flow-canvas-edge-danger-color,var(--lr-color-danger))}[part=arrowhead]{fill:var(--lr-flow-canvas-edge-neutral-color,var(--lr-color-border))}[part=arrowhead][data-tone=brand]{fill:var(--lr-flow-canvas-edge-brand-color,var(--lr-color-brand))}[part=arrowhead][data-tone=success]{fill:var(--lr-flow-canvas-edge-success-color,var(--lr-color-success))}[part=arrowhead][data-tone=warning]{fill:var(--lr-flow-canvas-edge-warning-color,var(--lr-color-warning))}[part=arrowhead][data-tone=danger]{fill:var(--lr-flow-canvas-edge-danger-color,var(--lr-color-danger))}[part=stub]{stroke:var(--lr-color-border);stroke-width:1.5px;stroke-dasharray:3 3;opacity:.6}[part=edge-label]{fill:var(--lr-color-text);font:var(--lr-font-size-xs) / 1 var(--lr-font);text-anchor:middle;stroke:var(--lr-color-surface);stroke-width:var(--lr-size-3px)}[part=layout-limit]{inset-inline:var(--lr-space-s);z-index:var(--lr-layer-content);max-inline-size:calc(100% - 2 * var(--lr-space-s));padding:var(--lr-space-2xs) var(--lr-space-s);border:var(--lr-border-width-thin) solid var(--lr-color-warning);border-radius:var(--lr-radius);background:var(--lr-color-surface);color:var(--lr-color-text);font-size:var(--lr-font-size-xs);overflow-wrap:anywhere;position:absolute;inset-block-end:var(--lr-space-s)}.world{transform-origin:0 0;will-change:transform;block-size:100%;inline-size:100%;position:absolute;inset-block-start:0;inset-inline-start:0}[part=background]{background-image:radial-gradient(circle, var(--lr-color-border) var(--lr-size-1px), transparent var(--lr-size-1px));background-size:var(--lr-flow-canvas-grid-size,var(--_lr-flow-canvas-grid-size,var(--lr-size-0-5rem))) var(--lr-flow-canvas-grid-size,var(--_lr-flow-canvas-grid-size,var(--lr-size-0-5rem)));cursor:grab;block-size:500%;inline-size:500%;position:absolute;inset-block-start:-200%;inset-inline-start:-200%}[part=viewport][data-panning] [part=background]{cursor:grabbing}[part=viewport][data-empty] .world{pointer-events:none}:host([locked]) [part=background]{cursor:default}:host([orientation=horizontal]:dir(rtl)) [part=viewport],:host([orientation=horizontal]:dir(rtl)) [part=node] ::slotted(*),:host([orientation=horizontal]:dir(rtl)) [part=node] [data-flow-canvas-default-card]{transform:scaleX(-1)}[part=node][data-selected]{outline:var(--lr-size-2px) solid var(--lr-flow-canvas-node-selected-outline-color,var(--lr-color-brand));outline-offset:var(--lr-size-2px);border-radius:var(--lr-radius)}[part=node]:where(:not([aria-disabled=true])):hover{outline:var(--lr-size-1px) solid var(--lr-flow-canvas-node-hover-outline-color,var(--lr-color-border-strong));outline-offset:var(--lr-size-2px)}[part=node]:where(:not([aria-disabled=true])):active{outline:var(--lr-size-2px) solid var(--lr-flow-canvas-node-hover-outline-color,var(--lr-color-border-strong));outline-offset:var(--lr-size-2px)}[part=node][aria-disabled=true]{cursor:default;opacity:var(--lr-flow-canvas-node-disabled-opacity,var(--lr-opacity-disabled))}[part=edge][aria-pressed=true],[part=edge]:hover,[part=edge-hit-area]:hover+[part=edge]{stroke-width:2.5px}[part=edge]:active,[part=edge-hit-area]:active+[part=edge]{stroke-width:3.5px}[part=node]:has([part=node-control]:focus-visible),[part=edge]:focus-visible{outline:var(--lr-focus-ring-width) solid var(--lr-focus-ring-color);outline-offset:var(--lr-focus-ring-offset)}[part=connection-line]{fill:none;stroke:var(--lr-flow-canvas-connection-line-color,var(--lr-color-brand));stroke-width:1.5px;stroke-dasharray:4 4;pointer-events:none}[part=node][data-connect-invalid]{outline:var(--lr-size-2px) solid var(--lr-flow-canvas-node-connect-invalid-outline-color,var(--lr-color-danger));outline-offset:var(--lr-size-2px)}[part=node][data-connect-target]{outline:var(--lr-size-2px) dashed var(--lr-flow-canvas-node-connect-target-outline-color,var(--lr-color-brand));outline-offset:var(--lr-size-2px)}[part=viewport][data-drop-active]{outline:var(--lr-size-2px) dashed var(--lr-flow-canvas-drop-active-outline-color,var(--lr-color-brand));outline-offset:calc(-1 * var(--lr-size-2px))}[part=viewport][data-drop-active]:focus-visible{box-shadow:inset 0 0 0 var(--lr-focus-ring-width) var(--lr-focus-ring-color)}[part=edge][data-running]{stroke-dasharray:6 4;animation:lr-flow-canvas-march var(--lr-flow-canvas-march-duration,var(--lr-duration-ambient)) linear infinite}[part=edge][data-running-static]{stroke-dasharray:6 4}@media (prefers-reduced-motion:reduce){[part=edge][data-running]{animation:none}}@keyframes lr-flow-canvas-march{to{stroke-dashoffset:-20px}}`;export{styles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const FLOW_STATUSES=new Set(["pending","running","success","error","denied"]),FLOW_VARIANTS=new Set(["neutral","brand","success","warning","danger"]),MAX_FLOW_COLLECTION_ENTRIES=1e4,MAX_FLOW_COLLECTION_NODES=5e4,MAX_FLOW_COLLECTION_DEPTH=16;function isRecord(value){if(typeof value!="object"||value===null||Array.isArray(value))return!1;try{const prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}catch{return!1}}function snapshotFlowPosition(value){if(!isRecord(value))return;const x=value.x,y=value.y;if(!(typeof x!="number"||typeof y!="number"||!Number.isFinite(x)||!Number.isFinite(y)))return Object.freeze({x,y})}function snapshotFlowData(value){const root={},seen=new WeakMap,work=[{source:value,target:root,depth:0}],owned=[root];seen.set(value,root);let remaining=MAX_FLOW_COLLECTION_NODES;for(;work.length>0&&remaining>0;){const{source,target,depth}=work.pop();let descriptors;try{descriptors=Object.getOwnPropertyDescriptors(source)}catch{continue}let retainedEntries=0;for(const[key,descriptor]of Object.entries(descriptors)){if(!descriptor.enumerable||!("value"in descriptor))continue;if(retainedEntries>=MAX_FLOW_COLLECTION_ENTRIES||remaining<=0)break;retainedEntries+=1,remaining-=1;const item=descriptor.value;if(Array.isArray(item)||isRecord(item)){if(depth>=MAX_FLOW_COLLECTION_DEPTH)continue;let clone=seen.get(item);clone||(clone=Array.isArray(item)?[]:{},seen.set(item,clone),owned.push(clone),work.push({source:item,target:clone,depth:depth+1})),target[key]=clone}else target[key]=item}}for(let index=owned.length-1;index>=0;index--)Object.freeze(owned[index]);return root}function normalizeFlowStatus(value){return typeof value=="string"&&FLOW_STATUSES.has(value)?value:null}function normalizeFlowVariant(value){return typeof value=="string"&&FLOW_VARIANTS.has(value)?value:void 0}function snapshotFlowHandles(value){if(!Array.isArray(value))return;const result=[],seen=new Set;for(const handle of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))try{const id=handle?.id;if(typeof id!="string"||id.trim()===""||seen.has(id))continue;const label=handle?.label;result.push(Object.freeze({id,...typeof label=="string"?{label}:{}})),seen.add(id)}catch{}return Object.freeze(result)}function snapshotFlowNodes(value){if(!Array.isArray(value))return Object.freeze([]);const nodes=[],seen=new Set;for(const node of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))try{const id=node?.id;if(typeof id!="string"||id.trim().length===0||seen.has(id))continue;const data=isRecord(node?.data)?snapshotFlowData(node.data):void 0,position=snapshotFlowPosition(node?.position),inputs=snapshotFlowHandles(node?.inputs),outputs=snapshotFlowHandles(node?.outputs),snapshot=Object.freeze({id,...typeof node?.type=="string"?{type:node.type}:{},...position?{position}:{},...data?{data}:{},...typeof node?.accessibleLabel=="string"?{accessibleLabel:node.accessibleLabel}:{},...inputs?{inputs}:{},...outputs?{outputs}:{}});seen.add(id),nodes.push(snapshot)}catch{}return Object.freeze(nodes)}function snapshotFlowEdges(value){if(!Array.isArray(value))return Object.freeze([]);const edges=[],seen=new Set;for(const edge of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))try{const id=edge?.id;if(typeof id!="string"||id.trim().length===0||seen.has(id))continue;const tone=normalizeFlowVariant(edge?.tone),snapshot=Object.freeze({id,source:typeof edge?.source=="string"?edge.source:"",target:typeof edge?.target=="string"?edge.target:"",...typeof edge?.sourceHandle=="string"?{sourceHandle:edge.sourceHandle}:{},...typeof edge?.targetHandle=="string"?{targetHandle:edge.targetHandle}:{},...typeof edge?.label=="string"?{label:edge.label}:{},...tone?{tone}:{}});seen.add(id),edges.push(snapshot)}catch{}return Object.freeze(edges)}function snapshotFlowDecorations(value){if(!isRecord(value))return Object.freeze({});const entries=[];let keys;try{keys=Object.keys(value).slice(0,MAX_FLOW_COLLECTION_ENTRIES)}catch{return Object.freeze({})}for(const id of keys){let descriptor;try{descriptor=Object.getOwnPropertyDescriptor(value,id)}catch{continue}if(!descriptor||!("value"in descriptor))continue;const candidate=descriptor.value;try{if(!isRecord(candidate))continue;const status=normalizeFlowStatus(candidate.status);if(!status)continue;const progress=candidate.progress,durationMs=candidate.durationMs,detail=candidate.detail;entries.push([id,Object.freeze({status,...typeof progress=="number"?{progress}:{},...typeof durationMs=="number"?{durationMs}:{},...typeof detail=="string"?{detail}:{}})])}catch{}}return Object.freeze(Object.fromEntries(entries))}export{MAX_FLOW_COLLECTION_ENTRIES,normalizeFlowStatus,normalizeFlowVariant,snapshotFlowDecorations,snapshotFlowEdges,snapshotFlowHandles,snapshotFlowNodes};
|
|
1
|
+
const FLOW_STATUSES=new Set(["pending","running","success","error","denied"]),FLOW_VARIANTS=new Set(["neutral","brand","success","warning","danger"]),MAX_FLOW_COLLECTION_ENTRIES=1e4,MAX_FLOW_COLLECTION_NODES=5e4,MAX_FLOW_COLLECTION_DEPTH=16;function isRecord(value){if(typeof value!="object"||value===null||Array.isArray(value))return!1;try{const prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}catch{return!1}}function snapshotFlowPosition(value){if(!isRecord(value))return;const x=value.x,y=value.y;if(!(typeof x!="number"||typeof y!="number"||!Number.isFinite(x)||!Number.isFinite(y)))return Object.freeze({x,y})}function snapshotFlowData(value){const root={},seen=new WeakMap,work=[{source:value,target:root,depth:0}],owned=[root];seen.set(value,root);let remaining=MAX_FLOW_COLLECTION_NODES;for(;work.length>0&&remaining>0;){const{source,target,depth}=work.pop();let descriptors;try{descriptors=Object.getOwnPropertyDescriptors(source)}catch{continue}let retainedEntries=0;for(const[key,descriptor]of Object.entries(descriptors)){if(!descriptor.enumerable||!("value"in descriptor))continue;if(retainedEntries>=MAX_FLOW_COLLECTION_ENTRIES||remaining<=0)break;retainedEntries+=1,remaining-=1;const item=descriptor.value;if(Array.isArray(item)||isRecord(item)){if(depth>=MAX_FLOW_COLLECTION_DEPTH)continue;let clone=seen.get(item);clone||(clone=Array.isArray(item)?[]:{},seen.set(item,clone),owned.push(clone),work.push({source:item,target:clone,depth:depth+1})),target[key]=clone}else target[key]=item}}for(let index=owned.length-1;index>=0;index--)Object.freeze(owned[index]);return root}function normalizeFlowStatus(value){return typeof value=="string"&&FLOW_STATUSES.has(value)?value:null}function normalizeFlowVariant(value){return typeof value=="string"&&FLOW_VARIANTS.has(value)?value:void 0}function snapshotFlowHandles(value){if(!Array.isArray(value))return;const result=[],seen=new Set;for(const handle of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))try{const id=handle?.id;if(typeof id!="string"||id.trim()===""||seen.has(id))continue;const label=handle?.label;result.push(Object.freeze({id,...typeof label=="string"?{label}:{}})),seen.add(id)}catch{}return Object.freeze(result)}function snapshotFlowNodes(value){if(!Array.isArray(value))return Object.freeze([]);const nodes=[],seen=new Set;for(const node of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))try{const id=node?.id;if(typeof id!="string"||id.trim().length===0||seen.has(id))continue;const data=isRecord(node?.data)?snapshotFlowData(node.data):void 0,position=snapshotFlowPosition(node?.position),inputs=snapshotFlowHandles(node?.inputs),outputs=snapshotFlowHandles(node?.outputs),snapshot=Object.freeze({id,...typeof node?.type=="string"?{type:node.type}:{},...position?{position}:{},...data?{data}:{},...typeof node?.accessibleLabel=="string"?{accessibleLabel:node.accessibleLabel}:{},...inputs?{inputs}:{},...outputs?{outputs}:{},...typeof node?.disabled=="boolean"?{disabled:node.disabled}:{}});seen.add(id),nodes.push(snapshot)}catch{}return Object.freeze(nodes)}function snapshotFlowEdges(value){if(!Array.isArray(value))return Object.freeze([]);const edges=[],seen=new Set;for(const edge of value.slice(0,MAX_FLOW_COLLECTION_ENTRIES))try{const id=edge?.id;if(typeof id!="string"||id.trim().length===0||seen.has(id))continue;const tone=normalizeFlowVariant(edge?.tone),snapshot=Object.freeze({id,source:typeof edge?.source=="string"?edge.source:"",target:typeof edge?.target=="string"?edge.target:"",...typeof edge?.sourceHandle=="string"?{sourceHandle:edge.sourceHandle}:{},...typeof edge?.targetHandle=="string"?{targetHandle:edge.targetHandle}:{},...typeof edge?.label=="string"?{label:edge.label}:{},...tone?{tone}:{}});seen.add(id),edges.push(snapshot)}catch{}return Object.freeze(edges)}function snapshotFlowDecorations(value){if(!isRecord(value))return Object.freeze({});const entries=[];let keys;try{keys=Object.keys(value).slice(0,MAX_FLOW_COLLECTION_ENTRIES)}catch{return Object.freeze({})}for(const id of keys){let descriptor;try{descriptor=Object.getOwnPropertyDescriptor(value,id)}catch{continue}if(!descriptor||!("value"in descriptor))continue;const candidate=descriptor.value;try{if(!isRecord(candidate))continue;const status=normalizeFlowStatus(candidate.status);if(!status)continue;const progress=candidate.progress,durationMs=candidate.durationMs,detail=candidate.detail;entries.push([id,Object.freeze({status,...typeof progress=="number"?{progress}:{},...typeof durationMs=="number"?{durationMs}:{},...typeof detail=="string"?{detail}:{}})])}catch{}}return Object.freeze(Object.fromEntries(entries))}export{MAX_FLOW_COLLECTION_ENTRIES,normalizeFlowStatus,normalizeFlowVariant,snapshotFlowDecorations,snapshotFlowEdges,snapshotFlowHandles,snapshotFlowNodes};
|
|
@@ -15,7 +15,16 @@ readonly position?:Readonly<{x:number;y:number;}>;
|
|
|
15
15
|
/** The fallback card reads string `label`/`description` fields; arbitrary otherwise. */
|
|
16
16
|
readonly data?:Readonly<Record<string,unknown>>;
|
|
17
17
|
/** Spoken-name override; falls back to `data.label`, then `id`. */
|
|
18
|
-
readonly accessibleLabel?:string;readonly inputs?:readonly FlowHandle[];readonly outputs?:readonly FlowHandle[];
|
|
18
|
+
readonly accessibleLabel?:string;readonly inputs?:readonly FlowHandle[];readonly outputs?:readonly FlowHandle[];
|
|
19
|
+
/**
|
|
20
|
+
* Marks this node non-actionable: it cannot be selected or activated by click or keyboard (its
|
|
21
|
+
* `node-control` renders a genuinely disabled `<button>`), roving-tabindex navigation steps past
|
|
22
|
+
* it instead of landing on it, it cannot be dragged even while `nodes-draggable`, and it is
|
|
23
|
+
* excluded from starting or receiving a new connection while `connectable` (an already-existing
|
|
24
|
+
* edge touching it is left alone). Omitted or `false` renders the node exactly as before this
|
|
25
|
+
* field existed.
|
|
26
|
+
*/
|
|
27
|
+
readonly disabled?:boolean;}
|
|
19
28
|
/** A directed edge in a flow canvas. `id` must be nonempty and unique within `edges`; the first
|
|
20
29
|
* valid occurrence wins. */
|
|
21
30
|
export interface FlowEdge{readonly id:string;readonly source:string;readonly target:string;readonly sourceHandle?:string;readonly targetHandle?:string;
|
|
@@ -23,8 +23,8 @@ export interface LyraGaugeThreshold{readonly at:number;readonly variant:LyraProg
|
|
|
23
23
|
* @csspart base - The root `<svg>`.
|
|
24
24
|
* @csspart track - The background track arc/line.
|
|
25
25
|
* @csspart fill - The animated fill arc/line.
|
|
26
|
-
* @csspart value - The value text.
|
|
27
|
-
* @csspart label - The label text.
|
|
26
|
+
* @csspart value - The value text. Rendered only while `showValue` is true.
|
|
27
|
+
* @csspart label - The label text. Rendered only while `label` is non-empty.
|
|
28
28
|
* @cssprop [--lr-gauge-fill=var(--lr-color-brand)] - Fill stroke for radial, ring, and linear
|
|
29
29
|
* gauges. The token default follows the effective variant -- `variant`, or the matching
|
|
30
30
|
* `thresholds` entry -- rather than always `brand`.
|
|
@@ -47,6 +47,19 @@ label:string;
|
|
|
47
47
|
/** Displayed/announced value text, e.g. `'72°F'` for a raw `value` of `72`.
|
|
48
48
|
* An empty string is treated the same as unset and falls back to the numeric `value`. */
|
|
49
49
|
valueText?:string;
|
|
50
|
+
/** Whether the decorative `part="value"` caption renders at all. The accessible value --
|
|
51
|
+
* `aria-valuenow`/`aria-valuetext` and the host's computed accessible name -- comes from
|
|
52
|
+
* `value`/`valueText` directly and stays correct either way, since the caption itself is
|
|
53
|
+
* always `aria-hidden`. Mirrors `<lr-progress-bar>`'s and `<lr-progress-ring>`'s own
|
|
54
|
+
* `showValue` name and meaning; the default differs (`true` here, `false` there) because
|
|
55
|
+
* unlike a progress indicator, a gauge's whole purpose is showing the reading it announces, so
|
|
56
|
+
* hiding the caption is the opt-out rather than the opt-in -- leaving it unset renders exactly
|
|
57
|
+
* as before this property existed. Uses the shared parse-only `trueDefaultBooleanConverter`
|
|
58
|
+
* rather than Lit's default presence-based `type: Boolean` handling, so a plain-HTML consumer
|
|
59
|
+
* with no way to write a `.showValue` property binding can still turn this off with
|
|
60
|
+
* `show-value="false"`. Deliberately not reflected: nothing styles or queries
|
|
61
|
+
* `[show-value]`. */
|
|
62
|
+
showValue:boolean;
|
|
50
63
|
/** Semantic palette for the fill, read from the library's shared semantic-tone vocabulary
|
|
51
64
|
* (the same one `<lr-progress-bar>` uses). This is the fallback color: whenever `thresholds`
|
|
52
65
|
* is non-empty and `value` matches at least one entry, the matching entry's variant wins
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{nativeSvgTitle}from"../../../internal/svg-title.js";import{html,nothing,svg}from"lit";import{property}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{contextualSizes}from"../../../internal/contextual-vocabulary.styles.js";import{normalizeReflectedOptionalSize,optionalSizeConverter}from"../../../internal/variants.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{finiteNumber,finiteRatio}from"../../../internal/numbers.js";import{styles}from"./gauge.styles.js";import{LYRA_DEFAULT_gaugeLabel,LYRA_DEFAULT_gaugeValueLabel}from"../../../internal/default-strings.generated.js";const SWEEP_DEG=270,START_DEG=135,RADIUS=40,CENTER=50,STROKE=10,LINEAR_STROKE=6,LINEAR_BAR_Y=15,LINEAR_TEXT_Y=8,LINEAR_LENGTH=100,RADIAL_VALUE_CHARACTERS=9,RADIAL_LABEL_CHARACTERS=12,LINEAR_VALUE_CHARACTERS=10,LINEAR_LABEL_CHARACTERS=10;function abbreviateSvgText(value,maxCharacters){const characters=Array.from(value);return characters.length<=maxCharacters?value:`${characters.slice(0,maxCharacters-1).join("")}…`}function polarToCartesian(angleDeg){const rad=angleDeg*Math.PI/180;return[CENTER+RADIUS*Math.cos(rad),CENTER+RADIUS*Math.sin(rad)]}function arcPath(startDeg,endDeg){const[sx,sy]=polarToCartesian(startDeg),[ex,ey]=polarToCartesian(endDeg),largeArc=endDeg-startDeg>180?1:0;return`M ${sx} ${sy} A ${RADIUS} ${RADIUS} 0 ${largeArc} 1 ${ex} ${ey}`}const RADIAL_ARC_D=arcPath(START_DEG,START_DEG+SWEEP_DEG),RADIAL_ARC_LENGTH=SWEEP_DEG/360*2*Math.PI*RADIUS,RING_CIRCUMFERENCE=2*Math.PI*RADIUS;class LyraGauge extends LyraElement{constructor(){super(...arguments),this.value=0,this.min=0,this.max=100,this.shape="radial",this.label="",this.variant="brand",this.thresholds=[],this.appliedAriaLabel=null,this.explicitAriaLabel=null,this.authorRole=null,this.syncingGeneratedRole=!1}static{this.defaultStrings={...super.defaultStrings,gaugeLabel:LYRA_DEFAULT_gaugeLabel,gaugeValueLabel:LYRA_DEFAULT_gaugeValueLabel}}static{this.styles=[LyraElement.styles,contextualSizes,styles]}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}get size(){return this._size}set size(next){const normalized=normalizeReflectedOptionalSize(this,next),old=this._size;old!==normalized&&(this._size=normalized,this.requestUpdate("size",old))}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),!(name!=="role"||oldValue===value||this.syncingGeneratedRole)&&(this.authorRole=value,this.requestUpdate())}get domain(){const min=finiteNumber(this.min,0),max=finiteNumber(this.max,100);return{lo:Math.min(min,max),hi:Math.max(min,max)}}get ratio(){if(!Number.isFinite(this.value))return 0;const{lo,hi}=this.domain;return finiteRatio(this.value,lo,hi)}get effectiveVariant(){if(Number.isFinite(this.value)&&this.thresholds.length>0){const sorted=[...this.thresholds.filter(threshold=>Number.isFinite(threshold.at))].sort((a,b)=>finiteNumber(a.at,0)-finiteNumber(b.at,0));let matched;for(const threshold of sorted)finiteNumber(threshold.at,0)<=this.value&&(matched=threshold.variant);if(matched)return matched}return this.variant}get displayText(){return this.valueText||(Number.isFinite(this.value)?getNumberFormat(this.effectiveLocale).format(this.value):"")}truncatedTooltip(fullText,renderedText,renderedLabel){return renderedText===fullText&&renderedLabel===(this.label??"")?"":this.label&&fullText?this.localize("gaugeValueLabel",void 0,{label:this.label,value:fullText}):this.label||fullText}willUpdate(changed){super.willUpdate(changed),this.setAttribute("data-effective-variant",this.effectiveVariant);const{lo,hi}=this.domain,finiteTrio=Number.isFinite(this.value)&&Number.isFinite(lo)&&Number.isFinite(hi)&&lo!==hi;if(this.authorRole===null){this.syncingGeneratedRole=!0;try{this.setAttribute("role",finiteTrio?"meter":"img")}finally{this.syncingGeneratedRole=!1}}if(finiteTrio){const clamped=Math.min(hi,Math.max(lo,this.value));this.setAttribute("aria-valuenow",String(clamped)),this.setAttribute("aria-valuemin",String(lo)),this.setAttribute("aria-valuemax",String(hi))}else this.removeAttribute("aria-valuenow"),this.removeAttribute("aria-valuemin"),this.removeAttribute("aria-valuemax");const currentAriaLabel=this.getAttribute("aria-label");currentAriaLabel!==this.appliedAriaLabel&&(this.explicitAriaLabel=currentAriaLabel);const defaultName=this.label||this.localize("gaugeLabel"),fallbackValueLabel=this.displayText&&(!Number.isFinite(this.value)||lo===hi)?this.localize("gaugeValueLabel",void 0,{label:defaultName,value:this.displayText}):defaultName,nextAriaLabel=this.explicitAriaLabel||(finiteTrio?defaultName:fallbackValueLabel);this.setAttribute("aria-label",nextAriaLabel),this.appliedAriaLabel=nextAriaLabel,finiteTrio&&this.valueText?this.setAttribute("aria-valuetext",this.valueText):this.removeAttribute("aria-valuetext")}renderRadial(){const fullText=this.displayText,text=abbreviateSvgText(fullText,RADIAL_VALUE_CHARACTERS),label=abbreviateSvgText(this.label??"",RADIAL_LABEL_CHARACTERS),tooltip=this.truncatedTooltip(fullText,text,label),dashoffset=RADIAL_ARC_LENGTH*(1-this.ratio);return html`<svg
|
|
1
|
+
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{nativeSvgTitle}from"../../../internal/svg-title.js";import{html,nothing,svg}from"lit";import{property}from"lit/decorators.js";import{LyraElement}from"../../../internal/lyra-element.js";import{contextualSizes}from"../../../internal/contextual-vocabulary.styles.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{normalizeReflectedOptionalSize,optionalSizeConverter}from"../../../internal/variants.js";import{getNumberFormat}from"../../../internal/intl-cache.js";import{finiteNumber,finiteRatio}from"../../../internal/numbers.js";import{styles}from"./gauge.styles.js";import{LYRA_DEFAULT_gaugeLabel,LYRA_DEFAULT_gaugeValueLabel}from"../../../internal/default-strings.generated.js";const SWEEP_DEG=270,START_DEG=135,RADIUS=40,CENTER=50,STROKE=10,LINEAR_STROKE=6,LINEAR_BAR_Y=15,LINEAR_TEXT_Y=8,LINEAR_LENGTH=100,RADIAL_VALUE_CHARACTERS=9,RADIAL_LABEL_CHARACTERS=12,LINEAR_VALUE_CHARACTERS=10,LINEAR_LABEL_CHARACTERS=10;function abbreviateSvgText(value,maxCharacters){const characters=Array.from(value);return characters.length<=maxCharacters?value:`${characters.slice(0,maxCharacters-1).join("")}…`}function polarToCartesian(angleDeg){const rad=angleDeg*Math.PI/180;return[CENTER+RADIUS*Math.cos(rad),CENTER+RADIUS*Math.sin(rad)]}function arcPath(startDeg,endDeg){const[sx,sy]=polarToCartesian(startDeg),[ex,ey]=polarToCartesian(endDeg),largeArc=endDeg-startDeg>180?1:0;return`M ${sx} ${sy} A ${RADIUS} ${RADIUS} 0 ${largeArc} 1 ${ex} ${ey}`}const RADIAL_ARC_D=arcPath(START_DEG,START_DEG+SWEEP_DEG),RADIAL_ARC_LENGTH=SWEEP_DEG/360*2*Math.PI*RADIUS,RING_CIRCUMFERENCE=2*Math.PI*RADIUS;class LyraGauge extends LyraElement{constructor(){super(...arguments),this.value=0,this.min=0,this.max=100,this.shape="radial",this.label="",this.showValue=!0,this.variant="brand",this.thresholds=[],this.appliedAriaLabel=null,this.explicitAriaLabel=null,this.authorRole=null,this.syncingGeneratedRole=!1}static{this.defaultStrings={...super.defaultStrings,gaugeLabel:LYRA_DEFAULT_gaugeLabel,gaugeValueLabel:LYRA_DEFAULT_gaugeValueLabel}}static{this.styles=[LyraElement.styles,contextualSizes,styles]}static get observedAttributes(){return[...new Set([...super.observedAttributes,"role"])]}get size(){return this._size}set size(next){const normalized=normalizeReflectedOptionalSize(this,next),old=this._size;old!==normalized&&(this._size=normalized,this.requestUpdate("size",old))}attributeChangedCallback(name,oldValue,value){super.attributeChangedCallback(name,oldValue,value),!(name!=="role"||oldValue===value||this.syncingGeneratedRole)&&(this.authorRole=value,this.requestUpdate())}get domain(){const min=finiteNumber(this.min,0),max=finiteNumber(this.max,100);return{lo:Math.min(min,max),hi:Math.max(min,max)}}get ratio(){if(!Number.isFinite(this.value))return 0;const{lo,hi}=this.domain;return finiteRatio(this.value,lo,hi)}get effectiveVariant(){if(Number.isFinite(this.value)&&this.thresholds.length>0){const sorted=[...this.thresholds.filter(threshold=>Number.isFinite(threshold.at))].sort((a,b)=>finiteNumber(a.at,0)-finiteNumber(b.at,0));let matched;for(const threshold of sorted)finiteNumber(threshold.at,0)<=this.value&&(matched=threshold.variant);if(matched)return matched}return this.variant}get displayText(){return this.valueText||(Number.isFinite(this.value)?getNumberFormat(this.effectiveLocale).format(this.value):"")}truncatedTooltip(fullText,renderedText,renderedLabel){return renderedText===fullText&&renderedLabel===(this.label??"")?"":this.label&&fullText?this.localize("gaugeValueLabel",void 0,{label:this.label,value:fullText}):this.label||fullText}willUpdate(changed){super.willUpdate(changed),this.setAttribute("data-effective-variant",this.effectiveVariant);const{lo,hi}=this.domain,finiteTrio=Number.isFinite(this.value)&&Number.isFinite(lo)&&Number.isFinite(hi)&&lo!==hi;if(this.authorRole===null){this.syncingGeneratedRole=!0;try{this.setAttribute("role",finiteTrio?"meter":"img")}finally{this.syncingGeneratedRole=!1}}if(finiteTrio){const clamped=Math.min(hi,Math.max(lo,this.value));this.setAttribute("aria-valuenow",String(clamped)),this.setAttribute("aria-valuemin",String(lo)),this.setAttribute("aria-valuemax",String(hi))}else this.removeAttribute("aria-valuenow"),this.removeAttribute("aria-valuemin"),this.removeAttribute("aria-valuemax");const currentAriaLabel=this.getAttribute("aria-label");currentAriaLabel!==this.appliedAriaLabel&&(this.explicitAriaLabel=currentAriaLabel);const defaultName=this.label||this.localize("gaugeLabel"),fallbackValueLabel=this.displayText&&(!Number.isFinite(this.value)||lo===hi)?this.localize("gaugeValueLabel",void 0,{label:defaultName,value:this.displayText}):defaultName,nextAriaLabel=this.explicitAriaLabel||(finiteTrio?defaultName:fallbackValueLabel);this.setAttribute("aria-label",nextAriaLabel),this.appliedAriaLabel=nextAriaLabel,finiteTrio&&this.valueText?this.setAttribute("aria-valuetext",this.valueText):this.removeAttribute("aria-valuetext")}renderRadial(){const fullText=this.displayText,text=abbreviateSvgText(fullText,RADIAL_VALUE_CHARACTERS),label=abbreviateSvgText(this.label??"",RADIAL_LABEL_CHARACTERS),tooltip=this.truncatedTooltip(fullText,text,label),dashoffset=RADIAL_ARC_LENGTH*(1-this.ratio);return html`<svg
|
|
2
2
|
part="base"
|
|
3
3
|
viewBox="0 0 100 100"
|
|
4
4
|
aria-hidden="true"
|
|
@@ -12,12 +12,12 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
|
|
|
12
12
|
stroke-dasharray=${RADIAL_ARC_LENGTH}
|
|
13
13
|
stroke-dashoffset=${dashoffset}
|
|
14
14
|
></path>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
${this.showValue?svg`<text
|
|
16
|
+
part="value"
|
|
17
|
+
x="50"
|
|
18
|
+
y="52"
|
|
19
|
+
aria-hidden="true"
|
|
20
|
+
>${text}</text>`:nothing}
|
|
21
21
|
${this.label?svg`<text
|
|
22
22
|
part="label"
|
|
23
23
|
x="50"
|
|
@@ -48,12 +48,12 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
|
|
|
48
48
|
y=${LINEAR_TEXT_Y}
|
|
49
49
|
aria-hidden="true"
|
|
50
50
|
>${label}</text>`:nothing}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
${this.showValue?svg`<text
|
|
52
|
+
part="value"
|
|
53
|
+
x=${endX}
|
|
54
|
+
y=${LINEAR_TEXT_Y}
|
|
55
|
+
aria-hidden="true"
|
|
56
|
+
>${text}</text>`:nothing}
|
|
57
57
|
</svg>`}renderRing(){const fullText=this.displayText,text=abbreviateSvgText(fullText,RADIAL_VALUE_CHARACTERS),label=abbreviateSvgText(this.label??"",RADIAL_LABEL_CHARACTERS),tooltip=this.truncatedTooltip(fullText,text,label),dashoffset=RING_CIRCUMFERENCE*(1-this.ratio);return html`<svg
|
|
58
58
|
part="base"
|
|
59
59
|
viewBox="0 0 100 100"
|
|
@@ -71,16 +71,16 @@ var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3
|
|
|
71
71
|
stroke-dashoffset=${dashoffset}
|
|
72
72
|
transform="rotate(-90 50 50)"
|
|
73
73
|
></circle>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
${this.showValue?svg`<text
|
|
75
|
+
part="value"
|
|
76
|
+
x="50"
|
|
77
|
+
y="52"
|
|
78
|
+
aria-hidden="true"
|
|
79
|
+
>${text}</text>`:nothing}
|
|
80
80
|
${this.label?svg`<text
|
|
81
81
|
part="label"
|
|
82
82
|
x="50"
|
|
83
83
|
y="68"
|
|
84
84
|
aria-hidden="true"
|
|
85
85
|
>${label}</text>`:nothing}
|
|
86
|
-
</svg>`}render(){return this.shape==="linear"?this.renderLinear():this.shape==="ring"?this.renderRing():this.renderRadial()}}__decorate([property({type:Number})],LyraGauge.prototype,"value",void 0),__decorate([property({type:Number})],LyraGauge.prototype,"min",void 0),__decorate([property({type:Number})],LyraGauge.prototype,"max",void 0),__decorate([property({reflect:!0})],LyraGauge.prototype,"shape",void 0),__decorate([property({reflect:!0,converter:optionalSizeConverter})],LyraGauge.prototype,"size",null),__decorate([property()],LyraGauge.prototype,"label",void 0),__decorate([property({attribute:"value-text"})],LyraGauge.prototype,"valueText",void 0),__decorate([property({reflect:!0})],LyraGauge.prototype,"variant",void 0),__decorate([property({attribute:!1})],LyraGauge.prototype,"thresholds",void 0);export{LyraGauge};
|
|
86
|
+
</svg>`}render(){return this.shape==="linear"?this.renderLinear():this.shape==="ring"?this.renderRing():this.renderRadial()}}__decorate([property({type:Number})],LyraGauge.prototype,"value",void 0),__decorate([property({type:Number})],LyraGauge.prototype,"min",void 0),__decorate([property({type:Number})],LyraGauge.prototype,"max",void 0),__decorate([property({reflect:!0})],LyraGauge.prototype,"shape",void 0),__decorate([property({reflect:!0,converter:optionalSizeConverter})],LyraGauge.prototype,"size",null),__decorate([property()],LyraGauge.prototype,"label",void 0),__decorate([property({attribute:"value-text"})],LyraGauge.prototype,"valueText",void 0),__decorate([property({attribute:"show-value",converter:trueDefaultBooleanConverter})],LyraGauge.prototype,"showValue",void 0),__decorate([property({reflect:!0})],LyraGauge.prototype,"variant",void 0),__decorate([property({attribute:!1})],LyraGauge.prototype,"thresholds",void 0);export{LyraGauge};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{css}from"lit";const styles=css`:host{inline-size:var(--lr-size-8em);block-size:var(--lr-size-8em);display:inline-block}:host([shape=linear]){inline-size:var(--lr-size-12em);block-size:var(--lr-size-1-5em)}:host(:where([size])){font-size:var(--lr-form-control-font-size)}:host([data-effective-variant=neutral]){--_lr-gauge-variant-fill:var(--lr-color-neutral)}:host([data-effective-variant=brand]){--_lr-gauge-variant-fill:var(--lr-color-brand)}:host([data-effective-variant=success]){--_lr-gauge-variant-fill:var(--lr-color-success)}:host([data-effective-variant=warning]){--_lr-gauge-variant-fill:var(--lr-color-warning)}:host([data-effective-variant=danger]){--_lr-gauge-variant-fill:var(--lr-color-danger)}svg{block-size:100%;inline-size:100%;display:block;overflow:visible}[part=track]{fill:none;stroke:var(--lr-color-border)}[part=fill]{fill:none;stroke:var(--lr-gauge-fill,var(--_lr-gauge-variant-fill,var(--lr-color-brand)));stroke-linecap:round;transition:stroke-dashoffset var(--lr-transition-base)}[part=value]{font-size:var(--lr-
|
|
1
|
+
import{css}from"lit";const styles=css`:host{inline-size:var(--lr-size-8em);block-size:var(--lr-size-8em);display:inline-block}:host([shape=linear]){inline-size:var(--lr-size-12em);block-size:var(--lr-size-1-5em)}:host(:where([size])){font-size:var(--lr-form-control-font-size)}:host([data-effective-variant=neutral]){--_lr-gauge-variant-fill:var(--lr-color-neutral)}:host([data-effective-variant=brand]){--_lr-gauge-variant-fill:var(--lr-color-brand)}:host([data-effective-variant=success]){--_lr-gauge-variant-fill:var(--lr-color-success)}:host([data-effective-variant=warning]){--_lr-gauge-variant-fill:var(--lr-color-warning)}:host([data-effective-variant=danger]){--_lr-gauge-variant-fill:var(--lr-color-danger)}svg{block-size:100%;inline-size:100%;display:block;overflow:visible}[part=track]{fill:none;stroke:var(--lr-color-border)}[part=fill]{fill:none;stroke:var(--lr-gauge-fill,var(--_lr-gauge-variant-fill,var(--lr-color-brand)));stroke-linecap:round;transition:stroke-dashoffset var(--lr-transition-base)}[part=value]{font-size:var(--lr-size-1em);font-weight:var(--lr-font-weight-bold);text-anchor:middle;fill:var(--lr-color-text);font-family:var(--lr-font)}[part=label]{font-size:calc(var(--lr-size-1em) * .625);text-anchor:middle;fill:var(--lr-color-text-quiet);font-family:var(--lr-font);text-transform:uppercase}:host([shape=linear]) [part=fill]{stroke-linecap:butt}:host([shape=linear]) [part=value],:host([shape=linear]) [part=label]{font-size:var(--lr-size-0-5em)}:host([shape=linear]) [part=value]{text-anchor:end}:host([shape=linear]) [part=label]{text-anchor:start}@media (prefers-reduced-motion:reduce){[part=fill]{transition:none!important}}`;export{styles};
|
|
@@ -187,8 +187,9 @@ export interface GraphQueryDeleteDetail{readonly queryId:string;}export interfac
|
|
|
187
187
|
* `minHops <= maxHops`), whether or not the user has touched anything.
|
|
188
188
|
* @cssstate invalid - Matches while it does not — from the very first render, before any
|
|
189
189
|
* interaction, since an empty query has no start anchor.
|
|
190
|
-
* @cssstate user-valid - `valid`, and the user has interacted: an edit to any field, a blur of
|
|
191
|
-
* start-entity input,
|
|
190
|
+
* @cssstate user-valid - `valid`, and the user has interacted: an edit to any field, a blur of
|
|
191
|
+
* the start-entity input, `reportValidity()` (what the Run button runs), or a submission
|
|
192
|
+
* attempt. Not after a silent `checkValidity()` alone.
|
|
192
193
|
* @cssstate user-invalid - `invalid` after that same interaction. A pristine empty query is
|
|
193
194
|
* invalid but deliberately does not match this, so a consumer's `:state(user-invalid)` styling
|
|
194
195
|
* cannot paint the form red before the user has typed anything. A form reset makes it pristine
|
|
@@ -216,7 +217,7 @@ label:string;
|
|
|
216
217
|
/** Supporting text rendered below the outer label. */
|
|
217
218
|
hint:string;
|
|
218
219
|
/** Caller-supplied outer error text. Field-level validation remains on the affected controls. */
|
|
219
|
-
errorText:string;private _errors;private touchedFields;private saveName;private hasHintSlot;private hasErrorSlot;private readonly labelId;private readonly hintId;private readonly errorId;private internals;private validityController;
|
|
220
|
+
errorText:string;private _errors;private touchedFields;private saveName;private hasHintSlot;private hasErrorSlot;private hintSlotEl?;private errorSlotEl?;private readonly labelId;private readonly hintId;private readonly errorId;private internals;private validityController;
|
|
220
221
|
/** Consumer-supplied validation message reflected through `custom-error`. */
|
|
221
222
|
customError:string|null;private _fieldsetDisabled;private _name;private _value;private defaultValue;private defaultValueCaptured;private _disabled;private hasInteracted;private lastValidityKey;private pendingRemovalFocus?;private removalFocusGeneration;
|
|
222
223
|
/** Projects a host `aria-describedby` onto the internal `role="group"` owner --
|
|
@@ -249,7 +250,7 @@ private get barredFromValidation();
|
|
|
249
250
|
* constraint never lifts — `computeValidation()` always raises `valueMissing` for an empty
|
|
250
251
|
* `startId`, since a path query with no anchor is not runnable.
|
|
251
252
|
*/
|
|
252
|
-
private syncValidityCustomStates;
|
|
253
|
+
private syncValidityCustomStates;private markInteracted;
|
|
253
254
|
/** Resynchronizes validity without revealing inline errors. */
|
|
254
255
|
checkValidity():boolean;
|
|
255
256
|
/** Reveals every current field error and returns overall validity -- the hook Run calls before
|
|
@@ -277,4 +278,12 @@ focus(options?:FocusOptions):void;
|
|
|
277
278
|
blur():void;
|
|
278
279
|
/** Forwards host clicks to the first rendered control so callers can interact with this wrapper
|
|
279
280
|
* as if it exposed a single root control. */
|
|
280
|
-
click():void;private setValue;private addRelationshipType;private removeRelationshipType;private addNodeType;private removeNodeType;private captureChipRemovalFocus;private markTouched;private runQuery;private saveQuery;private loadQuery;private deleteQuery;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private hopOptions;
|
|
281
|
+
click():void;private setValue;private addRelationshipType;private removeRelationshipType;private addNodeType;private removeNodeType;private captureChipRemovalFocus;private markTouched;private runQuery;private saveQuery;private loadQuery;private deleteQuery;protected willUpdate(changed:PropertyValues):void;protected updated(changed:PropertyValues):void;private hopOptions;
|
|
282
|
+
/**
|
|
283
|
+
* Also called once from `firstUpdated()` (see `collectInitialSlotAssignment`) to cover an
|
|
284
|
+
* environment, or a real-browser timing race, where a slot's initial assignment never fires
|
|
285
|
+
* `slotchange`. Idempotent: re-reading the same still-assigned nodes just re-derives the same
|
|
286
|
+
* boolean, so running once from `firstUpdated()` and again from a real initial `slotchange` (every
|
|
287
|
+
* real-browser connect) produces no duplicate side effect.
|
|
288
|
+
*/
|
|
289
|
+
private onChromeSlotChange;private collectChromeSlotAssignment;protected firstUpdated(changed:PropertyValues):void;private labelForType;private containSelectEvent;private renderTypeFilter;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-graph-query-builder':LyraGraphQueryBuilder;}}
|