@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,472 @@
|
|
|
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 { AriaForwardController, customElement, drawIcon, HelixFormElement, holdCaret, MixinControllerValue, MixinField, restoreValue, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { eye, eyeSlash, x } from '@fusion.dev/helix-icons';
|
|
9
|
+
import { html, nothing } from 'lit';
|
|
10
|
+
import { property, state } from 'lit/decorators.js';
|
|
11
|
+
/**
|
|
12
|
+
* @summary A single line of text a reader types into.
|
|
13
|
+
*
|
|
14
|
+
* @description
|
|
15
|
+
* Renders a real `<input>`, so the caret, selection, autofill, spellcheck, the
|
|
16
|
+
* password manager, and the on-screen keyboard a phone chooses all come from the
|
|
17
|
+
* platform. `delegatesFocus` puts focus on it, and it serializes into the
|
|
18
|
+
* server's markup, so the field is usable before any script loads.
|
|
19
|
+
*
|
|
20
|
+
* **The input inside a shadow root submits nothing**, because the form is on the
|
|
21
|
+
* other side of the boundary. The host is form-associated instead and reports
|
|
22
|
+
* its own value through `ElementInternals`, which is also what carries validity
|
|
23
|
+
* and what answers a form reset.
|
|
24
|
+
*
|
|
25
|
+
* `value` and `defaultValue` are separate for the reason `checked` and
|
|
26
|
+
* `defaultChecked` are: `value` is what is in the field now and
|
|
27
|
+
* `defaultValue` is what the markup asked for, which is where a reset returns
|
|
28
|
+
* to and is gone the moment anyone types.
|
|
29
|
+
*
|
|
30
|
+
* **Validity is the platform's.** The `type` and `required` are set on the real
|
|
31
|
+
* input and its `validity` is copied onto the host, so an email field rejects
|
|
32
|
+
* what the browser says is not an email rather than what a regular expression
|
|
33
|
+
* here guesses. What this adds is the anchor, so `reportValidity` points the
|
|
34
|
+
* bubble at the input rather than at the host.
|
|
35
|
+
*
|
|
36
|
+
* `pattern`, `minlength` and `maxlength` are forwarded with them. They were
|
|
37
|
+
* promised by this paragraph and did not exist, so a consumer following the
|
|
38
|
+
* sentence wrote an attribute on the host that reached no input and constrained
|
|
39
|
+
* nothing: the field looked as though it were checked and was not.
|
|
40
|
+
*
|
|
41
|
+
* **`clearable` and `reveal` are the field's, not the consumer's.** The `end`
|
|
42
|
+
* slot used to be the answer to both, which meant every consumer of
|
|
43
|
+
* `type="search"` built the same button and every consumer of
|
|
44
|
+
* `type="password"` either built the same toggle or shipped a field a reader
|
|
45
|
+
* cannot check what they typed into. Neither is a slot's worth of variation:
|
|
46
|
+
* one empties the value, the other flips the type, and both want the same
|
|
47
|
+
* position, the same size and the same disabled behavior. The slot stays for
|
|
48
|
+
* what actually varies, a unit or a prefix.
|
|
49
|
+
*
|
|
50
|
+
* Both opt in rather than following from `type`, and are booleans that default
|
|
51
|
+
* to false. A Lit boolean property that defaults to *true* cannot be turned off
|
|
52
|
+
* from HTML at all, only from script, which is the wrong way round for
|
|
53
|
+
* revealing a password: a consumer should have to ask for it. Drawer's `modal`
|
|
54
|
+
* defaults true for the opposite reason, that losing a focus trap by forgetting
|
|
55
|
+
* a word is worse than having to say so.
|
|
56
|
+
*
|
|
57
|
+
* @since 0.1.0
|
|
58
|
+
* @status experimental
|
|
59
|
+
* @category forms
|
|
60
|
+
* @aliases TextField, Field, TextInput
|
|
61
|
+
* @documentation https://helix.fusion.dev/components/input
|
|
62
|
+
*
|
|
63
|
+
* @slot end - After the text, for an icon or a unit.
|
|
64
|
+
* @slot start - Before the text, for an icon or a prefix.
|
|
65
|
+
*
|
|
66
|
+
* @event {Event} change - Relayed from the input once the reader has finished.
|
|
67
|
+
* @event {HelixBeforeChangeEvent} helix-before-change - Fired as the text changes, and cancelable.
|
|
68
|
+
* @event {Event} input - Announced once the value has moved.
|
|
69
|
+
*
|
|
70
|
+
* @csspart clear - The button that empties the field.
|
|
71
|
+
* @csspart control - The input itself.
|
|
72
|
+
* @csspart feedback - What is wrong with it.
|
|
73
|
+
* @csspart field - The box holding everything.
|
|
74
|
+
* @csspart hint - Help under the field, while nothing is wrong.
|
|
75
|
+
* @csspart icon - A glyph this component draws.
|
|
76
|
+
* @csspart label - The question, over the field.
|
|
77
|
+
* @csspart reveal - The button that shows and hides a password.
|
|
78
|
+
*/
|
|
79
|
+
let HelixHeadlessInput = class HelixHeadlessInput extends MixinControllerValue(MixinField(HelixFormElement)) {
|
|
80
|
+
constructor() {
|
|
81
|
+
super(...arguments);
|
|
82
|
+
/* A consumer's `aria-describedby` names ids in their own tree and the control
|
|
83
|
+
is in this shadow root, so the reference has to be carried down as an
|
|
84
|
+
element rather than copied as an id. See `AriaForwardController`: measured
|
|
85
|
+
in Chrome's own tree, the host held the description and the control the
|
|
86
|
+
reader is actually on was exposed without it. */
|
|
87
|
+
this.aria = new AriaForwardController(this, {
|
|
88
|
+
target: () => this.renderRoot?.querySelector('[part="control"]') ?? null,
|
|
89
|
+
});
|
|
90
|
+
/** Typed or dragged, so every edit is announced. See `announcesInput`. */
|
|
91
|
+
this.announcesInput = true;
|
|
92
|
+
/**
|
|
93
|
+
* What the browser may autofill here, as one of the platform's own tokens.
|
|
94
|
+
*
|
|
95
|
+
* Empty leaves the attribute off, which is the browser's default. Set it to
|
|
96
|
+
* a token like `email` or `bday` to ask for autofill, or to `off` to refuse.
|
|
97
|
+
*/
|
|
98
|
+
this.autocomplete = '';
|
|
99
|
+
/**
|
|
100
|
+
* Shown while the field is empty.
|
|
101
|
+
*
|
|
102
|
+
* Not a label: it goes when typing starts.
|
|
103
|
+
*/
|
|
104
|
+
this.placeholder = '';
|
|
105
|
+
/**
|
|
106
|
+
* Whether the field refuses input while still submitting its value.
|
|
107
|
+
*
|
|
108
|
+
* **`readonly`, which is the platform's spelling, and it was `read-only`
|
|
109
|
+
* until 28 Aug 2026.** A camelCase property needs an explicit `attribute`
|
|
110
|
+
* and the library had been answering that question two ways: thirteen
|
|
111
|
+
* attributes kept the name HTML uses (`crossorigin`, `maxlength`,
|
|
112
|
+
* `formnovalidate`, `dirname` and the rest) and five dash-cased a word the
|
|
113
|
+
* platform writes as one. `readonly` was the only one on both lists, this
|
|
114
|
+
* spelling on `Rating` and `read-only` on the eight other fields, so one
|
|
115
|
+
* library shipped both and each was inert on the other's families.
|
|
116
|
+
*
|
|
117
|
+
* The cost of the dash-cased form is the one this repository keeps writing
|
|
118
|
+
* down about attributes: nothing warns. `<helix-input readonly>` is what
|
|
119
|
+
* anybody who has written HTML types, it parsed to no property at all, and
|
|
120
|
+
* the field stayed editable with no error anywhere. Measured before the
|
|
121
|
+
* rename: `readOnly` came back `false`.
|
|
122
|
+
*
|
|
123
|
+
* Taken now for the reason [#213](../../../../../docs/19-queue.md) gives
|
|
124
|
+
* about the part it renamed for the same kind of reason: there is no
|
|
125
|
+
* `helix-v` tag, so no consumer is holding the old spelling, and this is free
|
|
126
|
+
* today and a deprecation after the first release.
|
|
127
|
+
* `check:attribute-names` holds it from here.
|
|
128
|
+
*/
|
|
129
|
+
this.readOnly = false;
|
|
130
|
+
/**
|
|
131
|
+
* What the field accepts, which decides the keyboard and the validation.
|
|
132
|
+
*
|
|
133
|
+
* **Not reflected**, and it was. Reflection exists so a selector can reach a
|
|
134
|
+
* value, and no stylesheet in this repository selects on `type`: what it did
|
|
135
|
+
* instead was write `type="text"` onto every `<helix-input>` ever rendered,
|
|
136
|
+
* an attribute no consumer's markup had. That is precisely the fault `Button`
|
|
137
|
+
* had with `href`, `target` and `rel`, written up in the area rules as the
|
|
138
|
+
* reason the rule exists, and this was the last property in the library still
|
|
139
|
+
* doing it. Audited: ten reflected attributes have no selector anywhere, and
|
|
140
|
+
* this is the only one of them with a value that puts itself on the host.
|
|
141
|
+
*
|
|
142
|
+
* Nothing reads it from the attribute either. The real `<input>` inside takes
|
|
143
|
+
* it as a property binding, which is what makes the keyboard and the
|
|
144
|
+
* validation follow.
|
|
145
|
+
*/
|
|
146
|
+
this.type = 'text';
|
|
147
|
+
/**
|
|
148
|
+
* Whether the field offers a button that empties it.
|
|
149
|
+
*
|
|
150
|
+
* Shown only while there is something to clear, because a control that does
|
|
151
|
+
* nothing is worse than no control: a reader who presses it and sees no
|
|
152
|
+
* change has to work out whether the field was already empty or the button
|
|
153
|
+
* is broken.
|
|
154
|
+
*/
|
|
155
|
+
this.clearable = false;
|
|
156
|
+
/**
|
|
157
|
+
* What the clear button is called, since an icon has no name of its own.
|
|
158
|
+
*/
|
|
159
|
+
this.clearLabel = 'Clear';
|
|
160
|
+
/**
|
|
161
|
+
* Whether a password field offers a toggle that shows what was typed.
|
|
162
|
+
*
|
|
163
|
+
* Ignored on every other type. A reveal on an email field would be a button
|
|
164
|
+
* that does nothing visible, and guarding it here rather than asking the
|
|
165
|
+
* consumer not to means the property can be set once on a component that
|
|
166
|
+
* changes type.
|
|
167
|
+
*/
|
|
168
|
+
this.reveal = false;
|
|
169
|
+
/**
|
|
170
|
+
* What the reveal toggle is called.
|
|
171
|
+
*
|
|
172
|
+
* The state is `aria-pressed`, not this.
|
|
173
|
+
*/
|
|
174
|
+
this.revealLabel = 'Show password';
|
|
175
|
+
/**
|
|
176
|
+
* Whether the password is currently showing.
|
|
177
|
+
*
|
|
178
|
+
* State rather than a property: it is a reader's momentary choice about what
|
|
179
|
+
* is on their own screen, it must not survive anything, and a consumer that
|
|
180
|
+
* could set it could reveal a password without the reader asking.
|
|
181
|
+
*/
|
|
182
|
+
this.revealed = false;
|
|
183
|
+
/**
|
|
184
|
+
* Every keystroke, cancelable, and put back where it is refused.
|
|
185
|
+
*
|
|
186
|
+
* The input has already taken the character by the time this runs, so a
|
|
187
|
+
* consumer that refuses the change has to see the field returned to what the
|
|
188
|
+
* element still holds. Otherwise the text on screen and the value the form
|
|
189
|
+
* would submit disagree, which is the one thing a controlled field must never
|
|
190
|
+
* do.
|
|
191
|
+
*/
|
|
192
|
+
this.handleInput = (event) => {
|
|
193
|
+
/* **Stopped, because the control inside this one is not a control a consumer
|
|
194
|
+
has.** `input` is composed by specification, so the native event from the
|
|
195
|
+
`<input>` in this shadow root crosses the boundary and reaches the host
|
|
196
|
+
beside the one the mixin announces: measured in Chrome 148, one keystroke
|
|
197
|
+
produced `helix-before-change`, this element's own `input`, and the inner
|
|
198
|
+
control's, so `onInput` ran twice and one of the two carried the value
|
|
199
|
+
from before the change. `handleChange` two methods down has always done
|
|
200
|
+
this; the pair was half applied. */
|
|
201
|
+
event.stopPropagation();
|
|
202
|
+
const control = event.target;
|
|
203
|
+
const next = control.value;
|
|
204
|
+
/* Through the mixin, which announces and then applies only if the value is
|
|
205
|
+
the element's to move. The native control has already changed either way,
|
|
206
|
+
so wherever the answer does not follow it has to be put back: that is a
|
|
207
|
+
refusal, and it is equally a consumer who owns the value and has not
|
|
208
|
+
given a new one yet. Both are "what is on screen is not the answer". */
|
|
209
|
+
this.requestValue(next);
|
|
210
|
+
restoreValue(control, this.value);
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Empties the field and gives the caret back.
|
|
214
|
+
*
|
|
215
|
+
* Focus returns to the input rather than staying on the button, which is
|
|
216
|
+
* about to disappear: a reader who cleared a field is going to type in it,
|
|
217
|
+
* and focus resting on a control that is being removed lands on the body.
|
|
218
|
+
*
|
|
219
|
+
* Through `requestValue` like every other change, so a consumer who owns the
|
|
220
|
+
* value hears about it and decides, and a canceled clear leaves the text
|
|
221
|
+
* where it was.
|
|
222
|
+
*/
|
|
223
|
+
this.handleClear = () => {
|
|
224
|
+
this.requestValue('');
|
|
225
|
+
const control = this.control;
|
|
226
|
+
if (control) {
|
|
227
|
+
restoreValue(control, this.value);
|
|
228
|
+
control.focus();
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
/** Relayed, because `change` does not cross a shadow boundary on its own. */
|
|
232
|
+
this.handleChange = (event) => {
|
|
233
|
+
event.stopPropagation();
|
|
234
|
+
this.dispatchEvent(new Event('change', { bubbles: true, composed: false }));
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* A regular expression the value has to match, as the platform reads it.
|
|
238
|
+
*
|
|
239
|
+
* The class documentation promised `pattern` and `minlength` "and the rest"
|
|
240
|
+
* were set on the real input, and no such properties existed: a consumer
|
|
241
|
+
* following that sentence wrote an attribute on the host, it reached no input,
|
|
242
|
+
* and the field constrained nothing while looking as though it did.
|
|
243
|
+
*
|
|
244
|
+
* Forwarded rather than checked here, which is the whole reason validity is
|
|
245
|
+
* the platform's: the browser knows what a `pattern` means, anchors it at both
|
|
246
|
+
* ends, and produces the message in the reader's own language.
|
|
247
|
+
*/
|
|
248
|
+
this.pattern = '';
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* The type the real input is given, which is not always the type asked for.
|
|
252
|
+
*
|
|
253
|
+
* A revealed password is a text field for exactly as long as the reader is
|
|
254
|
+
* looking at it. Reading through a getter rather than mutating `type` keeps
|
|
255
|
+
* the property the consumer's: what they set is what they get back, whatever
|
|
256
|
+
* the button is doing.
|
|
257
|
+
*/
|
|
258
|
+
get effectiveType() {
|
|
259
|
+
return this.revealed && this.type === 'password' ? 'text' : this.type;
|
|
260
|
+
}
|
|
261
|
+
/** Whether there is a clear button on screen right now. */
|
|
262
|
+
get showsClear() {
|
|
263
|
+
return this.clearable && this.value !== '' && !this.isDisabled && !this.readOnly;
|
|
264
|
+
}
|
|
265
|
+
/** Focus is delegated to the input, so the host is never the focus target. */
|
|
266
|
+
static { this.shadowRootOptions = {
|
|
267
|
+
...HelixFormElement.shadowRootOptions,
|
|
268
|
+
delegatesFocus: true,
|
|
269
|
+
}; }
|
|
270
|
+
/**
|
|
271
|
+
* The caret and the selection, under the platform's own names.
|
|
272
|
+
*
|
|
273
|
+
* The `<input>` is inside this shadow root, so a consumer had no way to ask
|
|
274
|
+
* where the selection is, let alone move it: `querySelector` does not cross
|
|
275
|
+
* the boundary. An insert-at-cursor toolbar, a format button, a mask that
|
|
276
|
+
* repositions the caret after rewriting the value, all of them need this and
|
|
277
|
+
* none of them could be written. Textarea gained the same surface for the same
|
|
278
|
+
* reason. See 295.
|
|
279
|
+
*
|
|
280
|
+
* Zero before there is a control, which is where an empty field's caret would
|
|
281
|
+
* be anyway.
|
|
282
|
+
*/
|
|
283
|
+
get selectionDirection() {
|
|
284
|
+
return this.control?.selectionDirection ?? 'none';
|
|
285
|
+
}
|
|
286
|
+
set selectionDirection(direction) {
|
|
287
|
+
const control = this.control;
|
|
288
|
+
if (control) {
|
|
289
|
+
control.selectionDirection = direction;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/** Where the selection ends, as an offset into the value. */
|
|
293
|
+
get selectionEnd() {
|
|
294
|
+
return this.control?.selectionEnd ?? 0;
|
|
295
|
+
}
|
|
296
|
+
set selectionEnd(at) {
|
|
297
|
+
const control = this.control;
|
|
298
|
+
if (control) {
|
|
299
|
+
control.selectionEnd = at;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/** Where the selection starts, as an offset into the value. */
|
|
303
|
+
get selectionStart() {
|
|
304
|
+
return this.control?.selectionStart ?? 0;
|
|
305
|
+
}
|
|
306
|
+
set selectionStart(at) {
|
|
307
|
+
const control = this.control;
|
|
308
|
+
if (control) {
|
|
309
|
+
control.selectionStart = at;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Selects a range, which is the one operation the three accessors above
|
|
314
|
+
* cannot express between them.
|
|
315
|
+
*
|
|
316
|
+
* Setting `selectionStart` past the current `selectionEnd` drags the end
|
|
317
|
+
* along, so the two writes a consumer would make in sequence do not compose
|
|
318
|
+
* into the range they asked for. The platform has this method for that reason
|
|
319
|
+
* and so does this.
|
|
320
|
+
*/
|
|
321
|
+
setSelectionRange(start, end, direction) {
|
|
322
|
+
this.control?.setSelectionRange(start, end, direction);
|
|
323
|
+
}
|
|
324
|
+
get control() {
|
|
325
|
+
return this.renderRoot.querySelector('[part="control"]');
|
|
326
|
+
}
|
|
327
|
+
/** Reports the value and the validity the host stands behind. */
|
|
328
|
+
sync() {
|
|
329
|
+
this.internals.setFormValue(this.value);
|
|
330
|
+
const control = this.control;
|
|
331
|
+
if (!control) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
/* The input's own verdict, copied over rather than recomputed. It knows
|
|
335
|
+
what an email is and what `pattern` means, and it knows it the same way
|
|
336
|
+
the browser will when the form is submitted. The anchor is what this adds:
|
|
337
|
+
without it the validity bubble points at the host, which is a box with no
|
|
338
|
+
text in it. */
|
|
339
|
+
this.internals.setValidity(control.validity, control.validationMessage, control);
|
|
340
|
+
// Straight after, because validity moved without any property moving.
|
|
341
|
+
this.refreshFeedback();
|
|
342
|
+
}
|
|
343
|
+
/** Puts the caret in the field, the way a label pointing at one would. */
|
|
344
|
+
focus(options) {
|
|
345
|
+
this.control?.focus(options);
|
|
346
|
+
}
|
|
347
|
+
/** Selects everything in the field. */
|
|
348
|
+
select() {
|
|
349
|
+
this.control?.select();
|
|
350
|
+
}
|
|
351
|
+
willUpdate(changed) {
|
|
352
|
+
super.willUpdate(changed);
|
|
353
|
+
/* Never before the first update, which is the one the server does: there is
|
|
354
|
+
no render root to query there, and `querySelector` is not merely empty on
|
|
355
|
+
Lit's element shim, it is undefined. There is also no caret to keep before
|
|
356
|
+
anything has rendered. */
|
|
357
|
+
if (!this.hasUpdated) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
const control = this.control;
|
|
361
|
+
if (changed.has('value') && control && this.shadowRoot?.activeElement === control) {
|
|
362
|
+
this.releaseCaret = holdCaret(control);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
updated(changed) {
|
|
366
|
+
super.updated(changed);
|
|
367
|
+
this.releaseCaret?.();
|
|
368
|
+
this.releaseCaret = undefined;
|
|
369
|
+
this.sync();
|
|
370
|
+
}
|
|
371
|
+
render() {
|
|
372
|
+
/* Label, field, and one line under it.
|
|
373
|
+
The hint and the feedback share that line rather than stacking, so a
|
|
374
|
+
field is the same height either way and nothing below it moves when the
|
|
375
|
+
message changes. */
|
|
376
|
+
return html `${this.renderLabel()}
|
|
377
|
+
<div part="field">
|
|
378
|
+
<slot name="start"></slot>
|
|
379
|
+
<input
|
|
380
|
+
part="control"
|
|
381
|
+
id="control"
|
|
382
|
+
.value=${this.value}
|
|
383
|
+
type=${this.effectiveType}
|
|
384
|
+
name=${this.name || nothing}
|
|
385
|
+
placeholder=${this.placeholder || nothing}
|
|
386
|
+
autocomplete=${this.autocomplete || nothing}
|
|
387
|
+
pattern=${this.pattern || nothing}
|
|
388
|
+
minlength=${this.minLength ?? nothing}
|
|
389
|
+
maxlength=${this.maxLength ?? nothing}
|
|
390
|
+
aria-describedby=${this.describedBy ?? nothing}
|
|
391
|
+
?disabled=${this.isDisabled}
|
|
392
|
+
?readonly=${this.readOnly}
|
|
393
|
+
?required=${this.required}
|
|
394
|
+
@input=${this.handleInput}
|
|
395
|
+
@change=${this.handleChange}
|
|
396
|
+
/>
|
|
397
|
+
<slot name="end"></slot>
|
|
398
|
+
<!-- In the tab order, unlike the browser's own search clear, which is not
|
|
399
|
+
reachable by keyboard at all. That is defensible for a native control
|
|
400
|
+
a reader can empty with select-all and Delete, and less so for one
|
|
401
|
+
whose only affordance is an icon: a control that exists on screen and
|
|
402
|
+
cannot be reached is one a keyboard reader is told about and cannot
|
|
403
|
+
use. It only exists while there is a value, so the extra stop appears
|
|
404
|
+
exactly when there is something to do with it. -->
|
|
405
|
+
${this.showsClear
|
|
406
|
+
? html `<button
|
|
407
|
+
part="clear"
|
|
408
|
+
type="button"
|
|
409
|
+
aria-label=${this.clearLabel}
|
|
410
|
+
@click=${this.handleClear}
|
|
411
|
+
>
|
|
412
|
+
${drawIcon(x)}
|
|
413
|
+
</button>`
|
|
414
|
+
: nothing}
|
|
415
|
+
${this.reveal && this.type === 'password'
|
|
416
|
+
? html `<button
|
|
417
|
+
part="reveal"
|
|
418
|
+
type="button"
|
|
419
|
+
aria-label=${this.revealLabel}
|
|
420
|
+
aria-pressed=${this.revealed ? 'true' : 'false'}
|
|
421
|
+
?disabled=${this.isDisabled}
|
|
422
|
+
@click=${() => {
|
|
423
|
+
this.revealed = !this.revealed;
|
|
424
|
+
}}
|
|
425
|
+
>
|
|
426
|
+
${drawIcon(this.revealed ? eyeSlash : eye)}
|
|
427
|
+
</button>`
|
|
428
|
+
: nothing}
|
|
429
|
+
</div>
|
|
430
|
+
${this.renderHint()}${this.renderFeedback()}`;
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
__decorate([
|
|
434
|
+
property()
|
|
435
|
+
], HelixHeadlessInput.prototype, "autocomplete", void 0);
|
|
436
|
+
__decorate([
|
|
437
|
+
property()
|
|
438
|
+
], HelixHeadlessInput.prototype, "placeholder", void 0);
|
|
439
|
+
__decorate([
|
|
440
|
+
property({ attribute: 'readonly', reflect: true, type: Boolean })
|
|
441
|
+
], HelixHeadlessInput.prototype, "readOnly", void 0);
|
|
442
|
+
__decorate([
|
|
443
|
+
property()
|
|
444
|
+
], HelixHeadlessInput.prototype, "type", void 0);
|
|
445
|
+
__decorate([
|
|
446
|
+
property({ type: Boolean })
|
|
447
|
+
], HelixHeadlessInput.prototype, "clearable", void 0);
|
|
448
|
+
__decorate([
|
|
449
|
+
property({ attribute: 'clear-label' })
|
|
450
|
+
], HelixHeadlessInput.prototype, "clearLabel", void 0);
|
|
451
|
+
__decorate([
|
|
452
|
+
property({ type: Boolean })
|
|
453
|
+
], HelixHeadlessInput.prototype, "reveal", void 0);
|
|
454
|
+
__decorate([
|
|
455
|
+
property({ attribute: 'reveal-label' })
|
|
456
|
+
], HelixHeadlessInput.prototype, "revealLabel", void 0);
|
|
457
|
+
__decorate([
|
|
458
|
+
state()
|
|
459
|
+
], HelixHeadlessInput.prototype, "revealed", void 0);
|
|
460
|
+
__decorate([
|
|
461
|
+
property()
|
|
462
|
+
], HelixHeadlessInput.prototype, "pattern", void 0);
|
|
463
|
+
__decorate([
|
|
464
|
+
property({ attribute: 'minlength', type: Number })
|
|
465
|
+
], HelixHeadlessInput.prototype, "minLength", void 0);
|
|
466
|
+
__decorate([
|
|
467
|
+
property({ attribute: 'maxlength', type: Number })
|
|
468
|
+
], HelixHeadlessInput.prototype, "maxLength", void 0);
|
|
469
|
+
HelixHeadlessInput = __decorate([
|
|
470
|
+
customElement('helix-headless-input')
|
|
471
|
+
], HelixHeadlessInput);
|
|
472
|
+
export { HelixHeadlessInput };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/kbd-root.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/kbd-root.js';
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type TemplateResult } from 'lit';
|
|
3
|
+
/**
|
|
4
|
+
* @summary A keyboard key or chord, set inline with text.
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
* Renders a real `<kbd>`, so the passage still means "press this" to anything
|
|
8
|
+
* reading the markup rather than only to a reader looking at it.
|
|
9
|
+
*
|
|
10
|
+
* **One key per element, with `keys` as the stated exception.** A *sequence* is
|
|
11
|
+
* several of these with the separator written between them as ordinary text,
|
|
12
|
+
* because that separator is prose: it is "then" in a sequence and "plus" in a
|
|
13
|
+
* simultaneous press, and a component that inserted one would have to guess
|
|
14
|
+
* which. `keys` cannot be guessing, since a chord written `mod+k` has said
|
|
15
|
+
* which it is.
|
|
16
|
+
*
|
|
17
|
+
* **`keys` exists because the glyphs were being typed by hand and were wrong.**
|
|
18
|
+
* A literal `⌘K` in a template tells a reader on Windows to press a key their
|
|
19
|
+
* keyboard does not have, and nothing catches it, a string being a string.
|
|
20
|
+
* Given `mod` this renders `⌘K` on Apple and `Ctrl+K` everywhere else.
|
|
21
|
+
*
|
|
22
|
+
* **`within` is what binds it, and it is absent by default.** Without it this
|
|
23
|
+
* draws a key and listens for nothing, which is what every existing use of this
|
|
24
|
+
* component wants. The two values are the two honest lifetimes:
|
|
25
|
+
*
|
|
26
|
+
* - `control` listens within the element's own parent, which is the case this
|
|
27
|
+
* is mostly for: a hint sitting inside the control it belongs to, where the
|
|
28
|
+
* shortcut should work while that control has focus and stop existing when
|
|
29
|
+
* the control does.
|
|
30
|
+
* - `document` listens on the document, for a chord that works from anywhere.
|
|
31
|
+
*
|
|
32
|
+
* *Corrected 25 Aug 2026: this said `scope`, `self` and `global` until then,
|
|
33
|
+
* naming a property that has never existed under that name. The rename is
|
|
34
|
+
* explained on the property itself, twenty lines below, and this paragraph
|
|
35
|
+
* above it went on teaching the old one. A reader who trusted the class doc
|
|
36
|
+
* wrote an attribute that binds nothing, which is also what an unset `within`
|
|
37
|
+
* does, so nothing about the mistake looked like one.*
|
|
38
|
+
*
|
|
39
|
+
* **A hidden `kbd` is a dead shortcut, and that is the point rather than a
|
|
40
|
+
* trap.** Binding here ties the key to its own advertisement, so a hint that is
|
|
41
|
+
* not rendered is a shortcut that is not offered. A chord that must outlive its
|
|
42
|
+
* label is a chord whose owner is not a label: give it to whatever owns the
|
|
43
|
+
* action and let this element only describe it.
|
|
44
|
+
*
|
|
45
|
+
* Nothing binds until this upgrades, so a shortcut is not available in the
|
|
46
|
+
* moments before hydration.
|
|
47
|
+
*
|
|
48
|
+
* @since 0.1.0
|
|
49
|
+
* @status stable
|
|
50
|
+
* @category typography
|
|
51
|
+
* @aliases Key, Shortcut, Hotkey
|
|
52
|
+
* @documentation https://helix.fusion.dev/components/kbd
|
|
53
|
+
*
|
|
54
|
+
* @slot - The key's label, where `keys` is not set.
|
|
55
|
+
*
|
|
56
|
+
* @event {HelixShortcutEvent} helix-shortcut - Fired when the chord is pressed, and cancelable.
|
|
57
|
+
*
|
|
58
|
+
* @csspart kbd - The key.
|
|
59
|
+
*/
|
|
60
|
+
export declare class HelixHeadlessKbd extends HelixElement {
|
|
61
|
+
/**
|
|
62
|
+
* The chord, written plainly: `mod+k`, `shift+?`, `/`.
|
|
63
|
+
*
|
|
64
|
+
* `mod` is the platform's own command modifier, which is the reason to write
|
|
65
|
+
* a chord here rather than a glyph: it is the one token whose right answer
|
|
66
|
+
* differs per reader.
|
|
67
|
+
*/
|
|
68
|
+
keys: string;
|
|
69
|
+
/**
|
|
70
|
+
* Where the chord is listened for, and whether it is listened for at all.
|
|
71
|
+
*
|
|
72
|
+
* Unset draws a key and binds nothing.
|
|
73
|
+
*
|
|
74
|
+
* **Named `within` because `scope` is taken.** `scope` is a real HTML
|
|
75
|
+
* attribute belonging to `<th>`, so putting one on anything else is both a
|
|
76
|
+
* lint failure and a word in the DOM that already means something narrower.
|
|
77
|
+
* `within` says the same thing and says it about this element.
|
|
78
|
+
*/
|
|
79
|
+
within?: 'control' | 'document';
|
|
80
|
+
/** The element the listener is on, kept so it can be taken off the same one. */
|
|
81
|
+
private listening;
|
|
82
|
+
connectedCallback(): void;
|
|
83
|
+
disconnectedCallback(): void;
|
|
84
|
+
protected updated(changed: Map<string, unknown>): void;
|
|
85
|
+
/** The chord as this reader's keyboard labels it. */
|
|
86
|
+
private get label();
|
|
87
|
+
private listen;
|
|
88
|
+
private deafen;
|
|
89
|
+
private readonly handleKeydown;
|
|
90
|
+
/** Whether a press is this chord, modifiers and all. */
|
|
91
|
+
private matches_;
|
|
92
|
+
protected render(): TemplateResult;
|
|
93
|
+
}
|
|
94
|
+
declare global {
|
|
95
|
+
interface HTMLElementTagNameMap {
|
|
96
|
+
'helix-headless-kbd': HelixHeadlessKbd;
|
|
97
|
+
}
|
|
98
|
+
}
|