@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,141 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type TemplateResult } from 'lit';
|
|
3
|
+
declare const HelixHeadlessAccordionItem_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerOpenInterface) & typeof HelixElement;
|
|
4
|
+
/**
|
|
5
|
+
* @summary One collapsible section of an accordion.
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* Carries its own open state, which is why it is an element rather than a slot.
|
|
9
|
+
* Used alone, outside an accordion, it is a disclosure.
|
|
10
|
+
*
|
|
11
|
+
* Content stays mounted when closed and is hidden by the styled tier's CSS, so
|
|
12
|
+
* it can animate and so the text is present in server-rendered HTML. Closed
|
|
13
|
+
* content is `inert`, keeping it out of the tab order and the accessibility
|
|
14
|
+
* tree without removing it from the box tree.
|
|
15
|
+
*
|
|
16
|
+
* @since 0.1.0
|
|
17
|
+
* @status experimental
|
|
18
|
+
* @aliases Collapsible, Expander, Disclosure
|
|
19
|
+
* @documentation https://helix.fusion.dev/components/accordion
|
|
20
|
+
*
|
|
21
|
+
* @slot - The content revealed when open.
|
|
22
|
+
* @slot summary - The always-visible trigger content.
|
|
23
|
+
*
|
|
24
|
+
* @event {HelixBeforeCloseEvent} helix-before-close - Fired before the section closes, and cancelable.
|
|
25
|
+
* @event {HelixBeforeOpenEvent} helix-before-open - Fired before the item opens or closes. Cancelable: refusing it takes the decision and nothing moves.
|
|
26
|
+
* @event {Event} toggle - Says the state moved, carrying `newState` and `oldState`.
|
|
27
|
+
*
|
|
28
|
+
* @csspart chevron - The open and close indicator.
|
|
29
|
+
* @csspart container - The outer wrapper.
|
|
30
|
+
* @csspart content - The revealed region.
|
|
31
|
+
* @csspart content-inner - The clipping box inside the animated region.
|
|
32
|
+
* @csspart trigger - The clickable summary row.
|
|
33
|
+
*/
|
|
34
|
+
export declare class HelixHeadlessAccordionItem extends HelixHeadlessAccordionItem_base {
|
|
35
|
+
/**
|
|
36
|
+
* Where the open indicator sits, or whether there is one.
|
|
37
|
+
*
|
|
38
|
+
* `auto` resolves to `end`, which is where a reader scanning a list of
|
|
39
|
+
* summaries expects it: the label starts at the same x on every row, and the
|
|
40
|
+
* indicator is found once at the edge rather than shifting with the text.
|
|
41
|
+
* `start` is for a tree-like reading, where the indicator leads the label.
|
|
42
|
+
* `none` is for a row that carries its own affordance and would otherwise
|
|
43
|
+
* have two.
|
|
44
|
+
*/
|
|
45
|
+
chevronPlacement?: 'auto' | 'start' | 'end' | 'none';
|
|
46
|
+
/** The chevron, or nothing when suppressed. */
|
|
47
|
+
private renderChevron;
|
|
48
|
+
/**
|
|
49
|
+
* A group name, which is how `<details>` says a set is exclusive.
|
|
50
|
+
*
|
|
51
|
+
* **Two ways of saying the same thing, and the platform's one does not need a
|
|
52
|
+
* parent.** An accordion's `mode` makes its own children exclusive, which
|
|
53
|
+
* covers the ordinary case and cannot express a set spread across a page: a
|
|
54
|
+
* `<details name="faq">` anywhere in a document closes every other one that
|
|
55
|
+
* shares the name, and this does the same. Items in the same root with the
|
|
56
|
+
* same name are peers whether or not an accordion contains them.
|
|
57
|
+
*
|
|
58
|
+
* Where both are set the name wins, because it is the narrower statement: a
|
|
59
|
+
* consumer who named a group meant that group rather than whatever happens to
|
|
60
|
+
* be nested where.
|
|
61
|
+
*
|
|
62
|
+
* Optional rather than `''`, because a reflected string defaulting to the
|
|
63
|
+
* empty string writes `name=""` onto every item ever rendered: Lit reflects
|
|
64
|
+
* it, and the resting state of a reflected property is the attribute's
|
|
65
|
+
* absence. Caught by `hydration.dom.spec.ts`.
|
|
66
|
+
*/
|
|
67
|
+
name?: string;
|
|
68
|
+
/**
|
|
69
|
+
* The nearest accordion above this item, if there is one.
|
|
70
|
+
*
|
|
71
|
+
* Resolved on demand rather than held, so an item moved between accordions
|
|
72
|
+
* coordinates with the one it is in now. `closest` crosses no shadow
|
|
73
|
+
* boundary, which is correct: an item inside another item's content is in
|
|
74
|
+
* that item's light DOM and finds the same accordion, so the check below is
|
|
75
|
+
* what keeps it independent.
|
|
76
|
+
*/
|
|
77
|
+
private get accordion();
|
|
78
|
+
/**
|
|
79
|
+
* The items this one coordinates with: its own siblings, and only those.
|
|
80
|
+
*
|
|
81
|
+
* Direct children only. An accordion nested inside an item's content is a
|
|
82
|
+
* separate set, and opening a section in it must not close anything outside.
|
|
83
|
+
*/
|
|
84
|
+
private get peers();
|
|
85
|
+
/**
|
|
86
|
+
* Opens or closes this item, and enforces the accordion's mode.
|
|
87
|
+
*
|
|
88
|
+
* The item that was clicked is the coordinator. It refuses first, then
|
|
89
|
+
* announces, then applies, then closes its peers, in that order: closing a
|
|
90
|
+
* peer before knowing whether this change was even allowed would leave the
|
|
91
|
+
* set collapsed after a listener refused it.
|
|
92
|
+
*/
|
|
93
|
+
protected handleToggle: () => void;
|
|
94
|
+
/**
|
|
95
|
+
* Moves focus to this item's trigger.
|
|
96
|
+
*
|
|
97
|
+
* The parent accordion drives arrow-key navigation and cannot reach the
|
|
98
|
+
* trigger itself, because it is inside this item's shadow root. Exposing the
|
|
99
|
+
* intent as a method keeps the parent out of the child's internals.
|
|
100
|
+
*/
|
|
101
|
+
focusTrigger(): void;
|
|
102
|
+
/**
|
|
103
|
+
* The item, with `hidden` doing the collapsing.
|
|
104
|
+
*
|
|
105
|
+
* **A closed section has to be closed with no stylesheet at all**, which is
|
|
106
|
+
* the whole claim `headless` makes. `inert` alone was not that: it takes the
|
|
107
|
+
* region out of the accessibility tree and off the tab order and leaves every
|
|
108
|
+
* pixel of it on the screen, so a consumer taking this tier got two sections
|
|
109
|
+
* of text permanently open with a trigger underneath saying
|
|
110
|
+
* `aria-expanded="false"`. Worse than merely unstyled: a sighted reader saw
|
|
111
|
+
* content a screen reader was told is not there.
|
|
112
|
+
*
|
|
113
|
+
* The collapse was living in the styled tier's `grid-template-rows: 0fr`,
|
|
114
|
+
* which is an animation and was doing the hiding as a side effect. So the
|
|
115
|
+
* state was in a stylesheet, and only one of the two tiers had it.
|
|
116
|
+
*
|
|
117
|
+
* **`hidden` costs the styled tier nothing**, which is what makes this the
|
|
118
|
+
* cheap fix rather than a trade. The UA sheet hides `[hidden]` from the UA
|
|
119
|
+
* origin, and `accordion-item.css` already sets `display: grid` on this part
|
|
120
|
+
* unconditionally, so the author rule wins and the 0fr transition runs
|
|
121
|
+
* exactly as before. Measured both tiers after the change.
|
|
122
|
+
*
|
|
123
|
+
* **Not `hidden="until-found"`**, which would be the better accordion and is
|
|
124
|
+
* a different piece of work. It hides through `content-visibility` rather
|
|
125
|
+
* than `display`, so the styled tier's `display: grid` would no longer
|
|
126
|
+
* override it and a collapsed section would animate open to nothing. It also
|
|
127
|
+
* needs a `beforematch` handler to set `open`, or find-in-page reveals text
|
|
128
|
+
* while the trigger still reports collapsed.
|
|
129
|
+
*
|
|
130
|
+
* `inert` stays. `hidden` answers the reader who can see and `inert` answers
|
|
131
|
+
* the one tabbing through, and in the styled tier, where `display` is
|
|
132
|
+
* overridden, `inert` is the only one of the two still in force.
|
|
133
|
+
*/
|
|
134
|
+
protected render(): TemplateResult;
|
|
135
|
+
}
|
|
136
|
+
declare global {
|
|
137
|
+
interface HTMLElementTagNameMap {
|
|
138
|
+
'helix-headless-accordion-item': HelixHeadlessAccordionItem;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
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 { closestInstance, customElement, HelixElement, MixinControllerOpen, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { caretDown } 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
|
+
import { HelixHeadlessAccordion } from '../root/accordion-root.js';
|
|
13
|
+
/** Shadow-DOM id linking the trigger's aria-controls to the content region. */
|
|
14
|
+
const CONTENT_ID = 'content';
|
|
15
|
+
/**
|
|
16
|
+
* Shadow-DOM id of the trigger, used to name the content region.
|
|
17
|
+
*
|
|
18
|
+
* A `role="region"` with no accessible name is not exposed as a landmark by
|
|
19
|
+
* screen readers and is flagged by every automated audit, so the region borrows
|
|
20
|
+
* the trigger's text. Both ids live in the same shadow root, so the reference
|
|
21
|
+
* resolves; an IDREF pointing at the light DOM never would.
|
|
22
|
+
*/
|
|
23
|
+
const TRIGGER_ID = 'trigger';
|
|
24
|
+
/**
|
|
25
|
+
* @summary One collapsible section of an accordion.
|
|
26
|
+
*
|
|
27
|
+
* @description
|
|
28
|
+
* Carries its own open state, which is why it is an element rather than a slot.
|
|
29
|
+
* Used alone, outside an accordion, it is a disclosure.
|
|
30
|
+
*
|
|
31
|
+
* Content stays mounted when closed and is hidden by the styled tier's CSS, so
|
|
32
|
+
* it can animate and so the text is present in server-rendered HTML. Closed
|
|
33
|
+
* content is `inert`, keeping it out of the tab order and the accessibility
|
|
34
|
+
* tree without removing it from the box tree.
|
|
35
|
+
*
|
|
36
|
+
* @since 0.1.0
|
|
37
|
+
* @status experimental
|
|
38
|
+
* @aliases Collapsible, Expander, Disclosure
|
|
39
|
+
* @documentation https://helix.fusion.dev/components/accordion
|
|
40
|
+
*
|
|
41
|
+
* @slot - The content revealed when open.
|
|
42
|
+
* @slot summary - The always-visible trigger content.
|
|
43
|
+
*
|
|
44
|
+
* @event {HelixBeforeCloseEvent} helix-before-close - Fired before the section closes, and cancelable.
|
|
45
|
+
* @event {HelixBeforeOpenEvent} helix-before-open - Fired before the item opens or closes. Cancelable: refusing it takes the decision and nothing moves.
|
|
46
|
+
* @event {Event} toggle - Says the state moved, carrying `newState` and `oldState`.
|
|
47
|
+
*
|
|
48
|
+
* @csspart chevron - The open and close indicator.
|
|
49
|
+
* @csspart container - The outer wrapper.
|
|
50
|
+
* @csspart content - The revealed region.
|
|
51
|
+
* @csspart content-inner - The clipping box inside the animated region.
|
|
52
|
+
* @csspart trigger - The clickable summary row.
|
|
53
|
+
*/
|
|
54
|
+
let HelixHeadlessAccordionItem = class HelixHeadlessAccordionItem extends MixinControllerOpen(HelixElement) {
|
|
55
|
+
constructor() {
|
|
56
|
+
super(...arguments);
|
|
57
|
+
/**
|
|
58
|
+
* Opens or closes this item, and enforces the accordion's mode.
|
|
59
|
+
*
|
|
60
|
+
* The item that was clicked is the coordinator. It refuses first, then
|
|
61
|
+
* announces, then applies, then closes its peers, in that order: closing a
|
|
62
|
+
* peer before knowing whether this change was even allowed would leave the
|
|
63
|
+
* set collapsed after a listener refused it.
|
|
64
|
+
*/
|
|
65
|
+
this.handleToggle = () => {
|
|
66
|
+
const next = !this.open;
|
|
67
|
+
const mode = this.accordion?.mode;
|
|
68
|
+
// `single` keeps one open at all times, so the last one cannot be closed.
|
|
69
|
+
// `single-collapsible` is the same rule without that floor.
|
|
70
|
+
if (!next && mode === 'single') {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!this.requestOpen(next)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (next && (mode !== undefined || (this.name !== undefined && this.name !== ''))) {
|
|
77
|
+
for (const peer of this.peers) {
|
|
78
|
+
if (peer !== this && peer.open) {
|
|
79
|
+
// A peer in controlled mode will only notify: its consumer owns the
|
|
80
|
+
// value and may decline, which can legitimately leave two open.
|
|
81
|
+
peer.requestOpen(false);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** The chevron, or nothing when suppressed. */
|
|
88
|
+
renderChevron() {
|
|
89
|
+
if (this.chevronPlacement === 'none') {
|
|
90
|
+
return nothing;
|
|
91
|
+
}
|
|
92
|
+
return html `<svg part="chevron" fill="currentColor" viewBox=${caretDown.viewBox} aria-hidden="true">
|
|
93
|
+
${unsafeSVG(caretDown.content)}
|
|
94
|
+
</svg>`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The nearest accordion above this item, if there is one.
|
|
98
|
+
*
|
|
99
|
+
* Resolved on demand rather than held, so an item moved between accordions
|
|
100
|
+
* coordinates with the one it is in now. `closest` crosses no shadow
|
|
101
|
+
* boundary, which is correct: an item inside another item's content is in
|
|
102
|
+
* that item's light DOM and finds the same accordion, so the check below is
|
|
103
|
+
* what keeps it independent.
|
|
104
|
+
*/
|
|
105
|
+
get accordion() {
|
|
106
|
+
return closestInstance(this, HelixHeadlessAccordion);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The items this one coordinates with: its own siblings, and only those.
|
|
110
|
+
*
|
|
111
|
+
* Direct children only. An accordion nested inside an item's content is a
|
|
112
|
+
* separate set, and opening a section in it must not close anything outside.
|
|
113
|
+
*/
|
|
114
|
+
get peers() {
|
|
115
|
+
if (this.name !== undefined && this.name !== '') {
|
|
116
|
+
/* By name, across the whole root rather than one accordion, which is what
|
|
117
|
+
`<details name>` means. `getRootNode()` so an item inside a shadow tree
|
|
118
|
+
finds its group there rather than reaching into the document, which is
|
|
119
|
+
the same boundary every IDREF in this library respects. */
|
|
120
|
+
const root = this.getRootNode();
|
|
121
|
+
return [
|
|
122
|
+
...root.querySelectorAll(`${this.localName}[name="${CSS.escape(this.name)}"]`),
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
const accordion = this.accordion;
|
|
126
|
+
if (!accordion || accordion.items.indexOf(this) === -1) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
return accordion.items;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Moves focus to this item's trigger.
|
|
133
|
+
*
|
|
134
|
+
* The parent accordion drives arrow-key navigation and cannot reach the
|
|
135
|
+
* trigger itself, because it is inside this item's shadow root. Exposing the
|
|
136
|
+
* intent as a method keeps the parent out of the child's internals.
|
|
137
|
+
*/
|
|
138
|
+
focusTrigger() {
|
|
139
|
+
this.renderRoot.querySelector(`#${TRIGGER_ID}`)?.focus();
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The item, with `hidden` doing the collapsing.
|
|
143
|
+
*
|
|
144
|
+
* **A closed section has to be closed with no stylesheet at all**, which is
|
|
145
|
+
* the whole claim `headless` makes. `inert` alone was not that: it takes the
|
|
146
|
+
* region out of the accessibility tree and off the tab order and leaves every
|
|
147
|
+
* pixel of it on the screen, so a consumer taking this tier got two sections
|
|
148
|
+
* of text permanently open with a trigger underneath saying
|
|
149
|
+
* `aria-expanded="false"`. Worse than merely unstyled: a sighted reader saw
|
|
150
|
+
* content a screen reader was told is not there.
|
|
151
|
+
*
|
|
152
|
+
* The collapse was living in the styled tier's `grid-template-rows: 0fr`,
|
|
153
|
+
* which is an animation and was doing the hiding as a side effect. So the
|
|
154
|
+
* state was in a stylesheet, and only one of the two tiers had it.
|
|
155
|
+
*
|
|
156
|
+
* **`hidden` costs the styled tier nothing**, which is what makes this the
|
|
157
|
+
* cheap fix rather than a trade. The UA sheet hides `[hidden]` from the UA
|
|
158
|
+
* origin, and `accordion-item.css` already sets `display: grid` on this part
|
|
159
|
+
* unconditionally, so the author rule wins and the 0fr transition runs
|
|
160
|
+
* exactly as before. Measured both tiers after the change.
|
|
161
|
+
*
|
|
162
|
+
* **Not `hidden="until-found"`**, which would be the better accordion and is
|
|
163
|
+
* a different piece of work. It hides through `content-visibility` rather
|
|
164
|
+
* than `display`, so the styled tier's `display: grid` would no longer
|
|
165
|
+
* override it and a collapsed section would animate open to nothing. It also
|
|
166
|
+
* needs a `beforematch` handler to set `open`, or find-in-page reveals text
|
|
167
|
+
* while the trigger still reports collapsed.
|
|
168
|
+
*
|
|
169
|
+
* `inert` stays. `hidden` answers the reader who can see and `inert` answers
|
|
170
|
+
* the one tabbing through, and in the styled tier, where `display` is
|
|
171
|
+
* overridden, `inert` is the only one of the two still in force.
|
|
172
|
+
*/
|
|
173
|
+
render() {
|
|
174
|
+
const open = this.open;
|
|
175
|
+
return html `
|
|
176
|
+
<div part="container">
|
|
177
|
+
<button
|
|
178
|
+
id=${TRIGGER_ID}
|
|
179
|
+
aria-controls=${CONTENT_ID}
|
|
180
|
+
aria-expanded=${open ? 'true' : 'false'}
|
|
181
|
+
part="trigger"
|
|
182
|
+
type="button"
|
|
183
|
+
@click=${this.handleToggle}
|
|
184
|
+
>
|
|
185
|
+
${this.chevronPlacement === 'start' ? this.renderChevron() : nothing}
|
|
186
|
+
<slot name="summary"></slot>
|
|
187
|
+
${this.chevronPlacement === 'start' ? nothing : this.renderChevron()}
|
|
188
|
+
</button>
|
|
189
|
+
<div
|
|
190
|
+
id=${CONTENT_ID}
|
|
191
|
+
aria-labelledby=${TRIGGER_ID}
|
|
192
|
+
part="content"
|
|
193
|
+
?hidden=${!open}
|
|
194
|
+
?inert=${!open}
|
|
195
|
+
role="region"
|
|
196
|
+
>
|
|
197
|
+
<div part="content-inner">
|
|
198
|
+
<slot></slot>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
`;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
__decorate([
|
|
206
|
+
property({ attribute: 'chevron-placement', reflect: true })
|
|
207
|
+
], HelixHeadlessAccordionItem.prototype, "chevronPlacement", void 0);
|
|
208
|
+
__decorate([
|
|
209
|
+
property({ reflect: true })
|
|
210
|
+
], HelixHeadlessAccordionItem.prototype, "name", void 0);
|
|
211
|
+
HelixHeadlessAccordionItem = __decorate([
|
|
212
|
+
customElement('helix-headless-accordion-item')
|
|
213
|
+
], HelixHeadlessAccordionItem);
|
|
214
|
+
export { HelixHeadlessAccordionItem };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type TemplateResult } from 'lit';
|
|
3
|
+
import { HelixHeadlessAccordionItem } from '../item/accordion-item.js';
|
|
4
|
+
/**
|
|
5
|
+
* @summary Groups collapsible sections, one open at a time by default.
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* Holds the mode and nothing else. The item that was clicked is what
|
|
9
|
+
* coordinates: it walks up to the nearest accordion, reads the mode off it, and
|
|
10
|
+
* closes its peers itself.
|
|
11
|
+
*
|
|
12
|
+
* Coordination is structural, not a subscription. `helix-before-open` does not bubble
|
|
13
|
+
* and is not composed, because overlays nest and an inner one's lifecycle must
|
|
14
|
+
* never read as the outer one's, so an accordion cannot learn that a child
|
|
15
|
+
* opened by listening for it.
|
|
16
|
+
*
|
|
17
|
+
* Membership resolves on demand, so there is no registry to keep in step: an
|
|
18
|
+
* item added a second after render coordinates on its first click.
|
|
19
|
+
*
|
|
20
|
+
* Items are matched with `instanceof HelixHeadlessAccordionItem`, never by tag
|
|
21
|
+
* name. Matching `helix-accordion-item` would tie this tier to the styled one.
|
|
22
|
+
*
|
|
23
|
+
* Every listener is attached on connect, so none of it runs on the server,
|
|
24
|
+
* where there is no tree to walk and no events to hear.
|
|
25
|
+
*
|
|
26
|
+
* @since 0.1.0
|
|
27
|
+
* @status experimental
|
|
28
|
+
* @category layout
|
|
29
|
+
* @aliases Collapse, Expander group
|
|
30
|
+
* @documentation https://helix.fusion.dev/components/accordion
|
|
31
|
+
*
|
|
32
|
+
* @slot - The accordion's items.
|
|
33
|
+
*/
|
|
34
|
+
export declare class HelixHeadlessAccordion extends HelixElement {
|
|
35
|
+
/**
|
|
36
|
+
* How many sections may be open at once.
|
|
37
|
+
*
|
|
38
|
+
* Absent is `multiple`, so nothing closes unexpectedly and the default costs
|
|
39
|
+
* no attribute on the host. `single` keeps exactly one open and refuses to
|
|
40
|
+
* close the last; `single-collapsible` keeps at most one and lets it close.
|
|
41
|
+
*
|
|
42
|
+
* A union rather than a mode plus a `collapsible` boolean, which would make
|
|
43
|
+
* `collapsible` alongside `multiple` expressible and meaningless.
|
|
44
|
+
*/
|
|
45
|
+
mode?: 'single' | 'single-collapsible';
|
|
46
|
+
/** Direct items, in light-DOM order. Client only: the server has no tree. */
|
|
47
|
+
get items(): HelixHeadlessAccordionItem[];
|
|
48
|
+
private readonly handleKeydown;
|
|
49
|
+
connectedCallback(): void;
|
|
50
|
+
disconnectedCallback(): void;
|
|
51
|
+
protected render(): TemplateResult;
|
|
52
|
+
}
|
|
53
|
+
declare global {
|
|
54
|
+
interface HTMLElementTagNameMap {
|
|
55
|
+
'helix-headless-accordion': HelixHeadlessAccordion;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
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 } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
import { HelixHeadlessAccordionItem } from '../item/accordion-item.js';
|
|
11
|
+
/** Keys that move focus between triggers, per the APG accordion pattern. */
|
|
12
|
+
const NAVIGATION = new Set(['ArrowDown', 'ArrowUp', 'Home', 'End']);
|
|
13
|
+
/**
|
|
14
|
+
* @summary Groups collapsible sections, one open at a time by default.
|
|
15
|
+
*
|
|
16
|
+
* @description
|
|
17
|
+
* Holds the mode and nothing else. The item that was clicked is what
|
|
18
|
+
* coordinates: it walks up to the nearest accordion, reads the mode off it, and
|
|
19
|
+
* closes its peers itself.
|
|
20
|
+
*
|
|
21
|
+
* Coordination is structural, not a subscription. `helix-before-open` does not bubble
|
|
22
|
+
* and is not composed, because overlays nest and an inner one's lifecycle must
|
|
23
|
+
* never read as the outer one's, so an accordion cannot learn that a child
|
|
24
|
+
* opened by listening for it.
|
|
25
|
+
*
|
|
26
|
+
* Membership resolves on demand, so there is no registry to keep in step: an
|
|
27
|
+
* item added a second after render coordinates on its first click.
|
|
28
|
+
*
|
|
29
|
+
* Items are matched with `instanceof HelixHeadlessAccordionItem`, never by tag
|
|
30
|
+
* name. Matching `helix-accordion-item` would tie this tier to the styled one.
|
|
31
|
+
*
|
|
32
|
+
* Every listener is attached on connect, so none of it runs on the server,
|
|
33
|
+
* where there is no tree to walk and no events to hear.
|
|
34
|
+
*
|
|
35
|
+
* @since 0.1.0
|
|
36
|
+
* @status experimental
|
|
37
|
+
* @category layout
|
|
38
|
+
* @aliases Collapse, Expander group
|
|
39
|
+
* @documentation https://helix.fusion.dev/components/accordion
|
|
40
|
+
*
|
|
41
|
+
* @slot - The accordion's items.
|
|
42
|
+
*/
|
|
43
|
+
let HelixHeadlessAccordion = class HelixHeadlessAccordion extends HelixElement {
|
|
44
|
+
constructor() {
|
|
45
|
+
super(...arguments);
|
|
46
|
+
this.handleKeydown = (event) => {
|
|
47
|
+
if (!NAVIGATION.has(event.key)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const items = this.items;
|
|
51
|
+
const current = items.indexOf(event.target);
|
|
52
|
+
if (current === -1) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const last = items.length - 1;
|
|
56
|
+
let next = current;
|
|
57
|
+
if (event.key === 'ArrowDown') {
|
|
58
|
+
next = current === last ? 0 : current + 1;
|
|
59
|
+
}
|
|
60
|
+
else if (event.key === 'ArrowUp') {
|
|
61
|
+
next = current === 0 ? last : current - 1;
|
|
62
|
+
}
|
|
63
|
+
else if (event.key === 'Home') {
|
|
64
|
+
next = 0;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
next = last;
|
|
68
|
+
}
|
|
69
|
+
// Only once a move is certain, so an unhandled key still scrolls the page.
|
|
70
|
+
event.preventDefault();
|
|
71
|
+
items[next]?.focusTrigger();
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** Direct items, in light-DOM order. Client only: the server has no tree. */
|
|
75
|
+
get items() {
|
|
76
|
+
return [...this.children].filter((child) => child instanceof HelixHeadlessAccordionItem);
|
|
77
|
+
}
|
|
78
|
+
connectedCallback() {
|
|
79
|
+
super.connectedCallback();
|
|
80
|
+
this.addEventListener('keydown', this.handleKeydown);
|
|
81
|
+
}
|
|
82
|
+
disconnectedCallback() {
|
|
83
|
+
super.disconnectedCallback();
|
|
84
|
+
this.removeEventListener('keydown', this.handleKeydown);
|
|
85
|
+
}
|
|
86
|
+
render() {
|
|
87
|
+
return html `<slot></slot>`;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
__decorate([
|
|
91
|
+
property({ reflect: true })
|
|
92
|
+
], HelixHeadlessAccordion.prototype, "mode", void 0);
|
|
93
|
+
HelixHeadlessAccordion = __decorate([
|
|
94
|
+
customElement('helix-headless-accordion')
|
|
95
|
+
], HelixHeadlessAccordion);
|
|
96
|
+
export { HelixHeadlessAccordion };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/announcement-root.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/announcement-root.js';
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
declare const HelixHeadlessAnnouncement_base: (new (...args: any[]) => import("@fusion.dev/helix-core").DismissibleElement) & typeof HelixElement;
|
|
4
|
+
/**
|
|
5
|
+
* @summary A page-level message above the masthead, which can be dismissed.
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* Chrome rather than content. An announcement sits above the header and speaks
|
|
9
|
+
* for the whole page: a trial ending, a service degraded, a change of terms. A
|
|
10
|
+
* passage that interrupts a document to set itself apart is a `Callout`, which
|
|
11
|
+
* is read where it sits and cannot be dismissed. Neither is a variant of the
|
|
12
|
+
* other.
|
|
13
|
+
*
|
|
14
|
+
* **Always a polite live region.** `role="alert"` is assertive and interrupts
|
|
15
|
+
* whatever is being read, which is right for something that appears mid-session
|
|
16
|
+
* and wrong for something that was in the served HTML: an assertive
|
|
17
|
+
* announcement would cut across a screen-reader user on every page load, before
|
|
18
|
+
* they had read anything. Politeness costs a moment and is never wrong; the tone
|
|
19
|
+
* does not change that, because an error that was always there is still not an
|
|
20
|
+
* interruption.
|
|
21
|
+
*
|
|
22
|
+
* Dismissing is a request. The announcement does not remove itself, because the
|
|
23
|
+
* consumer owns the markup and taking the node out from under them would put
|
|
24
|
+
* their state and the document out of step. `preventDefault()` on the
|
|
25
|
+
* `helix-dismiss` is a refusal.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
28
|
+
* @status stable
|
|
29
|
+
* @category feedback
|
|
30
|
+
* @aliases Banner, Notification bar, Alert bar
|
|
31
|
+
* @documentation https://helix.fusion.dev/components/announcement
|
|
32
|
+
*
|
|
33
|
+
* @slot - The message.
|
|
34
|
+
* @slot actions - What to do about it, usually a link or a button.
|
|
35
|
+
* @slot icon - Replaces the glyph inside the dismiss control.
|
|
36
|
+
*
|
|
37
|
+
* @event {HelixDismissEvent} helix-dismiss - Fired when the reader asks to close it. Cancelable: refusing it takes the decision and nothing moves.
|
|
38
|
+
*
|
|
39
|
+
* @csspart actions - The trailing action region.
|
|
40
|
+
* @csspart content - The message region.
|
|
41
|
+
* @csspart dismiss - The control that asks to close.
|
|
42
|
+
* @csspart dismiss-mark - The glyph on the dismiss control, where none is slotted.
|
|
43
|
+
*/
|
|
44
|
+
export declare class HelixHeadlessAnnouncement extends HelixHeadlessAnnouncement_base {
|
|
45
|
+
/**
|
|
46
|
+
* Which color the band wears.
|
|
47
|
+
*
|
|
48
|
+
* **This was `severity` and it was claiming more than it did.** Severity is a
|
|
49
|
+
* judgment about the message, and elsewhere in this library it carries one:
|
|
50
|
+
* `Callout` reads `TONE_MARKS` for an icon and a label, so `tone="danger"`
|
|
51
|
+
* puts a mark beside the text and names it to a screen reader. Here it did
|
|
52
|
+
* none of that. It set a color, the live region stayed polite either way, and
|
|
53
|
+
* nothing about the announcement's semantics moved. A property that only
|
|
54
|
+
* changes the paint should say so.
|
|
55
|
+
*
|
|
56
|
+
* `tone` is the word this library already uses for exactly that, and `Tag`
|
|
57
|
+
* made the identical rename for the identical reason: the word it left was a
|
|
58
|
+
* treatment, `tone` is semantic color. The set matches `Tag`'s so the two
|
|
59
|
+
* agree, with `neutral` as the resting value and `primary` for a band that is
|
|
60
|
+
* about the product rather than about a state.
|
|
61
|
+
*
|
|
62
|
+
* `neutral` is what an unset announcement already looked like, said out loud
|
|
63
|
+
* so a consumer can put a band back to it from markup, and `surface` is the
|
|
64
|
+
* one value that is not a color: it lifts the band onto the surface step
|
|
65
|
+
* instead of the sunken one, for a strip carrying something that is not a
|
|
66
|
+
* state at all.
|
|
67
|
+
*/
|
|
68
|
+
tone?: 'danger' | 'info' | 'neutral' | 'primary' | 'success' | 'surface' | 'warning';
|
|
69
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
70
|
+
protected updated(changed: PropertyValues): void;
|
|
71
|
+
/**
|
|
72
|
+
* Says on the `actions` region whether anything is in it.
|
|
73
|
+
*
|
|
74
|
+
* An empty region is not free: it is still a flex item, so it still takes the
|
|
75
|
+
* container's gap. There is no selector that can ask, `slot:empty` being
|
|
76
|
+
* about a slot's fallback rather than its assigned nodes, so the component
|
|
77
|
+
* asks and says so, on the region inside this shadow root rather than on the
|
|
78
|
+
* host: an attribute written onto the host is a change to markup the consumer
|
|
79
|
+
* rendered, which React reports on hydration and does not patch up.
|
|
80
|
+
*/
|
|
81
|
+
private markEmpty;
|
|
82
|
+
/**
|
|
83
|
+
* The cross inside the dismiss button, behind a seam.
|
|
84
|
+
*
|
|
85
|
+
* Slot fallback, so a consumer replaces it by slotting; and a method, so the
|
|
86
|
+
* tier above replaces it by overriding. Those answer different people: the
|
|
87
|
+
* slot is for the page and the method is for whoever is building the styled
|
|
88
|
+
* layer, and a fallback with only the first is one a tier can restyle and
|
|
89
|
+
* cannot change.
|
|
90
|
+
*
|
|
91
|
+
* **Named for what it draws, which it was not.** It was `renderIcon`, with a
|
|
92
|
+
* description of "the mark for the announcement's tone", and it draws the `x`
|
|
93
|
+
* glyph inside the dismiss button and has never drawn a tone. The name is
|
|
94
|
+
* `renderIcon` on `Toast` and `Callout` too, and on both of those it takes a
|
|
95
|
+
* severity and draws exactly the tone mark this claimed to: the prose came
|
|
96
|
+
* from a sibling that meant it. An announcement has no tone mark at all.
|
|
97
|
+
*/
|
|
98
|
+
protected renderDismissIcon(): TemplateResult;
|
|
99
|
+
protected render(): TemplateResult;
|
|
100
|
+
}
|
|
101
|
+
declare global {
|
|
102
|
+
interface HTMLElementTagNameMap {
|
|
103
|
+
'helix-headless-announcement': HelixHeadlessAnnouncement;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export {};
|