@rosettadash/web-components 0.1.0 → 0.1.3
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/browser/media.js +461 -39
- package/browser/media.js.map +3 -3
- package/package.json +332 -36
- package/src/domain/i18n/app-language-select/index.d.ts +3 -0
- package/src/domain/i18n/app-language-select/index.js +3 -0
- package/src/domain/i18n/app-language-select/index.js.map +1 -0
- package/src/domain/i18n/app-language-select/parse-locale-options.d.ts +7 -0
- package/src/domain/i18n/app-language-select/parse-locale-options.js +39 -0
- package/src/domain/i18n/app-language-select/parse-locale-options.js.map +1 -0
- package/src/domain/i18n/app-language-select/rd-app-language-select.d.ts +38 -0
- package/src/domain/i18n/app-language-select/rd-app-language-select.js +138 -0
- package/src/domain/i18n/app-language-select/rd-app-language-select.js.map +1 -0
- package/src/domain/i18n/index.d.ts +2 -0
- package/src/domain/i18n/index.js +6 -0
- package/src/domain/i18n/index.js.map +1 -0
- package/src/domain/index.d.ts +6 -0
- package/src/domain/index.js +18 -0
- package/src/domain/index.js.map +1 -0
- package/src/domain/person-invite/index.d.ts +2 -0
- package/src/domain/person-invite/index.js +2 -0
- package/src/domain/person-invite/index.js.map +1 -0
- package/src/domain/person-invite/rd-person-invite.d.ts +17 -0
- package/src/domain/person-invite/rd-person-invite.js +33 -0
- package/src/domain/person-invite/rd-person-invite.js.map +1 -0
- package/src/domain/role-assign/index.d.ts +2 -0
- package/src/domain/role-assign/index.js +2 -0
- package/src/domain/role-assign/index.js.map +1 -0
- package/src/domain/role-assign/rd-role-assign.d.ts +21 -0
- package/src/domain/role-assign/rd-role-assign.js +36 -0
- package/src/domain/role-assign/rd-role-assign.js.map +1 -0
- package/src/domain/role-gate/index.d.ts +2 -0
- package/src/domain/role-gate/index.js +2 -0
- package/src/domain/role-gate/index.js.map +1 -0
- package/src/domain/role-gate/rd-role-gate.d.ts +19 -0
- package/src/domain/role-gate/rd-role-gate.js +31 -0
- package/src/domain/role-gate/rd-role-gate.js.map +1 -0
- package/src/domain/time-preset/index.d.ts +2 -0
- package/src/domain/time-preset/index.js +2 -0
- package/src/domain/time-preset/index.js.map +1 -0
- package/src/domain/time-preset/rd-time-preset.d.ts +23 -0
- package/src/domain/time-preset/rd-time-preset.js +34 -0
- package/src/domain/time-preset/rd-time-preset.js.map +1 -0
- package/src/index.d.ts +5 -5
- package/src/index.js +13 -13
- package/src/index.js.map +1 -1
- package/src/layout/collapsible/index.d.ts +2 -0
- package/src/layout/collapsible/index.js +2 -0
- package/src/layout/collapsible/index.js.map +1 -0
- package/src/layout/collapsible/rd-collapsible.d.ts +21 -0
- package/src/layout/collapsible/rd-collapsible.js +50 -0
- package/src/layout/collapsible/rd-collapsible.js.map +1 -0
- package/src/layout/flex/index.d.ts +2 -0
- package/src/layout/flex/index.js +2 -0
- package/src/layout/flex/index.js.map +1 -0
- package/src/layout/flex/rd-flex-layout.d.ts +17 -0
- package/src/layout/flex/rd-flex-layout.js +24 -0
- package/src/layout/flex/rd-flex-layout.js.map +1 -0
- package/src/layout/grid/index.d.ts +2 -0
- package/src/layout/grid/index.js +2 -0
- package/src/layout/grid/index.js.map +1 -0
- package/src/layout/grid/rd-grid-layout.d.ts +17 -0
- package/src/layout/grid/rd-grid-layout.js +24 -0
- package/src/layout/grid/rd-grid-layout.js.map +1 -0
- package/src/layout/index.d.ts +9 -0
- package/src/layout/index.js +27 -0
- package/src/layout/index.js.map +1 -0
- package/src/layout/modal/index.d.ts +2 -0
- package/src/layout/modal/index.js +2 -0
- package/src/layout/modal/index.js.map +1 -0
- package/src/layout/modal/rd-modal-layout.d.ts +20 -0
- package/src/layout/modal/rd-modal-layout.js +40 -0
- package/src/layout/modal/rd-modal-layout.js.map +1 -0
- package/src/layout/scroll-region/index.d.ts +2 -0
- package/src/layout/scroll-region/index.js +2 -0
- package/src/layout/scroll-region/index.js.map +1 -0
- package/src/layout/scroll-region/rd-scroll-region.d.ts +17 -0
- package/src/layout/scroll-region/rd-scroll-region.js +26 -0
- package/src/layout/scroll-region/rd-scroll-region.js.map +1 -0
- package/src/layout/tabs/index.d.ts +2 -0
- package/src/layout/tabs/index.js +2 -0
- package/src/layout/tabs/index.js.map +1 -0
- package/src/layout/tabs/rd-tabs-layout.d.ts +23 -0
- package/src/layout/tabs/rd-tabs-layout.js +34 -0
- package/src/layout/tabs/rd-tabs-layout.js.map +1 -0
- package/src/lib/element-utils.js +3 -0
- package/src/lib/element-utils.js.map +1 -1
- package/src/lib/rosetta-atom-element.d.ts +23 -0
- package/src/lib/rosetta-atom-element.js +104 -0
- package/src/lib/rosetta-atom-element.js.map +1 -0
- package/src/lib/shadow-base.js +3 -0
- package/src/lib/shadow-base.js.map +1 -1
- package/src/lib/shadow-resources.js +7 -2
- package/src/lib/shadow-resources.js.map +1 -1
- package/src/logic/index.d.ts +2 -0
- package/src/logic/index.js +6 -0
- package/src/logic/index.js.map +1 -0
- package/src/logic/timer/index.d.ts +2 -0
- package/src/logic/timer/index.js +2 -0
- package/src/logic/timer/index.js.map +1 -0
- package/src/logic/timer/rd-timer.d.ts +18 -0
- package/src/logic/timer/rd-timer.js +24 -0
- package/src/logic/timer/rd-timer.js.map +1 -0
- package/src/visual/chart/bar/index.d.ts +2 -0
- package/src/visual/chart/bar/index.js +2 -0
- package/src/visual/chart/bar/index.js.map +1 -0
- package/src/visual/chart/bar/rd-bar-chart.d.ts +21 -0
- package/src/visual/chart/bar/rd-bar-chart.js +83 -0
- package/src/visual/chart/bar/rd-bar-chart.js.map +1 -0
- package/src/visual/chart/line/index.d.ts +2 -0
- package/src/visual/chart/line/index.js +2 -0
- package/src/visual/chart/line/index.js.map +1 -0
- package/src/visual/chart/line/rd-line-chart.d.ts +22 -0
- package/src/visual/chart/line/rd-line-chart.js +105 -0
- package/src/visual/chart/line/rd-line-chart.js.map +1 -0
- package/src/visual/chart/pie/index.d.ts +2 -0
- package/src/visual/chart/pie/index.js +2 -0
- package/src/visual/chart/pie/index.js.map +1 -0
- package/src/visual/chart/pie/rd-pie-chart.d.ts +15 -0
- package/src/visual/chart/pie/rd-pie-chart.js +23 -0
- package/src/visual/chart/pie/rd-pie-chart.js.map +1 -0
- package/src/visual/detail/index.d.ts +2 -0
- package/src/visual/detail/index.js +2 -0
- package/src/visual/detail/index.js.map +1 -0
- package/src/visual/detail/rd-detail-panel.d.ts +16 -0
- package/src/visual/detail/rd-detail-panel.js +24 -0
- package/src/visual/detail/rd-detail-panel.js.map +1 -0
- package/src/visual/display/3d-bar-chart/index.d.ts +2 -0
- package/src/visual/display/3d-bar-chart/index.js +2 -0
- package/src/visual/display/3d-bar-chart/index.js.map +1 -0
- package/src/visual/display/3d-bar-chart/rd-three-bar-chart.d.ts +16 -0
- package/src/visual/display/3d-bar-chart/rd-three-bar-chart.js +24 -0
- package/src/visual/display/3d-bar-chart/rd-three-bar-chart.js.map +1 -0
- package/src/visual/display/3d-geo-globe/globe-view.d.ts +86 -0
- package/src/visual/display/3d-geo-globe/globe-view.js +235 -0
- package/src/visual/display/3d-geo-globe/globe-view.js.map +1 -0
- package/src/visual/display/3d-geo-globe/index.d.ts +3 -0
- package/src/visual/display/3d-geo-globe/index.js +3 -0
- package/src/visual/display/3d-geo-globe/index.js.map +1 -0
- package/src/visual/display/3d-geo-globe/rd-three-geo-globe.d.ts +36 -0
- package/src/visual/display/3d-geo-globe/rd-three-geo-globe.js +330 -0
- package/src/visual/display/3d-geo-globe/rd-three-geo-globe.js.map +1 -0
- package/src/visual/display/3d-gltf-model/index.d.ts +2 -0
- package/src/visual/display/3d-gltf-model/index.js +2 -0
- package/src/visual/display/3d-gltf-model/index.js.map +1 -0
- package/src/visual/display/3d-gltf-model/rd-three-gltf-model.d.ts +16 -0
- package/src/visual/display/3d-gltf-model/rd-three-gltf-model.js +24 -0
- package/src/visual/display/3d-gltf-model/rd-three-gltf-model.js.map +1 -0
- package/src/visual/display/3d-scatter/index.d.ts +2 -0
- package/src/visual/display/3d-scatter/index.js +2 -0
- package/src/visual/display/3d-scatter/index.js.map +1 -0
- package/src/visual/display/3d-scatter/rd-three-scatter-plot.d.ts +16 -0
- package/src/visual/display/3d-scatter/rd-three-scatter-plot.js +24 -0
- package/src/visual/display/3d-scatter/rd-three-scatter-plot.js.map +1 -0
- package/src/visual/display/3d-scene/index.d.ts +2 -0
- package/src/visual/display/3d-scene/index.js +2 -0
- package/src/visual/display/3d-scene/index.js.map +1 -0
- package/src/visual/display/3d-scene/rd-three-scene-point-cloud.d.ts +16 -0
- package/src/visual/display/3d-scene/rd-three-scene-point-cloud.js +24 -0
- package/src/visual/display/3d-scene/rd-three-scene-point-cloud.js.map +1 -0
- package/src/visual/display/geo-map/geo-map-types.d.ts +32 -0
- package/src/visual/display/geo-map/geo-map-types.js +10 -0
- package/src/visual/display/geo-map/geo-map-types.js.map +1 -0
- package/src/visual/display/geo-map/index.d.ts +5 -0
- package/src/visual/display/geo-map/index.js +5 -0
- package/src/visual/display/geo-map/index.js.map +1 -0
- package/src/visual/display/geo-map/parse-center.d.ts +5 -0
- package/src/visual/display/geo-map/parse-center.js +28 -0
- package/src/visual/display/geo-map/parse-center.js.map +1 -0
- package/src/visual/display/geo-map/parse-markers.d.ts +2 -0
- package/src/visual/display/geo-map/parse-markers.js +32 -0
- package/src/visual/display/geo-map/parse-markers.js.map +1 -0
- package/src/visual/display/geo-map/providers/create-adapter.d.ts +2 -0
- package/src/visual/display/geo-map/providers/create-adapter.js +11 -0
- package/src/visual/display/geo-map/providers/create-adapter.js.map +1 -0
- package/src/visual/display/geo-map/providers/google-maps-adapter.d.ts +2 -0
- package/src/visual/display/geo-map/providers/google-maps-adapter.js +63 -0
- package/src/visual/display/geo-map/providers/google-maps-adapter.js.map +1 -0
- package/src/visual/display/geo-map/providers/leaflet-adapter.d.ts +2 -0
- package/src/visual/display/geo-map/providers/leaflet-adapter.js +78 -0
- package/src/visual/display/geo-map/providers/leaflet-adapter.js.map +1 -0
- package/src/visual/display/geo-map/providers/maplibre-adapter.d.ts +2 -0
- package/src/visual/display/geo-map/providers/maplibre-adapter.js +71 -0
- package/src/visual/display/geo-map/providers/maplibre-adapter.js.map +1 -0
- package/src/visual/display/geo-map/providers/provider-utils.d.ts +8 -0
- package/src/visual/display/geo-map/providers/provider-utils.js +28 -0
- package/src/visual/display/geo-map/providers/provider-utils.js.map +1 -0
- package/src/visual/display/geo-map/rd-geo-map.d.ts +48 -0
- package/src/visual/display/geo-map/rd-geo-map.js +219 -0
- package/src/visual/display/geo-map/rd-geo-map.js.map +1 -0
- package/src/visual/display/index.d.ts +7 -0
- package/src/visual/display/index.js +21 -0
- package/src/visual/display/index.js.map +1 -0
- package/src/visual/index.d.ts +34 -0
- package/src/visual/index.js +102 -0
- package/src/visual/index.js.map +1 -0
- package/src/visual/input/checkbox/index.d.ts +2 -0
- package/src/visual/input/checkbox/index.js +2 -0
- package/src/visual/input/checkbox/index.js.map +1 -0
- package/src/visual/input/checkbox/rd-checkbox-input.d.ts +19 -0
- package/src/visual/input/checkbox/rd-checkbox-input.js +32 -0
- package/src/visual/input/checkbox/rd-checkbox-input.js.map +1 -0
- package/src/visual/input/date-range/index.d.ts +2 -0
- package/src/visual/input/date-range/index.js +2 -0
- package/src/visual/input/date-range/index.js.map +1 -0
- package/src/visual/input/date-range/rd-date-range-filter.d.ts +24 -0
- package/src/visual/input/date-range/rd-date-range-filter.js +42 -0
- package/src/visual/input/date-range/rd-date-range-filter.js.map +1 -0
- package/src/visual/input/number/index.d.ts +2 -0
- package/src/visual/input/number/index.js +2 -0
- package/src/visual/input/number/index.js.map +1 -0
- package/src/visual/input/number/rd-number-input.d.ts +22 -0
- package/src/visual/input/number/rd-number-input.js +36 -0
- package/src/visual/input/number/rd-number-input.js.map +1 -0
- package/src/visual/input/select/index.d.ts +2 -0
- package/src/visual/input/select/index.js +2 -0
- package/src/visual/input/select/index.js.map +1 -0
- package/src/visual/input/select/rd-select-input.d.ts +24 -0
- package/src/visual/input/select/rd-select-input.js +37 -0
- package/src/visual/input/select/rd-select-input.js.map +1 -0
- package/src/visual/input/text/index.d.ts +2 -0
- package/src/visual/input/text/index.js +2 -0
- package/src/visual/input/text/index.js.map +1 -0
- package/src/visual/input/text/rd-text-input.d.ts +21 -0
- package/src/visual/input/text/rd-text-input.js +35 -0
- package/src/visual/input/text/rd-text-input.js.map +1 -0
- package/src/visual/input/textarea/index.d.ts +2 -0
- package/src/visual/input/textarea/index.js +2 -0
- package/src/visual/input/textarea/index.js.map +1 -0
- package/src/visual/input/textarea/rd-textarea-input.d.ts +20 -0
- package/src/visual/input/textarea/rd-textarea-input.js +34 -0
- package/src/visual/input/textarea/rd-textarea-input.js.map +1 -0
- package/src/visual/kpi/index.d.ts +2 -0
- package/src/visual/kpi/index.js +2 -0
- package/src/visual/kpi/index.js.map +1 -0
- package/src/visual/kpi/rd-kpi-card.d.ts +18 -0
- package/src/visual/kpi/rd-kpi-card.js +26 -0
- package/src/visual/kpi/rd-kpi-card.js.map +1 -0
- package/src/visual/media/index.d.ts +2 -0
- package/src/visual/media/index.js +6 -0
- package/src/visual/media/index.js.map +1 -1
- package/src/visual/media/live-capture/index.d.ts +2 -0
- package/src/visual/media/live-capture/index.js +2 -0
- package/src/visual/media/live-capture/index.js.map +1 -0
- package/src/visual/media/live-capture/rd-live-capture.d.ts +16 -0
- package/src/visual/media/live-capture/rd-live-capture.js +23 -0
- package/src/visual/media/live-capture/rd-live-capture.js.map +1 -0
- package/src/visual/media/video-source/rd-video-source.d.ts +5 -0
- package/src/visual/media/video-source/rd-video-source.js +101 -18
- package/src/visual/media/video-source/rd-video-source.js.map +1 -1
- package/src/visual/media/youtube-embed/index.d.ts +3 -0
- package/src/visual/media/youtube-embed/index.js +3 -0
- package/src/visual/media/youtube-embed/index.js.map +1 -0
- package/src/visual/media/youtube-embed/parse-youtube-id.d.ts +10 -0
- package/src/visual/media/youtube-embed/parse-youtube-id.js +56 -0
- package/src/visual/media/youtube-embed/parse-youtube-id.js.map +1 -0
- package/src/visual/media/youtube-embed/rd-youtube-embed.d.ts +35 -0
- package/src/visual/media/youtube-embed/rd-youtube-embed.js +121 -0
- package/src/visual/media/youtube-embed/rd-youtube-embed.js.map +1 -0
- package/src/visual/news/article-detail/index.d.ts +2 -0
- package/src/visual/news/article-detail/index.js +2 -0
- package/src/visual/news/article-detail/index.js.map +1 -0
- package/src/visual/news/article-detail/rd-news-article-detail.d.ts +16 -0
- package/src/visual/news/article-detail/rd-news-article-detail.js +24 -0
- package/src/visual/news/article-detail/rd-news-article-detail.js.map +1 -0
- package/src/visual/news/language-select/index.d.ts +2 -0
- package/src/visual/news/language-select/index.js +2 -0
- package/src/visual/news/language-select/index.js.map +1 -0
- package/src/visual/news/language-select/rd-news-language-select.d.ts +23 -0
- package/src/visual/news/language-select/rd-news-language-select.js +37 -0
- package/src/visual/news/language-select/rd-news-language-select.js.map +1 -0
- package/src/visual/news/region-select/index.d.ts +2 -0
- package/src/visual/news/region-select/index.js +2 -0
- package/src/visual/news/region-select/index.js.map +1 -0
- package/src/visual/news/region-select/rd-news-region-select.d.ts +23 -0
- package/src/visual/news/region-select/rd-news-region-select.js +37 -0
- package/src/visual/news/region-select/rd-news-region-select.js.map +1 -0
- package/src/visual/news/results-table/index.d.ts +2 -0
- package/src/visual/news/results-table/index.js +2 -0
- package/src/visual/news/results-table/index.js.map +1 -0
- package/src/visual/news/results-table/rd-news-results-table.d.ts +16 -0
- package/src/visual/news/results-table/rd-news-results-table.js +33 -0
- package/src/visual/news/results-table/rd-news-results-table.js.map +1 -0
- package/src/visual/news/search-box/index.d.ts +2 -0
- package/src/visual/news/search-box/index.js +2 -0
- package/src/visual/news/search-box/index.js.map +1 -0
- package/src/visual/news/search-box/rd-news-search-box.d.ts +19 -0
- package/src/visual/news/search-box/rd-news-search-box.js +42 -0
- package/src/visual/news/search-box/rd-news-search-box.js.map +1 -0
- package/src/visual/news/type-select/index.d.ts +2 -0
- package/src/visual/news/type-select/index.js +2 -0
- package/src/visual/news/type-select/index.js.map +1 -0
- package/src/visual/news/type-select/rd-news-type-select.d.ts +23 -0
- package/src/visual/news/type-select/rd-news-type-select.js +37 -0
- package/src/visual/news/type-select/rd-news-type-select.js.map +1 -0
- package/src/visual/plugin/metric-chip/index.d.ts +2 -0
- package/src/visual/plugin/metric-chip/index.js +2 -0
- package/src/visual/plugin/metric-chip/index.js.map +1 -0
- package/src/visual/plugin/metric-chip/rd-metric-chip.d.ts +16 -0
- package/src/visual/plugin/metric-chip/rd-metric-chip.js +23 -0
- package/src/visual/plugin/metric-chip/rd-metric-chip.js.map +1 -0
- package/src/visual/plugin/status-badge/index.d.ts +2 -0
- package/src/visual/plugin/status-badge/index.js +2 -0
- package/src/visual/plugin/status-badge/index.js.map +1 -0
- package/src/visual/plugin/status-badge/rd-status-badge.d.ts +16 -0
- package/src/visual/plugin/status-badge/rd-status-badge.js +19 -0
- package/src/visual/plugin/status-badge/rd-status-badge.js.map +1 -0
- package/src/visual/skeleton/index.d.ts +2 -0
- package/src/visual/skeleton/index.js +2 -0
- package/src/visual/skeleton/index.js.map +1 -0
- package/src/visual/skeleton/rd-loading-skeleton.d.ts +15 -0
- package/src/visual/skeleton/rd-loading-skeleton.js +20 -0
- package/src/visual/skeleton/rd-loading-skeleton.js.map +1 -0
- package/src/visual/svg/icon/index.d.ts +2 -0
- package/src/visual/svg/icon/index.js +2 -0
- package/src/visual/svg/icon/index.js.map +1 -0
- package/src/visual/svg/icon/rd-svg-icon.d.ts +18 -0
- package/src/visual/svg/icon/rd-svg-icon.js +20 -0
- package/src/visual/svg/icon/rd-svg-icon.js.map +1 -0
- package/src/visual/svg/inline/index.d.ts +2 -0
- package/src/visual/svg/inline/index.js +2 -0
- package/src/visual/svg/inline/index.js.map +1 -0
- package/src/visual/svg/inline/rd-svg-inline.d.ts +17 -0
- package/src/visual/svg/inline/rd-svg-inline.js +20 -0
- package/src/visual/svg/inline/rd-svg-inline.js.map +1 -0
- package/src/visual/table/index.d.ts +2 -0
- package/src/visual/table/index.js +2 -0
- package/src/visual/table/index.js.map +1 -0
- package/src/visual/table/rd-data-table.d.ts +26 -0
- package/src/visual/table/rd-data-table.js +46 -0
- package/src/visual/table/rd-data-table.js.map +1 -0
- package/src/visual/wasm/media/index.d.ts +1 -0
- package/src/visual/wasm/media/index.js +2 -0
- package/src/visual/wasm/media/index.js.map +1 -0
- package/src/visual/wasm/module/index.d.ts +2 -0
- package/src/visual/wasm/module/index.js +2 -0
- package/src/visual/wasm/module/index.js.map +1 -0
- package/src/visual/wasm/module/rd-wasm-module.d.ts +16 -0
- package/src/visual/wasm/module/rd-wasm-module.js +24 -0
- package/src/visual/wasm/module/rd-wasm-module.js.map +1 -0
- package/src/visual/wasm/worker-host/index.d.ts +2 -0
- package/src/visual/wasm/worker-host/index.js +2 -0
- package/src/visual/wasm/worker-host/index.js.map +1 -0
- package/src/visual/wasm/worker-host/rd-wasm-worker-host.d.ts +16 -0
- package/src/visual/wasm/worker-host/rd-wasm-worker-host.js +24 -0
- package/src/visual/wasm/worker-host/rd-wasm-worker-host.js.map +1 -0
- package/src/wasm/wasm-media/rd-wasm-media.d.ts +10 -0
- package/src/wasm/wasm-media/rd-wasm-media.js +182 -41
- package/src/wasm/wasm-media/rd-wasm-media.js.map +1 -1
- package/styles/runtime.css +1609 -0
- package/styles/styles.css +1 -0
- package/styles/tokens.css +9 -0
package/browser/media.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../packages/core/src/lib/media/equirect-filter.ts", "../../../../packages/web-components/src/lib/element-utils.ts", "../../../../packages/web-components/src/lib/shadow-resources.ts", "../../../../packages/web-components/src/lib/shadow-base.ts", "../../../../packages/web-components/src/visual/media/video-source/rd-video-source.ts", "../../../../packages/web-components/src/visual/media/equirect-viewport/rd-equirect-viewport.ts", "../../../../packages/web-components/src/visual/media/index.ts"],
|
|
4
|
-
"sourcesContent": ["export interface EquirectFlatCropOptions {\n cropX: number;\n cropY: number;\n cropWidth: number;\n cropHeight: number;\n outputWidth: number;\n outputHeight: number;\n}\n\nexport interface EquirectRectilinearOptions {\n yaw: number;\n pitch: number;\n roll?: number;\n horizontalFov: number;\n outputWidth: number;\n outputHeight: number;\n}\n\n/** ffmpeg -vf filter for a rectangular crop on a flat 2:1 equirect frame, then scale. */\nexport function buildEquirectFlatCropFilter(options: EquirectFlatCropOptions): string {\n const cropX = Math.max(0, Math.round(options.cropX));\n const cropY = Math.max(0, Math.round(options.cropY));\n const cropWidth = Math.max(2, Math.round(options.cropWidth));\n const cropHeight = Math.max(2, Math.round(options.cropHeight));\n const outputWidth = Math.max(2, Math.round(options.outputWidth));\n const outputHeight = Math.max(2, Math.round(options.outputHeight));\n\n return `crop=${cropWidth}:${cropHeight}:${cropX}:${cropY},scale=${outputWidth}:${outputHeight}`;\n}\n\n/** ffmpeg -vf filter for rectilinear reprojection from equirect source. */\nexport function buildEquirectRectilinearFilter(options: EquirectRectilinearOptions): string {\n const yaw = Number(options.yaw) || 0;\n const pitch = Number(options.pitch) || 0;\n const roll = Number(options.roll ?? 0) || 0;\n const horizontalFov = Math.max(1, Number(options.horizontalFov) || 90);\n const outputWidth = Math.max(2, Math.round(options.outputWidth));\n const outputHeight = Math.max(2, Math.round(options.outputHeight));\n\n return [\n `v360=input=equirect:output=rectilinear:yaw=${yaw}:pitch=${pitch}:roll=${roll}:d_fov=${horizontalFov}`,\n `scale=${outputWidth}:${outputHeight}`,\n ].join(',');\n}\n\nexport function buildEquirectExtractFilter(\n mode: 'flat-crop' | 'rectilinear',\n options: EquirectFlatCropOptions & Partial<EquirectRectilinearOptions>,\n): string {\n if (mode === 'rectilinear') {\n return buildEquirectRectilinearFilter({\n yaw: options.yaw ?? 0,\n pitch: options.pitch ?? 0,\n roll: options.roll ?? 0,\n horizontalFov: options.horizontalFov ?? 90,\n outputWidth: options.outputWidth,\n outputHeight: options.outputHeight,\n });\n }\n\n return buildEquirectFlatCropFilter(options);\n}\n\n/** Default crop centered on a 4096\u00D72048 equirect frame. */\nexport const DEFAULT_EQUIRECT_SOURCE = { width: 4096, height: 2048 } as const;\n\nexport const DEFAULT_EQUIRECT_FLAT_CROP: EquirectFlatCropOptions = {\n cropX: Math.floor((DEFAULT_EQUIRECT_SOURCE.width - 1080) / 2),\n cropY: Math.floor((DEFAULT_EQUIRECT_SOURCE.height - 720) / 2),\n cropWidth: 1080,\n cropHeight: 720,\n outputWidth: 720,\n outputHeight: 480,\n};\n", "export interface DefineRosettaElementOptions {\n extends?: keyof HTMLElementTagNameMap;\n}\n\nexport function defineRosettaElement(\n tagName: string,\n ctor: CustomElementConstructor,\n options?: DefineRosettaElementOptions,\n): void {\n if (customElements.get(tagName)) {\n return;\n }\n if (options?.extends) {\n customElements.define(tagName, ctor, { extends: options.extends });\n } else {\n customElements.define(tagName, ctor);\n }\n}\n\nexport type DashRow = Record<string, string | number | boolean | null | undefined>;\n\nexport function readNumber(value: unknown, fallback: number): number {\n const next = Number(value);\n return Number.isFinite(next) ? next : fallback;\n}\n\nexport function readString(value: unknown, fallback: string): string {\n return typeof value === 'string' ? value : fallback;\n}\n\nexport const BASE_STYLES = `\n:host {\n display: block;\n font-family: var(--rd-font-family, system-ui, sans-serif);\n color: var(--rd-color-text, #1f2937);\n}\n.panel {\n border: 1px solid var(--rd-color-border, #d9dee7);\n border-radius: var(--rd-radius-md, 0.5rem);\n padding: 0.75rem;\n}\n.panel__header {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n}\n.panel__header h3 {\n margin: 0;\n font-size: 0.9375rem;\n}\n.panel__meta {\n font-size: 0.75rem;\n color: var(--rd-color-muted, #6b7280);\n}\n`;\n", "const textCache = new Map<string, Promise<string>>();\n\n/** Load co-located `.html` / `.css` for shadow roots (browser fetch). */\nexport function loadTextResource(relativePath: string, baseUrl: string): Promise<string> {\n const url = new URL(relativePath, baseUrl);\n const cacheKey = url.href;\n const cached = textCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const promise = (async () => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load ${url.href}: ${response.status}`);\n }\n return response.text();\n })();\n\n textCache.set(cacheKey, promise);\n return promise;\n}\n\nexport interface ShadowMountOptions {\n html: string;\n css: string;\n}\n\n/** Apply stylesheet + markup to an open shadow root. */\nexport function applyShadowMount(root: ShadowRoot, options: ShadowMountOptions): void {\n root.innerHTML = '';\n const style = document.createElement('style');\n style.textContent = options.css;\n root.appendChild(style);\n\n const template = document.createElement('template');\n template.innerHTML = options.html;\n root.appendChild(template.content.cloneNode(true));\n}\n\n/** Load paired `.html` + `.css` next to the calling module. */\nexport async function loadShadowPair(\n baseUrl: string,\n htmlFile: string,\n cssFile: string,\n): Promise<ShadowMountOptions> {\n const [html, css] = await Promise.all([\n loadTextResource(htmlFile, baseUrl),\n loadTextResource(cssFile, baseUrl),\n ]);\n return { html, css };\n}\n", "import { loadTextResource, type ShadowMountOptions } from './shadow-resources.js';\n\n/** Co-located shadow asset directories relative to `packages/web-components/src/`. */\nexport const SHADOW_ELEMENT_DIRS: Record<string, string> = {\n 'rd-accordion': 'layout/accordion',\n 'rd-accordion-link-list': 'layout/accordion-link-list',\n 'rd-link-list': 'visual/link-list',\n 'rd-video-source': 'visual/media/video-source',\n 'rd-equirect-viewport': 'visual/media/equirect-viewport',\n 'rd-wasm-media': 'wasm/wasm-media',\n 'rd-component-name': 'catalog/component-name',\n};\n\nconst tagToBaseUrl = new Map<string, string>();\nlet packageSrcRoot: string | null = null;\n\n/** Ensure a module/file URL resolves to a directory URL (trailing `/`). */\nexport function normalizeDirectoryUrl(urlString: string): string {\n const url = new URL(urlString);\n const lastSegment = url.pathname.split('/').pop() ?? '';\n if (/\\.[a-z0-9]+$/i.test(lastSegment)) {\n url.pathname = url.pathname.replace(/\\/[^/]+$/, '/');\n } else if (!url.pathname.endsWith('/')) {\n url.pathname = `${url.pathname}/`;\n }\n return url.href.endsWith('/') ? url.href : `${url.href}/`;\n}\n\n/** Register co-located asset directory for a custom element tag. */\nexport function registerShadowBase(tag: string, baseUrl: string): void {\n tagToBaseUrl.set(tag, normalizeDirectoryUrl(baseUrl));\n}\n\n/** Set package `src/` root (`file:` or `https:` URL ending in `/`). */\nexport function setShadowPackageSrcRoot(rootUrl: string): void {\n packageSrcRoot = normalizeDirectoryUrl(rootUrl);\n}\n\n/** Resolve `packages/web-components/src/` from a module URL (Vite-safe). */\nexport function resolvePackageSrcRootFromModule(moduleUrl: string): string {\n const marker = new URL('./register-shadow-bases.browser.js', moduleUrl);\n return normalizeDirectoryUrl(new URL('./', marker).href);\n}\n\n/** Register all known shadow bases from {@link setShadowPackageSrcRoot}. */\nexport function registerAllShadowBases(): void {\n if (!packageSrcRoot) {\n throw new Error('setShadowPackageSrcRoot must be called before registerAllShadowBases');\n }\n for (const [tag, dir] of Object.entries(SHADOW_ELEMENT_DIRS)) {\n registerShadowBase(tag, new URL(`./${dir}/`, packageSrcRoot).href);\n }\n}\n\n/** Register one shadow base when package root is configured (browser entry or Jest setup). */\nexport function ensureShadowBase(tag: string): void {\n if (tagToBaseUrl.has(tag)) {\n return;\n }\n if (!packageSrcRoot) {\n throw new Error(\n `Shadow base not registered for ${tag}. Import '@rosettadash/web-components' once in app code, or add the web-components Jest setup in test config.`,\n );\n }\n const dir = SHADOW_ELEMENT_DIRS[tag];\n if (!dir) {\n throw new Error(`Unknown shadow element tag: ${tag}`);\n }\n registerShadowBase(tag, new URL(`./${dir}/`, packageSrcRoot).href);\n}\n\n/** Resolve registered base URL for shadow asset loading. */\nexport function getShadowBase(tag: string): string {\n const base = tagToBaseUrl.get(tag);\n if (!base) {\n throw new Error(`Shadow base not registered for ${tag}`);\n }\n return base;\n}\n\n/** Load paired `.html` + `.css` for a registered element tag. */\nexport async function loadShadowPairForTag(\n tag: string,\n htmlFile: string,\n cssFile: string,\n): Promise<ShadowMountOptions> {\n ensureShadowBase(tag);\n const base = getShadowBase(tag);\n const [html, css] = await Promise.all([\n loadTextResource(htmlFile, base),\n loadTextResource(cssFile, base),\n ]);\n return { html, css };\n}\n\nexport { applyShadowMount } from './shadow-resources.js';\n", "import { DEFAULT_EQUIRECT_SOURCE } from '@rosettadash/core';\nimport { defineRosettaElement, type DashRow, readNumber, readString } from '../../../lib/element-utils.js';\nimport { applyShadowMount, ensureShadowBase, loadShadowPairForTag } from '../../../lib/shadow-base.js';\n\nexport const DB_VIDEO_SOURCE_TAG = 'rd-video-source';\n\nexport class RdVideoSourceElement extends HTMLElement {\n static readonly tagName = DB_VIDEO_SOURCE_TAG;\n\n private inputEl: HTMLInputElement | null = null;\n private resourcesReady: Promise<void> | null = null;\n private changeListener: (() => void) | null = null;\n\n connectedCallback(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n this.resourcesReady = this.mountShadow();\n void this.resourcesReady.then(() => this.paint());\n }\n\n disconnectedCallback(): void {\n if (this.inputEl && this.changeListener) {\n this.inputEl.removeEventListener('change', this.changeListener);\n }\n this.changeListener = null;\n this.inputEl = null;\n }\n\n setProperty(name: string, value: unknown): void {\n (this as Record<string, unknown>)[name] = value;\n if (this.resourcesReady) {\n void this.resourcesReady.then(() => this.paint());\n }\n }\n\n whenReady(): Promise<void> {\n return this.resourcesReady ?? Promise.resolve();\n }\n\n get label(): string {\n return readString(this.getAttribute('label'), 'Video source');\n }\n\n get accept(): string {\n return readString(this.getAttribute('accept'), 'video/*');\n }\n\n get sourceWidth(): number {\n return readNumber(this.getAttribute('source-width'), DEFAULT_EQUIRECT_SOURCE.width);\n }\n\n get sourceHeight(): number {\n return readNumber(this.getAttribute('source-height'), DEFAULT_EQUIRECT_SOURCE.height);\n }\n\n private async mountShadow(): Promise<void> {\n const root = this.shadowRoot;\n if (!root || root.querySelector('.video-source')) {\n return;\n }\n const pair = await loadShadowPairForTag(\n DB_VIDEO_SOURCE_TAG,\n './rd-video-source.html',\n './rd-video-source.css',\n );\n applyShadowMount(root, pair);\n this.inputEl = root.querySelector('[data-ref=\"input\"]');\n this.changeListener = () => this.handleFileSelected();\n this.inputEl?.addEventListener('change', this.changeListener);\n }\n\n private paint(): void {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const labelEl = root.querySelector('[data-ref=\"label\"]');\n const metaEl = root.querySelector('[data-ref=\"meta\"]');\n if (labelEl) {\n labelEl.textContent = this.label;\n }\n if (metaEl) {\n metaEl.textContent = `${this.sourceWidth}\u00D7${this.sourceHeight}`;\n }\n const input = root.querySelector('[data-ref=\"input\"]') as HTMLInputElement | null;\n if (input) {\n input.accept = this.accept;\n }\n }\n\n private handleFileSelected(): void {\n const file = this.inputEl?.files?.[0];\n if (!file) {\n return;\n }\n\n const nameEl = this.shadowRoot?.querySelector('[data-ref=\"file-name\"]');\n if (nameEl) {\n nameEl.textContent = file.name;\n }\n\n const metadata: DashRow = {\n name: file.name,\n sourceWidth: this.sourceWidth,\n sourceHeight: this.sourceHeight,\n size: file.size,\n };\n\n this.dispatchEvent(\n new CustomEvent('video-file', {\n detail: { file, metadata },\n bubbles: true,\n composed: true,\n }),\n );\n this.dispatchEvent(\n new CustomEvent('metadata', {\n detail: metadata,\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n\nexport function registerRdVideoSource(): void {\n ensureShadowBase(DB_VIDEO_SOURCE_TAG);\n defineRosettaElement(RdVideoSourceElement.tagName, RdVideoSourceElement);\n}\n", "import {\n buildEquirectExtractFilter,\n DEFAULT_EQUIRECT_FLAT_CROP,\n DEFAULT_EQUIRECT_SOURCE,\n} from '@rosettadash/core';\nimport { defineRosettaElement, type DashRow, readNumber, readString } from '../../../lib/element-utils.js';\nimport { applyShadowMount, ensureShadowBase, getShadowBase, loadShadowPairForTag } from '../../../lib/shadow-base.js';\nimport { loadTextResource } from '../../../lib/shadow-resources.js';\n\nexport const DB_EQUIRECT_VIEWPORT_TAG = 'rd-equirect-viewport';\n\nexport type EquirectPreviewMode = 'flat-crop' | 'rectilinear';\n\nexport class RdEquirectViewportElement extends HTMLElement {\n static readonly tagName = DB_EQUIRECT_VIEWPORT_TAG;\n\n private resourcesReady: Promise<void> | null = null;\n\n static get observedAttributes(): string[] {\n return [\n 'label',\n 'preview-mode',\n 'source-width',\n 'source-height',\n 'crop-x',\n 'crop-y',\n 'crop-width',\n 'crop-height',\n 'output-width',\n 'output-height',\n 'yaw',\n 'pitch',\n 'horizontal-fov',\n ];\n }\n\n connectedCallback(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n this.resourcesReady = this.mountShadow();\n void this.resourcesReady.then(() => {\n this.paint();\n this.emitCropRegion();\n });\n }\n\n attributeChangedCallback(): void {\n if (this.shadowRoot && this.resourcesReady) {\n void this.resourcesReady.then(() => {\n this.paint();\n this.emitCropRegion();\n });\n }\n }\n\n whenReady(): Promise<void> {\n return this.resourcesReady ?? Promise.resolve();\n }\n\n setProperty(name: string, value: unknown): void {\n const attrMap: Record<string, string> = {\n previewMode: 'preview-mode',\n sourceWidth: 'source-width',\n sourceHeight: 'source-height',\n cropX: 'crop-x',\n cropY: 'crop-y',\n cropWidth: 'crop-width',\n cropHeight: 'crop-height',\n outputWidth: 'output-width',\n outputHeight: 'output-height',\n horizontalFov: 'horizontal-fov',\n };\n\n const attr = attrMap[name] ?? name;\n if (value === null || value === undefined) {\n this.removeAttribute(attr);\n } else {\n this.setAttribute(attr, String(value));\n }\n }\n\n get previewMode(): EquirectPreviewMode {\n const mode = readString(this.getAttribute('preview-mode'), 'flat-crop');\n return mode === 'rectilinear' ? 'rectilinear' : 'flat-crop';\n }\n\n get label(): string {\n return readString(this.getAttribute('label'), 'Equirect viewport');\n }\n\n get cropRegion(): DashRow {\n return {\n cropX: this.cropX,\n cropY: this.cropY,\n cropWidth: this.cropWidth,\n cropHeight: this.cropHeight,\n outputWidth: this.outputWidth,\n outputHeight: this.outputHeight,\n yaw: this.yaw,\n pitch: this.pitch,\n horizontalFov: this.horizontalFov,\n previewMode: this.previewMode,\n filter: buildEquirectExtractFilter(this.previewMode, {\n cropX: this.cropX,\n cropY: this.cropY,\n cropWidth: this.cropWidth,\n cropHeight: this.cropHeight,\n outputWidth: this.outputWidth,\n outputHeight: this.outputHeight,\n yaw: this.yaw,\n pitch: this.pitch,\n horizontalFov: this.horizontalFov,\n }),\n };\n }\n\n private get sourceWidth(): number {\n return readNumber(this.getAttribute('source-width'), DEFAULT_EQUIRECT_SOURCE.width);\n }\n\n private get sourceHeight(): number {\n return readNumber(this.getAttribute('source-height'), DEFAULT_EQUIRECT_SOURCE.height);\n }\n\n private get cropX(): number {\n return readNumber(this.getAttribute('crop-x'), DEFAULT_EQUIRECT_FLAT_CROP.cropX);\n }\n\n private get cropY(): number {\n return readNumber(this.getAttribute('crop-y'), DEFAULT_EQUIRECT_FLAT_CROP.cropY);\n }\n\n private get cropWidth(): number {\n return readNumber(this.getAttribute('crop-width'), DEFAULT_EQUIRECT_FLAT_CROP.cropWidth);\n }\n\n private get cropHeight(): number {\n return readNumber(this.getAttribute('crop-height'), DEFAULT_EQUIRECT_FLAT_CROP.cropHeight);\n }\n\n private get outputWidth(): number {\n return readNumber(this.getAttribute('output-width'), DEFAULT_EQUIRECT_FLAT_CROP.outputWidth);\n }\n\n private get outputHeight(): number {\n return readNumber(this.getAttribute('output-height'), DEFAULT_EQUIRECT_FLAT_CROP.outputHeight);\n }\n\n private get yaw(): number {\n return readNumber(this.getAttribute('yaw'), 0);\n }\n\n private get pitch(): number {\n return readNumber(this.getAttribute('pitch'), 0);\n }\n\n private get horizontalFov(): number {\n return readNumber(this.getAttribute('horizontal-fov'), 90);\n }\n\n private async mountShadow(): Promise<void> {\n const root = this.shadowRoot;\n if (!root || root.querySelector('[data-ref=\"root\"]')) {\n return;\n }\n const pair = await loadShadowPairForTag(\n DB_EQUIRECT_VIEWPORT_TAG,\n './rd-equirect-viewport.html',\n './rd-equirect-viewport.css',\n );\n const panelCss = await loadTextResource('../../../lib/panel.css', getShadowBase(DB_EQUIRECT_VIEWPORT_TAG));\n applyShadowMount(root, { html: pair.html, css: `${panelCss}\\n${pair.css}` });\n }\n\n private paint(): void {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cropLeftPct = (this.cropX / this.sourceWidth) * 100;\n const cropTopPct = (this.cropY / this.sourceHeight) * 100;\n const cropWidthPct = (this.cropWidth / this.sourceWidth) * 100;\n const cropHeightPct = (this.cropHeight / this.sourceHeight) * 100;\n\n const flatPreview = `\n <div class=\"equirect-frame\" style=\"aspect-ratio: ${this.sourceWidth} / ${this.sourceHeight}\">\n <div class=\"equirect-frame__crop\" style=\"left:${cropLeftPct}%;top:${cropTopPct}%;width:${cropWidthPct}%;height:${cropHeightPct}%\"></div>\n </div>\n `;\n\n const rectilinearPreview = `\n <div class=\"rectilinear-preview\">\n <div class=\"rectilinear-preview__cone\" style=\"transform: rotateY(${this.yaw}deg) rotateX(${-this.pitch}deg)\"></div>\n <dl class=\"rectilinear-preview__meta\">\n <div><dt>Yaw</dt><dd>${this.yaw}\u00B0</dd></div>\n <div><dt>Pitch</dt><dd>${this.pitch}\u00B0</dd></div>\n <div><dt>FOV</dt><dd>${this.horizontalFov}\u00B0</dd></div>\n </dl>\n </div>\n `;\n\n const labelEl = root.querySelector('[data-ref=\"label\"]');\n const modeEl = root.querySelector('[data-ref=\"mode\"]');\n if (labelEl) {\n labelEl.textContent = this.label;\n }\n if (modeEl) {\n modeEl.textContent = this.previewMode === 'flat-crop' ? 'Flat crop' : 'Rectilinear';\n }\n const preview = root.querySelector('[data-ref=\"preview\"]');\n if (preview) {\n preview.innerHTML = this.previewMode === 'flat-crop' ? flatPreview : rectilinearPreview;\n }\n const filterEl = root.querySelector('[data-ref=\"filter\"]');\n if (filterEl) {\n filterEl.textContent = String(this.cropRegion['filter']);\n }\n const outputEl = root.querySelector('[data-ref=\"output\"]');\n if (outputEl) {\n outputEl.textContent = `Output ${this.outputWidth}\u00D7${this.outputHeight}`;\n }\n }\n\n private emitCropRegion(): void {\n this.dispatchEvent(\n new CustomEvent('crop-region', {\n detail: this.cropRegion,\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n\nexport function registerRdEquirectViewport(): void {\n ensureShadowBase(DB_EQUIRECT_VIEWPORT_TAG);\n defineRosettaElement(RdEquirectViewportElement.tagName, RdEquirectViewportElement);\n}\n", "export { RdVideoSourceElement, DB_VIDEO_SOURCE_TAG, registerRdVideoSource } from './video-source/index.js';\nexport {\n RdEquirectViewportElement,\n DB_EQUIRECT_VIEWPORT_TAG,\n registerRdEquirectViewport,\n type EquirectPreviewMode,\n} from './equirect-viewport/index.js';\n\nimport { registerRdEquirectViewport } from './equirect-viewport/index.js';\nimport { registerRdVideoSource } from './video-source/index.js';\n\nexport function registerRosettaDashMediaElements(): void {\n registerRdVideoSource();\n registerRdEquirectViewport();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../../../../packages/core/src/lib/media/equirect-filter.ts", "../../../../packages/web-components/src/lib/element-utils.ts", "../../../../packages/web-components/src/lib/shadow-resources.ts", "../../../../packages/web-components/src/lib/shadow-base.ts", "../../../../packages/web-components/src/visual/media/video-source/rd-video-source.ts", "../../../../packages/web-components/src/visual/media/equirect-viewport/rd-equirect-viewport.ts", "../../../../packages/web-components/src/visual/media/youtube-embed/parse-youtube-id.ts", "../../../../packages/web-components/src/visual/media/youtube-embed/rd-youtube-embed.ts", "../../../../packages/web-components/src/lib/parse-link-items.ts", "../../../../packages/web-components/src/lib/rosetta-atom-element.ts", "../../../../packages/web-components/src/visual/media/live-capture/rd-live-capture.ts", "../../../../packages/web-components/src/visual/media/index.ts"],
|
|
4
|
+
"sourcesContent": ["export interface EquirectFlatCropOptions {\n cropX: number;\n cropY: number;\n cropWidth: number;\n cropHeight: number;\n outputWidth: number;\n outputHeight: number;\n}\n\nexport interface EquirectRectilinearOptions {\n yaw: number;\n pitch: number;\n roll?: number;\n horizontalFov: number;\n outputWidth: number;\n outputHeight: number;\n}\n\n/** ffmpeg -vf filter for a rectangular crop on a flat 2:1 equirect frame, then scale. */\nexport function buildEquirectFlatCropFilter(options: EquirectFlatCropOptions, reverse = false): string {\n const cropX = Math.max(0, Math.round(options.cropX));\n const cropY = Math.max(0, Math.round(options.cropY));\n const cropWidth = Math.max(2, Math.round(options.cropWidth));\n const cropHeight = Math.max(2, Math.round(options.cropHeight));\n const outputWidth = Math.max(2, Math.round(options.outputWidth));\n const outputHeight = Math.max(2, Math.round(options.outputHeight));\n\n const filter = `crop=${cropWidth}:${cropHeight}:${cropX}:${cropY},scale=${outputWidth}:${outputHeight}`;\n return reverse ? `${filter},reverse` : filter;\n}\n\n/** ffmpeg -vf filter for rectilinear reprojection from equirect source. */\nfunction roundAngle(value: number): number {\n return Math.round(value * 10) / 10;\n}\n\nexport function buildEquirectRectilinearFilter(options: EquirectRectilinearOptions, reverse = false): string {\n const yaw = roundAngle(Number(options.yaw) || 0);\n const pitch = roundAngle(Number(options.pitch) || 0);\n const roll = roundAngle(Number(options.roll ?? 0) || 0);\n const horizontalFov = Math.max(1, Number(options.horizontalFov) || 90);\n const outputWidth = Math.max(2, Math.round(options.outputWidth));\n const outputHeight = Math.max(2, Math.round(options.outputHeight));\n\n const filter = [\n `v360=input=equirect:output=rectilinear:yaw=${yaw}:pitch=${pitch}:roll=${roll}:d_fov=${horizontalFov}`,\n `scale=${outputWidth}:${outputHeight}`,\n ].join(',');\n return reverse ? `${filter},reverse` : filter;\n}\n\nexport type EquirectRectilinearExtractOptions = EquirectRectilinearOptions & {\n reverse?: boolean;\n};\n\nexport type EquirectFlatCropExtractOptions = EquirectFlatCropOptions & {\n reverse?: boolean;\n};\n\n/** Mode-specific fields; callers may include extras (ignored per mode). */\nexport type EquirectExtractOptions = (Partial<EquirectFlatCropOptions> &\n Partial<EquirectRectilinearOptions> & {\n outputWidth: number;\n outputHeight: number;\n reverse?: boolean;\n });\n\nexport function buildEquirectExtractFilter(\n mode: 'flat-crop' | 'rectilinear',\n options: EquirectExtractOptions,\n): string {\n const reverse = Boolean(options.reverse);\n if (mode === 'rectilinear') {\n return buildEquirectRectilinearFilter(\n {\n yaw: options.yaw ?? 0,\n pitch: options.pitch ?? 0,\n roll: options.roll ?? 0,\n horizontalFov: options.horizontalFov ?? 90,\n outputWidth: options.outputWidth,\n outputHeight: options.outputHeight,\n },\n reverse,\n );\n }\n\n return buildEquirectFlatCropFilter(\n {\n cropX: options.cropX ?? DEFAULT_EQUIRECT_FLAT_CROP.cropX,\n cropY: options.cropY ?? DEFAULT_EQUIRECT_FLAT_CROP.cropY,\n cropWidth: options.cropWidth ?? DEFAULT_EQUIRECT_FLAT_CROP.cropWidth,\n cropHeight: options.cropHeight ?? DEFAULT_EQUIRECT_FLAT_CROP.cropHeight,\n outputWidth: options.outputWidth,\n outputHeight: options.outputHeight,\n },\n reverse,\n );\n}\n\n/** Default crop centered on a 4096\u00D72048 equirect frame. */\nexport const DEFAULT_EQUIRECT_SOURCE = { width: 4096, height: 2048 } as const;\n\nexport const DEFAULT_EQUIRECT_FLAT_CROP: EquirectFlatCropOptions = {\n cropX: Math.floor((DEFAULT_EQUIRECT_SOURCE.width - 1080) / 2),\n cropY: Math.floor((DEFAULT_EQUIRECT_SOURCE.height - 720) / 2),\n cropWidth: 1080,\n cropHeight: 720,\n outputWidth: 720,\n outputHeight: 480,\n};\n", "export interface DefineRosettaElementOptions {\n extends?: keyof HTMLElementTagNameMap;\n}\n\nexport function defineRosettaElement(\n tagName: string,\n ctor: CustomElementConstructor,\n options?: DefineRosettaElementOptions,\n): void {\n if (customElements.get(tagName)) {\n return;\n }\n if (options?.extends) {\n customElements.define(tagName, ctor, { extends: options.extends });\n } else {\n customElements.define(tagName, ctor);\n }\n}\n\nexport type DashRow = Record<string, string | number | boolean | null | undefined>;\n\nexport function readNumber(value: unknown, fallback: number): number {\n if (value === null || value === undefined || value === '') {\n return fallback;\n }\n const next = Number(value);\n return Number.isFinite(next) ? next : fallback;\n}\n\nexport function readString(value: unknown, fallback: string): string {\n return typeof value === 'string' ? value : fallback;\n}\n\nexport const BASE_STYLES = `\n:host {\n display: block;\n font-family: var(--rd-font-family, system-ui, sans-serif);\n color: var(--rd-color-text, #1f2937);\n}\n.panel {\n border: 1px solid var(--rd-color-border, #d9dee7);\n border-radius: var(--rd-radius-md, 0.5rem);\n padding: 0.75rem;\n}\n.panel__header {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 0.75rem;\n margin-bottom: 0.75rem;\n}\n.panel__header h3 {\n margin: 0;\n font-size: 0.9375rem;\n}\n.panel__meta {\n font-size: 0.75rem;\n color: var(--rd-color-muted, #6b7280);\n}\n`;\n", "const textCache = new Map<string, Promise<string>>();\n\n/** Load co-located `.html` / `.css` for shadow roots (browser fetch). */\nexport function loadTextResource(relativePath: string, baseUrl: string): Promise<string> {\n const url = new URL(relativePath, baseUrl);\n const cacheKey = url.href;\n const cached = textCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const promise = (async () => {\n const fetchUrl = new URL(relativePath, baseUrl);\n // Vite dev serves `.css` as HMR modules unless `?raw` is requested.\n if (relativePath.endsWith('.css')) {\n fetchUrl.searchParams.set('raw', '');\n }\n const response = await fetch(fetchUrl);\n if (!response.ok) {\n throw new Error(`Failed to load ${fetchUrl.href}: ${response.status}`);\n }\n return response.text();\n })();\n\n textCache.set(cacheKey, promise);\n return promise;\n}\n\nexport interface ShadowMountOptions {\n html: string;\n css: string;\n}\n\n/** Apply stylesheet + markup to an open shadow root. */\nexport function applyShadowMount(root: ShadowRoot, options: ShadowMountOptions): void {\n root.innerHTML = '';\n const style = document.createElement('style');\n style.textContent = options.css;\n root.appendChild(style);\n\n const template = document.createElement('template');\n template.innerHTML = options.html;\n root.appendChild(template.content.cloneNode(true));\n}\n\n/** Load paired `.html` + `.css` next to the calling module. */\nexport async function loadShadowPair(\n baseUrl: string,\n htmlFile: string,\n cssFile: string,\n): Promise<ShadowMountOptions> {\n const [html, css] = await Promise.all([\n loadTextResource(htmlFile, baseUrl),\n loadTextResource(cssFile, baseUrl),\n ]);\n return { html, css };\n}\n", "import { loadTextResource, type ShadowMountOptions } from './shadow-resources.js';\n\n/** Co-located shadow asset directories relative to `packages/web-components/src/`. */\nexport const SHADOW_ELEMENT_DIRS: Record<string, string> = {\n 'rd-accordion': 'layout/accordion',\n 'rd-accordion-link-list': 'layout/accordion-link-list',\n 'rd-link-list': 'visual/link-list',\n 'rd-video-source': 'visual/media/video-source',\n 'rd-equirect-viewport': 'visual/media/equirect-viewport',\n 'rd-youtube-embed': 'visual/media/youtube-embed',\n 'rd-app-language-select': 'domain/i18n/app-language-select',\n 'rd-geo-map': 'visual/display/geo-map',\n 'rd-wasm-media': 'wasm/wasm-media',\n 'rd-component-name': 'catalog/component-name',\n};\n\nconst tagToBaseUrl = new Map<string, string>();\nlet packageSrcRoot: string | null = null;\n\n/** Ensure a module/file URL resolves to a directory URL (trailing `/`). */\nexport function normalizeDirectoryUrl(urlString: string): string {\n const url = new URL(urlString);\n const lastSegment = url.pathname.split('/').pop() ?? '';\n if (/\\.[a-z0-9]+$/i.test(lastSegment)) {\n url.pathname = url.pathname.replace(/\\/[^/]+$/, '/');\n } else if (!url.pathname.endsWith('/')) {\n url.pathname = `${url.pathname}/`;\n }\n return url.href.endsWith('/') ? url.href : `${url.href}/`;\n}\n\n/** Register co-located asset directory for a custom element tag. */\nexport function registerShadowBase(tag: string, baseUrl: string): void {\n tagToBaseUrl.set(tag, normalizeDirectoryUrl(baseUrl));\n}\n\n/** Set package `src/` root (`file:` or `https:` URL ending in `/`). */\nexport function setShadowPackageSrcRoot(rootUrl: string): void {\n packageSrcRoot = normalizeDirectoryUrl(rootUrl);\n}\n\n/** Resolve `packages/web-components/src/` from a module URL (Vite-safe). */\nexport function resolvePackageSrcRootFromModule(moduleUrl: string): string {\n const marker = new URL('./register-shadow-bases.browser.js', moduleUrl);\n return normalizeDirectoryUrl(new URL('./', marker).href);\n}\n\n/** Register all known shadow bases from {@link setShadowPackageSrcRoot}. */\nexport function registerAllShadowBases(): void {\n if (!packageSrcRoot) {\n throw new Error('setShadowPackageSrcRoot must be called before registerAllShadowBases');\n }\n for (const [tag, dir] of Object.entries(SHADOW_ELEMENT_DIRS)) {\n registerShadowBase(tag, new URL(`./${dir}/`, packageSrcRoot).href);\n }\n}\n\n/** Register one shadow base when package root is configured (browser entry or Jest setup). */\nexport function ensureShadowBase(tag: string): void {\n if (tagToBaseUrl.has(tag)) {\n return;\n }\n if (!packageSrcRoot) {\n throw new Error(\n `Shadow base not registered for ${tag}. Import '@rosettadash/web-components' once in app code, or add the web-components Jest setup in test config.`,\n );\n }\n const dir = SHADOW_ELEMENT_DIRS[tag];\n if (!dir) {\n throw new Error(`Unknown shadow element tag: ${tag}`);\n }\n registerShadowBase(tag, new URL(`./${dir}/`, packageSrcRoot).href);\n}\n\n/** Resolve registered base URL for shadow asset loading. */\nexport function getShadowBase(tag: string): string {\n const base = tagToBaseUrl.get(tag);\n if (!base) {\n throw new Error(`Shadow base not registered for ${tag}`);\n }\n return base;\n}\n\n/** Load paired `.html` + `.css` for a registered element tag. */\nexport async function loadShadowPairForTag(\n tag: string,\n htmlFile: string,\n cssFile: string,\n): Promise<ShadowMountOptions> {\n ensureShadowBase(tag);\n const base = getShadowBase(tag);\n const [html, css] = await Promise.all([\n loadTextResource(htmlFile, base),\n loadTextResource(cssFile, base),\n ]);\n return { html, css };\n}\n\nexport { applyShadowMount } from './shadow-resources.js';\n", "import { DEFAULT_EQUIRECT_SOURCE } from '@rosettadash/core';\nimport { defineRosettaElement, type DashRow, readNumber, readString } from '../../../lib/element-utils.js';\nimport { applyShadowMount, ensureShadowBase, loadShadowPairForTag } from '../../../lib/shadow-base.js';\n\nexport const DB_VIDEO_SOURCE_TAG = 'rd-video-source';\n\nexport class RdVideoSourceElement extends HTMLElement {\n static readonly tagName = DB_VIDEO_SOURCE_TAG;\n\n static get observedAttributes(): string[] {\n return ['label', 'accept', 'source-width', 'source-height', 'presentation', 'hint'];\n }\n\n private inputEl: HTMLInputElement | null = null;\n private resourcesReady: Promise<void> | null = null;\n private changeListener: (() => void) | null = null;\n\n connectedCallback(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n this.resourcesReady = this.mountShadow();\n void this.resourcesReady.then(() => this.paint());\n }\n\n disconnectedCallback(): void {\n if (this.inputEl && this.changeListener) {\n this.inputEl.removeEventListener('change', this.changeListener);\n }\n this.changeListener = null;\n this.inputEl = null;\n }\n\n attributeChangedCallback(): void {\n if (this.resourcesReady) {\n void this.resourcesReady.then(() => this.paint());\n }\n }\n\n setProperty(name: string, value: unknown): void {\n (this as Record<string, unknown>)[name] = value;\n if (this.resourcesReady) {\n void this.resourcesReady.then(() => this.paint());\n }\n }\n\n whenReady(): Promise<void> {\n return this.resourcesReady ?? Promise.resolve();\n }\n\n get label(): string {\n return readString(this.getAttribute('label'), 'Video source');\n }\n\n get accept(): string {\n return readString(this.getAttribute('accept'), 'video/*');\n }\n\n get sourceWidth(): number {\n return readNumber(this.getAttribute('source-width'), DEFAULT_EQUIRECT_SOURCE.width);\n }\n\n get sourceHeight(): number {\n return readNumber(this.getAttribute('source-height'), DEFAULT_EQUIRECT_SOURCE.height);\n }\n\n get presentation(): string {\n return readString(this.getAttribute('presentation'), 'default');\n }\n\n get hint(): string {\n return readString(this.getAttribute('hint'), '');\n }\n\n private async mountShadow(): Promise<void> {\n const root = this.shadowRoot;\n if (!root || root.querySelector('.video-source')) {\n return;\n }\n const pair = await loadShadowPairForTag(\n DB_VIDEO_SOURCE_TAG,\n './rd-video-source.html',\n './rd-video-source.css',\n );\n applyShadowMount(root, pair);\n this.inputEl = root.querySelector('[data-ref=\"input\"]');\n this.changeListener = () => this.handleFileSelected();\n this.inputEl?.addEventListener('change', this.changeListener);\n this.paint();\n }\n\n private paint(): void {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const labelEl = root.querySelector('[data-ref=\"label\"]');\n const metaEl = root.querySelector('[data-ref=\"meta\"]');\n const rootEl = root.querySelector('[data-ref=\"root\"]');\n const headerEl = root.querySelector('[data-ref=\"header\"]');\n const uploadEl = root.querySelector('[data-ref=\"upload\"]');\n const uploadDefaultEl = root.querySelector('[data-ref=\"upload-default\"]');\n const uploadAuthoringEl = root.querySelector('[data-ref=\"upload-authoring\"]');\n const uploadFrameEl = root.querySelector('[data-ref=\"upload-frame\"]');\n const nameEl = root.querySelector('[data-ref=\"file-name\"]');\n const hintEl = root.querySelector('[data-ref=\"hint\"]');\n const isAuthoringSource = this.presentation === 'authoring-source';\n const isAuthoringFrame = this.presentation === 'authoring-frame';\n const isAuthoring = isAuthoringSource || isAuthoringFrame;\n\n rootEl?.classList.toggle('video-source--authoring', isAuthoringSource);\n rootEl?.classList.toggle('video-source--authoring-frame', isAuthoringFrame);\n if (headerEl instanceof HTMLElement) {\n headerEl.hidden = isAuthoring;\n }\n if (nameEl instanceof HTMLElement) {\n nameEl.hidden = isAuthoringFrame;\n }\n if (uploadEl instanceof HTMLElement) {\n uploadEl.classList.toggle('video-source__upload--authoring', isAuthoringSource);\n uploadEl.classList.toggle('video-source__upload--authoring-frame', isAuthoringFrame);\n }\n if (uploadDefaultEl instanceof HTMLElement) {\n uploadDefaultEl.hidden = isAuthoring;\n }\n if (uploadAuthoringEl instanceof HTMLElement) {\n uploadAuthoringEl.hidden = !isAuthoringSource;\n }\n if (uploadFrameEl instanceof HTMLElement) {\n uploadFrameEl.hidden = !isAuthoringFrame;\n }\n if (hintEl) {\n hintEl.textContent = this.hint;\n }\n\n if (labelEl) {\n labelEl.textContent = this.label;\n }\n if (metaEl) {\n metaEl.textContent = isAuthoring ? '' : `${this.sourceWidth}\u00D7${this.sourceHeight}`;\n }\n const input = root.querySelector('[data-ref=\"input\"]') as HTMLInputElement | null;\n if (input) {\n input.accept = this.accept;\n }\n }\n\n private handleFileSelected(): void {\n const file = this.inputEl?.files?.[0];\n if (!file) {\n return;\n }\n\n const nameEl = this.shadowRoot?.querySelector('[data-ref=\"file-name\"]');\n if (nameEl && this.presentation !== 'authoring-frame') {\n nameEl.textContent = file.name;\n }\n\n void this.probeVideoDimensions(file).then(({ width, height }) => {\n if (width > 0 && height > 0) {\n this.setAttribute('source-width', String(width));\n this.setAttribute('source-height', String(height));\n const metaEl = this.shadowRoot?.querySelector('[data-ref=\"meta\"]');\n const isAuthoring =\n this.presentation === 'authoring-source' || this.presentation === 'authoring-frame';\n if (metaEl && !isAuthoring) {\n metaEl.textContent = `${width}\u00D7${height}`;\n }\n const nameElAfter = this.shadowRoot?.querySelector('[data-ref=\"file-name\"]');\n if (nameElAfter && this.presentation === 'authoring-source') {\n nameElAfter.textContent = `${file.name} (${width}\u00D7${height})`;\n }\n }\n\n const metadata: DashRow = {\n name: file.name,\n sourceWidth: width > 0 ? width : this.sourceWidth,\n sourceHeight: height > 0 ? height : this.sourceHeight,\n size: file.size,\n };\n\n this.dispatchEvent(\n new CustomEvent('video-file', {\n detail: { file, metadata },\n bubbles: true,\n composed: true,\n }),\n );\n this.dispatchEvent(\n new CustomEvent('metadata', {\n detail: metadata,\n bubbles: true,\n composed: true,\n }),\n );\n });\n }\n\n private probeVideoDimensions(file: File): Promise<{ width: number; height: number }> {\n return new Promise((resolve) => {\n const url = URL.createObjectURL(file);\n const video = document.createElement('video');\n video.preload = 'metadata';\n video.onloadedmetadata = () => {\n const width = video.videoWidth;\n const height = video.videoHeight;\n URL.revokeObjectURL(url);\n resolve({ width, height });\n };\n video.onerror = () => {\n URL.revokeObjectURL(url);\n resolve({ width: 0, height: 0 });\n };\n video.src = url;\n });\n }\n}\n\nexport function registerRdVideoSource(): void {\n ensureShadowBase(DB_VIDEO_SOURCE_TAG);\n defineRosettaElement(RdVideoSourceElement.tagName, RdVideoSourceElement);\n}\n", "import {\n buildEquirectExtractFilter,\n DEFAULT_EQUIRECT_FLAT_CROP,\n DEFAULT_EQUIRECT_SOURCE,\n} from '@rosettadash/core';\nimport { defineRosettaElement, type DashRow, readNumber, readString } from '../../../lib/element-utils.js';\nimport { applyShadowMount, ensureShadowBase, getShadowBase, loadShadowPairForTag } from '../../../lib/shadow-base.js';\nimport { loadTextResource } from '../../../lib/shadow-resources.js';\n\nexport const DB_EQUIRECT_VIEWPORT_TAG = 'rd-equirect-viewport';\n\nexport type EquirectPreviewMode = 'flat-crop' | 'rectilinear';\n\nexport class RdEquirectViewportElement extends HTMLElement {\n static readonly tagName = DB_EQUIRECT_VIEWPORT_TAG;\n\n private resourcesReady: Promise<void> | null = null;\n\n static get observedAttributes(): string[] {\n return [\n 'label',\n 'preview-mode',\n 'source-width',\n 'source-height',\n 'crop-x',\n 'crop-y',\n 'crop-width',\n 'crop-height',\n 'output-width',\n 'output-height',\n 'yaw',\n 'pitch',\n 'horizontal-fov',\n ];\n }\n\n connectedCallback(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n this.resourcesReady = this.mountShadow();\n void this.resourcesReady.then(() => {\n this.paint();\n this.emitCropRegion();\n });\n }\n\n attributeChangedCallback(): void {\n if (this.shadowRoot && this.resourcesReady) {\n void this.resourcesReady.then(() => {\n this.paint();\n this.emitCropRegion();\n });\n }\n }\n\n whenReady(): Promise<void> {\n return this.resourcesReady ?? Promise.resolve();\n }\n\n setProperty(name: string, value: unknown): void {\n const attrMap: Record<string, string> = {\n previewMode: 'preview-mode',\n sourceWidth: 'source-width',\n sourceHeight: 'source-height',\n cropX: 'crop-x',\n cropY: 'crop-y',\n cropWidth: 'crop-width',\n cropHeight: 'crop-height',\n outputWidth: 'output-width',\n outputHeight: 'output-height',\n horizontalFov: 'horizontal-fov',\n };\n\n const attr = attrMap[name] ?? name;\n if (value === null || value === undefined) {\n this.removeAttribute(attr);\n } else {\n this.setAttribute(attr, String(value));\n }\n }\n\n get previewMode(): EquirectPreviewMode {\n const mode = readString(this.getAttribute('preview-mode'), 'flat-crop');\n return mode === 'rectilinear' ? 'rectilinear' : 'flat-crop';\n }\n\n get label(): string {\n return readString(this.getAttribute('label'), 'Equirect viewport');\n }\n\n get cropRegion(): DashRow {\n return {\n cropX: this.cropX,\n cropY: this.cropY,\n cropWidth: this.cropWidth,\n cropHeight: this.cropHeight,\n outputWidth: this.outputWidth,\n outputHeight: this.outputHeight,\n yaw: this.yaw,\n pitch: this.pitch,\n horizontalFov: this.horizontalFov,\n previewMode: this.previewMode,\n filter: buildEquirectExtractFilter(this.previewMode, {\n cropX: this.cropX,\n cropY: this.cropY,\n cropWidth: this.cropWidth,\n cropHeight: this.cropHeight,\n outputWidth: this.outputWidth,\n outputHeight: this.outputHeight,\n yaw: this.yaw,\n pitch: this.pitch,\n horizontalFov: this.horizontalFov,\n }),\n };\n }\n\n private get sourceWidth(): number {\n return readNumber(this.getAttribute('source-width'), DEFAULT_EQUIRECT_SOURCE.width);\n }\n\n private get sourceHeight(): number {\n return readNumber(this.getAttribute('source-height'), DEFAULT_EQUIRECT_SOURCE.height);\n }\n\n private get cropX(): number {\n return readNumber(this.getAttribute('crop-x'), DEFAULT_EQUIRECT_FLAT_CROP.cropX);\n }\n\n private get cropY(): number {\n return readNumber(this.getAttribute('crop-y'), DEFAULT_EQUIRECT_FLAT_CROP.cropY);\n }\n\n private get cropWidth(): number {\n return readNumber(this.getAttribute('crop-width'), DEFAULT_EQUIRECT_FLAT_CROP.cropWidth);\n }\n\n private get cropHeight(): number {\n return readNumber(this.getAttribute('crop-height'), DEFAULT_EQUIRECT_FLAT_CROP.cropHeight);\n }\n\n private get outputWidth(): number {\n return readNumber(this.getAttribute('output-width'), DEFAULT_EQUIRECT_FLAT_CROP.outputWidth);\n }\n\n private get outputHeight(): number {\n return readNumber(this.getAttribute('output-height'), DEFAULT_EQUIRECT_FLAT_CROP.outputHeight);\n }\n\n private get yaw(): number {\n return readNumber(this.getAttribute('yaw'), 0);\n }\n\n private get pitch(): number {\n return readNumber(this.getAttribute('pitch'), 0);\n }\n\n private get horizontalFov(): number {\n return readNumber(this.getAttribute('horizontal-fov'), 90);\n }\n\n private async mountShadow(): Promise<void> {\n const root = this.shadowRoot;\n if (!root || root.querySelector('[data-ref=\"root\"]')) {\n return;\n }\n const pair = await loadShadowPairForTag(\n DB_EQUIRECT_VIEWPORT_TAG,\n './rd-equirect-viewport.html',\n './rd-equirect-viewport.css',\n );\n const panelCss = await loadTextResource('../../../lib/panel.css', getShadowBase(DB_EQUIRECT_VIEWPORT_TAG));\n applyShadowMount(root, { html: pair.html, css: `${panelCss}\\n${pair.css}` });\n }\n\n private paint(): void {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cropLeftPct = (this.cropX / this.sourceWidth) * 100;\n const cropTopPct = (this.cropY / this.sourceHeight) * 100;\n const cropWidthPct = (this.cropWidth / this.sourceWidth) * 100;\n const cropHeightPct = (this.cropHeight / this.sourceHeight) * 100;\n\n const flatPreview = `\n <div class=\"equirect-frame\" style=\"aspect-ratio: ${this.sourceWidth} / ${this.sourceHeight}\">\n <div class=\"equirect-frame__crop\" style=\"left:${cropLeftPct}%;top:${cropTopPct}%;width:${cropWidthPct}%;height:${cropHeightPct}%\"></div>\n </div>\n `;\n\n const rectilinearPreview = `\n <div class=\"rectilinear-preview\">\n <div class=\"rectilinear-preview__cone\" style=\"transform: rotateY(${this.yaw}deg) rotateX(${-this.pitch}deg)\"></div>\n <dl class=\"rectilinear-preview__meta\">\n <div><dt>Yaw</dt><dd>${this.yaw}\u00B0</dd></div>\n <div><dt>Pitch</dt><dd>${this.pitch}\u00B0</dd></div>\n <div><dt>FOV</dt><dd>${this.horizontalFov}\u00B0</dd></div>\n </dl>\n </div>\n `;\n\n const labelEl = root.querySelector('[data-ref=\"label\"]');\n const modeEl = root.querySelector('[data-ref=\"mode\"]');\n if (labelEl) {\n labelEl.textContent = this.label;\n }\n if (modeEl) {\n modeEl.textContent = this.previewMode === 'flat-crop' ? 'Flat crop' : 'Rectilinear';\n }\n const preview = root.querySelector('[data-ref=\"preview\"]');\n if (preview) {\n preview.innerHTML = this.previewMode === 'flat-crop' ? flatPreview : rectilinearPreview;\n }\n const filterEl = root.querySelector('[data-ref=\"filter\"]');\n if (filterEl) {\n filterEl.textContent = String(this.cropRegion['filter']);\n }\n const outputEl = root.querySelector('[data-ref=\"output\"]');\n if (outputEl) {\n outputEl.textContent = `Output ${this.outputWidth}\u00D7${this.outputHeight}`;\n }\n }\n\n private emitCropRegion(): void {\n this.dispatchEvent(\n new CustomEvent('crop-region', {\n detail: this.cropRegion,\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n\nexport function registerRdEquirectViewport(): void {\n ensureShadowBase(DB_EQUIRECT_VIEWPORT_TAG);\n defineRosettaElement(RdEquirectViewportElement.tagName, RdEquirectViewportElement);\n}\n", "/** Extract an 11-char YouTube video id from a raw id or common URL forms. */\nexport function parseYouTubeVideoId(input: string | null | undefined): string | null {\n if (!input?.trim()) {\n return null;\n }\n\n const trimmed = input.trim();\n if (/^[a-zA-Z0-9_-]{11}$/.test(trimmed)) {\n return trimmed;\n }\n\n try {\n const url = new URL(trimmed);\n const host = url.hostname.replace(/^www\\./, '');\n\n if (host === 'youtu.be') {\n return url.pathname.slice(1).split('/')[0] || null;\n }\n\n if (host.includes('youtube.com') || host.includes('youtube-nocookie.com')) {\n const fromQuery = url.searchParams.get('v');\n if (fromQuery) {\n return fromQuery;\n }\n const embedMatch = url.pathname.match(/\\/embed\\/([^/?]+)/);\n if (embedMatch?.[1]) {\n return embedMatch[1];\n }\n const shortsMatch = url.pathname.match(/\\/shorts\\/([^/?]+)/);\n if (shortsMatch?.[1]) {\n return shortsMatch[1];\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nexport interface YouTubeEmbedParams {\n start?: number;\n autoplay?: boolean;\n mute?: boolean;\n controls?: boolean;\n}\n\n/** Privacy-enhanced embed URL (youtube-nocookie.com). */\nexport function buildYouTubeEmbedUrl(\n videoId: string,\n params: YouTubeEmbedParams = {},\n): string {\n const search = new URLSearchParams();\n if (params.start != null && params.start > 0) {\n search.set('start', String(Math.floor(params.start)));\n }\n if (params.autoplay) {\n search.set('autoplay', '1');\n }\n if (params.mute) {\n search.set('mute', '1');\n }\n if (params.controls === false) {\n search.set('controls', '0');\n }\n search.set('rel', '0');\n search.set('modestbranding', '1');\n\n const query = search.toString();\n return `https://www.youtube-nocookie.com/embed/${encodeURIComponent(videoId)}${query ? `?${query}` : ''}`;\n}\n", "import { defineRosettaElement, readNumber, readString } from '../../../lib/element-utils.js';\nimport { applyShadowMount, ensureShadowBase, loadShadowPairForTag } from '../../../lib/shadow-base.js';\nimport {\n buildYouTubeEmbedUrl,\n parseYouTubeVideoId,\n} from './parse-youtube-id.js';\n\nexport const DB_YOUTUBE_EMBED_TAG = 'rd-youtube-embed';\n\n/** Public props contract for visual/media/youtube-embed (all runtimes share this shape). */\nexport interface YoutubeEmbedProps {\n videoId?: string;\n url?: string;\n start?: number;\n autoplay?: boolean;\n mute?: boolean;\n controls?: boolean;\n title?: string;\n className?: string;\n}\n\nexport class RdYoutubeEmbedElement extends HTMLElement {\n static readonly tagName = DB_YOUTUBE_EMBED_TAG;\n\n private resourcesReady: Promise<void> | null = null;\n\n static get observedAttributes(): string[] {\n return ['video-id', 'url', 'start', 'autoplay', 'mute', 'controls', 'embed-title'];\n }\n\n connectedCallback(): void {\n if (!this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n this.resourcesReady = this.mountShadow();\n void this.resourcesReady.then(() => this.paint());\n }\n\n attributeChangedCallback(): void {\n if (this.shadowRoot && this.resourcesReady) {\n void this.resourcesReady.then(() => this.paint());\n }\n }\n\n setProperty(name: string, value: unknown): void {\n (this as Record<string, unknown>)[name] = value;\n if (this.resourcesReady) {\n void this.resourcesReady.then(() => this.paint());\n }\n }\n\n whenReady(): Promise<void> {\n return this.resourcesReady ?? Promise.resolve();\n }\n\n get videoId(): string {\n return readString(this.getAttribute('video-id'), '');\n }\n\n set videoId(value: string) {\n if (value) {\n this.setAttribute('video-id', value);\n } else {\n this.removeAttribute('video-id');\n }\n }\n\n get url(): string {\n return readString(this.getAttribute('url'), '');\n }\n\n set url(value: string) {\n if (value) {\n this.setAttribute('url', value);\n } else {\n this.removeAttribute('url');\n }\n }\n\n get start(): number {\n return readNumber(this.getAttribute('start'), 0);\n }\n\n get autoplay(): boolean {\n return this.hasAttribute('autoplay');\n }\n\n get mute(): boolean {\n return this.hasAttribute('mute');\n }\n\n get controls(): boolean {\n return !this.hasAttribute('controls') || this.getAttribute('controls') !== 'false';\n }\n\n get embedTitle(): string {\n return readString(this.getAttribute('embed-title'), 'YouTube video');\n }\n\n set embedTitle(value: string) {\n if (value) {\n this.setAttribute('embed-title', value);\n } else {\n this.removeAttribute('embed-title');\n }\n }\n\n private async mountShadow(): Promise<void> {\n const root = this.shadowRoot;\n if (!root || root.querySelector('[data-ref=\"root\"]')) {\n return;\n }\n const pair = await loadShadowPairForTag(\n DB_YOUTUBE_EMBED_TAG,\n './rd-youtube-embed.html',\n './rd-youtube-embed.css',\n );\n applyShadowMount(root, pair);\n }\n\n private resolveVideoId(): string | null {\n return parseYouTubeVideoId(this.videoId) ?? parseYouTubeVideoId(this.url);\n }\n\n private paint(): void {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const iframe = root.querySelector<HTMLIFrameElement>('[data-ref=\"iframe\"]');\n const empty = root.querySelector<HTMLElement>('[data-ref=\"empty\"]');\n if (!iframe || !empty) {\n return;\n }\n\n const id = this.resolveVideoId();\n if (!id) {\n iframe.removeAttribute('src');\n iframe.hidden = true;\n empty.hidden = false;\n return;\n }\n\n iframe.hidden = false;\n empty.hidden = true;\n iframe.title = this.embedTitle;\n (iframe as HTMLIFrameElement & { credentialless?: boolean }).credentialless = true;\n iframe.src = buildYouTubeEmbedUrl(id, {\n start: this.start,\n autoplay: this.autoplay,\n mute: this.mute,\n controls: this.controls,\n });\n }\n}\n\nexport function registerRdYoutubeEmbed(): void {\n ensureShadowBase(DB_YOUTUBE_EMBED_TAG);\n defineRosettaElement(DB_YOUTUBE_EMBED_TAG, RdYoutubeEmbedElement);\n}\n", "import { readString } from './element-utils.js';\n\nexport interface LinkListItem {\n label: string;\n href: string;\n}\n\nexport function parseLinkItems(raw: string | null): LinkListItem[] {\n if (!raw) {\n return [];\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed\n .map((entry) => {\n if (!entry || typeof entry !== 'object') {\n return null;\n }\n const record = entry as Record<string, unknown>;\n const label = readString(record['label'], '');\n const href = readString(record['href'], '');\n if (!label || !href) {\n return null;\n }\n return { label, href };\n })\n .filter((item): item is LinkListItem => item !== null);\n } catch {\n return [];\n }\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n", "import { readNumber, readString } from './element-utils.js';\nimport { escapeHtml } from './parse-link-items.js';\n\n/** Light-DOM atom base \u2014 renders taxonomy BEM markup; opt-in styles from styles.css. */\nexport abstract class RosettaAtomElement extends HTMLElement {\n private eventsWired = false;\n\n connectedCallback(): void {\n this.paint();\n if (!this.eventsWired) {\n this.wireEvents();\n this.eventsWired = true;\n }\n }\n\n attributeChangedCallback(_name: string): void {\n if (this.isConnected) {\n this.paint();\n }\n }\n\n /** Complex props (arrays/objects) synced from framework hosts via setProperty. */\n setProperty(name: string, value: unknown): void {\n (this as Record<string, unknown>)[name] = value;\n if (value === undefined || value === null) {\n this.removeAttribute(name);\n } else if (typeof value === 'object') {\n this.setAttribute(name, JSON.stringify(value));\n } else {\n this.setAttribute(name, String(value));\n }\n if (this.isConnected) {\n this.paint();\n }\n }\n\n whenReady(): Promise<void> {\n return Promise.resolve();\n }\n\n protected paint(): void {\n const preserved = this.preserveLightDomChildren();\n this.innerHTML = this.buildMarkup();\n this.restoreLightDomChildren(preserved);\n this.afterPaint();\n }\n\n protected preserveLightDomChildren(): Node[] {\n const slot = this.querySelector('[data-ref=\"slot\"]');\n if (slot) {\n return [...slot.childNodes];\n }\n return [...this.childNodes];\n }\n\n protected restoreLightDomChildren(nodes: Node[]): void {\n const slot = this.querySelector('[data-ref=\"slot\"]');\n if (!slot) {\n return;\n }\n for (const node of nodes) {\n slot.appendChild(node);\n }\n }\n\n protected abstract buildMarkup(): string;\n\n protected wireEvents(): void {\n /* override in interactive atoms */\n }\n\n protected afterPaint(): void {\n /* override */\n }\n\n protected readAttr(name: string, fallback = ''): string {\n return readString(this.getAttribute(name), fallback);\n }\n\n protected readBoolAttr(name: string, fallback = false): boolean {\n if (!this.hasAttribute(name)) {\n return fallback;\n }\n const raw = this.getAttribute(name);\n if (raw === '' || raw === 'true') {\n return true;\n }\n if (raw === 'false') {\n return false;\n }\n return fallback;\n }\n\n protected readNumAttr(name: string, fallback: number): number {\n return readNumber(this.getAttribute(name), fallback);\n }\n\n protected parseJsonAttr<T>(name: string, fallback: T): T {\n const raw = this.getAttribute(name);\n if (!raw) {\n return fallback;\n }\n try {\n return JSON.parse(raw) as T;\n } catch {\n return fallback;\n }\n }\n\n protected esc(value: string): string {\n return escapeHtml(value);\n }\n\n protected dispatchDetail<T>(type: string, detail: T): void {\n this.dispatchEvent(new CustomEvent(type, { detail, bubbles: true, composed: true }));\n }\n}\n\nexport { escapeHtml };\n", "import { defineRosettaElement } from '../../../lib/element-utils.js';\nimport { RosettaAtomElement } from '../../../lib/rosetta-atom-element.js';\n\nexport const RD_LIVE_CAPTURE_TAG = 'rd-live-capture';\n\nexport interface LiveCaptureProps {\n label?: string;\n onStart?: () => void;\n className?: string;\n style?: Record<string, string>;\n children?: unknown;\n}\n\n/** @rosettadash/web-components/visual/media/live-capture \u2014 visual.media.live-capture */\nexport class RdLiveCaptureElement extends RosettaAtomElement {\n static readonly tagName = RD_LIVE_CAPTURE_TAG;\n\n static get observedAttributes(): string[] {\n return [\"label\"];\n }\n\n protected buildMarkup(): string {\n const label = this.readAttr('label', 'Live capture');\n return `\n <section class=\"rd-media-live-capture\" data-testid=\"rd-media-live-capture\">\n <span class=\"rd-media__label\">${this.esc(label)}</span>\n <button type=\"button\" class=\"rd-button\" data-ref=\"start\">Start camera</button>\n <div data-ref=\"slot\"></div>\n </section>`;\n }\n}\n\nexport function registerRdLiveCapture(): void {\n defineRosettaElement(RD_LIVE_CAPTURE_TAG, RdLiveCaptureElement);\n}\n", "export { RdVideoSourceElement, DB_VIDEO_SOURCE_TAG, registerRdVideoSource } from './video-source/index.js';\nexport {\n RdEquirectViewportElement,\n DB_EQUIRECT_VIEWPORT_TAG,\n registerRdEquirectViewport,\n type EquirectPreviewMode,\n} from './equirect-viewport/index.js';\nexport {\n RdYoutubeEmbedElement,\n DB_YOUTUBE_EMBED_TAG,\n registerRdYoutubeEmbed,\n type YoutubeEmbedProps,\n} from './youtube-embed/index.js';\nexport { registerRdLiveCapture, RD_LIVE_CAPTURE_TAG, RdLiveCaptureElement } from './live-capture/index.js';\n\nimport { registerRdEquirectViewport } from './equirect-viewport/index.js';\nimport { registerRdLiveCapture } from './live-capture/index.js';\nimport { registerRdVideoSource } from './video-source/index.js';\nimport { registerRdYoutubeEmbed } from './youtube-embed/index.js';\n\nexport function registerRosettaDashMediaElements(): void {\n registerRdVideoSource();\n registerRdEquirectViewport();\n registerRdYoutubeEmbed();\n registerRdLiveCapture();\n}\n"],
|
|
5
|
+
"mappings": ";AAmBO,SAAS,4BAA4B,SAAkC,UAAU,OAAe;AACrG,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,CAAC;AACnD,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,CAAC;AACnD,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,SAAS,CAAC;AAC3D,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,UAAU,CAAC;AAC7D,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,WAAW,CAAC;AAC/D,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,YAAY,CAAC;AAEjE,QAAM,SAAS,QAAQ,SAAS,IAAI,UAAU,IAAI,KAAK,IAAI,KAAK,UAAU,WAAW,IAAI,YAAY;AACrG,SAAO,UAAU,GAAG,MAAM,aAAa;AACzC;AAGA,SAAS,WAAW,OAAuB;AACzC,SAAO,KAAK,MAAM,QAAQ,EAAE,IAAI;AAClC;AAEO,SAAS,+BAA+B,SAAqC,UAAU,OAAe;AAC3G,QAAM,MAAM,WAAW,OAAO,QAAQ,GAAG,KAAK,CAAC;AAC/C,QAAM,QAAQ,WAAW,OAAO,QAAQ,KAAK,KAAK,CAAC;AACnD,QAAM,OAAO,WAAW,OAAO,QAAQ,QAAQ,CAAC,KAAK,CAAC;AACtD,QAAM,gBAAgB,KAAK,IAAI,GAAG,OAAO,QAAQ,aAAa,KAAK,EAAE;AACrE,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,WAAW,CAAC;AAC/D,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,YAAY,CAAC;AAEjE,QAAM,SAAS;AAAA,IACb,8CAA8C,GAAG,UAAU,KAAK,SAAS,IAAI,UAAU,aAAa;AAAA,IACpG,SAAS,WAAW,IAAI,YAAY;AAAA,EACtC,EAAE,KAAK,GAAG;AACV,SAAO,UAAU,GAAG,MAAM,aAAa;AACzC;AAkBO,SAAS,2BACd,MACA,SACQ;AACR,QAAM,UAAU,QAAQ,QAAQ,OAAO;AACvC,MAAI,SAAS,eAAe;AAC1B,WAAO;AAAA,MACL;AAAA,QACE,KAAK,QAAQ,OAAO;AAAA,QACpB,OAAO,QAAQ,SAAS;AAAA,QACxB,MAAM,QAAQ,QAAQ;AAAA,QACtB,eAAe,QAAQ,iBAAiB;AAAA,QACxC,aAAa,QAAQ;AAAA,QACrB,cAAc,QAAQ;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE,OAAO,QAAQ,SAAS,2BAA2B;AAAA,MACnD,OAAO,QAAQ,SAAS,2BAA2B;AAAA,MACnD,WAAW,QAAQ,aAAa,2BAA2B;AAAA,MAC3D,YAAY,QAAQ,cAAc,2BAA2B;AAAA,MAC7D,aAAa,QAAQ;AAAA,MACrB,cAAc,QAAQ;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;AAGO,IAAM,0BAA0B,EAAE,OAAO,MAAM,QAAQ,KAAK;AAE5D,IAAM,6BAAsD;AAAA,EACjE,OAAO,KAAK,OAAO,wBAAwB,QAAQ,QAAQ,CAAC;AAAA,EAC5D,OAAO,KAAK,OAAO,wBAAwB,SAAS,OAAO,CAAC;AAAA,EAC5D,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAChB;;;ACzGO,SAAS,qBACd,SACA,MACA,SACM;AACN,MAAI,eAAe,IAAI,OAAO,GAAG;AAC/B;AAAA,EACF;AACA,MAAI,SAAS,SAAS;AACpB,mBAAe,OAAO,SAAS,MAAM,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAAA,EACnE,OAAO;AACL,mBAAe,OAAO,SAAS,IAAI;AAAA,EACrC;AACF;AAIO,SAAS,WAAW,OAAgB,UAA0B;AACnE,MAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACzD,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO,OAAO,SAAS,IAAI,IAAI,OAAO;AACxC;AAEO,SAAS,WAAW,OAAgB,UAA0B;AACnE,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;;;AC/BA,IAAM,YAAY,oBAAI,IAA6B;AAG5C,SAAS,iBAAiB,cAAsB,SAAkC;AACvF,QAAM,MAAM,IAAI,IAAI,cAAc,OAAO;AACzC,QAAM,WAAW,IAAI;AACrB,QAAM,SAAS,UAAU,IAAI,QAAQ;AACrC,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY;AAC3B,UAAM,WAAW,IAAI,IAAI,cAAc,OAAO;AAE9C,QAAI,aAAa,SAAS,MAAM,GAAG;AACjC,eAAS,aAAa,IAAI,OAAO,EAAE;AAAA,IACrC;AACA,UAAM,WAAW,MAAM,MAAM,QAAQ;AACrC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,kBAAkB,SAAS,IAAI,KAAK,SAAS,MAAM,EAAE;AAAA,IACvE;AACA,WAAO,SAAS,KAAK;AAAA,EACvB,GAAG;AAEH,YAAU,IAAI,UAAU,OAAO;AAC/B,SAAO;AACT;AAQO,SAAS,iBAAiB,MAAkB,SAAmC;AACpF,OAAK,YAAY;AACjB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,cAAc,QAAQ;AAC5B,OAAK,YAAY,KAAK;AAEtB,QAAM,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,YAAY,QAAQ;AAC7B,OAAK,YAAY,SAAS,QAAQ,UAAU,IAAI,CAAC;AACnD;;;ACxCO,IAAM,sBAA8C;AAAA,EACzD,gBAAgB;AAAA,EAChB,0BAA0B;AAAA,EAC1B,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,qBAAqB;AACvB;AAEA,IAAM,eAAe,oBAAI,IAAoB;AAC7C,IAAI,iBAAgC;AAG7B,SAAS,sBAAsB,WAA2B;AAC/D,QAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,QAAM,cAAc,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AACrD,MAAI,gBAAgB,KAAK,WAAW,GAAG;AACrC,QAAI,WAAW,IAAI,SAAS,QAAQ,YAAY,GAAG;AAAA,EACrD,WAAW,CAAC,IAAI,SAAS,SAAS,GAAG,GAAG;AACtC,QAAI,WAAW,GAAG,IAAI,QAAQ;AAAA,EAChC;AACA,SAAO,IAAI,KAAK,SAAS,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI;AACxD;AAGO,SAAS,mBAAmB,KAAa,SAAuB;AACrE,eAAa,IAAI,KAAK,sBAAsB,OAAO,CAAC;AACtD;AAwBO,SAAS,iBAAiB,KAAmB;AAClD,MAAI,aAAa,IAAI,GAAG,GAAG;AACzB;AAAA,EACF;AACA,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI;AAAA,MACR,kCAAkC,GAAG;AAAA,IACvC;AAAA,EACF;AACA,QAAM,MAAM,oBAAoB,GAAG;AACnC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,+BAA+B,GAAG,EAAE;AAAA,EACtD;AACA,qBAAmB,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,cAAc,EAAE,IAAI;AACnE;AAGO,SAAS,cAAc,KAAqB;AACjD,QAAM,OAAO,aAAa,IAAI,GAAG;AACjC,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,kCAAkC,GAAG,EAAE;AAAA,EACzD;AACA,SAAO;AACT;AAGA,eAAsB,qBACpB,KACA,UACA,SAC6B;AAC7B,mBAAiB,GAAG;AACpB,QAAM,OAAO,cAAc,GAAG;AAC9B,QAAM,CAAC,MAAM,GAAG,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpC,iBAAiB,UAAU,IAAI;AAAA,IAC/B,iBAAiB,SAAS,IAAI;AAAA,EAChC,CAAC;AACD,SAAO,EAAE,MAAM,IAAI;AACrB;;;AC5FO,IAAM,sBAAsB;AAE5B,IAAM,uBAAN,cAAmC,YAAY;AAAA,EAA/C;AAAA;AAOL,SAAQ,UAAmC;AAC3C,SAAQ,iBAAuC;AAC/C,SAAQ,iBAAsC;AAAA;AAAA,EAN9C,WAAW,qBAA+B;AACxC,WAAO,CAAC,SAAS,UAAU,gBAAgB,iBAAiB,gBAAgB,MAAM;AAAA,EACpF;AAAA,EAMA,oBAA0B;AACxB,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAAA,IACpC;AACA,SAAK,iBAAiB,KAAK,YAAY;AACvC,SAAK,KAAK,eAAe,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,EAClD;AAAA,EAEA,uBAA6B;AAC3B,QAAI,KAAK,WAAW,KAAK,gBAAgB;AACvC,WAAK,QAAQ,oBAAoB,UAAU,KAAK,cAAc;AAAA,IAChE;AACA,SAAK,iBAAiB;AACtB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,2BAAiC;AAC/B,QAAI,KAAK,gBAAgB;AACvB,WAAK,KAAK,eAAe,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,YAAY,MAAc,OAAsB;AAC9C,IAAC,KAAiC,IAAI,IAAI;AAC1C,QAAI,KAAK,gBAAgB;AACvB,WAAK,KAAK,eAAe,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,YAA2B;AACzB,WAAO,KAAK,kBAAkB,QAAQ,QAAQ;AAAA,EAChD;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,WAAW,KAAK,aAAa,OAAO,GAAG,cAAc;AAAA,EAC9D;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,WAAW,KAAK,aAAa,QAAQ,GAAG,SAAS;AAAA,EAC1D;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,WAAW,KAAK,aAAa,cAAc,GAAG,wBAAwB,KAAK;AAAA,EACpF;AAAA,EAEA,IAAI,eAAuB;AACzB,WAAO,WAAW,KAAK,aAAa,eAAe,GAAG,wBAAwB,MAAM;AAAA,EACtF;AAAA,EAEA,IAAI,eAAuB;AACzB,WAAO,WAAW,KAAK,aAAa,cAAc,GAAG,SAAS;AAAA,EAChE;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,WAAW,KAAK,aAAa,MAAM,GAAG,EAAE;AAAA,EACjD;AAAA,EAEA,MAAc,cAA6B;AACzC,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,QAAQ,KAAK,cAAc,eAAe,GAAG;AAChD;AAAA,IACF;AACA,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,qBAAiB,MAAM,IAAI;AAC3B,SAAK,UAAU,KAAK,cAAc,oBAAoB;AACtD,SAAK,iBAAiB,MAAM,KAAK,mBAAmB;AACpD,SAAK,SAAS,iBAAiB,UAAU,KAAK,cAAc;AAC5D,SAAK,MAAM;AAAA,EACb;AAAA,EAEQ,QAAc;AACpB,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,cAAc,oBAAoB;AACvD,UAAM,SAAS,KAAK,cAAc,mBAAmB;AACrD,UAAM,SAAS,KAAK,cAAc,mBAAmB;AACrD,UAAM,WAAW,KAAK,cAAc,qBAAqB;AACzD,UAAM,WAAW,KAAK,cAAc,qBAAqB;AACzD,UAAM,kBAAkB,KAAK,cAAc,6BAA6B;AACxE,UAAM,oBAAoB,KAAK,cAAc,+BAA+B;AAC5E,UAAM,gBAAgB,KAAK,cAAc,2BAA2B;AACpE,UAAM,SAAS,KAAK,cAAc,wBAAwB;AAC1D,UAAM,SAAS,KAAK,cAAc,mBAAmB;AACrD,UAAM,oBAAoB,KAAK,iBAAiB;AAChD,UAAM,mBAAmB,KAAK,iBAAiB;AAC/C,UAAM,cAAc,qBAAqB;AAEzC,YAAQ,UAAU,OAAO,2BAA2B,iBAAiB;AACrE,YAAQ,UAAU,OAAO,iCAAiC,gBAAgB;AAC1E,QAAI,oBAAoB,aAAa;AACnC,eAAS,SAAS;AAAA,IACpB;AACA,QAAI,kBAAkB,aAAa;AACjC,aAAO,SAAS;AAAA,IAClB;AACA,QAAI,oBAAoB,aAAa;AACnC,eAAS,UAAU,OAAO,mCAAmC,iBAAiB;AAC9E,eAAS,UAAU,OAAO,yCAAyC,gBAAgB;AAAA,IACrF;AACA,QAAI,2BAA2B,aAAa;AAC1C,sBAAgB,SAAS;AAAA,IAC3B;AACA,QAAI,6BAA6B,aAAa;AAC5C,wBAAkB,SAAS,CAAC;AAAA,IAC9B;AACA,QAAI,yBAAyB,aAAa;AACxC,oBAAc,SAAS,CAAC;AAAA,IAC1B;AACA,QAAI,QAAQ;AACV,aAAO,cAAc,KAAK;AAAA,IAC5B;AAEA,QAAI,SAAS;AACX,cAAQ,cAAc,KAAK;AAAA,IAC7B;AACA,QAAI,QAAQ;AACV,aAAO,cAAc,cAAc,KAAK,GAAG,KAAK,WAAW,OAAI,KAAK,YAAY;AAAA,IAClF;AACA,UAAM,QAAQ,KAAK,cAAc,oBAAoB;AACrD,QAAI,OAAO;AACT,YAAM,SAAS,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,qBAA2B;AACjC,UAAM,OAAO,KAAK,SAAS,QAAQ,CAAC;AACpC,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,YAAY,cAAc,wBAAwB;AACtE,QAAI,UAAU,KAAK,iBAAiB,mBAAmB;AACrD,aAAO,cAAc,KAAK;AAAA,IAC5B;AAEA,SAAK,KAAK,qBAAqB,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,MAAM;AAC/D,UAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,aAAK,aAAa,gBAAgB,OAAO,KAAK,CAAC;AAC/C,aAAK,aAAa,iBAAiB,OAAO,MAAM,CAAC;AACjD,cAAM,SAAS,KAAK,YAAY,cAAc,mBAAmB;AACjE,cAAM,cACJ,KAAK,iBAAiB,sBAAsB,KAAK,iBAAiB;AACpE,YAAI,UAAU,CAAC,aAAa;AAC1B,iBAAO,cAAc,GAAG,KAAK,OAAI,MAAM;AAAA,QACzC;AACA,cAAM,cAAc,KAAK,YAAY,cAAc,wBAAwB;AAC3E,YAAI,eAAe,KAAK,iBAAiB,oBAAoB;AAC3D,sBAAY,cAAc,GAAG,KAAK,IAAI,KAAK,KAAK,OAAI,MAAM;AAAA,QAC5D;AAAA,MACF;AAEA,YAAM,WAAoB;AAAA,QACxB,MAAM,KAAK;AAAA,QACX,aAAa,QAAQ,IAAI,QAAQ,KAAK;AAAA,QACtC,cAAc,SAAS,IAAI,SAAS,KAAK;AAAA,QACzC,MAAM,KAAK;AAAA,MACb;AAEA,WAAK;AAAA,QACH,IAAI,YAAY,cAAc;AAAA,UAC5B,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,WAAK;AAAA,QACH,IAAI,YAAY,YAAY;AAAA,UAC1B,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,qBAAqB,MAAwD;AACnF,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,YAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,UAAU;AAChB,YAAM,mBAAmB,MAAM;AAC7B,cAAM,QAAQ,MAAM;AACpB,cAAM,SAAS,MAAM;AACrB,YAAI,gBAAgB,GAAG;AACvB,gBAAQ,EAAE,OAAO,OAAO,CAAC;AAAA,MAC3B;AACA,YAAM,UAAU,MAAM;AACpB,YAAI,gBAAgB,GAAG;AACvB,gBAAQ,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AAAA,MACjC;AACA,YAAM,MAAM;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAnNa,qBACK,UAAU;AAoNrB,SAAS,wBAA8B;AAC5C,mBAAiB,mBAAmB;AACpC,uBAAqB,qBAAqB,SAAS,oBAAoB;AACzE;;;ACrNO,IAAM,2BAA2B;AAIjC,IAAM,4BAAN,cAAwC,YAAY;AAAA,EAApD;AAAA;AAGL,SAAQ,iBAAuC;AAAA;AAAA,EAE/C,WAAW,qBAA+B;AACxC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBAA0B;AACxB,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAAA,IACpC;AACA,SAAK,iBAAiB,KAAK,YAAY;AACvC,SAAK,KAAK,eAAe,KAAK,MAAM;AAClC,WAAK,MAAM;AACX,WAAK,eAAe;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,2BAAiC;AAC/B,QAAI,KAAK,cAAc,KAAK,gBAAgB;AAC1C,WAAK,KAAK,eAAe,KAAK,MAAM;AAClC,aAAK,MAAM;AACX,aAAK,eAAe;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,YAA2B;AACzB,WAAO,KAAK,kBAAkB,QAAQ,QAAQ;AAAA,EAChD;AAAA,EAEA,YAAY,MAAc,OAAsB;AAC9C,UAAM,UAAkC;AAAA,MACtC,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,cAAc;AAAA,MACd,eAAe;AAAA,IACjB;AAEA,UAAM,OAAO,QAAQ,IAAI,KAAK;AAC9B,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAK,gBAAgB,IAAI;AAAA,IAC3B,OAAO;AACL,WAAK,aAAa,MAAM,OAAO,KAAK,CAAC;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,IAAI,cAAmC;AACrC,UAAM,OAAO,WAAW,KAAK,aAAa,cAAc,GAAG,WAAW;AACtE,WAAO,SAAS,gBAAgB,gBAAgB;AAAA,EAClD;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,WAAW,KAAK,aAAa,OAAO,GAAG,mBAAmB;AAAA,EACnE;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,eAAe,KAAK;AAAA,MACpB,aAAa,KAAK;AAAA,MAClB,QAAQ,2BAA2B,KAAK,aAAa;AAAA,QACnD,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,WAAW,KAAK;AAAA,QAChB,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,KAAK,KAAK;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,eAAe,KAAK;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAY,cAAsB;AAChC,WAAO,WAAW,KAAK,aAAa,cAAc,GAAG,wBAAwB,KAAK;AAAA,EACpF;AAAA,EAEA,IAAY,eAAuB;AACjC,WAAO,WAAW,KAAK,aAAa,eAAe,GAAG,wBAAwB,MAAM;AAAA,EACtF;AAAA,EAEA,IAAY,QAAgB;AAC1B,WAAO,WAAW,KAAK,aAAa,QAAQ,GAAG,2BAA2B,KAAK;AAAA,EACjF;AAAA,EAEA,IAAY,QAAgB;AAC1B,WAAO,WAAW,KAAK,aAAa,QAAQ,GAAG,2BAA2B,KAAK;AAAA,EACjF;AAAA,EAEA,IAAY,YAAoB;AAC9B,WAAO,WAAW,KAAK,aAAa,YAAY,GAAG,2BAA2B,SAAS;AAAA,EACzF;AAAA,EAEA,IAAY,aAAqB;AAC/B,WAAO,WAAW,KAAK,aAAa,aAAa,GAAG,2BAA2B,UAAU;AAAA,EAC3F;AAAA,EAEA,IAAY,cAAsB;AAChC,WAAO,WAAW,KAAK,aAAa,cAAc,GAAG,2BAA2B,WAAW;AAAA,EAC7F;AAAA,EAEA,IAAY,eAAuB;AACjC,WAAO,WAAW,KAAK,aAAa,eAAe,GAAG,2BAA2B,YAAY;AAAA,EAC/F;AAAA,EAEA,IAAY,MAAc;AACxB,WAAO,WAAW,KAAK,aAAa,KAAK,GAAG,CAAC;AAAA,EAC/C;AAAA,EAEA,IAAY,QAAgB;AAC1B,WAAO,WAAW,KAAK,aAAa,OAAO,GAAG,CAAC;AAAA,EACjD;AAAA,EAEA,IAAY,gBAAwB;AAClC,WAAO,WAAW,KAAK,aAAa,gBAAgB,GAAG,EAAE;AAAA,EAC3D;AAAA,EAEA,MAAc,cAA6B;AACzC,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,QAAQ,KAAK,cAAc,mBAAmB,GAAG;AACpD;AAAA,IACF;AACA,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,WAAW,MAAM,iBAAiB,0BAA0B,cAAc,wBAAwB,CAAC;AACzG,qBAAiB,MAAM,EAAE,MAAM,KAAK,MAAM,KAAK,GAAG,QAAQ;AAAA,EAAK,KAAK,GAAG,GAAG,CAAC;AAAA,EAC7E;AAAA,EAEQ,QAAc;AACpB,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,cAAe,KAAK,QAAQ,KAAK,cAAe;AACtD,UAAM,aAAc,KAAK,QAAQ,KAAK,eAAgB;AACtD,UAAM,eAAgB,KAAK,YAAY,KAAK,cAAe;AAC3D,UAAM,gBAAiB,KAAK,aAAa,KAAK,eAAgB;AAE9D,UAAM,cAAc;AAAA,yDACiC,KAAK,WAAW,MAAM,KAAK,YAAY;AAAA,wDACxC,WAAW,SAAS,UAAU,WAAW,YAAY,YAAY,aAAa;AAAA;AAAA;AAIlI,UAAM,qBAAqB;AAAA;AAAA,2EAE4C,KAAK,GAAG,gBAAgB,CAAC,KAAK,KAAK;AAAA;AAAA,iCAE7E,KAAK,GAAG;AAAA,mCACN,KAAK,KAAK;AAAA,iCACZ,KAAK,aAAa;AAAA;AAAA;AAAA;AAK/C,UAAM,UAAU,KAAK,cAAc,oBAAoB;AACvD,UAAM,SAAS,KAAK,cAAc,mBAAmB;AACrD,QAAI,SAAS;AACX,cAAQ,cAAc,KAAK;AAAA,IAC7B;AACA,QAAI,QAAQ;AACV,aAAO,cAAc,KAAK,gBAAgB,cAAc,cAAc;AAAA,IACxE;AACA,UAAM,UAAU,KAAK,cAAc,sBAAsB;AACzD,QAAI,SAAS;AACX,cAAQ,YAAY,KAAK,gBAAgB,cAAc,cAAc;AAAA,IACvE;AACA,UAAM,WAAW,KAAK,cAAc,qBAAqB;AACzD,QAAI,UAAU;AACZ,eAAS,cAAc,OAAO,KAAK,WAAW,QAAQ,CAAC;AAAA,IACzD;AACA,UAAM,WAAW,KAAK,cAAc,qBAAqB;AACzD,QAAI,UAAU;AACZ,eAAS,cAAc,UAAU,KAAK,WAAW,OAAI,KAAK,YAAY;AAAA,IACxE;AAAA,EACF;AAAA,EAEQ,iBAAuB;AAC7B,SAAK;AAAA,MACH,IAAI,YAAY,eAAe;AAAA,QAC7B,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACF;AA7Na,0BACK,UAAU;AA8NrB,SAAS,6BAAmC;AACjD,mBAAiB,wBAAwB;AACzC,uBAAqB,0BAA0B,SAAS,yBAAyB;AACnF;;;AC9OO,SAAS,oBAAoB,OAAiD;AACnF,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,sBAAsB,KAAK,OAAO,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,UAAM,OAAO,IAAI,SAAS,QAAQ,UAAU,EAAE;AAE9C,QAAI,SAAS,YAAY;AACvB,aAAO,IAAI,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,IAChD;AAEA,QAAI,KAAK,SAAS,aAAa,KAAK,KAAK,SAAS,sBAAsB,GAAG;AACzE,YAAM,YAAY,IAAI,aAAa,IAAI,GAAG;AAC1C,UAAI,WAAW;AACb,eAAO;AAAA,MACT;AACA,YAAM,aAAa,IAAI,SAAS,MAAM,mBAAmB;AACzD,UAAI,aAAa,CAAC,GAAG;AACnB,eAAO,WAAW,CAAC;AAAA,MACrB;AACA,YAAM,cAAc,IAAI,SAAS,MAAM,oBAAoB;AAC3D,UAAI,cAAc,CAAC,GAAG;AACpB,eAAO,YAAY,CAAC;AAAA,MACtB;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAUO,SAAS,qBACd,SACA,SAA6B,CAAC,GACtB;AACR,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,OAAO,SAAS,QAAQ,OAAO,QAAQ,GAAG;AAC5C,WAAO,IAAI,SAAS,OAAO,KAAK,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,EACtD;AACA,MAAI,OAAO,UAAU;AACnB,WAAO,IAAI,YAAY,GAAG;AAAA,EAC5B;AACA,MAAI,OAAO,MAAM;AACf,WAAO,IAAI,QAAQ,GAAG;AAAA,EACxB;AACA,MAAI,OAAO,aAAa,OAAO;AAC7B,WAAO,IAAI,YAAY,GAAG;AAAA,EAC5B;AACA,SAAO,IAAI,OAAO,GAAG;AACrB,SAAO,IAAI,kBAAkB,GAAG;AAEhC,QAAM,QAAQ,OAAO,SAAS;AAC9B,SAAO,0CAA0C,mBAAmB,OAAO,CAAC,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE;AACzG;;;AC/DO,IAAM,uBAAuB;AAc7B,IAAM,wBAAN,cAAoC,YAAY;AAAA,EAAhD;AAAA;AAGL,SAAQ,iBAAuC;AAAA;AAAA,EAE/C,WAAW,qBAA+B;AACxC,WAAO,CAAC,YAAY,OAAO,SAAS,YAAY,QAAQ,YAAY,aAAa;AAAA,EACnF;AAAA,EAEA,oBAA0B;AACxB,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAAA,IACpC;AACA,SAAK,iBAAiB,KAAK,YAAY;AACvC,SAAK,KAAK,eAAe,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,EAClD;AAAA,EAEA,2BAAiC;AAC/B,QAAI,KAAK,cAAc,KAAK,gBAAgB;AAC1C,WAAK,KAAK,eAAe,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,YAAY,MAAc,OAAsB;AAC9C,IAAC,KAAiC,IAAI,IAAI;AAC1C,QAAI,KAAK,gBAAgB;AACvB,WAAK,KAAK,eAAe,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,YAA2B;AACzB,WAAO,KAAK,kBAAkB,QAAQ,QAAQ;AAAA,EAChD;AAAA,EAEA,IAAI,UAAkB;AACpB,WAAO,WAAW,KAAK,aAAa,UAAU,GAAG,EAAE;AAAA,EACrD;AAAA,EAEA,IAAI,QAAQ,OAAe;AACzB,QAAI,OAAO;AACT,WAAK,aAAa,YAAY,KAAK;AAAA,IACrC,OAAO;AACL,WAAK,gBAAgB,UAAU;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,IAAI,MAAc;AAChB,WAAO,WAAW,KAAK,aAAa,KAAK,GAAG,EAAE;AAAA,EAChD;AAAA,EAEA,IAAI,IAAI,OAAe;AACrB,QAAI,OAAO;AACT,WAAK,aAAa,OAAO,KAAK;AAAA,IAChC,OAAO;AACL,WAAK,gBAAgB,KAAK;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,WAAW,KAAK,aAAa,OAAO,GAAG,CAAC;AAAA,EACjD;AAAA,EAEA,IAAI,WAAoB;AACtB,WAAO,KAAK,aAAa,UAAU;AAAA,EACrC;AAAA,EAEA,IAAI,OAAgB;AAClB,WAAO,KAAK,aAAa,MAAM;AAAA,EACjC;AAAA,EAEA,IAAI,WAAoB;AACtB,WAAO,CAAC,KAAK,aAAa,UAAU,KAAK,KAAK,aAAa,UAAU,MAAM;AAAA,EAC7E;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,WAAW,KAAK,aAAa,aAAa,GAAG,eAAe;AAAA,EACrE;AAAA,EAEA,IAAI,WAAW,OAAe;AAC5B,QAAI,OAAO;AACT,WAAK,aAAa,eAAe,KAAK;AAAA,IACxC,OAAO;AACL,WAAK,gBAAgB,aAAa;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAc,cAA6B;AACzC,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,QAAQ,KAAK,cAAc,mBAAmB,GAAG;AACpD;AAAA,IACF;AACA,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,qBAAiB,MAAM,IAAI;AAAA,EAC7B;AAAA,EAEQ,iBAAgC;AACtC,WAAO,oBAAoB,KAAK,OAAO,KAAK,oBAAoB,KAAK,GAAG;AAAA,EAC1E;AAAA,EAEQ,QAAc;AACpB,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,cAAiC,qBAAqB;AAC1E,UAAM,QAAQ,KAAK,cAA2B,oBAAoB;AAClE,QAAI,CAAC,UAAU,CAAC,OAAO;AACrB;AAAA,IACF;AAEA,UAAM,KAAK,KAAK,eAAe;AAC/B,QAAI,CAAC,IAAI;AACP,aAAO,gBAAgB,KAAK;AAC5B,aAAO,SAAS;AAChB,YAAM,SAAS;AACf;AAAA,IACF;AAEA,WAAO,SAAS;AAChB,UAAM,SAAS;AACf,WAAO,QAAQ,KAAK;AACpB,IAAC,OAA4D,iBAAiB;AAC9E,WAAO,MAAM,qBAAqB,IAAI;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,IACjB,CAAC;AAAA,EACH;AACF;AAtIa,sBACK,UAAU;AAuIrB,SAAS,yBAA+B;AAC7C,mBAAiB,oBAAoB;AACrC,uBAAqB,sBAAsB,qBAAqB;AAClE;;;AC7HO,SAAS,WAAW,OAAuB;AAChD,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;;;ACrCO,IAAe,qBAAf,cAA0C,YAAY;AAAA,EAAtD;AAAA;AACL,SAAQ,cAAc;AAAA;AAAA,EAEtB,oBAA0B;AACxB,SAAK,MAAM;AACX,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,WAAW;AAChB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,yBAAyB,OAAqB;AAC5C,QAAI,KAAK,aAAa;AACpB,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,MAAc,OAAsB;AAC9C,IAAC,KAAiC,IAAI,IAAI;AAC1C,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAK,gBAAgB,IAAI;AAAA,IAC3B,WAAW,OAAO,UAAU,UAAU;AACpC,WAAK,aAAa,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,IAC/C,OAAO;AACL,WAAK,aAAa,MAAM,OAAO,KAAK,CAAC;AAAA,IACvC;AACA,QAAI,KAAK,aAAa;AACpB,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,YAA2B;AACzB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEU,QAAc;AACtB,UAAM,YAAY,KAAK,yBAAyB;AAChD,SAAK,YAAY,KAAK,YAAY;AAClC,SAAK,wBAAwB,SAAS;AACtC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEU,2BAAmC;AAC3C,UAAM,OAAO,KAAK,cAAc,mBAAmB;AACnD,QAAI,MAAM;AACR,aAAO,CAAC,GAAG,KAAK,UAAU;AAAA,IAC5B;AACA,WAAO,CAAC,GAAG,KAAK,UAAU;AAAA,EAC5B;AAAA,EAEU,wBAAwB,OAAqB;AACrD,UAAM,OAAO,KAAK,cAAc,mBAAmB;AACnD,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,eAAW,QAAQ,OAAO;AACxB,WAAK,YAAY,IAAI;AAAA,IACvB;AAAA,EACF;AAAA,EAIU,aAAmB;AAAA,EAE7B;AAAA,EAEU,aAAmB;AAAA,EAE7B;AAAA,EAEU,SAAS,MAAc,WAAW,IAAY;AACtD,WAAO,WAAW,KAAK,aAAa,IAAI,GAAG,QAAQ;AAAA,EACrD;AAAA,EAEU,aAAa,MAAc,WAAW,OAAgB;AAC9D,QAAI,CAAC,KAAK,aAAa,IAAI,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,UAAM,MAAM,KAAK,aAAa,IAAI;AAClC,QAAI,QAAQ,MAAM,QAAQ,QAAQ;AAChC,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,SAAS;AACnB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEU,YAAY,MAAc,UAA0B;AAC5D,WAAO,WAAW,KAAK,aAAa,IAAI,GAAG,QAAQ;AAAA,EACrD;AAAA,EAEU,cAAiB,MAAc,UAAgB;AACvD,UAAM,MAAM,KAAK,aAAa,IAAI;AAClC,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEU,IAAI,OAAuB;AACnC,WAAO,WAAW,KAAK;AAAA,EACzB;AAAA,EAEU,eAAkB,MAAc,QAAiB;AACzD,SAAK,cAAc,IAAI,YAAY,MAAM,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC;AAAA,EACrF;AACF;;;ACjHO,IAAM,sBAAsB;AAW5B,IAAM,uBAAN,cAAmC,mBAAmB;AAAA,EAG3D,WAAW,qBAA+B;AACxC,WAAO,CAAC,OAAO;AAAA,EACjB;AAAA,EAEU,cAAsB;AAC9B,UAAM,QAAQ,KAAK,SAAS,SAAS,cAAc;AACnD,WAAO;AAAA;AAAA,wCAE6B,KAAK,IAAI,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,EAIrD;AACF;AAhBa,qBACK,UAAU;AAiBrB,SAAS,wBAA8B;AAC5C,uBAAqB,qBAAqB,oBAAoB;AAChE;;;ACdO,SAAS,mCAAyC;AACvD,wBAAsB;AACtB,6BAA2B;AAC3B,yBAAuB;AACvB,wBAAsB;AACxB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|