@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,127 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { nothing, type PropertyValues, type TemplateResult } from 'lit';
|
|
3
|
+
import '../../option/index.js';
|
|
4
|
+
import '../../select/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* @summary Chooses how many items a page holds.
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* Its own element beside `Pagination` rather than a slot inside it, for the
|
|
10
|
+
* reason `Pagination.Summary` is: a footer's direction and order are the
|
|
11
|
+
* consumer's, and a control that can only sit at one end of one row has taken
|
|
12
|
+
* that decision for them.
|
|
13
|
+
*
|
|
14
|
+
* **`Select`, not a native `<select>`.** It was native first, on the argument
|
|
15
|
+
* that the platform's own menu is a wheel on a phone and the widget a
|
|
16
|
+
* screen-reader user already knows. What that argument leaves out is that the
|
|
17
|
+
* library then has two dropdowns that are identical closed and different open,
|
|
18
|
+
* and a reader meets both in the same footer as a table's filters. Consistency
|
|
19
|
+
* is the whole product here, and it wins.
|
|
20
|
+
*
|
|
21
|
+
* What it takes back with it: the caret is `Select`'s again rather than a color
|
|
22
|
+
* literal baked into a data URI, because a background image cannot read
|
|
23
|
+
* `currentColor`, and the label is a real `<label for>` against the trigger's
|
|
24
|
+
* own id, which `Select` already renders and already tests.
|
|
25
|
+
*
|
|
26
|
+
* **The label sits on the row, not above it.** Every other field in the library
|
|
27
|
+
* stacks its label because it stands in a column of fields; this one stands in a
|
|
28
|
+
* footer beside a run of page numbers, and a two-line control there makes the
|
|
29
|
+
* whole row two lines tall. `Select`'s host is a column, and an outer-tree rule
|
|
30
|
+
* beats a `:host` rule, so turning it into a row needs no property on `Select`
|
|
31
|
+
* and nothing written into the consumer's markup.
|
|
32
|
+
*
|
|
33
|
+
* **An empty `sizes` renders nothing.** A chooser with nothing to choose from
|
|
34
|
+
* is a control a reader can operate and cannot use, which is worse than an
|
|
35
|
+
* absence. Falling back to the built-in list was the other answer and it is a
|
|
36
|
+
* component overruling a consumer who said "none". Same rule as `Pagination`
|
|
37
|
+
* over a single page, and reported the same way, through
|
|
38
|
+
* `ElementInternals.states` rather than an attribute the server never wrote.
|
|
39
|
+
*
|
|
40
|
+
* `value` is the controlled property and `default-value` seeds one this owns,
|
|
41
|
+
* the same contract every other stateful element here carries. Changing it
|
|
42
|
+
* announces `helix-before-change`; what a consumer does with that is re-query and move
|
|
43
|
+
* back to page one, which is theirs to decide because only they know whether
|
|
44
|
+
* the reader's position should survive it.
|
|
45
|
+
*
|
|
46
|
+
* @since 0.1.0
|
|
47
|
+
* @status experimental
|
|
48
|
+
* @aliases Page size, Rows per page
|
|
49
|
+
* @documentation https://helix.fusion.dev/components/pagination
|
|
50
|
+
*
|
|
51
|
+
* @event {HelixBeforeChangeEvent} helix-before-change - Fired before the size changes, and cancelable. The only way to refuse one.
|
|
52
|
+
*
|
|
53
|
+
* @csspart control - The select.
|
|
54
|
+
* @csspart label - The words beside the number, forwarded from the select.
|
|
55
|
+
* @csspart trigger - The closed control, forwarded from the select.
|
|
56
|
+
* @csspart value - The chosen size inside the trigger, forwarded from the select.
|
|
57
|
+
*/
|
|
58
|
+
export declare class HelixHeadlessPaginationSize extends HelixElement {
|
|
59
|
+
/**
|
|
60
|
+
* The sizes offered, comma separated.
|
|
61
|
+
*
|
|
62
|
+
* A string rather than an array, so the whole control is expressible in
|
|
63
|
+
* markup and survives a server render. Anything that is not a positive number
|
|
64
|
+
* is dropped rather than rendered as an option that cannot mean anything.
|
|
65
|
+
*/
|
|
66
|
+
sizes: string;
|
|
67
|
+
/**
|
|
68
|
+
* The size in force.
|
|
69
|
+
*
|
|
70
|
+
* Reading gives the real one; writing declares it the consumer's, and
|
|
71
|
+
* `default-value` seeds one this element owns. Same accessor pair as
|
|
72
|
+
* `Pagination.page` and the calendar's `month`.
|
|
73
|
+
*
|
|
74
|
+
*
|
|
75
|
+
*/
|
|
76
|
+
get value(): number;
|
|
77
|
+
set value(next: number);
|
|
78
|
+
/**
|
|
79
|
+
* Size to start on, where nothing declared one.
|
|
80
|
+
*/
|
|
81
|
+
defaultValue: number;
|
|
82
|
+
/**
|
|
83
|
+
* The words beside the control.
|
|
84
|
+
*/
|
|
85
|
+
label: string;
|
|
86
|
+
/**
|
|
87
|
+
* Locale for the numbers.
|
|
88
|
+
*
|
|
89
|
+
* Absent uses the runtime's own.
|
|
90
|
+
*/
|
|
91
|
+
locale: string;
|
|
92
|
+
/** The size, whoever set it, and `undefined` until somebody has. */
|
|
93
|
+
private valueState;
|
|
94
|
+
/** Held across every component asking for the same locale. */
|
|
95
|
+
private get numbers();
|
|
96
|
+
/** The sizes, parsed once, with anything that is not a size dropped. */
|
|
97
|
+
private get options();
|
|
98
|
+
/** The one in force, which is the first offered where nothing named one. */
|
|
99
|
+
private get current();
|
|
100
|
+
private readonly handleChange;
|
|
101
|
+
protected willUpdate(changed: PropertyValues): void;
|
|
102
|
+
/**
|
|
103
|
+
* The control itself, which is the whole of this part, behind a seam the styled tier can move.
|
|
104
|
+
*
|
|
105
|
+
* A method rather than a fragment inline, so a tier above can render its own,
|
|
106
|
+
* wrap this one, pass it a property the base does not know about, or leave it
|
|
107
|
+
* out, without reimplementing the whole template to do any of them.
|
|
108
|
+
*
|
|
109
|
+
* **The tags are interpolated, so each tier renders its own.** They were
|
|
110
|
+
* written out as `<helix-select>` on the argument that each tier imports its
|
|
111
|
+
* own element under that name, which works and costs more than it looks: the
|
|
112
|
+
* name means two different things depending on what a consumer imported, this
|
|
113
|
+
* tier composes an element it does not ship, and the composition cannot be
|
|
114
|
+
* tested here at all, since there is no `helix-select` on this tier to test it
|
|
115
|
+
* against. `tier` resolves the name instead, and the styled subclass changes
|
|
116
|
+
* it in one line rather than reimplementing this method. A tier that renders
|
|
117
|
+
* its own elements is a tier that stands alone, which is the claim the package
|
|
118
|
+
* makes.
|
|
119
|
+
*/
|
|
120
|
+
protected renderSelect(): TemplateResult;
|
|
121
|
+
protected render(): TemplateResult | typeof nothing;
|
|
122
|
+
}
|
|
123
|
+
declare global {
|
|
124
|
+
interface HTMLElementTagNameMap {
|
|
125
|
+
'helix-headless-pagination-size': HelixHeadlessPaginationSize;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
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, formatNumbers, HelixBeforeChangeEvent, HelixElement, requestChange, } from '@fusion.dev/helix-core';
|
|
8
|
+
import { nothing } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
import { html } from 'lit/static-html.js';
|
|
11
|
+
/* Side-effect imports, because this renders a select and an option in its own
|
|
12
|
+
shadow root and a custom element registers on import. The paths are relative,
|
|
13
|
+
so this registers the base pair and the styled file's identical imports
|
|
14
|
+
register the styled pair; `tier` picks which names the template asks for. */
|
|
15
|
+
import '../../option/index.js';
|
|
16
|
+
import '../../select/index.js';
|
|
17
|
+
/**
|
|
18
|
+
* @summary Chooses how many items a page holds.
|
|
19
|
+
*
|
|
20
|
+
* @description
|
|
21
|
+
* Its own element beside `Pagination` rather than a slot inside it, for the
|
|
22
|
+
* reason `Pagination.Summary` is: a footer's direction and order are the
|
|
23
|
+
* consumer's, and a control that can only sit at one end of one row has taken
|
|
24
|
+
* that decision for them.
|
|
25
|
+
*
|
|
26
|
+
* **`Select`, not a native `<select>`.** It was native first, on the argument
|
|
27
|
+
* that the platform's own menu is a wheel on a phone and the widget a
|
|
28
|
+
* screen-reader user already knows. What that argument leaves out is that the
|
|
29
|
+
* library then has two dropdowns that are identical closed and different open,
|
|
30
|
+
* and a reader meets both in the same footer as a table's filters. Consistency
|
|
31
|
+
* is the whole product here, and it wins.
|
|
32
|
+
*
|
|
33
|
+
* What it takes back with it: the caret is `Select`'s again rather than a color
|
|
34
|
+
* literal baked into a data URI, because a background image cannot read
|
|
35
|
+
* `currentColor`, and the label is a real `<label for>` against the trigger's
|
|
36
|
+
* own id, which `Select` already renders and already tests.
|
|
37
|
+
*
|
|
38
|
+
* **The label sits on the row, not above it.** Every other field in the library
|
|
39
|
+
* stacks its label because it stands in a column of fields; this one stands in a
|
|
40
|
+
* footer beside a run of page numbers, and a two-line control there makes the
|
|
41
|
+
* whole row two lines tall. `Select`'s host is a column, and an outer-tree rule
|
|
42
|
+
* beats a `:host` rule, so turning it into a row needs no property on `Select`
|
|
43
|
+
* and nothing written into the consumer's markup.
|
|
44
|
+
*
|
|
45
|
+
* **An empty `sizes` renders nothing.** A chooser with nothing to choose from
|
|
46
|
+
* is a control a reader can operate and cannot use, which is worse than an
|
|
47
|
+
* absence. Falling back to the built-in list was the other answer and it is a
|
|
48
|
+
* component overruling a consumer who said "none". Same rule as `Pagination`
|
|
49
|
+
* over a single page, and reported the same way, through
|
|
50
|
+
* `ElementInternals.states` rather than an attribute the server never wrote.
|
|
51
|
+
*
|
|
52
|
+
* `value` is the controlled property and `default-value` seeds one this owns,
|
|
53
|
+
* the same contract every other stateful element here carries. Changing it
|
|
54
|
+
* announces `helix-before-change`; what a consumer does with that is re-query and move
|
|
55
|
+
* back to page one, which is theirs to decide because only they know whether
|
|
56
|
+
* the reader's position should survive it.
|
|
57
|
+
*
|
|
58
|
+
* @since 0.1.0
|
|
59
|
+
* @status experimental
|
|
60
|
+
* @aliases Page size, Rows per page
|
|
61
|
+
* @documentation https://helix.fusion.dev/components/pagination
|
|
62
|
+
*
|
|
63
|
+
* @event {HelixBeforeChangeEvent} helix-before-change - Fired before the size changes, and cancelable. The only way to refuse one.
|
|
64
|
+
*
|
|
65
|
+
* @csspart control - The select.
|
|
66
|
+
* @csspart label - The words beside the number, forwarded from the select.
|
|
67
|
+
* @csspart trigger - The closed control, forwarded from the select.
|
|
68
|
+
* @csspart value - The chosen size inside the trigger, forwarded from the select.
|
|
69
|
+
*/
|
|
70
|
+
let HelixHeadlessPaginationSize = class HelixHeadlessPaginationSize extends HelixElement {
|
|
71
|
+
constructor() {
|
|
72
|
+
super(...arguments);
|
|
73
|
+
/**
|
|
74
|
+
* The sizes offered, comma separated.
|
|
75
|
+
*
|
|
76
|
+
* A string rather than an array, so the whole control is expressible in
|
|
77
|
+
* markup and survives a server render. Anything that is not a positive number
|
|
78
|
+
* is dropped rather than rendered as an option that cannot mean anything.
|
|
79
|
+
*/
|
|
80
|
+
this.sizes = '10,25,50,100';
|
|
81
|
+
/**
|
|
82
|
+
* Size to start on, where nothing declared one.
|
|
83
|
+
*/
|
|
84
|
+
this.defaultValue = 0;
|
|
85
|
+
/**
|
|
86
|
+
* The words beside the control.
|
|
87
|
+
*/
|
|
88
|
+
this.label = 'Per page';
|
|
89
|
+
/**
|
|
90
|
+
* Locale for the numbers.
|
|
91
|
+
*
|
|
92
|
+
* Absent uses the runtime's own.
|
|
93
|
+
*/
|
|
94
|
+
this.locale = '';
|
|
95
|
+
/** The size, whoever set it, and `undefined` until somebody has. */
|
|
96
|
+
this.valueState = undefined;
|
|
97
|
+
this.handleChange = (event) => {
|
|
98
|
+
/* Stopped, then re-announced under this element's own name. `Select`'s
|
|
99
|
+
`helix-before-change` bubbles and is composed, so left alone it would cross this
|
|
100
|
+
shadow boundary and be retargeted to look like this element's: a consumer
|
|
101
|
+
would get two events per change, one of them carrying `Select`'s idea of
|
|
102
|
+
what a name and a value are. */
|
|
103
|
+
event.stopPropagation();
|
|
104
|
+
const next = Number.parseInt(event.detail?.value ?? '', 10);
|
|
105
|
+
if (!Number.isFinite(next) || next === this.current) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
requestChange({
|
|
109
|
+
apply: (size) => {
|
|
110
|
+
const previous = this.value;
|
|
111
|
+
this.valueState = size;
|
|
112
|
+
this.requestUpdate('value', previous);
|
|
113
|
+
},
|
|
114
|
+
event: (size) => new HelixBeforeChangeEvent({ value: String(size) }),
|
|
115
|
+
host: this,
|
|
116
|
+
next,
|
|
117
|
+
});
|
|
118
|
+
/* Put back where the consumer refused it or owns it, because the control has
|
|
119
|
+
already moved: a select changes itself and then tells you, which is the
|
|
120
|
+
one case `requestChange` cannot announce ahead of. Lit skips a
|
|
121
|
+
property binding whose value has not changed, so a refusal leaves the
|
|
122
|
+
select holding the reader's choice and nothing else would put it back.
|
|
123
|
+
Deferred, so the read happens after the render a successful change asked
|
|
124
|
+
for rather than racing it. */
|
|
125
|
+
this.updateComplete.then(() => {
|
|
126
|
+
const control = this.renderRoot?.querySelector('[part="control"]');
|
|
127
|
+
if (control && control.value !== String(this.current)) {
|
|
128
|
+
control.value = String(this.current);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The size in force.
|
|
135
|
+
*
|
|
136
|
+
* Reading gives the real one; writing declares it the consumer's, and
|
|
137
|
+
* `default-value` seeds one this element owns. Same accessor pair as
|
|
138
|
+
* `Pagination.page` and the calendar's `month`.
|
|
139
|
+
*
|
|
140
|
+
*
|
|
141
|
+
*/
|
|
142
|
+
get value() {
|
|
143
|
+
return this.valueState ?? this.defaultValue;
|
|
144
|
+
}
|
|
145
|
+
set value(next) {
|
|
146
|
+
const previous = this.value;
|
|
147
|
+
this.valueState = next;
|
|
148
|
+
this.requestUpdate('value', previous);
|
|
149
|
+
}
|
|
150
|
+
/** Held across every component asking for the same locale. */
|
|
151
|
+
get numbers() {
|
|
152
|
+
return formatNumbers(this.locale);
|
|
153
|
+
}
|
|
154
|
+
/** The sizes, parsed once, with anything that is not a size dropped. */
|
|
155
|
+
get options() {
|
|
156
|
+
return this.sizes
|
|
157
|
+
.split(',')
|
|
158
|
+
.map((one) => Number.parseInt(one.trim(), 10))
|
|
159
|
+
.filter((one) => Number.isFinite(one) && one > 0);
|
|
160
|
+
}
|
|
161
|
+
/** The one in force, which is the first offered where nothing named one. */
|
|
162
|
+
get current() {
|
|
163
|
+
const options = this.options;
|
|
164
|
+
return options.includes(this.value) ? this.value : (options[0] ?? 0);
|
|
165
|
+
}
|
|
166
|
+
willUpdate(changed) {
|
|
167
|
+
super.willUpdate(changed);
|
|
168
|
+
/* Through `toggleState`, like `Pagination`'s: an engine without
|
|
169
|
+
`CustomStateSet` gets an empty select rather than no element, which is the
|
|
170
|
+
behavior this had before. */
|
|
171
|
+
this.toggleState('empty', this.options.length === 0);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The control itself, which is the whole of this part, behind a seam the styled tier can move.
|
|
175
|
+
*
|
|
176
|
+
* A method rather than a fragment inline, so a tier above can render its own,
|
|
177
|
+
* wrap this one, pass it a property the base does not know about, or leave it
|
|
178
|
+
* out, without reimplementing the whole template to do any of them.
|
|
179
|
+
*
|
|
180
|
+
* **The tags are interpolated, so each tier renders its own.** They were
|
|
181
|
+
* written out as `<helix-select>` on the argument that each tier imports its
|
|
182
|
+
* own element under that name, which works and costs more than it looks: the
|
|
183
|
+
* name means two different things depending on what a consumer imported, this
|
|
184
|
+
* tier composes an element it does not ship, and the composition cannot be
|
|
185
|
+
* tested here at all, since there is no `helix-select` on this tier to test it
|
|
186
|
+
* against. `tier` resolves the name instead, and the styled subclass changes
|
|
187
|
+
* it in one line rather than reimplementing this method. A tier that renders
|
|
188
|
+
* its own elements is a tier that stands alone, which is the claim the package
|
|
189
|
+
* makes.
|
|
190
|
+
*/
|
|
191
|
+
renderSelect() {
|
|
192
|
+
const select = this.tag('select');
|
|
193
|
+
const option = this.tag('option');
|
|
194
|
+
return html `<${select}
|
|
195
|
+
part="control"
|
|
196
|
+
exportparts="label, trigger, value"
|
|
197
|
+
label=${this.label}
|
|
198
|
+
.value=${String(this.current)}
|
|
199
|
+
@helix-before-change=${this.handleChange}
|
|
200
|
+
>
|
|
201
|
+
${this.options.map((size) => html `<${option} value=${String(size)}>${this.numbers(size)}</${option}>`)}
|
|
202
|
+
</${select}>`;
|
|
203
|
+
}
|
|
204
|
+
render() {
|
|
205
|
+
if (this.options.length === 0) {
|
|
206
|
+
return nothing;
|
|
207
|
+
}
|
|
208
|
+
/* `Select` renders the label and gives the trigger the id it points at, so
|
|
209
|
+
the association is the platform's and is already covered by that
|
|
210
|
+
component's own specs. Nothing here reconstructs it. */
|
|
211
|
+
return html `${this.renderSelect()}`;
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
__decorate([
|
|
215
|
+
property()
|
|
216
|
+
], HelixHeadlessPaginationSize.prototype, "sizes", void 0);
|
|
217
|
+
__decorate([
|
|
218
|
+
property({ type: Number })
|
|
219
|
+
], HelixHeadlessPaginationSize.prototype, "value", null);
|
|
220
|
+
__decorate([
|
|
221
|
+
property({ attribute: 'default-value', type: Number })
|
|
222
|
+
], HelixHeadlessPaginationSize.prototype, "defaultValue", void 0);
|
|
223
|
+
__decorate([
|
|
224
|
+
property()
|
|
225
|
+
], HelixHeadlessPaginationSize.prototype, "label", void 0);
|
|
226
|
+
__decorate([
|
|
227
|
+
property()
|
|
228
|
+
], HelixHeadlessPaginationSize.prototype, "locale", void 0);
|
|
229
|
+
HelixHeadlessPaginationSize = __decorate([
|
|
230
|
+
customElement('helix-headless-pagination-size')
|
|
231
|
+
], HelixHeadlessPaginationSize);
|
|
232
|
+
export { HelixHeadlessPaginationSize };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
+
import { type TemplateResult } from 'lit';
|
|
3
|
+
/**
|
|
4
|
+
* @summary Reads out which items of how many are on show.
|
|
5
|
+
*
|
|
6
|
+
* @description
|
|
7
|
+
* Its own element rather than a part of `Pagination`, so a consumer decides
|
|
8
|
+
* where it goes. Inside the run it could only ever be at one end of one row;
|
|
9
|
+
* beside it, it goes above, below, in a table's caption, or on the other side of
|
|
10
|
+
* the page, and the direction and order of the whole footer are the consumer's.
|
|
11
|
+
*
|
|
12
|
+
* **It repeats `page`, `page-size` and `total`, and the cost of that is skew
|
|
13
|
+
* rather than verbosity.** Those three come from the consumer's own query, so
|
|
14
|
+
* writing them on two elements is one variable used twice; what it risks is the
|
|
15
|
+
* two disagreeing, and a count reading `76-100 of 248` beside a run showing page
|
|
16
|
+
* 7 is the same failure this element's own clamping exists to prevent, arriving
|
|
17
|
+
* from the outside instead.
|
|
18
|
+
*
|
|
19
|
+
* **Nothing removes it at this level, and that was measured rather than
|
|
20
|
+
* assumed.** A coordinating root can only reach children the consumer laid out
|
|
21
|
+
* by writing attributes onto them, which a framework reports as a hydration
|
|
22
|
+
* error, or through context, which is dead on a server: `@lit/context`
|
|
23
|
+
* subscribes from `connectedCallback`, and Lit SSR does not call it, so every
|
|
24
|
+
* value is `undefined` in exactly the render this element exists to be part of.
|
|
25
|
+
* Confirmed against Lit SSR directly. The fork is real: children in the light
|
|
26
|
+
* DOM mean the consumer owns the layout and no root can feed them; children in a
|
|
27
|
+
* shadow root mean a root feeds them by ordinary binding and owns the layout.
|
|
28
|
+
*
|
|
29
|
+
* **It resolves one level up, at a composite, and the state is why.** `page`,
|
|
30
|
+
* `page-size` and `total` are facts about a *result*, not about a pagination, so
|
|
31
|
+
* the element that should hold them once is the one that holds the result: a
|
|
32
|
+
* data table composing a pagination inside itself, rather than a pagination root
|
|
33
|
+
* invented to hold three pagination elements together. That root would have been
|
|
34
|
+
* plumbing; a table's paging state is the thing itself. And because a composite
|
|
35
|
+
* renders its parts into its own shadow root, it lands on the side of the fork
|
|
36
|
+
* where binding works and the server renders, at no cost to anyone.
|
|
37
|
+
*
|
|
38
|
+
* Renders nothing without a `total` and a `page-size`. A wrong count is worse
|
|
39
|
+
* than none: it is the one number in a footer a reader cannot check against
|
|
40
|
+
* anything else on screen.
|
|
41
|
+
*
|
|
42
|
+
* @since 0.1.0
|
|
43
|
+
* @status experimental
|
|
44
|
+
* @aliases Result count, Range
|
|
45
|
+
* @documentation https://helix.fusion.dev/components/pagination
|
|
46
|
+
*/
|
|
47
|
+
export declare class HelixHeadlessPaginationSummary extends HelixElement {
|
|
48
|
+
/**
|
|
49
|
+
* The page on show, one-based.
|
|
50
|
+
*/
|
|
51
|
+
page: number;
|
|
52
|
+
/**
|
|
53
|
+
* How many items are on a page.
|
|
54
|
+
*/
|
|
55
|
+
pageSize: number;
|
|
56
|
+
/**
|
|
57
|
+
* How many items there are across every page.
|
|
58
|
+
*/
|
|
59
|
+
total: number;
|
|
60
|
+
/**
|
|
61
|
+
* The reading, with `{from}`, `{to}` and `{total}` filled in.
|
|
62
|
+
*
|
|
63
|
+
* A template rather than a prefix and a suffix, because word order is not
|
|
64
|
+
* universal: `format="{total} 件中 {from}-{to} 件"` is one attribute here and
|
|
65
|
+
* three concatenations anywhere else.
|
|
66
|
+
*
|
|
67
|
+
* **`format`, not `label`, and the difference is worth the rename.** `label`
|
|
68
|
+
* across this library means the accessible name of a thing that has one:
|
|
69
|
+
* `Pagination.label` names the landmark and `Pagination.Size.label` is the
|
|
70
|
+
* words beside the control. This is neither. It is the whole visible content
|
|
71
|
+
* of the element, so calling it `label` put one word on three jobs inside one
|
|
72
|
+
* family. The root's templates are `pageLabel`, `statusLabel` and `gapLabel`,
|
|
73
|
+
* which each label something; this labels nothing, it *is* the thing.
|
|
74
|
+
*/
|
|
75
|
+
format: string;
|
|
76
|
+
/**
|
|
77
|
+
* Locale for the numbers.
|
|
78
|
+
*
|
|
79
|
+
* Absent uses the runtime's own.
|
|
80
|
+
*/
|
|
81
|
+
locale: string;
|
|
82
|
+
/** Held across every component asking for the same locale. */
|
|
83
|
+
private get numbers();
|
|
84
|
+
protected render(): TemplateResult;
|
|
85
|
+
}
|
|
86
|
+
declare global {
|
|
87
|
+
interface HTMLElementTagNameMap {
|
|
88
|
+
'helix-headless-pagination-summary': HelixHeadlessPaginationSummary;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
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, formatNumbers, HelixElement } from '@fusion.dev/helix-core';
|
|
8
|
+
import { html } from 'lit';
|
|
9
|
+
import { property } from 'lit/decorators.js';
|
|
10
|
+
/**
|
|
11
|
+
* @summary Reads out which items of how many are on show.
|
|
12
|
+
*
|
|
13
|
+
* @description
|
|
14
|
+
* Its own element rather than a part of `Pagination`, so a consumer decides
|
|
15
|
+
* where it goes. Inside the run it could only ever be at one end of one row;
|
|
16
|
+
* beside it, it goes above, below, in a table's caption, or on the other side of
|
|
17
|
+
* the page, and the direction and order of the whole footer are the consumer's.
|
|
18
|
+
*
|
|
19
|
+
* **It repeats `page`, `page-size` and `total`, and the cost of that is skew
|
|
20
|
+
* rather than verbosity.** Those three come from the consumer's own query, so
|
|
21
|
+
* writing them on two elements is one variable used twice; what it risks is the
|
|
22
|
+
* two disagreeing, and a count reading `76-100 of 248` beside a run showing page
|
|
23
|
+
* 7 is the same failure this element's own clamping exists to prevent, arriving
|
|
24
|
+
* from the outside instead.
|
|
25
|
+
*
|
|
26
|
+
* **Nothing removes it at this level, and that was measured rather than
|
|
27
|
+
* assumed.** A coordinating root can only reach children the consumer laid out
|
|
28
|
+
* by writing attributes onto them, which a framework reports as a hydration
|
|
29
|
+
* error, or through context, which is dead on a server: `@lit/context`
|
|
30
|
+
* subscribes from `connectedCallback`, and Lit SSR does not call it, so every
|
|
31
|
+
* value is `undefined` in exactly the render this element exists to be part of.
|
|
32
|
+
* Confirmed against Lit SSR directly. The fork is real: children in the light
|
|
33
|
+
* DOM mean the consumer owns the layout and no root can feed them; children in a
|
|
34
|
+
* shadow root mean a root feeds them by ordinary binding and owns the layout.
|
|
35
|
+
*
|
|
36
|
+
* **It resolves one level up, at a composite, and the state is why.** `page`,
|
|
37
|
+
* `page-size` and `total` are facts about a *result*, not about a pagination, so
|
|
38
|
+
* the element that should hold them once is the one that holds the result: a
|
|
39
|
+
* data table composing a pagination inside itself, rather than a pagination root
|
|
40
|
+
* invented to hold three pagination elements together. That root would have been
|
|
41
|
+
* plumbing; a table's paging state is the thing itself. And because a composite
|
|
42
|
+
* renders its parts into its own shadow root, it lands on the side of the fork
|
|
43
|
+
* where binding works and the server renders, at no cost to anyone.
|
|
44
|
+
*
|
|
45
|
+
* Renders nothing without a `total` and a `page-size`. A wrong count is worse
|
|
46
|
+
* than none: it is the one number in a footer a reader cannot check against
|
|
47
|
+
* anything else on screen.
|
|
48
|
+
*
|
|
49
|
+
* @since 0.1.0
|
|
50
|
+
* @status experimental
|
|
51
|
+
* @aliases Result count, Range
|
|
52
|
+
* @documentation https://helix.fusion.dev/components/pagination
|
|
53
|
+
*/
|
|
54
|
+
let HelixHeadlessPaginationSummary = class HelixHeadlessPaginationSummary extends HelixElement {
|
|
55
|
+
constructor() {
|
|
56
|
+
super(...arguments);
|
|
57
|
+
/**
|
|
58
|
+
* The page on show, one-based.
|
|
59
|
+
*/
|
|
60
|
+
this.page = 1;
|
|
61
|
+
/**
|
|
62
|
+
* How many items are on a page.
|
|
63
|
+
*/
|
|
64
|
+
this.pageSize = 0;
|
|
65
|
+
/**
|
|
66
|
+
* How many items there are across every page.
|
|
67
|
+
*/
|
|
68
|
+
this.total = 0;
|
|
69
|
+
/**
|
|
70
|
+
* The reading, with `{from}`, `{to}` and `{total}` filled in.
|
|
71
|
+
*
|
|
72
|
+
* A template rather than a prefix and a suffix, because word order is not
|
|
73
|
+
* universal: `format="{total} 件中 {from}-{to} 件"` is one attribute here and
|
|
74
|
+
* three concatenations anywhere else.
|
|
75
|
+
*
|
|
76
|
+
* **`format`, not `label`, and the difference is worth the rename.** `label`
|
|
77
|
+
* across this library means the accessible name of a thing that has one:
|
|
78
|
+
* `Pagination.label` names the landmark and `Pagination.Size.label` is the
|
|
79
|
+
* words beside the control. This is neither. It is the whole visible content
|
|
80
|
+
* of the element, so calling it `label` put one word on three jobs inside one
|
|
81
|
+
* family. The root's templates are `pageLabel`, `statusLabel` and `gapLabel`,
|
|
82
|
+
* which each label something; this labels nothing, it *is* the thing.
|
|
83
|
+
*/
|
|
84
|
+
this.format = '{from}-{to} of {total}';
|
|
85
|
+
/**
|
|
86
|
+
* Locale for the numbers.
|
|
87
|
+
*
|
|
88
|
+
* Absent uses the runtime's own.
|
|
89
|
+
*/
|
|
90
|
+
this.locale = '';
|
|
91
|
+
}
|
|
92
|
+
/** Held across every component asking for the same locale. */
|
|
93
|
+
get numbers() {
|
|
94
|
+
return formatNumbers(this.locale);
|
|
95
|
+
}
|
|
96
|
+
render() {
|
|
97
|
+
/* An empty template rather than `nothing`, so the element generates a box
|
|
98
|
+
with no text in it: a footer laid out as a grid keeps its column, and a
|
|
99
|
+
count that appears when the total loads does not move the controls beside
|
|
100
|
+
it. */
|
|
101
|
+
if (this.total <= 0 || this.pageSize <= 0) {
|
|
102
|
+
return html ``;
|
|
103
|
+
}
|
|
104
|
+
const size = Math.max(1, Math.floor(this.pageSize));
|
|
105
|
+
/* **The page is clamped to the range, not just the window inside it.**
|
|
106
|
+
Only the end was, so a `page` past the last one produced a start past the
|
|
107
|
+
total and an end pinned to it: at page 99 of a 10-page result this read
|
|
108
|
+
"2,451-248 of 248", a range running backwards. That is the worst kind of
|
|
109
|
+
wrong here, because a count is the one number in a footer a reader cannot
|
|
110
|
+
check against anything else on screen.
|
|
111
|
+
|
|
112
|
+
A page past the end is not far-fetched either: it is a bookmarked query
|
|
113
|
+
after the result shrank, and the run beside this clamps it silently, so
|
|
114
|
+
the two would disagree with only this one visibly broken. */
|
|
115
|
+
const pages = Math.max(1, Math.ceil(this.total / size));
|
|
116
|
+
const page = Math.min(pages, Math.max(1, Math.floor(this.page) || 1));
|
|
117
|
+
const from = (page - 1) * size + 1;
|
|
118
|
+
/* And the end is clamped to the total, because the last page is rarely
|
|
119
|
+
full: 248 items at 25 a page end at 248, not at 250. */
|
|
120
|
+
const to = Math.min(this.total, from + size - 1);
|
|
121
|
+
return html `${this.format
|
|
122
|
+
.replaceAll('{from}', this.numbers(from))
|
|
123
|
+
.replaceAll('{to}', this.numbers(to))
|
|
124
|
+
.replaceAll('{total}', this.numbers(this.total))}`;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
__decorate([
|
|
128
|
+
property({ type: Number })
|
|
129
|
+
], HelixHeadlessPaginationSummary.prototype, "page", void 0);
|
|
130
|
+
__decorate([
|
|
131
|
+
property({ attribute: 'page-size', type: Number })
|
|
132
|
+
], HelixHeadlessPaginationSummary.prototype, "pageSize", void 0);
|
|
133
|
+
__decorate([
|
|
134
|
+
property({ type: Number })
|
|
135
|
+
], HelixHeadlessPaginationSummary.prototype, "total", void 0);
|
|
136
|
+
__decorate([
|
|
137
|
+
property()
|
|
138
|
+
], HelixHeadlessPaginationSummary.prototype, "format", void 0);
|
|
139
|
+
__decorate([
|
|
140
|
+
property()
|
|
141
|
+
], HelixHeadlessPaginationSummary.prototype, "locale", void 0);
|
|
142
|
+
HelixHeadlessPaginationSummary = __decorate([
|
|
143
|
+
customElement('helix-headless-pagination-summary')
|
|
144
|
+
], HelixHeadlessPaginationSummary);
|
|
145
|
+
export { HelixHeadlessPaginationSummary };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/pin-input-root.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './root/pin-input-root.js';
|