@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,278 @@
|
|
|
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, extent, HelixElement, linear, linePath, SourceController, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html, nothing, svg } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
/**
|
|
11
|
+
* The drawing's own coordinates, which the `viewBox` maps onto whatever box CSS
|
|
12
|
+
* gives it. Round numbers so a `d` attribute is readable in the inspector.
|
|
13
|
+
*/
|
|
14
|
+
const BOX = { height: 32, width: 100 };
|
|
15
|
+
/** Splits on whitespace or commas, and keeps only what is a number. */
|
|
16
|
+
const readValues = (input) => input
|
|
17
|
+
.split(/[\s,]+/)
|
|
18
|
+
.filter((one) => one !== '')
|
|
19
|
+
.map(Number)
|
|
20
|
+
.filter((one) => Number.isFinite(one));
|
|
21
|
+
/**
|
|
22
|
+
* @summary A line with no axes, for the shape of a series beside the number it belongs to.
|
|
23
|
+
*
|
|
24
|
+
* @description
|
|
25
|
+
* The one chart here that takes its numbers from an attribute, and the reversal
|
|
26
|
+
* is deliberate. Every other chart reads a table because a reader might want to
|
|
27
|
+
* interrogate it; nobody interrogates the squiggle next to a figure. A
|
|
28
|
+
* fourteen-row table behind a bare trend line is fourteen dates read aloud in
|
|
29
|
+
* place of the one sentence that carries the meaning, so `values` is the list
|
|
30
|
+
* and `label` is the sentence.
|
|
31
|
+
*
|
|
32
|
+
* That is the library's own rule rather than a second data channel: a content
|
|
33
|
+
* property is its slot's fallback, which is why `Tooltip` takes `content` and
|
|
34
|
+
* `Avatar` takes `name`. `for` stays for the sparkline that genuinely has a
|
|
35
|
+
* table behind it, and it wins where both are given.
|
|
36
|
+
*
|
|
37
|
+
* **No label means decorative, and that is a choice rather than an oversight.**
|
|
38
|
+
* A sparkline beside a stat that already says "Sessions, 1,102" has nothing of
|
|
39
|
+
* its own to announce, and an unnamed `role="img"` announces "graphic" and
|
|
40
|
+
* stops. So an unlabelled sparkline is `aria-hidden`, and a labeled one is an
|
|
41
|
+
* image named by its sentence.
|
|
42
|
+
*
|
|
43
|
+
* It goes *beside* a `Stat` rather than inside one. The plan this was built
|
|
44
|
+
* from called for a `trend` slot on `Stat`; the spec already on `Stat` says the
|
|
45
|
+
* opposite, that a change beside a figure is a second fact, and the spec is
|
|
46
|
+
* right. `Trend` composes the same way.
|
|
47
|
+
*
|
|
48
|
+
* The properties below are written by this component and read by whoever draws
|
|
49
|
+
* it. A consumer sets none of them: they carry a number this element computed
|
|
50
|
+
* and CSS cannot, which is what lets a stylesheet on this tier draw the thing
|
|
51
|
+
* without measuring anything itself.
|
|
52
|
+
*
|
|
53
|
+
* @since 0.1.0
|
|
54
|
+
* @status experimental
|
|
55
|
+
* @category charts
|
|
56
|
+
* @aliases Micro Chart, Trend Line, Inline Chart
|
|
57
|
+
* @documentation https://helix.fusion.dev/components/sparkline
|
|
58
|
+
*
|
|
59
|
+
* @csspart area - The region between the line and the bottom of its range.
|
|
60
|
+
* @csspart bar - One column, under `plot="bar"`.
|
|
61
|
+
* @csspart line - The path itself.
|
|
62
|
+
* @csspart svg - The drawing.
|
|
63
|
+
* @csspart terminus - The mark on the last value.
|
|
64
|
+
* @csspart wash-end - The far stop of the area's gradient.
|
|
65
|
+
* @csspart wash-start - The stop of the area's gradient that meets the line.
|
|
66
|
+
*
|
|
67
|
+
* @cssproperty --chart-terminus-x - Where the last point sits horizontally, as a percentage.
|
|
68
|
+
* @cssproperty --chart-terminus-y - Where the last point sits vertically, as a percentage.
|
|
69
|
+
*/
|
|
70
|
+
let HelixHeadlessSparkline = class HelixHeadlessSparkline extends HelixElement {
|
|
71
|
+
constructor() {
|
|
72
|
+
super(...arguments);
|
|
73
|
+
/**
|
|
74
|
+
* The id of a table to read instead, when there is one behind the line.
|
|
75
|
+
*
|
|
76
|
+
* The first column of numbers is the series drawn. This wins over `values`,
|
|
77
|
+
* because a table is the readable representation and a list of numbers in an
|
|
78
|
+
* attribute is not.
|
|
79
|
+
*
|
|
80
|
+
* **In React this arrives as a property and not as an attribute**, the way
|
|
81
|
+
* `Tooltip.for` does, so it does not reflect and nothing styles on it.
|
|
82
|
+
*/
|
|
83
|
+
this.for = '';
|
|
84
|
+
/**
|
|
85
|
+
* What the line says, in a sentence.
|
|
86
|
+
*
|
|
87
|
+
* "Sessions rose from 1,240 to 1,318 and fell to 1,102 over fourteen days" is
|
|
88
|
+
* the accessible representation of a sparkline, and a list of the fourteen
|
|
89
|
+
* numbers is not. Absent, the drawing is hidden from a screen reader rather
|
|
90
|
+
* than announced without a name.
|
|
91
|
+
*/
|
|
92
|
+
this.label = '';
|
|
93
|
+
/**
|
|
94
|
+
* The numbers, separated by whitespace or by commas.
|
|
95
|
+
*
|
|
96
|
+
* Both separators, so `values="1240 1318"` and an array assigned to the
|
|
97
|
+
* property both work: assigning `[1240, 1318]` stringifies to `1240,1318`,
|
|
98
|
+
* and a string is what survives React's hydration where an array property
|
|
99
|
+
* does not.
|
|
100
|
+
*/
|
|
101
|
+
this.values = '';
|
|
102
|
+
/* One controller rather than the resolve-and-watch each chart had written
|
|
103
|
+
out for itself. Three copies had already drifted into two names for the
|
|
104
|
+
same lookup. */
|
|
105
|
+
this.source = new SourceController(this);
|
|
106
|
+
}
|
|
107
|
+
willUpdate(changed) {
|
|
108
|
+
if (changed.has('for')) {
|
|
109
|
+
this.source.watch();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** The series to draw: the table if there is one, the attribute otherwise. */
|
|
113
|
+
#points() {
|
|
114
|
+
const series = this.source.series;
|
|
115
|
+
return series.length > 0
|
|
116
|
+
? (series[0]?.points.map((point) => point.value) ?? [])
|
|
117
|
+
: readValues(this.values);
|
|
118
|
+
}
|
|
119
|
+
render() {
|
|
120
|
+
const points = this.#points();
|
|
121
|
+
/* Two points minimum, because one is not a trend and zero is not a line.
|
|
122
|
+
An `<svg>` given a `d` of `M NaN,NaN` draws nothing and reports nothing,
|
|
123
|
+
so the empty case is stated here rather than left to look like a bug. */
|
|
124
|
+
const x = linear([0, Math.max(points.length - 1, 1)], [0, BOX.width]);
|
|
125
|
+
/* **A bar measures from zero and a line measures from its own range**, and
|
|
126
|
+
that is a correctness difference rather than a preference.
|
|
127
|
+
*
|
|
128
|
+
* A line is a shape: what it says is where the readings sit relative to
|
|
129
|
+
* each other, so running the scale over the data's own extent uses the
|
|
130
|
+
* whole box and claims nothing about absolute size. A bar says something
|
|
131
|
+
* else. Its *length* is the value, so a baseline anywhere but zero makes
|
|
132
|
+
* the lengths proportional to nothing, which is the oldest misleading chart
|
|
133
|
+
* there is.
|
|
134
|
+
*
|
|
135
|
+
* Drawn over the data's extent, the smallest reading landed exactly on the
|
|
136
|
+
* floor and its column had no height at all: seven readings between 1,102
|
|
137
|
+
* and 1,408 came out as six columns and a gap, which looks like missing
|
|
138
|
+
* data and is really a scale saying the minimum is nothing.
|
|
139
|
+
*
|
|
140
|
+
* The zero is included at both ends, so a series that goes negative gets a
|
|
141
|
+
* baseline inside the box and its columns hang below it. */
|
|
142
|
+
const [low, high] = extent(points.length > 0 ? points : [0]);
|
|
143
|
+
const y = this.plot === 'bar'
|
|
144
|
+
? linear([Math.min(0, low), Math.max(0, high)], [BOX.height, 0])
|
|
145
|
+
: linear([low, high], [BOX.height, 0]);
|
|
146
|
+
const coordinates = points.map((value, index) => [x(index), y(value)]);
|
|
147
|
+
const path = this.plot === 'bar' ? '' : linePath(coordinates, this.curve ?? 'smooth');
|
|
148
|
+
/* The same line closed down to the floor of its own range, which is where
|
|
149
|
+
the wash goes. Its own path rather than a fill on the line, because a
|
|
150
|
+
closed path strokes its closing edges too: filling the line itself would
|
|
151
|
+
draw a rule along the bottom of the box and up both sides.
|
|
152
|
+
*
|
|
153
|
+
* The floor is the smallest reading and not a true zero, because the scale
|
|
154
|
+
* runs over the data's own extent. That is the part a consumer would get
|
|
155
|
+
* wrong writing this themselves, and it is why the shape is built here. */
|
|
156
|
+
/* Asked negatively, because absent *is* an area here and the class doc
|
|
157
|
+
above says why. This is the one property in the family where the resting
|
|
158
|
+
arrangement is not the plainest thing, so the test has to answer true for
|
|
159
|
+
the value nobody set, and `=== 'area'` would answer false. */
|
|
160
|
+
const area = this.plot !== 'bar' && this.plot !== 'line' && path !== ''
|
|
161
|
+
? `${path}L${BOX.width},${BOX.height}L0,${BOX.height}Z`
|
|
162
|
+
: '';
|
|
163
|
+
/* One column per reading, inset so neighbours do not touch.
|
|
164
|
+
*
|
|
165
|
+
* A rect rather than a thick stroked line, because a bar has two ends and a
|
|
166
|
+
* stroke has a cap: `stroke-linecap` would round or square both ends of
|
|
167
|
+
* every column together, and the floor end should always be flat.
|
|
168
|
+
*
|
|
169
|
+
* The width is a share of the slot rather than a fixed number, so a series
|
|
170
|
+
* of seven and a series of forty both fill the box. Fourteen percent of the
|
|
171
|
+
* gap is the smallest separation that still reads as separate columns at
|
|
172
|
+
* the sizes a sparkline is drawn at, and it comes off the slot rather than
|
|
173
|
+
* off the bar so a two-reading series does not get two enormous slabs. */
|
|
174
|
+
const slot = BOX.width / Math.max(points.length, 1);
|
|
175
|
+
const floor = y(0);
|
|
176
|
+
const bars = this.plot === 'bar'
|
|
177
|
+
? points.map((value, index) => ({
|
|
178
|
+
/* From the baseline to the reading, whichever of the two is
|
|
179
|
+
higher up the box. A reading of exactly zero is a column of no
|
|
180
|
+
height, which paints nothing, and that is the honest drawing of
|
|
181
|
+
nothing rather than a hairline implying something. */
|
|
182
|
+
height: Math.abs(floor - y(value)),
|
|
183
|
+
width: slot * 0.72,
|
|
184
|
+
x: index * slot + slot * 0.14,
|
|
185
|
+
y: Math.min(floor, y(value)),
|
|
186
|
+
}))
|
|
187
|
+
: [];
|
|
188
|
+
/* Where the series ended, as percentages of the box.
|
|
189
|
+
*
|
|
190
|
+
* Read twice, by the mark and by the drawing, which is why it is a local
|
|
191
|
+
* rather than two literals. The mark sits on it; the drawing has the same
|
|
192
|
+
* disc taken out of it, so a `ring` is a hole rather than a lid. A custom
|
|
193
|
+
* property would be the tidier channel and there is nowhere to put one:
|
|
194
|
+
* they inherit down and never sideways, the two elements are siblings, and
|
|
195
|
+
* the host cannot be styled from a template without a wrapper element that
|
|
196
|
+
* carries nothing else. */
|
|
197
|
+
const end = points.length < 2
|
|
198
|
+
? undefined
|
|
199
|
+
: `--chart-terminus-x: 100%; --chart-terminus-y: ${(y(points[points.length - 1]) / BOX.height) * 100}%`;
|
|
200
|
+
return html `<svg
|
|
201
|
+
aria-hidden=${this.label === '' ? 'true' : nothing}
|
|
202
|
+
aria-label=${this.label === '' ? nothing : this.label}
|
|
203
|
+
part="svg"
|
|
204
|
+
preserveAspectRatio="none"
|
|
205
|
+
role=${this.label === '' ? nothing : 'img'}
|
|
206
|
+
style=${end ?? nothing}
|
|
207
|
+
viewBox="0 0 ${BOX.width} ${BOX.height}"
|
|
208
|
+
>
|
|
209
|
+
${
|
|
210
|
+
/* The ramp the area is poured with, drawn here because a gradient is
|
|
211
|
+
an element and elements are this tier's business, and coloured
|
|
212
|
+
above because a color is not. Measured rather than assumed: a
|
|
213
|
+
fragment id inside a shadow root resolves within that root, so two
|
|
214
|
+
sparklines on a page carrying the same id stay independent, and CSS
|
|
215
|
+
`fill: url(#...)` reaches it as readily as the attribute does. */
|
|
216
|
+
svg `<defs>
|
|
217
|
+
<linearGradient id="sparkline-wash" x1="0" x2="0" y1="0" y2="1">
|
|
218
|
+
<stop offset="0" part="wash-start" />
|
|
219
|
+
<stop offset="1" part="wash-end" />
|
|
220
|
+
</linearGradient>
|
|
221
|
+
</defs>`}
|
|
222
|
+
${
|
|
223
|
+
/* `svg` and not `html`, because a nested template is parsed on its
|
|
224
|
+
own and this one has no `<svg>` around it to be parsed inside.
|
|
225
|
+
`<path>` read as standalone HTML becomes an unknown element in the
|
|
226
|
+
XHTML namespace: it takes the part, takes the `d`, inherits the
|
|
227
|
+
stroke, and draws nothing at all, because only an element in the
|
|
228
|
+
SVG namespace has geometry. Measured by `getBBox` throwing, which
|
|
229
|
+
is the shortest way to ask an element whether it is really SVG.
|
|
230
|
+
|
|
231
|
+
Every spec written against this passed while it drew nothing. They
|
|
232
|
+
asserted the `d` attribute, the part, the ARIA and the computed
|
|
233
|
+
`vector-effect`, and all of those are true of an HTML element
|
|
234
|
+
wearing the same name. */
|
|
235
|
+
path === '' ? nothing : svg `<path d=${path} part="line" />`}
|
|
236
|
+
${area === '' ? nothing : svg `<path d=${area} part="area" />`}
|
|
237
|
+
${bars.map((bar) => svg `<rect
|
|
238
|
+
height=${bar.height}
|
|
239
|
+
part="bar"
|
|
240
|
+
width=${bar.width}
|
|
241
|
+
x=${bar.x}
|
|
242
|
+
y=${bar.y}
|
|
243
|
+
/>`)}
|
|
244
|
+
</svg>
|
|
245
|
+
${
|
|
246
|
+
/* The mark on the last value, as an element beside the drawing rather
|
|
247
|
+
than a `<circle>` inside it. `preserveAspectRatio="none"` is what lets
|
|
248
|
+
the line fill any box, and it distorts everything in that coordinate
|
|
249
|
+
space with it: a circle in there is an ellipse whose squash depends on
|
|
250
|
+
how wide the consumer made it. Percentages of the host are the same
|
|
251
|
+
two numbers in a space nothing stretches. */
|
|
252
|
+
/* A line ends somewhere and a row of columns does not, so a bar plot
|
|
253
|
+
draws no terminus: the last column already is the last reading, and a
|
|
254
|
+
dot on top of it would be a second mark saying the same thing. */
|
|
255
|
+
points.length < 2 || this.plot === 'bar'
|
|
256
|
+
? nothing
|
|
257
|
+
: html `<span aria-hidden="true" part="terminus" style=${end ?? nothing}></span>`}`;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
__decorate([
|
|
261
|
+
property({ reflect: true })
|
|
262
|
+
], HelixHeadlessSparkline.prototype, "plot", void 0);
|
|
263
|
+
__decorate([
|
|
264
|
+
property({ reflect: true })
|
|
265
|
+
], HelixHeadlessSparkline.prototype, "curve", void 0);
|
|
266
|
+
__decorate([
|
|
267
|
+
property()
|
|
268
|
+
], HelixHeadlessSparkline.prototype, "for", void 0);
|
|
269
|
+
__decorate([
|
|
270
|
+
property()
|
|
271
|
+
], HelixHeadlessSparkline.prototype, "label", void 0);
|
|
272
|
+
__decorate([
|
|
273
|
+
property()
|
|
274
|
+
], HelixHeadlessSparkline.prototype, "values", void 0);
|
|
275
|
+
HelixHeadlessSparkline = __decorate([
|
|
276
|
+
customElement('helix-headless-sparkline')
|
|
277
|
+
], HelixHeadlessSparkline);
|
|
278
|
+
export { HelixHeadlessSparkline };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type TemplateResult } from 'lit';
|
|
3
|
+
/**
|
|
4
|
+
* @summary One action in a speed dial: a mark, and a name beside it.
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
* **A command, which is why this is a `menuitem` and a megamenu's rows are not.**
|
|
8
|
+
* The distinction is what the thing does, not what it looks like: a megamenu
|
|
9
|
+
* holds destinations, so it is a disclosure of links, and this holds actions a
|
|
10
|
+
* screen can take, which is exactly what `role="menu"` was written for. The
|
|
11
|
+
* roles follow the contents.
|
|
12
|
+
*
|
|
13
|
+
* **The name is text, not a title.** A dial's actions are icons, and an icon
|
|
14
|
+
* with a `title` is an action whose name only exists for whoever hovers it long
|
|
15
|
+
* enough. The label is rendered beside the mark and is the accessible name by
|
|
16
|
+
* being there, so it is read, searched and translated like anything else.
|
|
17
|
+
*
|
|
18
|
+
* @since 0.1.0
|
|
19
|
+
* @status experimental
|
|
20
|
+
* @category actions
|
|
21
|
+
* @aliases Speed dial action, FAB action, Quick action
|
|
22
|
+
* @documentation https://helix.fusion.dev/components/speed-dial
|
|
23
|
+
*
|
|
24
|
+
* @slot - The action's name.
|
|
25
|
+
* @slot icon - The mark, which is what a dial is read by.
|
|
26
|
+
*
|
|
27
|
+
* @event {HelixSelectEvent} helix-select - Fired when the action is chosen. Cancelable: refusing it takes the decision and nothing moves.
|
|
28
|
+
*
|
|
29
|
+
* @csspart icon - The mark's box.
|
|
30
|
+
* @csspart item - The control.
|
|
31
|
+
* @csspart label - The name beside it.
|
|
32
|
+
*/
|
|
33
|
+
export declare class HelixHeadlessSpeedDialItem extends HelixElement {
|
|
34
|
+
/**
|
|
35
|
+
* What this action stands for, carried in the event when it is chosen.
|
|
36
|
+
*/
|
|
37
|
+
value: string;
|
|
38
|
+
/**
|
|
39
|
+
* Whether the action can be chosen.
|
|
40
|
+
*/
|
|
41
|
+
disabled: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* @internal Read by a parent to identify its children across the light DOM,
|
|
44
|
+
* which is cheaper than `instanceof` and is why this is public rather than
|
|
45
|
+
* protected. Not a consumer's to read or set.
|
|
46
|
+
*/
|
|
47
|
+
readonly isSpeedDialItem = true;
|
|
48
|
+
/** Puts focus on the control inside, which is what a reader can reach. */
|
|
49
|
+
focus(): void;
|
|
50
|
+
/** `NavigableItem`, so the arrow keys are the shared controller's business. */
|
|
51
|
+
focusItem(): void;
|
|
52
|
+
/** Chooses the action, which is the same act as pressing it. */
|
|
53
|
+
select(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Whether this is the row the set is on, which here is where focus is.
|
|
56
|
+
*
|
|
57
|
+
* Asked of the document rather than of the shadow root: focus lands on the
|
|
58
|
+
* control inside this element and the platform retargets it, so from outside
|
|
59
|
+
* `activeElement` already is this element. `Menu.Item` records the same, and
|
|
60
|
+
* the reading it replaced is one that does not survive happy-dom.
|
|
61
|
+
*/
|
|
62
|
+
get selected(): boolean;
|
|
63
|
+
private choose;
|
|
64
|
+
private readonly handleClick;
|
|
65
|
+
protected render(): TemplateResult;
|
|
66
|
+
}
|
|
67
|
+
declare global {
|
|
68
|
+
interface HTMLElementTagNameMap {
|
|
69
|
+
'helix-headless-speed-dial-item': HelixHeadlessSpeedDialItem;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
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, HelixSelectEvent } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html, nothing } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
/**
|
|
11
|
+
* @summary One action in a speed dial: a mark, and a name beside it.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* **A command, which is why this is a `menuitem` and a megamenu's rows are not.**
|
|
15
|
+
* The distinction is what the thing does, not what it looks like: a megamenu
|
|
16
|
+
* holds destinations, so it is a disclosure of links, and this holds actions a
|
|
17
|
+
* screen can take, which is exactly what `role="menu"` was written for. The
|
|
18
|
+
* roles follow the contents.
|
|
19
|
+
*
|
|
20
|
+
* **The name is text, not a title.** A dial's actions are icons, and an icon
|
|
21
|
+
* with a `title` is an action whose name only exists for whoever hovers it long
|
|
22
|
+
* enough. The label is rendered beside the mark and is the accessible name by
|
|
23
|
+
* being there, so it is read, searched and translated like anything else.
|
|
24
|
+
*
|
|
25
|
+
* @since 0.1.0
|
|
26
|
+
* @status experimental
|
|
27
|
+
* @category actions
|
|
28
|
+
* @aliases Speed dial action, FAB action, Quick action
|
|
29
|
+
* @documentation https://helix.fusion.dev/components/speed-dial
|
|
30
|
+
*
|
|
31
|
+
* @slot - The action's name.
|
|
32
|
+
* @slot icon - The mark, which is what a dial is read by.
|
|
33
|
+
*
|
|
34
|
+
* @event {HelixSelectEvent} helix-select - Fired when the action is chosen. Cancelable: refusing it takes the decision and nothing moves.
|
|
35
|
+
*
|
|
36
|
+
* @csspart icon - The mark's box.
|
|
37
|
+
* @csspart item - The control.
|
|
38
|
+
* @csspart label - The name beside it.
|
|
39
|
+
*/
|
|
40
|
+
let HelixHeadlessSpeedDialItem = class HelixHeadlessSpeedDialItem extends HelixElement {
|
|
41
|
+
constructor() {
|
|
42
|
+
super(...arguments);
|
|
43
|
+
/**
|
|
44
|
+
* What this action stands for, carried in the event when it is chosen.
|
|
45
|
+
*/
|
|
46
|
+
this.value = '';
|
|
47
|
+
/**
|
|
48
|
+
* Whether the action can be chosen.
|
|
49
|
+
*/
|
|
50
|
+
this.disabled = false;
|
|
51
|
+
/**
|
|
52
|
+
* @internal Read by a parent to identify its children across the light DOM,
|
|
53
|
+
* which is cheaper than `instanceof` and is why this is public rather than
|
|
54
|
+
* protected. Not a consumer's to read or set.
|
|
55
|
+
*/
|
|
56
|
+
this.isSpeedDialItem = true;
|
|
57
|
+
this.handleClick = () => {
|
|
58
|
+
this.choose();
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Puts focus on the control inside, which is what a reader can reach. */
|
|
62
|
+
focus() {
|
|
63
|
+
this.renderRoot?.querySelector('[part="item"]')?.focus();
|
|
64
|
+
}
|
|
65
|
+
/** `NavigableItem`, so the arrow keys are the shared controller's business. */
|
|
66
|
+
focusItem() {
|
|
67
|
+
this.focus();
|
|
68
|
+
}
|
|
69
|
+
/** Chooses the action, which is the same act as pressing it. */
|
|
70
|
+
select() {
|
|
71
|
+
this.choose();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Whether this is the row the set is on, which here is where focus is.
|
|
75
|
+
*
|
|
76
|
+
* Asked of the document rather than of the shadow root: focus lands on the
|
|
77
|
+
* control inside this element and the platform retargets it, so from outside
|
|
78
|
+
* `activeElement` already is this element. `Menu.Item` records the same, and
|
|
79
|
+
* the reading it replaced is one that does not survive happy-dom.
|
|
80
|
+
*/
|
|
81
|
+
get selected() {
|
|
82
|
+
return this.ownerDocument.activeElement === this;
|
|
83
|
+
}
|
|
84
|
+
choose() {
|
|
85
|
+
if (this.disabled) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.dispatchEvent(new HelixSelectEvent({ value: this.value }));
|
|
89
|
+
}
|
|
90
|
+
render() {
|
|
91
|
+
return html `<button
|
|
92
|
+
part="item"
|
|
93
|
+
role="menuitem"
|
|
94
|
+
type="button"
|
|
95
|
+
aria-disabled=${this.disabled ? 'true' : nothing}
|
|
96
|
+
?disabled=${this.disabled}
|
|
97
|
+
@click=${this.handleClick}
|
|
98
|
+
>
|
|
99
|
+
<span part="icon"><slot name="icon"></slot></span>
|
|
100
|
+
<span part="label"><slot></slot></span>
|
|
101
|
+
</button>`;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
__decorate([
|
|
105
|
+
property()
|
|
106
|
+
], HelixHeadlessSpeedDialItem.prototype, "value", void 0);
|
|
107
|
+
__decorate([
|
|
108
|
+
property({ reflect: true, type: Boolean })
|
|
109
|
+
], HelixHeadlessSpeedDialItem.prototype, "disabled", void 0);
|
|
110
|
+
HelixHeadlessSpeedDialItem = __decorate([
|
|
111
|
+
customElement('helix-headless-speed-dial-item')
|
|
112
|
+
], HelixHeadlessSpeedDialItem);
|
|
113
|
+
export { HelixHeadlessSpeedDialItem };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { HelixElement, KeyboardNavigationController, type Placement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
declare const HelixHeadlessSpeedDial_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerOpenInterface) & typeof HelixElement;
|
|
4
|
+
/**
|
|
5
|
+
* @summary A button that fans out the few actions a screen is for.
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* **A menu, and deliberately not a new one.** Its rows are commands, which is
|
|
9
|
+
* what `role="menu"` and `menuitem` exist for, so this takes them and takes the
|
|
10
|
+
* behavior with them: the arrow keys are `KeyboardNavigationController`, the
|
|
11
|
+
* panel is `PopoverController`, and open and closed is `MixinControllerOpen`.
|
|
12
|
+
* `Menu` is built from the same pieces. What is not shared is what actually
|
|
13
|
+
* differs: a dial has no submenus, no headers, no checkable rows and no long
|
|
14
|
+
* list to type ahead through, and shipping it as an appearance of `Menu` would
|
|
15
|
+
* have meant defining what a dial with a submenu in it does.
|
|
16
|
+
*
|
|
17
|
+
* **The trigger is a control the consumer slots**, and the floating action
|
|
18
|
+
* button is the usual one: `helix-icon-button` with `shape="circle"` and
|
|
19
|
+
* `raised`. There is no `helix-fab` here, and the reason is worth stating,
|
|
20
|
+
* because a component would have re-declared `emphasis`, `tone`, `label` and
|
|
21
|
+
* a size around a control that already has all four. A round raised button is a
|
|
22
|
+
* shape, and where it sits is `data-dock` in the base layer.
|
|
23
|
+
*
|
|
24
|
+
* **Nothing is reserved from the keyboard.** A menu that drills has to keep the
|
|
25
|
+
* horizontal pair for going in and coming back; a dial goes nowhere, so all four
|
|
26
|
+
* arrows move through the actions and a reader who guesses either axis is
|
|
27
|
+
* answered. That is the controller's own house position, and this is a component
|
|
28
|
+
* with no reason to argue with it.
|
|
29
|
+
*
|
|
30
|
+
* @since 0.1.0
|
|
31
|
+
* @status experimental
|
|
32
|
+
* @category actions
|
|
33
|
+
* @aliases FAB, Floating action button, Action button, Quick actions
|
|
34
|
+
* @documentation https://helix.fusion.dev/components/speed-dial
|
|
35
|
+
*
|
|
36
|
+
* @slot - The actions.
|
|
37
|
+
* @slot trigger - The control that opens it. Falls back to a button named by `label`.
|
|
38
|
+
*
|
|
39
|
+
* @event {HelixBeforeCloseEvent} helix-before-close - Fired before it closes, and cancelable.
|
|
40
|
+
* @event {HelixBeforeOpenEvent} helix-before-open - Fired before it opens, and cancelable.
|
|
41
|
+
* @event {Event} toggle - Says the state moved, carrying `newState` and `oldState`.
|
|
42
|
+
*
|
|
43
|
+
* @csspart actions - The region the actions are drawn in.
|
|
44
|
+
* @csspart icon - A glyph this component draws.
|
|
45
|
+
* @csspart trigger - The default trigger, where none was slotted.
|
|
46
|
+
*/
|
|
47
|
+
export declare class HelixHeadlessSpeedDial extends HelixHeadlessSpeedDial_base {
|
|
48
|
+
/**
|
|
49
|
+
* Names the trigger and the set of actions it opens.
|
|
50
|
+
*/
|
|
51
|
+
label: string;
|
|
52
|
+
/**
|
|
53
|
+
* Which way the actions fan out. They move if that side does not fit.
|
|
54
|
+
*
|
|
55
|
+
* Up by default, because the control this hangs off is usually docked to the
|
|
56
|
+
* bottom of the window and there is nothing below it to fan into.
|
|
57
|
+
*/
|
|
58
|
+
placement: Placement;
|
|
59
|
+
/**
|
|
60
|
+
* Space between the trigger and the actions, in pixels.
|
|
61
|
+
*/
|
|
62
|
+
offset: number;
|
|
63
|
+
protected readonly keys: KeyboardNavigationController;
|
|
64
|
+
private readonly panel;
|
|
65
|
+
/** Whatever the consumer slotted, or the button rendered in its place. */
|
|
66
|
+
private get trigger();
|
|
67
|
+
/** The actions, which are this element's own rows and nothing else slotted. */
|
|
68
|
+
private get items();
|
|
69
|
+
/** Shuts it and puts the reader back on the trigger. */
|
|
70
|
+
private close;
|
|
71
|
+
private readonly handleTriggerClick;
|
|
72
|
+
private readonly handleSelect;
|
|
73
|
+
private readonly handleKeydown;
|
|
74
|
+
connectedCallback(): void;
|
|
75
|
+
disconnectedCallback(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Tells a slotted trigger what it is doing, since it cannot know.
|
|
78
|
+
*
|
|
79
|
+
* The fallback button is rendered by this element and says so in its own
|
|
80
|
+
* template. A trigger the consumer slotted is their markup, and the state it
|
|
81
|
+
* needs to announce is state only this element holds: without this, the
|
|
82
|
+
* arrangement this component recommends, an icon button slotted as the
|
|
83
|
+
* trigger, is a control that opens a menu and never says it has one. A
|
|
84
|
+
* consumer who has to mirror `open` back onto their own trigger is a consumer
|
|
85
|
+
* who will forget, and the failure is silent to everyone who can see the
|
|
86
|
+
* screen.
|
|
87
|
+
*
|
|
88
|
+
* **Every word of that survives; the mechanism does not.** This wrote
|
|
89
|
+
* `aria-expanded` and `aria-haspopup` onto the consumer's element with
|
|
90
|
+
* `setAttribute`, and measured against React 19.2.8 that is a hydration
|
|
91
|
+
* mismatch React reports and does not patch up. `tellDisclosure` carries the
|
|
92
|
+
* argument and the measurement: the state travels as a property now, into the
|
|
93
|
+
* trigger's own shadow root, where React neither looks nor compares.
|
|
94
|
+
*
|
|
95
|
+
* `aria-haspopup` goes with it rather than being written separately. It is a
|
|
96
|
+
* constant, so it could stay an attribute without changing on every open, and
|
|
97
|
+
* an attribute the consumer's server never sent is a mismatch whether or not
|
|
98
|
+
* it moves afterwards: that was measured too, both load orders. A trigger that
|
|
99
|
+
* says it is expanded is already saying it has something to expand.
|
|
100
|
+
*/
|
|
101
|
+
private announce;
|
|
102
|
+
protected updated(changed: PropertyValues): void;
|
|
103
|
+
/**
|
|
104
|
+
* The control that opens it, behind a seam the styled tier can move.
|
|
105
|
+
*
|
|
106
|
+
* **This is the case the tier rule blocks and a render method unblocks.** A
|
|
107
|
+
* bare `<button>` is what the headless tier can write: it must not reach for
|
|
108
|
+
* `helix-button`, which lives a tier above and would make `headless` depend
|
|
109
|
+
* on `web`. So the base draws the plain control and a tier that has buttons
|
|
110
|
+
* of its own overrides this to use one, which is the whole shape #76 exists
|
|
111
|
+
* for. Written inline the only way to change it was to reimplement the
|
|
112
|
+
* template, panel and all.
|
|
113
|
+
*/
|
|
114
|
+
protected renderTrigger(): TemplateResult;
|
|
115
|
+
protected render(): TemplateResult;
|
|
116
|
+
}
|
|
117
|
+
declare global {
|
|
118
|
+
interface HTMLElementTagNameMap {
|
|
119
|
+
'helix-headless-speed-dial': HelixHeadlessSpeedDial;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export {};
|