@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,130 @@
|
|
|
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, IndicatorController } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
/**
|
|
11
|
+
* @summary A set of destinations, with a marker on the current one.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* Renders a real `<nav>`, which is the landmark a screen-reader user jumps to.
|
|
15
|
+
* It exists as its own component rather than as a region of `AppHeader` because
|
|
16
|
+
* a header is not inherently navigation, and navigation is not only ever in a
|
|
17
|
+
* header: a footer and a sidebar hold the same thing.
|
|
18
|
+
*
|
|
19
|
+
* **It renders no links.** The consumer brings them, marked with
|
|
20
|
+
* `aria-current="page"` and styled by the `data-navigation-item` recipe, for the same
|
|
21
|
+
* reason nothing else here renders an anchor: a router renders its own, and
|
|
22
|
+
* cannot render it inside this shadow root.
|
|
23
|
+
*
|
|
24
|
+
* What this owns is the marker that travels between them, and that is the whole
|
|
25
|
+
* reason it is a component. A marker that moves needs something that knows
|
|
26
|
+
* where every item is, and reading `aria-current` is how it knows which: the
|
|
27
|
+
* thing that makes the page announce correctly is the same thing that puts the
|
|
28
|
+
* marker in the right place.
|
|
29
|
+
*
|
|
30
|
+
* @since 0.1.0
|
|
31
|
+
* @status experimental
|
|
32
|
+
* @category navigation
|
|
33
|
+
* @aliases Nav, NavList, Tabs
|
|
34
|
+
* @documentation https://helix.fusion.dev/components/navigation
|
|
35
|
+
*
|
|
36
|
+
* @slot - The destinations, as the consumer's own links.
|
|
37
|
+
*
|
|
38
|
+
* @csspart indicator - The marker that travels to the current destination.
|
|
39
|
+
* @csspart nav - The navigation landmark.
|
|
40
|
+
*/
|
|
41
|
+
let HelixHeadlessNavigation = class HelixHeadlessNavigation extends HelixElement {
|
|
42
|
+
constructor() {
|
|
43
|
+
super(...arguments);
|
|
44
|
+
/* The mark, and the RTL sign and border correction that came with it. This
|
|
45
|
+
was hand-written and had neither: the distance was measured from the
|
|
46
|
+
physical left and applied from the inline-start edge, so it traveled the
|
|
47
|
+
wrong way in a right-to-left document. */
|
|
48
|
+
this.indicator = new IndicatorController(this, {
|
|
49
|
+
active: () => this.items.find((item) => item.getAttribute('aria-current') === 'page'),
|
|
50
|
+
indicator: () => this.renderRoot?.querySelector('[part="indicator"]'),
|
|
51
|
+
surface: () => this.renderRoot?.querySelector('[part="nav"]'),
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* Accessible name for the landmark.
|
|
55
|
+
*/
|
|
56
|
+
this.label = 'Main';
|
|
57
|
+
}
|
|
58
|
+
/** The destinations the consumer slotted. */
|
|
59
|
+
get items() {
|
|
60
|
+
const slot = this.renderRoot.querySelector('slot');
|
|
61
|
+
return (slot?.assignedElements() ?? []);
|
|
62
|
+
}
|
|
63
|
+
/** Re-measures when the links change, move, or hand over the current page. */
|
|
64
|
+
watch() {
|
|
65
|
+
this.observer?.disconnect();
|
|
66
|
+
this.current?.disconnect();
|
|
67
|
+
/* Nothing is written onto the items any more.
|
|
68
|
+
*
|
|
69
|
+
* `data-navigation-item` used to be put here, because the base layer styled a
|
|
70
|
+
* destination with it and forgetting it was silent and total: the links
|
|
71
|
+
* kept working and came out as bare underlined anchors. Writing it fixed
|
|
72
|
+
* that and bought two problems. It happened after upgrade, so a
|
|
73
|
+
* server-rendered nav arrived unstyled and restyled itself a frame later;
|
|
74
|
+
* and a React consumer who wrote the attribute themselves got
|
|
75
|
+
* `data-navigation-item="true"` from JSX, which this then had to be careful not to
|
|
76
|
+
* overwrite or hydration reported a mismatch.
|
|
77
|
+
*
|
|
78
|
+
* The base layer selects `helix-navigation a` as well now, so the styling is
|
|
79
|
+
* true the moment the markup is parsed, on the server and on the client,
|
|
80
|
+
* and there is nothing to write or to be careful about. */
|
|
81
|
+
this.indicator.place();
|
|
82
|
+
this.observer = new ResizeObserver(() => this.indicator.place());
|
|
83
|
+
this.observer.observe(this);
|
|
84
|
+
for (const item of this.items) {
|
|
85
|
+
this.observer.observe(item);
|
|
86
|
+
}
|
|
87
|
+
// Client-side routing changes `aria-current` in place rather than
|
|
88
|
+
// reloading, so nothing else would tell the marker to move.
|
|
89
|
+
this.current = new MutationObserver(() => this.indicator.place());
|
|
90
|
+
for (const item of this.items) {
|
|
91
|
+
this.current.observe(item, { attributeFilter: ['aria-current'] });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/* Rebuilt on reconnection, because nothing else does it.
|
|
95
|
+
*
|
|
96
|
+
* `firstUpdated` runs once for the life of the element and
|
|
97
|
+
* `disconnectedCallback` runs every time it moves, so a framework reordering
|
|
98
|
+
* a list left this permanently dead: the observer gone, nothing to rebuild
|
|
99
|
+
* it, and the component still rendering as though it were watching. Guarded
|
|
100
|
+
* on `hasUpdated`, because the first connection happens before the first
|
|
101
|
+
* render and there is nothing to watch yet. `check:observers` holds it. */
|
|
102
|
+
connectedCallback() {
|
|
103
|
+
super.connectedCallback();
|
|
104
|
+
if (this.hasUpdated) {
|
|
105
|
+
this.watch();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
disconnectedCallback() {
|
|
109
|
+
super.disconnectedCallback();
|
|
110
|
+
this.observer?.disconnect();
|
|
111
|
+
this.current?.disconnect();
|
|
112
|
+
}
|
|
113
|
+
firstUpdated(changed) {
|
|
114
|
+
super.firstUpdated(changed);
|
|
115
|
+
this.watch();
|
|
116
|
+
}
|
|
117
|
+
render() {
|
|
118
|
+
return html `<nav part="nav" aria-label=${this.label}>
|
|
119
|
+
<div part="indicator" aria-hidden="true"></div>
|
|
120
|
+
<slot @slotchange=${() => this.watch()}></slot>
|
|
121
|
+
</nav>`;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
__decorate([
|
|
125
|
+
property()
|
|
126
|
+
], HelixHeadlessNavigation.prototype, "label", void 0);
|
|
127
|
+
HelixHeadlessNavigation = __decorate([
|
|
128
|
+
customElement('helix-headless-navigation')
|
|
129
|
+
], HelixHeadlessNavigation);
|
|
130
|
+
export { HelixHeadlessNavigation };
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { nothing, type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
import '../../format-date/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* @summary One thing that happened, which a reader may not have seen yet.
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* A notification is a toast that did not go away. `helix-toast` is deliberately
|
|
9
|
+
* the opposite of this: a live region whose items carry a `duration` and whose
|
|
10
|
+
* root never creates or destroys anything. What makes this its own family is the
|
|
11
|
+
* state each item carries rather than the arrangement it sits in: read and
|
|
12
|
+
* unread, a timestamp that has to stay correct, and an action a reader can take
|
|
13
|
+
* later.
|
|
14
|
+
*
|
|
15
|
+
* **The row is a label, a caption under it, and one trailing column that holds
|
|
16
|
+
* either the time or the controls.** A feed is scanned rather than read, so the
|
|
17
|
+
* thing that happened gets the first line on its own and everything qualifying
|
|
18
|
+
* it goes under. The time and the controls occupy the same place because a
|
|
19
|
+
* reader wants exactly one of them at a time: the time while they are scanning,
|
|
20
|
+
* and what they can do about it once they have stopped on a row.
|
|
21
|
+
*
|
|
22
|
+
* **The timestamp is `helix-format-date`**, which is where the reading, the
|
|
23
|
+
* `<time datetime>` and the shared timer now live. It was implemented here, and
|
|
24
|
+
* a component that formats a date is not a fact about notifications: Chat wanted
|
|
25
|
+
* the same thing and had its own copy of half of it.
|
|
26
|
+
*
|
|
27
|
+
* **Read state is reported, not invented.** Marking something read is usually a
|
|
28
|
+
* round trip, and a component that flips its own state and then hears the
|
|
29
|
+
* request failed has told the reader something untrue. `helix-read` is
|
|
30
|
+
* cancelable, and a `read` set by the consumer makes this element defer entirely.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.1.0
|
|
33
|
+
* @status experimental
|
|
34
|
+
* @category feedback
|
|
35
|
+
* @aliases Notification item, Inbox item
|
|
36
|
+
* @documentation https://helix.fusion.dev/components/notifications
|
|
37
|
+
*
|
|
38
|
+
* @slot - What happened, in the consumer's own markup.
|
|
39
|
+
* @slot actions - What a reader can do about it.
|
|
40
|
+
* @slot caption - A second line qualifying it, quieter than the first. A bare
|
|
41
|
+
* slot rather than a box, so an item without one pays nothing for it; style it
|
|
42
|
+
* through `::slotted()`.
|
|
43
|
+
* @slot media - An avatar or icon identifying who or what it came from.
|
|
44
|
+
*
|
|
45
|
+
* @event {HelixDismissEvent} helix-dismiss - Fired when a reader asks to remove it, and cancelable.
|
|
46
|
+
* @event {HelixReadEvent} helix-read - Fired when the item is marked read or unread, and cancelable.
|
|
47
|
+
*
|
|
48
|
+
* @csspart actions - The trailing slot's box.
|
|
49
|
+
* @csspart body - The label and the caption together.
|
|
50
|
+
* @csspart controls - The actions and the dismiss, which replace the time.
|
|
51
|
+
* @csspart dismiss - The control that removes it.
|
|
52
|
+
* @csspart dismiss-mark - The glyph on that control, where none is slotted.
|
|
53
|
+
* @csspart item - The whole notification.
|
|
54
|
+
* @csspart label - What happened, on the first line.
|
|
55
|
+
* @csspart media - The leading slot's box.
|
|
56
|
+
* @csspart time - When it happened, read the way a person reads one.
|
|
57
|
+
* @csspart trailing - The column holding the time and the controls.
|
|
58
|
+
*/
|
|
59
|
+
export declare class HelixHeadlessNotification extends HelixElement {
|
|
60
|
+
/**
|
|
61
|
+
* When it happened, as anything `Date` parses.
|
|
62
|
+
*
|
|
63
|
+
* An ISO string is what an API sends and what `<time datetime>` takes, so it
|
|
64
|
+
* is the shape that needs no translation at either end. Left unset the item
|
|
65
|
+
* shows no timestamp rather than showing the epoch, which is what parsing an
|
|
66
|
+
* empty string would give.
|
|
67
|
+
*/
|
|
68
|
+
at: string;
|
|
69
|
+
/**
|
|
70
|
+
* Whether the reader has seen it.
|
|
71
|
+
*
|
|
72
|
+
* Set it and this element defers: a reader's click fires `helix-read` and
|
|
73
|
+
* changes nothing until a new value arrives. `default-read` seeds a state
|
|
74
|
+
* this element then owns.
|
|
75
|
+
*
|
|
76
|
+
* **Not reflected, and it was until 27 Aug 2026.** The reason given was that
|
|
77
|
+
* unread is a visual state and a stylesheet has no other way to know, which
|
|
78
|
+
* is the same reason the four mixins mirror theirs, and the mirror may not be
|
|
79
|
+
* the property's own attribute: `<helix-notification default-read>`
|
|
80
|
+
* came back from a server without `read` and gained it on the first update,
|
|
81
|
+
* which React reports as a hydration mismatch, and a copy of the serialized
|
|
82
|
+
* element re-parses that attribute as a declaration. `:state(read)` is what
|
|
83
|
+
* the stylesheet reads now. Found by `hydration.dom.spec.ts` on the day it
|
|
84
|
+
* learned to mount an element a consumer had configured rather than a bare
|
|
85
|
+
* one.
|
|
86
|
+
*
|
|
87
|
+
*
|
|
88
|
+
*/
|
|
89
|
+
get read(): boolean;
|
|
90
|
+
set read(next: boolean);
|
|
91
|
+
/**
|
|
92
|
+
* State to open with, where nothing declared one.
|
|
93
|
+
*/
|
|
94
|
+
defaultRead: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Whether a reader may remove it.
|
|
97
|
+
*/
|
|
98
|
+
dismissible: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Locale for the timestamp.
|
|
101
|
+
*
|
|
102
|
+
* Empty is the runtime's own.
|
|
103
|
+
*/
|
|
104
|
+
locale: string;
|
|
105
|
+
/**
|
|
106
|
+
* Accessible name for the dismiss control.
|
|
107
|
+
*/
|
|
108
|
+
dismissLabel: string;
|
|
109
|
+
/**
|
|
110
|
+
* @internal Read by the list to identify its children across the light DOM,
|
|
111
|
+
* which is cheaper than `instanceof` and is why this is public rather than
|
|
112
|
+
* protected. Not a consumer's to read or set.
|
|
113
|
+
*/
|
|
114
|
+
readonly isNotification = true;
|
|
115
|
+
private readState;
|
|
116
|
+
/**
|
|
117
|
+
* Asks to be marked read, and reports whether the request stood.
|
|
118
|
+
*
|
|
119
|
+
* Public because a consumer's own control is as likely to ask as this
|
|
120
|
+
* element's own markup is, and because a list marking everything read has to
|
|
121
|
+
* go through the same request rather than writing the property behind it.
|
|
122
|
+
*/
|
|
123
|
+
markRead(next?: boolean): boolean;
|
|
124
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
125
|
+
protected updated(changed: PropertyValues): void;
|
|
126
|
+
/**
|
|
127
|
+
* Says whether there is anything for the time to make way for.
|
|
128
|
+
*
|
|
129
|
+
* The trailing column holds the time and the controls in one place and shows
|
|
130
|
+
* one of them, so a row with nothing to do about it would hide its timestamp
|
|
131
|
+
* on hover and put nothing there. `dismissible` this element knows on the
|
|
132
|
+
* server; whether a consumer filled the actions slot it can only find out from
|
|
133
|
+
* a DOM, so this runs after the render and the resting answer, no controls, is
|
|
134
|
+
* the one the server writes.
|
|
135
|
+
*/
|
|
136
|
+
private markControls;
|
|
137
|
+
/**
|
|
138
|
+
* The control that removes the item, with the mark a consumer can replace.
|
|
139
|
+
*
|
|
140
|
+
* **A method rather than markup inside `render`, and the slot moves with
|
|
141
|
+
* it.** A fallback answers a consumer and a seam answers the tier above, which
|
|
142
|
+
* are different people: the styled tier wants an icon here, and with the slot
|
|
143
|
+
* written inline the only way to change it is to reimplement the whole
|
|
144
|
+
* template. `check:fallbacks` holds that, and moving only the fallback out was
|
|
145
|
+
* not enough, which is the right rule: the slot is the thing a tier redraws.
|
|
146
|
+
*
|
|
147
|
+
* **The mark is drawn rather than typed, which is what lets it align.** It was
|
|
148
|
+
* `×`, and a character is placed by its font rather than by its box:
|
|
149
|
+
* measured against the ghost button beside it at 8x, the cross carried 6
|
|
150
|
+
* pixels of ink to the label's 9.5 and sat 1.5 pixels below its center, in two
|
|
151
|
+
* boxes whose own centers agreed to a tenth of a pixel. No stylesheet can
|
|
152
|
+
* correct that, because the offset is inside the glyph. An `<svg>` is centered
|
|
153
|
+
* on its own viewBox, so it lands where the box says and takes the icon step
|
|
154
|
+
* the row is already set in. It is the `x` the Tag's dismiss draws, so two
|
|
155
|
+
* controls that mean "take this away" are one mark.
|
|
156
|
+
*/
|
|
157
|
+
protected renderDismiss(): TemplateResult | typeof nothing;
|
|
158
|
+
/**
|
|
159
|
+
* When it happened, delegated whole.
|
|
160
|
+
*
|
|
161
|
+
* The tag is interpolated rather than written, so each tier renders its own:
|
|
162
|
+
* the base tier may not name a styled element, and a styled item inherits this
|
|
163
|
+
* template without having a tag of its own to remind anybody. `check:composed`
|
|
164
|
+
* holds both halves.
|
|
165
|
+
*
|
|
166
|
+
* `exportparts` and no `part` of its own, which is the rule about a part
|
|
167
|
+
* already named for its role: the child publishes `time`, the role here is
|
|
168
|
+
* `time`, and naming both would leave `::part(time)` matching two elements.
|
|
169
|
+
* What a consumer wants to reach is the `<time>`, so that is what the name
|
|
170
|
+
* reaches.
|
|
171
|
+
*/
|
|
172
|
+
private renderTime;
|
|
173
|
+
protected render(): TemplateResult;
|
|
174
|
+
private readonly handleActions;
|
|
175
|
+
private readonly handleDismiss;
|
|
176
|
+
}
|
|
177
|
+
declare global {
|
|
178
|
+
interface HTMLElementTagNameMap {
|
|
179
|
+
'helix-headless-notification': HelixHeadlessNotification;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
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, HelixDismissEvent, HelixElement, HelixReadEvent, hostAria, requestChange, slotFilled, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { x } from '@fusion.dev/helix-icons';
|
|
9
|
+
import { nothing } from 'lit';
|
|
10
|
+
import { property } from 'lit/decorators.js';
|
|
11
|
+
import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
|
|
12
|
+
/* `lit/static-html.js`, because this template interpolates a tag name and the
|
|
13
|
+
plain `html` cannot: it renders the placeholder as the element instead, which
|
|
14
|
+
shifts every attribute after it by one. See `renderTime`. */
|
|
15
|
+
import { html } from 'lit/static-html.js';
|
|
16
|
+
/* Side-effect import, because this template interpolates the family's tag and a
|
|
17
|
+
custom element registers on import. Both tiers import it, each resolving to
|
|
18
|
+
its own; `check:composed` enforces that. */
|
|
19
|
+
import '../../format-date/index.js';
|
|
20
|
+
/**
|
|
21
|
+
* @summary One thing that happened, which a reader may not have seen yet.
|
|
22
|
+
*
|
|
23
|
+
* @description
|
|
24
|
+
* A notification is a toast that did not go away. `helix-toast` is deliberately
|
|
25
|
+
* the opposite of this: a live region whose items carry a `duration` and whose
|
|
26
|
+
* root never creates or destroys anything. What makes this its own family is the
|
|
27
|
+
* state each item carries rather than the arrangement it sits in: read and
|
|
28
|
+
* unread, a timestamp that has to stay correct, and an action a reader can take
|
|
29
|
+
* later.
|
|
30
|
+
*
|
|
31
|
+
* **The row is a label, a caption under it, and one trailing column that holds
|
|
32
|
+
* either the time or the controls.** A feed is scanned rather than read, so the
|
|
33
|
+
* thing that happened gets the first line on its own and everything qualifying
|
|
34
|
+
* it goes under. The time and the controls occupy the same place because a
|
|
35
|
+
* reader wants exactly one of them at a time: the time while they are scanning,
|
|
36
|
+
* and what they can do about it once they have stopped on a row.
|
|
37
|
+
*
|
|
38
|
+
* **The timestamp is `helix-format-date`**, which is where the reading, the
|
|
39
|
+
* `<time datetime>` and the shared timer now live. It was implemented here, and
|
|
40
|
+
* a component that formats a date is not a fact about notifications: Chat wanted
|
|
41
|
+
* the same thing and had its own copy of half of it.
|
|
42
|
+
*
|
|
43
|
+
* **Read state is reported, not invented.** Marking something read is usually a
|
|
44
|
+
* round trip, and a component that flips its own state and then hears the
|
|
45
|
+
* request failed has told the reader something untrue. `helix-read` is
|
|
46
|
+
* cancelable, and a `read` set by the consumer makes this element defer entirely.
|
|
47
|
+
*
|
|
48
|
+
* @since 0.1.0
|
|
49
|
+
* @status experimental
|
|
50
|
+
* @category feedback
|
|
51
|
+
* @aliases Notification item, Inbox item
|
|
52
|
+
* @documentation https://helix.fusion.dev/components/notifications
|
|
53
|
+
*
|
|
54
|
+
* @slot - What happened, in the consumer's own markup.
|
|
55
|
+
* @slot actions - What a reader can do about it.
|
|
56
|
+
* @slot caption - A second line qualifying it, quieter than the first. A bare
|
|
57
|
+
* slot rather than a box, so an item without one pays nothing for it; style it
|
|
58
|
+
* through `::slotted()`.
|
|
59
|
+
* @slot media - An avatar or icon identifying who or what it came from.
|
|
60
|
+
*
|
|
61
|
+
* @event {HelixDismissEvent} helix-dismiss - Fired when a reader asks to remove it, and cancelable.
|
|
62
|
+
* @event {HelixReadEvent} helix-read - Fired when the item is marked read or unread, and cancelable.
|
|
63
|
+
*
|
|
64
|
+
* @csspart actions - The trailing slot's box.
|
|
65
|
+
* @csspart body - The label and the caption together.
|
|
66
|
+
* @csspart controls - The actions and the dismiss, which replace the time.
|
|
67
|
+
* @csspart dismiss - The control that removes it.
|
|
68
|
+
* @csspart dismiss-mark - The glyph on that control, where none is slotted.
|
|
69
|
+
* @csspart item - The whole notification.
|
|
70
|
+
* @csspart label - What happened, on the first line.
|
|
71
|
+
* @csspart media - The leading slot's box.
|
|
72
|
+
* @csspart time - When it happened, read the way a person reads one.
|
|
73
|
+
* @csspart trailing - The column holding the time and the controls.
|
|
74
|
+
*/
|
|
75
|
+
let HelixHeadlessNotification = class HelixHeadlessNotification extends HelixElement {
|
|
76
|
+
constructor() {
|
|
77
|
+
super(...arguments);
|
|
78
|
+
/**
|
|
79
|
+
* When it happened, as anything `Date` parses.
|
|
80
|
+
*
|
|
81
|
+
* An ISO string is what an API sends and what `<time datetime>` takes, so it
|
|
82
|
+
* is the shape that needs no translation at either end. Left unset the item
|
|
83
|
+
* shows no timestamp rather than showing the epoch, which is what parsing an
|
|
84
|
+
* empty string would give.
|
|
85
|
+
*/
|
|
86
|
+
this.at = '';
|
|
87
|
+
/**
|
|
88
|
+
* State to open with, where nothing declared one.
|
|
89
|
+
*/
|
|
90
|
+
this.defaultRead = false;
|
|
91
|
+
/**
|
|
92
|
+
* Whether a reader may remove it.
|
|
93
|
+
*/
|
|
94
|
+
this.dismissible = false;
|
|
95
|
+
/**
|
|
96
|
+
* Locale for the timestamp.
|
|
97
|
+
*
|
|
98
|
+
* Empty is the runtime's own.
|
|
99
|
+
*/
|
|
100
|
+
this.locale = '';
|
|
101
|
+
/**
|
|
102
|
+
* Accessible name for the dismiss control.
|
|
103
|
+
*/
|
|
104
|
+
this.dismissLabel = 'Dismiss';
|
|
105
|
+
/**
|
|
106
|
+
* @internal Read by the list to identify its children across the light DOM,
|
|
107
|
+
* which is cheaper than `instanceof` and is why this is public rather than
|
|
108
|
+
* protected. Not a consumer's to read or set.
|
|
109
|
+
*/
|
|
110
|
+
this.isNotification = true;
|
|
111
|
+
this.readState = undefined;
|
|
112
|
+
/* Content arriving from the light DOM changes no property here, so nothing
|
|
113
|
+
would schedule the re-read. Bound to the slot rather than to the host,
|
|
114
|
+
because `slotchange` bubbles and is not composed: it reaches the shadow root
|
|
115
|
+
that owns the slot and stops there. */
|
|
116
|
+
this.handleActions = () => {
|
|
117
|
+
this.markControls();
|
|
118
|
+
};
|
|
119
|
+
this.handleDismiss = (event) => {
|
|
120
|
+
event.stopPropagation();
|
|
121
|
+
if (this.dispatchEvent(new HelixDismissEvent({ label: this.textContent?.trim() ?? '' }))) {
|
|
122
|
+
this.remove();
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Whether the reader has seen it.
|
|
128
|
+
*
|
|
129
|
+
* Set it and this element defers: a reader's click fires `helix-read` and
|
|
130
|
+
* changes nothing until a new value arrives. `default-read` seeds a state
|
|
131
|
+
* this element then owns.
|
|
132
|
+
*
|
|
133
|
+
* **Not reflected, and it was until 27 Aug 2026.** The reason given was that
|
|
134
|
+
* unread is a visual state and a stylesheet has no other way to know, which
|
|
135
|
+
* is the same reason the four mixins mirror theirs, and the mirror may not be
|
|
136
|
+
* the property's own attribute: `<helix-notification default-read>`
|
|
137
|
+
* came back from a server without `read` and gained it on the first update,
|
|
138
|
+
* which React reports as a hydration mismatch, and a copy of the serialized
|
|
139
|
+
* element re-parses that attribute as a declaration. `:state(read)` is what
|
|
140
|
+
* the stylesheet reads now. Found by `hydration.dom.spec.ts` on the day it
|
|
141
|
+
* learned to mount an element a consumer had configured rather than a bare
|
|
142
|
+
* one.
|
|
143
|
+
*
|
|
144
|
+
*
|
|
145
|
+
*/
|
|
146
|
+
get read() {
|
|
147
|
+
return this.readState ?? this.defaultRead;
|
|
148
|
+
}
|
|
149
|
+
set read(next) {
|
|
150
|
+
const previous = this.read;
|
|
151
|
+
this.readState = next;
|
|
152
|
+
this.requestUpdate('read', previous);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Asks to be marked read, and reports whether the request stood.
|
|
156
|
+
*
|
|
157
|
+
* Public because a consumer's own control is as likely to ask as this
|
|
158
|
+
* element's own markup is, and because a list marking everything read has to
|
|
159
|
+
* go through the same request rather than writing the property behind it.
|
|
160
|
+
*/
|
|
161
|
+
markRead(next = true) {
|
|
162
|
+
if (next === this.read) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
return requestChange({
|
|
166
|
+
apply: (read) => {
|
|
167
|
+
const previous = this.read;
|
|
168
|
+
this.readState = read;
|
|
169
|
+
this.requestUpdate('read', previous);
|
|
170
|
+
},
|
|
171
|
+
event: (read) => new HelixReadEvent({ read }),
|
|
172
|
+
host: this,
|
|
173
|
+
next,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
willUpdate(changed) {
|
|
177
|
+
super.willUpdate(changed);
|
|
178
|
+
hostAria(this.internals, { role: 'listitem' });
|
|
179
|
+
/* The mirror the stylesheet selects on, kept off the host's attributes for
|
|
180
|
+
the reason on `read` itself. */
|
|
181
|
+
this.toggleState('read', this.read);
|
|
182
|
+
}
|
|
183
|
+
updated(changed) {
|
|
184
|
+
super.updated(changed);
|
|
185
|
+
this.markControls();
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Says whether there is anything for the time to make way for.
|
|
189
|
+
*
|
|
190
|
+
* The trailing column holds the time and the controls in one place and shows
|
|
191
|
+
* one of them, so a row with nothing to do about it would hide its timestamp
|
|
192
|
+
* on hover and put nothing there. `dismissible` this element knows on the
|
|
193
|
+
* server; whether a consumer filled the actions slot it can only find out from
|
|
194
|
+
* a DOM, so this runs after the render and the resting answer, no controls, is
|
|
195
|
+
* the one the server writes.
|
|
196
|
+
*/
|
|
197
|
+
markControls() {
|
|
198
|
+
const slot = this.renderRoot?.querySelector('slot[name="actions"]');
|
|
199
|
+
this.toggleState('controls', this.dismissible || slotFilled(slot));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* The control that removes the item, with the mark a consumer can replace.
|
|
203
|
+
*
|
|
204
|
+
* **A method rather than markup inside `render`, and the slot moves with
|
|
205
|
+
* it.** A fallback answers a consumer and a seam answers the tier above, which
|
|
206
|
+
* are different people: the styled tier wants an icon here, and with the slot
|
|
207
|
+
* written inline the only way to change it is to reimplement the whole
|
|
208
|
+
* template. `check:fallbacks` holds that, and moving only the fallback out was
|
|
209
|
+
* not enough, which is the right rule: the slot is the thing a tier redraws.
|
|
210
|
+
*
|
|
211
|
+
* **The mark is drawn rather than typed, which is what lets it align.** It was
|
|
212
|
+
* `×`, and a character is placed by its font rather than by its box:
|
|
213
|
+
* measured against the ghost button beside it at 8x, the cross carried 6
|
|
214
|
+
* pixels of ink to the label's 9.5 and sat 1.5 pixels below its center, in two
|
|
215
|
+
* boxes whose own centers agreed to a tenth of a pixel. No stylesheet can
|
|
216
|
+
* correct that, because the offset is inside the glyph. An `<svg>` is centered
|
|
217
|
+
* on its own viewBox, so it lands where the box says and takes the icon step
|
|
218
|
+
* the row is already set in. It is the `x` the Tag's dismiss draws, so two
|
|
219
|
+
* controls that mean "take this away" are one mark.
|
|
220
|
+
*/
|
|
221
|
+
renderDismiss() {
|
|
222
|
+
if (!this.dismissible) {
|
|
223
|
+
return nothing;
|
|
224
|
+
}
|
|
225
|
+
return html `<button
|
|
226
|
+
part="dismiss"
|
|
227
|
+
type="button"
|
|
228
|
+
aria-label=${this.dismissLabel}
|
|
229
|
+
@click=${this.handleDismiss}
|
|
230
|
+
>
|
|
231
|
+
<slot name="dismiss">
|
|
232
|
+
<svg
|
|
233
|
+
aria-hidden="true"
|
|
234
|
+
data-glyph
|
|
235
|
+
fill="currentColor"
|
|
236
|
+
part="dismiss-mark"
|
|
237
|
+
viewBox=${x.viewBox}
|
|
238
|
+
>
|
|
239
|
+
${unsafeSVG(x.content)}
|
|
240
|
+
</svg>
|
|
241
|
+
</slot>
|
|
242
|
+
</button>`;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* When it happened, delegated whole.
|
|
246
|
+
*
|
|
247
|
+
* The tag is interpolated rather than written, so each tier renders its own:
|
|
248
|
+
* the base tier may not name a styled element, and a styled item inherits this
|
|
249
|
+
* template without having a tag of its own to remind anybody. `check:composed`
|
|
250
|
+
* holds both halves.
|
|
251
|
+
*
|
|
252
|
+
* `exportparts` and no `part` of its own, which is the rule about a part
|
|
253
|
+
* already named for its role: the child publishes `time`, the role here is
|
|
254
|
+
* `time`, and naming both would leave `::part(time)` matching two elements.
|
|
255
|
+
* What a consumer wants to reach is the `<time>`, so that is what the name
|
|
256
|
+
* reaches.
|
|
257
|
+
*/
|
|
258
|
+
renderTime() {
|
|
259
|
+
const stamp = this.tag('format-date');
|
|
260
|
+
return html `<${stamp}
|
|
261
|
+
exportparts="time"
|
|
262
|
+
elapsed
|
|
263
|
+
date=${this.at}
|
|
264
|
+
locale=${this.locale}
|
|
265
|
+
></${stamp}>`;
|
|
266
|
+
}
|
|
267
|
+
render() {
|
|
268
|
+
return html `<div part="item">
|
|
269
|
+
<span part="media"><slot name="media"></slot></span>
|
|
270
|
+
<div part="body">
|
|
271
|
+
<div part="label"><slot></slot></div>
|
|
272
|
+
<slot name="caption"></slot>
|
|
273
|
+
</div>
|
|
274
|
+
<div part="trailing">
|
|
275
|
+
${this.renderTime()}
|
|
276
|
+
<div part="controls">
|
|
277
|
+
<span part="actions"><slot name="actions" @slotchange=${this.handleActions}></slot></span>
|
|
278
|
+
${this.renderDismiss()}
|
|
279
|
+
</div>
|
|
280
|
+
</div>
|
|
281
|
+
</div>`;
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
__decorate([
|
|
285
|
+
property()
|
|
286
|
+
], HelixHeadlessNotification.prototype, "at", void 0);
|
|
287
|
+
__decorate([
|
|
288
|
+
property({ type: Boolean })
|
|
289
|
+
], HelixHeadlessNotification.prototype, "read", null);
|
|
290
|
+
__decorate([
|
|
291
|
+
property({ attribute: 'default-read', type: Boolean })
|
|
292
|
+
], HelixHeadlessNotification.prototype, "defaultRead", void 0);
|
|
293
|
+
__decorate([
|
|
294
|
+
property({ type: Boolean })
|
|
295
|
+
], HelixHeadlessNotification.prototype, "dismissible", void 0);
|
|
296
|
+
__decorate([
|
|
297
|
+
property()
|
|
298
|
+
], HelixHeadlessNotification.prototype, "locale", void 0);
|
|
299
|
+
__decorate([
|
|
300
|
+
property({ attribute: 'dismiss-label' })
|
|
301
|
+
], HelixHeadlessNotification.prototype, "dismissLabel", void 0);
|
|
302
|
+
HelixHeadlessNotification = __decorate([
|
|
303
|
+
customElement('helix-headless-notification')
|
|
304
|
+
], HelixHeadlessNotification);
|
|
305
|
+
export { HelixHeadlessNotification };
|