@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,484 @@
|
|
|
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 { valueAsNumber as asNumber, customElement, numberAsValue as fromNumber, HelixFormElement, KeyboardNavigationController, MixinControllerValue, MixinField, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html, nothing } from 'lit';
|
|
9
|
+
import { property, state } from 'lit/decorators.js';
|
|
10
|
+
/**
|
|
11
|
+
* @summary A score out of a few marks, given or shown.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* **Half marks decide the shape, so they are decided first.** Supporting them
|
|
15
|
+
* means the value is not an integer and the targets are not the marks: five
|
|
16
|
+
* stars at a half step is ten places to press, and a mark that is filled to the
|
|
17
|
+
* middle. Everything else follows from that, which is why `step` is here rather
|
|
18
|
+
* than added later, when the pointer handling would have to be rewritten around
|
|
19
|
+
* it.
|
|
20
|
+
*
|
|
21
|
+
* **A partial mark is the whole mark, clipped.** Not a second glyph filled to
|
|
22
|
+
* the middle: that needs a matching pair drawn for every mark anybody uses, and
|
|
23
|
+
* the moment a consumer wants a heart or a circle they need to draw one too. The
|
|
24
|
+
* fill is the same marks over the same marks, cut off partway, so any mark works
|
|
25
|
+
* and any fraction does.
|
|
26
|
+
*
|
|
27
|
+
* **Read-only is not this control greyed out, it is a different thing.** The
|
|
28
|
+
* commoner use is showing a score nobody is being asked for, a product's
|
|
29
|
+
* average, and that is not a control at all: it takes no focus, answers no keys,
|
|
30
|
+
* has no options to choose between, and reads as one thing rather than as five.
|
|
31
|
+
* So `readonly` is `role="img"` with the score in its name, where the control is
|
|
32
|
+
* a radio group. A disabled control is still a control and still says so; this
|
|
33
|
+
* is not one.
|
|
34
|
+
*
|
|
35
|
+
* **Moving is choosing here**, which is the radio group's reading and the
|
|
36
|
+
* opposite of `Menu`'s: arriving at four stars *is* rating it four, because
|
|
37
|
+
* nothing else follows and there is nothing to confirm. That is what
|
|
38
|
+
* `KeyboardNavigationController` takes `selects` for, and why this can use it
|
|
39
|
+
* where a menu cannot.
|
|
40
|
+
*
|
|
41
|
+
* **The mark is a stylesheet's, not a slot's.** A slot projects its content
|
|
42
|
+
* once, and there are two layers of marks here: slotting a star would put it in
|
|
43
|
+
* the track or the fill and leave the other empty. So the mark is a shape the
|
|
44
|
+
* styled tier masks with, which is also what lets a partial one be a clip of the
|
|
45
|
+
* whole rather than a second drawing of it.
|
|
46
|
+
*
|
|
47
|
+
* The properties below are written by this component and read by whoever draws
|
|
48
|
+
* it. A consumer sets none of them: they carry a number this element computed
|
|
49
|
+
* and CSS cannot, which is what lets a stylesheet on this tier draw the thing
|
|
50
|
+
* without measuring anything itself.
|
|
51
|
+
*
|
|
52
|
+
* @since 0.1.0
|
|
53
|
+
* @status experimental
|
|
54
|
+
* @category forms
|
|
55
|
+
* @aliases Stars, Score, Review score
|
|
56
|
+
* @documentation https://helix.fusion.dev/components/rating
|
|
57
|
+
*
|
|
58
|
+
* @event {Event} change - Announced with it, the choice being the commit.
|
|
59
|
+
* @event {HelixBeforeChangeEvent} helix-before-change - Fired before the score changes, and cancelable.
|
|
60
|
+
* @event {Event} input - Announced once the value has moved.
|
|
61
|
+
*
|
|
62
|
+
* @csspart feedback - What is wrong with it.
|
|
63
|
+
* @csspart fill - The filled marks, clipped to the score.
|
|
64
|
+
* @csspart hint - Help under the marks, while nothing is wrong.
|
|
65
|
+
* @csspart label - The question, over the marks.
|
|
66
|
+
* @csspart mark - One mark, in either layer.
|
|
67
|
+
* @csspart marks - The row of marks.
|
|
68
|
+
* @csspart option - One place a reader can press, which is one step.
|
|
69
|
+
* @csspart track - The unfilled marks.
|
|
70
|
+
* @csspart value - The score written out, under `show-value`.
|
|
71
|
+
*
|
|
72
|
+
* @cssproperty --rating-full - How many marks are wholly filled.
|
|
73
|
+
* @cssproperty --rating-part - How much of the next mark is filled, 0 to 1.
|
|
74
|
+
* @cssproperty --rating-step - The width of one step, as a fraction of a mark.
|
|
75
|
+
* @cssproperty --rating-steps - How many steps one mark is divided into.
|
|
76
|
+
*/
|
|
77
|
+
let HelixHeadlessRating = class HelixHeadlessRating extends MixinControllerValue(MixinField(HelixFormElement)) {
|
|
78
|
+
constructor() {
|
|
79
|
+
super(...arguments);
|
|
80
|
+
/*
|
|
81
|
+
* Discrete, which is the default and is said here only because it was wrong.
|
|
82
|
+
*
|
|
83
|
+
* `Input`, `Slider`, `NumberInput`, `Textarea` and `PinInput` all announce
|
|
84
|
+
* input, and every one of them is edited continuously: a value passes through
|
|
85
|
+
* every keystroke or pixel on its way to the one meant. A rating does not. A
|
|
86
|
+
* press picks a score, an arrow picks the next one, and the drag deliberately
|
|
87
|
+
* asks for nothing until it is let go, so there is exactly one value and it
|
|
88
|
+
* is the chosen one. That is `helix-before-change`, the same as the radio group this
|
|
89
|
+
* announces itself as.
|
|
90
|
+
*/
|
|
91
|
+
this.announcesInput = false;
|
|
92
|
+
/**
|
|
93
|
+
* How many marks there are.
|
|
94
|
+
*/
|
|
95
|
+
this.max = 5;
|
|
96
|
+
/**
|
|
97
|
+
* The lowest score a reader can give, which is what clearing returns to.
|
|
98
|
+
*
|
|
99
|
+
* Zero rather than one, because "no rating" and "the worst rating" are
|
|
100
|
+
* different answers and a control that cannot express the first has to
|
|
101
|
+
* pretend the second. A survey that requires an answer says so with
|
|
102
|
+
* `required`, not by making one unreachable.
|
|
103
|
+
*/
|
|
104
|
+
this.min = 0;
|
|
105
|
+
/**
|
|
106
|
+
* The smallest part of a mark that can be chosen.
|
|
107
|
+
*
|
|
108
|
+
* `0.5` is the half star, and it is the reason the value is a number rather
|
|
109
|
+
* than an index: with halves, five marks are ten answers.
|
|
110
|
+
*/
|
|
111
|
+
this.step = 1;
|
|
112
|
+
/**
|
|
113
|
+
* Whether this shows a score rather than asks for one.
|
|
114
|
+
*
|
|
115
|
+
* A readout is not a control that has been switched off. It takes no focus,
|
|
116
|
+
* answers no keys, and reads as one thing: see the note on the class.
|
|
117
|
+
*/
|
|
118
|
+
this.readOnly = false;
|
|
119
|
+
/**
|
|
120
|
+
* How the score is read out, where "3.5 out of 5" is not what it should say.
|
|
121
|
+
*
|
|
122
|
+
* A rating out of five is one of the few places a screen reader gets a worse
|
|
123
|
+
* answer from the value than from a sentence: "3.5" alone is a number without
|
|
124
|
+
* a subject. This names the readout, where a control is named by its `label`
|
|
125
|
+
* and each of its options by the score that option is.
|
|
126
|
+
*/
|
|
127
|
+
this.valueText = '';
|
|
128
|
+
/**
|
|
129
|
+
* Whether the score is written out beside the marks.
|
|
130
|
+
*
|
|
131
|
+
* Marks say roughly, and a number says exactly. Four and a bit stars is not a
|
|
132
|
+
* reading anyone can repeat, which is why a product's average is nearly always
|
|
133
|
+
* printed next to them. `Meter` spells its reading the same way and under the
|
|
134
|
+
* same attribute.
|
|
135
|
+
*
|
|
136
|
+
* It follows the pointer, because it labels what the marks are showing rather
|
|
137
|
+
* than what the form holds: a label that disagreed with the marks under the
|
|
138
|
+
* reader's own cursor would be worse than no label.
|
|
139
|
+
*/
|
|
140
|
+
this.showValue = false;
|
|
141
|
+
/**
|
|
142
|
+
* The shape a consumer slotted, if they slotted one.
|
|
143
|
+
*
|
|
144
|
+
* Read rather than projected. A `<slot>` shows its content once and a rating
|
|
145
|
+
* needs the shape as many times as there are marks, twice over because there
|
|
146
|
+
* are two layers, so the slot here is a way of being handed the shape rather
|
|
147
|
+
* than a place the shape is drawn. What is handed over gets cloned into every
|
|
148
|
+
* position.
|
|
149
|
+
*
|
|
150
|
+
* **One shape, not one per position.** A rating is a quantity of identical
|
|
151
|
+
* marks and the fill is a clip across all of them, so a row whose third mark
|
|
152
|
+
* is a different drawing from its first is not a rating: it is a set of
|
|
153
|
+
* choices, which is `Radio.Group` and already carries a value and a name on
|
|
154
|
+
* each of its own options. Anything past the first slotted element is
|
|
155
|
+
* ignored.
|
|
156
|
+
*/
|
|
157
|
+
this.markSource = undefined;
|
|
158
|
+
/**
|
|
159
|
+
* What the pointer is over, which is shown instead of the score while it is.
|
|
160
|
+
*/
|
|
161
|
+
this.previewing = undefined;
|
|
162
|
+
/* The radio group's reading, and `selects` is what makes it one: arriving at
|
|
163
|
+
a mark rates it. `Menu` passes false to the same option for the opposite
|
|
164
|
+
reason, which is the whole of the difference between a set of choices and a
|
|
165
|
+
set of commands. */
|
|
166
|
+
this.keys = new KeyboardNavigationController(this, {
|
|
167
|
+
items: () => this.options,
|
|
168
|
+
selects: () => true,
|
|
169
|
+
wrap: false,
|
|
170
|
+
});
|
|
171
|
+
/** The pointer drawing a score, while one is. */
|
|
172
|
+
this.dragging = undefined;
|
|
173
|
+
/**
|
|
174
|
+
* One clone per place a mark goes, kept so a render does not remake them.
|
|
175
|
+
*
|
|
176
|
+
* A drag renders on every pointer move, and handing Lit a fresh node each
|
|
177
|
+
* time would swap every mark in the row on every frame of a gesture whose
|
|
178
|
+
* whole point is that only the fill moves.
|
|
179
|
+
*/
|
|
180
|
+
this.clones = new Map();
|
|
181
|
+
this.handleMarkSlot = (event) => {
|
|
182
|
+
this.clones.clear();
|
|
183
|
+
this.markSource = event.target.assignedElements({ flatten: true })[0];
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Dragging across the marks draws a score, and letting go chooses it.
|
|
187
|
+
*
|
|
188
|
+
* One press and a slide is how a rating is given on a phone, and on a desktop
|
|
189
|
+
* it is how somebody who overshoots corrects without lifting. Pointer capture
|
|
190
|
+
* is what makes it one gesture: without it the events go to whichever target
|
|
191
|
+
* the pointer crossed into, and a drag that leaves the row stops reporting.
|
|
192
|
+
*
|
|
193
|
+
* Nothing is chosen until release, so a drag that ends back where it started,
|
|
194
|
+
* or off the element entirely, has asked for nothing.
|
|
195
|
+
*/
|
|
196
|
+
this.handleDragStart = (event) => {
|
|
197
|
+
if (this.isDisabled || this.readOnly || event.button !== 0) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const score = this.scoreAt(event.clientX);
|
|
201
|
+
if (score === undefined) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
;
|
|
206
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
/* A synthesised pointer has no capture to take, and the drag works
|
|
210
|
+
without it right up until the pointer leaves the row. Worth having the
|
|
211
|
+
gesture testable rather than making the specs drive a real device. */
|
|
212
|
+
}
|
|
213
|
+
this.dragging = event.pointerId;
|
|
214
|
+
this.previewing = Number.parseFloat(score);
|
|
215
|
+
};
|
|
216
|
+
this.handleDragMove = (event) => {
|
|
217
|
+
if (this.dragging !== event.pointerId) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const score = this.scoreAt(event.clientX);
|
|
221
|
+
if (score !== undefined) {
|
|
222
|
+
this.previewing = Number.parseFloat(score);
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
this.handleDragEnd = (event) => {
|
|
226
|
+
if (this.dragging !== event.pointerId) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
this.dragging = undefined;
|
|
230
|
+
this.previewing = undefined;
|
|
231
|
+
const score = this.scoreAt(event.clientX);
|
|
232
|
+
if (score !== undefined) {
|
|
233
|
+
this.requestValue(score);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
/* A canceled pointer is the system taking the gesture away, which is not the
|
|
237
|
+
reader choosing. Put the marks back to the value they already held. */
|
|
238
|
+
this.handleDragCancel = (event) => {
|
|
239
|
+
if (this.dragging !== event.pointerId) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
this.dragging = undefined;
|
|
243
|
+
this.previewing = undefined;
|
|
244
|
+
};
|
|
245
|
+
this.handleOptionClick = (event) => {
|
|
246
|
+
const option = event.currentTarget;
|
|
247
|
+
this.requestValue(option.dataset.score ?? '');
|
|
248
|
+
};
|
|
249
|
+
this.handleOptionEnter = (event) => {
|
|
250
|
+
if (this.isDisabled) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const option = event.currentTarget;
|
|
254
|
+
this.previewing = Number.parseFloat(option.dataset.score ?? '');
|
|
255
|
+
};
|
|
256
|
+
this.handleLeave = () => {
|
|
257
|
+
this.previewing = undefined;
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/** The score, as a number, clamped to what the marks can show. */
|
|
261
|
+
get score() {
|
|
262
|
+
const parsed = Number.parseFloat(this.value);
|
|
263
|
+
if (!Number.isFinite(parsed)) {
|
|
264
|
+
return 0;
|
|
265
|
+
}
|
|
266
|
+
return Math.min(Math.max(parsed, 0), this.max);
|
|
267
|
+
}
|
|
268
|
+
/** Every score a reader can choose, which is `max / step` of them. */
|
|
269
|
+
get steps() {
|
|
270
|
+
const count = Math.max(1, Math.round(this.max / this.step));
|
|
271
|
+
return Array.from({ length: count }, (_, index) => Number(((index + 1) * this.step).toFixed(2)));
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* The options, as the shared controller wants them.
|
|
275
|
+
*
|
|
276
|
+
* Adapters rather than elements, because these are buttons this element drew
|
|
277
|
+
* rather than a consumer's custom elements: the interface asks for five
|
|
278
|
+
* things and a `<button>` in a shadow root can answer all five without being
|
|
279
|
+
* dressed up as a component to do it.
|
|
280
|
+
*/
|
|
281
|
+
get options() {
|
|
282
|
+
const found = [...(this.renderRoot?.querySelectorAll('[part="option"]') ?? [])];
|
|
283
|
+
return found.map((element) => ({
|
|
284
|
+
contains: (node) => element.contains(node),
|
|
285
|
+
disabled: this.isDisabled || this.readOnly,
|
|
286
|
+
focusItem: () => element.focus(),
|
|
287
|
+
select: () => {
|
|
288
|
+
this.requestValue(element.dataset.score ?? '');
|
|
289
|
+
},
|
|
290
|
+
selected: element.getAttribute('aria-checked') === 'true',
|
|
291
|
+
}));
|
|
292
|
+
}
|
|
293
|
+
/** The shape for one place, or nothing when the stylesheet is drawing it. */
|
|
294
|
+
markFor(layer, index) {
|
|
295
|
+
if (!this.markSource) {
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
const key = `${layer}:${index}`;
|
|
299
|
+
const held = this.clones.get(key);
|
|
300
|
+
if (held) {
|
|
301
|
+
return held;
|
|
302
|
+
}
|
|
303
|
+
const clone = this.markSource.cloneNode(true);
|
|
304
|
+
this.clones.set(key, clone);
|
|
305
|
+
return clone;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* The step under a point on the row, or the nearest one to it.
|
|
309
|
+
*
|
|
310
|
+
* Asked of the boxes rather than worked out from `max` and `step`, because
|
|
311
|
+
* where a step sits is the stylesheet's arithmetic and this would be a second
|
|
312
|
+
* copy of it that could disagree. The browser has already laid the targets
|
|
313
|
+
* out; this reads them back.
|
|
314
|
+
*
|
|
315
|
+
* Nearest rather than only a hit, so a drag that runs off the end of the row
|
|
316
|
+
* pins to the last mark instead of stopping at whatever it last touched, and
|
|
317
|
+
* a pointer in the half-gap outside the first mark still answers.
|
|
318
|
+
*/
|
|
319
|
+
scoreAt(clientX) {
|
|
320
|
+
let nearest;
|
|
321
|
+
let best = Number.POSITIVE_INFINITY;
|
|
322
|
+
for (const option of this.renderRoot?.querySelectorAll('[part="option"]') ?? []) {
|
|
323
|
+
const box = option.getBoundingClientRect();
|
|
324
|
+
if (clientX >= box.left && clientX < box.right) {
|
|
325
|
+
return option.dataset.score;
|
|
326
|
+
}
|
|
327
|
+
const away = clientX < box.left ? box.left - clientX : clientX - box.right;
|
|
328
|
+
if (away < best) {
|
|
329
|
+
best = away;
|
|
330
|
+
nearest = option.dataset.score;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return nearest;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Reports the value, and whether the form may go without one.
|
|
337
|
+
*
|
|
338
|
+
* **`required` was on the API page and did nothing.** The mixin brings it,
|
|
339
|
+
* so it printed on the reference page and read as supported, and nothing here
|
|
340
|
+
* ever called `setValidity`: a form holding an unrated required rating
|
|
341
|
+
* submitted, measured, with `:valid` true and the entry present but empty.
|
|
342
|
+
* This is the case `min` argues for in its own note, that "no rating" and
|
|
343
|
+
* "the worst rating" are different answers and a survey that requires one
|
|
344
|
+
* says so with `required`.
|
|
345
|
+
*
|
|
346
|
+
* **Empty is `value === ''` rather than a score of zero**, because zero is a
|
|
347
|
+
* rating a reader can deliberately give when `min` allows it, and refusing to
|
|
348
|
+
* submit it would be the control disagreeing with the property that permits
|
|
349
|
+
* it. What `required` asks is whether they answered at all.
|
|
350
|
+
*
|
|
351
|
+
* `Slider` is deliberately not given the same treatment: a native
|
|
352
|
+
* `<input type="range" required>` is always valid, because a range always
|
|
353
|
+
* holds a number, and matching the platform there is the point.
|
|
354
|
+
*/
|
|
355
|
+
sync() {
|
|
356
|
+
this.internals.setFormValue(this.value);
|
|
357
|
+
this.reportRequired(this.value === '', 'Choose a rating to continue.', 'marks');
|
|
358
|
+
}
|
|
359
|
+
connectedCallback() {
|
|
360
|
+
super.connectedCallback();
|
|
361
|
+
this.addEventListener('pointerleave', this.handleLeave);
|
|
362
|
+
}
|
|
363
|
+
disconnectedCallback() {
|
|
364
|
+
super.disconnectedCallback();
|
|
365
|
+
this.removeEventListener('pointerleave', this.handleLeave);
|
|
366
|
+
}
|
|
367
|
+
updated(changed) {
|
|
368
|
+
super.updated?.(changed);
|
|
369
|
+
// Every update, not only the ones that name `value`: see the note on
|
|
370
|
+
// `ColorInput.updated`, and the fifteen controls that already did this.
|
|
371
|
+
this.sync();
|
|
372
|
+
}
|
|
373
|
+
firstUpdated(changed) {
|
|
374
|
+
super.firstUpdated?.(changed);
|
|
375
|
+
this.sync();
|
|
376
|
+
}
|
|
377
|
+
render() {
|
|
378
|
+
const showing = this.previewing ?? this.score;
|
|
379
|
+
const said = this.valueText || `${this.score} out of ${this.max}`;
|
|
380
|
+
const count = Math.max(0, Math.round(this.max));
|
|
381
|
+
const first = this.steps[0];
|
|
382
|
+
const mark = (layer, index) => html `<span part="mark">${this.markFor(layer, index)}</span>`;
|
|
383
|
+
/* Both layers hold every mark, because the fill is a clip of the whole row
|
|
384
|
+
rather than a count of the filled ones.
|
|
385
|
+
|
|
386
|
+
Written out twice rather than through one helper taking the part name:
|
|
387
|
+
`check:selectors` reads the literals to know what this renders, and a
|
|
388
|
+
`part=${name}` binding is invisible to it. It called the stylesheet's
|
|
389
|
+
`[part="track"]` and `[part="fill"]` dead. */
|
|
390
|
+
const marksIn = (layer) => Array.from({ length: count }, (_, index) => mark(layer, index));
|
|
391
|
+
return html `<div
|
|
392
|
+
part="marks"
|
|
393
|
+
role=${this.readOnly ? 'img' : 'radiogroup'}
|
|
394
|
+
aria-label=${this.readOnly ? said : this.label || nothing}
|
|
395
|
+
data-slotted=${this.markSource ? '' : nothing}
|
|
396
|
+
style=${`--rating-full: ${Math.floor(showing)}; --rating-part: ${showing - Math.floor(showing)}; --rating-steps: ${this.steps.length}`}
|
|
397
|
+
@pointercancel=${this.handleDragCancel}
|
|
398
|
+
@pointerdown=${this.handleDragStart}
|
|
399
|
+
@pointermove=${this.handleDragMove}
|
|
400
|
+
@pointerup=${this.handleDragEnd}
|
|
401
|
+
>
|
|
402
|
+
<!-- Hidden because this is where the shape arrives, not where it is drawn:
|
|
403
|
+
what a reader sees is the clones, one per position. -->
|
|
404
|
+
<slot
|
|
405
|
+
name="mark"
|
|
406
|
+
hidden
|
|
407
|
+
@slotchange=${this.handleMarkSlot}
|
|
408
|
+
></slot>
|
|
409
|
+
<span
|
|
410
|
+
part="track"
|
|
411
|
+
aria-hidden="true"
|
|
412
|
+
>${marksIn('track')}</span
|
|
413
|
+
>
|
|
414
|
+
<span
|
|
415
|
+
part="fill"
|
|
416
|
+
aria-hidden="true"
|
|
417
|
+
>${marksIn('fill')}</span
|
|
418
|
+
>
|
|
419
|
+
${this.readOnly
|
|
420
|
+
? nothing
|
|
421
|
+
: this.steps.map((score, index) => html `<button
|
|
422
|
+
part="option"
|
|
423
|
+
role="radio"
|
|
424
|
+
type="button"
|
|
425
|
+
aria-checked=${this.score === score ? 'true' : 'false'}
|
|
426
|
+
aria-label=${`${score} out of ${this.max}`}
|
|
427
|
+
data-score=${String(score)}
|
|
428
|
+
style=${`--rating-step: ${index + 1}`}
|
|
429
|
+
?disabled=${this.isDisabled}
|
|
430
|
+
tabindex=${this.score === score || (this.score === 0 && score === first) ? '0' : '-1'}
|
|
431
|
+
@click=${this.handleOptionClick}
|
|
432
|
+
@pointerenter=${this.handleOptionEnter}
|
|
433
|
+
></button>`)}
|
|
434
|
+
</div>
|
|
435
|
+
${this.showValue
|
|
436
|
+
? html `<span
|
|
437
|
+
part="value"
|
|
438
|
+
aria-hidden="true"
|
|
439
|
+
>${showing}</span
|
|
440
|
+
>`
|
|
441
|
+
: nothing}`;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* The value as a number, or `NaN` while the control is empty.
|
|
445
|
+
*
|
|
446
|
+
* `NaN` and not zero, which is the trap the platform already avoids: `Number('')`
|
|
447
|
+
* is zero, so an empty control would report a number it does not hold and a
|
|
448
|
+
* form would submit it.
|
|
449
|
+
*/
|
|
450
|
+
get valueAsNumber() {
|
|
451
|
+
return asNumber(this.value);
|
|
452
|
+
}
|
|
453
|
+
set valueAsNumber(count) {
|
|
454
|
+
this.value = fromNumber(count);
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
__decorate([
|
|
458
|
+
property({ type: Number })
|
|
459
|
+
], HelixHeadlessRating.prototype, "max", void 0);
|
|
460
|
+
__decorate([
|
|
461
|
+
property({ type: Number })
|
|
462
|
+
], HelixHeadlessRating.prototype, "min", void 0);
|
|
463
|
+
__decorate([
|
|
464
|
+
property({ type: Number })
|
|
465
|
+
], HelixHeadlessRating.prototype, "step", void 0);
|
|
466
|
+
__decorate([
|
|
467
|
+
property({ attribute: 'readonly', reflect: true, type: Boolean })
|
|
468
|
+
], HelixHeadlessRating.prototype, "readOnly", void 0);
|
|
469
|
+
__decorate([
|
|
470
|
+
property({ attribute: 'value-text' })
|
|
471
|
+
], HelixHeadlessRating.prototype, "valueText", void 0);
|
|
472
|
+
__decorate([
|
|
473
|
+
property({ attribute: 'show-value', reflect: true, type: Boolean })
|
|
474
|
+
], HelixHeadlessRating.prototype, "showValue", void 0);
|
|
475
|
+
__decorate([
|
|
476
|
+
state()
|
|
477
|
+
], HelixHeadlessRating.prototype, "markSource", void 0);
|
|
478
|
+
__decorate([
|
|
479
|
+
state()
|
|
480
|
+
], HelixHeadlessRating.prototype, "previewing", void 0);
|
|
481
|
+
HelixHeadlessRating = __decorate([
|
|
482
|
+
customElement('helix-headless-rating')
|
|
483
|
+
], HelixHeadlessRating);
|
|
484
|
+
export { HelixHeadlessRating };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/scroll-area-root.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/scroll-area-root.js';
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
/** Which edges have something past them, as a set of tokens. */
|
|
4
|
+
declare const EDGES: readonly ['block-start', 'block-end', 'inline-start', 'inline-end'];
|
|
5
|
+
/**
|
|
6
|
+
* @summary A scrolling box that says there is more.
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* **The whole component is one fact a stylesheet cannot work out for itself:
|
|
10
|
+
* which edges have content past them.** A fade at the bottom of a list is easy
|
|
11
|
+
* to draw and impossible to decide, because CSS has no reading of scroll
|
|
12
|
+
* position. So this measures and says, in `data-more`, and the styled tier
|
|
13
|
+
* draws whatever it likes on the edges named.
|
|
14
|
+
*
|
|
15
|
+
* **Tokens rather than four attributes**, so a stylesheet asks
|
|
16
|
+
* `[data-more~="block-end"]` the way it would ask about a class. Four booleans
|
|
17
|
+
* say the same thing in four selectors and read worse at every use.
|
|
18
|
+
*
|
|
19
|
+
* **A scrolling region takes the keyboard when it scrolls, and not before.**
|
|
20
|
+
* A box a reader can only reach with a pointer is a box some readers cannot
|
|
21
|
+
* read at all, which is what `tabindex` answers here. Only while it overflows:
|
|
22
|
+
* a tab stop on a box with nothing to scroll is a stop that does nothing, and a
|
|
23
|
+
* form full of them is worse than the problem.
|
|
24
|
+
*
|
|
25
|
+
* `role="region"` only with a `label`, because an unnamed region is an
|
|
26
|
+
* announcement with no content: a screen reader says "region" and the reader
|
|
27
|
+
* has learned nothing they did not already know.
|
|
28
|
+
*
|
|
29
|
+
* @since 0.1.0
|
|
30
|
+
* @status stable
|
|
31
|
+
* @category layout
|
|
32
|
+
* @aliases Scroller, Overflow, Scroll container
|
|
33
|
+
* @documentation https://helix.fusion.dev/components/scroll-area
|
|
34
|
+
*
|
|
35
|
+
* @slot - What scrolls.
|
|
36
|
+
*
|
|
37
|
+
* @csspart edges - Where the sideways edge cues are drawn.
|
|
38
|
+
* @csspart viewport - The scrolling box.
|
|
39
|
+
*/
|
|
40
|
+
export declare class HelixHeadlessScrollArea extends HelixElement {
|
|
41
|
+
/**
|
|
42
|
+
* Names the region, for a reader arriving at it out of context.
|
|
43
|
+
*
|
|
44
|
+
* Without one there is no region: see the note on the class.
|
|
45
|
+
*/
|
|
46
|
+
label: string;
|
|
47
|
+
/**
|
|
48
|
+
* Which edges have content past them, measured rather than guessed.
|
|
49
|
+
*/
|
|
50
|
+
private more;
|
|
51
|
+
/**
|
|
52
|
+
* Whether there is anything to scroll at all, which decides the tab stop.
|
|
53
|
+
*/
|
|
54
|
+
private scrolls;
|
|
55
|
+
private watcher;
|
|
56
|
+
/**
|
|
57
|
+
* The box that actually scrolls, for anything that needs to move it.
|
|
58
|
+
*
|
|
59
|
+
* **Public because the alternative is silence.** Bringing a row into view
|
|
60
|
+
* means telling a scroll utility which box to scroll, and the scrolling box
|
|
61
|
+
* here is inside a shadow root: a consumer holding a reference to this
|
|
62
|
+
* element holds the host, which does not scroll, and `scrollBy` on it is a
|
|
63
|
+
* no-op that reports nothing. That is exactly how `scrollItemIntoView`'s
|
|
64
|
+
* `offsetParent` default fails, and the sandbox sidebar spent an afternoon
|
|
65
|
+
* scrolled to zero because of it.
|
|
66
|
+
*
|
|
67
|
+
* The element rather than a method of our own, because the utilities that
|
|
68
|
+
* want it already take one, and `Tree`, `Combobox` and anything windowing a
|
|
69
|
+
* long list all want the same thing from it.
|
|
70
|
+
*/
|
|
71
|
+
get scroller(): HTMLElement | null;
|
|
72
|
+
/**
|
|
73
|
+
* Reads the four edges off the box.
|
|
74
|
+
*
|
|
75
|
+
* A pixel of slack on each, because a scroller at its end is routinely a
|
|
76
|
+
* fraction short of it: browsers round scroll positions differently under
|
|
77
|
+
* zoom and on a display that is not at one to one, and a fade that never
|
|
78
|
+
* quite goes out at the bottom of a fully scrolled list is the bug that
|
|
79
|
+
* costs.
|
|
80
|
+
*/
|
|
81
|
+
private measure;
|
|
82
|
+
connectedCallback(): void;
|
|
83
|
+
disconnectedCallback(): void;
|
|
84
|
+
protected firstUpdated(changed: PropertyValues): void;
|
|
85
|
+
/** Registers the box and everything slotted into it, which is what resizes. */
|
|
86
|
+
private watchContent;
|
|
87
|
+
protected updated(changed: PropertyValues): void;
|
|
88
|
+
private readonly handleSlotChange;
|
|
89
|
+
protected render(): TemplateResult;
|
|
90
|
+
}
|
|
91
|
+
declare global {
|
|
92
|
+
interface HTMLElementTagNameMap {
|
|
93
|
+
'helix-headless-scroll-area': HelixHeadlessScrollArea;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export { EDGES };
|