@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,345 @@
|
|
|
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 { customElement, HelixElement, MixinDismissible, requestChange, toneMark, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { x } from '@fusion.dev/helix-icons';
|
|
9
|
+
import { html, nothing } from 'lit';
|
|
10
|
+
import { property } from 'lit/decorators.js';
|
|
11
|
+
import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
|
|
12
|
+
/**
|
|
13
|
+
* @summary One message in the toast region.
|
|
14
|
+
*
|
|
15
|
+
* @description
|
|
16
|
+
* An element rather than a slot, because it carries a timeout, a tone, a
|
|
17
|
+
* dismiss control and a lifetime that pauses: behavior, state and API, which
|
|
18
|
+
* is the test for whether a region becomes an element in this library.
|
|
19
|
+
*
|
|
20
|
+
* **The timer is the item's own.** Held by the region, one message arriving
|
|
21
|
+
* would restart another's, so a stack of three would go from three seconds each
|
|
22
|
+
* to nine for the last one. Each message is on its own clock from the moment it
|
|
23
|
+
* is rendered.
|
|
24
|
+
*
|
|
25
|
+
* **A message is the opposite of the page it is over.** Inverted by default,
|
|
26
|
+
* because a thing arriving in a corner has to be told apart from the page in
|
|
27
|
+
* the moment before it is read, and inverting does that without spending a
|
|
28
|
+
* color that means something. It is a flip of `color-scheme` rather than a
|
|
29
|
+
* named inverse surface: every token in the subtree re-resolves, so a `Retry`
|
|
30
|
+
* a consumer slots in comes out right without knowing where it is. `Tooltip`
|
|
31
|
+
* can name the inverse surface directly because it holds no controls; this
|
|
32
|
+
* cannot. Set `data-color-mode` on the region to take the page's mode instead.
|
|
33
|
+
*
|
|
34
|
+
* **No duration means it stays.** That is the safe default rather than the
|
|
35
|
+
* common one: anything carrying an action has to still be there when the reader
|
|
36
|
+
* decides to take it, and a component cannot tell from the outside whether the
|
|
37
|
+
* message it was given is disposable.
|
|
38
|
+
*
|
|
39
|
+
* **The clock stops while it is being read.** Hover pauses it, and so does
|
|
40
|
+
* focus landing anywhere inside, which is the case that matters more: a
|
|
41
|
+
* keyboard reader tabbing towards the action in a toast is exactly the person a
|
|
42
|
+
* timer must not race. Both resume where they left off rather than starting
|
|
43
|
+
* again, so a message half-read does not get a full second life every time a
|
|
44
|
+
* pointer crosses it.
|
|
45
|
+
*
|
|
46
|
+
* **Going away is a request, never an act.** It dispatches a cancelable
|
|
47
|
+
* `helix-dismiss` and does nothing else: the consumer owns the list, so the
|
|
48
|
+
* item removing itself would leave the two disagreeing. Auto-dismiss and the
|
|
49
|
+
* dismiss control raise the same event, so a consumer handles one path and not
|
|
50
|
+
* two.
|
|
51
|
+
*
|
|
52
|
+
* The properties below are written by this component and read by whoever draws
|
|
53
|
+
* it. A consumer sets none of them: they carry a number this element computed
|
|
54
|
+
* and CSS cannot, which is what lets a stylesheet on this tier draw the thing
|
|
55
|
+
* without measuring anything itself.
|
|
56
|
+
*
|
|
57
|
+
* @since 0.1.0
|
|
58
|
+
* @status experimental
|
|
59
|
+
* @documentation https://helix.fusion.dev/components/toast
|
|
60
|
+
*
|
|
61
|
+
* @slot - The message.
|
|
62
|
+
* @slot actions - What to do about it, usually a button or a link.
|
|
63
|
+
* @slot dismiss-icon - Replaces the glyph inside the dismiss control.
|
|
64
|
+
* @slot icon - Replaces the tone mark. Matches `Callout`, which is why the
|
|
65
|
+
* dismiss control's own glyph is `dismiss-icon` rather than this: two slots
|
|
66
|
+
* cannot share a name, assignment goes to whichever comes first in the tree,
|
|
67
|
+
* and the tone mark is the one a consumer reaches for.
|
|
68
|
+
*
|
|
69
|
+
* @event {HelixDismissEvent} helix-dismiss - Fired when it asks to go, whether by the control or by its timer. Cancelable: refusing it takes the decision and nothing moves.
|
|
70
|
+
*
|
|
71
|
+
* @csspart actions - The region holding what to do about it.
|
|
72
|
+
* @csspart content - The message.
|
|
73
|
+
* @csspart dismiss - The control that asks to close.
|
|
74
|
+
* @csspart dismiss-mark - The glyph on the dismiss control, where none is slotted.
|
|
75
|
+
* @csspart icon - The tone mark, where the message has one.
|
|
76
|
+
* @csspart icon-mark - The tone glyph, where none is slotted.
|
|
77
|
+
* @csspart item - The message's own surface.
|
|
78
|
+
* @csspart timer - The bar showing how long is left, where a duration was given.
|
|
79
|
+
*
|
|
80
|
+
* @cssproperty --toast-duration - How long this message stays, in milliseconds, for a progress hint.
|
|
81
|
+
*/
|
|
82
|
+
let HelixHeadlessToastItem = class HelixHeadlessToastItem extends MixinDismissible(HelixElement) {
|
|
83
|
+
constructor() {
|
|
84
|
+
super(...arguments);
|
|
85
|
+
/** Whether it is showing, whoever said so, and `undefined` until somebody has. */
|
|
86
|
+
this.openState = undefined;
|
|
87
|
+
/* Arrows, so `this` is the item wherever the listener ends up. Lit does bind
|
|
88
|
+
a template listener to its host, and relying on that puts a load-bearing
|
|
89
|
+
fact about a library in a place nobody reading this file would look. */
|
|
90
|
+
/**
|
|
91
|
+
* How many reasons there are to hold the clock, rather than whether there is
|
|
92
|
+
* one.
|
|
93
|
+
*
|
|
94
|
+
* Hover and focus both stopped the same timer with nothing counting them, so
|
|
95
|
+
* a reader who tabbed into a message and then moved the pointer off it had
|
|
96
|
+
* the clock restarted underneath them while they were still reading it. That
|
|
97
|
+
* is the case the pause exists for, and it was the case that broke it.
|
|
98
|
+
*
|
|
99
|
+
* The two are genuinely independent: a pointer can leave while focus stays,
|
|
100
|
+
* and focus can leave while the pointer stays. Only the last one out starts
|
|
101
|
+
* it again.
|
|
102
|
+
*/
|
|
103
|
+
this.holds = 0;
|
|
104
|
+
this.handlePause = () => {
|
|
105
|
+
this.holds += 1;
|
|
106
|
+
this.pause();
|
|
107
|
+
};
|
|
108
|
+
this.handleResume = () => {
|
|
109
|
+
this.holds = Math.max(this.holds - 1, 0);
|
|
110
|
+
if (this.holds === 0) {
|
|
111
|
+
this.resume();
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Whether the message is still showing.
|
|
117
|
+
*
|
|
118
|
+
* The same decide-once contract every other stateful thing here carries, and
|
|
119
|
+
* it was the one exception: this waited to be told in every case, so
|
|
120
|
+
* `duration` did nothing at all without consumer script and the dismiss
|
|
121
|
+
* control looked broken to anyone who pressed it. `Dialog` closes itself,
|
|
122
|
+
* `Accordion` closes itself, and there was no reason a message should not.
|
|
123
|
+
*
|
|
124
|
+
* Declared by the markup and it is the consumer's: the item announces and
|
|
125
|
+
* waits. Not declared and it is the item's: it goes when it is asked to, and
|
|
126
|
+
* the consumer still hears `helix-dismiss` and takes it out of their own
|
|
127
|
+
* list. Read once, at the first update.
|
|
128
|
+
*
|
|
129
|
+
* **No `default-open`, unlike the four mixins.** A `default-` seed exists so
|
|
130
|
+
* markup can choose a starting state without claiming ownership, and there is
|
|
131
|
+
* only one starting state that makes sense: a message that has been rendered
|
|
132
|
+
* is showing. An attribute whose only legal value is the default is an
|
|
133
|
+
* attribute nobody can use.
|
|
134
|
+
*
|
|
135
|
+
*
|
|
136
|
+
*/
|
|
137
|
+
get open() {
|
|
138
|
+
return this.openState ?? true;
|
|
139
|
+
}
|
|
140
|
+
set open(next) {
|
|
141
|
+
const previous = this.open;
|
|
142
|
+
this.openState = next;
|
|
143
|
+
this.requestUpdate('open', previous);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Asks to be taken away, and reports whether the request stood.
|
|
147
|
+
*
|
|
148
|
+
* Announced before anything happens, so `preventDefault()` is a refusal and
|
|
149
|
+
* the message stays. The event still carries the label, because a consumer
|
|
150
|
+
* removing this from their own state has to know which one went, and that is
|
|
151
|
+
* true whether or not the item hid itself first.
|
|
152
|
+
*/
|
|
153
|
+
dismiss() {
|
|
154
|
+
if (!this.open) {
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
/* The clock stops either way. A timer left running on a message that has
|
|
158
|
+
gone would fire into nothing, and would hold the item alive until it
|
|
159
|
+
did. */
|
|
160
|
+
clearTimeout(this.timer);
|
|
161
|
+
this.timer = undefined;
|
|
162
|
+
return requestChange({
|
|
163
|
+
apply: () => {
|
|
164
|
+
const previous = this.open;
|
|
165
|
+
this.openState = false;
|
|
166
|
+
this.requestUpdate('open', previous);
|
|
167
|
+
},
|
|
168
|
+
/* `helix-dismiss` answers a controlled `open`, which reads oddly and is
|
|
169
|
+
exact. A toast is not an overlay that opens and closes: `next` below is
|
|
170
|
+
`false` and nothing here ever calls `requestOpen(true)`, so it only
|
|
171
|
+
ever asks in one direction, and the verb for that direction is
|
|
172
|
+
`dismiss`. `HelixDismissEvent` already carries it for a tag leaving a
|
|
173
|
+
list and an announcement closing itself, which is the same act from the
|
|
174
|
+
element's side. A consumer controlling `open` therefore answers
|
|
175
|
+
`onhelix-dismiss`, and the generated types ask for exactly that. */
|
|
176
|
+
event: () => this.dismissEvent(),
|
|
177
|
+
host: this,
|
|
178
|
+
next: false,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/** Stops the clock, leaving whatever is left of it. */
|
|
182
|
+
pause() {
|
|
183
|
+
if (this.timer === undefined || this.startedAt === undefined) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
clearTimeout(this.timer);
|
|
187
|
+
this.timer = undefined;
|
|
188
|
+
this.remaining = Math.max((this.remaining ?? 0) - (Date.now() - this.startedAt), 0);
|
|
189
|
+
this.startedAt = undefined;
|
|
190
|
+
/* Said on the host so the indicator can freeze with the clock. A `data-`
|
|
191
|
+
attribute rather than a property, because it is written after upgrade
|
|
192
|
+
from a pointer moving: nothing declares it and no server rendered it,
|
|
193
|
+
which is the same reason `Carousel` names its slides from here. */
|
|
194
|
+
this.toggleAttribute('data-paused', true);
|
|
195
|
+
}
|
|
196
|
+
/** Starts it again from where it stopped. */
|
|
197
|
+
resume() {
|
|
198
|
+
if (this.timer !== undefined || this.remaining === undefined || this.remaining <= 0) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
this.startedAt = Date.now();
|
|
202
|
+
this.toggleAttribute('data-paused', false);
|
|
203
|
+
this.timer = setTimeout(() => {
|
|
204
|
+
this.timer = undefined;
|
|
205
|
+
this.dismiss();
|
|
206
|
+
}, this.remaining);
|
|
207
|
+
}
|
|
208
|
+
disconnectedCallback() {
|
|
209
|
+
super.disconnectedCallback();
|
|
210
|
+
// A message removed while its timer is running would otherwise fire into
|
|
211
|
+
// nothing, and hold the item alive until it did.
|
|
212
|
+
clearTimeout(this.timer);
|
|
213
|
+
this.timer = undefined;
|
|
214
|
+
}
|
|
215
|
+
willUpdate(changed) {
|
|
216
|
+
super.willUpdate(changed);
|
|
217
|
+
/* Before anything else reads it, and only the first time. Everything that
|
|
218
|
+
declares the mode has arrived by now: attributes from markup or from a
|
|
219
|
+
server's output, and properties a framework assigned on mount. */
|
|
220
|
+
/* Mirrored for CSS rather than reflected onto `open` itself, which is the
|
|
221
|
+
library's rule about state: a reflected `open` is indistinguishable from
|
|
222
|
+
one the consumer declared, and that attribute is what ownership is read
|
|
223
|
+
from. `data-closed` can never be mistaken for a declaration. */
|
|
224
|
+
/* **`data-closed`, because open is the resting state.** It was `data-open`,
|
|
225
|
+
written whenever the toast was open, and a toast opens by default: a
|
|
226
|
+
consumer server-rendering `<helix-toast-item>` got a `data-open` back that
|
|
227
|
+
React never sent. Inverting keeps a `data-` hook for the headless consumer
|
|
228
|
+
this publishes it for, and moves the write to the side that only happens
|
|
229
|
+
after somebody dismisses the message, which is long past hydration. */
|
|
230
|
+
this.toggleAttribute('data-closed', !this.open);
|
|
231
|
+
/* And `hidden` beside it, because `data-closed` is a hook and not a
|
|
232
|
+
mechanism. A dismissed toast was hidden by `opacity: 0` and
|
|
233
|
+
`visibility: hidden` in the styled sheet and by nothing at all here, so a
|
|
234
|
+
consumer on this tier had a message that never went away: measured, a
|
|
235
|
+
closed base toast printed its text on the page.
|
|
236
|
+
It costs the styled tier nothing, the same as the accordion: `:host` sets
|
|
237
|
+
`display: grid` unconditionally so the author rule beats the UA sheet,
|
|
238
|
+
and the exit still animates its row down from `1fr`. */
|
|
239
|
+
this.toggleAttribute('hidden', !this.open);
|
|
240
|
+
}
|
|
241
|
+
firstUpdated(changed) {
|
|
242
|
+
super.firstUpdated(changed);
|
|
243
|
+
/* Here rather than in `connectedCallback`, which the server never calls, and
|
|
244
|
+
started only once: the clock belongs to this message's life on screen. */
|
|
245
|
+
if (this.duration !== undefined && this.duration > 0) {
|
|
246
|
+
this.remaining = this.duration;
|
|
247
|
+
this.resume();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* The mark for the message's tone, behind a seam.
|
|
252
|
+
*
|
|
253
|
+
* Slot fallback, so a consumer replaces it by slotting; and a method, so the
|
|
254
|
+
* tier above replaces it by overriding. Those answer different people: the
|
|
255
|
+
* slot is for the page and the method is for whoever is building the styled
|
|
256
|
+
* layer, and a fallback with only the first is one a tier can restyle and
|
|
257
|
+
* cannot change.
|
|
258
|
+
*
|
|
259
|
+
* The mark is passed in rather than looked up again, since `render` has
|
|
260
|
+
* already resolved the tone and a second lookup is a second place for the
|
|
261
|
+
* fallback to disagree with the tone around it.
|
|
262
|
+
*/
|
|
263
|
+
renderIcon(mark) {
|
|
264
|
+
return html `<slot name="icon">
|
|
265
|
+
<svg part="icon-mark"
|
|
266
|
+
fill="currentColor"
|
|
267
|
+
viewBox=${mark.icon.viewBox}
|
|
268
|
+
role="img"
|
|
269
|
+
aria-label=${mark.label}
|
|
270
|
+
>
|
|
271
|
+
${unsafeSVG(mark.icon.content)}
|
|
272
|
+
</svg>
|
|
273
|
+
</slot>`;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* The mark on the dismiss control, behind a seam.
|
|
277
|
+
*
|
|
278
|
+
* Slot fallback, so a consumer replaces it by slotting; and a method, so the
|
|
279
|
+
* tier above replaces it by overriding. Those answer different people: the
|
|
280
|
+
* slot is for the page and the method is for whoever is building the styled
|
|
281
|
+
* layer, and a fallback with only the first is one a tier can restyle and
|
|
282
|
+
* cannot change.
|
|
283
|
+
*/
|
|
284
|
+
renderDismissIcon() {
|
|
285
|
+
return html `<slot name="dismiss-icon">
|
|
286
|
+
<svg part="dismiss-mark" viewBox=${x.viewBox} fill="currentColor" aria-hidden="true">
|
|
287
|
+
${unsafeSVG(x.content)}
|
|
288
|
+
</svg>
|
|
289
|
+
</slot>`;
|
|
290
|
+
}
|
|
291
|
+
render() {
|
|
292
|
+
/* Nothing when no tone was given, which is the common message: "Project
|
|
293
|
+
saved" is not an error, a warning or an announcement, and an icon there
|
|
294
|
+
would be decoration standing where meaning is supposed to be. `Callout`
|
|
295
|
+
falls back to `info` because a callout exists to set a passage apart and
|
|
296
|
+
is always *about* something; a toast is just the next thing that
|
|
297
|
+
happened. */
|
|
298
|
+
const mark = toneMark(this.tone);
|
|
299
|
+
return html `<div
|
|
300
|
+
part="item"
|
|
301
|
+
@mouseenter=${this.handlePause}
|
|
302
|
+
@mouseleave=${this.handleResume}
|
|
303
|
+
@focusin=${this.handlePause}
|
|
304
|
+
@focusout=${this.handleResume}
|
|
305
|
+
>
|
|
306
|
+
${mark
|
|
307
|
+
? html `<span part="icon">
|
|
308
|
+
${this.renderIcon(mark)}
|
|
309
|
+
</span>`
|
|
310
|
+
: nothing}
|
|
311
|
+
<div part="content"><slot></slot></div>
|
|
312
|
+
<div part="actions"><slot name="actions"></slot></div>
|
|
313
|
+
${this.dismissible
|
|
314
|
+
? html `<button
|
|
315
|
+
part="dismiss"
|
|
316
|
+
type="button"
|
|
317
|
+
aria-label=${this.dismissLabel}
|
|
318
|
+
@click=${() => this.dismiss()}
|
|
319
|
+
>
|
|
320
|
+
${this.renderDismissIcon()}
|
|
321
|
+
</button>`
|
|
322
|
+
: nothing}
|
|
323
|
+
${this.duration
|
|
324
|
+
? html `<div
|
|
325
|
+
part="timer"
|
|
326
|
+
style=${`--toast-duration: ${this.duration}ms`}
|
|
327
|
+
aria-hidden="true"
|
|
328
|
+
></div>`
|
|
329
|
+
: nothing}
|
|
330
|
+
</div>`;
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
__decorate([
|
|
334
|
+
property({ type: Number })
|
|
335
|
+
], HelixHeadlessToastItem.prototype, "duration", void 0);
|
|
336
|
+
__decorate([
|
|
337
|
+
property({ reflect: true })
|
|
338
|
+
], HelixHeadlessToastItem.prototype, "tone", void 0);
|
|
339
|
+
__decorate([
|
|
340
|
+
property({ type: Boolean })
|
|
341
|
+
], HelixHeadlessToastItem.prototype, "open", null);
|
|
342
|
+
HelixHeadlessToastItem = __decorate([
|
|
343
|
+
customElement('helix-headless-toast-item')
|
|
344
|
+
], HelixHeadlessToastItem);
|
|
345
|
+
export { HelixHeadlessToastItem };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
/**
|
|
4
|
+
* @summary The region messages arrive in, and the only thing that announces them.
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
* **The region is why this is one family rather than two.** A live region has
|
|
8
|
+
* to be in the document *before* a message is put into it: assistive technology
|
|
9
|
+
* subscribes to the region, and a region that arrives already holding its
|
|
10
|
+
* message is frequently not announced at all. So the container is a part of the
|
|
11
|
+
* family and not an arranger of complete things, which is the same reasoning
|
|
12
|
+
* that puts `Radio.Group` inside its own family.
|
|
13
|
+
*
|
|
14
|
+
* **Polite, never assertive.** `role="alert"` interrupts whatever a reader is
|
|
15
|
+
* being told, and almost nothing that arrives in a corner of the screen has
|
|
16
|
+
* earned that. Something that genuinely cannot wait is a `Dialog`, which stops
|
|
17
|
+
* the page for everyone rather than only for the people who cannot see it.
|
|
18
|
+
*
|
|
19
|
+
* **It never creates or destroys anything.** The consumer renders items and
|
|
20
|
+
* removes them; asking to go is a cancelable `helix-dismiss` from the item.
|
|
21
|
+
* That is still exactly true of the region: an item that has gone hides itself
|
|
22
|
+
* and stays in the tree, so a consumer whose state still lists it does not have
|
|
23
|
+
* their framework fighting a node this component took away. What changed is
|
|
24
|
+
* that the item no longer waits to be told before hiding, unless the consumer
|
|
25
|
+
* declared `open` and said the state is theirs.
|
|
26
|
+
* There is no `toast.show()`, because an imperative queue inside a component is
|
|
27
|
+
* a second copy of the application's state that nothing can render from: an app
|
|
28
|
+
* that wants a `toast()` function writes a thin one over the state it already
|
|
29
|
+
* has, and keeps the ability to render the same messages on the server, in a
|
|
30
|
+
* test, or twice.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.1.0
|
|
33
|
+
* @status experimental
|
|
34
|
+
* @category overlays
|
|
35
|
+
* @aliases Toaster, Snackbar, Notifications
|
|
36
|
+
* @documentation https://helix.fusion.dev/components/toast
|
|
37
|
+
*
|
|
38
|
+
* @slot - The messages, as `helix-toast-item` elements.
|
|
39
|
+
*
|
|
40
|
+
* @csspart region - The stack the messages are in.
|
|
41
|
+
*/
|
|
42
|
+
export declare class HelixHeadlessToast extends HelixElement {
|
|
43
|
+
/**
|
|
44
|
+
* Accessible name for the region, such as "Notifications".
|
|
45
|
+
*/
|
|
46
|
+
label: string;
|
|
47
|
+
/**
|
|
48
|
+
* Which corner or edge the stack sits at.
|
|
49
|
+
*
|
|
50
|
+
* Named here rather than on each message, because where a page puts its
|
|
51
|
+
* toasts is a fact about the page: a stack whose members disagreed about
|
|
52
|
+
* where they were would not be a stack.
|
|
53
|
+
*
|
|
54
|
+
* **Optional, and bottom-end is the absence of it.** It reflected *and*
|
|
55
|
+
* defaulted, which is the pair that writes onto a host: every toast region
|
|
56
|
+
* anybody rendered gained a `placement="bottom-end"` nobody typed, and a
|
|
57
|
+
* React consumer's server markup does not have it. The styled sheet carries
|
|
58
|
+
* the resting arrangement in its own `:host` rule now and the selectors
|
|
59
|
+
* describe only the departures, which is what `orientation` has always done.
|
|
60
|
+
*
|
|
61
|
+
* The SSR spec could never have caught it: it passed a placement explicitly,
|
|
62
|
+
* so the attribute it asserted was one the consumer had written.
|
|
63
|
+
*/
|
|
64
|
+
placement?: 'bottom-center' | 'bottom-end' | 'bottom-start' | 'top-center' | 'top-end' | 'top-start';
|
|
65
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
66
|
+
protected render(): TemplateResult;
|
|
67
|
+
}
|
|
68
|
+
declare global {
|
|
69
|
+
interface HTMLElementTagNameMap {
|
|
70
|
+
'helix-headless-toast': HelixHeadlessToast;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
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 { customElement, HelixElement, hostAria } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
/**
|
|
11
|
+
* @summary The region messages arrive in, and the only thing that announces them.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* **The region is why this is one family rather than two.** A live region has
|
|
15
|
+
* to be in the document *before* a message is put into it: assistive technology
|
|
16
|
+
* subscribes to the region, and a region that arrives already holding its
|
|
17
|
+
* message is frequently not announced at all. So the container is a part of the
|
|
18
|
+
* family and not an arranger of complete things, which is the same reasoning
|
|
19
|
+
* that puts `Radio.Group` inside its own family.
|
|
20
|
+
*
|
|
21
|
+
* **Polite, never assertive.** `role="alert"` interrupts whatever a reader is
|
|
22
|
+
* being told, and almost nothing that arrives in a corner of the screen has
|
|
23
|
+
* earned that. Something that genuinely cannot wait is a `Dialog`, which stops
|
|
24
|
+
* the page for everyone rather than only for the people who cannot see it.
|
|
25
|
+
*
|
|
26
|
+
* **It never creates or destroys anything.** The consumer renders items and
|
|
27
|
+
* removes them; asking to go is a cancelable `helix-dismiss` from the item.
|
|
28
|
+
* That is still exactly true of the region: an item that has gone hides itself
|
|
29
|
+
* and stays in the tree, so a consumer whose state still lists it does not have
|
|
30
|
+
* their framework fighting a node this component took away. What changed is
|
|
31
|
+
* that the item no longer waits to be told before hiding, unless the consumer
|
|
32
|
+
* declared `open` and said the state is theirs.
|
|
33
|
+
* There is no `toast.show()`, because an imperative queue inside a component is
|
|
34
|
+
* a second copy of the application's state that nothing can render from: an app
|
|
35
|
+
* that wants a `toast()` function writes a thin one over the state it already
|
|
36
|
+
* has, and keeps the ability to render the same messages on the server, in a
|
|
37
|
+
* test, or twice.
|
|
38
|
+
*
|
|
39
|
+
* @since 0.1.0
|
|
40
|
+
* @status experimental
|
|
41
|
+
* @category overlays
|
|
42
|
+
* @aliases Toaster, Snackbar, Notifications
|
|
43
|
+
* @documentation https://helix.fusion.dev/components/toast
|
|
44
|
+
*
|
|
45
|
+
* @slot - The messages, as `helix-toast-item` elements.
|
|
46
|
+
*
|
|
47
|
+
* @csspart region - The stack the messages are in.
|
|
48
|
+
*/
|
|
49
|
+
let HelixHeadlessToast = class HelixHeadlessToast extends HelixElement {
|
|
50
|
+
constructor() {
|
|
51
|
+
super(...arguments);
|
|
52
|
+
/**
|
|
53
|
+
* Accessible name for the region, such as "Notifications".
|
|
54
|
+
*/
|
|
55
|
+
this.label = 'Notifications';
|
|
56
|
+
}
|
|
57
|
+
willUpdate(changed) {
|
|
58
|
+
super.willUpdate(changed);
|
|
59
|
+
/* On the host through internals, so the region is a landmark to anything
|
|
60
|
+
walking the light DOM as well as to a screen reader, and so nothing is
|
|
61
|
+
written onto the host as an attribute a server's markup never had. */
|
|
62
|
+
hostAria(this.internals, { label: this.label, role: 'status' });
|
|
63
|
+
this.internals.ariaLive = 'polite';
|
|
64
|
+
/* Additions are what a reader needs; a message going away is not news, and
|
|
65
|
+
announcing removals means every dismissal is read out. */
|
|
66
|
+
this.internals.ariaRelevant = 'additions';
|
|
67
|
+
/* `role="status"` carries an implicit `aria-atomic="true"`, which means the
|
|
68
|
+
whole region is re-read whenever any part of it changes. With a stack of
|
|
69
|
+
four, the fifth arrival announces all five. `additions` alone does not
|
|
70
|
+
help: it says which mutations count, not how much is read out when one
|
|
71
|
+
does. Both are needed, and only one was here. */
|
|
72
|
+
this.internals.ariaAtomic = 'false';
|
|
73
|
+
}
|
|
74
|
+
render() {
|
|
75
|
+
return html `<div part="region"><slot></slot></div>`;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
__decorate([
|
|
79
|
+
property()
|
|
80
|
+
], HelixHeadlessToast.prototype, "label", void 0);
|
|
81
|
+
__decorate([
|
|
82
|
+
property({ reflect: true })
|
|
83
|
+
], HelixHeadlessToast.prototype, "placement", void 0);
|
|
84
|
+
HelixHeadlessToast = __decorate([
|
|
85
|
+
customElement('helix-headless-toast')
|
|
86
|
+
], HelixHeadlessToast);
|
|
87
|
+
export { HelixHeadlessToast };
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { DisabledCascadeController, HelixFormElement, KeyboardNavigationController } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
declare const HelixHeadlessToggleGroup_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerValueInterface) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinFieldInterface) & typeof HelixFormElement;
|
|
4
|
+
/**
|
|
5
|
+
* @summary A row of options with the selection marked by a moving indicator.
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* The indicator is one element that travels, not a background that appears on
|
|
9
|
+
* whichever item is current. That difference is the whole point: a fill that
|
|
10
|
+
* swaps is two things changing at once and reads as a flicker, while one that
|
|
11
|
+
* moves is a single object the eye follows, and it says where the selection
|
|
12
|
+
* came from as well as where it went.
|
|
13
|
+
*
|
|
14
|
+
* Its whole box is measured from the selected item and written onto
|
|
15
|
+
* the indicator as custom properties, because labels are different lengths and
|
|
16
|
+
* no proportion of the group is the right answer. Measurement is client-side by
|
|
17
|
+
* necessity, so the server renders the indicator hidden and it fades in once it
|
|
18
|
+
* has somewhere to be, which is the harmless direction: it appears rather than
|
|
19
|
+
* jumping from a wrong place.
|
|
20
|
+
*
|
|
21
|
+
* A radio group, and only that. Navigation is links marked with `aria-current`
|
|
22
|
+
* and styled by the `data-navigation-item` recipe: radio semantics would announce a
|
|
23
|
+
* set of destinations as a set of choices. A tab controls a panel.
|
|
24
|
+
*
|
|
25
|
+
* Being a radio group, it is a form control, and it says so through
|
|
26
|
+
* `HelixFormElement`: it reports its value under a `name`, comes back to the
|
|
27
|
+
* markup's choice on reset, and restores the one a reader made when the browser
|
|
28
|
+
* brings a form back.
|
|
29
|
+
*
|
|
30
|
+
* The semantics were already right: the host has carried `role="radiogroup"`
|
|
31
|
+
* and the items `role="radio"` from the start. What none of it did was reach a
|
|
32
|
+
* form. A button in a shadow root submits nothing whatever its role, so the
|
|
33
|
+
* value has to be reported by the host, which is the only thing a form can
|
|
34
|
+
* see.
|
|
35
|
+
*
|
|
36
|
+
* @since 0.1.0
|
|
37
|
+
* @status experimental
|
|
38
|
+
* @aliases SegmentedControl, Segmented, Navigation, Switcher
|
|
39
|
+
* @documentation https://helix.fusion.dev/components/toggle-group
|
|
40
|
+
*
|
|
41
|
+
* @slot - The group's items.
|
|
42
|
+
*
|
|
43
|
+
* @event {Event} change - Announced once the value has moved.
|
|
44
|
+
* @event {HelixBeforeChangeEvent} helix-before-change - Fired before the answer moves, and cancelable. The only way to refuse one.
|
|
45
|
+
* @event {HelixSelectEvent} helix-select - Fired when an item is chosen. Dispatched by the item and listened for here. Cancelable: refusing it takes the decision and nothing moves.
|
|
46
|
+
* @event {Event} input - Announced once the value has moved.
|
|
47
|
+
*
|
|
48
|
+
* @csspart divider - The rule after an inline label, separating it from the items.
|
|
49
|
+
* @csspart feedback - What is wrong with it.
|
|
50
|
+
* @csspart hint - Help under the row, while nothing is wrong.
|
|
51
|
+
* @csspart indicator - The moving marker behind the selected item.
|
|
52
|
+
* @csspart label - The question, over the row.
|
|
53
|
+
* @csspart row - The line the track sits on, with whatever flanks it.
|
|
54
|
+
* @csspart track - The bar the items sit in.
|
|
55
|
+
*/
|
|
56
|
+
export declare class HelixHeadlessToggleGroup extends HelixHeadlessToggleGroup_base {
|
|
57
|
+
/**
|
|
58
|
+
* Marks the chosen item, which used to happen inside the placing method.
|
|
59
|
+
*
|
|
60
|
+
* They were one method because the geometry needed the active item anyway,
|
|
61
|
+
* and that made a selection change look like a layout concern. `resolveActiveItem`
|
|
62
|
+
* rather than the first item, because a group opening on a disabled segment
|
|
63
|
+
* marked it as chosen.
|
|
64
|
+
*/
|
|
65
|
+
private sync;
|
|
66
|
+
private readonly indicator;
|
|
67
|
+
private observer;
|
|
68
|
+
protected readonly keys: KeyboardNavigationController;
|
|
69
|
+
protected readonly cascade: DisabledCascadeController;
|
|
70
|
+
private get items();
|
|
71
|
+
/**
|
|
72
|
+
* Watches the group and every item it currently holds.
|
|
73
|
+
*
|
|
74
|
+
* Called again on `slotchange`, because the set was read once at first paint:
|
|
75
|
+
* an item added later was measured by nothing, so a group whose options
|
|
76
|
+
* arrive with the data had a thumb that stopped following the moment one of
|
|
77
|
+
* them changed width. Observing the same element twice is a no-op, so there
|
|
78
|
+
* is nothing to unwind first.
|
|
79
|
+
*/
|
|
80
|
+
private watch;
|
|
81
|
+
private readonly handleSelection;
|
|
82
|
+
connectedCallback(): void;
|
|
83
|
+
disconnectedCallback(): void;
|
|
84
|
+
protected firstUpdated(changed: PropertyValues): void;
|
|
85
|
+
/** The observer the items are registered on, rebuilt with them. */
|
|
86
|
+
private measure;
|
|
87
|
+
protected updated(changed: PropertyValues): void;
|
|
88
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
89
|
+
/**
|
|
90
|
+
* The verdict on the answer, which `required` had been asking for and not
|
|
91
|
+
* getting.
|
|
92
|
+
*
|
|
93
|
+
* `required` arrived with `MixinField` and nothing enforced it: the attribute
|
|
94
|
+
* reflected, the marker rendered beside the label, and a form with an
|
|
95
|
+
* unanswered group submitted anyway. An API that exists and does nothing is
|
|
96
|
+
* worse than one that is missing, because the marker is a promise to the
|
|
97
|
+
* reader that something will stop them.
|
|
98
|
+
*
|
|
99
|
+
* The anchor is the track rather than the host, so the browser's own bubble
|
|
100
|
+
* points at the control rather than at a box with nothing in it.
|
|
101
|
+
*/
|
|
102
|
+
private validate;
|
|
103
|
+
/**
|
|
104
|
+
* Where the group's label sits, `start` putting it on the track's line.
|
|
105
|
+
*
|
|
106
|
+
* Absent is above, which is what a field looks like and what almost every
|
|
107
|
+
* group wants. `start` is for a row of controls that are labeled rather than
|
|
108
|
+
* a form of fields: a toolbar reads as one line, and a label stacked over
|
|
109
|
+
* every group in it turns one row into two.
|
|
110
|
+
*
|
|
111
|
+
* **A placement rather than a slot, and that is the whole point of it.** A
|
|
112
|
+
* `start` slot would let a consumer put the word there, and would also let
|
|
113
|
+
* them put it there *instead of* setting `label`, which is the group's
|
|
114
|
+
* accessible name: the set would then be named for nobody using a screen
|
|
115
|
+
* reader while looking correct to everybody else. Worse, setting both draws
|
|
116
|
+
* it twice. One property moves the label the consumer already has to give,
|
|
117
|
+
* and cannot be used to remove it.
|
|
118
|
+
*/
|
|
119
|
+
labelPlacement?: 'start';
|
|
120
|
+
/**
|
|
121
|
+
* The row the track sits in, so something can sit beside it.
|
|
122
|
+
*
|
|
123
|
+
* **Bare slots, and a wrapper only around the row itself.** An unassigned
|
|
124
|
+
* slot is `display: contents` in the UA stylesheet and generates no box at
|
|
125
|
+
* all, so a group with nothing slotted lays out exactly as it did before this
|
|
126
|
+
* existed: no grid track, no flex item, no gap. Wrapping each side in a div
|
|
127
|
+
* instead would paint an empty inset band on every group in the library that
|
|
128
|
+
* never asked for one, which is the measurement Card already paid for.
|
|
129
|
+
*
|
|
130
|
+
* The row does always generate a box, and is entitled to: the track is always
|
|
131
|
+
* in it.
|
|
132
|
+
*/
|
|
133
|
+
protected render(): TemplateResult;
|
|
134
|
+
}
|
|
135
|
+
declare global {
|
|
136
|
+
interface HTMLElementTagNameMap {
|
|
137
|
+
'helix-headless-toggle-group': HelixHeadlessToggleGroup;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export {};
|