@slotted/angular 0.0.0-stage → 0.1.0-beta.0
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/README.md +51 -2
- package/docs/AGENTS.snippet.md +10 -0
- package/docs/accordion.json +345 -0
- package/docs/accordion.md +207 -0
- package/docs/action-bar.json +421 -0
- package/docs/action-bar.md +364 -0
- package/docs/action-sheet.json +210 -0
- package/docs/action-sheet.md +19 -0
- package/docs/alert.json +407 -0
- package/docs/alert.md +239 -0
- package/docs/app-shell.examples.md +349 -0
- package/docs/app-shell.json +835 -0
- package/docs/app-shell.md +214 -0
- package/docs/aspect-ratio.json +159 -0
- package/docs/aspect-ratio.md +134 -0
- package/docs/attachment.json +486 -0
- package/docs/attachment.md +253 -0
- package/docs/avatar-group.json +208 -0
- package/docs/avatar-group.md +130 -0
- package/docs/avatar.json +342 -0
- package/docs/avatar.md +142 -0
- package/docs/badge.json +334 -0
- package/docs/badge.md +138 -0
- package/docs/breadcrumb.json +368 -0
- package/docs/breadcrumb.md +237 -0
- package/docs/button-group.json +158 -0
- package/docs/button-group.md +72 -0
- package/docs/button.examples.md +621 -0
- package/docs/button.json +977 -0
- package/docs/button.md +200 -0
- package/docs/calendar.json +592 -0
- package/docs/calendar.md +242 -0
- package/docs/card.json +283 -0
- package/docs/card.md +130 -0
- package/docs/carousel.json +560 -0
- package/docs/carousel.md +357 -0
- package/docs/cascader.json +933 -0
- package/docs/cascader.md +379 -0
- package/docs/chart.examples.md +582 -0
- package/docs/chart.json +1359 -0
- package/docs/chart.md +187 -0
- package/docs/checkbox-group.examples.md +612 -0
- package/docs/checkbox-group.json +395 -0
- package/docs/checkbox-group.md +106 -0
- package/docs/checkbox.examples.md +546 -0
- package/docs/checkbox.json +506 -0
- package/docs/checkbox.md +104 -0
- package/docs/code-block.json +616 -0
- package/docs/code-block.md +303 -0
- package/docs/collapsible.json +456 -0
- package/docs/collapsible.md +261 -0
- package/docs/color-picker.json +523 -0
- package/docs/color-picker.md +201 -0
- package/docs/column-manager.json +486 -0
- package/docs/column-manager.md +277 -0
- package/docs/combobox.examples.md +1732 -0
- package/docs/combobox.json +1250 -0
- package/docs/combobox.md +209 -0
- package/docs/command-palette.json +800 -0
- package/docs/command-palette.md +419 -0
- package/docs/container.json +156 -0
- package/docs/container.md +92 -0
- package/docs/context-menu.json +231 -0
- package/docs/context-menu.md +176 -0
- package/docs/currency-field.examples.md +321 -0
- package/docs/currency-field.json +649 -0
- package/docs/currency-field.md +128 -0
- package/docs/dashboard-grid.json +680 -0
- package/docs/dashboard-grid.md +265 -0
- package/docs/data-grid.examples.md +3064 -0
- package/docs/data-grid.json +1577 -0
- package/docs/data-grid.md +237 -0
- package/docs/data-grid.props.md +81 -0
- package/docs/data-list.json +685 -0
- package/docs/data-list.md +327 -0
- package/docs/date-field.json +490 -0
- package/docs/date-field.md +235 -0
- package/docs/date-picker.examples.md +1226 -0
- package/docs/date-picker.json +696 -0
- package/docs/date-picker.md +121 -0
- package/docs/date-range-picker.examples.md +1300 -0
- package/docs/date-range-picker.json +903 -0
- package/docs/date-range-picker.md +142 -0
- package/docs/datetime-field.json +665 -0
- package/docs/datetime-field.md +337 -0
- package/docs/datetime-picker.examples.md +1269 -0
- package/docs/datetime-picker.json +928 -0
- package/docs/datetime-picker.md +150 -0
- package/docs/datetime-range-picker.examples.md +225 -0
- package/docs/datetime-range-picker.json +1015 -0
- package/docs/datetime-range-picker.md +162 -0
- package/docs/description-list.json +471 -0
- package/docs/description-list.md +268 -0
- package/docs/detail-panel.json +530 -0
- package/docs/detail-panel.md +361 -0
- package/docs/dialog.examples.md +2467 -0
- package/docs/dialog.json +1141 -0
- package/docs/dialog.md +217 -0
- package/docs/dialog.props.md +63 -0
- package/docs/divider.json +148 -0
- package/docs/divider.md +83 -0
- package/docs/drawer.examples.md +1929 -0
- package/docs/drawer.json +753 -0
- package/docs/drawer.md +199 -0
- package/docs/entity-picker.json +946 -0
- package/docs/entity-picker.md +365 -0
- package/docs/event-calendar.examples.md +308 -0
- package/docs/event-calendar.json +1202 -0
- package/docs/event-calendar.md +201 -0
- package/docs/field-group.json +333 -0
- package/docs/field-group.md +181 -0
- package/docs/field.examples.md +676 -0
- package/docs/field.json +528 -0
- package/docs/field.md +127 -0
- package/docs/filter-bar.json +817 -0
- package/docs/filter-bar.md +380 -0
- package/docs/form.json +378 -0
- package/docs/form.md +235 -0
- package/docs/fullscreen.json +395 -0
- package/docs/fullscreen.md +225 -0
- package/docs/grid.json +176 -0
- package/docs/grid.md +74 -0
- package/docs/highlight.json +279 -0
- package/docs/highlight.md +210 -0
- package/docs/hover-card.json +254 -0
- package/docs/hover-card.md +213 -0
- package/docs/icon.json +173 -0
- package/docs/icon.md +101 -0
- package/docs/image.json +476 -0
- package/docs/image.md +254 -0
- package/docs/import-export-center.json +836 -0
- package/docs/import-export-center.md +345 -0
- package/docs/index.md +141 -0
- package/docs/inline-message.json +312 -0
- package/docs/inline-message.md +191 -0
- package/docs/inline.json +149 -0
- package/docs/inline.md +72 -0
- package/docs/kbd.json +350 -0
- package/docs/kbd.md +210 -0
- package/docs/link.json +264 -0
- package/docs/link.md +167 -0
- package/docs/list-item.json +463 -0
- package/docs/list-item.md +236 -0
- package/docs/list.json +321 -0
- package/docs/list.md +185 -0
- package/docs/listbox.json +807 -0
- package/docs/listbox.md +413 -0
- package/docs/loading-overlay.json +440 -0
- package/docs/loading-overlay.md +248 -0
- package/docs/markdown.json +461 -0
- package/docs/markdown.md +266 -0
- package/docs/menu.examples.md +1651 -0
- package/docs/menu.json +922 -0
- package/docs/menu.md +155 -0
- package/docs/menubar.json +292 -0
- package/docs/menubar.md +173 -0
- package/docs/message-scroller.json +401 -0
- package/docs/message-scroller.md +212 -0
- package/docs/message.json +862 -0
- package/docs/message.md +473 -0
- package/docs/multi-select.examples.md +1922 -0
- package/docs/multi-select.json +1314 -0
- package/docs/multi-select.md +213 -0
- package/docs/navigation-menu.json +529 -0
- package/docs/navigation-menu.md +329 -0
- package/docs/notification-center.json +664 -0
- package/docs/notification-center.md +372 -0
- package/docs/number-field.examples.md +1078 -0
- package/docs/number-field.json +668 -0
- package/docs/number-field.md +137 -0
- package/docs/otp-input.json +479 -0
- package/docs/otp-input.md +291 -0
- package/docs/page-header.json +574 -0
- package/docs/page-header.md +338 -0
- package/docs/page.json +332 -0
- package/docs/page.md +184 -0
- package/docs/pagination.json +434 -0
- package/docs/pagination.md +238 -0
- package/docs/popover.examples.md +1235 -0
- package/docs/popover.json +656 -0
- package/docs/popover.md +199 -0
- package/docs/progress-indicator.json +501 -0
- package/docs/progress-indicator.md +329 -0
- package/docs/prompt-composer.json +498 -0
- package/docs/prompt-composer.md +278 -0
- package/docs/prose.json +357 -0
- package/docs/prose.md +226 -0
- package/docs/radio-group.examples.md +626 -0
- package/docs/radio-group.json +541 -0
- package/docs/radio-group.md +112 -0
- package/docs/rating.json +1053 -0
- package/docs/rating.md +435 -0
- package/docs/result-state.json +376 -0
- package/docs/result-state.md +286 -0
- package/docs/saved-views.json +384 -0
- package/docs/saved-views.md +242 -0
- package/docs/scroll-area.json +120 -0
- package/docs/scroll-area.md +8 -0
- package/docs/section.json +344 -0
- package/docs/section.md +208 -0
- package/docs/segmented-control.json +429 -0
- package/docs/segmented-control.md +240 -0
- package/docs/select.examples.md +1214 -0
- package/docs/select.json +1147 -0
- package/docs/select.md +199 -0
- package/docs/side-navigation.json +632 -0
- package/docs/side-navigation.md +430 -0
- package/docs/skeleton.json +358 -0
- package/docs/skeleton.md +223 -0
- package/docs/slider.json +522 -0
- package/docs/slider.md +261 -0
- package/docs/sparkline.json +426 -0
- package/docs/sparkline.md +206 -0
- package/docs/split-button.json +361 -0
- package/docs/split-button.md +275 -0
- package/docs/splitter.json +142 -0
- package/docs/splitter.md +14 -0
- package/docs/stack.json +135 -0
- package/docs/stack.md +74 -0
- package/docs/stat-card.json +529 -0
- package/docs/stat-card.md +270 -0
- package/docs/status-indicator.json +314 -0
- package/docs/status-indicator.md +197 -0
- package/docs/stepper.json +451 -0
- package/docs/stepper.md +250 -0
- package/docs/switch.json +451 -0
- package/docs/switch.md +508 -0
- package/docs/table-of-contents.json +553 -0
- package/docs/table-of-contents.md +289 -0
- package/docs/table.examples.md +1981 -0
- package/docs/table.json +1059 -0
- package/docs/table.md +290 -0
- package/docs/tabs.examples.md +1370 -0
- package/docs/tabs.json +661 -0
- package/docs/tabs.md +211 -0
- package/docs/tag.json +813 -0
- package/docs/tag.md +241 -0
- package/docs/tags-input.json +771 -0
- package/docs/tags-input.md +361 -0
- package/docs/text-field.examples.md +821 -0
- package/docs/text-field.json +604 -0
- package/docs/text-field.md +125 -0
- package/docs/textarea.examples.md +612 -0
- package/docs/textarea.json +440 -0
- package/docs/textarea.md +98 -0
- package/docs/time-field.json +584 -0
- package/docs/time-field.md +291 -0
- package/docs/time-picker.json +679 -0
- package/docs/time-picker.md +315 -0
- package/docs/time-range-picker.examples.md +191 -0
- package/docs/time-range-picker.json +924 -0
- package/docs/time-range-picker.md +152 -0
- package/docs/timeline.json +839 -0
- package/docs/timeline.md +401 -0
- package/docs/toast.json +642 -0
- package/docs/toast.md +311 -0
- package/docs/toggle-group.json +417 -0
- package/docs/toggle-group.md +255 -0
- package/docs/toggle.json +326 -0
- package/docs/toggle.md +222 -0
- package/docs/toolbar.json +380 -0
- package/docs/toolbar.md +240 -0
- package/docs/tooltip.examples.md +664 -0
- package/docs/tooltip.json +604 -0
- package/docs/tooltip.md +146 -0
- package/docs/top-navigation.examples.md +287 -0
- package/docs/top-navigation.json +648 -0
- package/docs/top-navigation.md +138 -0
- package/docs/tour.json +759 -0
- package/docs/tour.md +337 -0
- package/docs/transfer.json +746 -0
- package/docs/transfer.md +273 -0
- package/docs/tree.json +918 -0
- package/docs/tree.md +397 -0
- package/docs/typography.json +317 -0
- package/docs/typography.md +107 -0
- package/docs/upload.examples.md +358 -0
- package/docs/upload.json +1103 -0
- package/docs/upload.md +166 -0
- package/docs/visually-hidden.json +71 -0
- package/docs/visually-hidden.md +42 -0
- package/docs/wizard.json +724 -0
- package/docs/wizard.md +295 -0
- package/fesm2022/slotted-angular-accordion.mjs +247 -0
- package/fesm2022/slotted-angular-accordion.mjs.map +1 -0
- package/fesm2022/slotted-angular-action-bar.mjs +639 -0
- package/fesm2022/slotted-angular-action-bar.mjs.map +1 -0
- package/fesm2022/slotted-angular-action-sheet.mjs +749 -0
- package/fesm2022/slotted-angular-action-sheet.mjs.map +1 -0
- package/fesm2022/slotted-angular-alert.mjs +427 -0
- package/fesm2022/slotted-angular-alert.mjs.map +1 -0
- package/fesm2022/slotted-angular-app-shell.mjs +1334 -0
- package/fesm2022/slotted-angular-app-shell.mjs.map +1 -0
- package/fesm2022/slotted-angular-aspect-ratio.mjs +63 -0
- package/fesm2022/slotted-angular-aspect-ratio.mjs.map +1 -0
- package/fesm2022/slotted-angular-attachment.mjs +595 -0
- package/fesm2022/slotted-angular-attachment.mjs.map +1 -0
- package/fesm2022/slotted-angular-avatar-group.mjs +230 -0
- package/fesm2022/slotted-angular-avatar-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-avatar.mjs +330 -0
- package/fesm2022/slotted-angular-avatar.mjs.map +1 -0
- package/fesm2022/slotted-angular-badge.mjs +255 -0
- package/fesm2022/slotted-angular-badge.mjs.map +1 -0
- package/fesm2022/slotted-angular-breadcrumb.mjs +544 -0
- package/fesm2022/slotted-angular-breadcrumb.mjs.map +1 -0
- package/fesm2022/slotted-angular-button-group.mjs +146 -0
- package/fesm2022/slotted-angular-button-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-button.mjs +692 -0
- package/fesm2022/slotted-angular-button.mjs.map +1 -0
- package/fesm2022/slotted-angular-calendar.mjs +916 -0
- package/fesm2022/slotted-angular-calendar.mjs.map +1 -0
- package/fesm2022/slotted-angular-card.mjs +225 -0
- package/fesm2022/slotted-angular-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-carousel.mjs +840 -0
- package/fesm2022/slotted-angular-carousel.mjs.map +1 -0
- package/fesm2022/slotted-angular-cascader.mjs +1839 -0
- package/fesm2022/slotted-angular-cascader.mjs.map +1 -0
- package/fesm2022/slotted-angular-chart.mjs +974 -0
- package/fesm2022/slotted-angular-chart.mjs.map +1 -0
- package/fesm2022/slotted-angular-checkbox-group.mjs +283 -0
- package/fesm2022/slotted-angular-checkbox-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-checkbox.mjs +468 -0
- package/fesm2022/slotted-angular-checkbox.mjs.map +1 -0
- package/fesm2022/slotted-angular-code-block.mjs +476 -0
- package/fesm2022/slotted-angular-code-block.mjs.map +1 -0
- package/fesm2022/slotted-angular-collapsible.mjs +479 -0
- package/fesm2022/slotted-angular-collapsible.mjs.map +1 -0
- package/fesm2022/slotted-angular-color-picker.mjs +910 -0
- package/fesm2022/slotted-angular-color-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-column-manager.mjs +1037 -0
- package/fesm2022/slotted-angular-column-manager.mjs.map +1 -0
- package/fesm2022/slotted-angular-combobox.mjs +1480 -0
- package/fesm2022/slotted-angular-combobox.mjs.map +1 -0
- package/fesm2022/slotted-angular-command-palette.mjs +1283 -0
- package/fesm2022/slotted-angular-command-palette.mjs.map +1 -0
- package/fesm2022/slotted-angular-container.mjs +105 -0
- package/fesm2022/slotted-angular-container.mjs.map +1 -0
- package/fesm2022/slotted-angular-context-menu.mjs +221 -0
- package/fesm2022/slotted-angular-context-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-currency-field.mjs +1131 -0
- package/fesm2022/slotted-angular-currency-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-dashboard-grid.mjs +1928 -0
- package/fesm2022/slotted-angular-dashboard-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-data-grid.mjs +6697 -0
- package/fesm2022/slotted-angular-data-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-data-list.mjs +1418 -0
- package/fesm2022/slotted-angular-data-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-field.mjs +772 -0
- package/fesm2022/slotted-angular-date-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-picker.mjs +690 -0
- package/fesm2022/slotted-angular-date-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-range-picker.mjs +1150 -0
- package/fesm2022/slotted-angular-date-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-field.mjs +1058 -0
- package/fesm2022/slotted-angular-datetime-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-picker.mjs +1362 -0
- package/fesm2022/slotted-angular-datetime-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-range-picker.mjs +1872 -0
- package/fesm2022/slotted-angular-datetime-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-description-list.mjs +545 -0
- package/fesm2022/slotted-angular-description-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-detail-panel.mjs +754 -0
- package/fesm2022/slotted-angular-detail-panel.mjs.map +1 -0
- package/fesm2022/slotted-angular-dialog.mjs +980 -0
- package/fesm2022/slotted-angular-dialog.mjs.map +1 -0
- package/fesm2022/slotted-angular-divider.mjs +76 -0
- package/fesm2022/slotted-angular-divider.mjs.map +1 -0
- package/fesm2022/slotted-angular-drawer.mjs +1397 -0
- package/fesm2022/slotted-angular-drawer.mjs.map +1 -0
- package/fesm2022/slotted-angular-entity-picker.mjs +1987 -0
- package/fesm2022/slotted-angular-entity-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-event-calendar.mjs +2934 -0
- package/fesm2022/slotted-angular-event-calendar.mjs.map +1 -0
- package/fesm2022/slotted-angular-field-group.mjs +301 -0
- package/fesm2022/slotted-angular-field-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-field.mjs +928 -0
- package/fesm2022/slotted-angular-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-filter-bar.mjs +3107 -0
- package/fesm2022/slotted-angular-filter-bar.mjs.map +1 -0
- package/fesm2022/slotted-angular-form.mjs +592 -0
- package/fesm2022/slotted-angular-form.mjs.map +1 -0
- package/fesm2022/slotted-angular-fullscreen.mjs +314 -0
- package/fesm2022/slotted-angular-fullscreen.mjs.map +1 -0
- package/fesm2022/slotted-angular-grid.mjs +58 -0
- package/fesm2022/slotted-angular-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-highlight.mjs +123 -0
- package/fesm2022/slotted-angular-highlight.mjs.map +1 -0
- package/fesm2022/slotted-angular-hover-card.mjs +326 -0
- package/fesm2022/slotted-angular-hover-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-i18n.mjs +75 -0
- package/fesm2022/slotted-angular-i18n.mjs.map +1 -0
- package/fesm2022/slotted-angular-icon.mjs +232 -0
- package/fesm2022/slotted-angular-icon.mjs.map +1 -0
- package/fesm2022/slotted-angular-image.mjs +442 -0
- package/fesm2022/slotted-angular-image.mjs.map +1 -0
- package/fesm2022/slotted-angular-import-export-center.mjs +1792 -0
- package/fesm2022/slotted-angular-import-export-center.mjs.map +1 -0
- package/fesm2022/slotted-angular-inline-message.mjs +280 -0
- package/fesm2022/slotted-angular-inline-message.mjs.map +1 -0
- package/fesm2022/slotted-angular-inline.mjs +52 -0
- package/fesm2022/slotted-angular-inline.mjs.map +1 -0
- package/fesm2022/slotted-angular-kbd.mjs +284 -0
- package/fesm2022/slotted-angular-kbd.mjs.map +1 -0
- package/fesm2022/slotted-angular-link.mjs +182 -0
- package/fesm2022/slotted-angular-link.mjs.map +1 -0
- package/fesm2022/slotted-angular-list-item.mjs +367 -0
- package/fesm2022/slotted-angular-list-item.mjs.map +1 -0
- package/fesm2022/slotted-angular-list.mjs +256 -0
- package/fesm2022/slotted-angular-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-listbox.mjs +1274 -0
- package/fesm2022/slotted-angular-listbox.mjs.map +1 -0
- package/fesm2022/slotted-angular-loading-overlay.mjs +451 -0
- package/fesm2022/slotted-angular-loading-overlay.mjs.map +1 -0
- package/fesm2022/slotted-angular-markdown.mjs +914 -0
- package/fesm2022/slotted-angular-markdown.mjs.map +1 -0
- package/fesm2022/slotted-angular-menu.mjs +1211 -0
- package/fesm2022/slotted-angular-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-menubar.mjs +230 -0
- package/fesm2022/slotted-angular-menubar.mjs.map +1 -0
- package/fesm2022/slotted-angular-message-scroller.mjs +378 -0
- package/fesm2022/slotted-angular-message-scroller.mjs.map +1 -0
- package/fesm2022/slotted-angular-message.mjs +866 -0
- package/fesm2022/slotted-angular-message.mjs.map +1 -0
- package/fesm2022/slotted-angular-multi-select.mjs +1939 -0
- package/fesm2022/slotted-angular-multi-select.mjs.map +1 -0
- package/fesm2022/slotted-angular-navigation-menu.mjs +770 -0
- package/fesm2022/slotted-angular-navigation-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-notification-center.mjs +1172 -0
- package/fesm2022/slotted-angular-notification-center.mjs.map +1 -0
- package/fesm2022/slotted-angular-number-field.mjs +966 -0
- package/fesm2022/slotted-angular-number-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-otp-input.mjs +629 -0
- package/fesm2022/slotted-angular-otp-input.mjs.map +1 -0
- package/fesm2022/slotted-angular-page-header.mjs +788 -0
- package/fesm2022/slotted-angular-page-header.mjs.map +1 -0
- package/fesm2022/slotted-angular-page.mjs +255 -0
- package/fesm2022/slotted-angular-page.mjs.map +1 -0
- package/fesm2022/slotted-angular-pagination.mjs +562 -0
- package/fesm2022/slotted-angular-pagination.mjs.map +1 -0
- package/fesm2022/slotted-angular-popover.mjs +799 -0
- package/fesm2022/slotted-angular-popover.mjs.map +1 -0
- package/fesm2022/slotted-angular-progress-indicator.mjs +572 -0
- package/fesm2022/slotted-angular-progress-indicator.mjs.map +1 -0
- package/fesm2022/slotted-angular-prompt-composer.mjs +596 -0
- package/fesm2022/slotted-angular-prompt-composer.mjs.map +1 -0
- package/fesm2022/slotted-angular-prose.mjs +314 -0
- package/fesm2022/slotted-angular-prose.mjs.map +1 -0
- package/fesm2022/slotted-angular-radio-group.mjs +469 -0
- package/fesm2022/slotted-angular-radio-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-rating.mjs +1174 -0
- package/fesm2022/slotted-angular-rating.mjs.map +1 -0
- package/fesm2022/slotted-angular-result-state.mjs +330 -0
- package/fesm2022/slotted-angular-result-state.mjs.map +1 -0
- package/fesm2022/slotted-angular-saved-views.mjs +877 -0
- package/fesm2022/slotted-angular-saved-views.mjs.map +1 -0
- package/fesm2022/slotted-angular-scroll-area.mjs +294 -0
- package/fesm2022/slotted-angular-scroll-area.mjs.map +1 -0
- package/fesm2022/slotted-angular-section.mjs +266 -0
- package/fesm2022/slotted-angular-section.mjs.map +1 -0
- package/fesm2022/slotted-angular-segmented-control.mjs +454 -0
- package/fesm2022/slotted-angular-segmented-control.mjs.map +1 -0
- package/fesm2022/slotted-angular-select.mjs +1899 -0
- package/fesm2022/slotted-angular-select.mjs.map +1 -0
- package/fesm2022/slotted-angular-side-navigation.mjs +1042 -0
- package/fesm2022/slotted-angular-side-navigation.mjs.map +1 -0
- package/fesm2022/slotted-angular-skeleton.mjs +316 -0
- package/fesm2022/slotted-angular-skeleton.mjs.map +1 -0
- package/fesm2022/slotted-angular-slider.mjs +586 -0
- package/fesm2022/slotted-angular-slider.mjs.map +1 -0
- package/fesm2022/slotted-angular-sparkline.mjs +235 -0
- package/fesm2022/slotted-angular-sparkline.mjs.map +1 -0
- package/fesm2022/slotted-angular-split-button.mjs +331 -0
- package/fesm2022/slotted-angular-split-button.mjs.map +1 -0
- package/fesm2022/slotted-angular-splitter.mjs +516 -0
- package/fesm2022/slotted-angular-splitter.mjs.map +1 -0
- package/fesm2022/slotted-angular-stack.mjs +48 -0
- package/fesm2022/slotted-angular-stack.mjs.map +1 -0
- package/fesm2022/slotted-angular-stat-card.mjs +478 -0
- package/fesm2022/slotted-angular-stat-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-status-indicator.mjs +155 -0
- package/fesm2022/slotted-angular-status-indicator.mjs.map +1 -0
- package/fesm2022/slotted-angular-stepper.mjs +536 -0
- package/fesm2022/slotted-angular-stepper.mjs.map +1 -0
- package/fesm2022/slotted-angular-switch.mjs +447 -0
- package/fesm2022/slotted-angular-switch.mjs.map +1 -0
- package/fesm2022/slotted-angular-table-of-contents.mjs +750 -0
- package/fesm2022/slotted-angular-table-of-contents.mjs.map +1 -0
- package/fesm2022/slotted-angular-table.mjs +2518 -0
- package/fesm2022/slotted-angular-table.mjs.map +1 -0
- package/fesm2022/slotted-angular-tabs.mjs +829 -0
- package/fesm2022/slotted-angular-tabs.mjs.map +1 -0
- package/fesm2022/slotted-angular-tag.mjs +595 -0
- package/fesm2022/slotted-angular-tag.mjs.map +1 -0
- package/fesm2022/slotted-angular-tags-input.mjs +1211 -0
- package/fesm2022/slotted-angular-tags-input.mjs.map +1 -0
- package/fesm2022/slotted-angular-text-field.mjs +674 -0
- package/fesm2022/slotted-angular-text-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-textarea.mjs +275 -0
- package/fesm2022/slotted-angular-textarea.mjs.map +1 -0
- package/fesm2022/slotted-angular-theme.mjs +45 -0
- package/fesm2022/slotted-angular-theme.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-field.mjs +895 -0
- package/fesm2022/slotted-angular-time-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-picker.mjs +856 -0
- package/fesm2022/slotted-angular-time-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-range-picker.mjs +1534 -0
- package/fesm2022/slotted-angular-time-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-timeline.mjs +928 -0
- package/fesm2022/slotted-angular-timeline.mjs.map +1 -0
- package/fesm2022/slotted-angular-toast.mjs +917 -0
- package/fesm2022/slotted-angular-toast.mjs.map +1 -0
- package/fesm2022/slotted-angular-toggle-group.mjs +311 -0
- package/fesm2022/slotted-angular-toggle-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-toggle.mjs +162 -0
- package/fesm2022/slotted-angular-toggle.mjs.map +1 -0
- package/fesm2022/slotted-angular-toolbar.mjs +536 -0
- package/fesm2022/slotted-angular-toolbar.mjs.map +1 -0
- package/fesm2022/slotted-angular-tooltip.mjs +798 -0
- package/fesm2022/slotted-angular-tooltip.mjs.map +1 -0
- package/fesm2022/slotted-angular-top-navigation.mjs +1308 -0
- package/fesm2022/slotted-angular-top-navigation.mjs.map +1 -0
- package/fesm2022/slotted-angular-tour.mjs +1330 -0
- package/fesm2022/slotted-angular-tour.mjs.map +1 -0
- package/fesm2022/slotted-angular-transfer.mjs +1406 -0
- package/fesm2022/slotted-angular-transfer.mjs.map +1 -0
- package/fesm2022/slotted-angular-tree.mjs +1448 -0
- package/fesm2022/slotted-angular-tree.mjs.map +1 -0
- package/fesm2022/slotted-angular-typography.mjs +184 -0
- package/fesm2022/slotted-angular-typography.mjs.map +1 -0
- package/fesm2022/slotted-angular-upload.mjs +1523 -0
- package/fesm2022/slotted-angular-upload.mjs.map +1 -0
- package/fesm2022/slotted-angular-visually-hidden.mjs +32 -0
- package/fesm2022/slotted-angular-visually-hidden.mjs.map +1 -0
- package/fesm2022/slotted-angular-wizard.mjs +1715 -0
- package/fesm2022/slotted-angular-wizard.mjs.map +1 -0
- package/fesm2022/slotted-angular.mjs +4 -0
- package/fesm2022/slotted-angular.mjs.map +1 -0
- package/package.json +537 -3
- package/types/slotted-angular-accordion.d.ts +156 -0
- package/types/slotted-angular-accordion.d.ts.map +1 -0
- package/types/slotted-angular-action-bar.d.ts +291 -0
- package/types/slotted-angular-action-bar.d.ts.map +1 -0
- package/types/slotted-angular-action-sheet.d.ts +294 -0
- package/types/slotted-angular-action-sheet.d.ts.map +1 -0
- package/types/slotted-angular-alert.d.ts +214 -0
- package/types/slotted-angular-alert.d.ts.map +1 -0
- package/types/slotted-angular-app-shell.d.ts +549 -0
- package/types/slotted-angular-app-shell.d.ts.map +1 -0
- package/types/slotted-angular-aspect-ratio.d.ts +57 -0
- package/types/slotted-angular-aspect-ratio.d.ts.map +1 -0
- package/types/slotted-angular-attachment.d.ts +294 -0
- package/types/slotted-angular-attachment.d.ts.map +1 -0
- package/types/slotted-angular-avatar-group.d.ts +119 -0
- package/types/slotted-angular-avatar-group.d.ts.map +1 -0
- package/types/slotted-angular-avatar.d.ts +202 -0
- package/types/slotted-angular-avatar.d.ts.map +1 -0
- package/types/slotted-angular-badge.d.ts +166 -0
- package/types/slotted-angular-badge.d.ts.map +1 -0
- package/types/slotted-angular-breadcrumb.d.ts +251 -0
- package/types/slotted-angular-breadcrumb.d.ts.map +1 -0
- package/types/slotted-angular-button-group.d.ts +89 -0
- package/types/slotted-angular-button-group.d.ts.map +1 -0
- package/types/slotted-angular-button.d.ts +390 -0
- package/types/slotted-angular-button.d.ts.map +1 -0
- package/types/slotted-angular-calendar.d.ts +280 -0
- package/types/slotted-angular-calendar.d.ts.map +1 -0
- package/types/slotted-angular-card.d.ts +140 -0
- package/types/slotted-angular-card.d.ts.map +1 -0
- package/types/slotted-angular-carousel.d.ts +288 -0
- package/types/slotted-angular-carousel.d.ts.map +1 -0
- package/types/slotted-angular-cascader.d.ts +351 -0
- package/types/slotted-angular-cascader.d.ts.map +1 -0
- package/types/slotted-angular-chart.d.ts +319 -0
- package/types/slotted-angular-chart.d.ts.map +1 -0
- package/types/slotted-angular-checkbox-group.d.ts +156 -0
- package/types/slotted-angular-checkbox-group.d.ts.map +1 -0
- package/types/slotted-angular-checkbox.d.ts +197 -0
- package/types/slotted-angular-checkbox.d.ts.map +1 -0
- package/types/slotted-angular-code-block.d.ts +158 -0
- package/types/slotted-angular-code-block.d.ts.map +1 -0
- package/types/slotted-angular-collapsible.d.ts +272 -0
- package/types/slotted-angular-collapsible.d.ts.map +1 -0
- package/types/slotted-angular-color-picker.d.ts +181 -0
- package/types/slotted-angular-color-picker.d.ts.map +1 -0
- package/types/slotted-angular-column-manager.d.ts +200 -0
- package/types/slotted-angular-column-manager.d.ts.map +1 -0
- package/types/slotted-angular-combobox.d.ts +449 -0
- package/types/slotted-angular-combobox.d.ts.map +1 -0
- package/types/slotted-angular-command-palette.d.ts +256 -0
- package/types/slotted-angular-command-palette.d.ts.map +1 -0
- package/types/slotted-angular-container.d.ts +84 -0
- package/types/slotted-angular-container.d.ts.map +1 -0
- package/types/slotted-angular-context-menu.d.ts +84 -0
- package/types/slotted-angular-context-menu.d.ts.map +1 -0
- package/types/slotted-angular-currency-field.d.ts +480 -0
- package/types/slotted-angular-currency-field.d.ts.map +1 -0
- package/types/slotted-angular-dashboard-grid.d.ts +341 -0
- package/types/slotted-angular-dashboard-grid.d.ts.map +1 -0
- package/types/slotted-angular-data-grid.d.ts +1077 -0
- package/types/slotted-angular-data-grid.d.ts.map +1 -0
- package/types/slotted-angular-data-list.d.ts +272 -0
- package/types/slotted-angular-data-list.d.ts.map +1 -0
- package/types/slotted-angular-date-field.d.ts +320 -0
- package/types/slotted-angular-date-field.d.ts.map +1 -0
- package/types/slotted-angular-date-picker.d.ts +224 -0
- package/types/slotted-angular-date-picker.d.ts.map +1 -0
- package/types/slotted-angular-date-range-picker.d.ts +310 -0
- package/types/slotted-angular-date-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-datetime-field.d.ts +362 -0
- package/types/slotted-angular-datetime-field.d.ts.map +1 -0
- package/types/slotted-angular-datetime-picker.d.ts +370 -0
- package/types/slotted-angular-datetime-picker.d.ts.map +1 -0
- package/types/slotted-angular-datetime-range-picker.d.ts +459 -0
- package/types/slotted-angular-datetime-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-description-list.d.ts +281 -0
- package/types/slotted-angular-description-list.d.ts.map +1 -0
- package/types/slotted-angular-detail-panel.d.ts +240 -0
- package/types/slotted-angular-detail-panel.d.ts.map +1 -0
- package/types/slotted-angular-dialog.d.ts +497 -0
- package/types/slotted-angular-dialog.d.ts.map +1 -0
- package/types/slotted-angular-divider.d.ts +40 -0
- package/types/slotted-angular-divider.d.ts.map +1 -0
- package/types/slotted-angular-drawer.d.ts +532 -0
- package/types/slotted-angular-drawer.d.ts.map +1 -0
- package/types/slotted-angular-entity-picker.d.ts +338 -0
- package/types/slotted-angular-entity-picker.d.ts.map +1 -0
- package/types/slotted-angular-event-calendar.d.ts +574 -0
- package/types/slotted-angular-event-calendar.d.ts.map +1 -0
- package/types/slotted-angular-field-group.d.ts +152 -0
- package/types/slotted-angular-field-group.d.ts.map +1 -0
- package/types/slotted-angular-field.d.ts +535 -0
- package/types/slotted-angular-field.d.ts.map +1 -0
- package/types/slotted-angular-filter-bar.d.ts +573 -0
- package/types/slotted-angular-filter-bar.d.ts.map +1 -0
- package/types/slotted-angular-form.d.ts +298 -0
- package/types/slotted-angular-form.d.ts.map +1 -0
- package/types/slotted-angular-fullscreen.d.ts +145 -0
- package/types/slotted-angular-fullscreen.d.ts.map +1 -0
- package/types/slotted-angular-grid.d.ts +50 -0
- package/types/slotted-angular-grid.d.ts.map +1 -0
- package/types/slotted-angular-highlight.d.ts +93 -0
- package/types/slotted-angular-highlight.d.ts.map +1 -0
- package/types/slotted-angular-hover-card.d.ts +140 -0
- package/types/slotted-angular-hover-card.d.ts.map +1 -0
- package/types/slotted-angular-i18n.d.ts +46 -0
- package/types/slotted-angular-i18n.d.ts.map +1 -0
- package/types/slotted-angular-icon.d.ts +94 -0
- package/types/slotted-angular-icon.d.ts.map +1 -0
- package/types/slotted-angular-image.d.ts +251 -0
- package/types/slotted-angular-image.d.ts.map +1 -0
- package/types/slotted-angular-import-export-center.d.ts +351 -0
- package/types/slotted-angular-import-export-center.d.ts.map +1 -0
- package/types/slotted-angular-inline-message.d.ts +195 -0
- package/types/slotted-angular-inline-message.d.ts.map +1 -0
- package/types/slotted-angular-inline.d.ts +41 -0
- package/types/slotted-angular-inline.d.ts.map +1 -0
- package/types/slotted-angular-kbd.d.ts +174 -0
- package/types/slotted-angular-kbd.d.ts.map +1 -0
- package/types/slotted-angular-link.d.ts +94 -0
- package/types/slotted-angular-link.d.ts.map +1 -0
- package/types/slotted-angular-list-item.d.ts +210 -0
- package/types/slotted-angular-list-item.d.ts.map +1 -0
- package/types/slotted-angular-list.d.ts +176 -0
- package/types/slotted-angular-list.d.ts.map +1 -0
- package/types/slotted-angular-listbox.d.ts +470 -0
- package/types/slotted-angular-listbox.d.ts.map +1 -0
- package/types/slotted-angular-loading-overlay.d.ts +219 -0
- package/types/slotted-angular-loading-overlay.d.ts.map +1 -0
- package/types/slotted-angular-markdown.d.ts +172 -0
- package/types/slotted-angular-markdown.d.ts.map +1 -0
- package/types/slotted-angular-menu.d.ts +448 -0
- package/types/slotted-angular-menu.d.ts.map +1 -0
- package/types/slotted-angular-menubar.d.ts +90 -0
- package/types/slotted-angular-menubar.d.ts.map +1 -0
- package/types/slotted-angular-message-scroller.d.ts +151 -0
- package/types/slotted-angular-message-scroller.d.ts.map +1 -0
- package/types/slotted-angular-message.d.ts +348 -0
- package/types/slotted-angular-message.d.ts.map +1 -0
- package/types/slotted-angular-multi-select.d.ts +462 -0
- package/types/slotted-angular-multi-select.d.ts.map +1 -0
- package/types/slotted-angular-navigation-menu.d.ts +309 -0
- package/types/slotted-angular-navigation-menu.d.ts.map +1 -0
- package/types/slotted-angular-notification-center.d.ts +318 -0
- package/types/slotted-angular-notification-center.d.ts.map +1 -0
- package/types/slotted-angular-number-field.d.ts +402 -0
- package/types/slotted-angular-number-field.d.ts.map +1 -0
- package/types/slotted-angular-otp-input.d.ts +286 -0
- package/types/slotted-angular-otp-input.d.ts.map +1 -0
- package/types/slotted-angular-page-header.d.ts +334 -0
- package/types/slotted-angular-page-header.d.ts.map +1 -0
- package/types/slotted-angular-page.d.ts +141 -0
- package/types/slotted-angular-page.d.ts.map +1 -0
- package/types/slotted-angular-pagination.d.ts +213 -0
- package/types/slotted-angular-pagination.d.ts.map +1 -0
- package/types/slotted-angular-popover.d.ts +366 -0
- package/types/slotted-angular-popover.d.ts.map +1 -0
- package/types/slotted-angular-progress-indicator.d.ts +312 -0
- package/types/slotted-angular-progress-indicator.d.ts.map +1 -0
- package/types/slotted-angular-prompt-composer.d.ts +242 -0
- package/types/slotted-angular-prompt-composer.d.ts.map +1 -0
- package/types/slotted-angular-prose.d.ts +171 -0
- package/types/slotted-angular-prose.d.ts.map +1 -0
- package/types/slotted-angular-radio-group.d.ts +268 -0
- package/types/slotted-angular-radio-group.d.ts.map +1 -0
- package/types/slotted-angular-rating.d.ts +374 -0
- package/types/slotted-angular-rating.d.ts.map +1 -0
- package/types/slotted-angular-result-state.d.ts +217 -0
- package/types/slotted-angular-result-state.d.ts.map +1 -0
- package/types/slotted-angular-saved-views.d.ts +198 -0
- package/types/slotted-angular-saved-views.d.ts.map +1 -0
- package/types/slotted-angular-scroll-area.d.ts +186 -0
- package/types/slotted-angular-scroll-area.d.ts.map +1 -0
- package/types/slotted-angular-section.d.ts +143 -0
- package/types/slotted-angular-section.d.ts.map +1 -0
- package/types/slotted-angular-segmented-control.d.ts +251 -0
- package/types/slotted-angular-segmented-control.d.ts.map +1 -0
- package/types/slotted-angular-select.d.ts +507 -0
- package/types/slotted-angular-select.d.ts.map +1 -0
- package/types/slotted-angular-side-navigation.d.ts +373 -0
- package/types/slotted-angular-side-navigation.d.ts.map +1 -0
- package/types/slotted-angular-skeleton.d.ts +198 -0
- package/types/slotted-angular-skeleton.d.ts.map +1 -0
- package/types/slotted-angular-slider.d.ts +216 -0
- package/types/slotted-angular-slider.d.ts.map +1 -0
- package/types/slotted-angular-sparkline.d.ts +106 -0
- package/types/slotted-angular-sparkline.d.ts.map +1 -0
- package/types/slotted-angular-split-button.d.ts +180 -0
- package/types/slotted-angular-split-button.d.ts.map +1 -0
- package/types/slotted-angular-splitter.d.ts +206 -0
- package/types/slotted-angular-splitter.d.ts.map +1 -0
- package/types/slotted-angular-stack.d.ts +38 -0
- package/types/slotted-angular-stack.d.ts.map +1 -0
- package/types/slotted-angular-stat-card.d.ts +232 -0
- package/types/slotted-angular-stat-card.d.ts.map +1 -0
- package/types/slotted-angular-status-indicator.d.ts +106 -0
- package/types/slotted-angular-status-indicator.d.ts.map +1 -0
- package/types/slotted-angular-stepper.d.ts +198 -0
- package/types/slotted-angular-stepper.d.ts.map +1 -0
- package/types/slotted-angular-switch.d.ts +243 -0
- package/types/slotted-angular-switch.d.ts.map +1 -0
- package/types/slotted-angular-table-of-contents.d.ts +210 -0
- package/types/slotted-angular-table-of-contents.d.ts.map +1 -0
- package/types/slotted-angular-table.d.ts +888 -0
- package/types/slotted-angular-table.d.ts.map +1 -0
- package/types/slotted-angular-tabs.d.ts +340 -0
- package/types/slotted-angular-tabs.d.ts.map +1 -0
- package/types/slotted-angular-tag.d.ts +279 -0
- package/types/slotted-angular-tag.d.ts.map +1 -0
- package/types/slotted-angular-tags-input.d.ts +302 -0
- package/types/slotted-angular-tags-input.d.ts.map +1 -0
- package/types/slotted-angular-text-field.d.ts +334 -0
- package/types/slotted-angular-text-field.d.ts.map +1 -0
- package/types/slotted-angular-textarea.d.ts +150 -0
- package/types/slotted-angular-textarea.d.ts.map +1 -0
- package/types/slotted-angular-theme.d.ts +26 -0
- package/types/slotted-angular-theme.d.ts.map +1 -0
- package/types/slotted-angular-time-field.d.ts +300 -0
- package/types/slotted-angular-time-field.d.ts.map +1 -0
- package/types/slotted-angular-time-picker.d.ts +260 -0
- package/types/slotted-angular-time-picker.d.ts.map +1 -0
- package/types/slotted-angular-time-range-picker.d.ts +401 -0
- package/types/slotted-angular-time-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-timeline.d.ts +329 -0
- package/types/slotted-angular-timeline.d.ts.map +1 -0
- package/types/slotted-angular-toast.d.ts +340 -0
- package/types/slotted-angular-toast.d.ts.map +1 -0
- package/types/slotted-angular-toggle-group.d.ts +167 -0
- package/types/slotted-angular-toggle-group.d.ts.map +1 -0
- package/types/slotted-angular-toggle.d.ts +106 -0
- package/types/slotted-angular-toggle.d.ts.map +1 -0
- package/types/slotted-angular-toolbar.d.ts +252 -0
- package/types/slotted-angular-toolbar.d.ts.map +1 -0
- package/types/slotted-angular-tooltip.d.ts +388 -0
- package/types/slotted-angular-tooltip.d.ts.map +1 -0
- package/types/slotted-angular-top-navigation.d.ts +442 -0
- package/types/slotted-angular-top-navigation.d.ts.map +1 -0
- package/types/slotted-angular-tour.d.ts +440 -0
- package/types/slotted-angular-tour.d.ts.map +1 -0
- package/types/slotted-angular-transfer.d.ts +296 -0
- package/types/slotted-angular-transfer.d.ts.map +1 -0
- package/types/slotted-angular-tree.d.ts +499 -0
- package/types/slotted-angular-tree.d.ts.map +1 -0
- package/types/slotted-angular-typography.d.ts +89 -0
- package/types/slotted-angular-typography.d.ts.map +1 -0
- package/types/slotted-angular-upload.d.ts +365 -0
- package/types/slotted-angular-upload.d.ts.map +1 -0
- package/types/slotted-angular-visually-hidden.d.ts +19 -0
- package/types/slotted-angular-visually-hidden.d.ts.map +1 -0
- package/types/slotted-angular-wizard.d.ts +441 -0
- package/types/slotted-angular-wizard.d.ts.map +1 -0
- package/types/slotted-angular.d.ts +3 -0
- package/types/slotted-angular.d.ts.map +1 -0
|
@@ -0,0 +1,2518 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, Injectable, model, input, booleanAttribute, numberAttribute, output, ElementRef, signal, computed, forwardRef, ViewEncapsulation, ChangeDetectionStrategy, Component, HostAttributeToken, afterNextRender, DestroyRef, Directive } from '@angular/core';
|
|
3
|
+
import { nextSelection, createFilter } from '@slotted/core/collection';
|
|
4
|
+
import { getLiveAnnouncer } from '@slotted/core/live-announcer';
|
|
5
|
+
import { createControllable } from '@slotted/core/state';
|
|
6
|
+
import { injectMessages } from '@slotted/angular/i18n';
|
|
7
|
+
import { tableMessages } from '@slotted/core/i18n';
|
|
8
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
9
|
+
import { createScrollAffordance } from '@slotted/core/overflow';
|
|
10
|
+
import { parseISODate, isPlainDate, toISODate, parseISOTime, parseISODateTime, isPlainTime, toISOTime, isPlainDateTime } from '@slotted/core/date';
|
|
11
|
+
import { emptyFilter, defaultOperator, operatorsFor, isFilterActive, describeFilter, isConditionActive, operandCount, withCondition, withJoin, normalizeFilter, serializeFilter } from '@slotted/core/filter';
|
|
12
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
13
|
+
import { SlButton } from '@slotted/angular/button';
|
|
14
|
+
import { SlCheckbox } from '@slotted/angular/checkbox';
|
|
15
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
16
|
+
import { SlDateRangePicker, SlDateRangePickerPresets } from '@slotted/angular/date-range-picker';
|
|
17
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
18
|
+
import { SlDateTimeRangePicker, SlDateTimeRangePickerPresets } from '@slotted/angular/datetime-range-picker';
|
|
19
|
+
import { SlNumberField, SlNumberFieldInput } from '@slotted/angular/number-field';
|
|
20
|
+
import { SlPopover, SlPopoverContent, SlPopoverLayer, SlPopoverTrigger } from '@slotted/angular/popover';
|
|
21
|
+
import { SlRadio, SlRadioGroup } from '@slotted/angular/radio-group';
|
|
22
|
+
import { SlSelect, SlSelectItem } from '@slotted/angular/select';
|
|
23
|
+
import { SlTagsInput } from '@slotted/angular/tags-input';
|
|
24
|
+
import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
|
|
25
|
+
import { SlTimePicker } from '@slotted/angular/time-picker';
|
|
26
|
+
import { SlTimeRangePicker, SlTimeRangePickerPresets } from '@slotted/angular/time-range-picker';
|
|
27
|
+
import { SlGlyph, SlIcon } from '@slotted/angular/icon';
|
|
28
|
+
import { SlSkeleton } from '@slotted/angular/skeleton';
|
|
29
|
+
import * as i1 from '@slotted/angular/tooltip';
|
|
30
|
+
import { SlTooltip, SlTooltipContent, SlTooltipLayer, provideTooltipDefaults, SlTooltipTrigger } from '@slotted/angular/tooltip';
|
|
31
|
+
|
|
32
|
+
const FALLBACK = {
|
|
33
|
+
cellAlign: 'center',
|
|
34
|
+
columns: 1,
|
|
35
|
+
layout: 'auto',
|
|
36
|
+
selectionMode: 'none',
|
|
37
|
+
stickyFooter: false,
|
|
38
|
+
stickyHeader: false,
|
|
39
|
+
stickyTo: 'scroll',
|
|
40
|
+
striped: false,
|
|
41
|
+
variant: 'ruled',
|
|
42
|
+
};
|
|
43
|
+
const TABLE_DEFAULTS = new InjectionToken('slotted table defaults', {
|
|
44
|
+
providedIn: 'root',
|
|
45
|
+
factory: () => FALLBACK,
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* An application decides once how its tables are framed and how they select,
|
|
49
|
+
* rather than repeating the same inputs on every listing screen. A table that
|
|
50
|
+
* states any of them itself still wins. Its words come from the language in
|
|
51
|
+
* force (`provideSlotted`).
|
|
52
|
+
*/
|
|
53
|
+
function provideTableDefaults(defaults) {
|
|
54
|
+
return {
|
|
55
|
+
provide: TABLE_DEFAULTS,
|
|
56
|
+
useFactory: () => ({ ...FALLBACK, ...defaults }),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function injectTableDefaults() {
|
|
60
|
+
return inject(TABLE_DEFAULTS);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Application-scoped rather than module-scoped, for the reason `field` records:
|
|
64
|
+
* a module-level counter produces colliding sequences when two applications
|
|
65
|
+
* render in one server process, and the server and the client sequences must
|
|
66
|
+
* match for hydration.
|
|
67
|
+
*/
|
|
68
|
+
class SlTableIdFactory {
|
|
69
|
+
count = 0;
|
|
70
|
+
next() {
|
|
71
|
+
this.count += 1;
|
|
72
|
+
return `slotted-table-${this.count}`;
|
|
73
|
+
}
|
|
74
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableIdFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
75
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableIdFactory, providedIn: 'root' });
|
|
76
|
+
}
|
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableIdFactory, decorators: [{
|
|
78
|
+
type: Injectable,
|
|
79
|
+
args: [{ providedIn: 'root' }]
|
|
80
|
+
}] });
|
|
81
|
+
|
|
82
|
+
/** Every selectable row, in the order the body renders them. */
|
|
83
|
+
const TABLE_ROW_SELECTOR = '[data-part="body"] > [data-part="row"][data-value]';
|
|
84
|
+
/**
|
|
85
|
+
* A table of moderate data: the platform's own structure, with sorting,
|
|
86
|
+
* selection, expansion and a place for a paging control.
|
|
87
|
+
*
|
|
88
|
+
* **The role is `table`, not `grid`.** The APG is explicit — a table "is not an
|
|
89
|
+
* interactive widget. Thus, its cells are not focusable or selectable" — so
|
|
90
|
+
* every control inside it is its own tab stop and the family binds no key of
|
|
91
|
+
* its own. `data-grid` is the composite widget with a cell cursor.
|
|
92
|
+
*
|
|
93
|
+
* **The family holds the sort and reorders nothing.** The rows are the
|
|
94
|
+
* consumer's own, written with `@for` over their own array; reordering them
|
|
95
|
+
* would mean owning the data, which is the line between this family and
|
|
96
|
+
* `data-grid`.
|
|
97
|
+
*
|
|
98
|
+
* **The selection is a form value.** A bulk-action screen is a reactive form
|
|
99
|
+
* rather than a component with a callback, which no surveyed Angular table
|
|
100
|
+
* offers.
|
|
101
|
+
*/
|
|
102
|
+
class SlTable {
|
|
103
|
+
/** Which column the rows are ordered by. Two-way, so a template binds it. */
|
|
104
|
+
sort = model(null, /* @ts-ignore */
|
|
105
|
+
...(ngDevMode ? [{ debugName: "sort" }] : /* istanbul ignore next */ []));
|
|
106
|
+
/** The chosen rows, in the collection's own order. */
|
|
107
|
+
value = model([], /* @ts-ignore */
|
|
108
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
109
|
+
/** The rows whose detail is open. */
|
|
110
|
+
expanded = model([], /* @ts-ignore */
|
|
111
|
+
...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
|
|
112
|
+
variant = input(undefined, /* @ts-ignore */
|
|
113
|
+
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
114
|
+
layout = input(undefined, /* @ts-ignore */
|
|
115
|
+
...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
|
|
116
|
+
selectionMode = input(undefined, /* @ts-ignore */
|
|
117
|
+
...(ngDevMode ? [{ debugName: "selectionMode" }] : /* istanbul ignore next */ []));
|
|
118
|
+
/**
|
|
119
|
+
* Where every cell's content sits in a row as tall as its tallest cell. A
|
|
120
|
+
* cell states `blockAlign` to answer differently.
|
|
121
|
+
*/
|
|
122
|
+
cellAlign = input(undefined, /* @ts-ignore */
|
|
123
|
+
...(ngDevMode ? [{ debugName: "cellAlign" }] : /* istanbul ignore next */ []));
|
|
124
|
+
striped = input(undefined, { ...(ngDevMode ? { debugName: "striped" } : /* istanbul ignore next */ {}), transform: (state) => (state === undefined ? undefined : booleanAttribute(state)) });
|
|
125
|
+
stickyHeader = input(undefined, { ...(ngDevMode ? { debugName: "stickyHeader" } : /* istanbul ignore next */ {}), transform: (state) => (state === undefined ? undefined : booleanAttribute(state)) });
|
|
126
|
+
/**
|
|
127
|
+
* Holds the summary rows against the bottom of the same box the header is
|
|
128
|
+
* held against the top of, so a total does not scroll out of the view that
|
|
129
|
+
* exists to show it. It pins the `tfoot` and not the footer bar, which is
|
|
130
|
+
* outside the scroller and never leaves.
|
|
131
|
+
*/
|
|
132
|
+
stickyFooter = input(undefined, { ...(ngDevMode ? { debugName: "stickyFooter" } : /* istanbul ignore next */ {}), transform: (state) => (state === undefined ? undefined : booleanAttribute(state)) });
|
|
133
|
+
/**
|
|
134
|
+
* What the sticky header stays inside. `page` releases the family's own
|
|
135
|
+
* scroll container, so the table can no longer scroll sideways in its frame.
|
|
136
|
+
*/
|
|
137
|
+
stickyTo = input(undefined, /* @ts-ignore */
|
|
138
|
+
...(ngDevMode ? [{ debugName: "stickyTo" }] : /* istanbul ignore next */ []));
|
|
139
|
+
/**
|
|
140
|
+
* How many columns the table renders. The spanning parts — the detail row,
|
|
141
|
+
* the empty cell, the skeleton rows — need the number, and reading it from
|
|
142
|
+
* the DOM would be nothing on the server and a count on the client.
|
|
143
|
+
*/
|
|
144
|
+
columns = input(undefined, { ...(ngDevMode ? { debugName: "columns" } : /* istanbul ignore next */ {}), transform: (count) => (count === undefined ? undefined : numberAttribute(count)) });
|
|
145
|
+
/** A refresh over rows already shown: `aria-busy`, and nothing moves. */
|
|
146
|
+
loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
147
|
+
/**
|
|
148
|
+
* Words laid over the catalog of the language in force, key by key: the
|
|
149
|
+
* selection, expansion and sort words, the scrolling region's name and every
|
|
150
|
+
* word of the column filters.
|
|
151
|
+
*/
|
|
152
|
+
messages = input(undefined, /* @ts-ignore */
|
|
153
|
+
...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
|
|
154
|
+
/** One output per transition, each carrying the reason and the event. */
|
|
155
|
+
sortChangeRequest = output();
|
|
156
|
+
valueChangeRequest = output();
|
|
157
|
+
expandedChangeRequest = output();
|
|
158
|
+
defaults = injectTableDefaults();
|
|
159
|
+
host = inject(ElementRef);
|
|
160
|
+
id = inject(SlTableIdFactory).next();
|
|
161
|
+
/** Where a range starts: the row of the last press that held no modifier. */
|
|
162
|
+
anchor = undefined;
|
|
163
|
+
touched = undefined;
|
|
164
|
+
notify = undefined;
|
|
165
|
+
formDisabled = signal(false, /* @ts-ignore */
|
|
166
|
+
...(ngDevMode ? [{ debugName: "formDisabled" }] : /* istanbul ignore next */ []));
|
|
167
|
+
resolvedVariant = computed(() => this.variant() ?? this.defaults.variant, /* @ts-ignore */
|
|
168
|
+
...(ngDevMode ? [{ debugName: "resolvedVariant" }] : /* istanbul ignore next */ []));
|
|
169
|
+
resolvedLayout = computed(() => this.layout() ?? this.defaults.layout, /* @ts-ignore */
|
|
170
|
+
...(ngDevMode ? [{ debugName: "resolvedLayout" }] : /* istanbul ignore next */ []));
|
|
171
|
+
resolvedCellAlign = computed(() => this.cellAlign() ?? this.defaults.cellAlign, /* @ts-ignore */
|
|
172
|
+
...(ngDevMode ? [{ debugName: "resolvedCellAlign" }] : /* istanbul ignore next */ []));
|
|
173
|
+
resolvedMode = computed(() => this.selectionMode() ?? this.defaults.selectionMode, /* @ts-ignore */
|
|
174
|
+
...(ngDevMode ? [{ debugName: "resolvedMode" }] : /* istanbul ignore next */ []));
|
|
175
|
+
resolvedStriped = computed(() => this.striped() ?? this.defaults.striped, /* @ts-ignore */
|
|
176
|
+
...(ngDevMode ? [{ debugName: "resolvedStriped" }] : /* istanbul ignore next */ []));
|
|
177
|
+
resolvedStickyHeader = computed(() => this.stickyHeader() ?? this.defaults.stickyHeader, /* @ts-ignore */
|
|
178
|
+
...(ngDevMode ? [{ debugName: "resolvedStickyHeader" }] : /* istanbul ignore next */ []));
|
|
179
|
+
resolvedStickyFooter = computed(() => this.stickyFooter() ?? this.defaults.stickyFooter, /* @ts-ignore */
|
|
180
|
+
...(ngDevMode ? [{ debugName: "resolvedStickyFooter" }] : /* istanbul ignore next */ []));
|
|
181
|
+
resolvedStickyTo = computed(() => this.stickyTo() ?? this.defaults.stickyTo, /* @ts-ignore */
|
|
182
|
+
...(ngDevMode ? [{ debugName: "resolvedStickyTo" }] : /* istanbul ignore next */ []));
|
|
183
|
+
resolvedColumns = computed(() => this.columns() ?? this.defaults.columns, /* @ts-ignore */
|
|
184
|
+
...(ngDevMode ? [{ debugName: "resolvedColumns" }] : /* istanbul ignore next */ []));
|
|
185
|
+
/** The family's words in the language in force, with this table's `messages` laid over them. */
|
|
186
|
+
t = injectMessages(tableMessages, this.messages);
|
|
187
|
+
isSelected(key) {
|
|
188
|
+
return this.value().includes(key);
|
|
189
|
+
}
|
|
190
|
+
isExpanded(key) {
|
|
191
|
+
return this.expanded().includes(key);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Every selectable row's value, read out of the DOM at the moment it is
|
|
195
|
+
* needed rather than kept in a registry. A registry holds the order rows were
|
|
196
|
+
* created in, and a sorted table renders the same rows in a new order without
|
|
197
|
+
* destroying one of them — so the range and the select-all would run against
|
|
198
|
+
* the order before the sort.
|
|
199
|
+
*/
|
|
200
|
+
rows() {
|
|
201
|
+
return [...this.host.nativeElement.querySelectorAll(TABLE_ROW_SELECTOR)]
|
|
202
|
+
.filter((row) => !row.hasAttribute('data-disabled'))
|
|
203
|
+
.map((row) => row.getAttribute('data-value') ?? '');
|
|
204
|
+
}
|
|
205
|
+
requestSort(column, source) {
|
|
206
|
+
/**
|
|
207
|
+
* Ascending, descending, then none — the third state Material and Ant both
|
|
208
|
+
* ship and Carbon does not. A reader who sorted a column by accident has no
|
|
209
|
+
* other way back.
|
|
210
|
+
*/
|
|
211
|
+
const held = this.sort();
|
|
212
|
+
const next = held?.column !== column
|
|
213
|
+
? { column, direction: 'ascending' }
|
|
214
|
+
: held.direction === 'ascending'
|
|
215
|
+
? { column, direction: 'descending' }
|
|
216
|
+
: null;
|
|
217
|
+
const state = createControllable({
|
|
218
|
+
initial: held,
|
|
219
|
+
equals: (a, b) => a?.column === b?.column && a?.direction === b?.direction,
|
|
220
|
+
onRequest: (request) => this.sortChangeRequest.emit(request),
|
|
221
|
+
});
|
|
222
|
+
const moved = state.request(next, next === null ? 'clear' : 'pointer', source);
|
|
223
|
+
/**
|
|
224
|
+
* `aria-sort` is a property, and a property that changes silently is a
|
|
225
|
+
* change no reader hears. None of the six surveyed implementations says it.
|
|
226
|
+
*/
|
|
227
|
+
const heading = source?.currentTarget?.textContent?.trim() ?? column;
|
|
228
|
+
const said = next === null
|
|
229
|
+
? this.t('sortCleared', { column: heading })
|
|
230
|
+
: next.direction === 'ascending'
|
|
231
|
+
? this.t('sortedAscending', { column: heading })
|
|
232
|
+
: this.t('sortedDescending', { column: heading });
|
|
233
|
+
getLiveAnnouncer(this.host.nativeElement.ownerDocument).announce(said);
|
|
234
|
+
if (moved)
|
|
235
|
+
this.sort.set(next);
|
|
236
|
+
}
|
|
237
|
+
toggleSelected(key, options) {
|
|
238
|
+
const result = nextSelection({
|
|
239
|
+
action: options.range && this.resolvedMode() === 'multiple' ? 'range' : 'toggle',
|
|
240
|
+
anchor: this.anchor,
|
|
241
|
+
behavior: 'toggle',
|
|
242
|
+
key,
|
|
243
|
+
keys: this.rows(),
|
|
244
|
+
mode: this.resolvedMode(),
|
|
245
|
+
selected: this.value(),
|
|
246
|
+
});
|
|
247
|
+
if (!options.range)
|
|
248
|
+
this.anchor = key;
|
|
249
|
+
this.requestValue(result.selected, options.range ? 'select' : 'pointer', options.source);
|
|
250
|
+
}
|
|
251
|
+
toggleSelectAll(source) {
|
|
252
|
+
const result = nextSelection({
|
|
253
|
+
action: 'all',
|
|
254
|
+
keys: this.rows(),
|
|
255
|
+
mode: this.resolvedMode(),
|
|
256
|
+
selected: this.value(),
|
|
257
|
+
});
|
|
258
|
+
this.requestValue(result.selected, result.selected.length === 0 ? 'clear' : 'select', source);
|
|
259
|
+
}
|
|
260
|
+
toggleExpanded(key, source) {
|
|
261
|
+
const held = this.expanded();
|
|
262
|
+
const next = held.includes(key) ? held.filter((open) => open !== key) : [...held, key];
|
|
263
|
+
const state = createControllable({
|
|
264
|
+
initial: held,
|
|
265
|
+
equals: (a, b) => a.length === b.length && a.every((open, index) => open === b[index]),
|
|
266
|
+
onRequest: (request) => this.expandedChangeRequest.emit(request),
|
|
267
|
+
});
|
|
268
|
+
if (state.request(next, 'pointer', source))
|
|
269
|
+
this.expanded.set(next);
|
|
270
|
+
}
|
|
271
|
+
/** The form's own value is the selection, which is what a bulk action acts on. */
|
|
272
|
+
writeValue(value) {
|
|
273
|
+
this.value.set(value ?? []);
|
|
274
|
+
}
|
|
275
|
+
registerOnChange(fn) {
|
|
276
|
+
this.notify = fn;
|
|
277
|
+
}
|
|
278
|
+
registerOnTouched(fn) {
|
|
279
|
+
this.touched = fn;
|
|
280
|
+
}
|
|
281
|
+
setDisabledState(isDisabled) {
|
|
282
|
+
this.formDisabled.set(isDisabled);
|
|
283
|
+
}
|
|
284
|
+
disabledByForm = computed(() => this.formDisabled(), /* @ts-ignore */
|
|
285
|
+
...(ngDevMode ? [{ debugName: "disabledByForm" }] : /* istanbul ignore next */ []));
|
|
286
|
+
requestValue(next, reason, source) {
|
|
287
|
+
const state = createControllable({
|
|
288
|
+
initial: this.value(),
|
|
289
|
+
equals: (a, b) => a.length === b.length && a.every((key, index) => key === b[index]),
|
|
290
|
+
onRequest: (request) => this.valueChangeRequest.emit(request),
|
|
291
|
+
});
|
|
292
|
+
if (!state.request(next, reason, source))
|
|
293
|
+
return;
|
|
294
|
+
this.value.set(next);
|
|
295
|
+
this.notify?.(next);
|
|
296
|
+
this.touched?.();
|
|
297
|
+
}
|
|
298
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
299
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlTable, isStandalone: true, selector: "div[slTable]", inputs: { sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, cellAlign: { classPropertyName: "cellAlign", publicName: "cellAlign", isSignal: true, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, stickyFooter: { classPropertyName: "stickyFooter", publicName: "stickyFooter", isSignal: true, isRequired: false, transformFunction: null }, stickyTo: { classPropertyName: "stickyTo", publicName: "stickyTo", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", value: "valueChange", expanded: "expandedChange", sortChangeRequest: "sortChangeRequest", valueChangeRequest: "valueChangeRequest", expandedChangeRequest: "expandedChangeRequest" }, host: { attributes: { "data-ui": "table", "data-part": "root" }, properties: { "attr.data-variant": "resolvedVariant()", "attr.data-layout": "resolvedLayout()", "attr.data-cell-align": "resolvedCellAlign()", "attr.data-striped": "resolvedStriped() ? '' : null", "attr.data-sticky-header": "resolvedStickyHeader() ? '' : null", "attr.data-sticky-footer": "resolvedStickyFooter() ? '' : null", "attr.data-sticky-to": "resolvedStickyTo()", "attr.data-loading": "loading() ? '' : null" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SlTable), multi: true }], exportAs: ["slTable"], ngImport: i0, template: '<ng-content />', isInline: true, styles: ["@layer slotted.components{[data-ui=table][data-part=root]{--_row-min-block: var( --slotted-table-row-min-block-size, var(--slotted-control-height-md, 34px) );--_font-size: var(--slotted-table-font-size, var(--slotted-control-font-size-md, 13px));--_icon-size: var(--slotted-table-icon-size, var(--slotted-control-icon-size-md, 16px));--_gap: var(--slotted-table-gap, var(--slotted-control-gap-md, 8px));--_pad-inline: var( --slotted-table-cell-padding-inline, var(--slotted-control-padding-inline-md, 13px) );--_pad-block: var( --slotted-table-cell-padding-block, max( var(--slotted-space-2, .25rem), calc((var(--_row-min-block) - var(--_font-size) * var(--slotted-line-height-md, 1.5)) / 2) ) );--_line: calc(var(--_font-size) * var(--slotted-line-height-md, 1.5));--_radius: var(--slotted-table-radius, var(--slotted-radius-md, 6px));--_rule: var(--slotted-table-border-color, var(--slotted-border-subtle, ButtonBorder));--_rule-strong: var( --slotted-table-border-color-strong, var(--slotted-border-strong, ButtonBorder) );--_rule-width: var(--slotted-table-border-width, var(--slotted-border-width-thin, 1px));--_text: var(--slotted-table-color, var(--slotted-text, CanvasText));--_muted: var(--slotted-table-color-muted, var(--slotted-text-muted, GrayText));--_surface: var(--slotted-table-surface, var(--slotted-ground, var(--slotted-surface, Canvas)));--_head-surface: var( --slotted-table-header-surface, color-mix(in oklab, var(--slotted-text, CanvasText) 8%, var(--_surface)) );--_stripe: var( --slotted-table-row-surface-stripe, color-mix(in oklab, var(--slotted-text, CanvasText) 5%, var(--_surface)) );--_hover: var( --slotted-table-row-surface-hover, var(--slotted-tone-secondary-subtle-hover, ButtonFace) );--_selected: var( --slotted-table-row-surface-selected, var(--slotted-tone-accent-surface, Canvas) );--_selected-hover: var( --slotted-table-row-surface-selected-hover, var(--slotted-tone-accent-subtle-hover, ButtonFace) );--_selected-text: var( --slotted-table-row-color-selected, var(--slotted-tone-accent-text, CanvasText) );background-color:var(--_surface);box-sizing:border-box;color:var(--_text);display:block;isolation:isolate;font-family:var(--slotted-table-font-family, var(--slotted-control-font-family));font-size:var(--_font-size);line-height:var(--slotted-line-height-md, 1.5);max-inline-size:100%}[data-ui=table][data-variant=framed]{border:var(--_rule-width) solid var(--_rule);border-radius:var(--_radius);box-shadow:var(--slotted-table-shadow, var(--slotted-shadow-xs, none));overflow:clip}[data-ui=table] [data-part=scroll]{overflow:auto;overscroll-behavior-inline:contain}[data-ui=table] [data-part=scroll]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:calc(var(--slotted-focus-ring-offset, 2px) * -1)}[data-ui=table] [data-part=table]{border-collapse:separate;border-spacing:0;inline-size:max-content;min-inline-size:100%;text-align:start}[data-ui=table][data-layout=fixed] [data-part=table]{inline-size:100%;table-layout:fixed}[data-ui=table] [data-part=caption]{caption-side:block-start;color:var(--_muted);font-size:var(--slotted-font-size-xs, .75rem);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);text-align:start}[data-ui=table] [data-part=column-header],[data-ui=table] [data-part=head] [data-part=selection]{background-color:var(--_head-surface);border-block-end:var(--_rule-width) solid var(--_rule-strong);color:var(--_text);font-weight:var(--slotted-font-weight-semibold, 600);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);position:relative;text-align:start;vertical-align:bottom}[data-ui=table][data-variant=plain] [data-part=column-header]{background-color:transparent}[data-ui=table] [data-part=row]{background-color:var(--_surface)}[data-ui=table]{--_cell-align: middle}[data-ui=table][data-cell-align=start]{--_cell-align: top}[data-ui=table][data-cell-align=end]{--_cell-align: bottom}[data-ui=table] [data-part=cell],[data-ui=table] [data-part=row-header]{padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);text-align:start;vertical-align:var(--_cell-align)}[data-ui=table] [data-block-align=start]{vertical-align:top}[data-ui=table] [data-block-align=center]{vertical-align:middle}[data-ui=table] [data-block-align=end]{vertical-align:bottom}[data-ui=table] :is([data-part=cell],[data-part=row-header]):has(>[data-part=root][data-variant=plain]:is([data-ui=select],[data-ui=combobox],[data-ui=multi-select],[data-ui=text-field],[data-ui=textarea],[data-ui=number-field],[data-ui=currency-field],[data-ui=date-field],[data-ui=time-field],[data-ui=datetime-field],[data-ui=tags-input],[data-ui=date-range-picker],[data-ui=time-range-picker],[data-ui=datetime-range-picker],[data-ui=entity-picker])){--slotted-control-padding-inline-sm: var(--_pad-inline);--slotted-control-padding-inline-md: var(--_pad-inline);--slotted-control-padding-inline-lg: var(--_pad-inline);--slotted-control-height-sm: var(--_row-min-block);--slotted-control-height-md: var(--_row-min-block);--slotted-control-height-lg: var(--_row-min-block);padding:0}[data-ui=table] [data-part=row-header]{font-weight:var(--slotted-font-weight-medium, 500)}[data-ui=table]:is([data-variant=ruled],[data-variant=framed]) [data-part=body]>[data-part=row]>*{border-block-end:var(--_rule-width) solid var(--_rule)}[data-ui=table]:is([data-variant=ruled],[data-variant=framed]) [data-part=body]>[data-part=row]:last-child>*{border-block-end-color:transparent}[data-ui=table][data-striped] [data-part=body]>[data-part=row]:nth-child(2n){background-color:var(--_stripe)}[data-ui=table] [data-part=body]>[data-part=row]:not([data-disabled]):hover{background-color:var(--_hover)}[data-ui=table] [data-part=body]>[data-part=row][data-selected]{background-color:var(--_selected);color:var(--_selected-text)}[data-ui=table] [data-part=body]>[data-part=row][data-selected]:not([data-disabled]):hover{background-color:var(--_selected-hover)}[data-ui=table] [data-part=row][data-disabled]{color:var(--slotted-disabled-foreground, GrayText)}[data-ui=table] [data-align=start]{text-align:start}[data-ui=table] [data-align=center]{text-align:center}[data-ui=table] [data-align=end]{text-align:end}[data-ui=table] [data-numeric]{font-variant-numeric:tabular-nums}[data-ui=table] [data-numeric]:not([data-align]){text-align:end}[data-ui=table] [data-text=wrap]{overflow-wrap:anywhere}[data-ui=table] [data-text=nowrap]{white-space:nowrap}[data-ui=table] [data-text=truncate]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-ui=table][data-sticky-header] [data-part=column-header],[data-ui=table][data-sticky-header] [data-part=head] [data-part=selection]{inset-block-start:var(--slotted-table-sticky-offset, 0);position:sticky;z-index:calc(var(--slotted-z-index-sticky, 100) + 1)}[data-ui=table][data-sticky-to=page] [data-part=scroll]{overflow:visible}[data-ui=table][data-sticky-footer] [data-part=summary]>[data-part=row]>*{inset-block-end:var(--slotted-table-sticky-offset-end, 0);position:sticky;z-index:calc(var(--slotted-z-index-sticky, 100) + 1)}[data-ui=table][data-sticky-footer] [data-part=summary] [data-sticky]{z-index:calc(var(--slotted-z-index-sticky, 100) + 2)}[data-ui=table] [data-sticky=start]{background-color:inherit;inset-inline-start:var(--slotted-table-sticky-inset, 0);position:sticky;z-index:var(--slotted-z-index-sticky, 100)}[data-ui=table] [data-sticky=end]{background-color:inherit;inset-inline-end:var(--slotted-table-sticky-inset, 0);position:sticky;z-index:var(--slotted-z-index-sticky, 100)}[data-ui=table][data-sticky-header] [data-part=column-header][data-sticky],[data-ui=table][data-sticky-header] [data-part=head] [data-part=selection][data-sticky]{background-color:var(--_head-surface);z-index:calc(var(--slotted-z-index-sticky, 100) + 2)}[data-ui=table] [data-sticky]:after{background-color:var(--slotted-table-border-color, var(--slotted-border-subtle));content:\"\";inline-size:var(--_rule-width);inset-block:calc(var(--_rule-width) * -1) 0;position:absolute;z-index:1}[data-ui=table] [data-sticky=start]:after{inset-inline-end:0}[data-ui=table] [data-sticky=end]:after{inset-inline-start:0}[data-ui=table] [data-part=column-header]:has(>[data-part=sort]){padding:0}[data-ui=table] [data-part=column-header]:has(>[data-part=column-actions]){--_actions-room: var( --slotted-table-column-actions-size, calc(var(--_pad-inline) + var(--slotted-target-min, 24px) + var(--_gap)) );padding-inline-end:var(--_actions-room)}[data-ui=table] [data-part=column-actions]{align-items:center;display:inline-flex;gap:var(--_gap);inset-block:0;inset-inline-end:var(--_pad-inline);position:absolute}[data-ui=table] [data-part=sort]{align-items:center;background-color:transparent;border:0;color:inherit;cursor:pointer;display:flex;font:inherit;gap:var(--_gap);inline-size:100%;justify-content:space-between;min-block-size:var(--slotted-target-min, 24px);min-inline-size:0;padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);text-align:inherit}[data-ui=table] [data-align=center]>[data-part=sort]{justify-content:center}[data-ui=table] :is([data-align=end],[data-numeric]:not([data-align]))>[data-part=sort]{justify-content:end}[data-ui=table] [data-part=column-header]:has(>[data-part=sort]:not(:disabled)):hover{background-color:var( --slotted-table-header-surface-hover, color-mix(in oklab, var(--slotted-text, CanvasText) 7%, var(--_head-surface)) )}[data-ui=table] [data-part=column-header]{transition:background-color var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}[data-ui=table] [data-part=sort]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:calc(var(--slotted-focus-ring-offset, 2px) * -1)}[data-ui=table] [data-part=sort]>[data-ui=icon]{--slotted-icon-size: var(--_icon-size);opacity:0;transition:opacity var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard)),rotate var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}[data-ui=table] [data-part=sort]:not(:disabled):hover>[data-ui=icon],[data-ui=table] [data-part=sort]:focus-visible>[data-ui=icon]{opacity:.55}[data-ui=table] [aria-sort]>[data-part=sort]>[data-ui=icon]{opacity:1}[data-ui=table] [aria-sort=ascending]>[data-part=sort]>[data-ui=icon]{rotate:180deg}[data-ui=table] [data-part=selection]{inline-size:var(--slotted-table-selection-size, 3rem);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);text-align:center;vertical-align:var(--_cell-align);white-space:nowrap}[data-ui=table] [data-part=selection]>[data-ui=checkbox]{block-size:var(--_line)}[data-ui=table] [data-part=selection]{--slotted-selection-halo-opacity: 0}[data-ui=table] [data-part=cell]:has(>[data-part=expander]){inline-size:1%;padding-inline-end:0;white-space:nowrap}[data-ui=table] [data-part=column-actions] *:has([data-part=filter]){display:contents}[data-ui=table] [data-part=expander],[data-ui=table] [data-part=column-actions]>button,[data-ui=table] button[data-part=column-actions],[data-ui=table] [data-part=filter]{background-color:transparent;border:0;border-radius:var(--slotted-table-control-radius, var(--slotted-radius-sm, 4px));color:var(--_muted);cursor:pointer;display:inline-flex;block-size:var(--slotted-target-min, 24px);inline-size:var(--slotted-target-min, 24px);margin-block:calc((var(--_line) - var(--slotted-target-min, 24px)) / 2);padding:0;align-items:center;justify-content:center;transition:background-color var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}@media(pointer:coarse){[data-ui=table] [data-part=expander],[data-ui=table] [data-part=column-actions]>button,[data-ui=table] button[data-part=column-actions],[data-ui=table] [data-part=filter]{position:relative}[data-ui=table] [data-part=expander]:after,[data-ui=table] [data-part=column-actions]>button:after,[data-ui=table] button[data-part=column-actions]:after,[data-ui=table] [data-part=filter]:after{content:\"\";inset:min(0px,calc((100% - var(--slotted-target-comfortable, 44px)) / 2));position:absolute}[data-ui=table] [data-part=column-actions]>button:after,[data-ui=table] button[data-part=column-actions]:after,[data-ui=table] [data-part=filter]:after{inset-inline-start:0}}[data-ui=table] [data-part=expander]:not(:disabled):hover{background-color:var(--_hover);color:var(--_text)}[data-ui=table] [data-part=column-actions]>button:not(:disabled):hover,[data-ui=table] button[data-part=column-actions]:not(:disabled):hover,[data-ui=table] [data-part=filter]:not(:disabled):hover{background-color:var( --slotted-table-header-surface-hover, color-mix(in oklab, var(--slotted-text, CanvasText) 7%, var(--_head-surface)) );color:var(--_text)}[data-ui=table] [data-part=expander]:focus-visible,[data-ui=table] [data-part=column-actions]>button:focus-visible,[data-ui=table] button[data-part=column-actions]:focus-visible,[data-ui=table] [data-part=filter]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:0}[data-ui=table] :is([data-part=column-actions],[data-part=filter]) :is(svg,img){block-size:var(--_icon-size);inline-size:var(--_icon-size)}[data-ui=table] [data-part=filter][data-filtered],[data-ui=table] [data-part=filter][data-filtered]:not(:disabled):hover{color:var(--slotted-tone-accent-text, LinkText)}[data-ui=table][data-part=filter-panel]{--_gap: var(--slotted-table-gap, var(--slotted-control-gap-md, 8px));--_font-size: var(--slotted-table-font-size, var(--slotted-control-font-size-md, 13px));--_line: calc(var(--_font-size) * var(--slotted-line-height-md, 1.5));--_pad-block: var(--slotted-space-2, 4px);--_text: var(--slotted-table-color, var(--slotted-text, CanvasText));--_muted: var(--slotted-table-color-muted, var(--slotted-text-muted, GrayText));--_rule: var(--slotted-table-border-color, var(--slotted-border-subtle, ButtonBorder));--_rule-width: var(--slotted-table-border-width, var(--slotted-border-width-thin, 1px));--_hover: var( --slotted-table-row-surface-hover, var(--slotted-tone-secondary-subtle-hover, ButtonFace) );box-sizing:border-box;display:grid;gap:var(--_gap);color:var(--_text);font-size:var(--_font-size);font-weight:var(--slotted-font-weight-regular, 400);line-height:var(--slotted-line-height-md, 1.5);padding:var(--slotted-space-5, 12px);min-inline-size:min(17rem,var(--slotted-positioner-available-width, 100%));max-inline-size:100%}[data-ui=table][data-part=filter-panel] [data-part=filter-condition]{display:grid;gap:calc(var(--_gap) / 2)}[data-ui=table][data-part=filter-panel] [data-part=filter-operator],[data-ui=table][data-part=filter-panel] [data-part=filter-search]{display:block}[data-ui=table][data-part=filter-panel] [data-part=filter-operand]{display:grid;gap:calc(var(--_gap) / 2);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr))}[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-kind=set]{grid-template-columns:1fr;gap:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-range],[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-kind=datetime],[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-operand=tags]{grid-template-columns:1fr}[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-kind=time]:not([data-range]){grid-template-columns:repeat(auto-fit,minmax(8rem,1fr))}[data-ui=table][data-part=filter-panel] [data-part=filter-join]{align-items:center;border-block-start:var(--_rule-width) solid var(--_rule);display:flex;flex-wrap:wrap;gap:var(--_gap);padding-block-start:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-join]>[data-label]{color:var(--_muted)}[data-ui=table][data-part=filter-panel] [data-part=filter-list]{display:grid;gap:var(--_gap);max-block-size:calc(var(--_line) * 9);overflow-y:auto;padding-inline-end:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-option]{--slotted-selection-halo-opacity: 0;align-items:center;border-radius:var(--slotted-table-control-radius, var(--slotted-radius-sm, 4px));display:flex;gap:var(--_gap);justify-content:space-between;margin-inline:calc(var(--_gap) * -1);padding-inline:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-option]:not([data-disabled]):hover{background-color:var(--_hover)}[data-ui=table][data-part=filter-panel] [data-part=filter-option]>[data-count]{color:var(--_muted);font-variant-numeric:tabular-nums}[data-ui=table][data-part=filter-panel] [data-part=filter-option][data-covering]{border-block-end:var(--_rule-width) solid var(--_rule);padding-block-end:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-empty]{color:var(--_muted);padding-block:var(--_pad-block);text-align:center}[data-ui=table][data-part=filter-panel] [data-part=filter-actions]{border-block-start:var(--_rule-width) solid var(--_rule);display:flex;gap:var(--_gap);justify-content:space-between;padding-block-start:var(--_gap)}[data-ui=table] [data-part=expander]>[data-ui=icon]{--slotted-icon-size: var(--_icon-size);rotate:0deg;transition:rotate var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}[data-ui=table] [data-part=expander][aria-expanded=true]>[data-ui=icon]{rotate:90deg}[data-ui=table]:dir(rtl) [data-part=expander]>[data-ui=icon]{scale:-1 1}[data-ui=table]:dir(rtl) [data-part=expander][aria-expanded=true]>[data-ui=icon]{rotate:-90deg}[data-ui=table] [data-part=detail]{background-color:var(--_stripe)}[data-ui=table] [data-part=detail]>[data-part=cell]{padding-block:var(--_pad-block);padding-inline:var(--_pad-inline)}[data-ui=table][data-striped] [data-part=body]>[data-part=detail]{background-color:var(--_stripe)}[data-ui=table] [data-part=empty]{color:var(--_muted);padding-block:var(--slotted-space-9, 2rem);padding-inline:var(--_pad-inline);text-align:center}[data-ui=table] [data-part=loader]>[data-part=row]>*{padding-block:var(--_pad-block);padding-inline:var(--_pad-inline)}[data-ui=table][data-loading] [data-part=body]{opacity:.55;transition:opacity var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}[data-ui=table] [data-part=summary]>[data-part=row]>*{background-color:var(--_head-surface);border-block-start:var(--_rule-width) solid var(--_rule-strong);font-weight:var(--slotted-font-weight-medium, 500);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline)}[data-ui=table][data-variant=plain] [data-part=summary]>[data-part=row]>*{background-color:transparent}[data-ui=table] [data-part=footer]{align-items:center;border-block-start:var(--_rule-width) solid var(--_rule);display:flex;flex-wrap:wrap;gap:var(--_gap);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline)}[data-ui=table] [data-part=footer]>:last-child{flex:1 1 auto;justify-content:end}@media print{[data-ui=table] [data-part=scroll]{max-block-size:none;overflow:visible}[data-ui=table][data-sticky-header] [data-part=column-header],[data-ui=table][data-sticky-header] [data-part=head] [data-part=selection],[data-ui=table][data-sticky-footer] [data-part=summary]>[data-part=row]>*,[data-ui=table] [data-sticky]{position:static}}}\n", "@layer slotted.components{[data-ui=checkbox][data-part=root]{--_size: var(--slotted-checkbox-size, var(--slotted-selection-size-md, 16px));--_font-size: var(--slotted-control-font-size-md, 13px);--_gap: var(--slotted-control-label-gap-md, 12px);--_line-height: var(--slotted-checkbox-line-height, var(--slotted-line-height-md, 1.5));--_mark-inset: var(--slotted-checkbox-mark-inset, 2px);--_mark-size: calc(var(--_size) - 2 * var(--_mark-inset));--_halo-spread: calc(var(--_gap) / 2);--_target: var(--slotted-target-min, 24px);--_lift: calc((var(--_font-size) * var(--_line-height) - var(--_size)) / 2);--_description-gap: var(--slotted-space-3, .375rem);align-content:start;color:var(--slotted-checkbox-color, var(--slotted-text, CanvasText));display:grid;font-family:var(--slotted-control-font-family, system-ui, sans-serif);font-size:var(--_font-size);grid-template-columns:auto minmax(0,1fr);isolation:isolate;line-height:var(--_line-height);position:relative}[data-ui=checkbox][data-part=root]{--_direction: ltr}[data-ui=checkbox][data-part=root]:dir(rtl){--_direction: rtl}[data-ui=checkbox][data-part=root][data-size=sm]{--_size: var(--slotted-checkbox-size, var(--slotted-selection-size-sm, 14px));--_font-size: var(--slotted-control-font-size-sm, 12px);--_gap: var(--slotted-control-label-gap-sm, 8px);--_tile-inset: var( --slotted-checkbox-tile-inset, var(--slotted-control-padding-inline-sm, 10px) )}[data-ui=checkbox][data-part=root][data-size=md]{--_size: var(--slotted-checkbox-size, var(--slotted-selection-size-md, 16px));--_font-size: var(--slotted-control-font-size-md, 13px);--_gap: var(--slotted-control-label-gap-md, 12px);--_tile-inset: var( --slotted-checkbox-tile-inset, var(--slotted-control-padding-inline-md, 13px) )}[data-ui=checkbox][data-part=root][data-size=lg]{--_size: var(--slotted-checkbox-size, var(--slotted-selection-size-lg, 18px));--_font-size: var(--slotted-control-font-size-lg, 14px);--_gap: var(--slotted-control-label-gap-lg, 12px);--_tile-inset: var( --slotted-checkbox-tile-inset, var(--slotted-control-padding-inline-lg, 16px) )}[data-ui=checkbox] [data-part=control]{appearance:none;background-color:var(--slotted-checkbox-background, var(--slotted-surface, Canvas));border:var(--slotted-checkbox-border-width, var(--slotted-border-width-medium, 1.5px)) solid var(--slotted-checkbox-border-color, var(--slotted-border-strong, ButtonBorder));border-radius:var(--slotted-checkbox-radius, var(--slotted-radius-xs, 2px));block-size:var(--_size);box-sizing:border-box;cursor:pointer;grid-area:1 / 1;inline-size:var(--_size);margin:0;margin-block-start:var(--_lift);margin-block-end:var(--_lift);transition:background-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing),border-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=checkbox] [data-part=indicator]{--slotted-icon-size: var(--_mark-size);block-size:var(--_mark-size);clip-path:inset(0% 100% 0% 0%);color:var(--slotted-checkbox-mark-color, var(--slotted-tone-accent-on-solid));display:flex;grid-area:1 / 1;inline-size:var(--_mark-size);margin-block-start:calc(var(--_lift) + var(--_mark-inset));margin-inline-start:var(--_mark-inset);opacity:0;pointer-events:none;transition:clip-path var(--slotted-duration-medium) var(--slotted-control-transition-easing),opacity var(--slotted-duration-medium) var(--slotted-control-transition-easing)}[data-ui=checkbox] [data-part=control]:checked+[data-part=indicator],[data-ui=checkbox] [data-part=control]:indeterminate+[data-part=indicator]{clip-path:inset(0% 0% 0% 0%);opacity:1}@media(prefers-reduced-motion:reduce){[data-ui=checkbox] [data-part=indicator],[data-ui=checkbox] [data-part=control]:checked+[data-part=indicator],[data-ui=checkbox] [data-part=control]:indeterminate+[data-part=indicator]{clip-path:none;transition:opacity var(--slotted-duration-medium) var(--slotted-control-transition-easing)}}[data-ui=checkbox] [data-part=label]{cursor:pointer;grid-column:2;grid-row:1;overflow-wrap:anywhere}[data-ui=checkbox][data-part=root]:has(>[data-part=label]){column-gap:var(--_gap)}[data-ui=checkbox][data-part=root]:not([data-variant=tile]) [data-part=label]{justify-self:start;position:relative}[data-ui=checkbox][data-part=root]:not([data-variant=tile]) [data-part=label]:before{block-size:var(--_target);content:\"\";direction:var(--_direction);inline-size:var(--_target);inset-block-start:calc(var(--_lift) + var(--_size) - var(--_target));inset-inline-start:calc((var(--_size) - var(--_target)) / 2 - var(--_size) - var(--_gap));position:absolute;z-index:-1}[data-ui=checkbox][data-part=root]:not([data-variant=tile]) [data-part=label]:after{background-color:var(--slotted-checkbox-halo-color, var(--slotted-tone-accent-text));border-radius:calc(var(--slotted-checkbox-radius, var(--slotted-radius-xs, 2px)) + var(--_halo-spread));content:\"\";direction:var(--_direction);inset-block:calc(var(--_lift) - var(--_halo-spread));inset-inline-end:calc(-1.5 * var(--_halo-spread));inset-inline-start:calc(-1 * (var(--_size) + var(--_gap) + var(--_halo-spread)));opacity:0;position:absolute;transition:opacity var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);z-index:-1}[data-ui=checkbox][data-part=root]:is([data-label-hidden],:has(>[data-part=label]:empty)):not([data-label-placement=start]){column-gap:0}[data-ui=checkbox][data-part=root]:is([data-label-hidden],:has(>[data-part=label]:empty)):not([data-label-placement=start],[data-variant=tile]) [data-part=label]:before{inset-inline-start:calc(-1 * var(--_target))}[data-ui=checkbox][data-part=root]:is([data-label-hidden],:has(>[data-part=label]:empty)):not([data-label-placement=start],[data-variant=tile]) [data-part=label]:after{inset-inline-end:calc(-1 * var(--_halo-spread));inset-inline-start:calc(-1 * (var(--_size) + var(--_halo-spread)))}[data-ui=checkbox] [data-part=description]{color:var(--slotted-checkbox-description-color, var(--slotted-text-muted, GrayText));font-size:var(--slotted-checkbox-description-font-size, var(--slotted-font-size-xs, .75rem));grid-column:2;grid-row:2;line-height:var(--slotted-line-height-xs, 1.4);margin:0;overflow-wrap:anywhere;padding-block-start:var(--_description-gap)}[data-ui=checkbox][data-part=root][data-label-placement=start]{grid-template-columns:minmax(0,1fr) auto}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=control],[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=indicator]{grid-area:1 / 2}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=label],[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=description]{grid-column:1}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=label]{justify-self:stretch}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=label]:before{inset-inline-end:calc(-1 * (var(--_size) + var(--_gap)));inset-inline-start:auto}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=label]:after{inset-inline-end:calc(-1 * (var(--_size) + var(--_gap) + var(--_halo-spread)));inset-inline-start:calc(-1.5 * var(--_halo-spread))}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:hover:not(:disabled){border-color:var(--slotted-checkbox-hover-border-color, var(--slotted-tone-accent-border))}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:hover:not(:disabled)~[data-part=label]:after,[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:not(:disabled)~[data-part=label]:hover:after{opacity:var(--slotted-selection-halo-opacity, .12)}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:active:not(:disabled){background-color:var( --slotted-checkbox-active-background, var(--slotted-tone-accent-subtle-active) )}[data-ui=checkbox] [data-part=control]:checked,[data-ui=checkbox] [data-part=control]:indeterminate{background-color:var(--slotted-checkbox-checked-background, var(--slotted-tone-accent-solid));border-color:var(--slotted-checkbox-checked-border-color, var(--slotted-tone-accent-solid))}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:checked:hover:not(:disabled),[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:indeterminate:hover:not(:disabled){background-color:var( --slotted-checkbox-checked-hover-background, var(--slotted-tone-accent-solid-hover) );border-color:var( --slotted-checkbox-checked-hover-background, var(--slotted-tone-accent-solid-hover) )}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:checked:active:not(:disabled),[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:indeterminate:active:not(:disabled){background-color:var( --slotted-checkbox-checked-active-background, var(--slotted-tone-accent-solid-active) );border-color:var( --slotted-checkbox-checked-active-background, var(--slotted-tone-accent-solid-active) )}[data-ui=checkbox] [data-part=control]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px)}[data-ui=checkbox][data-part=root][data-invalid]{--slotted-focus-ring-color: var( --slotted-checkbox-invalid-focus-ring-color, var(--slotted-focus-ring-color-invalid, Highlight) )}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]{border-width:calc(var(--slotted-checkbox-border-width, var(--slotted-border-width-medium, 1.5px)) + var(--slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px)));border-color:var(--slotted-checkbox-invalid-border-color, var(--slotted-tone-danger-border))}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:checked,[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:indeterminate{background-color:var( --slotted-checkbox-invalid-checked-background, var(--slotted-tone-danger-solid) );border-color:var( --slotted-checkbox-invalid-checked-background, var(--slotted-tone-danger-solid) );box-shadow:inset 0 0 0 var(--slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px)) var(--slotted-surface, Canvas)}[data-ui=checkbox][data-part=root][data-readonly] [data-part=control],[data-ui=checkbox][data-part=root][data-readonly] [data-part=label]{cursor:default}[data-ui=checkbox][data-part=root][data-readonly] [data-part=control]:not(:checked):not(:indeterminate){background-color:var( --slotted-checkbox-readonly-background, var(--slotted-tone-secondary-subtle-hover) )}[data-ui=checkbox][data-part=root][data-disabled] [data-part=control],[data-ui=checkbox] [data-part=control]:disabled{background-color:var( --slotted-checkbox-disabled-background, var(--slotted-disabled-background) );border-color:var(--slotted-checkbox-disabled-border-color, var(--slotted-disabled-border));cursor:not-allowed}[data-ui=checkbox] [data-part=control]:disabled+[data-part=indicator]{color:var(--slotted-checkbox-disabled-mark-color, var(--slotted-disabled-foreground))}[data-ui=checkbox][data-part=root][data-disabled] [data-part=label],[data-ui=checkbox][data-part=root][data-disabled] [data-part=description],[data-ui=checkbox] [data-part=control]:disabled~[data-part=label],[data-ui=checkbox] [data-part=control]:disabled~[data-part=description]{color:var(--slotted-checkbox-disabled-color, var(--slotted-disabled-foreground));cursor:not-allowed}[data-ui=checkbox][data-part=root][data-variant=tile]{--_description-gap: var( --slotted-checkbox-tile-description-gap, var(--slotted-space-2, .25rem) );--_tile-surface: var(--slotted-checkbox-tile-background, var(--slotted-surface, Canvas));--_tile-edge: var( --slotted-checkbox-tile-border-color, var(--slotted-control-border-color, ButtonBorder) );--_tile-edge-width: var(--slotted-control-border-width, 1px);background-color:var(--_tile-surface);border-radius:var(--slotted-checkbox-tile-radius, var(--slotted-radius-md, 6px));box-shadow:var(--slotted-control-shadow, none);cursor:pointer;padding:var(--_tile-inset);position:relative;transition:background-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing),box-shadow var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=checkbox][data-part=root][data-variant=tile]:before{border:calc(var(--_tile-edge-width) + var(--_tile-invalid-edge, 0px)) solid var(--_tile-edge);border-radius:inherit;content:\"\";inset:0;pointer-events:none;position:absolute;transition:border-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=checkbox][data-part=root][data-variant=tile] [data-part=label]:after{content:\"\";inset:0;position:absolute}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):not([data-disabled]):has([data-part=control]:not(:disabled)):not(:has([data-part=control]:is(:checked,:indeterminate))):hover{--_tile-surface: var( --slotted-checkbox-tile-hover-background, var(--slotted-tone-accent-subtle-hover) );--_tile-edge: var( --slotted-checkbox-tile-hover-border-color, var(--slotted-tone-accent-border) )}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):not([data-disabled]):has([data-part=control]:not(:disabled)):not(:has([data-part=control]:is(:checked,:indeterminate))):active{--_tile-surface: var( --slotted-checkbox-tile-active-background, var(--slotted-tone-accent-subtle-active) )}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):has([data-part=control]:is(:checked,:indeterminate)){--_tile-edge: var( --slotted-checkbox-tile-checked-border-color, var(--slotted-tone-accent-solid) );--_tile-edge-width: var(--slotted-border-width-thick, 2px)}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):has([data-part=control]:is(:checked,:indeterminate)){--_tile-surface: var( --slotted-checkbox-tile-checked-background, var(--slotted-tone-accent-surface) )}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):not([data-disabled]):has([data-part=control]:is(:checked,:indeterminate):not(:disabled)):hover{--_tile-edge: var( --slotted-checkbox-tile-checked-hover-border-color, var(--slotted-tone-accent-solid-hover) )}[data-ui=checkbox][data-part=root][data-variant=tile][data-invalid]{--_tile-edge: var( --slotted-checkbox-tile-invalid-border-color, var(--slotted-tone-danger-border) );--_tile-invalid-edge: var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) )}[data-ui=checkbox][data-part=root][data-variant=tile][data-invalid]:has([data-part=control]:is(:checked,:indeterminate)){--_tile-surface: var( --slotted-checkbox-tile-invalid-checked-background, var(--slotted-tone-danger-surface) );--_tile-edge: var( --slotted-checkbox-tile-invalid-checked-border-color, var(--slotted-tone-danger-solid) )}[data-ui=checkbox][data-part=root][data-variant=tile][data-readonly]{--_tile-surface: var( --slotted-checkbox-tile-readonly-background, var(--slotted-tone-secondary-subtle-hover) );--_tile-edge: var(--slotted-checkbox-tile-readonly-border-color, var(--slotted-border-strong));cursor:default}[data-ui=checkbox][data-part=root][data-variant=tile][data-disabled],[data-ui=checkbox][data-part=root][data-variant=tile]:has([data-part=control]:disabled){--_tile-surface: var( --slotted-checkbox-tile-disabled-background, var(--slotted-disabled-background) );--_tile-edge: var( --slotted-checkbox-tile-disabled-border-color, var(--slotted-disabled-border) );box-shadow:none;cursor:not-allowed}[data-ui=checkbox][data-part=root][data-variant=tile]:has([data-part=control]:focus-visible){outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px)}[data-ui=checkbox][data-part=root][data-variant=tile] [data-part=control]:focus-visible{outline:none}@media(forced-colors:active){[data-ui=checkbox] [data-part=control]{background-color:Field;border-color:FieldText}[data-ui=checkbox] [data-part=control]:checked,[data-ui=checkbox] [data-part=control]:indeterminate{background-color:Highlight;border-color:Highlight}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:checked,[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:indeterminate{background-color:Highlight;border-color:CanvasText;outline:var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) ) solid Canvas;outline-offset:calc(-1 * (var(--slotted-checkbox-border-width, var(--slotted-border-width-medium, 1.5px)) + var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) ) + var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) )))}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:checked:focus-visible,[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:indeterminate:focus-visible{outline:calc(var(--slotted-focus-ring-width, 2px) + var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) )) double var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px)}[data-ui=checkbox] [data-part=control]:checked+[data-part=indicator],[data-ui=checkbox] [data-part=control]:indeterminate+[data-part=indicator]{color:HighlightText}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:checked+[data-part=indicator],[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:indeterminate+[data-part=indicator]{color:HighlightText}[data-ui=checkbox][data-part=root][data-variant=tile][data-invalid],[data-ui=checkbox][data-part=root][data-variant=tile][data-invalid]:has([data-part=control]:is(:checked,:indeterminate)){--_tile-edge: CanvasText}[data-ui=checkbox] [data-part=control]:disabled{background-color:Field;border-color:GrayText}[data-ui=checkbox] [data-part=control]:disabled+[data-part=indicator]{color:GrayText}}}\n", "@layer slotted.components{[data-ui=visually-hidden]:not([data-focusable]:focus-within){block-size:1px;border:0;clip-path:inset(50%);inline-size:1px;inset-block-start:0;inset-inline-start:0;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
300
|
+
}
|
|
301
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTable, decorators: [{
|
|
302
|
+
type: Component,
|
|
303
|
+
args: [{ selector: 'div[slTable]', standalone: true, exportAs: 'slTable', template: '<ng-content />', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SlTable), multi: true }], host: {
|
|
304
|
+
'data-ui': 'table',
|
|
305
|
+
'data-part': 'root',
|
|
306
|
+
'[attr.data-variant]': 'resolvedVariant()',
|
|
307
|
+
'[attr.data-layout]': 'resolvedLayout()',
|
|
308
|
+
'[attr.data-cell-align]': 'resolvedCellAlign()',
|
|
309
|
+
'[attr.data-striped]': "resolvedStriped() ? '' : null",
|
|
310
|
+
'[attr.data-sticky-header]': "resolvedStickyHeader() ? '' : null",
|
|
311
|
+
'[attr.data-sticky-footer]': "resolvedStickyFooter() ? '' : null",
|
|
312
|
+
'[attr.data-sticky-to]': 'resolvedStickyTo()',
|
|
313
|
+
'[attr.data-loading]': "loading() ? '' : null",
|
|
314
|
+
}, styles: ["@layer slotted.components{[data-ui=table][data-part=root]{--_row-min-block: var( --slotted-table-row-min-block-size, var(--slotted-control-height-md, 34px) );--_font-size: var(--slotted-table-font-size, var(--slotted-control-font-size-md, 13px));--_icon-size: var(--slotted-table-icon-size, var(--slotted-control-icon-size-md, 16px));--_gap: var(--slotted-table-gap, var(--slotted-control-gap-md, 8px));--_pad-inline: var( --slotted-table-cell-padding-inline, var(--slotted-control-padding-inline-md, 13px) );--_pad-block: var( --slotted-table-cell-padding-block, max( var(--slotted-space-2, .25rem), calc((var(--_row-min-block) - var(--_font-size) * var(--slotted-line-height-md, 1.5)) / 2) ) );--_line: calc(var(--_font-size) * var(--slotted-line-height-md, 1.5));--_radius: var(--slotted-table-radius, var(--slotted-radius-md, 6px));--_rule: var(--slotted-table-border-color, var(--slotted-border-subtle, ButtonBorder));--_rule-strong: var( --slotted-table-border-color-strong, var(--slotted-border-strong, ButtonBorder) );--_rule-width: var(--slotted-table-border-width, var(--slotted-border-width-thin, 1px));--_text: var(--slotted-table-color, var(--slotted-text, CanvasText));--_muted: var(--slotted-table-color-muted, var(--slotted-text-muted, GrayText));--_surface: var(--slotted-table-surface, var(--slotted-ground, var(--slotted-surface, Canvas)));--_head-surface: var( --slotted-table-header-surface, color-mix(in oklab, var(--slotted-text, CanvasText) 8%, var(--_surface)) );--_stripe: var( --slotted-table-row-surface-stripe, color-mix(in oklab, var(--slotted-text, CanvasText) 5%, var(--_surface)) );--_hover: var( --slotted-table-row-surface-hover, var(--slotted-tone-secondary-subtle-hover, ButtonFace) );--_selected: var( --slotted-table-row-surface-selected, var(--slotted-tone-accent-surface, Canvas) );--_selected-hover: var( --slotted-table-row-surface-selected-hover, var(--slotted-tone-accent-subtle-hover, ButtonFace) );--_selected-text: var( --slotted-table-row-color-selected, var(--slotted-tone-accent-text, CanvasText) );background-color:var(--_surface);box-sizing:border-box;color:var(--_text);display:block;isolation:isolate;font-family:var(--slotted-table-font-family, var(--slotted-control-font-family));font-size:var(--_font-size);line-height:var(--slotted-line-height-md, 1.5);max-inline-size:100%}[data-ui=table][data-variant=framed]{border:var(--_rule-width) solid var(--_rule);border-radius:var(--_radius);box-shadow:var(--slotted-table-shadow, var(--slotted-shadow-xs, none));overflow:clip}[data-ui=table] [data-part=scroll]{overflow:auto;overscroll-behavior-inline:contain}[data-ui=table] [data-part=scroll]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:calc(var(--slotted-focus-ring-offset, 2px) * -1)}[data-ui=table] [data-part=table]{border-collapse:separate;border-spacing:0;inline-size:max-content;min-inline-size:100%;text-align:start}[data-ui=table][data-layout=fixed] [data-part=table]{inline-size:100%;table-layout:fixed}[data-ui=table] [data-part=caption]{caption-side:block-start;color:var(--_muted);font-size:var(--slotted-font-size-xs, .75rem);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);text-align:start}[data-ui=table] [data-part=column-header],[data-ui=table] [data-part=head] [data-part=selection]{background-color:var(--_head-surface);border-block-end:var(--_rule-width) solid var(--_rule-strong);color:var(--_text);font-weight:var(--slotted-font-weight-semibold, 600);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);position:relative;text-align:start;vertical-align:bottom}[data-ui=table][data-variant=plain] [data-part=column-header]{background-color:transparent}[data-ui=table] [data-part=row]{background-color:var(--_surface)}[data-ui=table]{--_cell-align: middle}[data-ui=table][data-cell-align=start]{--_cell-align: top}[data-ui=table][data-cell-align=end]{--_cell-align: bottom}[data-ui=table] [data-part=cell],[data-ui=table] [data-part=row-header]{padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);text-align:start;vertical-align:var(--_cell-align)}[data-ui=table] [data-block-align=start]{vertical-align:top}[data-ui=table] [data-block-align=center]{vertical-align:middle}[data-ui=table] [data-block-align=end]{vertical-align:bottom}[data-ui=table] :is([data-part=cell],[data-part=row-header]):has(>[data-part=root][data-variant=plain]:is([data-ui=select],[data-ui=combobox],[data-ui=multi-select],[data-ui=text-field],[data-ui=textarea],[data-ui=number-field],[data-ui=currency-field],[data-ui=date-field],[data-ui=time-field],[data-ui=datetime-field],[data-ui=tags-input],[data-ui=date-range-picker],[data-ui=time-range-picker],[data-ui=datetime-range-picker],[data-ui=entity-picker])){--slotted-control-padding-inline-sm: var(--_pad-inline);--slotted-control-padding-inline-md: var(--_pad-inline);--slotted-control-padding-inline-lg: var(--_pad-inline);--slotted-control-height-sm: var(--_row-min-block);--slotted-control-height-md: var(--_row-min-block);--slotted-control-height-lg: var(--_row-min-block);padding:0}[data-ui=table] [data-part=row-header]{font-weight:var(--slotted-font-weight-medium, 500)}[data-ui=table]:is([data-variant=ruled],[data-variant=framed]) [data-part=body]>[data-part=row]>*{border-block-end:var(--_rule-width) solid var(--_rule)}[data-ui=table]:is([data-variant=ruled],[data-variant=framed]) [data-part=body]>[data-part=row]:last-child>*{border-block-end-color:transparent}[data-ui=table][data-striped] [data-part=body]>[data-part=row]:nth-child(2n){background-color:var(--_stripe)}[data-ui=table] [data-part=body]>[data-part=row]:not([data-disabled]):hover{background-color:var(--_hover)}[data-ui=table] [data-part=body]>[data-part=row][data-selected]{background-color:var(--_selected);color:var(--_selected-text)}[data-ui=table] [data-part=body]>[data-part=row][data-selected]:not([data-disabled]):hover{background-color:var(--_selected-hover)}[data-ui=table] [data-part=row][data-disabled]{color:var(--slotted-disabled-foreground, GrayText)}[data-ui=table] [data-align=start]{text-align:start}[data-ui=table] [data-align=center]{text-align:center}[data-ui=table] [data-align=end]{text-align:end}[data-ui=table] [data-numeric]{font-variant-numeric:tabular-nums}[data-ui=table] [data-numeric]:not([data-align]){text-align:end}[data-ui=table] [data-text=wrap]{overflow-wrap:anywhere}[data-ui=table] [data-text=nowrap]{white-space:nowrap}[data-ui=table] [data-text=truncate]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-ui=table][data-sticky-header] [data-part=column-header],[data-ui=table][data-sticky-header] [data-part=head] [data-part=selection]{inset-block-start:var(--slotted-table-sticky-offset, 0);position:sticky;z-index:calc(var(--slotted-z-index-sticky, 100) + 1)}[data-ui=table][data-sticky-to=page] [data-part=scroll]{overflow:visible}[data-ui=table][data-sticky-footer] [data-part=summary]>[data-part=row]>*{inset-block-end:var(--slotted-table-sticky-offset-end, 0);position:sticky;z-index:calc(var(--slotted-z-index-sticky, 100) + 1)}[data-ui=table][data-sticky-footer] [data-part=summary] [data-sticky]{z-index:calc(var(--slotted-z-index-sticky, 100) + 2)}[data-ui=table] [data-sticky=start]{background-color:inherit;inset-inline-start:var(--slotted-table-sticky-inset, 0);position:sticky;z-index:var(--slotted-z-index-sticky, 100)}[data-ui=table] [data-sticky=end]{background-color:inherit;inset-inline-end:var(--slotted-table-sticky-inset, 0);position:sticky;z-index:var(--slotted-z-index-sticky, 100)}[data-ui=table][data-sticky-header] [data-part=column-header][data-sticky],[data-ui=table][data-sticky-header] [data-part=head] [data-part=selection][data-sticky]{background-color:var(--_head-surface);z-index:calc(var(--slotted-z-index-sticky, 100) + 2)}[data-ui=table] [data-sticky]:after{background-color:var(--slotted-table-border-color, var(--slotted-border-subtle));content:\"\";inline-size:var(--_rule-width);inset-block:calc(var(--_rule-width) * -1) 0;position:absolute;z-index:1}[data-ui=table] [data-sticky=start]:after{inset-inline-end:0}[data-ui=table] [data-sticky=end]:after{inset-inline-start:0}[data-ui=table] [data-part=column-header]:has(>[data-part=sort]){padding:0}[data-ui=table] [data-part=column-header]:has(>[data-part=column-actions]){--_actions-room: var( --slotted-table-column-actions-size, calc(var(--_pad-inline) + var(--slotted-target-min, 24px) + var(--_gap)) );padding-inline-end:var(--_actions-room)}[data-ui=table] [data-part=column-actions]{align-items:center;display:inline-flex;gap:var(--_gap);inset-block:0;inset-inline-end:var(--_pad-inline);position:absolute}[data-ui=table] [data-part=sort]{align-items:center;background-color:transparent;border:0;color:inherit;cursor:pointer;display:flex;font:inherit;gap:var(--_gap);inline-size:100%;justify-content:space-between;min-block-size:var(--slotted-target-min, 24px);min-inline-size:0;padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);text-align:inherit}[data-ui=table] [data-align=center]>[data-part=sort]{justify-content:center}[data-ui=table] :is([data-align=end],[data-numeric]:not([data-align]))>[data-part=sort]{justify-content:end}[data-ui=table] [data-part=column-header]:has(>[data-part=sort]:not(:disabled)):hover{background-color:var( --slotted-table-header-surface-hover, color-mix(in oklab, var(--slotted-text, CanvasText) 7%, var(--_head-surface)) )}[data-ui=table] [data-part=column-header]{transition:background-color var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}[data-ui=table] [data-part=sort]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:calc(var(--slotted-focus-ring-offset, 2px) * -1)}[data-ui=table] [data-part=sort]>[data-ui=icon]{--slotted-icon-size: var(--_icon-size);opacity:0;transition:opacity var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard)),rotate var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}[data-ui=table] [data-part=sort]:not(:disabled):hover>[data-ui=icon],[data-ui=table] [data-part=sort]:focus-visible>[data-ui=icon]{opacity:.55}[data-ui=table] [aria-sort]>[data-part=sort]>[data-ui=icon]{opacity:1}[data-ui=table] [aria-sort=ascending]>[data-part=sort]>[data-ui=icon]{rotate:180deg}[data-ui=table] [data-part=selection]{inline-size:var(--slotted-table-selection-size, 3rem);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline);text-align:center;vertical-align:var(--_cell-align);white-space:nowrap}[data-ui=table] [data-part=selection]>[data-ui=checkbox]{block-size:var(--_line)}[data-ui=table] [data-part=selection]{--slotted-selection-halo-opacity: 0}[data-ui=table] [data-part=cell]:has(>[data-part=expander]){inline-size:1%;padding-inline-end:0;white-space:nowrap}[data-ui=table] [data-part=column-actions] *:has([data-part=filter]){display:contents}[data-ui=table] [data-part=expander],[data-ui=table] [data-part=column-actions]>button,[data-ui=table] button[data-part=column-actions],[data-ui=table] [data-part=filter]{background-color:transparent;border:0;border-radius:var(--slotted-table-control-radius, var(--slotted-radius-sm, 4px));color:var(--_muted);cursor:pointer;display:inline-flex;block-size:var(--slotted-target-min, 24px);inline-size:var(--slotted-target-min, 24px);margin-block:calc((var(--_line) - var(--slotted-target-min, 24px)) / 2);padding:0;align-items:center;justify-content:center;transition:background-color var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}@media(pointer:coarse){[data-ui=table] [data-part=expander],[data-ui=table] [data-part=column-actions]>button,[data-ui=table] button[data-part=column-actions],[data-ui=table] [data-part=filter]{position:relative}[data-ui=table] [data-part=expander]:after,[data-ui=table] [data-part=column-actions]>button:after,[data-ui=table] button[data-part=column-actions]:after,[data-ui=table] [data-part=filter]:after{content:\"\";inset:min(0px,calc((100% - var(--slotted-target-comfortable, 44px)) / 2));position:absolute}[data-ui=table] [data-part=column-actions]>button:after,[data-ui=table] button[data-part=column-actions]:after,[data-ui=table] [data-part=filter]:after{inset-inline-start:0}}[data-ui=table] [data-part=expander]:not(:disabled):hover{background-color:var(--_hover);color:var(--_text)}[data-ui=table] [data-part=column-actions]>button:not(:disabled):hover,[data-ui=table] button[data-part=column-actions]:not(:disabled):hover,[data-ui=table] [data-part=filter]:not(:disabled):hover{background-color:var( --slotted-table-header-surface-hover, color-mix(in oklab, var(--slotted-text, CanvasText) 7%, var(--_head-surface)) );color:var(--_text)}[data-ui=table] [data-part=expander]:focus-visible,[data-ui=table] [data-part=column-actions]>button:focus-visible,[data-ui=table] button[data-part=column-actions]:focus-visible,[data-ui=table] [data-part=filter]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:0}[data-ui=table] :is([data-part=column-actions],[data-part=filter]) :is(svg,img){block-size:var(--_icon-size);inline-size:var(--_icon-size)}[data-ui=table] [data-part=filter][data-filtered],[data-ui=table] [data-part=filter][data-filtered]:not(:disabled):hover{color:var(--slotted-tone-accent-text, LinkText)}[data-ui=table][data-part=filter-panel]{--_gap: var(--slotted-table-gap, var(--slotted-control-gap-md, 8px));--_font-size: var(--slotted-table-font-size, var(--slotted-control-font-size-md, 13px));--_line: calc(var(--_font-size) * var(--slotted-line-height-md, 1.5));--_pad-block: var(--slotted-space-2, 4px);--_text: var(--slotted-table-color, var(--slotted-text, CanvasText));--_muted: var(--slotted-table-color-muted, var(--slotted-text-muted, GrayText));--_rule: var(--slotted-table-border-color, var(--slotted-border-subtle, ButtonBorder));--_rule-width: var(--slotted-table-border-width, var(--slotted-border-width-thin, 1px));--_hover: var( --slotted-table-row-surface-hover, var(--slotted-tone-secondary-subtle-hover, ButtonFace) );box-sizing:border-box;display:grid;gap:var(--_gap);color:var(--_text);font-size:var(--_font-size);font-weight:var(--slotted-font-weight-regular, 400);line-height:var(--slotted-line-height-md, 1.5);padding:var(--slotted-space-5, 12px);min-inline-size:min(17rem,var(--slotted-positioner-available-width, 100%));max-inline-size:100%}[data-ui=table][data-part=filter-panel] [data-part=filter-condition]{display:grid;gap:calc(var(--_gap) / 2)}[data-ui=table][data-part=filter-panel] [data-part=filter-operator],[data-ui=table][data-part=filter-panel] [data-part=filter-search]{display:block}[data-ui=table][data-part=filter-panel] [data-part=filter-operand]{display:grid;gap:calc(var(--_gap) / 2);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr))}[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-kind=set]{grid-template-columns:1fr;gap:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-range],[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-kind=datetime],[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-operand=tags]{grid-template-columns:1fr}[data-ui=table][data-part=filter-panel] [data-part=filter-operand][data-kind=time]:not([data-range]){grid-template-columns:repeat(auto-fit,minmax(8rem,1fr))}[data-ui=table][data-part=filter-panel] [data-part=filter-join]{align-items:center;border-block-start:var(--_rule-width) solid var(--_rule);display:flex;flex-wrap:wrap;gap:var(--_gap);padding-block-start:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-join]>[data-label]{color:var(--_muted)}[data-ui=table][data-part=filter-panel] [data-part=filter-list]{display:grid;gap:var(--_gap);max-block-size:calc(var(--_line) * 9);overflow-y:auto;padding-inline-end:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-option]{--slotted-selection-halo-opacity: 0;align-items:center;border-radius:var(--slotted-table-control-radius, var(--slotted-radius-sm, 4px));display:flex;gap:var(--_gap);justify-content:space-between;margin-inline:calc(var(--_gap) * -1);padding-inline:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-option]:not([data-disabled]):hover{background-color:var(--_hover)}[data-ui=table][data-part=filter-panel] [data-part=filter-option]>[data-count]{color:var(--_muted);font-variant-numeric:tabular-nums}[data-ui=table][data-part=filter-panel] [data-part=filter-option][data-covering]{border-block-end:var(--_rule-width) solid var(--_rule);padding-block-end:var(--_gap)}[data-ui=table][data-part=filter-panel] [data-part=filter-empty]{color:var(--_muted);padding-block:var(--_pad-block);text-align:center}[data-ui=table][data-part=filter-panel] [data-part=filter-actions]{border-block-start:var(--_rule-width) solid var(--_rule);display:flex;gap:var(--_gap);justify-content:space-between;padding-block-start:var(--_gap)}[data-ui=table] [data-part=expander]>[data-ui=icon]{--slotted-icon-size: var(--_icon-size);rotate:0deg;transition:rotate var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}[data-ui=table] [data-part=expander][aria-expanded=true]>[data-ui=icon]{rotate:90deg}[data-ui=table]:dir(rtl) [data-part=expander]>[data-ui=icon]{scale:-1 1}[data-ui=table]:dir(rtl) [data-part=expander][aria-expanded=true]>[data-ui=icon]{rotate:-90deg}[data-ui=table] [data-part=detail]{background-color:var(--_stripe)}[data-ui=table] [data-part=detail]>[data-part=cell]{padding-block:var(--_pad-block);padding-inline:var(--_pad-inline)}[data-ui=table][data-striped] [data-part=body]>[data-part=detail]{background-color:var(--_stripe)}[data-ui=table] [data-part=empty]{color:var(--_muted);padding-block:var(--slotted-space-9, 2rem);padding-inline:var(--_pad-inline);text-align:center}[data-ui=table] [data-part=loader]>[data-part=row]>*{padding-block:var(--_pad-block);padding-inline:var(--_pad-inline)}[data-ui=table][data-loading] [data-part=body]{opacity:.55;transition:opacity var(--slotted-control-transition-duration, var(--slotted-duration-short)) var(--slotted-control-transition-easing, var(--slotted-easing-standard))}[data-ui=table] [data-part=summary]>[data-part=row]>*{background-color:var(--_head-surface);border-block-start:var(--_rule-width) solid var(--_rule-strong);font-weight:var(--slotted-font-weight-medium, 500);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline)}[data-ui=table][data-variant=plain] [data-part=summary]>[data-part=row]>*{background-color:transparent}[data-ui=table] [data-part=footer]{align-items:center;border-block-start:var(--_rule-width) solid var(--_rule);display:flex;flex-wrap:wrap;gap:var(--_gap);padding-block:var(--_pad-block);padding-inline:var(--_pad-inline)}[data-ui=table] [data-part=footer]>:last-child{flex:1 1 auto;justify-content:end}@media print{[data-ui=table] [data-part=scroll]{max-block-size:none;overflow:visible}[data-ui=table][data-sticky-header] [data-part=column-header],[data-ui=table][data-sticky-header] [data-part=head] [data-part=selection],[data-ui=table][data-sticky-footer] [data-part=summary]>[data-part=row]>*,[data-ui=table] [data-sticky]{position:static}}}\n", "@layer slotted.components{[data-ui=checkbox][data-part=root]{--_size: var(--slotted-checkbox-size, var(--slotted-selection-size-md, 16px));--_font-size: var(--slotted-control-font-size-md, 13px);--_gap: var(--slotted-control-label-gap-md, 12px);--_line-height: var(--slotted-checkbox-line-height, var(--slotted-line-height-md, 1.5));--_mark-inset: var(--slotted-checkbox-mark-inset, 2px);--_mark-size: calc(var(--_size) - 2 * var(--_mark-inset));--_halo-spread: calc(var(--_gap) / 2);--_target: var(--slotted-target-min, 24px);--_lift: calc((var(--_font-size) * var(--_line-height) - var(--_size)) / 2);--_description-gap: var(--slotted-space-3, .375rem);align-content:start;color:var(--slotted-checkbox-color, var(--slotted-text, CanvasText));display:grid;font-family:var(--slotted-control-font-family, system-ui, sans-serif);font-size:var(--_font-size);grid-template-columns:auto minmax(0,1fr);isolation:isolate;line-height:var(--_line-height);position:relative}[data-ui=checkbox][data-part=root]{--_direction: ltr}[data-ui=checkbox][data-part=root]:dir(rtl){--_direction: rtl}[data-ui=checkbox][data-part=root][data-size=sm]{--_size: var(--slotted-checkbox-size, var(--slotted-selection-size-sm, 14px));--_font-size: var(--slotted-control-font-size-sm, 12px);--_gap: var(--slotted-control-label-gap-sm, 8px);--_tile-inset: var( --slotted-checkbox-tile-inset, var(--slotted-control-padding-inline-sm, 10px) )}[data-ui=checkbox][data-part=root][data-size=md]{--_size: var(--slotted-checkbox-size, var(--slotted-selection-size-md, 16px));--_font-size: var(--slotted-control-font-size-md, 13px);--_gap: var(--slotted-control-label-gap-md, 12px);--_tile-inset: var( --slotted-checkbox-tile-inset, var(--slotted-control-padding-inline-md, 13px) )}[data-ui=checkbox][data-part=root][data-size=lg]{--_size: var(--slotted-checkbox-size, var(--slotted-selection-size-lg, 18px));--_font-size: var(--slotted-control-font-size-lg, 14px);--_gap: var(--slotted-control-label-gap-lg, 12px);--_tile-inset: var( --slotted-checkbox-tile-inset, var(--slotted-control-padding-inline-lg, 16px) )}[data-ui=checkbox] [data-part=control]{appearance:none;background-color:var(--slotted-checkbox-background, var(--slotted-surface, Canvas));border:var(--slotted-checkbox-border-width, var(--slotted-border-width-medium, 1.5px)) solid var(--slotted-checkbox-border-color, var(--slotted-border-strong, ButtonBorder));border-radius:var(--slotted-checkbox-radius, var(--slotted-radius-xs, 2px));block-size:var(--_size);box-sizing:border-box;cursor:pointer;grid-area:1 / 1;inline-size:var(--_size);margin:0;margin-block-start:var(--_lift);margin-block-end:var(--_lift);transition:background-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing),border-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=checkbox] [data-part=indicator]{--slotted-icon-size: var(--_mark-size);block-size:var(--_mark-size);clip-path:inset(0% 100% 0% 0%);color:var(--slotted-checkbox-mark-color, var(--slotted-tone-accent-on-solid));display:flex;grid-area:1 / 1;inline-size:var(--_mark-size);margin-block-start:calc(var(--_lift) + var(--_mark-inset));margin-inline-start:var(--_mark-inset);opacity:0;pointer-events:none;transition:clip-path var(--slotted-duration-medium) var(--slotted-control-transition-easing),opacity var(--slotted-duration-medium) var(--slotted-control-transition-easing)}[data-ui=checkbox] [data-part=control]:checked+[data-part=indicator],[data-ui=checkbox] [data-part=control]:indeterminate+[data-part=indicator]{clip-path:inset(0% 0% 0% 0%);opacity:1}@media(prefers-reduced-motion:reduce){[data-ui=checkbox] [data-part=indicator],[data-ui=checkbox] [data-part=control]:checked+[data-part=indicator],[data-ui=checkbox] [data-part=control]:indeterminate+[data-part=indicator]{clip-path:none;transition:opacity var(--slotted-duration-medium) var(--slotted-control-transition-easing)}}[data-ui=checkbox] [data-part=label]{cursor:pointer;grid-column:2;grid-row:1;overflow-wrap:anywhere}[data-ui=checkbox][data-part=root]:has(>[data-part=label]){column-gap:var(--_gap)}[data-ui=checkbox][data-part=root]:not([data-variant=tile]) [data-part=label]{justify-self:start;position:relative}[data-ui=checkbox][data-part=root]:not([data-variant=tile]) [data-part=label]:before{block-size:var(--_target);content:\"\";direction:var(--_direction);inline-size:var(--_target);inset-block-start:calc(var(--_lift) + var(--_size) - var(--_target));inset-inline-start:calc((var(--_size) - var(--_target)) / 2 - var(--_size) - var(--_gap));position:absolute;z-index:-1}[data-ui=checkbox][data-part=root]:not([data-variant=tile]) [data-part=label]:after{background-color:var(--slotted-checkbox-halo-color, var(--slotted-tone-accent-text));border-radius:calc(var(--slotted-checkbox-radius, var(--slotted-radius-xs, 2px)) + var(--_halo-spread));content:\"\";direction:var(--_direction);inset-block:calc(var(--_lift) - var(--_halo-spread));inset-inline-end:calc(-1.5 * var(--_halo-spread));inset-inline-start:calc(-1 * (var(--_size) + var(--_gap) + var(--_halo-spread)));opacity:0;position:absolute;transition:opacity var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);z-index:-1}[data-ui=checkbox][data-part=root]:is([data-label-hidden],:has(>[data-part=label]:empty)):not([data-label-placement=start]){column-gap:0}[data-ui=checkbox][data-part=root]:is([data-label-hidden],:has(>[data-part=label]:empty)):not([data-label-placement=start],[data-variant=tile]) [data-part=label]:before{inset-inline-start:calc(-1 * var(--_target))}[data-ui=checkbox][data-part=root]:is([data-label-hidden],:has(>[data-part=label]:empty)):not([data-label-placement=start],[data-variant=tile]) [data-part=label]:after{inset-inline-end:calc(-1 * var(--_halo-spread));inset-inline-start:calc(-1 * (var(--_size) + var(--_halo-spread)))}[data-ui=checkbox] [data-part=description]{color:var(--slotted-checkbox-description-color, var(--slotted-text-muted, GrayText));font-size:var(--slotted-checkbox-description-font-size, var(--slotted-font-size-xs, .75rem));grid-column:2;grid-row:2;line-height:var(--slotted-line-height-xs, 1.4);margin:0;overflow-wrap:anywhere;padding-block-start:var(--_description-gap)}[data-ui=checkbox][data-part=root][data-label-placement=start]{grid-template-columns:minmax(0,1fr) auto}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=control],[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=indicator]{grid-area:1 / 2}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=label],[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=description]{grid-column:1}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=label]{justify-self:stretch}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=label]:before{inset-inline-end:calc(-1 * (var(--_size) + var(--_gap)));inset-inline-start:auto}[data-ui=checkbox][data-part=root][data-label-placement=start] [data-part=label]:after{inset-inline-end:calc(-1 * (var(--_size) + var(--_gap) + var(--_halo-spread)));inset-inline-start:calc(-1.5 * var(--_halo-spread))}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:hover:not(:disabled){border-color:var(--slotted-checkbox-hover-border-color, var(--slotted-tone-accent-border))}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:hover:not(:disabled)~[data-part=label]:after,[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:not(:disabled)~[data-part=label]:hover:after{opacity:var(--slotted-selection-halo-opacity, .12)}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:active:not(:disabled){background-color:var( --slotted-checkbox-active-background, var(--slotted-tone-accent-subtle-active) )}[data-ui=checkbox] [data-part=control]:checked,[data-ui=checkbox] [data-part=control]:indeterminate{background-color:var(--slotted-checkbox-checked-background, var(--slotted-tone-accent-solid));border-color:var(--slotted-checkbox-checked-border-color, var(--slotted-tone-accent-solid))}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:checked:hover:not(:disabled),[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:indeterminate:hover:not(:disabled){background-color:var( --slotted-checkbox-checked-hover-background, var(--slotted-tone-accent-solid-hover) );border-color:var( --slotted-checkbox-checked-hover-background, var(--slotted-tone-accent-solid-hover) )}[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:checked:active:not(:disabled),[data-ui=checkbox][data-part=root]:not([data-readonly]) [data-part=control]:indeterminate:active:not(:disabled){background-color:var( --slotted-checkbox-checked-active-background, var(--slotted-tone-accent-solid-active) );border-color:var( --slotted-checkbox-checked-active-background, var(--slotted-tone-accent-solid-active) )}[data-ui=checkbox] [data-part=control]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px)}[data-ui=checkbox][data-part=root][data-invalid]{--slotted-focus-ring-color: var( --slotted-checkbox-invalid-focus-ring-color, var(--slotted-focus-ring-color-invalid, Highlight) )}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]{border-width:calc(var(--slotted-checkbox-border-width, var(--slotted-border-width-medium, 1.5px)) + var(--slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px)));border-color:var(--slotted-checkbox-invalid-border-color, var(--slotted-tone-danger-border))}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:checked,[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:indeterminate{background-color:var( --slotted-checkbox-invalid-checked-background, var(--slotted-tone-danger-solid) );border-color:var( --slotted-checkbox-invalid-checked-background, var(--slotted-tone-danger-solid) );box-shadow:inset 0 0 0 var(--slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px)) var(--slotted-surface, Canvas)}[data-ui=checkbox][data-part=root][data-readonly] [data-part=control],[data-ui=checkbox][data-part=root][data-readonly] [data-part=label]{cursor:default}[data-ui=checkbox][data-part=root][data-readonly] [data-part=control]:not(:checked):not(:indeterminate){background-color:var( --slotted-checkbox-readonly-background, var(--slotted-tone-secondary-subtle-hover) )}[data-ui=checkbox][data-part=root][data-disabled] [data-part=control],[data-ui=checkbox] [data-part=control]:disabled{background-color:var( --slotted-checkbox-disabled-background, var(--slotted-disabled-background) );border-color:var(--slotted-checkbox-disabled-border-color, var(--slotted-disabled-border));cursor:not-allowed}[data-ui=checkbox] [data-part=control]:disabled+[data-part=indicator]{color:var(--slotted-checkbox-disabled-mark-color, var(--slotted-disabled-foreground))}[data-ui=checkbox][data-part=root][data-disabled] [data-part=label],[data-ui=checkbox][data-part=root][data-disabled] [data-part=description],[data-ui=checkbox] [data-part=control]:disabled~[data-part=label],[data-ui=checkbox] [data-part=control]:disabled~[data-part=description]{color:var(--slotted-checkbox-disabled-color, var(--slotted-disabled-foreground));cursor:not-allowed}[data-ui=checkbox][data-part=root][data-variant=tile]{--_description-gap: var( --slotted-checkbox-tile-description-gap, var(--slotted-space-2, .25rem) );--_tile-surface: var(--slotted-checkbox-tile-background, var(--slotted-surface, Canvas));--_tile-edge: var( --slotted-checkbox-tile-border-color, var(--slotted-control-border-color, ButtonBorder) );--_tile-edge-width: var(--slotted-control-border-width, 1px);background-color:var(--_tile-surface);border-radius:var(--slotted-checkbox-tile-radius, var(--slotted-radius-md, 6px));box-shadow:var(--slotted-control-shadow, none);cursor:pointer;padding:var(--_tile-inset);position:relative;transition:background-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing),box-shadow var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=checkbox][data-part=root][data-variant=tile]:before{border:calc(var(--_tile-edge-width) + var(--_tile-invalid-edge, 0px)) solid var(--_tile-edge);border-radius:inherit;content:\"\";inset:0;pointer-events:none;position:absolute;transition:border-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=checkbox][data-part=root][data-variant=tile] [data-part=label]:after{content:\"\";inset:0;position:absolute}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):not([data-disabled]):has([data-part=control]:not(:disabled)):not(:has([data-part=control]:is(:checked,:indeterminate))):hover{--_tile-surface: var( --slotted-checkbox-tile-hover-background, var(--slotted-tone-accent-subtle-hover) );--_tile-edge: var( --slotted-checkbox-tile-hover-border-color, var(--slotted-tone-accent-border) )}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):not([data-disabled]):has([data-part=control]:not(:disabled)):not(:has([data-part=control]:is(:checked,:indeterminate))):active{--_tile-surface: var( --slotted-checkbox-tile-active-background, var(--slotted-tone-accent-subtle-active) )}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):has([data-part=control]:is(:checked,:indeterminate)){--_tile-edge: var( --slotted-checkbox-tile-checked-border-color, var(--slotted-tone-accent-solid) );--_tile-edge-width: var(--slotted-border-width-thick, 2px)}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):has([data-part=control]:is(:checked,:indeterminate)){--_tile-surface: var( --slotted-checkbox-tile-checked-background, var(--slotted-tone-accent-surface) )}[data-ui=checkbox][data-part=root][data-variant=tile]:not([data-readonly]):not([data-disabled]):has([data-part=control]:is(:checked,:indeterminate):not(:disabled)):hover{--_tile-edge: var( --slotted-checkbox-tile-checked-hover-border-color, var(--slotted-tone-accent-solid-hover) )}[data-ui=checkbox][data-part=root][data-variant=tile][data-invalid]{--_tile-edge: var( --slotted-checkbox-tile-invalid-border-color, var(--slotted-tone-danger-border) );--_tile-invalid-edge: var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) )}[data-ui=checkbox][data-part=root][data-variant=tile][data-invalid]:has([data-part=control]:is(:checked,:indeterminate)){--_tile-surface: var( --slotted-checkbox-tile-invalid-checked-background, var(--slotted-tone-danger-surface) );--_tile-edge: var( --slotted-checkbox-tile-invalid-checked-border-color, var(--slotted-tone-danger-solid) )}[data-ui=checkbox][data-part=root][data-variant=tile][data-readonly]{--_tile-surface: var( --slotted-checkbox-tile-readonly-background, var(--slotted-tone-secondary-subtle-hover) );--_tile-edge: var(--slotted-checkbox-tile-readonly-border-color, var(--slotted-border-strong));cursor:default}[data-ui=checkbox][data-part=root][data-variant=tile][data-disabled],[data-ui=checkbox][data-part=root][data-variant=tile]:has([data-part=control]:disabled){--_tile-surface: var( --slotted-checkbox-tile-disabled-background, var(--slotted-disabled-background) );--_tile-edge: var( --slotted-checkbox-tile-disabled-border-color, var(--slotted-disabled-border) );box-shadow:none;cursor:not-allowed}[data-ui=checkbox][data-part=root][data-variant=tile]:has([data-part=control]:focus-visible){outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px)}[data-ui=checkbox][data-part=root][data-variant=tile] [data-part=control]:focus-visible{outline:none}@media(forced-colors:active){[data-ui=checkbox] [data-part=control]{background-color:Field;border-color:FieldText}[data-ui=checkbox] [data-part=control]:checked,[data-ui=checkbox] [data-part=control]:indeterminate{background-color:Highlight;border-color:Highlight}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:checked,[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:indeterminate{background-color:Highlight;border-color:CanvasText;outline:var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) ) solid Canvas;outline-offset:calc(-1 * (var(--slotted-checkbox-border-width, var(--slotted-border-width-medium, 1.5px)) + var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) ) + var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) )))}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:checked:focus-visible,[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:indeterminate:focus-visible{outline:calc(var(--slotted-focus-ring-width, 2px) + var( --slotted-checkbox-invalid-edge-width, var(--slotted-control-invalid-edge-width, 1px) )) double var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px)}[data-ui=checkbox] [data-part=control]:checked+[data-part=indicator],[data-ui=checkbox] [data-part=control]:indeterminate+[data-part=indicator]{color:HighlightText}[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:checked+[data-part=indicator],[data-ui=checkbox][data-part=root][data-invalid] [data-part=control]:indeterminate+[data-part=indicator]{color:HighlightText}[data-ui=checkbox][data-part=root][data-variant=tile][data-invalid],[data-ui=checkbox][data-part=root][data-variant=tile][data-invalid]:has([data-part=control]:is(:checked,:indeterminate)){--_tile-edge: CanvasText}[data-ui=checkbox] [data-part=control]:disabled{background-color:Field;border-color:GrayText}[data-ui=checkbox] [data-part=control]:disabled+[data-part=indicator]{color:GrayText}}}\n", "@layer slotted.components{[data-ui=visually-hidden]:not([data-focusable]:focus-within){block-size:1px;border:0;clip-path:inset(50%);inline-size:1px;inset-block-start:0;inset-inline-start:0;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap}}\n"] }]
|
|
315
|
+
}], propDecorators: { sort: [{ type: i0.Input, args: [{ isSignal: true, alias: "sort", required: false }] }, { type: i0.Output, args: ["sortChange"] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], cellAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellAlign", required: false }] }], striped: [{ type: i0.Input, args: [{ isSignal: true, alias: "striped", required: false }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], stickyFooter: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyFooter", required: false }] }], stickyTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyTo", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], messages: [{ type: i0.Input, args: [{ isSignal: true, alias: "messages", required: false }] }], sortChangeRequest: [{ type: i0.Output, args: ["sortChangeRequest"] }], valueChangeRequest: [{ type: i0.Output, args: ["valueChangeRequest"] }], expandedChangeRequest: [{ type: i0.Output, args: ["expandedChangeRequest"] }] } });
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* The scroller and the table it holds.
|
|
319
|
+
*
|
|
320
|
+
* Two elements and one component, because neither is a decision a consumer
|
|
321
|
+
* makes: the `table` carries the semantics and the host carries the overflow.
|
|
322
|
+
* Angular pays one element for the host and draws the other in its template,
|
|
323
|
+
* which is the same division `checkbox` records.
|
|
324
|
+
*
|
|
325
|
+
* **The region wiring is written only while the table overflows.** `role`,
|
|
326
|
+
* `tabindex` and a name arrive together, measured by `@slotted/core/overflow` —
|
|
327
|
+
* the rule `prose` set. A tab stop on a table that fits makes a reader press Tab
|
|
328
|
+
* for nothing, and a wide table with no tab stop is unreachable without a
|
|
329
|
+
* pointer. Nothing is measured until the first render after mount, so the
|
|
330
|
+
* server renders a plain scroller and hydration finds the same DOM.
|
|
331
|
+
*
|
|
332
|
+
* **The host's `aria-label` names the table.** An instance with no caption
|
|
333
|
+
* names itself with it, and the template writes it on the `table`, the
|
|
334
|
+
* element whose name it is. The region takes the catalog's name, or
|
|
335
|
+
* `scrollLabel`.
|
|
336
|
+
*/
|
|
337
|
+
class SlTableContent {
|
|
338
|
+
/**
|
|
339
|
+
* The total number of rows behind a paged or filtered table. Written as
|
|
340
|
+
* `aria-rowcount`, with `aria-rowindex` on every row, and only then: the
|
|
341
|
+
* practice requires the pair exactly when the DOM is not the whole set.
|
|
342
|
+
*/
|
|
343
|
+
totalRowCount = input(undefined, { ...(ngDevMode ? { debugName: "totalRowCount" } : /* istanbul ignore next */ {}), transform: (count) => (count === undefined ? undefined : numberAttribute(count)) });
|
|
344
|
+
/** The name the region takes while it overflows, over the catalog's. */
|
|
345
|
+
scrollLabel = input(undefined, /* @ts-ignore */
|
|
346
|
+
...(ngDevMode ? [{ debugName: "scrollLabel" }] : /* istanbul ignore next */ []));
|
|
347
|
+
/** The element that names it instead, which is usually the caption. */
|
|
348
|
+
scrollLabelledBy = input(undefined, /* @ts-ignore */
|
|
349
|
+
...(ngDevMode ? [{ debugName: "scrollLabelledBy" }] : /* istanbul ignore next */ []));
|
|
350
|
+
table = inject(SlTable);
|
|
351
|
+
host = inject(ElementRef);
|
|
352
|
+
/** The host's own `aria-label`: the table's name, moved onto the `table`. */
|
|
353
|
+
tableLabel = inject(new HostAttributeToken('aria-label'), { optional: true });
|
|
354
|
+
affordance = null;
|
|
355
|
+
state = signal({ overflowing: false, atStart: true, atEnd: true }, /* @ts-ignore */
|
|
356
|
+
...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
|
|
357
|
+
regionLabel = computed(() => this.state().overflowing && this.scrollLabelledBy() === undefined
|
|
358
|
+
? (this.scrollLabel() ?? this.table.t('scroll'))
|
|
359
|
+
: null, /* @ts-ignore */
|
|
360
|
+
...(ngDevMode ? [{ debugName: "regionLabel" }] : /* istanbul ignore next */ []));
|
|
361
|
+
regionLabelledBy = computed(() => this.state().overflowing ? (this.scrollLabelledBy() ?? null) : null, /* @ts-ignore */
|
|
362
|
+
...(ngDevMode ? [{ debugName: "regionLabelledBy" }] : /* istanbul ignore next */ []));
|
|
363
|
+
constructor() {
|
|
364
|
+
afterNextRender(() => {
|
|
365
|
+
/**
|
|
366
|
+
* Nothing is measured under `stickyTo="page"`: the family has released its
|
|
367
|
+
* own scroll container so the header can stick to what scrolls outside it,
|
|
368
|
+
* and a box that does not scroll has no overflow to answer and no tab stop
|
|
369
|
+
* to earn.
|
|
370
|
+
*/
|
|
371
|
+
if (this.table.resolvedStickyTo() === 'page')
|
|
372
|
+
return;
|
|
373
|
+
const handle = createScrollAffordance(this.host.nativeElement, {
|
|
374
|
+
onChange: (next) => this.state.set(next),
|
|
375
|
+
});
|
|
376
|
+
this.affordance = handle;
|
|
377
|
+
this.state.set(handle.state());
|
|
378
|
+
});
|
|
379
|
+
inject(DestroyRef).onDestroy(() => {
|
|
380
|
+
this.affordance?.destroy();
|
|
381
|
+
this.affordance = null;
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
/** Brings one row into view by the shortest movement that does it. */
|
|
385
|
+
scrollToRow(value) {
|
|
386
|
+
const row = this.host.nativeElement.querySelector(`[data-part="row"][data-value="${CSS.escape(value)}"]`);
|
|
387
|
+
if (row !== null)
|
|
388
|
+
this.affordance?.reveal(row);
|
|
389
|
+
}
|
|
390
|
+
/** Measures again, after rows arrive or a column changes width. */
|
|
391
|
+
refresh() {
|
|
392
|
+
this.affordance?.refresh();
|
|
393
|
+
}
|
|
394
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
395
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlTableContent, isStandalone: true, selector: "div[slTableContent]", inputs: { totalRowCount: { classPropertyName: "totalRowCount", publicName: "totalRowCount", isSignal: true, isRequired: false, transformFunction: null }, scrollLabel: { classPropertyName: "scrollLabel", publicName: "scrollLabel", isSignal: true, isRequired: false, transformFunction: null }, scrollLabelledBy: { classPropertyName: "scrollLabelledBy", publicName: "scrollLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "scroll" }, properties: { "attr.data-overflowing": "state().overflowing ? '' : null", "attr.data-at-start": "state().overflowing && state().atStart ? '' : null", "attr.data-at-end": "state().overflowing && state().atEnd ? '' : null", "attr.role": "state().overflowing ? 'region' : null", "attr.tabindex": "state().overflowing ? '0' : null", "attr.aria-label": "regionLabel()", "attr.aria-labelledby": "regionLabelledBy()" } }, exportAs: ["slTableContent"], ngImport: i0, template: `<table
|
|
396
|
+
data-part="table"
|
|
397
|
+
[attr.aria-label]="tableLabel"
|
|
398
|
+
[attr.aria-busy]="table.loading() ? 'true' : null"
|
|
399
|
+
[attr.aria-rowcount]="totalRowCount() ?? null"
|
|
400
|
+
>
|
|
401
|
+
<ng-content />
|
|
402
|
+
</table>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
403
|
+
}
|
|
404
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableContent, decorators: [{
|
|
405
|
+
type: Component,
|
|
406
|
+
args: [{
|
|
407
|
+
selector: 'div[slTableContent]',
|
|
408
|
+
standalone: true,
|
|
409
|
+
exportAs: 'slTableContent',
|
|
410
|
+
template: `<table
|
|
411
|
+
data-part="table"
|
|
412
|
+
[attr.aria-label]="tableLabel"
|
|
413
|
+
[attr.aria-busy]="table.loading() ? 'true' : null"
|
|
414
|
+
[attr.aria-rowcount]="totalRowCount() ?? null"
|
|
415
|
+
>
|
|
416
|
+
<ng-content />
|
|
417
|
+
</table>`,
|
|
418
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
419
|
+
encapsulation: ViewEncapsulation.None,
|
|
420
|
+
host: {
|
|
421
|
+
'data-part': 'scroll',
|
|
422
|
+
'[attr.data-overflowing]': "state().overflowing ? '' : null",
|
|
423
|
+
'[attr.data-at-start]': "state().overflowing && state().atStart ? '' : null",
|
|
424
|
+
'[attr.data-at-end]': "state().overflowing && state().atEnd ? '' : null",
|
|
425
|
+
'[attr.role]': "state().overflowing ? 'region' : null",
|
|
426
|
+
'[attr.tabindex]': "state().overflowing ? '0' : null",
|
|
427
|
+
'[attr.aria-label]': 'regionLabel()',
|
|
428
|
+
'[attr.aria-labelledby]': 'regionLabelledBy()',
|
|
429
|
+
},
|
|
430
|
+
}]
|
|
431
|
+
}], ctorParameters: () => [], propDecorators: { totalRowCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRowCount", required: false }] }], scrollLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollLabel", required: false }] }], scrollLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollLabelledBy", required: false }] }] } });
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* The axes every cell answers, written once. `numeric` and `align` are two facts
|
|
435
|
+
* rather than one axis: a number is set in tabular figures whichever way it is
|
|
436
|
+
* aligned, and a right-aligned label is not a number.
|
|
437
|
+
*/
|
|
438
|
+
class SlTableCellAxes {
|
|
439
|
+
align = input(undefined, /* @ts-ignore */
|
|
440
|
+
...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
|
|
441
|
+
/**
|
|
442
|
+
* Where this cell's content sits in a row as tall as its tallest cell. The
|
|
443
|
+
* table states it once through `cellAlign`; this overrides it for the one
|
|
444
|
+
* cell that wants the other answer.
|
|
445
|
+
*/
|
|
446
|
+
blockAlign = input(undefined, /* @ts-ignore */
|
|
447
|
+
...(ngDevMode ? [{ debugName: "blockAlign" }] : /* istanbul ignore next */ []));
|
|
448
|
+
numeric = input(false, { ...(ngDevMode ? { debugName: "numeric" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
449
|
+
text = input(undefined, /* @ts-ignore */
|
|
450
|
+
...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
|
|
451
|
+
sticky = input(undefined, /* @ts-ignore */
|
|
452
|
+
...(ngDevMode ? [{ debugName: "sticky" }] : /* istanbul ignore next */ []));
|
|
453
|
+
/**
|
|
454
|
+
* Where a pinned column stops, as a CSS length. Nought unless stated: two
|
|
455
|
+
* columns pinned to the same edge need the second to know how wide the first
|
|
456
|
+
* is, and the family states that rather than measuring it — measuring would
|
|
457
|
+
* mean reading the layout during change detection.
|
|
458
|
+
*/
|
|
459
|
+
stickyOffset = input(undefined, /* @ts-ignore */
|
|
460
|
+
...(ngDevMode ? [{ debugName: "stickyOffset" }] : /* istanbul ignore next */ []));
|
|
461
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableCellAxes, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
462
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: SlTableCellAxes, isStandalone: true, inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, blockAlign: { classPropertyName: "blockAlign", publicName: "blockAlign", isSignal: true, isRequired: false, transformFunction: null }, numeric: { classPropertyName: "numeric", publicName: "numeric", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, stickyOffset: { classPropertyName: "stickyOffset", publicName: "stickyOffset", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-align": "align() ?? null", "attr.data-block-align": "blockAlign() ?? null", "attr.data-numeric": "numeric() ? '' : null", "attr.data-text": "text() ?? null", "attr.data-sticky": "sticky() ?? null", "style.--slotted-table-sticky-inset": "stickyOffset() ?? null" } }, ngImport: i0 });
|
|
463
|
+
}
|
|
464
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableCellAxes, decorators: [{
|
|
465
|
+
type: Directive,
|
|
466
|
+
args: [{
|
|
467
|
+
standalone: true,
|
|
468
|
+
host: {
|
|
469
|
+
'[attr.data-align]': 'align() ?? null',
|
|
470
|
+
'[attr.data-block-align]': 'blockAlign() ?? null',
|
|
471
|
+
'[attr.data-numeric]': "numeric() ? '' : null",
|
|
472
|
+
'[attr.data-text]': 'text() ?? null',
|
|
473
|
+
'[attr.data-sticky]': 'sticky() ?? null',
|
|
474
|
+
'[style.--slotted-table-sticky-inset]': 'stickyOffset() ?? null',
|
|
475
|
+
},
|
|
476
|
+
}]
|
|
477
|
+
}], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], blockAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "blockAlign", required: false }] }], numeric: [{ type: i0.Input, args: [{ isSignal: true, alias: "numeric", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], stickyOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyOffset", required: false }] }] } });
|
|
478
|
+
/**
|
|
479
|
+
* The table's name, and the element the platform already associates with it. A
|
|
480
|
+
* `caption` is the accessible name whether it is read or hidden, so the family
|
|
481
|
+
* writes no `aria-labelledby` restating what the browser states.
|
|
482
|
+
*/
|
|
483
|
+
class SlTableCaption {
|
|
484
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableCaption, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
485
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlTableCaption, isStandalone: true, selector: "caption[slTableCaption]", host: { attributes: { "data-part": "caption" } }, exportAs: ["slTableCaption"], ngImport: i0 });
|
|
486
|
+
}
|
|
487
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableCaption, decorators: [{
|
|
488
|
+
type: Directive,
|
|
489
|
+
args: [{
|
|
490
|
+
selector: 'caption[slTableCaption]',
|
|
491
|
+
standalone: true,
|
|
492
|
+
exportAs: 'slTableCaption',
|
|
493
|
+
host: { 'data-part': 'caption' },
|
|
494
|
+
}]
|
|
495
|
+
}] });
|
|
496
|
+
class SlTableHead {
|
|
497
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableHead, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
498
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlTableHead, isStandalone: true, selector: "thead[slTableHead]", host: { attributes: { "data-part": "head" } }, exportAs: ["slTableHead"], ngImport: i0 });
|
|
499
|
+
}
|
|
500
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableHead, decorators: [{
|
|
501
|
+
type: Directive,
|
|
502
|
+
args: [{
|
|
503
|
+
selector: 'thead[slTableHead]',
|
|
504
|
+
standalone: true,
|
|
505
|
+
exportAs: 'slTableHead',
|
|
506
|
+
host: { 'data-part': 'head' },
|
|
507
|
+
}]
|
|
508
|
+
}] });
|
|
509
|
+
class SlTableBody {
|
|
510
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableBody, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
511
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlTableBody, isStandalone: true, selector: "tbody[slTableBody]", host: { attributes: { "data-part": "body" } }, exportAs: ["slTableBody"], ngImport: i0 });
|
|
512
|
+
}
|
|
513
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableBody, decorators: [{
|
|
514
|
+
type: Directive,
|
|
515
|
+
args: [{
|
|
516
|
+
selector: 'tbody[slTableBody]',
|
|
517
|
+
standalone: true,
|
|
518
|
+
exportAs: 'slTableBody',
|
|
519
|
+
host: { 'data-part': 'body' },
|
|
520
|
+
}]
|
|
521
|
+
}] });
|
|
522
|
+
/**
|
|
523
|
+
* The `tfoot`, which the HTML Standard calls the column summaries of the table.
|
|
524
|
+
* It is not `slTableFooter`, which is the bar outside the table holding the
|
|
525
|
+
* consumer's own controls.
|
|
526
|
+
*/
|
|
527
|
+
class SlTableSummary {
|
|
528
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSummary, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
529
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlTableSummary, isStandalone: true, selector: "tfoot[slTableSummary]", host: { attributes: { "data-part": "summary" } }, exportAs: ["slTableSummary"], ngImport: i0 });
|
|
530
|
+
}
|
|
531
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSummary, decorators: [{
|
|
532
|
+
type: Directive,
|
|
533
|
+
args: [{
|
|
534
|
+
selector: 'tfoot[slTableSummary]',
|
|
535
|
+
standalone: true,
|
|
536
|
+
exportAs: 'slTableSummary',
|
|
537
|
+
host: { 'data-part': 'summary' },
|
|
538
|
+
}]
|
|
539
|
+
}] });
|
|
540
|
+
/**
|
|
541
|
+
* The bar under the table and inside its frame, where a paged listing puts its
|
|
542
|
+
* control. It is a sibling of the scroller rather than a child, so a table
|
|
543
|
+
* scrolled sideways does not take its pagination with it.
|
|
544
|
+
*/
|
|
545
|
+
class SlTableFooter {
|
|
546
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
547
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlTableFooter, isStandalone: true, selector: "div[slTableFooter]", host: { attributes: { "data-part": "footer" } }, exportAs: ["slTableFooter"], ngImport: i0 });
|
|
548
|
+
}
|
|
549
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableFooter, decorators: [{
|
|
550
|
+
type: Directive,
|
|
551
|
+
args: [{
|
|
552
|
+
selector: 'div[slTableFooter]',
|
|
553
|
+
standalone: true,
|
|
554
|
+
exportAs: 'slTableFooter',
|
|
555
|
+
host: { 'data-part': 'footer' },
|
|
556
|
+
}]
|
|
557
|
+
}] });
|
|
558
|
+
/**
|
|
559
|
+
* One record. It carries `data-selected` and `data-expanded` for the stylesheet
|
|
560
|
+
* and `data-value` for the range and the select-all, which read the rows out of
|
|
561
|
+
* the DOM at the moment they act.
|
|
562
|
+
*
|
|
563
|
+
* A row is not selectable under the `table` role, so it carries no
|
|
564
|
+
* `aria-selected`: the state is painted here and announced by the checkbox.
|
|
565
|
+
*/
|
|
566
|
+
class SlTableRow {
|
|
567
|
+
/** The row's key, required wherever selection or expansion is on. */
|
|
568
|
+
value = input(undefined, /* @ts-ignore */
|
|
569
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
570
|
+
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
571
|
+
/**
|
|
572
|
+
* The row's position in the whole set, one-based, written only where the
|
|
573
|
+
* table states a total: the practice warns that setting `aria-rowindex` on
|
|
574
|
+
* some rows and not others has devastating effects on assistive technology.
|
|
575
|
+
*/
|
|
576
|
+
rowIndex = input(undefined, { ...(ngDevMode ? { debugName: "rowIndex" } : /* istanbul ignore next */ {}), transform: (index) => (index === undefined ? undefined : numberAttribute(index)) });
|
|
577
|
+
table = inject(SlTable);
|
|
578
|
+
selected = computed(() => {
|
|
579
|
+
const key = this.value();
|
|
580
|
+
return key !== undefined && this.table.isSelected(key);
|
|
581
|
+
}, /* @ts-ignore */
|
|
582
|
+
...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
|
|
583
|
+
expanded = computed(() => {
|
|
584
|
+
const key = this.value();
|
|
585
|
+
return key !== undefined && this.table.isExpanded(key);
|
|
586
|
+
}, /* @ts-ignore */
|
|
587
|
+
...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
|
|
588
|
+
detailId = computed(() => `${this.table.id}-detail-${this.value() ?? ''}`, /* @ts-ignore */
|
|
589
|
+
...(ngDevMode ? [{ debugName: "detailId" }] : /* istanbul ignore next */ []));
|
|
590
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableRow, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
591
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: SlTableRow, isStandalone: true, selector: "tr[slTableRow]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, rowIndex: { classPropertyName: "rowIndex", publicName: "rowIndex", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "row" }, properties: { "attr.data-value": "value() ?? null", "attr.data-selected": "selected() ? '' : null", "attr.data-expanded": "expanded() ? '' : null", "attr.data-disabled": "disabled() ? '' : null", "attr.aria-rowindex": "rowIndex() ?? null" } }, exportAs: ["slTableRow"], ngImport: i0 });
|
|
592
|
+
}
|
|
593
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableRow, decorators: [{
|
|
594
|
+
type: Directive,
|
|
595
|
+
args: [{
|
|
596
|
+
selector: 'tr[slTableRow]',
|
|
597
|
+
standalone: true,
|
|
598
|
+
exportAs: 'slTableRow',
|
|
599
|
+
host: {
|
|
600
|
+
'data-part': 'row',
|
|
601
|
+
'[attr.data-value]': 'value() ?? null',
|
|
602
|
+
'[attr.data-selected]': "selected() ? '' : null",
|
|
603
|
+
'[attr.data-expanded]': "expanded() ? '' : null",
|
|
604
|
+
'[attr.data-disabled]': "disabled() ? '' : null",
|
|
605
|
+
'[attr.aria-rowindex]': 'rowIndex() ?? null',
|
|
606
|
+
},
|
|
607
|
+
}]
|
|
608
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], rowIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowIndex", required: false }] }] } });
|
|
609
|
+
/**
|
|
610
|
+
* A column's name. `scope="col"` is what makes a screen reader repeat it for
|
|
611
|
+
* every cell under it, and `aria-sort` is written here and on no other header.
|
|
612
|
+
*
|
|
613
|
+
* A name cut by its own box — `text="truncate"` on a column with no room —
|
|
614
|
+
* reads `Op…` to the eye while the whole of it is still what a screen reader
|
|
615
|
+
* repeats under every cell. The hint closes that gap: it opens only while the
|
|
616
|
+
* name is measured as cut, which a header that wraps or fits never is, and it
|
|
617
|
+
* is shown rather than read — `describes="none"`, because the header already
|
|
618
|
+
* states the words.
|
|
619
|
+
*/
|
|
620
|
+
class SlTableColumnHeader {
|
|
621
|
+
/** The column's own key, which the sort descriptor names. */
|
|
622
|
+
column = input(undefined, /* @ts-ignore */
|
|
623
|
+
...(ngDevMode ? [{ debugName: "column" }] : /* istanbul ignore next */ []));
|
|
624
|
+
scope = input(undefined, /* @ts-ignore */
|
|
625
|
+
...(ngDevMode ? [{ debugName: "scope" }] : /* istanbul ignore next */ []));
|
|
626
|
+
table = inject(SlTable);
|
|
627
|
+
tooltip = inject(SlTooltip);
|
|
628
|
+
native = inject(ElementRef).nativeElement;
|
|
629
|
+
ariaSort = computed(() => {
|
|
630
|
+
const sort = this.table.sort();
|
|
631
|
+
return sort !== null && sort.column === this.column() ? sort.direction : null;
|
|
632
|
+
}, /* @ts-ignore */
|
|
633
|
+
...(ngDevMode ? [{ debugName: "ariaSort" }] : /* istanbul ignore next */ []));
|
|
634
|
+
/** The words the header itself holds, read when the hint is about to show them. */
|
|
635
|
+
hint = computed(() => this.tooltip.isOpen() ? (this.native.textContent ?? '').trim() : '', /* @ts-ignore */
|
|
636
|
+
...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
|
|
637
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableColumnHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
638
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlTableColumnHeader, isStandalone: true, selector: "th[slTableColumnHeader]", inputs: { column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: false, transformFunction: null }, scope: { classPropertyName: "scope", publicName: "scope", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "column-header" }, properties: { "attr.scope": "scope() ?? 'col'", "attr.aria-sort": "ariaSort()" } }, providers: [
|
|
639
|
+
provideTooltipDefaults({
|
|
640
|
+
describes: 'none',
|
|
641
|
+
openOn: 'hover',
|
|
642
|
+
side: 'bottom',
|
|
643
|
+
whenClipped: true,
|
|
644
|
+
}),
|
|
645
|
+
], exportAs: ["slTableColumnHeader"], hostDirectives: [{ directive: SlTableCellAxes, inputs: ["align", "align", "blockAlign", "blockAlign", "numeric", "numeric", "text", "text", "sticky", "sticky", "stickyOffset", "stickyOffset"] }, { directive: i1.SlTooltip }, { directive: i1.SlTooltipTrigger }], ngImport: i0, template: `<ng-content />
|
|
646
|
+
<ng-template slTooltipLayer>
|
|
647
|
+
<div slTooltipContent>{{ hint() }}</div>
|
|
648
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "component", type: SlTooltipContent, selector: "[slTooltipContent]", exportAs: ["slTooltipContent"] }, { kind: "directive", type: SlTooltipLayer, selector: "ng-template[slTooltipLayer]", exportAs: ["slTooltipLayer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
649
|
+
}
|
|
650
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableColumnHeader, decorators: [{
|
|
651
|
+
type: Component,
|
|
652
|
+
args: [{
|
|
653
|
+
selector: 'th[slTableColumnHeader]',
|
|
654
|
+
standalone: true,
|
|
655
|
+
exportAs: 'slTableColumnHeader',
|
|
656
|
+
imports: [SlTooltipContent, SlTooltipLayer],
|
|
657
|
+
template: `<ng-content />
|
|
658
|
+
<ng-template slTooltipLayer>
|
|
659
|
+
<div slTooltipContent>{{ hint() }}</div>
|
|
660
|
+
</ng-template>`,
|
|
661
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
662
|
+
encapsulation: ViewEncapsulation.None,
|
|
663
|
+
hostDirectives: [
|
|
664
|
+
{
|
|
665
|
+
directive: SlTableCellAxes,
|
|
666
|
+
inputs: ['align', 'blockAlign', 'numeric', 'text', 'sticky', 'stickyOffset'],
|
|
667
|
+
},
|
|
668
|
+
SlTooltip,
|
|
669
|
+
SlTooltipTrigger,
|
|
670
|
+
],
|
|
671
|
+
providers: [
|
|
672
|
+
provideTooltipDefaults({
|
|
673
|
+
describes: 'none',
|
|
674
|
+
openOn: 'hover',
|
|
675
|
+
side: 'bottom',
|
|
676
|
+
whenClipped: true,
|
|
677
|
+
}),
|
|
678
|
+
],
|
|
679
|
+
host: {
|
|
680
|
+
'data-part': 'column-header',
|
|
681
|
+
'[attr.scope]': "scope() ?? 'col'",
|
|
682
|
+
'[attr.aria-sort]': 'ariaSort()',
|
|
683
|
+
},
|
|
684
|
+
}]
|
|
685
|
+
}], propDecorators: { column: [{ type: i0.Input, args: [{ isSignal: true, alias: "column", required: false }] }], scope: [{ type: i0.Input, args: [{ isSignal: true, alias: "scope", required: false }] }] } });
|
|
686
|
+
/**
|
|
687
|
+
* The cell that identifies the record, which a screen reader repeats in each of
|
|
688
|
+
* the cells beside it. It states no colour of its own, so a selected record's
|
|
689
|
+
* name turns with the row and a disabled one dims with it.
|
|
690
|
+
*/
|
|
691
|
+
class SlTableRowHeader {
|
|
692
|
+
scope = input(undefined, /* @ts-ignore */
|
|
693
|
+
...(ngDevMode ? [{ debugName: "scope" }] : /* istanbul ignore next */ []));
|
|
694
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableRowHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
695
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: SlTableRowHeader, isStandalone: true, selector: "th[slTableRowHeader]", inputs: { scope: { classPropertyName: "scope", publicName: "scope", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "row-header" }, properties: { "attr.scope": "scope() ?? 'row'" } }, exportAs: ["slTableRowHeader"], hostDirectives: [{ directive: SlTableCellAxes, inputs: ["align", "align", "blockAlign", "blockAlign", "numeric", "numeric", "text", "text", "sticky", "sticky", "stickyOffset", "stickyOffset"] }], ngImport: i0 });
|
|
696
|
+
}
|
|
697
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableRowHeader, decorators: [{
|
|
698
|
+
type: Directive,
|
|
699
|
+
args: [{
|
|
700
|
+
selector: 'th[slTableRowHeader]',
|
|
701
|
+
standalone: true,
|
|
702
|
+
exportAs: 'slTableRowHeader',
|
|
703
|
+
hostDirectives: [
|
|
704
|
+
{
|
|
705
|
+
directive: SlTableCellAxes,
|
|
706
|
+
inputs: ['align', 'blockAlign', 'numeric', 'text', 'sticky', 'stickyOffset'],
|
|
707
|
+
},
|
|
708
|
+
],
|
|
709
|
+
host: { 'data-part': 'row-header', '[attr.scope]': "scope() ?? 'row'" },
|
|
710
|
+
}]
|
|
711
|
+
}], propDecorators: { scope: [{ type: i0.Input, args: [{ isSignal: true, alias: "scope", required: false }] }] } });
|
|
712
|
+
class SlTableCell {
|
|
713
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableCell, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
714
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlTableCell, isStandalone: true, selector: "td[slTableCell]", host: { attributes: { "data-part": "cell" } }, exportAs: ["slTableCell"], hostDirectives: [{ directive: SlTableCellAxes, inputs: ["align", "align", "blockAlign", "blockAlign", "numeric", "numeric", "text", "text", "sticky", "sticky", "stickyOffset", "stickyOffset"] }], ngImport: i0 });
|
|
715
|
+
}
|
|
716
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableCell, decorators: [{
|
|
717
|
+
type: Directive,
|
|
718
|
+
args: [{
|
|
719
|
+
selector: 'td[slTableCell]',
|
|
720
|
+
standalone: true,
|
|
721
|
+
exportAs: 'slTableCell',
|
|
722
|
+
hostDirectives: [
|
|
723
|
+
{
|
|
724
|
+
directive: SlTableCellAxes,
|
|
725
|
+
inputs: ['align', 'blockAlign', 'numeric', 'text', 'sticky', 'stickyOffset'],
|
|
726
|
+
},
|
|
727
|
+
],
|
|
728
|
+
host: { 'data-part': 'cell' },
|
|
729
|
+
}]
|
|
730
|
+
}] });
|
|
731
|
+
/**
|
|
732
|
+
* The column's name wrapped in a button, which is what the APG's own sortable
|
|
733
|
+
* example does. The cycle is ascending, descending, then none.
|
|
734
|
+
*
|
|
735
|
+
* The consumer's own listener runs as well: this is a listener on the host, so
|
|
736
|
+
* both fire and a consumer who calls `preventDefault()` keeps the sort still.
|
|
737
|
+
*/
|
|
738
|
+
class SlTableSort {
|
|
739
|
+
/** Overrides the column the header states, where a header holds two. */
|
|
740
|
+
column = input(undefined, /* @ts-ignore */
|
|
741
|
+
...(ngDevMode ? [{ debugName: "column" }] : /* istanbul ignore next */ []));
|
|
742
|
+
table = inject(SlTable);
|
|
743
|
+
header = inject(SlTableColumnHeader, { optional: true });
|
|
744
|
+
press(event) {
|
|
745
|
+
if (event.defaultPrevented)
|
|
746
|
+
return;
|
|
747
|
+
const key = this.column() ?? this.header?.column();
|
|
748
|
+
if (key === undefined)
|
|
749
|
+
return;
|
|
750
|
+
this.table.requestSort(key, event);
|
|
751
|
+
}
|
|
752
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSort, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
753
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlTableSort, isStandalone: true, selector: "button[slTableSort]", inputs: { column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "sort", "type": "button" }, listeners: { "click": "press($event)" } }, exportAs: ["slTableSort"], ngImport: i0, template: `<ng-content /><span slIcon><svg slGlyph name="chevron-down"></svg></span>`, isInline: true, dependencies: [{ kind: "component", type: SlGlyph, selector: "svg[slGlyph]", inputs: ["name", "solid"] }, { kind: "component", type: SlIcon, selector: "[slIcon]", inputs: ["directional", "label", "size", "tone"], exportAs: ["slIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
754
|
+
}
|
|
755
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSort, decorators: [{
|
|
756
|
+
type: Component,
|
|
757
|
+
args: [{
|
|
758
|
+
selector: 'button[slTableSort]',
|
|
759
|
+
standalone: true,
|
|
760
|
+
exportAs: 'slTableSort',
|
|
761
|
+
imports: [SlGlyph, SlIcon],
|
|
762
|
+
/* The direction mark follows the name: one chevron the stylesheet turns over
|
|
763
|
+
for ascending and shows, muted, under the pointer on an unsorted column. */
|
|
764
|
+
template: `<ng-content /><span slIcon><svg slGlyph name="chevron-down"></svg></span>`,
|
|
765
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
766
|
+
host: {
|
|
767
|
+
'data-part': 'sort',
|
|
768
|
+
type: 'button',
|
|
769
|
+
'(click)': 'press($event)',
|
|
770
|
+
},
|
|
771
|
+
}]
|
|
772
|
+
}], propDecorators: { column: [{ type: i0.Input, args: [{ isSignal: true, alias: "column", required: false }] }] } });
|
|
773
|
+
/**
|
|
774
|
+
* The slot beside a column's name for the controls it carries: a filter
|
|
775
|
+
* trigger, a column menu, a help hint. The family holds the place and the
|
|
776
|
+
* geometry; what a filter means is the consumer's query.
|
|
777
|
+
*/
|
|
778
|
+
class SlTableColumnActions {
|
|
779
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableColumnActions, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
780
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlTableColumnActions, isStandalone: true, selector: "span[slTableColumnActions]", host: { attributes: { "data-part": "column-actions" } }, exportAs: ["slTableColumnActions"], ngImport: i0 });
|
|
781
|
+
}
|
|
782
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableColumnActions, decorators: [{
|
|
783
|
+
type: Directive,
|
|
784
|
+
args: [{
|
|
785
|
+
selector: 'span[slTableColumnActions]',
|
|
786
|
+
standalone: true,
|
|
787
|
+
exportAs: 'slTableColumnActions',
|
|
788
|
+
host: { 'data-part': 'column-actions' },
|
|
789
|
+
}]
|
|
790
|
+
}] });
|
|
791
|
+
/**
|
|
792
|
+
* A row's own checkbox, in the cell the family lays out. The control is
|
|
793
|
+
* `checkbox`'s: the cell is this family's and the chooser is not, which is the
|
|
794
|
+
* division `list-item` recorded. Its name is a visually hidden label rather
|
|
795
|
+
* than an `aria-label` on the wrapper, because the wrapper is not the control.
|
|
796
|
+
*
|
|
797
|
+
* `Shift` while pressing selects every row from the anchor to this one.
|
|
798
|
+
*/
|
|
799
|
+
class SlTableSelect {
|
|
800
|
+
/** The row this checkbox chooses. Read from the row when it is not stated. */
|
|
801
|
+
value = input(undefined, /* @ts-ignore */
|
|
802
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
803
|
+
table = inject(SlTable);
|
|
804
|
+
row = inject(SlTableRow);
|
|
805
|
+
key = computed(() => this.value() ?? this.row.value(), /* @ts-ignore */
|
|
806
|
+
...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
|
|
807
|
+
checked = computed(() => {
|
|
808
|
+
const key = this.key();
|
|
809
|
+
return key !== undefined && this.table.isSelected(key);
|
|
810
|
+
}, /* @ts-ignore */
|
|
811
|
+
...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
|
|
812
|
+
name = computed(() => {
|
|
813
|
+
const key = this.key();
|
|
814
|
+
return this.table.t('selectRow', { row: key ?? '' }).trim();
|
|
815
|
+
}, /* @ts-ignore */
|
|
816
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
817
|
+
press(event) {
|
|
818
|
+
const key = this.key();
|
|
819
|
+
if (key === undefined || this.row.disabled())
|
|
820
|
+
return;
|
|
821
|
+
this.table.toggleSelected(key, { range: event.shiftKey, source: event });
|
|
822
|
+
}
|
|
823
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSelect, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
824
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlTableSelect, isStandalone: true, selector: "td[slTableSelect]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "selection" } }, exportAs: ["slTableSelect"], hostDirectives: [{ directive: SlTableCellAxes, inputs: ["align", "align", "blockAlign", "blockAlign", "numeric", "numeric", "text", "text", "sticky", "sticky", "stickyOffset", "stickyOffset"] }], ngImport: i0, template: `<span
|
|
825
|
+
slCheckbox
|
|
826
|
+
[checked]="checked()"
|
|
827
|
+
[disabled]="row.disabled()"
|
|
828
|
+
(click)="press($event)"
|
|
829
|
+
>
|
|
830
|
+
<span data-ui="visually-hidden" data-part="root">{{ name() }}</span>
|
|
831
|
+
</span>`, isInline: true, dependencies: [{ kind: "component", type: SlCheckbox, selector: "[slCheckbox]", inputs: ["checked", "defaultChecked", "indeterminate", "parent", "value", "name", "size", "labelPlacement", "variant", "disabled", "readOnly", "invalid"], outputs: ["checkedChange"], exportAs: ["slCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
832
|
+
}
|
|
833
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSelect, decorators: [{
|
|
834
|
+
type: Component,
|
|
835
|
+
args: [{
|
|
836
|
+
selector: 'td[slTableSelect]',
|
|
837
|
+
standalone: true,
|
|
838
|
+
exportAs: 'slTableSelect',
|
|
839
|
+
imports: [SlCheckbox],
|
|
840
|
+
template: `<span
|
|
841
|
+
slCheckbox
|
|
842
|
+
[checked]="checked()"
|
|
843
|
+
[disabled]="row.disabled()"
|
|
844
|
+
(click)="press($event)"
|
|
845
|
+
>
|
|
846
|
+
<span data-ui="visually-hidden" data-part="root">{{ name() }}</span>
|
|
847
|
+
</span>`,
|
|
848
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
849
|
+
encapsulation: ViewEncapsulation.None,
|
|
850
|
+
hostDirectives: [
|
|
851
|
+
{
|
|
852
|
+
directive: SlTableCellAxes,
|
|
853
|
+
inputs: ['align', 'blockAlign', 'numeric', 'text', 'sticky', 'stickyOffset'],
|
|
854
|
+
},
|
|
855
|
+
],
|
|
856
|
+
host: { 'data-part': 'selection' },
|
|
857
|
+
}]
|
|
858
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
|
|
859
|
+
/**
|
|
860
|
+
* The header's checkbox. It covers the rows in the DOM, is indeterminate while
|
|
861
|
+
* some of them are selected, and states the count it covers in its own name — a
|
|
862
|
+
* selection over a whole result set is a decision only the consumer's query can
|
|
863
|
+
* make.
|
|
864
|
+
*/
|
|
865
|
+
class SlTableSelectAll {
|
|
866
|
+
table = inject(SlTable);
|
|
867
|
+
checked = computed(() => {
|
|
868
|
+
const chosen = this.table.value().length;
|
|
869
|
+
return chosen > 0 && chosen === this.table.rows().length;
|
|
870
|
+
}, /* @ts-ignore */
|
|
871
|
+
...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
|
|
872
|
+
indeterminate = computed(() => {
|
|
873
|
+
const chosen = this.table.value().length;
|
|
874
|
+
return chosen > 0 && chosen < this.table.rows().length;
|
|
875
|
+
}, /* @ts-ignore */
|
|
876
|
+
...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
|
|
877
|
+
name = computed(() => {
|
|
878
|
+
return this.table.t('selectAll', { count: this.table.value().length });
|
|
879
|
+
}, /* @ts-ignore */
|
|
880
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
881
|
+
press(event) {
|
|
882
|
+
this.table.toggleSelectAll(event);
|
|
883
|
+
}
|
|
884
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSelectAll, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
885
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.7", type: SlTableSelectAll, isStandalone: true, selector: "th[slTableSelectAll]", host: { attributes: { "data-part": "selection", "scope": "col" } }, exportAs: ["slTableSelectAll"], hostDirectives: [{ directive: SlTableCellAxes, inputs: ["align", "align", "blockAlign", "blockAlign", "numeric", "numeric", "text", "text", "sticky", "sticky", "stickyOffset", "stickyOffset"] }], ngImport: i0, template: `<span
|
|
886
|
+
slCheckbox
|
|
887
|
+
[checked]="checked()"
|
|
888
|
+
[indeterminate]="indeterminate()"
|
|
889
|
+
(click)="press($event)"
|
|
890
|
+
>
|
|
891
|
+
<span data-ui="visually-hidden" data-part="root">{{ name() }}</span>
|
|
892
|
+
</span>`, isInline: true, dependencies: [{ kind: "component", type: SlCheckbox, selector: "[slCheckbox]", inputs: ["checked", "defaultChecked", "indeterminate", "parent", "value", "name", "size", "labelPlacement", "variant", "disabled", "readOnly", "invalid"], outputs: ["checkedChange"], exportAs: ["slCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
893
|
+
}
|
|
894
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSelectAll, decorators: [{
|
|
895
|
+
type: Component,
|
|
896
|
+
args: [{
|
|
897
|
+
selector: 'th[slTableSelectAll]',
|
|
898
|
+
standalone: true,
|
|
899
|
+
exportAs: 'slTableSelectAll',
|
|
900
|
+
imports: [SlCheckbox],
|
|
901
|
+
template: `<span
|
|
902
|
+
slCheckbox
|
|
903
|
+
[checked]="checked()"
|
|
904
|
+
[indeterminate]="indeterminate()"
|
|
905
|
+
(click)="press($event)"
|
|
906
|
+
>
|
|
907
|
+
<span data-ui="visually-hidden" data-part="root">{{ name() }}</span>
|
|
908
|
+
</span>`,
|
|
909
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
910
|
+
encapsulation: ViewEncapsulation.None,
|
|
911
|
+
hostDirectives: [
|
|
912
|
+
{
|
|
913
|
+
directive: SlTableCellAxes,
|
|
914
|
+
inputs: ['align', 'blockAlign', 'numeric', 'text', 'sticky', 'stickyOffset'],
|
|
915
|
+
},
|
|
916
|
+
],
|
|
917
|
+
host: { 'data-part': 'selection', scope: 'col' },
|
|
918
|
+
}]
|
|
919
|
+
}] });
|
|
920
|
+
/**
|
|
921
|
+
* The Disclosure pattern, borrowed whole: a `button` carrying `aria-expanded`
|
|
922
|
+
* and naming the row it opens.
|
|
923
|
+
*/
|
|
924
|
+
class SlTableExpander {
|
|
925
|
+
value = input(undefined, /* @ts-ignore */
|
|
926
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
927
|
+
table = inject(SlTable);
|
|
928
|
+
row = inject(SlTableRow);
|
|
929
|
+
name = computed(() => {
|
|
930
|
+
return this.row.expanded() ? this.table.t('collapse') : this.table.t('expand');
|
|
931
|
+
}, /* @ts-ignore */
|
|
932
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
933
|
+
press(event) {
|
|
934
|
+
if (event.defaultPrevented)
|
|
935
|
+
return;
|
|
936
|
+
const key = this.value() ?? this.row.value();
|
|
937
|
+
if (key === undefined)
|
|
938
|
+
return;
|
|
939
|
+
this.table.toggleExpanded(key, event);
|
|
940
|
+
}
|
|
941
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableExpander, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
942
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlTableExpander, isStandalone: true, selector: "button[slTableExpander]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "expander", "type": "button" }, listeners: { "click": "press($event)" }, properties: { "attr.aria-expanded": "row.expanded()", "attr.aria-controls": "row.expanded() ? row.detailId() : null", "attr.aria-label": "name()" } }, exportAs: ["slTableExpander"], ngImport: i0, template: `<ng-content
|
|
943
|
+
><span slIcon><svg slGlyph name="chevron-right"></svg></span
|
|
944
|
+
></ng-content>`, isInline: true, dependencies: [{ kind: "component", type: SlGlyph, selector: "svg[slGlyph]", inputs: ["name", "solid"] }, { kind: "component", type: SlIcon, selector: "[slIcon]", inputs: ["directional", "label", "size", "tone"], exportAs: ["slIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
945
|
+
}
|
|
946
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableExpander, decorators: [{
|
|
947
|
+
type: Component,
|
|
948
|
+
args: [{
|
|
949
|
+
selector: 'button[slTableExpander]',
|
|
950
|
+
standalone: true,
|
|
951
|
+
exportAs: 'slTableExpander',
|
|
952
|
+
imports: [SlGlyph, SlIcon],
|
|
953
|
+
/* The chevron is drawn unless the consumer wrote content of their own. */
|
|
954
|
+
template: `<ng-content
|
|
955
|
+
><span slIcon><svg slGlyph name="chevron-right"></svg></span
|
|
956
|
+
></ng-content>`,
|
|
957
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
958
|
+
host: {
|
|
959
|
+
'data-part': 'expander',
|
|
960
|
+
type: 'button',
|
|
961
|
+
'[attr.aria-expanded]': 'row.expanded()',
|
|
962
|
+
'[attr.aria-controls]': 'row.expanded() ? row.detailId() : null',
|
|
963
|
+
'[attr.aria-label]': 'name()',
|
|
964
|
+
'(click)': 'press($event)',
|
|
965
|
+
},
|
|
966
|
+
}]
|
|
967
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }] } });
|
|
968
|
+
/**
|
|
969
|
+
* One row holding one cell that spans the table.
|
|
970
|
+
*
|
|
971
|
+
* **The consumer writes the `@if`.** Angular's own control flow is what keeps a
|
|
972
|
+
* closed detail out of the DOM entirely, and a component whose host is the `tr`
|
|
973
|
+
* cannot remove that `tr` from inside itself — an empty row is a row a screen
|
|
974
|
+
* reader still counts. React returns `null` from the component instead, and the
|
|
975
|
+
* two reach the same DOM; the asymmetry is the frameworks', not the family's.
|
|
976
|
+
*/
|
|
977
|
+
class SlTableDetail {
|
|
978
|
+
/** The row the detail belongs to. */
|
|
979
|
+
value = input.required(/* @ts-ignore */
|
|
980
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
981
|
+
/** How many columns the detail spans. Defaults to the table's own count. */
|
|
982
|
+
colSpan = input(undefined, { ...(ngDevMode ? { debugName: "colSpan" } : /* istanbul ignore next */ {}), transform: (count) => (count === undefined ? undefined : numberAttribute(count)) });
|
|
983
|
+
table = inject(SlTable);
|
|
984
|
+
span = computed(() => this.colSpan() ?? this.table.resolvedColumns(), /* @ts-ignore */
|
|
985
|
+
...(ngDevMode ? [{ debugName: "span" }] : /* istanbul ignore next */ []));
|
|
986
|
+
detailId = computed(() => `${this.table.id}-detail-${this.value()}`, /* @ts-ignore */
|
|
987
|
+
...(ngDevMode ? [{ debugName: "detailId" }] : /* istanbul ignore next */ []));
|
|
988
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableDetail, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
989
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlTableDetail, isStandalone: true, selector: "tr[slTableDetail]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, colSpan: { classPropertyName: "colSpan", publicName: "colSpan", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "detail" }, properties: { "attr.id": "detailId()" } }, exportAs: ["slTableDetail"], ngImport: i0, template: `<td [attr.colspan]="span()" data-part="cell"><ng-content /></td>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
990
|
+
}
|
|
991
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableDetail, decorators: [{
|
|
992
|
+
type: Component,
|
|
993
|
+
args: [{
|
|
994
|
+
selector: 'tr[slTableDetail]',
|
|
995
|
+
standalone: true,
|
|
996
|
+
exportAs: 'slTableDetail',
|
|
997
|
+
template: `<td [attr.colspan]="span()" data-part="cell"><ng-content /></td>`,
|
|
998
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
999
|
+
encapsulation: ViewEncapsulation.None,
|
|
1000
|
+
host: { 'data-part': 'detail', '[attr.id]': 'detailId()' },
|
|
1001
|
+
}]
|
|
1002
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], colSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colSpan", required: false }] }] } });
|
|
1003
|
+
/**
|
|
1004
|
+
* What is shown when there is nothing. It takes a `result-state`, whose status
|
|
1005
|
+
* axis already separates an empty set from a set a filter emptied.
|
|
1006
|
+
*/
|
|
1007
|
+
class SlTableEmpty {
|
|
1008
|
+
colSpan = input(undefined, { ...(ngDevMode ? { debugName: "colSpan" } : /* istanbul ignore next */ {}), transform: (count) => (count === undefined ? undefined : numberAttribute(count)) });
|
|
1009
|
+
table = inject(SlTable);
|
|
1010
|
+
span = computed(() => this.colSpan() ?? this.table.resolvedColumns(), /* @ts-ignore */
|
|
1011
|
+
...(ngDevMode ? [{ debugName: "span" }] : /* istanbul ignore next */ []));
|
|
1012
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableEmpty, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1013
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: SlTableEmpty, isStandalone: true, selector: "td[slTableEmpty]", inputs: { colSpan: { classPropertyName: "colSpan", publicName: "colSpan", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "empty" }, properties: { "attr.colspan": "span()" } }, exportAs: ["slTableEmpty"], ngImport: i0 });
|
|
1014
|
+
}
|
|
1015
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableEmpty, decorators: [{
|
|
1016
|
+
type: Directive,
|
|
1017
|
+
args: [{
|
|
1018
|
+
selector: 'td[slTableEmpty]',
|
|
1019
|
+
standalone: true,
|
|
1020
|
+
exportAs: 'slTableEmpty',
|
|
1021
|
+
host: { 'data-part': 'empty', '[attr.colspan]': 'span()' },
|
|
1022
|
+
}]
|
|
1023
|
+
}], propDecorators: { colSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colSpan", required: false }] }] } });
|
|
1024
|
+
/**
|
|
1025
|
+
* The skeleton rows of a first load: the table's shape before its content. A
|
|
1026
|
+
* refresh over rows already read is the other state and is not this one —
|
|
1027
|
+
* `loading` on the table dims the body and moves nothing.
|
|
1028
|
+
*/
|
|
1029
|
+
class SlTableLoader {
|
|
1030
|
+
/** How many skeleton rows a first load draws. */
|
|
1031
|
+
skeletonRows = input(5, { ...(ngDevMode ? { debugName: "skeletonRows" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
1032
|
+
table = inject(SlTable);
|
|
1033
|
+
skeleton = computed(() => Array.from({ length: this.skeletonRows() }, (_row, index) => index), /* @ts-ignore */
|
|
1034
|
+
...(ngDevMode ? [{ debugName: "skeleton" }] : /* istanbul ignore next */ []));
|
|
1035
|
+
cells = computed(() => Array.from({ length: this.table.resolvedColumns() }, (_cell, index) => index), /* @ts-ignore */
|
|
1036
|
+
...(ngDevMode ? [{ debugName: "cells" }] : /* istanbul ignore next */ []));
|
|
1037
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableLoader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1038
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlTableLoader, isStandalone: true, selector: "tbody[slTableLoader]", inputs: { skeletonRows: { classPropertyName: "skeletonRows", publicName: "skeletonRows", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "loader", "aria-hidden": "true" } }, exportAs: ["slTableLoader"], ngImport: i0, template: `@for (row of skeleton(); track row) {
|
|
1039
|
+
<tr data-part="row">
|
|
1040
|
+
@for (cell of cells(); track cell) {
|
|
1041
|
+
<td data-part="cell">
|
|
1042
|
+
<span slSkeleton loading inlineSize="100%"></span>
|
|
1043
|
+
</td>
|
|
1044
|
+
}
|
|
1045
|
+
</tr>
|
|
1046
|
+
}`, isInline: true, dependencies: [{ kind: "component", type: SlSkeleton, selector: "[slSkeleton]", inputs: ["shape", "size", "animation", "loading", "inlineSize", "blockSize"], exportAs: ["slSkeleton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1047
|
+
}
|
|
1048
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableLoader, decorators: [{
|
|
1049
|
+
type: Component,
|
|
1050
|
+
args: [{
|
|
1051
|
+
selector: 'tbody[slTableLoader]',
|
|
1052
|
+
standalone: true,
|
|
1053
|
+
exportAs: 'slTableLoader',
|
|
1054
|
+
imports: [SlSkeleton],
|
|
1055
|
+
template: `@for (row of skeleton(); track row) {
|
|
1056
|
+
<tr data-part="row">
|
|
1057
|
+
@for (cell of cells(); track cell) {
|
|
1058
|
+
<td data-part="cell">
|
|
1059
|
+
<span slSkeleton loading inlineSize="100%"></span>
|
|
1060
|
+
</td>
|
|
1061
|
+
}
|
|
1062
|
+
</tr>
|
|
1063
|
+
}`,
|
|
1064
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1065
|
+
encapsulation: ViewEncapsulation.None,
|
|
1066
|
+
host: { 'data-part': 'loader', 'aria-hidden': 'true' },
|
|
1067
|
+
}]
|
|
1068
|
+
}], propDecorators: { skeletonRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "skeletonRows", required: false }] }] } });
|
|
1069
|
+
/** Every part of the family, for a template that imports the set at once. */
|
|
1070
|
+
const SL_TABLE_PARTS = [
|
|
1071
|
+
SlTableBody,
|
|
1072
|
+
SlTableCaption,
|
|
1073
|
+
SlTableCell,
|
|
1074
|
+
SlTableColumnActions,
|
|
1075
|
+
SlTableColumnHeader,
|
|
1076
|
+
SlTableDetail,
|
|
1077
|
+
SlTableEmpty,
|
|
1078
|
+
SlTableExpander,
|
|
1079
|
+
SlTableFooter,
|
|
1080
|
+
SlTableHead,
|
|
1081
|
+
SlTableLoader,
|
|
1082
|
+
SlTableRow,
|
|
1083
|
+
SlTableRowHeader,
|
|
1084
|
+
SlTableSelect,
|
|
1085
|
+
SlTableSelectAll,
|
|
1086
|
+
SlTableSort,
|
|
1087
|
+
SlTableSummary,
|
|
1088
|
+
];
|
|
1089
|
+
|
|
1090
|
+
/**
|
|
1091
|
+
* Everything the five filters share: the draft, the conditions, the join, the
|
|
1092
|
+
* announcements and the request that carries a reason. What each of them adds
|
|
1093
|
+
* is its kind, its own typed `value`, and the control inside `filter-operand`.
|
|
1094
|
+
*
|
|
1095
|
+
* The panel edits a **draft**. Nothing reaches the consumer until Apply, and
|
|
1096
|
+
* Escape or a press outside restores the descriptor the panel opened with. The
|
|
1097
|
+
* family applies nothing: it reports the descriptor, and
|
|
1098
|
+
* `createFilterPredicate` in `@slotted/core/filter` is what a consumer applies
|
|
1099
|
+
* to its own rows.
|
|
1100
|
+
*/
|
|
1101
|
+
class SlTableFilterBase {
|
|
1102
|
+
/**
|
|
1103
|
+
* The operators this column offers, narrowing the kind's own list. Declared
|
|
1104
|
+
* once here rather than per component: the narrow operator type is the one
|
|
1105
|
+
* thing a shared base cannot keep, and the value — which is what a consumer
|
|
1106
|
+
* reads — stays exact on each of the five.
|
|
1107
|
+
*/
|
|
1108
|
+
operators = input(undefined, /* @ts-ignore */
|
|
1109
|
+
...(ngDevMode ? [{ debugName: "operators" }] : /* istanbul ignore next */ []));
|
|
1110
|
+
/** Which one the panel opens on. The kind's own default unless stated. */
|
|
1111
|
+
defaultOperator = input(undefined, /* @ts-ignore */
|
|
1112
|
+
...(ngDevMode ? [{ debugName: "defaultOperator" }] : /* istanbul ignore next */ []));
|
|
1113
|
+
/**
|
|
1114
|
+
* How many conditions the panel offers, which is AG Grid's
|
|
1115
|
+
* `maxNumConditions`. The second appears once the first is complete.
|
|
1116
|
+
*/
|
|
1117
|
+
conditions = input(2, { ...(ngDevMode ? { debugName: "conditions" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
1118
|
+
/**
|
|
1119
|
+
* The column's name in the trigger's own name. Read from the column header
|
|
1120
|
+
* around it when it is not stated.
|
|
1121
|
+
*/
|
|
1122
|
+
columnLabel = input(undefined, /* @ts-ignore */
|
|
1123
|
+
...(ngDevMode ? [{ debugName: "columnLabel" }] : /* istanbul ignore next */ []));
|
|
1124
|
+
/**
|
|
1125
|
+
* The trigger's whole accessible name, replacing the one the catalog writes.
|
|
1126
|
+
* It is the trigger's `aria-label`, which no other input reaches.
|
|
1127
|
+
*/
|
|
1128
|
+
label = input(undefined, /* @ts-ignore */
|
|
1129
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
1130
|
+
/**
|
|
1131
|
+
* Whether the panel is drawn at the end of the document. On by default, and
|
|
1132
|
+
* that is not a preference: a framed table clips its own overflow, so an
|
|
1133
|
+
* unportalled panel is cut off at the frame's edge — read on the Angular
|
|
1134
|
+
* reference page, where the join and both actions were simply not there. The
|
|
1135
|
+
* React binding takes `popover`'s own default, which is the same answer.
|
|
1136
|
+
*/
|
|
1137
|
+
portal = input(true, { ...(ngDevMode ? { debugName: "portal" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
1138
|
+
/** The request behind every committed change, with the reason it carries. */
|
|
1139
|
+
valueChangeRequest = output();
|
|
1140
|
+
table = inject(SlTable);
|
|
1141
|
+
header = inject(SlTableColumnHeader, { optional: true });
|
|
1142
|
+
host = inject(ElementRef);
|
|
1143
|
+
open = model(false, /* @ts-ignore */
|
|
1144
|
+
...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
1145
|
+
draft = signal(emptyFilter('text'), /* @ts-ignore */
|
|
1146
|
+
...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
|
|
1147
|
+
/** The table's words, which the panel speaks in. */
|
|
1148
|
+
t = this.table.t;
|
|
1149
|
+
start = computed(() => this.defaultOperator() ?? defaultOperator(this.kind), /* @ts-ignore */
|
|
1150
|
+
...(ngDevMode ? [{ debugName: "start" }] : /* istanbul ignore next */ []));
|
|
1151
|
+
offered = computed(() => this.operators() ?? operatorsFor(this.kind), /* @ts-ignore */
|
|
1152
|
+
...(ngDevMode ? [{ debugName: "offered" }] : /* istanbul ignore next */ []));
|
|
1153
|
+
format = {
|
|
1154
|
+
join: (join) => this.t(`filterJoins.${join}`),
|
|
1155
|
+
operator: (operator) => this.t(`filterOperators.${operator}`),
|
|
1156
|
+
};
|
|
1157
|
+
operatorName(operator) {
|
|
1158
|
+
return this.format.operator(operator);
|
|
1159
|
+
}
|
|
1160
|
+
/** Every operator as a labelled option, so the closed chooser names its own. */
|
|
1161
|
+
operatorItems = computed(() => this.offered().map((operator) => ({ label: this.operatorName(operator), value: operator })), /* @ts-ignore */
|
|
1162
|
+
...(ngDevMode ? [{ debugName: "operatorItems" }] : /* istanbul ignore next */ []));
|
|
1163
|
+
joinName(join) {
|
|
1164
|
+
return this.format.join(join);
|
|
1165
|
+
}
|
|
1166
|
+
filtered = computed(() => isFilterActive(this.readValue()), /* @ts-ignore */
|
|
1167
|
+
...(ngDevMode ? [{ debugName: "filtered" }] : /* istanbul ignore next */ []));
|
|
1168
|
+
name = computed(() => {
|
|
1169
|
+
const stated = this.label();
|
|
1170
|
+
if (stated !== undefined)
|
|
1171
|
+
return stated;
|
|
1172
|
+
const column = this.columnName();
|
|
1173
|
+
const committed = this.readValue();
|
|
1174
|
+
return isFilterActive(committed)
|
|
1175
|
+
? this.t('filterApplied', { column, filter: describeFilter(committed, this.format) })
|
|
1176
|
+
: this.t('filterColumn', { column }).trim();
|
|
1177
|
+
}, /* @ts-ignore */
|
|
1178
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
1179
|
+
/** One condition, or the two the panel can hold. */
|
|
1180
|
+
rows = computed(() => {
|
|
1181
|
+
const draft = this.draft();
|
|
1182
|
+
const first = draft.conditions[0] ?? { operator: this.start() };
|
|
1183
|
+
/* AG Grid's own reveal: the second appears once the first is complete. A
|
|
1184
|
+
button would be one more word to translate before the common case, and an
|
|
1185
|
+
empty second row is noise in every panel that never needs it. */
|
|
1186
|
+
if (this.allowed() < 2 || !isConditionActive(this.kind, first))
|
|
1187
|
+
return [first];
|
|
1188
|
+
return [first, draft.conditions[1] ?? { operator: this.start() }];
|
|
1189
|
+
}, /* @ts-ignore */
|
|
1190
|
+
...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
|
|
1191
|
+
allowed() {
|
|
1192
|
+
return this.conditions();
|
|
1193
|
+
}
|
|
1194
|
+
hasSecond = computed(() => this.rows().length === 2, /* @ts-ignore */
|
|
1195
|
+
...(ngDevMode ? [{ debugName: "hasSecond" }] : /* istanbul ignore next */ []));
|
|
1196
|
+
/**
|
|
1197
|
+
* Whether the operand template draws one control for both ends of a range,
|
|
1198
|
+
* written as `data-range` on `filter-operand` so the two-column operand grid
|
|
1199
|
+
* collapses to one. The date, time and date-time filters say yes.
|
|
1200
|
+
*/
|
|
1201
|
+
rangeOperand() {
|
|
1202
|
+
return false;
|
|
1203
|
+
}
|
|
1204
|
+
/** Which of a kind's operands is drawn, written as `data-operand`. */
|
|
1205
|
+
operandName() {
|
|
1206
|
+
return null;
|
|
1207
|
+
}
|
|
1208
|
+
/** `data-range`, for the condition whose operator takes two operands. */
|
|
1209
|
+
rangeMark(condition) {
|
|
1210
|
+
return this.rangeOperand() && this.slotsOf(condition).length === 2 ? '' : null;
|
|
1211
|
+
}
|
|
1212
|
+
slotsOf(condition) {
|
|
1213
|
+
const operands = operandCount(condition.operator);
|
|
1214
|
+
return operands === 0 ? [] : operands === 1 ? [0] : [0, 1];
|
|
1215
|
+
}
|
|
1216
|
+
operandLabel(condition, slot) {
|
|
1217
|
+
if (operandCount(condition.operator) < 2)
|
|
1218
|
+
return this.t('filterValue');
|
|
1219
|
+
return slot === 0 ? this.t('filterFrom') : this.t('filterTo');
|
|
1220
|
+
}
|
|
1221
|
+
context(index) {
|
|
1222
|
+
const condition = this.rows()[index] ?? { operator: this.start() };
|
|
1223
|
+
return {
|
|
1224
|
+
apply: () => this.applyDraft(null, 'keyboard'),
|
|
1225
|
+
condition,
|
|
1226
|
+
label: (slot) => this.operandLabel(condition, slot),
|
|
1227
|
+
set: (slot, value) => this.setOperand(index, slot, value),
|
|
1228
|
+
setBoth: (value, end) => this.setOperands(index, value, end),
|
|
1229
|
+
slots: this.slotsOf(condition),
|
|
1230
|
+
};
|
|
1231
|
+
}
|
|
1232
|
+
announce(message) {
|
|
1233
|
+
getLiveAnnouncer(this.host.nativeElement.ownerDocument).announce(message);
|
|
1234
|
+
}
|
|
1235
|
+
/**
|
|
1236
|
+
* Opens and closes, and resets the draft either way: the draft starts from
|
|
1237
|
+
* what is committed every time the panel opens, and closing puts it back —
|
|
1238
|
+
* closing is cancelling, and Apply closes the panel itself after committing.
|
|
1239
|
+
*/
|
|
1240
|
+
toggle(next) {
|
|
1241
|
+
this.open.set(next);
|
|
1242
|
+
this.draft.set(this.readValue() ?? this.blank());
|
|
1243
|
+
}
|
|
1244
|
+
blank() {
|
|
1245
|
+
return emptyFilter(this.kind, this.start());
|
|
1246
|
+
}
|
|
1247
|
+
setOperator(index, operator) {
|
|
1248
|
+
const condition = this.rows()[index] ?? { operator: this.start() };
|
|
1249
|
+
const before = operandCount(condition.operator);
|
|
1250
|
+
const after = operandCount(operator);
|
|
1251
|
+
/* An operand the new operator still takes survives the change: a reader who
|
|
1252
|
+
typed a value and then chose a different comparison meant to keep it. */
|
|
1253
|
+
const next = {
|
|
1254
|
+
operator,
|
|
1255
|
+
...(after >= 1 && before >= 1 ? { value: condition.value } : {}),
|
|
1256
|
+
...(after === 2 && before === 2 ? { end: condition.end } : {}),
|
|
1257
|
+
};
|
|
1258
|
+
this.draft.set(withCondition(this.draft(), index, next));
|
|
1259
|
+
/* The panel grows a field or loses two. Announced, because a form that
|
|
1260
|
+
changes shape under a reader who cannot see it says nothing otherwise. */
|
|
1261
|
+
if (after !== before) {
|
|
1262
|
+
this.announce(this.t('filterOperands', { operator: this.operatorName(operator), count: after }));
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
setOperand(index, slot, operand) {
|
|
1266
|
+
const condition = this.rows()[index] ?? { operator: this.start() };
|
|
1267
|
+
const wasActive = isConditionActive(this.kind, condition);
|
|
1268
|
+
const next = slot === 0 ? { ...condition, value: operand } : { ...condition, end: operand };
|
|
1269
|
+
this.draft.set(withCondition(this.draft(), index, next));
|
|
1270
|
+
if (index === 0 && this.allowed() >= 2 && !wasActive && isConditionActive(this.kind, next)) {
|
|
1271
|
+
this.announce(this.t('filterConditionAdded'));
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
setOperands(index, value, end) {
|
|
1275
|
+
const condition = this.rows()[index] ?? { operator: this.start() };
|
|
1276
|
+
const wasActive = isConditionActive(this.kind, condition);
|
|
1277
|
+
const next = { ...condition, value, end };
|
|
1278
|
+
this.draft.set(withCondition(this.draft(), index, next));
|
|
1279
|
+
if (index === 0 && this.allowed() >= 2 && !wasActive && isConditionActive(this.kind, next)) {
|
|
1280
|
+
this.announce(this.t('filterConditionAdded'));
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
setJoin(join) {
|
|
1284
|
+
this.draft.set(withJoin(this.draft(), join));
|
|
1285
|
+
}
|
|
1286
|
+
/**
|
|
1287
|
+
* Named for what it does rather than `apply`, which reads as
|
|
1288
|
+
* `Function.prototype.apply` to a linter and to the next reader after it.
|
|
1289
|
+
*/
|
|
1290
|
+
applyDraft(source, reason = 'pointer') {
|
|
1291
|
+
const next = normalizeFilter(this.draft());
|
|
1292
|
+
this.request(next, reason, source);
|
|
1293
|
+
const column = this.columnName();
|
|
1294
|
+
this.announce(next
|
|
1295
|
+
? this.t('filterApplied', { column, filter: describeFilter(next, this.format) })
|
|
1296
|
+
: this.t('filterCleared', { column }));
|
|
1297
|
+
this.open.set(false);
|
|
1298
|
+
}
|
|
1299
|
+
clear(source) {
|
|
1300
|
+
this.draft.set(this.blank());
|
|
1301
|
+
this.announce(this.t('filterCleared', { column: this.columnName() }));
|
|
1302
|
+
this.request(null, 'clear', source);
|
|
1303
|
+
this.open.set(false);
|
|
1304
|
+
}
|
|
1305
|
+
canClear = computed(() => isFilterActive(this.draft()), /* @ts-ignore */
|
|
1306
|
+
...(ngDevMode ? [{ debugName: "canClear" }] : /* istanbul ignore next */ []));
|
|
1307
|
+
columnName() {
|
|
1308
|
+
return this.columnLabel() ?? this.header?.column() ?? '';
|
|
1309
|
+
}
|
|
1310
|
+
request(next, reason, source) {
|
|
1311
|
+
const state = createControllable({
|
|
1312
|
+
initial: this.readValue(),
|
|
1313
|
+
/* Two descriptors are the same filter when they serialise the same. */
|
|
1314
|
+
equals: (a, b) => serializeFilter(a) === serializeFilter(b),
|
|
1315
|
+
onRequest: (request) => this.valueChangeRequest.emit(request),
|
|
1316
|
+
});
|
|
1317
|
+
if (state.request(next, reason, source))
|
|
1318
|
+
this.writeValue(next);
|
|
1319
|
+
}
|
|
1320
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableFilterBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1321
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: SlTableFilterBase, isStandalone: true, inputs: { operators: { classPropertyName: "operators", publicName: "operators", isSignal: true, isRequired: false, transformFunction: null }, defaultOperator: { classPropertyName: "defaultOperator", publicName: "defaultOperator", isSignal: true, isRequired: false, transformFunction: null }, conditions: { classPropertyName: "conditions", publicName: "conditions", isSignal: true, isRequired: false, transformFunction: null }, columnLabel: { classPropertyName: "columnLabel", publicName: "columnLabel", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, portal: { classPropertyName: "portal", publicName: "portal", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChangeRequest: "valueChangeRequest", open: "openChange" }, ngImport: i0 });
|
|
1322
|
+
}
|
|
1323
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableFilterBase, decorators: [{
|
|
1324
|
+
type: Directive
|
|
1325
|
+
}], propDecorators: { operators: [{ type: i0.Input, args: [{ isSignal: true, alias: "operators", required: false }] }], defaultOperator: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOperator", required: false }] }], conditions: [{ type: i0.Input, args: [{ isSignal: true, alias: "conditions", required: false }] }], columnLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnLabel", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], portal: [{ type: i0.Input, args: [{ isSignal: true, alias: "portal", required: false }] }], valueChangeRequest: [{ type: i0.Output, args: ["valueChangeRequest"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }] } });
|
|
1326
|
+
/**
|
|
1327
|
+
* The panel every kind shares, drawn around an operand its owner projects.
|
|
1328
|
+
*
|
|
1329
|
+
* The operand is an `ng-template` rather than projected content, because it is
|
|
1330
|
+
* rendered once per condition: content would be built once and then belong to
|
|
1331
|
+
* whichever condition asked for it first.
|
|
1332
|
+
*/
|
|
1333
|
+
class SlTableFilterShell {
|
|
1334
|
+
/** The filter this shell draws for. */
|
|
1335
|
+
owner = input.required({ ...(ngDevMode ? { debugName: "owner" } : /* istanbul ignore next */ {}), alias: 'slTableFilterShell' });
|
|
1336
|
+
/** The control inside `filter-operand`, rendered once per condition. */
|
|
1337
|
+
operand = input.required(/* @ts-ignore */
|
|
1338
|
+
...(ngDevMode ? [{ debugName: "operand" }] : /* istanbul ignore next */ []));
|
|
1339
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableFilterShell, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1340
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlTableFilterShell, isStandalone: true, selector: "span[slTableFilterShell]", inputs: { owner: { classPropertyName: "owner", publicName: "slTableFilterShell", isSignal: true, isRequired: true, transformFunction: null }, operand: { classPropertyName: "operand", publicName: "operand", isSignal: true, isRequired: true, transformFunction: null } }, exportAs: ["slTableFilterShell"], ngImport: i0, template: `<ng-container
|
|
1341
|
+
slPopover
|
|
1342
|
+
[portal]="owner().portal()"
|
|
1343
|
+
[open]="owner().open()"
|
|
1344
|
+
(openChange)="owner().toggle($event)"
|
|
1345
|
+
>
|
|
1346
|
+
<button
|
|
1347
|
+
slPopoverTrigger
|
|
1348
|
+
type="button"
|
|
1349
|
+
data-part="filter"
|
|
1350
|
+
[attr.data-filtered]="owner().filtered() ? '' : null"
|
|
1351
|
+
[attr.aria-label]="owner().name()"
|
|
1352
|
+
>
|
|
1353
|
+
<svg
|
|
1354
|
+
aria-hidden="true"
|
|
1355
|
+
viewBox="0 0 24 24"
|
|
1356
|
+
fill="none"
|
|
1357
|
+
stroke="currentColor"
|
|
1358
|
+
stroke-width="2"
|
|
1359
|
+
stroke-linecap="round"
|
|
1360
|
+
stroke-linejoin="round"
|
|
1361
|
+
>
|
|
1362
|
+
<path d="M22 3H2l8 9.46V19l4 2v-8.54L22 3z" />
|
|
1363
|
+
</svg>
|
|
1364
|
+
</button>
|
|
1365
|
+
|
|
1366
|
+
<ng-template slPopoverLayer>
|
|
1367
|
+
<div slPopoverContent [attr.aria-label]="owner().name()">
|
|
1368
|
+
<!-- The parts are on this family's own element rather than on the
|
|
1369
|
+
popover's: slPopoverContent names its own identity, and a second
|
|
1370
|
+
data-ui on the same element is one of them lost — the surface, the
|
|
1371
|
+
radius and the shadow all came off the panel. -->
|
|
1372
|
+
<div data-ui="table" data-part="filter-panel" [attr.data-kind]="owner().kind">
|
|
1373
|
+
@for (row of owner().rows(); track $index) {
|
|
1374
|
+
@if ($index === 1) {
|
|
1375
|
+
<div data-part="filter-join">
|
|
1376
|
+
<span data-label>{{ owner().t('filterJoin') }}</span>
|
|
1377
|
+
<div
|
|
1378
|
+
slRadioGroup
|
|
1379
|
+
orientation="horizontal"
|
|
1380
|
+
size="sm"
|
|
1381
|
+
[attr.aria-label]="owner().t('filterJoin')"
|
|
1382
|
+
[value]="owner().draft().join"
|
|
1383
|
+
(valueChange)="owner().setJoin($event.value ?? 'and')"
|
|
1384
|
+
>
|
|
1385
|
+
<div slRadio value="and">{{ owner().joinName('and') }}</div>
|
|
1386
|
+
<div slRadio value="or">{{ owner().joinName('or') }}</div>
|
|
1387
|
+
</div>
|
|
1388
|
+
</div>
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
<div data-part="filter-condition" [attr.data-operands]="owner().slotsOf(row).length">
|
|
1392
|
+
<div data-part="filter-operator">
|
|
1393
|
+
<!-- items names every operator for the closed control: without
|
|
1394
|
+
it the trigger falls back to the value itself and a reader
|
|
1395
|
+
sees the raw between the engine speaks. -->
|
|
1396
|
+
<sl-select
|
|
1397
|
+
size="sm"
|
|
1398
|
+
[fullWidth]="true"
|
|
1399
|
+
[items]="owner().operatorItems()"
|
|
1400
|
+
[attr.aria-label]="owner().t('filterOperator')"
|
|
1401
|
+
[value]="row.operator"
|
|
1402
|
+
(valueChange)="owner().setOperator($index, $any($event))"
|
|
1403
|
+
>
|
|
1404
|
+
@for (operator of owner().offered(); track operator) {
|
|
1405
|
+
<sl-select-item [value]="operator">
|
|
1406
|
+
{{ owner().operatorName(operator) }}
|
|
1407
|
+
</sl-select-item>
|
|
1408
|
+
}
|
|
1409
|
+
</sl-select>
|
|
1410
|
+
</div>
|
|
1411
|
+
|
|
1412
|
+
@if (owner().slotsOf(row).length > 0) {
|
|
1413
|
+
<div
|
|
1414
|
+
data-part="filter-operand"
|
|
1415
|
+
[attr.data-kind]="owner().kind"
|
|
1416
|
+
[attr.data-operand]="owner().operandName()"
|
|
1417
|
+
[attr.data-range]="owner().rangeMark(row)"
|
|
1418
|
+
>
|
|
1419
|
+
<ng-container
|
|
1420
|
+
[ngTemplateOutlet]="operand()"
|
|
1421
|
+
[ngTemplateOutletContext]="{ $implicit: owner().context($index) }"
|
|
1422
|
+
/>
|
|
1423
|
+
</div>
|
|
1424
|
+
}
|
|
1425
|
+
</div>
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
<div data-part="filter-actions">
|
|
1429
|
+
<button
|
|
1430
|
+
slButton
|
|
1431
|
+
type="button"
|
|
1432
|
+
size="sm"
|
|
1433
|
+
tone="secondary"
|
|
1434
|
+
variant="ghost"
|
|
1435
|
+
[disabled]="!owner().canClear()"
|
|
1436
|
+
(click)="owner().clear($event)"
|
|
1437
|
+
>
|
|
1438
|
+
{{ owner().t('filterClear') }}
|
|
1439
|
+
</button>
|
|
1440
|
+
<button slButton type="button" size="sm" (click)="owner().applyDraft($event)">
|
|
1441
|
+
{{ owner().t('filterApply') }}
|
|
1442
|
+
</button>
|
|
1443
|
+
</div>
|
|
1444
|
+
</div>
|
|
1445
|
+
</div>
|
|
1446
|
+
</ng-template>
|
|
1447
|
+
</ng-container>`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SlButton, selector: "button[slButton]", inputs: ["disabled", "focusableWhenDisabled", "fullWidth", "loading", "loadingDelay", "messages", "size", "tone", "type", "variant"], exportAs: ["slButton"] }, { kind: "directive", type: SlPopover, selector: "[slPopover]", inputs: ["open", "defaultOpen", "disabled", "size", "width", "side", "align", "mount", "strategy", "messages", "initialFocus", "finalFocus", "arrow", "autoFocus", "closeOnEscape", "closeOnOutsidePress", "flip", "shift", "hideWhenDetached", "portal", "sideOffset", "alignOffset", "collisionPadding", "arrowPadding"], outputs: ["openChange", "openChangeRequest"], exportAs: ["slPopover"] }, { kind: "component", type: SlPopoverContent, selector: "[slPopoverContent]", exportAs: ["slPopoverContent"] }, { kind: "directive", type: SlPopoverLayer, selector: "ng-template[slPopoverLayer]", exportAs: ["slPopoverLayer"] }, { kind: "directive", type: SlPopoverTrigger, selector: "[slPopoverTrigger]", exportAs: ["slPopoverTrigger"] }, { kind: "component", type: SlRadio, selector: "[slRadio]", inputs: ["value", "disabled"], exportAs: ["slRadio"] }, { kind: "component", type: SlRadioGroup, selector: "[slRadioGroup]", inputs: ["value", "defaultValue", "name", "size", "orientation", "labelPlacement", "variant", "disabled", "readOnly", "invalid", "required"], outputs: ["valueChange"], exportAs: ["slRadioGroup"] }, { kind: "component", type: SlSelect, selector: "sl-select", inputs: ["value", "open", "highlightedValue", "searchValue", "aria-label", "placeholder", "name", "form", "items", "total", "size", "variant", "side", "align", "width", "mount", "strategy", "messages", "filter", "locale", "sideOffset", "alignOffset", "collisionPadding", "typeaheadTimeout", "multiple", "clearable", "loop", "search", "highlightMatch", "typeahead", "closeOnSelect", "closeOnEscape", "closeOnOutsidePress", "flip", "shift", "hideWhenDetached", "portal", "fullWidth", "disabled", "readOnly", "required", "invalid", "loading"], outputs: ["valueChange", "valueChangeRequest", "openChange", "openChangeRequest", "highlightedValueChange", "highlightedValueChangeRequest", "searchValueChange", "searchValueChangeRequest"], exportAs: ["slSelect"] }, { kind: "component", type: SlSelectItem, selector: "sl-select-item", inputs: ["value", "disabled", "description", "icon", "textValue", "label", "position"], exportAs: ["slSelectItem"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1448
|
+
}
|
|
1449
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableFilterShell, decorators: [{
|
|
1450
|
+
type: Component,
|
|
1451
|
+
args: [{
|
|
1452
|
+
selector: 'span[slTableFilterShell]',
|
|
1453
|
+
standalone: true,
|
|
1454
|
+
exportAs: 'slTableFilterShell',
|
|
1455
|
+
imports: [
|
|
1456
|
+
NgTemplateOutlet,
|
|
1457
|
+
SlButton,
|
|
1458
|
+
SlPopover,
|
|
1459
|
+
SlPopoverContent,
|
|
1460
|
+
SlPopoverLayer,
|
|
1461
|
+
SlPopoverTrigger,
|
|
1462
|
+
SlRadio,
|
|
1463
|
+
SlRadioGroup,
|
|
1464
|
+
SlSelect,
|
|
1465
|
+
SlSelectItem,
|
|
1466
|
+
],
|
|
1467
|
+
template: `<ng-container
|
|
1468
|
+
slPopover
|
|
1469
|
+
[portal]="owner().portal()"
|
|
1470
|
+
[open]="owner().open()"
|
|
1471
|
+
(openChange)="owner().toggle($event)"
|
|
1472
|
+
>
|
|
1473
|
+
<button
|
|
1474
|
+
slPopoverTrigger
|
|
1475
|
+
type="button"
|
|
1476
|
+
data-part="filter"
|
|
1477
|
+
[attr.data-filtered]="owner().filtered() ? '' : null"
|
|
1478
|
+
[attr.aria-label]="owner().name()"
|
|
1479
|
+
>
|
|
1480
|
+
<svg
|
|
1481
|
+
aria-hidden="true"
|
|
1482
|
+
viewBox="0 0 24 24"
|
|
1483
|
+
fill="none"
|
|
1484
|
+
stroke="currentColor"
|
|
1485
|
+
stroke-width="2"
|
|
1486
|
+
stroke-linecap="round"
|
|
1487
|
+
stroke-linejoin="round"
|
|
1488
|
+
>
|
|
1489
|
+
<path d="M22 3H2l8 9.46V19l4 2v-8.54L22 3z" />
|
|
1490
|
+
</svg>
|
|
1491
|
+
</button>
|
|
1492
|
+
|
|
1493
|
+
<ng-template slPopoverLayer>
|
|
1494
|
+
<div slPopoverContent [attr.aria-label]="owner().name()">
|
|
1495
|
+
<!-- The parts are on this family's own element rather than on the
|
|
1496
|
+
popover's: slPopoverContent names its own identity, and a second
|
|
1497
|
+
data-ui on the same element is one of them lost — the surface, the
|
|
1498
|
+
radius and the shadow all came off the panel. -->
|
|
1499
|
+
<div data-ui="table" data-part="filter-panel" [attr.data-kind]="owner().kind">
|
|
1500
|
+
@for (row of owner().rows(); track $index) {
|
|
1501
|
+
@if ($index === 1) {
|
|
1502
|
+
<div data-part="filter-join">
|
|
1503
|
+
<span data-label>{{ owner().t('filterJoin') }}</span>
|
|
1504
|
+
<div
|
|
1505
|
+
slRadioGroup
|
|
1506
|
+
orientation="horizontal"
|
|
1507
|
+
size="sm"
|
|
1508
|
+
[attr.aria-label]="owner().t('filterJoin')"
|
|
1509
|
+
[value]="owner().draft().join"
|
|
1510
|
+
(valueChange)="owner().setJoin($event.value ?? 'and')"
|
|
1511
|
+
>
|
|
1512
|
+
<div slRadio value="and">{{ owner().joinName('and') }}</div>
|
|
1513
|
+
<div slRadio value="or">{{ owner().joinName('or') }}</div>
|
|
1514
|
+
</div>
|
|
1515
|
+
</div>
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
<div data-part="filter-condition" [attr.data-operands]="owner().slotsOf(row).length">
|
|
1519
|
+
<div data-part="filter-operator">
|
|
1520
|
+
<!-- items names every operator for the closed control: without
|
|
1521
|
+
it the trigger falls back to the value itself and a reader
|
|
1522
|
+
sees the raw between the engine speaks. -->
|
|
1523
|
+
<sl-select
|
|
1524
|
+
size="sm"
|
|
1525
|
+
[fullWidth]="true"
|
|
1526
|
+
[items]="owner().operatorItems()"
|
|
1527
|
+
[attr.aria-label]="owner().t('filterOperator')"
|
|
1528
|
+
[value]="row.operator"
|
|
1529
|
+
(valueChange)="owner().setOperator($index, $any($event))"
|
|
1530
|
+
>
|
|
1531
|
+
@for (operator of owner().offered(); track operator) {
|
|
1532
|
+
<sl-select-item [value]="operator">
|
|
1533
|
+
{{ owner().operatorName(operator) }}
|
|
1534
|
+
</sl-select-item>
|
|
1535
|
+
}
|
|
1536
|
+
</sl-select>
|
|
1537
|
+
</div>
|
|
1538
|
+
|
|
1539
|
+
@if (owner().slotsOf(row).length > 0) {
|
|
1540
|
+
<div
|
|
1541
|
+
data-part="filter-operand"
|
|
1542
|
+
[attr.data-kind]="owner().kind"
|
|
1543
|
+
[attr.data-operand]="owner().operandName()"
|
|
1544
|
+
[attr.data-range]="owner().rangeMark(row)"
|
|
1545
|
+
>
|
|
1546
|
+
<ng-container
|
|
1547
|
+
[ngTemplateOutlet]="operand()"
|
|
1548
|
+
[ngTemplateOutletContext]="{ $implicit: owner().context($index) }"
|
|
1549
|
+
/>
|
|
1550
|
+
</div>
|
|
1551
|
+
}
|
|
1552
|
+
</div>
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1555
|
+
<div data-part="filter-actions">
|
|
1556
|
+
<button
|
|
1557
|
+
slButton
|
|
1558
|
+
type="button"
|
|
1559
|
+
size="sm"
|
|
1560
|
+
tone="secondary"
|
|
1561
|
+
variant="ghost"
|
|
1562
|
+
[disabled]="!owner().canClear()"
|
|
1563
|
+
(click)="owner().clear($event)"
|
|
1564
|
+
>
|
|
1565
|
+
{{ owner().t('filterClear') }}
|
|
1566
|
+
</button>
|
|
1567
|
+
<button slButton type="button" size="sm" (click)="owner().applyDraft($event)">
|
|
1568
|
+
{{ owner().t('filterApply') }}
|
|
1569
|
+
</button>
|
|
1570
|
+
</div>
|
|
1571
|
+
</div>
|
|
1572
|
+
</div>
|
|
1573
|
+
</ng-template>
|
|
1574
|
+
</ng-container>`,
|
|
1575
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1576
|
+
encapsulation: ViewEncapsulation.None,
|
|
1577
|
+
}]
|
|
1578
|
+
}], propDecorators: { owner: [{ type: i0.Input, args: [{ isSignal: true, alias: "slTableFilterShell", required: true }] }], operand: [{ type: i0.Input, args: [{ isSignal: true, alias: "operand", required: true }] }] } });
|
|
1579
|
+
/** A column of words. Its comparisons are the collator's, never a fold. */
|
|
1580
|
+
class SlTableTextFilter extends SlTableFilterBase {
|
|
1581
|
+
kind = 'text';
|
|
1582
|
+
/** The filter the column holds. Two-way, so a template binds it. */
|
|
1583
|
+
value = model(null, /* @ts-ignore */
|
|
1584
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
1585
|
+
readValue() {
|
|
1586
|
+
return this.value();
|
|
1587
|
+
}
|
|
1588
|
+
writeValue(next) {
|
|
1589
|
+
this.value.set(next);
|
|
1590
|
+
}
|
|
1591
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableTextFilter, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
1592
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlTableTextFilter, isStandalone: true, selector: "span[slTableTextFilter]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, exportAs: ["slTableTextFilter"], usesInheritance: true, ngImport: i0, template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
1593
|
+
<ng-template #operand let-context>
|
|
1594
|
+
@for (slot of context.slots; track slot) {
|
|
1595
|
+
<div slTextField size="sm">
|
|
1596
|
+
<input
|
|
1597
|
+
slTextFieldInput
|
|
1598
|
+
[value]="$any(slot === 0 ? context.condition.value : context.condition.end) ?? ''"
|
|
1599
|
+
[attr.aria-label]="context.label(slot)"
|
|
1600
|
+
[attr.placeholder]="context.label(slot)"
|
|
1601
|
+
(input)="context.set(slot, $any($event.target).value)"
|
|
1602
|
+
(keydown.enter)="context.apply()"
|
|
1603
|
+
/>
|
|
1604
|
+
</div>
|
|
1605
|
+
}
|
|
1606
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "component", type: SlTableFilterShell, selector: "span[slTableFilterShell]", inputs: ["slTableFilterShell", "operand"], exportAs: ["slTableFilterShell"] }, { kind: "component", type: SlTextField, selector: "[slTextField]", inputs: ["size", "variant", "mono", "clearable", "revealable", "copyable", "messages", "loading"], outputs: ["valueCopy"], exportAs: ["slTextField"] }, { kind: "directive", type: SlTextFieldInput, selector: "input[slTextFieldInput]", inputs: ["value", "defaultValue", "disabled", "readOnly", "invalid", "showCount", "countMax", "revealed", "defaultRevealed", "type"], outputs: ["valueChange", "revealedChange"], exportAs: ["slTextFieldInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1607
|
+
}
|
|
1608
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableTextFilter, decorators: [{
|
|
1609
|
+
type: Component,
|
|
1610
|
+
args: [{
|
|
1611
|
+
selector: 'span[slTableTextFilter]',
|
|
1612
|
+
exportAs: 'slTableTextFilter',
|
|
1613
|
+
imports: [SlTableFilterShell, SlTextField, SlTextFieldInput],
|
|
1614
|
+
template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
1615
|
+
<ng-template #operand let-context>
|
|
1616
|
+
@for (slot of context.slots; track slot) {
|
|
1617
|
+
<div slTextField size="sm">
|
|
1618
|
+
<input
|
|
1619
|
+
slTextFieldInput
|
|
1620
|
+
[value]="$any(slot === 0 ? context.condition.value : context.condition.end) ?? ''"
|
|
1621
|
+
[attr.aria-label]="context.label(slot)"
|
|
1622
|
+
[attr.placeholder]="context.label(slot)"
|
|
1623
|
+
(input)="context.set(slot, $any($event.target).value)"
|
|
1624
|
+
(keydown.enter)="context.apply()"
|
|
1625
|
+
/>
|
|
1626
|
+
</div>
|
|
1627
|
+
}
|
|
1628
|
+
</ng-template>`,
|
|
1629
|
+
standalone: true,
|
|
1630
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1631
|
+
encapsulation: ViewEncapsulation.None,
|
|
1632
|
+
}]
|
|
1633
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
|
|
1634
|
+
/** A column of quantities. The operand parses in the reader's own locale. */
|
|
1635
|
+
class SlTableNumberFilter extends SlTableFilterBase {
|
|
1636
|
+
kind = 'number';
|
|
1637
|
+
value = model(null, /* @ts-ignore */
|
|
1638
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
1639
|
+
/** BCP 47, for the operand's own parsing. Defaults to the runtime's. */
|
|
1640
|
+
locale = input(undefined, /* @ts-ignore */
|
|
1641
|
+
...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
1642
|
+
readValue() {
|
|
1643
|
+
return this.value();
|
|
1644
|
+
}
|
|
1645
|
+
writeValue(next) {
|
|
1646
|
+
this.value.set(next);
|
|
1647
|
+
}
|
|
1648
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableNumberFilter, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
1649
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlTableNumberFilter, isStandalone: true, selector: "span[slTableNumberFilter]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, exportAs: ["slTableNumberFilter"], usesInheritance: true, ngImport: i0, template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
1650
|
+
<ng-template #operand let-context>
|
|
1651
|
+
@for (slot of context.slots; track slot) {
|
|
1652
|
+
<div slNumberField size="sm">
|
|
1653
|
+
<input
|
|
1654
|
+
slNumberFieldInput
|
|
1655
|
+
[value]="$any(slot === 0 ? context.condition.value : context.condition.end) ?? null"
|
|
1656
|
+
[locale]="locale()"
|
|
1657
|
+
[attr.aria-label]="context.label(slot)"
|
|
1658
|
+
[attr.placeholder]="context.label(slot)"
|
|
1659
|
+
(valueChange)="context.set(slot, $event.value)"
|
|
1660
|
+
(keydown.enter)="context.apply()"
|
|
1661
|
+
/>
|
|
1662
|
+
</div>
|
|
1663
|
+
}
|
|
1664
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "component", type: SlTableFilterShell, selector: "span[slTableFilterShell]", inputs: ["slTableFilterShell", "operand"], exportAs: ["slTableFilterShell"] }, { kind: "component", type: SlNumberField, selector: "[slNumberField]", inputs: ["size", "variant", "stepper", "messages"], exportAs: ["slNumberField"] }, { kind: "directive", type: SlNumberFieldInput, selector: "input[slNumberFieldInput]", inputs: ["value", "defaultValue", "min", "max", "step", "largeStep", "smallStep", "stepFrom", "snapToStep", "clamp", "format", "formatOn", "locale", "wheel", "disabled", "readOnly", "invalid"], outputs: ["valueChange"], exportAs: ["slNumberFieldInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1665
|
+
}
|
|
1666
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableNumberFilter, decorators: [{
|
|
1667
|
+
type: Component,
|
|
1668
|
+
args: [{
|
|
1669
|
+
selector: 'span[slTableNumberFilter]',
|
|
1670
|
+
exportAs: 'slTableNumberFilter',
|
|
1671
|
+
imports: [SlTableFilterShell, SlNumberField, SlNumberFieldInput],
|
|
1672
|
+
template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
1673
|
+
<ng-template #operand let-context>
|
|
1674
|
+
@for (slot of context.slots; track slot) {
|
|
1675
|
+
<div slNumberField size="sm">
|
|
1676
|
+
<input
|
|
1677
|
+
slNumberFieldInput
|
|
1678
|
+
[value]="$any(slot === 0 ? context.condition.value : context.condition.end) ?? null"
|
|
1679
|
+
[locale]="locale()"
|
|
1680
|
+
[attr.aria-label]="context.label(slot)"
|
|
1681
|
+
[attr.placeholder]="context.label(slot)"
|
|
1682
|
+
(valueChange)="context.set(slot, $event.value)"
|
|
1683
|
+
(keydown.enter)="context.apply()"
|
|
1684
|
+
/>
|
|
1685
|
+
</div>
|
|
1686
|
+
}
|
|
1687
|
+
</ng-template>`,
|
|
1688
|
+
standalone: true,
|
|
1689
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1690
|
+
encapsulation: ViewEncapsulation.None,
|
|
1691
|
+
}]
|
|
1692
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }] } });
|
|
1693
|
+
/**
|
|
1694
|
+
* A column of days. The operand is the whole date picker — the segmented field
|
|
1695
|
+
* and the calendar behind it — rather than the field alone: every surveyed
|
|
1696
|
+
* implementation that filters a date column offers a grid to point at, and a
|
|
1697
|
+
* reader who has to type a date they could have pointed at is the one thing a
|
|
1698
|
+
* date filter exists to spare them. The calendar opens a layer inside the
|
|
1699
|
+
* panel's layer, which `dismissable-layer` already stacks for the operator
|
|
1700
|
+
* chooser beside it.
|
|
1701
|
+
*
|
|
1702
|
+
* `between` is one `date-range-picker` rather than two pickers: it says the
|
|
1703
|
+
* run's length while it is drawn, takes the ends in either order and carries
|
|
1704
|
+
* the application's own presets. The descriptor holds the ISO days the
|
|
1705
|
+
* pickers produce, never a `Date`, and is the same object either way.
|
|
1706
|
+
*/
|
|
1707
|
+
class SlTableDateFilter extends SlTableFilterBase {
|
|
1708
|
+
kind = 'date';
|
|
1709
|
+
value = model(null, /* @ts-ignore */
|
|
1710
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
1711
|
+
/** BCP 47. Decides the operand's field order and separators. */
|
|
1712
|
+
locale = input(undefined, /* @ts-ignore */
|
|
1713
|
+
...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
1714
|
+
/**
|
|
1715
|
+
* The application's own ranges — this week, this month — as
|
|
1716
|
+
* `slDateRangePickerPreset` buttons in a template, offered inside the range
|
|
1717
|
+
* picker `between` draws. The descriptor still receives two ISO days.
|
|
1718
|
+
*/
|
|
1719
|
+
presets = input(undefined, /* @ts-ignore */
|
|
1720
|
+
...(ngDevMode ? [{ debugName: "presets" }] : /* istanbul ignore next */ []));
|
|
1721
|
+
rangeOperand() {
|
|
1722
|
+
return true;
|
|
1723
|
+
}
|
|
1724
|
+
/** The descriptor's ISO day as the field's own value, and back. */
|
|
1725
|
+
day(value) {
|
|
1726
|
+
return value ? parseISODate(String(value)) : null;
|
|
1727
|
+
}
|
|
1728
|
+
iso(value) {
|
|
1729
|
+
return isPlainDate(value) ? toISODate(value) : null;
|
|
1730
|
+
}
|
|
1731
|
+
range(condition) {
|
|
1732
|
+
return { start: this.day(condition.value), end: this.day(condition.end) };
|
|
1733
|
+
}
|
|
1734
|
+
readValue() {
|
|
1735
|
+
return this.value();
|
|
1736
|
+
}
|
|
1737
|
+
writeValue(next) {
|
|
1738
|
+
this.value.set(next);
|
|
1739
|
+
}
|
|
1740
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableDateFilter, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
1741
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlTableDateFilter, isStandalone: true, selector: "span[slTableDateFilter]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, exportAs: ["slTableDateFilter"], usesInheritance: true, ngImport: i0, template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
1742
|
+
<ng-template #operand let-context>
|
|
1743
|
+
@if (context.slots.length === 2) {
|
|
1744
|
+
<div
|
|
1745
|
+
slDateRangePicker
|
|
1746
|
+
size="sm"
|
|
1747
|
+
[locale]="locale()"
|
|
1748
|
+
[messages]="{ start: context.label(0), end: context.label(1) }"
|
|
1749
|
+
[value]="range(context.condition)"
|
|
1750
|
+
(valueChange)="context.setBoth(iso($event.value?.start), iso($event.value?.end))"
|
|
1751
|
+
(keydown.enter)="context.apply()"
|
|
1752
|
+
>
|
|
1753
|
+
@if (presets(); as presetsTemplate) {
|
|
1754
|
+
<div slDateRangePickerPresets>
|
|
1755
|
+
<ng-container [ngTemplateOutlet]="presetsTemplate" />
|
|
1756
|
+
</div>
|
|
1757
|
+
}
|
|
1758
|
+
</div>
|
|
1759
|
+
} @else {
|
|
1760
|
+
<div
|
|
1761
|
+
slDatePicker
|
|
1762
|
+
size="sm"
|
|
1763
|
+
[locale]="locale()"
|
|
1764
|
+
[value]="day(context.condition.value)"
|
|
1765
|
+
[attr.aria-label]="context.label(0)"
|
|
1766
|
+
(valueChange)="context.set(0, iso($event.value))"
|
|
1767
|
+
(keydown.enter)="context.apply()"
|
|
1768
|
+
></div>
|
|
1769
|
+
}
|
|
1770
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SlTableFilterShell, selector: "span[slTableFilterShell]", inputs: ["slTableFilterShell", "operand"], exportAs: ["slTableFilterShell"] }, { kind: "component", type: SlDatePicker, selector: "[slDatePicker]", inputs: ["value", "defaultValue", "open", "defaultOpen", "min", "max", "isDateUnavailable", "selectionMode", "months", "defaultView", "weekNumbers", "fixedWeeks", "locale", "timeZone", "firstDayOfWeek", "yearPivot", "calendar", "size", "variant", "placement", "closeOnSelect", "disabled", "readOnly", "invalid", "required", "clearable", "name", "messages"], outputs: ["valueChange", "openChange"], exportAs: ["slDatePicker"] }, { kind: "component", type: SlDateRangePicker, selector: "[slDateRangePicker]", inputs: ["value", "defaultValue", "open", "defaultOpen", "position", "defaultPosition", "min", "max", "isDateUnavailable", "contiguous", "minLength", "maxLength", "count", "months", "weekNumbers", "fixedWeeks", "locale", "timeZone", "firstDayOfWeek", "yearPivot", "calendar", "size", "variant", "placement", "closeOnSelect", "disabled", "readOnly", "invalid", "required", "clearable", "messages", "startName", "endName"], outputs: ["valueChange", "openChange", "positionChange"], exportAs: ["slDateRangePicker"] }, { kind: "directive", type: SlDateRangePickerPresets, selector: "[slDateRangePickerPresets]", exportAs: ["slDateRangePickerPresets"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1771
|
+
}
|
|
1772
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableDateFilter, decorators: [{
|
|
1773
|
+
type: Component,
|
|
1774
|
+
args: [{
|
|
1775
|
+
selector: 'span[slTableDateFilter]',
|
|
1776
|
+
exportAs: 'slTableDateFilter',
|
|
1777
|
+
imports: [
|
|
1778
|
+
NgTemplateOutlet,
|
|
1779
|
+
SlTableFilterShell,
|
|
1780
|
+
SlDatePicker,
|
|
1781
|
+
SlDateRangePicker,
|
|
1782
|
+
SlDateRangePickerPresets,
|
|
1783
|
+
],
|
|
1784
|
+
template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
1785
|
+
<ng-template #operand let-context>
|
|
1786
|
+
@if (context.slots.length === 2) {
|
|
1787
|
+
<div
|
|
1788
|
+
slDateRangePicker
|
|
1789
|
+
size="sm"
|
|
1790
|
+
[locale]="locale()"
|
|
1791
|
+
[messages]="{ start: context.label(0), end: context.label(1) }"
|
|
1792
|
+
[value]="range(context.condition)"
|
|
1793
|
+
(valueChange)="context.setBoth(iso($event.value?.start), iso($event.value?.end))"
|
|
1794
|
+
(keydown.enter)="context.apply()"
|
|
1795
|
+
>
|
|
1796
|
+
@if (presets(); as presetsTemplate) {
|
|
1797
|
+
<div slDateRangePickerPresets>
|
|
1798
|
+
<ng-container [ngTemplateOutlet]="presetsTemplate" />
|
|
1799
|
+
</div>
|
|
1800
|
+
}
|
|
1801
|
+
</div>
|
|
1802
|
+
} @else {
|
|
1803
|
+
<div
|
|
1804
|
+
slDatePicker
|
|
1805
|
+
size="sm"
|
|
1806
|
+
[locale]="locale()"
|
|
1807
|
+
[value]="day(context.condition.value)"
|
|
1808
|
+
[attr.aria-label]="context.label(0)"
|
|
1809
|
+
(valueChange)="context.set(0, iso($event.value))"
|
|
1810
|
+
(keydown.enter)="context.apply()"
|
|
1811
|
+
></div>
|
|
1812
|
+
}
|
|
1813
|
+
</ng-template>`,
|
|
1814
|
+
standalone: true,
|
|
1815
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1816
|
+
encapsulation: ViewEncapsulation.None,
|
|
1817
|
+
}]
|
|
1818
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }] } });
|
|
1819
|
+
/** `HH` and `HH:MM` are prefixes the engine accepts and the field cannot read. */
|
|
1820
|
+
function timeOf(text) {
|
|
1821
|
+
if (!text)
|
|
1822
|
+
return null;
|
|
1823
|
+
const written = String(text);
|
|
1824
|
+
return parseISOTime(/^\d{2}$/.test(written) ? `${written}:00` : written);
|
|
1825
|
+
}
|
|
1826
|
+
/** A day, or a day and an hour, padded to the `T…:MM` the field reads. */
|
|
1827
|
+
function dateTimeOf(text) {
|
|
1828
|
+
if (!text)
|
|
1829
|
+
return null;
|
|
1830
|
+
const written = String(text);
|
|
1831
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(written))
|
|
1832
|
+
return parseISODateTime(`${written}T00:00`);
|
|
1833
|
+
if (/^\d{4}-\d{2}-\d{2}T\d{2}$/.test(written))
|
|
1834
|
+
return parseISODateTime(`${written}:00`);
|
|
1835
|
+
return parseISODateTime(written);
|
|
1836
|
+
}
|
|
1837
|
+
/**
|
|
1838
|
+
* A column of times of day. The operand is `time-picker` — the segmented field
|
|
1839
|
+
* and the list behind it — at the column's own granularity, which decides the
|
|
1840
|
+
* precision the descriptor is written at and the engine compares at: a picker
|
|
1841
|
+
* writing minutes produces `09:14`, and `is 09:14` then matches every second
|
|
1842
|
+
* of that minute.
|
|
1843
|
+
*
|
|
1844
|
+
* `between` is one `time-range-picker` rather than two pickers: it says the
|
|
1845
|
+
* run's length while it is drawn, its end list refuses the times before the
|
|
1846
|
+
* start, and it carries the application's presets. The descriptor is
|
|
1847
|
+
* unchanged. A pair whose start is later than its end is the overnight window
|
|
1848
|
+
* to the engine and `order` to the picker; the pair reaches the descriptor
|
|
1849
|
+
* either way, and the picker's `wrap`, pending in `docs/process/build-order.md`, is
|
|
1850
|
+
* what lifts the mark. No `(keydown.enter)` on the range picker: its frame
|
|
1851
|
+
* is a button, and `Enter` on it opens the picker.
|
|
1852
|
+
*/
|
|
1853
|
+
class SlTableTimeFilter extends SlTableFilterBase {
|
|
1854
|
+
kind = 'time';
|
|
1855
|
+
value = model(null, /* @ts-ignore */
|
|
1856
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
1857
|
+
/** BCP 47. Decides the operand's hour cycle and separators. */
|
|
1858
|
+
locale = input(undefined, /* @ts-ignore */
|
|
1859
|
+
...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
1860
|
+
/** Twelve or twenty-four hours, overriding what the locale says. */
|
|
1861
|
+
hourCycle = input(undefined, /* @ts-ignore */
|
|
1862
|
+
...(ngDevMode ? [{ debugName: "hourCycle" }] : /* istanbul ignore next */ []));
|
|
1863
|
+
/** The last unit the operand writes. Minute unless stated. */
|
|
1864
|
+
granularity = input(undefined, /* @ts-ignore */
|
|
1865
|
+
...(ngDevMode ? [{ debugName: "granularity" }] : /* istanbul ignore next */ []));
|
|
1866
|
+
/** The list's step, in seconds. */
|
|
1867
|
+
step = input(undefined, { ...(ngDevMode ? { debugName: "step" } : /* istanbul ignore next */ {}), transform: (given) => (given === undefined ? undefined : numberAttribute(given)) });
|
|
1868
|
+
/** The list's own entries, replacing the step. */
|
|
1869
|
+
options = input(undefined, /* @ts-ignore */
|
|
1870
|
+
...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
1871
|
+
/** The earliest time the operand accepts, as ISO time text. */
|
|
1872
|
+
min = input(undefined, /* @ts-ignore */
|
|
1873
|
+
...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
1874
|
+
/** The latest, as ISO time text. */
|
|
1875
|
+
max = input(undefined, /* @ts-ignore */
|
|
1876
|
+
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
1877
|
+
/**
|
|
1878
|
+
* The application's own windows — the morning shift, the night shift — as
|
|
1879
|
+
* `slTimeRangePickerPreset` buttons in a template, offered inside the range
|
|
1880
|
+
* picker `between` draws. The descriptor still receives two ISO times.
|
|
1881
|
+
*/
|
|
1882
|
+
presets = input(undefined, /* @ts-ignore */
|
|
1883
|
+
...(ngDevMode ? [{ debugName: "presets" }] : /* istanbul ignore next */ []));
|
|
1884
|
+
rangeOperand() {
|
|
1885
|
+
return true;
|
|
1886
|
+
}
|
|
1887
|
+
timeOf(value) {
|
|
1888
|
+
return timeOf(value) ?? undefined;
|
|
1889
|
+
}
|
|
1890
|
+
iso(value) {
|
|
1891
|
+
return isPlainTime(value) ? toISOTime(value, this.granularity() ?? 'minute') : null;
|
|
1892
|
+
}
|
|
1893
|
+
range(condition) {
|
|
1894
|
+
return { start: timeOf(condition.value), end: timeOf(condition.end) };
|
|
1895
|
+
}
|
|
1896
|
+
readValue() {
|
|
1897
|
+
return this.value();
|
|
1898
|
+
}
|
|
1899
|
+
writeValue(next) {
|
|
1900
|
+
this.value.set(next);
|
|
1901
|
+
}
|
|
1902
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableTimeFilter, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
1903
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlTableTimeFilter, isStandalone: true, selector: "span[slTableTimeFilter]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, hourCycle: { classPropertyName: "hourCycle", publicName: "hourCycle", isSignal: true, isRequired: false, transformFunction: null }, granularity: { classPropertyName: "granularity", publicName: "granularity", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, exportAs: ["slTableTimeFilter"], usesInheritance: true, ngImport: i0, template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
1904
|
+
<ng-template #operand let-context>
|
|
1905
|
+
@if (context.slots.length === 2) {
|
|
1906
|
+
<div
|
|
1907
|
+
slTimeRangePicker
|
|
1908
|
+
size="sm"
|
|
1909
|
+
[locale]="locale()"
|
|
1910
|
+
[hourCycle]="hourCycle()"
|
|
1911
|
+
[granularity]="granularity()"
|
|
1912
|
+
[step]="step()"
|
|
1913
|
+
[options]="options()"
|
|
1914
|
+
[min]="timeOf(min())"
|
|
1915
|
+
[max]="timeOf(max())"
|
|
1916
|
+
[messages]="{ start: context.label(0), end: context.label(1) }"
|
|
1917
|
+
[value]="range(context.condition)"
|
|
1918
|
+
(valueChange)="context.setBoth(iso($event.value?.start), iso($event.value?.end))"
|
|
1919
|
+
>
|
|
1920
|
+
@if (presets(); as presetsTemplate) {
|
|
1921
|
+
<div slTimeRangePickerPresets>
|
|
1922
|
+
<ng-container [ngTemplateOutlet]="presetsTemplate" />
|
|
1923
|
+
</div>
|
|
1924
|
+
}
|
|
1925
|
+
</div>
|
|
1926
|
+
} @else {
|
|
1927
|
+
<div
|
|
1928
|
+
slTimePicker
|
|
1929
|
+
size="sm"
|
|
1930
|
+
[locale]="locale()"
|
|
1931
|
+
[hourCycle]="hourCycle()"
|
|
1932
|
+
[granularity]="granularity()"
|
|
1933
|
+
[step]="step()"
|
|
1934
|
+
[options]="options()"
|
|
1935
|
+
[min]="timeOf(min())"
|
|
1936
|
+
[max]="timeOf(max())"
|
|
1937
|
+
[value]="timeOf(context.condition.value)"
|
|
1938
|
+
[attr.aria-label]="context.label(0)"
|
|
1939
|
+
(valueChange)="context.set(0, iso($event.value))"
|
|
1940
|
+
(keydown.enter)="context.apply()"
|
|
1941
|
+
></div>
|
|
1942
|
+
}
|
|
1943
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SlTableFilterShell, selector: "span[slTableFilterShell]", inputs: ["slTableFilterShell", "operand"], exportAs: ["slTableFilterShell"] }, { kind: "component", type: SlTimePicker, selector: "[slTimePicker]", inputs: ["value", "defaultValue", "open", "defaultOpen", "highlightedValue", "defaultHighlightedValue", "min", "max", "isTimeUnavailable", "step", "options", "maxOptions", "unavailableOptions", "locale", "timeZone", "hourCycle", "granularity", "referenceTime", "size", "variant", "placement", "closeOnSelect", "disabled", "readOnly", "invalid", "required", "clearable", "relative", "name", "messages"], outputs: ["valueChange", "openChange", "highlightedValueChange"], exportAs: ["slTimePicker"] }, { kind: "component", type: SlTimeRangePicker, selector: "[slTimeRangePicker]", inputs: ["value", "defaultValue", "open", "defaultOpen", "position", "defaultPosition", "highlighted", "defaultHighlighted", "min", "max", "isTimeUnavailable", "contiguous", "minLength", "maxLength", "lengthLabel", "step", "options", "maxOptions", "unavailableOptions", "locale", "timeZone", "hourCycle", "granularity", "referenceTime", "size", "variant", "placement", "closeOnSelect", "disabled", "readOnly", "invalid", "required", "clearable", "relative", "messages", "startName", "endName"], outputs: ["valueChange", "openChange", "positionChange", "highlightedChange"], exportAs: ["slTimeRangePicker"] }, { kind: "directive", type: SlTimeRangePickerPresets, selector: "[slTimeRangePickerPresets]", exportAs: ["slTimeRangePickerPresets"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
1944
|
+
}
|
|
1945
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableTimeFilter, decorators: [{
|
|
1946
|
+
type: Component,
|
|
1947
|
+
args: [{
|
|
1948
|
+
selector: 'span[slTableTimeFilter]',
|
|
1949
|
+
exportAs: 'slTableTimeFilter',
|
|
1950
|
+
imports: [
|
|
1951
|
+
NgTemplateOutlet,
|
|
1952
|
+
SlTableFilterShell,
|
|
1953
|
+
SlTimePicker,
|
|
1954
|
+
SlTimeRangePicker,
|
|
1955
|
+
SlTimeRangePickerPresets,
|
|
1956
|
+
],
|
|
1957
|
+
template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
1958
|
+
<ng-template #operand let-context>
|
|
1959
|
+
@if (context.slots.length === 2) {
|
|
1960
|
+
<div
|
|
1961
|
+
slTimeRangePicker
|
|
1962
|
+
size="sm"
|
|
1963
|
+
[locale]="locale()"
|
|
1964
|
+
[hourCycle]="hourCycle()"
|
|
1965
|
+
[granularity]="granularity()"
|
|
1966
|
+
[step]="step()"
|
|
1967
|
+
[options]="options()"
|
|
1968
|
+
[min]="timeOf(min())"
|
|
1969
|
+
[max]="timeOf(max())"
|
|
1970
|
+
[messages]="{ start: context.label(0), end: context.label(1) }"
|
|
1971
|
+
[value]="range(context.condition)"
|
|
1972
|
+
(valueChange)="context.setBoth(iso($event.value?.start), iso($event.value?.end))"
|
|
1973
|
+
>
|
|
1974
|
+
@if (presets(); as presetsTemplate) {
|
|
1975
|
+
<div slTimeRangePickerPresets>
|
|
1976
|
+
<ng-container [ngTemplateOutlet]="presetsTemplate" />
|
|
1977
|
+
</div>
|
|
1978
|
+
}
|
|
1979
|
+
</div>
|
|
1980
|
+
} @else {
|
|
1981
|
+
<div
|
|
1982
|
+
slTimePicker
|
|
1983
|
+
size="sm"
|
|
1984
|
+
[locale]="locale()"
|
|
1985
|
+
[hourCycle]="hourCycle()"
|
|
1986
|
+
[granularity]="granularity()"
|
|
1987
|
+
[step]="step()"
|
|
1988
|
+
[options]="options()"
|
|
1989
|
+
[min]="timeOf(min())"
|
|
1990
|
+
[max]="timeOf(max())"
|
|
1991
|
+
[value]="timeOf(context.condition.value)"
|
|
1992
|
+
[attr.aria-label]="context.label(0)"
|
|
1993
|
+
(valueChange)="context.set(0, iso($event.value))"
|
|
1994
|
+
(keydown.enter)="context.apply()"
|
|
1995
|
+
></div>
|
|
1996
|
+
}
|
|
1997
|
+
</ng-template>`,
|
|
1998
|
+
standalone: true,
|
|
1999
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2000
|
+
encapsulation: ViewEncapsulation.None,
|
|
2001
|
+
}]
|
|
2002
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], hourCycle: [{ type: i0.Input, args: [{ isSignal: true, alias: "hourCycle", required: false }] }], granularity: [{ type: i0.Input, args: [{ isSignal: true, alias: "granularity", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }] } });
|
|
2003
|
+
/**
|
|
2004
|
+
* A column of dates with times. The operand is `datetime-picker`, the
|
|
2005
|
+
* seven-segment field and the two surfaces behind it. A value with one half
|
|
2006
|
+
* missing reaches the draft as no operand at all, so the condition stays
|
|
2007
|
+
* inactive until both halves exist — the engine's one rule for a missing
|
|
2008
|
+
* operand, and the reason Apply reports nothing for a date without a time.
|
|
2009
|
+
*
|
|
2010
|
+
* `between` is one `datetime-range-picker`: the run's length said while it is
|
|
2011
|
+
* drawn, the dates ordered with each time kept on its end, and the
|
|
2012
|
+
* application's presets. No `(keydown.enter)` on it: the frame is a button,
|
|
2013
|
+
* and `Enter` on it opens the picker.
|
|
2014
|
+
*/
|
|
2015
|
+
class SlTableDateTimeFilter extends SlTableFilterBase {
|
|
2016
|
+
kind = 'datetime';
|
|
2017
|
+
value = model(null, /* @ts-ignore */
|
|
2018
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
2019
|
+
/** BCP 47. Decides the operand's field order and separators. */
|
|
2020
|
+
locale = input(undefined, /* @ts-ignore */
|
|
2021
|
+
...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
2022
|
+
/** The zone "now" is read in. Defaults to the runtime's. */
|
|
2023
|
+
timeZone = input(undefined, /* @ts-ignore */
|
|
2024
|
+
...(ngDevMode ? [{ debugName: "timeZone" }] : /* istanbul ignore next */ []));
|
|
2025
|
+
/** Twelve or twenty-four hours, overriding what the locale says. */
|
|
2026
|
+
hourCycle = input(undefined, /* @ts-ignore */
|
|
2027
|
+
...(ngDevMode ? [{ debugName: "hourCycle" }] : /* istanbul ignore next */ []));
|
|
2028
|
+
/** The last unit the operand writes. Minute unless stated. */
|
|
2029
|
+
granularity = input(undefined, /* @ts-ignore */
|
|
2030
|
+
...(ngDevMode ? [{ debugName: "granularity" }] : /* istanbul ignore next */ []));
|
|
2031
|
+
/** The list's step, in seconds. */
|
|
2032
|
+
step = input(undefined, { ...(ngDevMode ? { debugName: "step" } : /* istanbul ignore next */ {}), transform: (given) => (given === undefined ? undefined : numberAttribute(given)) });
|
|
2033
|
+
/** The earliest date-time the operand accepts, as ISO date-time text. */
|
|
2034
|
+
min = input(undefined, /* @ts-ignore */
|
|
2035
|
+
...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
2036
|
+
/** The latest, as ISO date-time text. */
|
|
2037
|
+
max = input(undefined, /* @ts-ignore */
|
|
2038
|
+
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
2039
|
+
/**
|
|
2040
|
+
* The application's own windows — the last 24 hours, this week — as
|
|
2041
|
+
* `slDateTimeRangePickerPreset` buttons in a template, offered inside the
|
|
2042
|
+
* range picker `between` draws. The descriptor still receives two ISO
|
|
2043
|
+
* date-times.
|
|
2044
|
+
*/
|
|
2045
|
+
presets = input(undefined, /* @ts-ignore */
|
|
2046
|
+
...(ngDevMode ? [{ debugName: "presets" }] : /* istanbul ignore next */ []));
|
|
2047
|
+
rangeOperand() {
|
|
2048
|
+
return true;
|
|
2049
|
+
}
|
|
2050
|
+
dateTimeOf(value) {
|
|
2051
|
+
return dateTimeOf(value) ?? undefined;
|
|
2052
|
+
}
|
|
2053
|
+
range(condition) {
|
|
2054
|
+
return { start: dateTimeOf(condition.value), end: dateTimeOf(condition.end) };
|
|
2055
|
+
}
|
|
2056
|
+
iso(value) {
|
|
2057
|
+
return isPlainDateTime(value)
|
|
2058
|
+
? `${toISODate(value.date)}T${toISOTime(value.time, this.granularity() ?? 'minute')}`
|
|
2059
|
+
: null;
|
|
2060
|
+
}
|
|
2061
|
+
readValue() {
|
|
2062
|
+
return this.value();
|
|
2063
|
+
}
|
|
2064
|
+
writeValue(next) {
|
|
2065
|
+
this.value.set(next);
|
|
2066
|
+
}
|
|
2067
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableDateTimeFilter, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2068
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlTableDateTimeFilter, isStandalone: true, selector: "span[slTableDateTimeFilter]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null }, hourCycle: { classPropertyName: "hourCycle", publicName: "hourCycle", isSignal: true, isRequired: false, transformFunction: null }, granularity: { classPropertyName: "granularity", publicName: "granularity", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, exportAs: ["slTableDateTimeFilter"], usesInheritance: true, ngImport: i0, template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
2069
|
+
<ng-template #operand let-context>
|
|
2070
|
+
@if (context.slots.length === 2) {
|
|
2071
|
+
<div
|
|
2072
|
+
slDateTimeRangePicker
|
|
2073
|
+
size="sm"
|
|
2074
|
+
[locale]="locale()"
|
|
2075
|
+
[timeZone]="timeZone()"
|
|
2076
|
+
[hourCycle]="hourCycle()"
|
|
2077
|
+
[granularity]="granularity()"
|
|
2078
|
+
[step]="step()"
|
|
2079
|
+
[min]="dateTimeOf(min())"
|
|
2080
|
+
[max]="dateTimeOf(max())"
|
|
2081
|
+
[messages]="{ start: context.label(0), end: context.label(1) }"
|
|
2082
|
+
[value]="range(context.condition)"
|
|
2083
|
+
(valueChange)="context.setBoth(iso($event.value?.start), iso($event.value?.end))"
|
|
2084
|
+
>
|
|
2085
|
+
@if (presets(); as presetsTemplate) {
|
|
2086
|
+
<div slDateTimeRangePickerPresets>
|
|
2087
|
+
<ng-container [ngTemplateOutlet]="presetsTemplate" />
|
|
2088
|
+
</div>
|
|
2089
|
+
}
|
|
2090
|
+
</div>
|
|
2091
|
+
} @else {
|
|
2092
|
+
<div
|
|
2093
|
+
slDateTimePicker
|
|
2094
|
+
size="sm"
|
|
2095
|
+
[locale]="locale()"
|
|
2096
|
+
[timeZone]="timeZone()"
|
|
2097
|
+
[hourCycle]="hourCycle()"
|
|
2098
|
+
[granularity]="granularity()"
|
|
2099
|
+
[step]="step()"
|
|
2100
|
+
[min]="dateTimeOf(min())"
|
|
2101
|
+
[max]="dateTimeOf(max())"
|
|
2102
|
+
[value]="dateTimeOf(context.condition.value)"
|
|
2103
|
+
[attr.aria-label]="context.label(0)"
|
|
2104
|
+
(valueChange)="context.set(0, iso($event.value))"
|
|
2105
|
+
(keydown.enter)="context.apply()"
|
|
2106
|
+
></div>
|
|
2107
|
+
}
|
|
2108
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SlTableFilterShell, selector: "span[slTableFilterShell]", inputs: ["slTableFilterShell", "operand"], exportAs: ["slTableFilterShell"] }, { kind: "component", type: SlDateTimePicker, selector: "[slDateTimePicker]", inputs: ["value", "defaultValue", "open", "defaultOpen", "highlighted", "defaultHighlighted", "min", "max", "minTime", "maxTime", "isDateUnavailable", "isTimeUnavailable", "step", "options", "maxOptions", "unavailableOptions", "locale", "timeZone", "hourCycle", "granularity", "calendar", "firstDayOfWeek", "months", "weekNumbers", "referenceDateTime", "size", "variant", "placement", "openTo", "closeOnSelect", "disabled", "readOnly", "invalid", "required", "clearable", "relative", "name", "messages"], outputs: ["valueChange", "openChange", "highlightedChange"], exportAs: ["slDateTimePicker"] }, { kind: "component", type: SlDateTimeRangePicker, selector: "[slDateTimeRangePicker]", inputs: ["value", "defaultValue", "open", "defaultOpen", "position", "defaultPosition", "highlighted", "defaultHighlighted", "min", "max", "minTime", "maxTime", "isDateUnavailable", "isTimeUnavailable", "contiguous", "minLength", "maxLength", "lengthLabel", "step", "options", "maxOptions", "unavailableOptions", "months", "weekNumbers", "fixedWeeks", "locale", "timeZone", "hourCycle", "granularity", "calendar", "firstDayOfWeek", "yearPivot", "referenceDateTime", "size", "variant", "placement", "closeOnSelect", "disabled", "readOnly", "invalid", "required", "clearable", "relative", "messages", "startName", "endName"], outputs: ["valueChange", "openChange", "positionChange", "highlightedChange"], exportAs: ["slDateTimeRangePicker"] }, { kind: "directive", type: SlDateTimeRangePickerPresets, selector: "[slDateTimeRangePickerPresets]", exportAs: ["slDateTimeRangePickerPresets"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
2109
|
+
}
|
|
2110
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableDateTimeFilter, decorators: [{
|
|
2111
|
+
type: Component,
|
|
2112
|
+
args: [{
|
|
2113
|
+
selector: 'span[slTableDateTimeFilter]',
|
|
2114
|
+
exportAs: 'slTableDateTimeFilter',
|
|
2115
|
+
imports: [
|
|
2116
|
+
NgTemplateOutlet,
|
|
2117
|
+
SlTableFilterShell,
|
|
2118
|
+
SlDateTimePicker,
|
|
2119
|
+
SlDateTimeRangePicker,
|
|
2120
|
+
SlDateTimeRangePickerPresets,
|
|
2121
|
+
],
|
|
2122
|
+
template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
2123
|
+
<ng-template #operand let-context>
|
|
2124
|
+
@if (context.slots.length === 2) {
|
|
2125
|
+
<div
|
|
2126
|
+
slDateTimeRangePicker
|
|
2127
|
+
size="sm"
|
|
2128
|
+
[locale]="locale()"
|
|
2129
|
+
[timeZone]="timeZone()"
|
|
2130
|
+
[hourCycle]="hourCycle()"
|
|
2131
|
+
[granularity]="granularity()"
|
|
2132
|
+
[step]="step()"
|
|
2133
|
+
[min]="dateTimeOf(min())"
|
|
2134
|
+
[max]="dateTimeOf(max())"
|
|
2135
|
+
[messages]="{ start: context.label(0), end: context.label(1) }"
|
|
2136
|
+
[value]="range(context.condition)"
|
|
2137
|
+
(valueChange)="context.setBoth(iso($event.value?.start), iso($event.value?.end))"
|
|
2138
|
+
>
|
|
2139
|
+
@if (presets(); as presetsTemplate) {
|
|
2140
|
+
<div slDateTimeRangePickerPresets>
|
|
2141
|
+
<ng-container [ngTemplateOutlet]="presetsTemplate" />
|
|
2142
|
+
</div>
|
|
2143
|
+
}
|
|
2144
|
+
</div>
|
|
2145
|
+
} @else {
|
|
2146
|
+
<div
|
|
2147
|
+
slDateTimePicker
|
|
2148
|
+
size="sm"
|
|
2149
|
+
[locale]="locale()"
|
|
2150
|
+
[timeZone]="timeZone()"
|
|
2151
|
+
[hourCycle]="hourCycle()"
|
|
2152
|
+
[granularity]="granularity()"
|
|
2153
|
+
[step]="step()"
|
|
2154
|
+
[min]="dateTimeOf(min())"
|
|
2155
|
+
[max]="dateTimeOf(max())"
|
|
2156
|
+
[value]="dateTimeOf(context.condition.value)"
|
|
2157
|
+
[attr.aria-label]="context.label(0)"
|
|
2158
|
+
(valueChange)="context.set(0, iso($event.value))"
|
|
2159
|
+
(keydown.enter)="context.apply()"
|
|
2160
|
+
></div>
|
|
2161
|
+
}
|
|
2162
|
+
</ng-template>`,
|
|
2163
|
+
standalone: true,
|
|
2164
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2165
|
+
encapsulation: ViewEncapsulation.None,
|
|
2166
|
+
}]
|
|
2167
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], timeZone: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeZone", required: false }] }], hourCycle: [{ type: i0.Input, args: [{ isSignal: true, alias: "hourCycle", required: false }] }], granularity: [{ type: i0.Input, args: [{ isSignal: true, alias: "granularity", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }] } });
|
|
2168
|
+
/**
|
|
2169
|
+
* A column of yes and no. Three answers rather than two: the third is not being
|
|
2170
|
+
* filtered at all, which is what Clear leaves and what an empty draft is.
|
|
2171
|
+
*/
|
|
2172
|
+
class SlTableBooleanFilter extends SlTableFilterBase {
|
|
2173
|
+
kind = 'boolean';
|
|
2174
|
+
value = model(null, /* @ts-ignore */
|
|
2175
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
2176
|
+
answer(value) {
|
|
2177
|
+
return value === undefined || value === null ? '' : String(value);
|
|
2178
|
+
}
|
|
2179
|
+
readValue() {
|
|
2180
|
+
return this.value();
|
|
2181
|
+
}
|
|
2182
|
+
writeValue(next) {
|
|
2183
|
+
this.value.set(next);
|
|
2184
|
+
}
|
|
2185
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableBooleanFilter, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2186
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlTableBooleanFilter, isStandalone: true, selector: "span[slTableBooleanFilter]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, exportAs: ["slTableBooleanFilter"], usesInheritance: true, ngImport: i0, template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
2187
|
+
<ng-template #operand let-context>
|
|
2188
|
+
<div
|
|
2189
|
+
slRadioGroup
|
|
2190
|
+
orientation="horizontal"
|
|
2191
|
+
size="sm"
|
|
2192
|
+
[attr.aria-label]="context.label(0)"
|
|
2193
|
+
[value]="answer(context.condition.value)"
|
|
2194
|
+
(valueChange)="context.set(0, $event.value === 'true')"
|
|
2195
|
+
>
|
|
2196
|
+
<div slRadio value="true">{{ t('true') }}</div>
|
|
2197
|
+
<div slRadio value="false">{{ t('false') }}</div>
|
|
2198
|
+
</div>
|
|
2199
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "component", type: SlTableFilterShell, selector: "span[slTableFilterShell]", inputs: ["slTableFilterShell", "operand"], exportAs: ["slTableFilterShell"] }, { kind: "component", type: SlRadio, selector: "[slRadio]", inputs: ["value", "disabled"], exportAs: ["slRadio"] }, { kind: "component", type: SlRadioGroup, selector: "[slRadioGroup]", inputs: ["value", "defaultValue", "name", "size", "orientation", "labelPlacement", "variant", "disabled", "readOnly", "invalid", "required"], outputs: ["valueChange"], exportAs: ["slRadioGroup"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
2200
|
+
}
|
|
2201
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableBooleanFilter, decorators: [{
|
|
2202
|
+
type: Component,
|
|
2203
|
+
args: [{
|
|
2204
|
+
selector: 'span[slTableBooleanFilter]',
|
|
2205
|
+
exportAs: 'slTableBooleanFilter',
|
|
2206
|
+
imports: [SlTableFilterShell, SlRadio, SlRadioGroup],
|
|
2207
|
+
template: `<span [slTableFilterShell]="this" [operand]="operand"></span>
|
|
2208
|
+
<ng-template #operand let-context>
|
|
2209
|
+
<div
|
|
2210
|
+
slRadioGroup
|
|
2211
|
+
orientation="horizontal"
|
|
2212
|
+
size="sm"
|
|
2213
|
+
[attr.aria-label]="context.label(0)"
|
|
2214
|
+
[value]="answer(context.condition.value)"
|
|
2215
|
+
(valueChange)="context.set(0, $event.value === 'true')"
|
|
2216
|
+
>
|
|
2217
|
+
<div slRadio value="true">{{ t('true') }}</div>
|
|
2218
|
+
<div slRadio value="false">{{ t('false') }}</div>
|
|
2219
|
+
</div>
|
|
2220
|
+
</ng-template>`,
|
|
2221
|
+
standalone: true,
|
|
2222
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2223
|
+
encapsulation: ViewEncapsulation.None,
|
|
2224
|
+
}]
|
|
2225
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
|
|
2226
|
+
/**
|
|
2227
|
+
* A column filtered to values the consumer named: the list, its search and the
|
|
2228
|
+
* checkbox that covers what the search left.
|
|
2229
|
+
*
|
|
2230
|
+
* One condition, and the design says why: `anyOf A and anyOf B` is
|
|
2231
|
+
* `anyOf (A ∩ B)`, so every pair of set conditions collapses to a single list.
|
|
2232
|
+
*/
|
|
2233
|
+
class SlTableSetFilter extends SlTableFilterBase {
|
|
2234
|
+
kind = 'set';
|
|
2235
|
+
value = model(null, /* @ts-ignore */
|
|
2236
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
2237
|
+
/**
|
|
2238
|
+
* How the values are chosen. `list` is the search, the covering checkbox and
|
|
2239
|
+
* the values; `tags` is `tags-input`, for a list too long to tick — the
|
|
2240
|
+
* chosen values are chips, and `options` become a datalist of suggestions
|
|
2241
|
+
* and the set a typed value must belong to. The descriptor is the same list
|
|
2242
|
+
* either way.
|
|
2243
|
+
*/
|
|
2244
|
+
operand = input('list', /* @ts-ignore */
|
|
2245
|
+
...(ngDevMode ? [{ debugName: "operand" }] : /* istanbul ignore next */ []));
|
|
2246
|
+
/**
|
|
2247
|
+
* The values this column can be filtered to, and optionally their counts.
|
|
2248
|
+
* Optional with `tags`, where a column may hold more values than a page
|
|
2249
|
+
* knows; without it any typed value is admitted.
|
|
2250
|
+
*/
|
|
2251
|
+
options = input([], /* @ts-ignore */
|
|
2252
|
+
...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
2253
|
+
/**
|
|
2254
|
+
* Whether the panel carries a search. Unstated, it appears once there are
|
|
2255
|
+
* `searchThreshold` values.
|
|
2256
|
+
*/
|
|
2257
|
+
searchable = input(undefined, { ...(ngDevMode ? { debugName: "searchable" } : /* istanbul ignore next */ {}), transform: (state) => (state === undefined ? undefined : booleanAttribute(state)) });
|
|
2258
|
+
/** How many values bring the search with them. Eight unless stated. */
|
|
2259
|
+
searchThreshold = input(8, { ...(ngDevMode ? { debugName: "searchThreshold" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
2260
|
+
query = signal('', /* @ts-ignore */
|
|
2261
|
+
...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
|
|
2262
|
+
listId = `sl-table-filter-options-${Math.random().toString(36).slice(2, 8)}`;
|
|
2263
|
+
operandName() {
|
|
2264
|
+
return this.operand();
|
|
2265
|
+
}
|
|
2266
|
+
/** Whether a typed value has to be one of the options. */
|
|
2267
|
+
constrained = computed(() => this.operand() === 'tags' && this.options().length > 0, /* @ts-ignore */
|
|
2268
|
+
...(ngDevMode ? [{ debugName: "constrained" }] : /* istanbul ignore next */ []));
|
|
2269
|
+
byValue = computed(() => new Map(this.options().map((option) => [option.value, option])), /* @ts-ignore */
|
|
2270
|
+
...(ngDevMode ? [{ debugName: "byValue" }] : /* istanbul ignore next */ []));
|
|
2271
|
+
/** The chip's text for a value, and the judgement on a typed one. */
|
|
2272
|
+
optionLabel = (value) => this.byValue().get(value)?.label ?? value;
|
|
2273
|
+
known = (text) => this.byValue().has(text);
|
|
2274
|
+
applyOnEmpty(event, context) {
|
|
2275
|
+
const input = event.target;
|
|
2276
|
+
if (!event.defaultPrevented && input?.value === '')
|
|
2277
|
+
context.apply();
|
|
2278
|
+
}
|
|
2279
|
+
/**
|
|
2280
|
+
* The collator `combobox` filters its own options with, rather than a fold
|
|
2281
|
+
* that strips combining marks: `normalize('NFD')` is an English answer
|
|
2282
|
+
* wearing a Unicode one — it turns `ø` into `ø` and leaves `ß` alone.
|
|
2283
|
+
*/
|
|
2284
|
+
compare = createFilter({ sensitivity: 'base' });
|
|
2285
|
+
/** Two set conditions collapse to one list, so the panel offers one. */
|
|
2286
|
+
allowed() {
|
|
2287
|
+
return 1;
|
|
2288
|
+
}
|
|
2289
|
+
/** What the search left. The covering checkbox answers for exactly this. */
|
|
2290
|
+
shown = computed(() => {
|
|
2291
|
+
const query = this.query();
|
|
2292
|
+
const options = this.options();
|
|
2293
|
+
if (query === '')
|
|
2294
|
+
return options;
|
|
2295
|
+
return options.filter((option) => this.compare.contains(option.label ?? option.value, query));
|
|
2296
|
+
}, /* @ts-ignore */
|
|
2297
|
+
...(ngDevMode ? [{ debugName: "shown" }] : /* istanbul ignore next */ []));
|
|
2298
|
+
searching = computed(() => this.searchable() ?? this.options().length >= this.searchThreshold(), /* @ts-ignore */
|
|
2299
|
+
...(ngDevMode ? [{ debugName: "searching" }] : /* istanbul ignore next */ []));
|
|
2300
|
+
chosen(context) {
|
|
2301
|
+
return context.condition.value ?? [];
|
|
2302
|
+
}
|
|
2303
|
+
covered(context) {
|
|
2304
|
+
const chosen = this.chosen(context);
|
|
2305
|
+
return this.shown().filter((option) => chosen.includes(option.value)).length;
|
|
2306
|
+
}
|
|
2307
|
+
allCovered(context) {
|
|
2308
|
+
const covered = this.covered(context);
|
|
2309
|
+
return covered > 0 && covered === this.shown().length;
|
|
2310
|
+
}
|
|
2311
|
+
someCovered(context) {
|
|
2312
|
+
const covered = this.covered(context);
|
|
2313
|
+
return covered > 0 && covered < this.shown().length;
|
|
2314
|
+
}
|
|
2315
|
+
search(event) {
|
|
2316
|
+
this.query.set(event.target.value);
|
|
2317
|
+
/* A list that shortens under a reader who cannot see it says nothing. */
|
|
2318
|
+
this.announce(this.t('filterMatches', { count: this.shown().length }));
|
|
2319
|
+
}
|
|
2320
|
+
hold(context, value, next) {
|
|
2321
|
+
const chosen = this.chosen(context);
|
|
2322
|
+
context.set(0, next ? [...chosen, value] : chosen.filter((held) => held !== value));
|
|
2323
|
+
}
|
|
2324
|
+
coverAll(context, next) {
|
|
2325
|
+
const visible = this.shown().map((option) => option.value);
|
|
2326
|
+
const chosen = this.chosen(context);
|
|
2327
|
+
context.set(0, next
|
|
2328
|
+
? [...new Set([...chosen, ...visible])]
|
|
2329
|
+
: chosen.filter((held) => !visible.includes(held)));
|
|
2330
|
+
}
|
|
2331
|
+
readValue() {
|
|
2332
|
+
return this.value();
|
|
2333
|
+
}
|
|
2334
|
+
writeValue(next) {
|
|
2335
|
+
this.value.set(next);
|
|
2336
|
+
}
|
|
2337
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSetFilter, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2338
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlTableSetFilter, isStandalone: true, selector: "span[slTableSetFilter]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, operand: { classPropertyName: "operand", publicName: "operand", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchThreshold: { classPropertyName: "searchThreshold", publicName: "searchThreshold", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, exportAs: ["slTableSetFilter"], usesInheritance: true, ngImport: i0, template: `<span [slTableFilterShell]="this" [operand]="operandTemplate"></span>
|
|
2339
|
+
<!-- The template is not named operand: that is the input that says which
|
|
2340
|
+
of the two operands is drawn, and a template variable of the same name
|
|
2341
|
+
would shadow it in every binding below. -->
|
|
2342
|
+
<ng-template #operandTemplate let-context>
|
|
2343
|
+
@if (operand() === 'tags') {
|
|
2344
|
+
<!-- The chosen values as chips, for a list too long to tick. With
|
|
2345
|
+
options, a typed value outside them is refused and announced by
|
|
2346
|
+
tags-input's own validation, and the options are a datalist:
|
|
2347
|
+
native completion in every engine, with no second listbox inside
|
|
2348
|
+
the panel. Enter with pending text commits a chip, which is
|
|
2349
|
+
tags-input's key; Enter on an empty field applies, which is the
|
|
2350
|
+
panel's. -->
|
|
2351
|
+
<sl-tags-input
|
|
2352
|
+
size="sm"
|
|
2353
|
+
[fullWidth]="true"
|
|
2354
|
+
[attr.aria-label]="context.label(0)"
|
|
2355
|
+
[formatLabel]="optionLabel"
|
|
2356
|
+
[list]="constrained() ? listId : undefined"
|
|
2357
|
+
[validateValue]="constrained() ? known : undefined"
|
|
2358
|
+
[invalidValues]="constrained() ? 'refuse' : undefined"
|
|
2359
|
+
[value]="chosen(context)"
|
|
2360
|
+
(valueChange)="context.set(0, $event)"
|
|
2361
|
+
(keydown.enter)="applyOnEmpty($event, context)"
|
|
2362
|
+
></sl-tags-input>
|
|
2363
|
+
@if (constrained()) {
|
|
2364
|
+
<datalist [id]="listId">
|
|
2365
|
+
@for (option of options(); track option.value) {
|
|
2366
|
+
<option [value]="option.value">{{ option.label ?? option.value }}</option>
|
|
2367
|
+
}
|
|
2368
|
+
</datalist>
|
|
2369
|
+
}
|
|
2370
|
+
} @else {
|
|
2371
|
+
@if (searching()) {
|
|
2372
|
+
<div data-part="filter-search">
|
|
2373
|
+
<div slTextField size="sm" clearable>
|
|
2374
|
+
<input
|
|
2375
|
+
slTextFieldInput
|
|
2376
|
+
[value]="query()"
|
|
2377
|
+
[attr.aria-label]="t('filterSearch')"
|
|
2378
|
+
[attr.placeholder]="t('filterSearch')"
|
|
2379
|
+
(input)="search($event)"
|
|
2380
|
+
/>
|
|
2381
|
+
</div>
|
|
2382
|
+
</div>
|
|
2383
|
+
}
|
|
2384
|
+
|
|
2385
|
+
@if (shown().length === 0) {
|
|
2386
|
+
<p data-part="filter-empty">{{ t('filterEmpty') }}</p>
|
|
2387
|
+
} @else {
|
|
2388
|
+
<div data-part="filter-list">
|
|
2389
|
+
<div data-part="filter-option" data-covering>
|
|
2390
|
+
<span
|
|
2391
|
+
slCheckbox
|
|
2392
|
+
[checked]="allCovered(context)"
|
|
2393
|
+
[indeterminate]="someCovered(context)"
|
|
2394
|
+
(checkedChange)="coverAll(context, !allCovered(context))"
|
|
2395
|
+
>
|
|
2396
|
+
{{ t('filterSelectAll') }}
|
|
2397
|
+
</span>
|
|
2398
|
+
<span data-count>{{ shown().length }}</span>
|
|
2399
|
+
</div>
|
|
2400
|
+
|
|
2401
|
+
@for (option of shown(); track option.value) {
|
|
2402
|
+
<div data-part="filter-option">
|
|
2403
|
+
<span
|
|
2404
|
+
slCheckbox
|
|
2405
|
+
[checked]="chosen(context).includes(option.value)"
|
|
2406
|
+
(checkedChange)="hold(context, option.value, $event.value)"
|
|
2407
|
+
>
|
|
2408
|
+
{{ option.label ?? option.value }}
|
|
2409
|
+
</span>
|
|
2410
|
+
@if (option.count !== undefined) {
|
|
2411
|
+
<span data-count>{{ option.count }}</span>
|
|
2412
|
+
}
|
|
2413
|
+
</div>
|
|
2414
|
+
}
|
|
2415
|
+
</div>
|
|
2416
|
+
}
|
|
2417
|
+
}
|
|
2418
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "component", type: SlTableFilterShell, selector: "span[slTableFilterShell]", inputs: ["slTableFilterShell", "operand"], exportAs: ["slTableFilterShell"] }, { kind: "component", type: SlCheckbox, selector: "[slCheckbox]", inputs: ["checked", "defaultChecked", "indeterminate", "parent", "value", "name", "size", "labelPlacement", "variant", "disabled", "readOnly", "invalid"], outputs: ["checkedChange"], exportAs: ["slCheckbox"] }, { kind: "component", type: SlTagsInput, selector: "sl-tags-input", inputs: ["value", "defaultValue", "inputValue", "aria-label", "placeholder", "name", "form", "type", "list", "pattern", "minLength", "maxLength", "inputMode", "autocomplete", "locale", "validateValue", "normalize", "split", "formatLabel", "lockedValues", "delimiters", "max", "size", "variant", "overflow", "invalidValues", "pendingOnBlur", "messages", "addOnPaste", "allowDuplicates", "editable", "reorderable", "clearable", "fullWidth", "disabled", "readOnly", "required", "invalid"], outputs: ["valueChange", "valueChangeRequest", "inputValueChange", "inputValueChangeRequest", "valueRefuse", "valueCopy"], exportAs: ["slTagsInput"] }, { kind: "component", type: SlTextField, selector: "[slTextField]", inputs: ["size", "variant", "mono", "clearable", "revealable", "copyable", "messages", "loading"], outputs: ["valueCopy"], exportAs: ["slTextField"] }, { kind: "directive", type: SlTextFieldInput, selector: "input[slTextFieldInput]", inputs: ["value", "defaultValue", "disabled", "readOnly", "invalid", "showCount", "countMax", "revealed", "defaultRevealed", "type"], outputs: ["valueChange", "revealedChange"], exportAs: ["slTextFieldInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
2419
|
+
}
|
|
2420
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlTableSetFilter, decorators: [{
|
|
2421
|
+
type: Component,
|
|
2422
|
+
args: [{
|
|
2423
|
+
selector: 'span[slTableSetFilter]',
|
|
2424
|
+
exportAs: 'slTableSetFilter',
|
|
2425
|
+
imports: [SlTableFilterShell, SlCheckbox, SlTagsInput, SlTextField, SlTextFieldInput],
|
|
2426
|
+
template: `<span [slTableFilterShell]="this" [operand]="operandTemplate"></span>
|
|
2427
|
+
<!-- The template is not named operand: that is the input that says which
|
|
2428
|
+
of the two operands is drawn, and a template variable of the same name
|
|
2429
|
+
would shadow it in every binding below. -->
|
|
2430
|
+
<ng-template #operandTemplate let-context>
|
|
2431
|
+
@if (operand() === 'tags') {
|
|
2432
|
+
<!-- The chosen values as chips, for a list too long to tick. With
|
|
2433
|
+
options, a typed value outside them is refused and announced by
|
|
2434
|
+
tags-input's own validation, and the options are a datalist:
|
|
2435
|
+
native completion in every engine, with no second listbox inside
|
|
2436
|
+
the panel. Enter with pending text commits a chip, which is
|
|
2437
|
+
tags-input's key; Enter on an empty field applies, which is the
|
|
2438
|
+
panel's. -->
|
|
2439
|
+
<sl-tags-input
|
|
2440
|
+
size="sm"
|
|
2441
|
+
[fullWidth]="true"
|
|
2442
|
+
[attr.aria-label]="context.label(0)"
|
|
2443
|
+
[formatLabel]="optionLabel"
|
|
2444
|
+
[list]="constrained() ? listId : undefined"
|
|
2445
|
+
[validateValue]="constrained() ? known : undefined"
|
|
2446
|
+
[invalidValues]="constrained() ? 'refuse' : undefined"
|
|
2447
|
+
[value]="chosen(context)"
|
|
2448
|
+
(valueChange)="context.set(0, $event)"
|
|
2449
|
+
(keydown.enter)="applyOnEmpty($event, context)"
|
|
2450
|
+
></sl-tags-input>
|
|
2451
|
+
@if (constrained()) {
|
|
2452
|
+
<datalist [id]="listId">
|
|
2453
|
+
@for (option of options(); track option.value) {
|
|
2454
|
+
<option [value]="option.value">{{ option.label ?? option.value }}</option>
|
|
2455
|
+
}
|
|
2456
|
+
</datalist>
|
|
2457
|
+
}
|
|
2458
|
+
} @else {
|
|
2459
|
+
@if (searching()) {
|
|
2460
|
+
<div data-part="filter-search">
|
|
2461
|
+
<div slTextField size="sm" clearable>
|
|
2462
|
+
<input
|
|
2463
|
+
slTextFieldInput
|
|
2464
|
+
[value]="query()"
|
|
2465
|
+
[attr.aria-label]="t('filterSearch')"
|
|
2466
|
+
[attr.placeholder]="t('filterSearch')"
|
|
2467
|
+
(input)="search($event)"
|
|
2468
|
+
/>
|
|
2469
|
+
</div>
|
|
2470
|
+
</div>
|
|
2471
|
+
}
|
|
2472
|
+
|
|
2473
|
+
@if (shown().length === 0) {
|
|
2474
|
+
<p data-part="filter-empty">{{ t('filterEmpty') }}</p>
|
|
2475
|
+
} @else {
|
|
2476
|
+
<div data-part="filter-list">
|
|
2477
|
+
<div data-part="filter-option" data-covering>
|
|
2478
|
+
<span
|
|
2479
|
+
slCheckbox
|
|
2480
|
+
[checked]="allCovered(context)"
|
|
2481
|
+
[indeterminate]="someCovered(context)"
|
|
2482
|
+
(checkedChange)="coverAll(context, !allCovered(context))"
|
|
2483
|
+
>
|
|
2484
|
+
{{ t('filterSelectAll') }}
|
|
2485
|
+
</span>
|
|
2486
|
+
<span data-count>{{ shown().length }}</span>
|
|
2487
|
+
</div>
|
|
2488
|
+
|
|
2489
|
+
@for (option of shown(); track option.value) {
|
|
2490
|
+
<div data-part="filter-option">
|
|
2491
|
+
<span
|
|
2492
|
+
slCheckbox
|
|
2493
|
+
[checked]="chosen(context).includes(option.value)"
|
|
2494
|
+
(checkedChange)="hold(context, option.value, $event.value)"
|
|
2495
|
+
>
|
|
2496
|
+
{{ option.label ?? option.value }}
|
|
2497
|
+
</span>
|
|
2498
|
+
@if (option.count !== undefined) {
|
|
2499
|
+
<span data-count>{{ option.count }}</span>
|
|
2500
|
+
}
|
|
2501
|
+
</div>
|
|
2502
|
+
}
|
|
2503
|
+
</div>
|
|
2504
|
+
}
|
|
2505
|
+
}
|
|
2506
|
+
</ng-template>`,
|
|
2507
|
+
standalone: true,
|
|
2508
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2509
|
+
encapsulation: ViewEncapsulation.None,
|
|
2510
|
+
}]
|
|
2511
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], operand: [{ type: i0.Input, args: [{ isSignal: true, alias: "operand", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchThreshold", required: false }] }] } });
|
|
2512
|
+
|
|
2513
|
+
/**
|
|
2514
|
+
* Generated bundle index. Do not edit.
|
|
2515
|
+
*/
|
|
2516
|
+
|
|
2517
|
+
export { SL_TABLE_PARTS, SlTable, SlTableBody, SlTableBooleanFilter, SlTableCaption, SlTableCell, SlTableCellAxes, SlTableColumnActions, SlTableColumnHeader, SlTableContent, SlTableDateFilter, SlTableDateTimeFilter, SlTableDetail, SlTableEmpty, SlTableExpander, SlTableFilterBase, SlTableFilterShell, SlTableFooter, SlTableHead, SlTableIdFactory, SlTableLoader, SlTableNumberFilter, SlTableRow, SlTableRowHeader, SlTableSelect, SlTableSelectAll, SlTableSetFilter, SlTableSort, SlTableSummary, SlTableTextFilter, SlTableTimeFilter, TABLE_DEFAULTS, TABLE_ROW_SELECTOR, injectTableDefaults, provideTableDefaults };
|
|
2518
|
+
//# sourceMappingURL=slotted-angular-table.mjs.map
|