@fusion.dev/helix-headless 0.0.0-dev
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/LICENSE +21 -0
- package/custom-elements.json +75202 -0
- package/dist/accordion/index.d.ts +2 -0
- package/dist/accordion/index.js +2 -0
- package/dist/accordion/item/accordion-item.d.ts +141 -0
- package/dist/accordion/item/accordion-item.js +214 -0
- package/dist/accordion/root/accordion-root.d.ts +57 -0
- package/dist/accordion/root/accordion-root.js +96 -0
- package/dist/announcement/index.d.ts +1 -0
- package/dist/announcement/index.js +1 -0
- package/dist/announcement/root/announcement-root.d.ts +106 -0
- package/dist/announcement/root/announcement-root.js +144 -0
- package/dist/app-header/index.d.ts +1 -0
- package/dist/app-header/index.js +1 -0
- package/dist/app-header/root/app-header-root.d.ts +113 -0
- package/dist/app-header/root/app-header-root.js +147 -0
- package/dist/avatar/group/avatar-group.d.ts +116 -0
- package/dist/avatar/group/avatar-group.js +136 -0
- package/dist/avatar/index.d.ts +2 -0
- package/dist/avatar/index.js +2 -0
- package/dist/avatar/root/avatar-root.d.ts +71 -0
- package/dist/avatar/root/avatar-root.js +147 -0
- package/dist/badge/index.d.ts +1 -0
- package/dist/badge/index.js +1 -0
- package/dist/badge/root/badge-root.d.ts +61 -0
- package/dist/badge/root/badge-root.js +121 -0
- package/dist/bar-chart/index.d.ts +1 -0
- package/dist/bar-chart/index.js +1 -0
- package/dist/bar-chart/root/bar-chart-root.d.ts +266 -0
- package/dist/bar-chart/root/bar-chart-root.js +515 -0
- package/dist/blockquote/index.d.ts +1 -0
- package/dist/blockquote/index.js +1 -0
- package/dist/blockquote/root/blockquote-root.d.ts +51 -0
- package/dist/blockquote/root/blockquote-root.js +84 -0
- package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +104 -0
- package/dist/breadcrumbs/breadcrumb/breadcrumb.js +137 -0
- package/dist/breadcrumbs/index.d.ts +2 -0
- package/dist/breadcrumbs/index.js +2 -0
- package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +77 -0
- package/dist/breadcrumbs/root/breadcrumbs-root.js +94 -0
- package/dist/button/index.d.ts +1 -0
- package/dist/button/index.js +1 -0
- package/dist/button/root/button-root.d.ts +251 -0
- package/dist/button/root/button-root.js +401 -0
- package/dist/button-group/index.d.ts +1 -0
- package/dist/button-group/index.js +1 -0
- package/dist/button-group/root/button-group-root.d.ts +62 -0
- package/dist/button-group/root/button-group-root.js +62 -0
- package/dist/callout/index.d.ts +1 -0
- package/dist/callout/index.js +1 -0
- package/dist/callout/root/callout-root.d.ts +72 -0
- package/dist/callout/root/callout-root.js +90 -0
- package/dist/card/index.d.ts +1 -0
- package/dist/card/index.js +1 -0
- package/dist/card/root/card-root.d.ts +54 -0
- package/dist/card/root/card-root.js +71 -0
- package/dist/carousel/index.d.ts +1 -0
- package/dist/carousel/index.js +1 -0
- package/dist/carousel/root/carousel-root.d.ts +399 -0
- package/dist/carousel/root/carousel-root.js +723 -0
- package/dist/chat/composer/chat-composer.d.ts +160 -0
- package/dist/chat/composer/chat-composer.js +273 -0
- package/dist/chat/index.d.ts +3 -0
- package/dist/chat/index.js +3 -0
- package/dist/chat/message/chat-message.d.ts +170 -0
- package/dist/chat/message/chat-message.js +271 -0
- package/dist/chat/root/chat-root.d.ts +216 -0
- package/dist/chat/root/chat-root.js +389 -0
- package/dist/checkbox/index.d.ts +1 -0
- package/dist/checkbox/index.js +1 -0
- package/dist/checkbox/root/checkbox-root.d.ts +108 -0
- package/dist/checkbox/root/checkbox-root.js +207 -0
- package/dist/checkbox-group/index.d.ts +1 -0
- package/dist/checkbox-group/index.js +1 -0
- package/dist/checkbox-group/root/checkbox-group-root.d.ts +155 -0
- package/dist/checkbox-group/root/checkbox-group-root.js +293 -0
- package/dist/code/index.d.ts +1 -0
- package/dist/code/index.js +1 -0
- package/dist/code/root/code-root.d.ts +36 -0
- package/dist/code/root/code-root.js +43 -0
- package/dist/code-block/index.d.ts +1 -0
- package/dist/code-block/index.js +1 -0
- package/dist/code-block/root/code-block-root.d.ts +112 -0
- package/dist/code-block/root/code-block-root.js +155 -0
- package/dist/color-input/index.d.ts +1 -0
- package/dist/color-input/index.js +1 -0
- package/dist/color-input/root/color-input-root.d.ts +227 -0
- package/dist/color-input/root/color-input-root.js +456 -0
- package/dist/color-picker/color.d.ts +74 -0
- package/dist/color-picker/color.js +238 -0
- package/dist/color-picker/index.d.ts +2 -0
- package/dist/color-picker/index.js +2 -0
- package/dist/color-picker/root/color-picker-root.d.ts +303 -0
- package/dist/color-picker/root/color-picker-root.js +576 -0
- package/dist/combobox/index.d.ts +1 -0
- package/dist/combobox/index.js +1 -0
- package/dist/combobox/root/combobox-root.d.ts +396 -0
- package/dist/combobox/root/combobox-root.js +808 -0
- package/dist/command/index.d.ts +1 -0
- package/dist/command/index.js +1 -0
- package/dist/command/root/command-root.d.ts +166 -0
- package/dist/command/root/command-root.js +353 -0
- package/dist/copy-button/index.d.ts +1 -0
- package/dist/copy-button/index.js +1 -0
- package/dist/copy-button/root/copy-button-root.d.ts +154 -0
- package/dist/copy-button/root/copy-button-root.js +225 -0
- package/dist/data-table/index.d.ts +2 -0
- package/dist/data-table/index.js +2 -0
- package/dist/data-table/root/data-table-root.d.ts +392 -0
- package/dist/data-table/root/data-table-root.js +729 -0
- package/dist/data-table/root/order.d.ts +116 -0
- package/dist/data-table/root/order.js +175 -0
- package/dist/date-input/index.d.ts +1 -0
- package/dist/date-input/index.js +1 -0
- package/dist/date-input/root/date-input-root.d.ts +361 -0
- package/dist/date-input/root/date-input-root.js +791 -0
- package/dist/date-picker/index.d.ts +1 -0
- package/dist/date-picker/index.js +1 -0
- package/dist/date-picker/root/date-picker-root.d.ts +361 -0
- package/dist/date-picker/root/date-picker-root.js +837 -0
- package/dist/dialog/index.d.ts +1 -0
- package/dist/dialog/index.js +1 -0
- package/dist/dialog/root/dialog-root.d.ts +185 -0
- package/dist/dialog/root/dialog-root.js +319 -0
- package/dist/divider/index.d.ts +1 -0
- package/dist/divider/index.js +1 -0
- package/dist/divider/root/divider-root.d.ts +68 -0
- package/dist/divider/root/divider-root.js +116 -0
- package/dist/donut-chart/index.d.ts +1 -0
- package/dist/donut-chart/index.js +1 -0
- package/dist/donut-chart/root/donut-chart-root.d.ts +209 -0
- package/dist/donut-chart/root/donut-chart-root.js +395 -0
- package/dist/drawer/index.d.ts +1 -0
- package/dist/drawer/index.js +1 -0
- package/dist/drawer/root/drawer-root.d.ts +144 -0
- package/dist/drawer/root/drawer-root.js +222 -0
- package/dist/drilldown/index.d.ts +2 -0
- package/dist/drilldown/index.js +2 -0
- package/dist/drilldown/item/drilldown-item.d.ts +87 -0
- package/dist/drilldown/item/drilldown-item.js +152 -0
- package/dist/drilldown/root/drilldown-root.d.ts +115 -0
- package/dist/drilldown/root/drilldown-root.js +263 -0
- package/dist/element-events.generated.d.ts +1 -0
- package/dist/element-events.generated.js +125 -0
- package/dist/empty/index.d.ts +1 -0
- package/dist/empty/index.js +1 -0
- package/dist/empty/root/empty-root.d.ts +47 -0
- package/dist/empty/root/empty-root.js +68 -0
- package/dist/file-input/index.d.ts +1 -0
- package/dist/file-input/index.js +1 -0
- package/dist/file-input/root/file-input-root.d.ts +196 -0
- package/dist/file-input/root/file-input-root.js +488 -0
- package/dist/format-date/index.d.ts +1 -0
- package/dist/format-date/index.js +1 -0
- package/dist/format-date/root/format-date-root.d.ts +151 -0
- package/dist/format-date/root/format-date-root.js +266 -0
- package/dist/heatmap/index.d.ts +2 -0
- package/dist/heatmap/index.js +2 -0
- package/dist/heatmap/root/buckets.d.ts +62 -0
- package/dist/heatmap/root/buckets.js +85 -0
- package/dist/heatmap/root/heatmap-root.d.ts +330 -0
- package/dist/heatmap/root/heatmap-root.js +526 -0
- package/dist/icon/index.d.ts +1 -0
- package/dist/icon/index.js +1 -0
- package/dist/icon/root/icon-root.d.ts +53 -0
- package/dist/icon/root/icon-root.js +93 -0
- package/dist/icon-button/index.d.ts +1 -0
- package/dist/icon-button/index.js +1 -0
- package/dist/icon-button/root/icon-button-root.d.ts +40 -0
- package/dist/icon-button/root/icon-button-root.js +46 -0
- package/dist/image/index.d.ts +1 -0
- package/dist/image/index.js +1 -0
- package/dist/image/root/image-root.d.ts +213 -0
- package/dist/image/root/image-root.js +335 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.js +99 -0
- package/dist/input/index.d.ts +1 -0
- package/dist/input/index.js +1 -0
- package/dist/input/root/input-root.d.ts +281 -0
- package/dist/input/root/input-root.js +472 -0
- package/dist/kbd/index.d.ts +1 -0
- package/dist/kbd/index.js +1 -0
- package/dist/kbd/root/kbd-root.d.ts +98 -0
- package/dist/kbd/root/kbd-root.js +230 -0
- package/dist/legend/index.d.ts +1 -0
- package/dist/legend/index.js +1 -0
- package/dist/legend/root/legend-root.d.ts +83 -0
- package/dist/legend/root/legend-root.js +125 -0
- package/dist/line-chart/index.d.ts +1 -0
- package/dist/line-chart/index.js +1 -0
- package/dist/line-chart/root/line-chart-root.d.ts +238 -0
- package/dist/line-chart/root/line-chart-root.js +365 -0
- package/dist/list/index.d.ts +2 -0
- package/dist/list/index.js +2 -0
- package/dist/list/item/list-item.d.ts +95 -0
- package/dist/list/item/list-item.js +148 -0
- package/dist/list/root/list-root.d.ts +72 -0
- package/dist/list/root/list-root.js +61 -0
- package/dist/listbox/index.d.ts +1 -0
- package/dist/listbox/index.js +1 -0
- package/dist/listbox/root/listbox-root.d.ts +357 -0
- package/dist/listbox/root/listbox-root.js +890 -0
- package/dist/loader/index.d.ts +1 -0
- package/dist/loader/index.js +1 -0
- package/dist/loader/root/loader-root.d.ts +52 -0
- package/dist/loader/root/loader-root.js +74 -0
- package/dist/megamenu/index.d.ts +1 -0
- package/dist/megamenu/index.js +1 -0
- package/dist/megamenu/root/megamenu-root.d.ts +254 -0
- package/dist/megamenu/root/megamenu-root.js +526 -0
- package/dist/menu/index.d.ts +2 -0
- package/dist/menu/index.js +2 -0
- package/dist/menu/item/menu-item.d.ts +231 -0
- package/dist/menu/item/menu-item.js +405 -0
- package/dist/menu/root/menu-root.d.ts +158 -0
- package/dist/menu/root/menu-root.js +422 -0
- package/dist/meter/index.d.ts +1 -0
- package/dist/meter/index.js +1 -0
- package/dist/meter/root/meter-root.d.ts +234 -0
- package/dist/meter/root/meter-root.js +316 -0
- package/dist/navigation/index.d.ts +1 -0
- package/dist/navigation/index.js +1 -0
- package/dist/navigation/root/navigation-root.d.ts +55 -0
- package/dist/navigation/root/navigation-root.js +130 -0
- package/dist/notifications/index.d.ts +2 -0
- package/dist/notifications/index.js +2 -0
- package/dist/notifications/notification/notification.d.ts +181 -0
- package/dist/notifications/notification/notification.js +305 -0
- package/dist/notifications/root/notifications-root.d.ts +168 -0
- package/dist/notifications/root/notifications-root.js +291 -0
- package/dist/number-input/index.d.ts +1 -0
- package/dist/number-input/index.js +1 -0
- package/dist/number-input/root/number-input-root.d.ts +282 -0
- package/dist/number-input/root/number-input-root.js +592 -0
- package/dist/option/group/option-group.d.ts +38 -0
- package/dist/option/group/option-group.js +58 -0
- package/dist/option/index.d.ts +2 -0
- package/dist/option/index.js +2 -0
- package/dist/option/root/option-root.d.ts +194 -0
- package/dist/option/root/option-root.js +247 -0
- package/dist/outline/index.d.ts +1 -0
- package/dist/outline/index.js +1 -0
- package/dist/outline/root/outline-root.d.ts +237 -0
- package/dist/outline/root/outline-root.js +519 -0
- package/dist/pagination/index.d.ts +3 -0
- package/dist/pagination/index.js +3 -0
- package/dist/pagination/root/pagination-root.d.ts +390 -0
- package/dist/pagination/root/pagination-root.js +695 -0
- package/dist/pagination/size/pagination-size.d.ts +127 -0
- package/dist/pagination/size/pagination-size.js +232 -0
- package/dist/pagination/summary/pagination-summary.d.ts +90 -0
- package/dist/pagination/summary/pagination-summary.js +145 -0
- package/dist/pin-input/index.d.ts +1 -0
- package/dist/pin-input/index.js +1 -0
- package/dist/pin-input/root/pin-input-root.d.ts +292 -0
- package/dist/pin-input/root/pin-input-root.js +553 -0
- package/dist/popover/index.d.ts +1 -0
- package/dist/popover/index.js +1 -0
- package/dist/popover/root/popover-root.d.ts +108 -0
- package/dist/popover/root/popover-root.js +231 -0
- package/dist/progress/index.d.ts +1 -0
- package/dist/progress/index.js +1 -0
- package/dist/progress/root/progress-root.d.ts +125 -0
- package/dist/progress/root/progress-root.js +212 -0
- package/dist/qr-code/index.d.ts +1 -0
- package/dist/qr-code/index.js +1 -0
- package/dist/qr-code/root/qr-code-root.d.ts +93 -0
- package/dist/qr-code/root/qr-code-root.js +233 -0
- package/dist/quote/index.d.ts +1 -0
- package/dist/quote/index.js +1 -0
- package/dist/quote/root/quote-root.d.ts +36 -0
- package/dist/quote/root/quote-root.js +50 -0
- package/dist/radio/group/radio-group.d.ts +84 -0
- package/dist/radio/group/radio-group.js +170 -0
- package/dist/radio/index.d.ts +2 -0
- package/dist/radio/index.js +2 -0
- package/dist/radio/root/radio-root.d.ts +102 -0
- package/dist/radio/root/radio-root.js +151 -0
- package/dist/rating/index.d.ts +1 -0
- package/dist/rating/index.js +1 -0
- package/dist/rating/root/rating-root.d.ts +242 -0
- package/dist/rating/root/rating-root.js +484 -0
- package/dist/scroll-area/index.d.ts +1 -0
- package/dist/scroll-area/index.js +1 -0
- package/dist/scroll-area/root/scroll-area-root.d.ts +96 -0
- package/dist/scroll-area/root/scroll-area-root.js +215 -0
- package/dist/select/index.d.ts +1 -0
- package/dist/select/index.js +1 -0
- package/dist/select/root/select-root.d.ts +170 -0
- package/dist/select/root/select-root.js +419 -0
- package/dist/skeleton/index.d.ts +1 -0
- package/dist/skeleton/index.js +1 -0
- package/dist/skeleton/root/skeleton-root.d.ts +31 -0
- package/dist/skeleton/root/skeleton-root.js +42 -0
- package/dist/slider/index.d.ts +1 -0
- package/dist/slider/index.js +1 -0
- package/dist/slider/root/slider-root.d.ts +235 -0
- package/dist/slider/root/slider-root.js +488 -0
- package/dist/sparkline/index.d.ts +1 -0
- package/dist/sparkline/index.js +1 -0
- package/dist/sparkline/root/sparkline-root.d.ts +147 -0
- package/dist/sparkline/root/sparkline-root.js +278 -0
- package/dist/speed-dial/index.d.ts +2 -0
- package/dist/speed-dial/index.js +2 -0
- package/dist/speed-dial/item/speed-dial-item.d.ts +71 -0
- package/dist/speed-dial/item/speed-dial-item.js +113 -0
- package/dist/speed-dial/root/speed-dial-root.d.ts +122 -0
- package/dist/speed-dial/root/speed-dial-root.js +251 -0
- package/dist/splitter/index.d.ts +1 -0
- package/dist/splitter/index.js +1 -0
- package/dist/splitter/root/splitter-root.d.ts +491 -0
- package/dist/splitter/root/splitter-root.js +1030 -0
- package/dist/stat/group/stat-group.d.ts +30 -0
- package/dist/stat/group/stat-group.js +47 -0
- package/dist/stat/index.d.ts +2 -0
- package/dist/stat/index.js +2 -0
- package/dist/stat/root/stat-root.d.ts +62 -0
- package/dist/stat/root/stat-root.js +51 -0
- package/dist/steps/index.d.ts +2 -0
- package/dist/steps/index.js +2 -0
- package/dist/steps/root/steps-root.d.ts +110 -0
- package/dist/steps/root/steps-root.js +130 -0
- package/dist/steps/step/step.d.ts +139 -0
- package/dist/steps/step/step.js +215 -0
- package/dist/switch/index.d.ts +1 -0
- package/dist/switch/index.js +1 -0
- package/dist/switch/root/switch-root.d.ts +74 -0
- package/dist/switch/root/switch-root.js +153 -0
- package/dist/table/cell/table-cell.d.ts +34 -0
- package/dist/table/cell/table-cell.js +52 -0
- package/dist/table/column/table-column.d.ts +165 -0
- package/dist/table/column/table-column.js +222 -0
- package/dist/table/index.d.ts +4 -0
- package/dist/table/index.js +4 -0
- package/dist/table/root/table-root.d.ts +98 -0
- package/dist/table/root/table-root.js +161 -0
- package/dist/table/row/table-row.d.ts +27 -0
- package/dist/table/row/table-row.js +42 -0
- package/dist/tabs/index.d.ts +3 -0
- package/dist/tabs/index.js +3 -0
- package/dist/tabs/panel/tab-panel.d.ts +67 -0
- package/dist/tabs/panel/tab-panel.js +98 -0
- package/dist/tabs/root/tabs-root.d.ts +123 -0
- package/dist/tabs/root/tabs-root.js +217 -0
- package/dist/tabs/tab/tab.d.ts +64 -0
- package/dist/tabs/tab/tab.js +116 -0
- package/dist/tag/index.d.ts +1 -0
- package/dist/tag/index.js +1 -0
- package/dist/tag/root/tag-root.d.ts +41 -0
- package/dist/tag/root/tag-root.js +67 -0
- package/dist/textarea/index.d.ts +1 -0
- package/dist/textarea/index.js +1 -0
- package/dist/textarea/root/textarea-root.d.ts +215 -0
- package/dist/textarea/root/textarea-root.js +380 -0
- package/dist/time-input/index.d.ts +1 -0
- package/dist/time-input/index.js +1 -0
- package/dist/time-input/root/time-input-root.d.ts +322 -0
- package/dist/time-input/root/time-input-root.js +661 -0
- package/dist/time-picker/index.d.ts +1 -0
- package/dist/time-picker/index.js +1 -0
- package/dist/time-picker/root/time-picker-root.d.ts +380 -0
- package/dist/time-picker/root/time-picker-root.js +669 -0
- package/dist/timeline/index.d.ts +2 -0
- package/dist/timeline/index.js +2 -0
- package/dist/timeline/item/timeline-item.d.ts +81 -0
- package/dist/timeline/item/timeline-item.js +128 -0
- package/dist/timeline/root/timeline-root.d.ts +52 -0
- package/dist/timeline/root/timeline-root.js +72 -0
- package/dist/toast/index.d.ts +2 -0
- package/dist/toast/index.js +2 -0
- package/dist/toast/item/toast-item.d.ts +183 -0
- package/dist/toast/item/toast-item.js +345 -0
- package/dist/toast/root/toast-root.d.ts +72 -0
- package/dist/toast/root/toast-root.js +87 -0
- package/dist/toggle/group/toggle-group.d.ts +140 -0
- package/dist/toggle/group/toggle-group.js +278 -0
- package/dist/toggle/index.d.ts +2 -0
- package/dist/toggle/index.js +2 -0
- package/dist/toggle/root/toggle-root.d.ts +99 -0
- package/dist/toggle/root/toggle-root.js +146 -0
- package/dist/toolbar/index.d.ts +1 -0
- package/dist/toolbar/index.js +1 -0
- package/dist/toolbar/root/toolbar-root.d.ts +105 -0
- package/dist/toolbar/root/toolbar-root.js +260 -0
- package/dist/tooltip/index.d.ts +1 -0
- package/dist/tooltip/index.js +1 -0
- package/dist/tooltip/root/tooltip-root.d.ts +388 -0
- package/dist/tooltip/root/tooltip-root.js +707 -0
- package/dist/tour/index.d.ts +2 -0
- package/dist/tour/index.js +2 -0
- package/dist/tour/root/tour-root.d.ts +161 -0
- package/dist/tour/root/tour-root.js +351 -0
- package/dist/tour/stop/tour-stop.d.ts +131 -0
- package/dist/tour/stop/tour-stop.js +249 -0
- package/dist/tree/index.d.ts +2 -0
- package/dist/tree/index.js +2 -0
- package/dist/tree/item/tree-item.d.ts +208 -0
- package/dist/tree/item/tree-item.js +381 -0
- package/dist/tree/root/tree-root.d.ts +88 -0
- package/dist/tree/root/tree-root.js +287 -0
- package/dist/trend/index.d.ts +1 -0
- package/dist/trend/index.js +1 -0
- package/dist/trend/root/trend-root.d.ts +67 -0
- package/dist/trend/root/trend-root.js +106 -0
- package/dist/video/index.d.ts +1 -0
- package/dist/video/index.js +1 -0
- package/dist/video/root/video-root.d.ts +711 -0
- package/dist/video/root/video-root.js +1821 -0
- package/dist/video-playlist/index.d.ts +3 -0
- package/dist/video-playlist/index.js +3 -0
- package/dist/video-playlist/item/video-playlist-item.d.ts +101 -0
- package/dist/video-playlist/item/video-playlist-item.js +162 -0
- package/dist/video-playlist/menu/video-playlist-menu.d.ts +121 -0
- package/dist/video-playlist/menu/video-playlist-menu.js +237 -0
- package/dist/video-playlist/root/video-playlist-root.d.ts +108 -0
- package/dist/video-playlist/root/video-playlist-root.js +218 -0
- package/dist/virtual-list/index.d.ts +1 -0
- package/dist/virtual-list/index.js +1 -0
- package/dist/virtual-list/root/virtual-list-root.d.ts +121 -0
- package/dist/virtual-list/root/virtual-list-root.js +221 -0
- package/jsx.d.ts +49767 -0
- package/package.json +77 -0
- package/svelte.d.ts +129 -0
- package/vue.d.ts +9242 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/dialog-root.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/dialog-root.js';
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { CommandController, HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
declare const HelixHeadlessDialog_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerOpenInterface) & typeof HelixElement;
|
|
4
|
+
/**
|
|
5
|
+
* @summary A modal window, on the platform's own dialog.
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* A real `<dialog>` opened with `showModal()`, not a div with a role and a
|
|
9
|
+
* hand-built trap. The platform gives four things that are each a day's work to
|
|
10
|
+
* reimplement and easy to get subtly wrong: the top layer, so the dialog is
|
|
11
|
+
* above everything regardless of what `z-index` anyone else wrote; a real
|
|
12
|
+
* backdrop; Escape; and inert-behind, so the page underneath is not reachable
|
|
13
|
+
* by pointer, keyboard, or a screen reader's virtual cursor.
|
|
14
|
+
*
|
|
15
|
+
* **`open` drives `showModal()`, and every way it can close comes back through
|
|
16
|
+
* `requestOpen`.** A native dialog can close from three directions: the
|
|
17
|
+
* property, Escape, and a `<form method="dialog">` submit inside it. Left
|
|
18
|
+
* alone, two of those would shut the dialog while the consumer's state still
|
|
19
|
+
* said open, which is the bug that makes a modal impossible to reopen. Escape
|
|
20
|
+
* is intercepted and routed through the request, so `preventDefault()` on the
|
|
21
|
+
* `helix-before-close` refuses it; a close that happens anyway is reflected back.
|
|
22
|
+
*
|
|
23
|
+
* **Nothing here traps focus.** `showModal()` does it, and better: `inert` on
|
|
24
|
+
* the rest of the document is something no JavaScript trap can achieve.
|
|
25
|
+
* `FocusTrapController` stays for the surfaces that are not modal.
|
|
26
|
+
*
|
|
27
|
+
* The regions are bare slots rather than wrappers, for the reason the card's
|
|
28
|
+
* are: an unassigned `<slot>` is `display: contents` and generates no box, so a
|
|
29
|
+
* dialog with no footer has no empty band where one would be.
|
|
30
|
+
*
|
|
31
|
+
* Opened declaratively with the platform's invoker attributes:
|
|
32
|
+
*
|
|
33
|
+
* ```html
|
|
34
|
+
* <helix-button commandfor="confirm" command="--show">Delete…</helix-button>
|
|
35
|
+
* <helix-dialog id="confirm">…</helix-dialog>
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* `--show`, `--close` and `--toggle`. Custom commands rather than the built-in
|
|
39
|
+
* `show-modal`, because those are defined against native elements and do
|
|
40
|
+
* nothing when pointed at a custom one.
|
|
41
|
+
*
|
|
42
|
+
* @since 0.1.0
|
|
43
|
+
* @status stable
|
|
44
|
+
* @category overlays
|
|
45
|
+
* @aliases Modal, Lightbox, Sheet
|
|
46
|
+
* @documentation https://helix.fusion.dev/components/dialog
|
|
47
|
+
*
|
|
48
|
+
* @slot - The dialog's content.
|
|
49
|
+
* @slot footer - The actions.
|
|
50
|
+
* @slot header - The title, and anything beside it.
|
|
51
|
+
* @slot icon - A single mark above the title, for a dialog that warns.
|
|
52
|
+
*
|
|
53
|
+
* @event {Event} close - Relayed, because the platform's own does not escape.
|
|
54
|
+
* @event {HelixBeforeCloseEvent} helix-before-close - Fired before it closes, and cancelable.
|
|
55
|
+
* @event {HelixBeforeOpenEvent} helix-before-open - Fired before it opens, and cancelable.
|
|
56
|
+
* @event {Event} toggle - Says the state moved, carrying `newState` and `oldState`.
|
|
57
|
+
*
|
|
58
|
+
* @csspart dialog - The native dialog element.
|
|
59
|
+
*/
|
|
60
|
+
export declare class HelixHeadlessDialog extends HelixHeadlessDialog_base {
|
|
61
|
+
/**
|
|
62
|
+
* Accessible name for the dialog.
|
|
63
|
+
*/
|
|
64
|
+
label: string;
|
|
65
|
+
/**
|
|
66
|
+
* Whether Escape can close it.
|
|
67
|
+
*
|
|
68
|
+
* Off for a dialog that must be answered. It does not disable the close
|
|
69
|
+
* control a consumer slots in: refusing to be dismissed is not the same as
|
|
70
|
+
* refusing to be closed, and a dialog with no way out at all is a trap.
|
|
71
|
+
*
|
|
72
|
+
* Escape *and* a press on the backdrop, which it now genuinely means. The
|
|
73
|
+
* sentence said both for a long time while nothing listened for a backdrop
|
|
74
|
+
* press, so it promised a behavior a consumer would have written their
|
|
75
|
+
* markup around; the fix then was to narrow the sentence, and the fix now is
|
|
76
|
+
* to build the half that was missing.
|
|
77
|
+
*
|
|
78
|
+
* A persistent dialog does not ignore that press. It answers it: see
|
|
79
|
+
* `refuse`, which is the only way a dialog that will not be dismissed can say
|
|
80
|
+
* so at the moment a reader asks.
|
|
81
|
+
*/
|
|
82
|
+
persistent: boolean;
|
|
83
|
+
protected readonly commands: CommandController;
|
|
84
|
+
/**
|
|
85
|
+
* Which close requests the browser answers on its own.
|
|
86
|
+
*
|
|
87
|
+
* `<dialog closedby>`, forwarded, and safe to forward because every path it
|
|
88
|
+
* opens still comes back through this element: a close request fires `cancel`
|
|
89
|
+
* first, `handleCancel` prevents it, and `requestOpen` decides. So
|
|
90
|
+
* `closedby="any"` gains light dismiss without giving up the refusal, which is
|
|
91
|
+
* the property this component exists to keep.
|
|
92
|
+
*
|
|
93
|
+
* Absent by default, which is the platform's `auto` and this library's rule
|
|
94
|
+
* that a resting value is an attribute's absence.
|
|
95
|
+
*/
|
|
96
|
+
closedBy?: 'any' | 'closerequest' | 'none';
|
|
97
|
+
/**
|
|
98
|
+
* What the dialog closed with, the way `<dialog>` reports it.
|
|
99
|
+
*
|
|
100
|
+
* **The whole point of a `<dialog>` returning a value is lost behind a shadow
|
|
101
|
+
* boundary**, which is where this one is: the platform's contract is
|
|
102
|
+
* `close(value)` then read `returnValue`, and a consumer could do neither
|
|
103
|
+
* because `querySelector` does not reach the element. A confirmation asking
|
|
104
|
+
* which button was pressed is the ordinary case and had no answer.
|
|
105
|
+
*
|
|
106
|
+
* Held here as well as on the element, so a value set before the first render
|
|
107
|
+
* survives to it and a consumer reading one back gets what they wrote.
|
|
108
|
+
*/
|
|
109
|
+
get returnValue(): string;
|
|
110
|
+
set returnValue(value: string);
|
|
111
|
+
/** What a value set before the element existed is kept in. */
|
|
112
|
+
private returned;
|
|
113
|
+
/** The native dialog, or nothing where there is no DOM to hold one. */
|
|
114
|
+
private get dialog();
|
|
115
|
+
/** Moves focus into the dialog and makes the rest of the page inert. */
|
|
116
|
+
show(): void;
|
|
117
|
+
/**
|
|
118
|
+
* Asks to close, which a consumer may refuse.
|
|
119
|
+
*
|
|
120
|
+
* Takes what the dialog closed with, the way `<dialog>.close(value)` does, so
|
|
121
|
+
* the button that dismissed it can say which one it was. Set before the
|
|
122
|
+
* request rather than after, because a `close` listener reads `returnValue`
|
|
123
|
+
* and would otherwise read the previous one.
|
|
124
|
+
*
|
|
125
|
+
* Not set where the request is refused, since nothing closed and a value
|
|
126
|
+
* saying it did would outlive the refusal.
|
|
127
|
+
*/
|
|
128
|
+
close(returnValue?: string): void;
|
|
129
|
+
/**
|
|
130
|
+
* Escape, intercepted so it is a request rather than an act.
|
|
131
|
+
*
|
|
132
|
+
* The native `cancel` event fires before the dialog closes, so preventing it
|
|
133
|
+
* leaves the dialog open and lets `requestOpen` decide. Without this a reader
|
|
134
|
+
* pressing Escape would close a dialog its consumer had said was open, and
|
|
135
|
+
* the two would disagree until something else moved.
|
|
136
|
+
*/
|
|
137
|
+
private readonly handleCancel;
|
|
138
|
+
/**
|
|
139
|
+
* A close that happened anyway, reflected back.
|
|
140
|
+
*
|
|
141
|
+
* `<form method="dialog">` closes the dialog directly and there is no event
|
|
142
|
+
* to prevent. Rather than fight it, the state follows: the dialog is shut, so
|
|
143
|
+
* saying otherwise would be a lie the next `showModal()` would trip over.
|
|
144
|
+
*/
|
|
145
|
+
private readonly handleClose;
|
|
146
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
147
|
+
protected updated(changed: PropertyValues): void;
|
|
148
|
+
/** Opens once anything slotted has had its first render. See `updated`. */
|
|
149
|
+
private openWhenSlotted;
|
|
150
|
+
/**
|
|
151
|
+
* A press on the backdrop, which lands on the dialog element itself.
|
|
152
|
+
*
|
|
153
|
+
* **The target alone is not enough here, where it is for `Drawer`.** A modal
|
|
154
|
+
* `<dialog>` attributes backdrop clicks to itself, which is the usual trick,
|
|
155
|
+
* and this panel also carries `--dialog-padding` of padding: a press in that
|
|
156
|
+
* padding has the same target as a press on the backdrop, so the trick alone
|
|
157
|
+
* closes a dialog when a reader clicks just inside its own edge. The drawer
|
|
158
|
+
* escapes that because its panel is flush against the window and its content
|
|
159
|
+
* fills it. So the point is compared against the panel's box.
|
|
160
|
+
*/
|
|
161
|
+
private readonly handleBackdrop;
|
|
162
|
+
/**
|
|
163
|
+
* Says no to a dismissal, by moving.
|
|
164
|
+
*
|
|
165
|
+
* A persistent dialog that ignores a press on the backdrop is
|
|
166
|
+
* indistinguishable from one that did not notice, and a reader's next move is
|
|
167
|
+
* to press again harder. A short swell and settle is the smallest thing that
|
|
168
|
+
* reads as "I heard you, and no": it is the same gesture a native alert makes
|
|
169
|
+
* on macOS and the one every reader has already been taught.
|
|
170
|
+
*
|
|
171
|
+
* An attribute for the length of the animation rather than a class, cleared
|
|
172
|
+
* on `animationend`, so the styled tier decides what refusing looks like and
|
|
173
|
+
* this decides only when it happens. Removed first so a second press
|
|
174
|
+
* restarts it: without that, pressing twice does nothing the second time,
|
|
175
|
+
* which is the impression the whole thing exists to avoid.
|
|
176
|
+
*/
|
|
177
|
+
private refuse;
|
|
178
|
+
protected render(): TemplateResult;
|
|
179
|
+
}
|
|
180
|
+
declare global {
|
|
181
|
+
interface HTMLElementTagNameMap {
|
|
182
|
+
'helix-headless-dialog': HelixHeadlessDialog;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export {};
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { CommandController, customElement, HelixElement, hostAria, MixinControllerOpen, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html, nothing } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
/**
|
|
11
|
+
* @summary A modal window, on the platform's own dialog.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* A real `<dialog>` opened with `showModal()`, not a div with a role and a
|
|
15
|
+
* hand-built trap. The platform gives four things that are each a day's work to
|
|
16
|
+
* reimplement and easy to get subtly wrong: the top layer, so the dialog is
|
|
17
|
+
* above everything regardless of what `z-index` anyone else wrote; a real
|
|
18
|
+
* backdrop; Escape; and inert-behind, so the page underneath is not reachable
|
|
19
|
+
* by pointer, keyboard, or a screen reader's virtual cursor.
|
|
20
|
+
*
|
|
21
|
+
* **`open` drives `showModal()`, and every way it can close comes back through
|
|
22
|
+
* `requestOpen`.** A native dialog can close from three directions: the
|
|
23
|
+
* property, Escape, and a `<form method="dialog">` submit inside it. Left
|
|
24
|
+
* alone, two of those would shut the dialog while the consumer's state still
|
|
25
|
+
* said open, which is the bug that makes a modal impossible to reopen. Escape
|
|
26
|
+
* is intercepted and routed through the request, so `preventDefault()` on the
|
|
27
|
+
* `helix-before-close` refuses it; a close that happens anyway is reflected back.
|
|
28
|
+
*
|
|
29
|
+
* **Nothing here traps focus.** `showModal()` does it, and better: `inert` on
|
|
30
|
+
* the rest of the document is something no JavaScript trap can achieve.
|
|
31
|
+
* `FocusTrapController` stays for the surfaces that are not modal.
|
|
32
|
+
*
|
|
33
|
+
* The regions are bare slots rather than wrappers, for the reason the card's
|
|
34
|
+
* are: an unassigned `<slot>` is `display: contents` and generates no box, so a
|
|
35
|
+
* dialog with no footer has no empty band where one would be.
|
|
36
|
+
*
|
|
37
|
+
* Opened declaratively with the platform's invoker attributes:
|
|
38
|
+
*
|
|
39
|
+
* ```html
|
|
40
|
+
* <helix-button commandfor="confirm" command="--show">Delete…</helix-button>
|
|
41
|
+
* <helix-dialog id="confirm">…</helix-dialog>
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* `--show`, `--close` and `--toggle`. Custom commands rather than the built-in
|
|
45
|
+
* `show-modal`, because those are defined against native elements and do
|
|
46
|
+
* nothing when pointed at a custom one.
|
|
47
|
+
*
|
|
48
|
+
* @since 0.1.0
|
|
49
|
+
* @status stable
|
|
50
|
+
* @category overlays
|
|
51
|
+
* @aliases Modal, Lightbox, Sheet
|
|
52
|
+
* @documentation https://helix.fusion.dev/components/dialog
|
|
53
|
+
*
|
|
54
|
+
* @slot - The dialog's content.
|
|
55
|
+
* @slot footer - The actions.
|
|
56
|
+
* @slot header - The title, and anything beside it.
|
|
57
|
+
* @slot icon - A single mark above the title, for a dialog that warns.
|
|
58
|
+
*
|
|
59
|
+
* @event {Event} close - Relayed, because the platform's own does not escape.
|
|
60
|
+
* @event {HelixBeforeCloseEvent} helix-before-close - Fired before it closes, and cancelable.
|
|
61
|
+
* @event {HelixBeforeOpenEvent} helix-before-open - Fired before it opens, and cancelable.
|
|
62
|
+
* @event {Event} toggle - Says the state moved, carrying `newState` and `oldState`.
|
|
63
|
+
*
|
|
64
|
+
* @csspart dialog - The native dialog element.
|
|
65
|
+
*/
|
|
66
|
+
let HelixHeadlessDialog = class HelixHeadlessDialog extends MixinControllerOpen(HelixElement) {
|
|
67
|
+
constructor() {
|
|
68
|
+
super(...arguments);
|
|
69
|
+
/**
|
|
70
|
+
* Accessible name for the dialog.
|
|
71
|
+
*/
|
|
72
|
+
this.label = '';
|
|
73
|
+
/**
|
|
74
|
+
* Whether Escape can close it.
|
|
75
|
+
*
|
|
76
|
+
* Off for a dialog that must be answered. It does not disable the close
|
|
77
|
+
* control a consumer slots in: refusing to be dismissed is not the same as
|
|
78
|
+
* refusing to be closed, and a dialog with no way out at all is a trap.
|
|
79
|
+
*
|
|
80
|
+
* Escape *and* a press on the backdrop, which it now genuinely means. The
|
|
81
|
+
* sentence said both for a long time while nothing listened for a backdrop
|
|
82
|
+
* press, so it promised a behavior a consumer would have written their
|
|
83
|
+
* markup around; the fix then was to narrow the sentence, and the fix now is
|
|
84
|
+
* to build the half that was missing.
|
|
85
|
+
*
|
|
86
|
+
* A persistent dialog does not ignore that press. It answers it: see
|
|
87
|
+
* `refuse`, which is the only way a dialog that will not be dismissed can say
|
|
88
|
+
* so at the moment a reader asks.
|
|
89
|
+
*/
|
|
90
|
+
this.persistent = false;
|
|
91
|
+
/* Opened and closed from anywhere on the page, without a line of script:
|
|
92
|
+
`<helix-button commandfor="…" command="--show">`. See `CommandController`
|
|
93
|
+
for why this is the platform's invoker rather than a `data-` recipe. */
|
|
94
|
+
this.commands = new CommandController(this, {
|
|
95
|
+
commands: {
|
|
96
|
+
'--close': () => this.close(),
|
|
97
|
+
'--show': () => this.show(),
|
|
98
|
+
'--toggle': () => this.toggleOpen(),
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
/** What a value set before the element existed is kept in. */
|
|
102
|
+
this.returned = '';
|
|
103
|
+
/**
|
|
104
|
+
* Escape, intercepted so it is a request rather than an act.
|
|
105
|
+
*
|
|
106
|
+
* The native `cancel` event fires before the dialog closes, so preventing it
|
|
107
|
+
* leaves the dialog open and lets `requestOpen` decide. Without this a reader
|
|
108
|
+
* pressing Escape would close a dialog its consumer had said was open, and
|
|
109
|
+
* the two would disagree until something else moved.
|
|
110
|
+
*/
|
|
111
|
+
this.handleCancel = (event) => {
|
|
112
|
+
event.preventDefault();
|
|
113
|
+
if (this.persistent) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.requestOpen(false);
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* A close that happened anyway, reflected back.
|
|
120
|
+
*
|
|
121
|
+
* `<form method="dialog">` closes the dialog directly and there is no event
|
|
122
|
+
* to prevent. Rather than fight it, the state follows: the dialog is shut, so
|
|
123
|
+
* saying otherwise would be a lie the next `showModal()` would trip over.
|
|
124
|
+
*/
|
|
125
|
+
this.handleClose = (event) => {
|
|
126
|
+
if (this.open) {
|
|
127
|
+
this.requestOpen(false);
|
|
128
|
+
}
|
|
129
|
+
/* And under the platform's own name, from the host. `close` on a `<dialog>`
|
|
130
|
+
neither bubbles nor is composed, so the one the browser just fired reaches
|
|
131
|
+
nobody outside this shadow root, which is the same reason `Avatar` relays
|
|
132
|
+
`load`. Announced after the state has moved, so a consumer binding
|
|
133
|
+
`onClose` reads a dialog that is already shut.
|
|
134
|
+
|
|
135
|
+
`cancel` is deliberately not relayed. `handleCancel` prevents it so that
|
|
136
|
+
Escape is a request rather than an act, so the native one never completes:
|
|
137
|
+
relaying it would announce a dismissal that was refused. See 296. */
|
|
138
|
+
this.relayNativeEvent(event);
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* A press on the backdrop, which lands on the dialog element itself.
|
|
142
|
+
*
|
|
143
|
+
* **The target alone is not enough here, where it is for `Drawer`.** A modal
|
|
144
|
+
* `<dialog>` attributes backdrop clicks to itself, which is the usual trick,
|
|
145
|
+
* and this panel also carries `--dialog-padding` of padding: a press in that
|
|
146
|
+
* padding has the same target as a press on the backdrop, so the trick alone
|
|
147
|
+
* closes a dialog when a reader clicks just inside its own edge. The drawer
|
|
148
|
+
* escapes that because its panel is flush against the window and its content
|
|
149
|
+
* fills it. So the point is compared against the panel's box.
|
|
150
|
+
*/
|
|
151
|
+
this.handleBackdrop = (event) => {
|
|
152
|
+
const panel = this.dialog;
|
|
153
|
+
if (!panel || event.target !== panel) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const box = panel.getBoundingClientRect();
|
|
157
|
+
if (event.clientX >= box.left &&
|
|
158
|
+
event.clientX <= box.right &&
|
|
159
|
+
event.clientY >= box.top &&
|
|
160
|
+
event.clientY <= box.bottom) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (this.persistent) {
|
|
164
|
+
this.refuse();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
this.requestOpen(false);
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* What the dialog closed with, the way `<dialog>` reports it.
|
|
172
|
+
*
|
|
173
|
+
* **The whole point of a `<dialog>` returning a value is lost behind a shadow
|
|
174
|
+
* boundary**, which is where this one is: the platform's contract is
|
|
175
|
+
* `close(value)` then read `returnValue`, and a consumer could do neither
|
|
176
|
+
* because `querySelector` does not reach the element. A confirmation asking
|
|
177
|
+
* which button was pressed is the ordinary case and had no answer.
|
|
178
|
+
*
|
|
179
|
+
* Held here as well as on the element, so a value set before the first render
|
|
180
|
+
* survives to it and a consumer reading one back gets what they wrote.
|
|
181
|
+
*/
|
|
182
|
+
get returnValue() {
|
|
183
|
+
return this.dialog?.returnValue ?? this.returned;
|
|
184
|
+
}
|
|
185
|
+
set returnValue(value) {
|
|
186
|
+
this.returned = value;
|
|
187
|
+
const dialog = this.dialog;
|
|
188
|
+
if (dialog) {
|
|
189
|
+
dialog.returnValue = value;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** The native dialog, or nothing where there is no DOM to hold one. */
|
|
193
|
+
get dialog() {
|
|
194
|
+
return this.renderRoot?.querySelector('dialog') ?? null;
|
|
195
|
+
}
|
|
196
|
+
/** Moves focus into the dialog and makes the rest of the page inert. */
|
|
197
|
+
show() {
|
|
198
|
+
this.requestOpen(true);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Asks to close, which a consumer may refuse.
|
|
202
|
+
*
|
|
203
|
+
* Takes what the dialog closed with, the way `<dialog>.close(value)` does, so
|
|
204
|
+
* the button that dismissed it can say which one it was. Set before the
|
|
205
|
+
* request rather than after, because a `close` listener reads `returnValue`
|
|
206
|
+
* and would otherwise read the previous one.
|
|
207
|
+
*
|
|
208
|
+
* Not set where the request is refused, since nothing closed and a value
|
|
209
|
+
* saying it did would outlive the refusal.
|
|
210
|
+
*/
|
|
211
|
+
close(returnValue) {
|
|
212
|
+
const previous = this.returnValue;
|
|
213
|
+
if (returnValue !== undefined) {
|
|
214
|
+
this.returnValue = returnValue;
|
|
215
|
+
}
|
|
216
|
+
if (!this.requestOpen(false) && returnValue !== undefined) {
|
|
217
|
+
this.returnValue = previous;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
willUpdate(changed) {
|
|
221
|
+
super.willUpdate(changed);
|
|
222
|
+
hostAria(this.internals, { label: this.label });
|
|
223
|
+
}
|
|
224
|
+
updated(changed) {
|
|
225
|
+
super.updated(changed);
|
|
226
|
+
/* After render, because the element has to exist to be opened, and only on
|
|
227
|
+
a difference: `showModal()` on an open dialog throws, and `close()` on a
|
|
228
|
+
shut one fires a second `close` event. */
|
|
229
|
+
const dialog = this.dialog;
|
|
230
|
+
if (!dialog) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (this.open && !dialog.open) {
|
|
234
|
+
/* **After the slotted elements have rendered, or the modal focuses
|
|
235
|
+
itself.** `showModal()` moves focus to the first focusable descendant,
|
|
236
|
+
and a custom element that has not rendered its shadow yet has none: the
|
|
237
|
+
browser falls back to the dialog. Markup never showed this, the parser
|
|
238
|
+
having upgraded everything before this element's first update, and
|
|
239
|
+
React does: it creates and connects the dialog before the chat inside
|
|
240
|
+
it has rendered, so a `default-open` dialog opened with focus on the
|
|
241
|
+
dialog rather than on the field, measured against the markup twin.
|
|
242
|
+
|
|
243
|
+
Awaited only for children that are Lit elements and only on the way
|
|
244
|
+
open; a dialog with no such children resolves on the same microtask and
|
|
245
|
+
is unchanged. */
|
|
246
|
+
void this.openWhenSlotted(dialog);
|
|
247
|
+
}
|
|
248
|
+
else if (!this.open && dialog.open) {
|
|
249
|
+
dialog.close();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** Opens once anything slotted has had its first render. See `updated`. */
|
|
253
|
+
async openWhenSlotted(dialog) {
|
|
254
|
+
await Promise.all([...this.children]
|
|
255
|
+
.map((one) => one.updateComplete)
|
|
256
|
+
.filter((one) => one instanceof Promise));
|
|
257
|
+
/* Re-checked, because both facts can have moved while that resolved. */
|
|
258
|
+
if (this.open && !dialog.open && this.isConnected) {
|
|
259
|
+
dialog.showModal();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Says no to a dismissal, by moving.
|
|
264
|
+
*
|
|
265
|
+
* A persistent dialog that ignores a press on the backdrop is
|
|
266
|
+
* indistinguishable from one that did not notice, and a reader's next move is
|
|
267
|
+
* to press again harder. A short swell and settle is the smallest thing that
|
|
268
|
+
* reads as "I heard you, and no": it is the same gesture a native alert makes
|
|
269
|
+
* on macOS and the one every reader has already been taught.
|
|
270
|
+
*
|
|
271
|
+
* An attribute for the length of the animation rather than a class, cleared
|
|
272
|
+
* on `animationend`, so the styled tier decides what refusing looks like and
|
|
273
|
+
* this decides only when it happens. Removed first so a second press
|
|
274
|
+
* restarts it: without that, pressing twice does nothing the second time,
|
|
275
|
+
* which is the impression the whole thing exists to avoid.
|
|
276
|
+
*/
|
|
277
|
+
refuse() {
|
|
278
|
+
const panel = this.dialog;
|
|
279
|
+
if (!panel) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
panel.removeAttribute('data-refused');
|
|
283
|
+
// Read forces the removal to land before the attribute goes back on, or the
|
|
284
|
+
// two happen in one frame and the animation never restarts.
|
|
285
|
+
void panel.offsetWidth;
|
|
286
|
+
panel.setAttribute('data-refused', '');
|
|
287
|
+
panel.addEventListener('animationend', () => panel.removeAttribute('data-refused'), {
|
|
288
|
+
once: true,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
render() {
|
|
292
|
+
return html `<dialog
|
|
293
|
+
part="dialog"
|
|
294
|
+
closedby=${this.closedBy ?? nothing}
|
|
295
|
+
aria-label=${this.label || 'Dialog'}
|
|
296
|
+
@cancel=${this.handleCancel}
|
|
297
|
+
@click=${this.handleBackdrop}
|
|
298
|
+
@close=${this.handleClose}
|
|
299
|
+
>
|
|
300
|
+
<slot name="icon"></slot>
|
|
301
|
+
<slot name="header"></slot>
|
|
302
|
+
<slot></slot>
|
|
303
|
+
<slot name="footer"></slot>
|
|
304
|
+
</dialog>`;
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
__decorate([
|
|
308
|
+
property()
|
|
309
|
+
], HelixHeadlessDialog.prototype, "label", void 0);
|
|
310
|
+
__decorate([
|
|
311
|
+
property({ reflect: true, type: Boolean })
|
|
312
|
+
], HelixHeadlessDialog.prototype, "persistent", void 0);
|
|
313
|
+
__decorate([
|
|
314
|
+
property({ attribute: 'closedby', reflect: true })
|
|
315
|
+
], HelixHeadlessDialog.prototype, "closedBy", void 0);
|
|
316
|
+
HelixHeadlessDialog = __decorate([
|
|
317
|
+
customElement('helix-headless-dialog')
|
|
318
|
+
], HelixHeadlessDialog);
|
|
319
|
+
export { HelixHeadlessDialog };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/divider-root.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/divider-root.js';
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
/**
|
|
4
|
+
* @summary Separates content into groups with a rule.
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
* The separator role lives on the rule inside the shadow root rather than on
|
|
8
|
+
* the host. A role does not need to cross the shadow boundary the way an IDREF
|
|
9
|
+
* does, and putting it on the rendered element means the semantics are in the
|
|
10
|
+
* server's markup with no attribute written during a lifecycle the server never
|
|
11
|
+
* runs.
|
|
12
|
+
*
|
|
13
|
+
* Use `orientation="vertical"` between items on one line, such as inside a
|
|
14
|
+
* toolbar. A vertical divider stretches to its flex parent rather than setting
|
|
15
|
+
* a height of its own.
|
|
16
|
+
*
|
|
17
|
+
* @since 0.1.0
|
|
18
|
+
* @status stable
|
|
19
|
+
* @category layout
|
|
20
|
+
* @aliases Separator, Rule
|
|
21
|
+
* @documentation https://helix.fusion.dev/components/divider
|
|
22
|
+
*
|
|
23
|
+
* @slot - Content set into the rule, such as the word between two sections.
|
|
24
|
+
*
|
|
25
|
+
* @csspart content - What is set into it.
|
|
26
|
+
* @csspart line - The rule itself, or each half of it where something is set in.
|
|
27
|
+
*/
|
|
28
|
+
export declare class HelixHeadlessDivider extends HelixElement {
|
|
29
|
+
/**
|
|
30
|
+
* Which way the rule runs.
|
|
31
|
+
*/
|
|
32
|
+
orientation?: 'horizontal' | 'vertical';
|
|
33
|
+
/**
|
|
34
|
+
* Whether the rule is announced as a separator.
|
|
35
|
+
*
|
|
36
|
+
* Off by default, and out of the accessibility tree. Most rules on a page
|
|
37
|
+
* separate nothing: they underline a heading or close a section that space
|
|
38
|
+
* had already closed, and announcing every one as a separator is noise a
|
|
39
|
+
* screen-reader user has to walk past.
|
|
40
|
+
*
|
|
41
|
+
* An opt-in, not a `decorative` opt-out, because a boolean attribute cannot
|
|
42
|
+
* be turned off: `decorative="false"` parses as `true`, which would put the
|
|
43
|
+
* quiet default out of reach from HTML and leave it settable only as a
|
|
44
|
+
* property. An opt-in is absent by default, which every reflected property
|
|
45
|
+
* here has to be.
|
|
46
|
+
*/
|
|
47
|
+
announced: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Marks the middle region when nothing has been set into it.
|
|
50
|
+
*
|
|
51
|
+
* A divider with no content has to be one continuous line, and the space
|
|
52
|
+
* either side of the content is what would break it. `:empty` cannot answer
|
|
53
|
+
* this and neither can `:host(:has(...))`, which is invalid CSS dropped at
|
|
54
|
+
* parse time: `check:selectors` caught exactly that rule here, written in
|
|
55
|
+
* this file, by an author who had already read the note saying so.
|
|
56
|
+
*
|
|
57
|
+
* On the region inside the shadow root rather than on the host, because an
|
|
58
|
+
* attribute written onto the host is a change to markup the consumer rendered.
|
|
59
|
+
*/
|
|
60
|
+
private markEmpty;
|
|
61
|
+
protected updated(changed: PropertyValues): void;
|
|
62
|
+
protected render(): TemplateResult;
|
|
63
|
+
}
|
|
64
|
+
declare global {
|
|
65
|
+
interface HTMLElementTagNameMap {
|
|
66
|
+
'helix-headless-divider': HelixHeadlessDivider;
|
|
67
|
+
}
|
|
68
|
+
}
|