@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,233 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { customElement, HelixElement } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html, nothing, svg } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
import { encode } from 'uqr';
|
|
11
|
+
/** Whether a module is one of the three finder squares, or their separators. */
|
|
12
|
+
const isFinder = (x, y, size) => {
|
|
13
|
+
const near = (a, b) => a < 8 && b < 8;
|
|
14
|
+
return near(x, y) || near(size - 1 - x, y) || near(x, size - 1 - y);
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The dark modules of a matrix, as one path.
|
|
18
|
+
*
|
|
19
|
+
* One `<path>` rather than a rect per module. A modest code is 33 by 33, so a
|
|
20
|
+
* rect apiece is a thousand elements the browser lays out and the accessibility
|
|
21
|
+
* tree walks, and every one of them is a one-unit square.
|
|
22
|
+
*
|
|
23
|
+
* **`square` joins runs and the other styles cannot.** A row of eight square
|
|
24
|
+
* modules is one `h8`, which is what keeps the node count down; a row of eight
|
|
25
|
+
* *rounded* ones is eight shapes, because the corners are what is being drawn
|
|
26
|
+
* and a joined run has no corners in the middle of it. So the cost of the other
|
|
27
|
+
* styles is real and is paid only by the codes that ask for them.
|
|
28
|
+
*
|
|
29
|
+
* `only` splits the drawing in two without walking the matrix twice: the finder
|
|
30
|
+
* squares are structural, at three known corners, so a caller can ask for them
|
|
31
|
+
* alone and get a second path to paint differently.
|
|
32
|
+
*/
|
|
33
|
+
const pathFor = (matrix, style, only = 'all') => {
|
|
34
|
+
const size = matrix.length;
|
|
35
|
+
const wanted = (x, y) => {
|
|
36
|
+
if (!matrix[y]?.[x]) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (only === 'all') {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return only === 'finders' ? isFinder(x, y, size) : !isFinder(x, y, size);
|
|
43
|
+
};
|
|
44
|
+
const parts = [];
|
|
45
|
+
if (style === 'square') {
|
|
46
|
+
for (let y = 0; y < size; y += 1) {
|
|
47
|
+
let run = 0;
|
|
48
|
+
for (let x = 0; x <= size; x += 1) {
|
|
49
|
+
if (wanted(x, y)) {
|
|
50
|
+
run += 1;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (run > 0) {
|
|
54
|
+
parts.push(`M${x - run} ${y}h${run}v1h-${run}z`);
|
|
55
|
+
run = 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return parts.join('');
|
|
60
|
+
}
|
|
61
|
+
/* A circle for `dots` and a squircle for `rounded`, both drawn as arcs on a
|
|
62
|
+
one-unit square. The radius is a little under half so neighbouring dots do
|
|
63
|
+
not touch, which is what makes a dotted code read as dots rather than as a
|
|
64
|
+
square one with soft edges. */
|
|
65
|
+
const r = style === 'dots' ? 0.45 : 0.28;
|
|
66
|
+
for (let y = 0; y < size; y += 1) {
|
|
67
|
+
for (let x = 0; x < size; x += 1) {
|
|
68
|
+
if (!wanted(x, y)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (style === 'dots') {
|
|
72
|
+
parts.push(`M${x + 0.5 - r} ${y + 0.5}a${r} ${r} 0 1 0 ${r * 2} 0a${r} ${r} 0 1 0 ${-r * 2} 0z`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
parts.push(`M${x + r} ${y}h${1 - r * 2}a${r} ${r} 0 0 1 ${r} ${r}` +
|
|
76
|
+
`v${1 - r * 2}a${r} ${r} 0 0 1 ${-r} ${r}` +
|
|
77
|
+
`h${-(1 - r * 2)}a${r} ${r} 0 0 1 ${-r} ${-r}` +
|
|
78
|
+
`v${-(1 - r * 2)}a${r} ${r} 0 0 1 ${r} ${-r}z`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return parts.join('');
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* @summary Encodes a short piece of text as a scannable square.
|
|
86
|
+
*
|
|
87
|
+
* @description
|
|
88
|
+
* **The picture is one `<path>`, not a grid of squares.** A code of any useful
|
|
89
|
+
* length is a thousand modules, and drawing each as its own rect is a thousand
|
|
90
|
+
* nodes for one image. Runs of adjacent dark modules are joined, so a row of
|
|
91
|
+
* eight is one horizontal move rather than eight squares.
|
|
92
|
+
*
|
|
93
|
+
* **It is an image and says so.** `role="img"` with a name, because what a
|
|
94
|
+
* reader with a screen reader needs is what the code is *for*, and no amount of
|
|
95
|
+
* describing the pattern gives them that. Where nothing is passed the value
|
|
96
|
+
* itself is the name, which is right far more often than it looks: most codes
|
|
97
|
+
* hold a URL, and a URL read aloud is the destination.
|
|
98
|
+
*
|
|
99
|
+
* **The quiet zone is part of the code.** Four modules of margin are required
|
|
100
|
+
* by the specification, not a design choice, and a scanner will refuse a code
|
|
101
|
+
* that is cropped to its edge. It is drawn inside the `viewBox` so it survives
|
|
102
|
+
* any size the component is given, including one set in CSS.
|
|
103
|
+
*
|
|
104
|
+
* `correction` is what buys the middle slot. A code at `H` can lose thirty
|
|
105
|
+
* percent of itself and still read, which is what makes covering the center
|
|
106
|
+
* with a mark safe; at `L` the same mark makes the code unscannable. That is
|
|
107
|
+
* why the slot exists on the same element as the property, and why the default
|
|
108
|
+
* moves when the slot is filled.
|
|
109
|
+
*
|
|
110
|
+
* @since 0.1.0
|
|
111
|
+
* @status stable
|
|
112
|
+
* @category media
|
|
113
|
+
* @aliases QR, Barcode, Scan code
|
|
114
|
+
* @documentation https://helix.fusion.dev/components/qr-code
|
|
115
|
+
*
|
|
116
|
+
* @slot logo - A mark for the center, which only reads at a high correction.
|
|
117
|
+
*
|
|
118
|
+
* @csspart code - The square itself.
|
|
119
|
+
* @csspart finders - The three corner squares, which can take their own color.
|
|
120
|
+
* @csspart logo - The box holding the center mark.
|
|
121
|
+
* @csspart modules - Everything but the three corner squares.
|
|
122
|
+
*/
|
|
123
|
+
let HelixHeadlessQrCode = class HelixHeadlessQrCode extends HelixElement {
|
|
124
|
+
constructor() {
|
|
125
|
+
super(...arguments);
|
|
126
|
+
/**
|
|
127
|
+
* What the code encodes, which is usually a URL.
|
|
128
|
+
*/
|
|
129
|
+
this.value = '';
|
|
130
|
+
/**
|
|
131
|
+
* What the image is called.
|
|
132
|
+
*
|
|
133
|
+
* Falling back to the value is deliberate: a code almost always holds a URL,
|
|
134
|
+
* and a URL is a better name than "QR code" for a reader who cannot see it.
|
|
135
|
+
*/
|
|
136
|
+
this.label = '';
|
|
137
|
+
/**
|
|
138
|
+
* How the modules are drawn.
|
|
139
|
+
*
|
|
140
|
+
* `square` is the default and the only one that joins runs of adjacent
|
|
141
|
+
* modules into a single subpath, which is what keeps a thousand modules to a
|
|
142
|
+
* handful of nodes. `rounded` and `dots` draw each module on its own, because
|
|
143
|
+
* the corners are the thing being drawn and a joined run has none in the
|
|
144
|
+
* middle. That cost is paid only by a code that asks for them.
|
|
145
|
+
*
|
|
146
|
+
* A scanner reads contrast between cells, not their shape, so all three
|
|
147
|
+
* scan. `dots` sits a little under half a module so neighbours do not touch,
|
|
148
|
+
* which is what makes it read as dots rather than as a softened square code.
|
|
149
|
+
*/
|
|
150
|
+
this.shape = 'square';
|
|
151
|
+
/** Whether anything is slotted into the middle. */
|
|
152
|
+
this.logo = false;
|
|
153
|
+
}
|
|
154
|
+
/** The level actually used, which the slot can raise. */
|
|
155
|
+
get level() {
|
|
156
|
+
return this.correction ?? (this.logo ? 'H' : 'M');
|
|
157
|
+
}
|
|
158
|
+
renderCode() {
|
|
159
|
+
if (this.value === '') {
|
|
160
|
+
return nothing;
|
|
161
|
+
}
|
|
162
|
+
/* Regenerated on every render rather than cached. It is a pure function of
|
|
163
|
+
two properties, Lit only renders when one of them moved, and a cache here
|
|
164
|
+
would be a second place for them to disagree. */
|
|
165
|
+
const result = encode(this.value, { border: 0, ecc: this.level });
|
|
166
|
+
const size = result.size;
|
|
167
|
+
/* The quiet zone, in the `viewBox` rather than in a wrapper's padding. Four
|
|
168
|
+
modules is what the specification requires and what a scanner looks for,
|
|
169
|
+
so it has to scale with the code and not with whatever box the component
|
|
170
|
+
was given. */
|
|
171
|
+
const quiet = 4;
|
|
172
|
+
const box = size + quiet * 2;
|
|
173
|
+
/* The three corner squares as their own path, so they can take their own
|
|
174
|
+
color. Their positions are structural rather than guessed: seven by
|
|
175
|
+
seven at each of three corners, plus the separator ring, which is what
|
|
176
|
+
`isFinder` describes. Drawn square whatever the body's style is, because
|
|
177
|
+
they are what a scanner locks onto first and rounding them costs
|
|
178
|
+
reliability for decoration. */
|
|
179
|
+
const finders = pathFor(result.data, 'square', 'finders');
|
|
180
|
+
return svg `<svg
|
|
181
|
+
part="code"
|
|
182
|
+
viewBox="0 0 ${box} ${box}"
|
|
183
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
184
|
+
role="img"
|
|
185
|
+
aria-label=${this.label || this.value}
|
|
186
|
+
shape-rendering="crispEdges"
|
|
187
|
+
>
|
|
188
|
+
<path
|
|
189
|
+
part="modules"
|
|
190
|
+
d=${pathFor(result.data, this.shape, 'body')}
|
|
191
|
+
transform="translate(${quiet} ${quiet})"
|
|
192
|
+
fill="currentColor"
|
|
193
|
+
/>
|
|
194
|
+
<path
|
|
195
|
+
part="finders"
|
|
196
|
+
d=${finders}
|
|
197
|
+
transform="translate(${quiet} ${quiet})"
|
|
198
|
+
fill="currentColor"
|
|
199
|
+
/>
|
|
200
|
+
</svg>`;
|
|
201
|
+
}
|
|
202
|
+
render() {
|
|
203
|
+
return html `${this.renderCode()}
|
|
204
|
+
<span ?hidden=${!this.logo} part="logo">
|
|
205
|
+
<slot
|
|
206
|
+
name="logo"
|
|
207
|
+
@slotchange=${(event) => {
|
|
208
|
+
const next = event.target.assignedNodes().length > 0;
|
|
209
|
+
if (next !== this.logo) {
|
|
210
|
+
this.logo = next;
|
|
211
|
+
this.requestUpdate();
|
|
212
|
+
}
|
|
213
|
+
}}
|
|
214
|
+
></slot>
|
|
215
|
+
</span>`;
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
__decorate([
|
|
219
|
+
property()
|
|
220
|
+
], HelixHeadlessQrCode.prototype, "value", void 0);
|
|
221
|
+
__decorate([
|
|
222
|
+
property()
|
|
223
|
+
], HelixHeadlessQrCode.prototype, "label", void 0);
|
|
224
|
+
__decorate([
|
|
225
|
+
property()
|
|
226
|
+
], HelixHeadlessQrCode.prototype, "shape", void 0);
|
|
227
|
+
__decorate([
|
|
228
|
+
property({ attribute: 'correction' })
|
|
229
|
+
], HelixHeadlessQrCode.prototype, "correction", void 0);
|
|
230
|
+
HelixHeadlessQrCode = __decorate([
|
|
231
|
+
customElement('helix-headless-qr-code')
|
|
232
|
+
], HelixHeadlessQrCode);
|
|
233
|
+
export { HelixHeadlessQrCode };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/quote-root.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/quote-root.js';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type TemplateResult } from 'lit';
|
|
3
|
+
/**
|
|
4
|
+
* @summary A short quotation, set inline with the text around it.
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
* Renders a real `<q>`, which is what supplies the quotation marks: the browser
|
|
8
|
+
* inserts the right ones for the document's language, and nests them correctly
|
|
9
|
+
* when one quotation sits inside another. Typing the marks into the content
|
|
10
|
+
* instead gets both of those wrong in every language but one.
|
|
11
|
+
*
|
|
12
|
+
* A passage set off from the prose rather than run inside it is a blockquote,
|
|
13
|
+
* which is a different element for a different job.
|
|
14
|
+
*
|
|
15
|
+
* @since 0.1.0
|
|
16
|
+
* @status stable
|
|
17
|
+
* @category typography
|
|
18
|
+
* @aliases Q, InlineQuote
|
|
19
|
+
* @documentation https://helix.fusion.dev/components/quote
|
|
20
|
+
*
|
|
21
|
+
* @slot - The quoted text.
|
|
22
|
+
*
|
|
23
|
+
* @csspart quote - The quotation.
|
|
24
|
+
*/
|
|
25
|
+
export declare class HelixHeadlessQuote extends HelixElement {
|
|
26
|
+
/**
|
|
27
|
+
* URL identifying where the quotation came from.
|
|
28
|
+
*/
|
|
29
|
+
cite: string;
|
|
30
|
+
protected render(): TemplateResult;
|
|
31
|
+
}
|
|
32
|
+
declare global {
|
|
33
|
+
interface HTMLElementTagNameMap {
|
|
34
|
+
'helix-headless-quote': HelixHeadlessQuote;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { customElement, HelixElement } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html, nothing } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
/**
|
|
11
|
+
* @summary A short quotation, set inline with the text around it.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* Renders a real `<q>`, which is what supplies the quotation marks: the browser
|
|
15
|
+
* inserts the right ones for the document's language, and nests them correctly
|
|
16
|
+
* when one quotation sits inside another. Typing the marks into the content
|
|
17
|
+
* instead gets both of those wrong in every language but one.
|
|
18
|
+
*
|
|
19
|
+
* A passage set off from the prose rather than run inside it is a blockquote,
|
|
20
|
+
* which is a different element for a different job.
|
|
21
|
+
*
|
|
22
|
+
* @since 0.1.0
|
|
23
|
+
* @status stable
|
|
24
|
+
* @category typography
|
|
25
|
+
* @aliases Q, InlineQuote
|
|
26
|
+
* @documentation https://helix.fusion.dev/components/quote
|
|
27
|
+
*
|
|
28
|
+
* @slot - The quoted text.
|
|
29
|
+
*
|
|
30
|
+
* @csspart quote - The quotation.
|
|
31
|
+
*/
|
|
32
|
+
let HelixHeadlessQuote = class HelixHeadlessQuote extends HelixElement {
|
|
33
|
+
constructor() {
|
|
34
|
+
super(...arguments);
|
|
35
|
+
/**
|
|
36
|
+
* URL identifying where the quotation came from.
|
|
37
|
+
*/
|
|
38
|
+
this.cite = '';
|
|
39
|
+
}
|
|
40
|
+
render() {
|
|
41
|
+
return html `<q part="quote" cite=${this.cite || nothing}><slot></slot></q>`;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
__decorate([
|
|
45
|
+
property()
|
|
46
|
+
], HelixHeadlessQuote.prototype, "cite", void 0);
|
|
47
|
+
HelixHeadlessQuote = __decorate([
|
|
48
|
+
customElement('helix-headless-quote')
|
|
49
|
+
], HelixHeadlessQuote);
|
|
50
|
+
export { HelixHeadlessQuote };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { DisabledCascadeController, HelixFormElement, KeyboardNavigationController } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
import { HelixHeadlessRadio } from '../root/radio-root.js';
|
|
4
|
+
declare const HelixHeadlessRadioGroup_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerValueInterface) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinFieldInterface) & typeof HelixFormElement;
|
|
5
|
+
/**
|
|
6
|
+
* @summary A set of choices where exactly one is the answer.
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* **The group is the control, and the radios are its options.** This is the
|
|
10
|
+
* asymmetry with checkboxes and it comes from what a form submits: a set of
|
|
11
|
+
* checkboxes is several answers and each box submits its own, while a set of
|
|
12
|
+
* radios is one answer, so the group owns the `name`, the `value` and the
|
|
13
|
+
* validity, and a lone radio outside a group is not a control at all.
|
|
14
|
+
*
|
|
15
|
+
* Which is also why `MixinField` lands here and not on `Radio`: the label, the
|
|
16
|
+
* hint and the message are about the question, and the question is the set.
|
|
17
|
+
*
|
|
18
|
+
* Selection travels up and state travels down. An item announces that it was
|
|
19
|
+
* chosen, the group decides whether that stands, and the group writes
|
|
20
|
+
* `selected` onto every item. Nothing sets itself, so there is one answer to
|
|
21
|
+
* "which one is on" rather than one per item.
|
|
22
|
+
*
|
|
23
|
+
* `value` and `defaultValue` are separate for the reason `checked` and
|
|
24
|
+
* `defaultChecked` are: `value` is the answer now, `defaultValue` is what the
|
|
25
|
+
* markup asked for, which is where a reset returns and is gone the moment
|
|
26
|
+
* anything is chosen.
|
|
27
|
+
*
|
|
28
|
+
* @since 0.1.0
|
|
29
|
+
* @status experimental
|
|
30
|
+
* @aliases RadioButtons, Choice group
|
|
31
|
+
* @documentation https://helix.fusion.dev/components/radio-group
|
|
32
|
+
*
|
|
33
|
+
* @slot - The radios.
|
|
34
|
+
* @slot hint - Richer than a string.
|
|
35
|
+
* @slot label - Richer than a string, where the question is more than one.
|
|
36
|
+
*
|
|
37
|
+
* @event {Event} change - Announced once the value has moved.
|
|
38
|
+
* @event {HelixBeforeChangeEvent} helix-before-change - Fired when the answer changes, and cancelable.
|
|
39
|
+
* @event {Event} input - Announced once the value has moved.
|
|
40
|
+
*
|
|
41
|
+
* @csspart feedback - What is wrong with it.
|
|
42
|
+
* @csspart hint - Help under the set.
|
|
43
|
+
* @csspart items - The choices, which is what `orientation` lays out.
|
|
44
|
+
* @csspart label - The question, over the set.
|
|
45
|
+
*/
|
|
46
|
+
export declare class HelixHeadlessRadioGroup extends HelixHeadlessRadioGroup_base {
|
|
47
|
+
/**
|
|
48
|
+
* Which way the choices run. A column reads one line per answer.
|
|
49
|
+
*
|
|
50
|
+
* **Optional rather than defaulted, which is not a style preference.** A
|
|
51
|
+
* reflecting property with a default writes its attribute onto every host the
|
|
52
|
+
* moment the element upgrades, including the ones a consumer rendered and did
|
|
53
|
+
* not touch, and React reads that as a hydration mismatch. The absent
|
|
54
|
+
* attribute *is* the column, which the stylesheet reads as the base rule, so
|
|
55
|
+
* only `horizontal` has to be named.
|
|
56
|
+
*/
|
|
57
|
+
orientation?: 'horizontal' | 'vertical';
|
|
58
|
+
protected readonly keys: KeyboardNavigationController;
|
|
59
|
+
protected readonly cascade: DisabledCascadeController;
|
|
60
|
+
/** The radios, in light-DOM order. Client only: the server has no tree. */
|
|
61
|
+
get items(): HelixHeadlessRadio[];
|
|
62
|
+
/**
|
|
63
|
+
* Announces before it applies, so a listener can refuse the change.
|
|
64
|
+
*
|
|
65
|
+
* The item has not moved by the time this runs, unlike a native input, so
|
|
66
|
+
* refusing is simply not writing the value: there is nothing to put back.
|
|
67
|
+
*/
|
|
68
|
+
private readonly handleSelection;
|
|
69
|
+
/** Writes the answer onto the items, and nothing onto the host. */
|
|
70
|
+
private place;
|
|
71
|
+
/** Reports the answer and the verdict on it. */
|
|
72
|
+
private sync;
|
|
73
|
+
connectedCallback(): void;
|
|
74
|
+
disconnectedCallback(): void;
|
|
75
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
76
|
+
protected updated(changed: PropertyValues): void;
|
|
77
|
+
protected render(): TemplateResult;
|
|
78
|
+
}
|
|
79
|
+
declare global {
|
|
80
|
+
interface HTMLElementTagNameMap {
|
|
81
|
+
'helix-headless-radio-group': HelixHeadlessRadioGroup;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export {};
|
|
@@ -0,0 +1,170 @@
|
|
|
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, DisabledCascadeController, HelixFormElement, hostAria, KeyboardNavigationController, MixinControllerValue, MixinField, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
import { HelixHeadlessRadio } from '../root/radio-root.js';
|
|
11
|
+
/**
|
|
12
|
+
* @summary A set of choices where exactly one is the answer.
|
|
13
|
+
*
|
|
14
|
+
* @description
|
|
15
|
+
* **The group is the control, and the radios are its options.** This is the
|
|
16
|
+
* asymmetry with checkboxes and it comes from what a form submits: a set of
|
|
17
|
+
* checkboxes is several answers and each box submits its own, while a set of
|
|
18
|
+
* radios is one answer, so the group owns the `name`, the `value` and the
|
|
19
|
+
* validity, and a lone radio outside a group is not a control at all.
|
|
20
|
+
*
|
|
21
|
+
* Which is also why `MixinField` lands here and not on `Radio`: the label, the
|
|
22
|
+
* hint and the message are about the question, and the question is the set.
|
|
23
|
+
*
|
|
24
|
+
* Selection travels up and state travels down. An item announces that it was
|
|
25
|
+
* chosen, the group decides whether that stands, and the group writes
|
|
26
|
+
* `selected` onto every item. Nothing sets itself, so there is one answer to
|
|
27
|
+
* "which one is on" rather than one per item.
|
|
28
|
+
*
|
|
29
|
+
* `value` and `defaultValue` are separate for the reason `checked` and
|
|
30
|
+
* `defaultChecked` are: `value` is the answer now, `defaultValue` is what the
|
|
31
|
+
* markup asked for, which is where a reset returns and is gone the moment
|
|
32
|
+
* anything is chosen.
|
|
33
|
+
*
|
|
34
|
+
* @since 0.1.0
|
|
35
|
+
* @status experimental
|
|
36
|
+
* @aliases RadioButtons, Choice group
|
|
37
|
+
* @documentation https://helix.fusion.dev/components/radio-group
|
|
38
|
+
*
|
|
39
|
+
* @slot - The radios.
|
|
40
|
+
* @slot hint - Richer than a string.
|
|
41
|
+
* @slot label - Richer than a string, where the question is more than one.
|
|
42
|
+
*
|
|
43
|
+
* @event {Event} change - Announced once the value has moved.
|
|
44
|
+
* @event {HelixBeforeChangeEvent} helix-before-change - Fired when the answer changes, and cancelable.
|
|
45
|
+
* @event {Event} input - Announced once the value has moved.
|
|
46
|
+
*
|
|
47
|
+
* @csspart feedback - What is wrong with it.
|
|
48
|
+
* @csspart hint - Help under the set.
|
|
49
|
+
* @csspart items - The choices, which is what `orientation` lays out.
|
|
50
|
+
* @csspart label - The question, over the set.
|
|
51
|
+
*/
|
|
52
|
+
let HelixHeadlessRadioGroup = class HelixHeadlessRadioGroup extends MixinControllerValue(MixinField(HelixFormElement)) {
|
|
53
|
+
constructor() {
|
|
54
|
+
super(...arguments);
|
|
55
|
+
/* Moving and choosing are one act, which is the radio group pattern and is
|
|
56
|
+
what this controller exists to stop being written per component. */
|
|
57
|
+
/* Registered rather than held. A controller adds itself to the host, so there
|
|
58
|
+
is no reference to keep: nothing here talks to it after construction, which
|
|
59
|
+
is why it is `protected` and not `private`. A private field nothing reads
|
|
60
|
+
is an unused one, and the honest reading is that the subclass tier is where
|
|
61
|
+
a consumer would reach for it. */
|
|
62
|
+
this.keys = new KeyboardNavigationController(this, { items: () => this.items });
|
|
63
|
+
/* Stated once, and the group never thinks about it again. See the
|
|
64
|
+
controller: the cascade was four hand calls from four different
|
|
65
|
+
methods, so which paths reached it differed by component and a fifth
|
|
66
|
+
group would have got none at all. */
|
|
67
|
+
this.cascade = new DisabledCascadeController(this, {
|
|
68
|
+
items: () => this.items,
|
|
69
|
+
});
|
|
70
|
+
/**
|
|
71
|
+
* Announces before it applies, so a listener can refuse the change.
|
|
72
|
+
*
|
|
73
|
+
* The item has not moved by the time this runs, unlike a native input, so
|
|
74
|
+
* refusing is simply not writing the value: there is nothing to put back.
|
|
75
|
+
*/
|
|
76
|
+
this.handleSelection = (event) => {
|
|
77
|
+
event.stopPropagation();
|
|
78
|
+
const next = event.detail.value;
|
|
79
|
+
if (next === this.value) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
this.requestValue(next);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** The radios, in light-DOM order. Client only: the server has no tree. */
|
|
86
|
+
get items() {
|
|
87
|
+
return [...this.children].filter((child) => child instanceof HelixHeadlessRadio);
|
|
88
|
+
}
|
|
89
|
+
/** Writes the answer onto the items, and nothing onto the host. */
|
|
90
|
+
place() {
|
|
91
|
+
const items = this.items;
|
|
92
|
+
for (const item of items) {
|
|
93
|
+
item.selected = item.value === this.value;
|
|
94
|
+
}
|
|
95
|
+
/* Nothing chosen yet, so the first item is the tab stop. A group where
|
|
96
|
+
every item is `tabindex="-1"` is a group the keyboard cannot enter.
|
|
97
|
+
*
|
|
98
|
+
* Taken back the moment there is an answer, which it was not: the attribute
|
|
99
|
+
* was written on the first item and never removed, so an answered group
|
|
100
|
+
* carried two tab stops, the entry one and the selected item's own. Tabbing
|
|
101
|
+
* through a form stopped twice on one question, and the first stop was on an
|
|
102
|
+
* item that is not the answer.
|
|
103
|
+
*
|
|
104
|
+
* `entered` rather than a bare toggle, because this also runs when the
|
|
105
|
+
* group is answered and the attribute has to go whether or not this call is
|
|
106
|
+
* the one that put it there. */
|
|
107
|
+
const entered = this.value === '' && items.length > 0 ? items[0] : undefined;
|
|
108
|
+
for (const item of items) {
|
|
109
|
+
if (item === entered) {
|
|
110
|
+
item.setAttribute('tabindex', '0');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
item.removeAttribute('tabindex');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Reports the answer and the verdict on it. */
|
|
118
|
+
sync() {
|
|
119
|
+
this.internals.setFormValue(this.value === '' ? null : this.value);
|
|
120
|
+
this.reportRequired(this.value === '', 'Choose one to continue.', 'items');
|
|
121
|
+
}
|
|
122
|
+
connectedCallback() {
|
|
123
|
+
super.connectedCallback();
|
|
124
|
+
this.addEventListener('helix-select', this.handleSelection);
|
|
125
|
+
}
|
|
126
|
+
disconnectedCallback() {
|
|
127
|
+
super.disconnectedCallback();
|
|
128
|
+
this.removeEventListener('helix-select', this.handleSelection);
|
|
129
|
+
}
|
|
130
|
+
willUpdate(changed) {
|
|
131
|
+
super.willUpdate(changed);
|
|
132
|
+
// Through internals, so nothing lands on the host as an attribute a React
|
|
133
|
+
// consumer's server markup never had.
|
|
134
|
+
/* The string half, which is what a server can write. `linkHost` adds the
|
|
135
|
+
element references on the client, and those win where a consumer slotted
|
|
136
|
+
a label richer than a string. */
|
|
137
|
+
hostAria(this.internals, { label: this.label, role: 'radiogroup' });
|
|
138
|
+
/* Announced as required, which it never was.
|
|
139
|
+
*
|
|
140
|
+
* `required` reflects, sets validity and paints the asterisk the field sheet
|
|
141
|
+
* draws, and told the accessibility tree nothing: a reader met a group with
|
|
142
|
+
* a mark beside its label they could not see and no announcement of why the
|
|
143
|
+
* form would refuse it. The stylesheet drawing that asterisk depends on the
|
|
144
|
+
* control saying so. */
|
|
145
|
+
this.internals.ariaRequired = this.required ? 'true' : null;
|
|
146
|
+
}
|
|
147
|
+
updated(changed) {
|
|
148
|
+
super.updated(changed);
|
|
149
|
+
this.place();
|
|
150
|
+
this.sync();
|
|
151
|
+
this.linkHost();
|
|
152
|
+
}
|
|
153
|
+
render() {
|
|
154
|
+
/* The choices sit in an element of their own, because `orientation` lays
|
|
155
|
+
out whatever is in the flex container and on the host that would be the
|
|
156
|
+
label and the hint as well. */
|
|
157
|
+
return html `${this.renderGroupLabel()}
|
|
158
|
+
<div part="items">
|
|
159
|
+
<slot @slotchange=${() => this.place()}></slot>
|
|
160
|
+
</div>
|
|
161
|
+
${this.renderHint()}${this.renderFeedback()}`;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
__decorate([
|
|
165
|
+
property({ reflect: true })
|
|
166
|
+
], HelixHeadlessRadioGroup.prototype, "orientation", void 0);
|
|
167
|
+
HelixHeadlessRadioGroup = __decorate([
|
|
168
|
+
customElement('helix-headless-radio-group')
|
|
169
|
+
], HelixHeadlessRadioGroup);
|
|
170
|
+
export { HelixHeadlessRadioGroup };
|