@slotted/angular 0.0.0-stage → 0.1.0-beta.1
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,1370 @@
|
|
|
1
|
+
<!-- index: ./index.md -->
|
|
2
|
+
# tabs
|
|
3
|
+
|
|
4
|
+
`data-ui="tabs"` · Switches between panels of related content.
|
|
5
|
+
|
|
6
|
+
## Examples
|
|
7
|
+
|
|
8
|
+
### Playground
|
|
9
|
+
|
|
10
|
+
One family with every axis on it, driven by the controls below the canvas. Tab into it once: the list is a single stop, and the arrows move the selection from there.
|
|
11
|
+
|
|
12
|
+
Excerpt — not a complete module
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div slTabs defaultValue="summary">
|
|
16
|
+
<div slTabList aria-label="Order">
|
|
17
|
+
<div slTab value="summary">Summary</div>
|
|
18
|
+
<div slTab value="items">Items</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div slTabPanel value="summary">Delivery expected on September 12.</div>
|
|
21
|
+
<div slTabPanel value="items">Three items.</div>
|
|
22
|
+
</div>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Whether focus selects
|
|
26
|
+
|
|
27
|
+
Automatic is the APG’s recommendation for panels that are already loaded; manual moves focus and waits for Enter or Space, which is what a panel that fetches needs.
|
|
28
|
+
|
|
29
|
+
Example
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { Component } from '@angular/core';
|
|
33
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
34
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs, type TabsActivation } from '@slotted/angular/tabs';
|
|
35
|
+
import { SlText } from '@slotted/angular/typography';
|
|
36
|
+
|
|
37
|
+
const MODES: { activation: TabsActivation; caption: string }[] = [
|
|
38
|
+
{ activation: 'automatic', caption: 'Automatic: the arrow keys select as they move.' },
|
|
39
|
+
{ activation: 'manual', caption: 'Manual: the arrow keys move focus; Enter or Space selects.' },
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
const REPORTS = [
|
|
43
|
+
{ value: 'revenue', label: 'Revenue', panel: 'Revenue this quarter: $412,800.00.' },
|
|
44
|
+
{ value: 'margin', label: 'Margin', panel: 'Gross margin this quarter: 38.4%.' },
|
|
45
|
+
{ value: 'returns', label: 'Returns', panel: 'Return rate this quarter: 2.1%.' },
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
@Component({
|
|
49
|
+
selector: 'app-tabs-activation',
|
|
50
|
+
imports: [SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
51
|
+
template: `
|
|
52
|
+
<div slStack [gap]="8">
|
|
53
|
+
@for (mode of modes; track mode.activation) {
|
|
54
|
+
<div slStack [gap]="3">
|
|
55
|
+
<span slText size="sm" tone="muted">{{ mode.caption }}</span>
|
|
56
|
+
<div slTabs defaultValue="revenue" [activation]="mode.activation">
|
|
57
|
+
<div slTabList aria-label="Quarterly reports">
|
|
58
|
+
@for (report of reports; track report.value) {
|
|
59
|
+
<div slTab [value]="report.value">{{ report.label }}</div>
|
|
60
|
+
}
|
|
61
|
+
</div>
|
|
62
|
+
@for (report of reports; track report.value) {
|
|
63
|
+
<div slTabPanel [value]="report.value">
|
|
64
|
+
<span slText size="sm">{{ report.panel }}</span>
|
|
65
|
+
</div>
|
|
66
|
+
}
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
}
|
|
70
|
+
</div>
|
|
71
|
+
`,
|
|
72
|
+
})
|
|
73
|
+
export class TabsActivationExample {
|
|
74
|
+
protected readonly modes = MODES;
|
|
75
|
+
protected readonly reports = REPORTS;
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Which way the list runs
|
|
80
|
+
|
|
81
|
+
A horizontal list scrolls and refuses the up and down arrows, so the page keeps scrolling with focus inside it; a vertical one stacks, turns the track and the marker, and announces aria-orientation.
|
|
82
|
+
|
|
83
|
+
Excerpt — not a complete module
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<div slTabs defaultValue="a" orientation="vertical">
|
|
87
|
+
<div slTabList aria-label="Settings">
|
|
88
|
+
<div slTab value="a">Profile</div>
|
|
89
|
+
<div slTab value="b">Notifications</div>
|
|
90
|
+
</div>
|
|
91
|
+
<div slTabPanel value="a">Name and photo.</div>
|
|
92
|
+
<div slTabPanel value="b">Email notices.</div>
|
|
93
|
+
</div>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### The two ways a list is drawn
|
|
97
|
+
|
|
98
|
+
Line is a row of labels over a hairline; contained is a sunken track holding a surface per tab; and track="none" keeps the labels and drops the hairline, for a list standing on a line the page already drew. All three keep the accent marker, which is what survives the high-contrast scheme after every surface flattens.
|
|
99
|
+
|
|
100
|
+
Excerpt — not a complete module
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<div slTabs defaultValue="a" variant="line"></div>
|
|
104
|
+
<div slTabs defaultValue="a" variant="contained"></div>
|
|
105
|
+
|
|
106
|
+
<!-- Standing on a line the page already drew — a card header, a table's rule. -->
|
|
107
|
+
<div slTabs defaultValue="a" track="none"></div>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### The step the list sits at
|
|
111
|
+
|
|
112
|
+
Height, type, padding and the inner gap all come from the control scales, so switching the toolbar to dense shrinks each step whole rather than in parts.
|
|
113
|
+
|
|
114
|
+
Example
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import { Component } from '@angular/core';
|
|
118
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
119
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs, type TabsSize } from '@slotted/angular/tabs';
|
|
120
|
+
import { SlText } from '@slotted/angular/typography';
|
|
121
|
+
|
|
122
|
+
const SIZES: TabsSize[] = ['sm', 'md', 'lg'];
|
|
123
|
+
|
|
124
|
+
const VIEWS = [
|
|
125
|
+
{ value: 'stock', label: 'Stock', panel: '1,284 units on hand across 3 warehouses.' },
|
|
126
|
+
{ value: 'movements', label: 'Movements', panel: '46 movements in the last 7 days.' },
|
|
127
|
+
{
|
|
128
|
+
value: 'suppliers',
|
|
129
|
+
label: 'Suppliers',
|
|
130
|
+
panel: 'Ordered from Brightline Studio and Quill & Co.',
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
@Component({
|
|
135
|
+
selector: 'app-tabs-sizes',
|
|
136
|
+
imports: [SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
137
|
+
template: `
|
|
138
|
+
<div slStack [gap]="8">
|
|
139
|
+
@for (size of sizes; track size) {
|
|
140
|
+
<div slTabs defaultValue="stock" [size]="size">
|
|
141
|
+
<div slTabList aria-label="Product OAK-90">
|
|
142
|
+
@for (view of views; track view.value) {
|
|
143
|
+
<div slTab [value]="view.value">{{ view.label }}</div>
|
|
144
|
+
}
|
|
145
|
+
</div>
|
|
146
|
+
@for (view of views; track view.value) {
|
|
147
|
+
<div slTabPanel [value]="view.value">
|
|
148
|
+
<span slText size="sm">{{ view.panel }}</span>
|
|
149
|
+
</div>
|
|
150
|
+
}
|
|
151
|
+
</div>
|
|
152
|
+
}
|
|
153
|
+
</div>
|
|
154
|
+
`,
|
|
155
|
+
})
|
|
156
|
+
export class TabsSizes {
|
|
157
|
+
protected readonly sizes = SIZES;
|
|
158
|
+
protected readonly views = VIEWS;
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### How the line is divided
|
|
163
|
+
|
|
164
|
+
auto makes each tab as wide as its label and scrolls what does not fit; equal divides the line between them and is the one place a horizontal label is ever truncated.
|
|
165
|
+
|
|
166
|
+
Example
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
import { Component } from '@angular/core';
|
|
170
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
171
|
+
import { SlText } from '@slotted/angular/typography';
|
|
172
|
+
|
|
173
|
+
const QUEUES = [
|
|
174
|
+
{ value: 'incoming', label: 'Incoming', panel: '14 purchase orders due this week.' },
|
|
175
|
+
{ value: 'outgoing', label: 'Outgoing', panel: '32 sales orders ready to ship.' },
|
|
176
|
+
{
|
|
177
|
+
value: 'inspection',
|
|
178
|
+
label: 'Awaiting inspection',
|
|
179
|
+
panel: '3 returns wait for a quality check before restocking.',
|
|
180
|
+
},
|
|
181
|
+
];
|
|
182
|
+
|
|
183
|
+
@Component({
|
|
184
|
+
selector: 'app-tabs-fit',
|
|
185
|
+
imports: [SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
186
|
+
template: `
|
|
187
|
+
<div slTabs defaultValue="incoming" fit="equal" variant="contained">
|
|
188
|
+
<div slTabList aria-label="Warehouse queues">
|
|
189
|
+
@for (queue of queues; track queue.value) {
|
|
190
|
+
<div slTab [value]="queue.value">{{ queue.label }}</div>
|
|
191
|
+
}
|
|
192
|
+
</div>
|
|
193
|
+
@for (queue of queues; track queue.value) {
|
|
194
|
+
<div slTabPanel [value]="queue.value">
|
|
195
|
+
<span slText size="sm">{{ queue.panel }}</span>
|
|
196
|
+
</div>
|
|
197
|
+
}
|
|
198
|
+
</div>
|
|
199
|
+
`,
|
|
200
|
+
})
|
|
201
|
+
export class TabsFit {
|
|
202
|
+
protected readonly queues = QUEUES;
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Every state the family paints
|
|
207
|
+
|
|
208
|
+
A tab that is not selected raises its ink on hover. In the line variant a neutral bar appears where the mark would go and darkens on press; in the contained variant the cell fills instead. A selected one does neither, because it is already at full strength. Disabled is the native attribute, which is also what makes the browser skip it.
|
|
209
|
+
|
|
210
|
+
Excerpt — not a complete module
|
|
211
|
+
|
|
212
|
+
```html
|
|
213
|
+
<div slTabs defaultValue="a">
|
|
214
|
+
<div slTabList aria-label="Document">
|
|
215
|
+
<div slTab value="a">Available</div>
|
|
216
|
+
<div slTab value="b" disabled>Unavailable</div>
|
|
217
|
+
</div>
|
|
218
|
+
<div slTabPanel value="a">…</div>
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
<div slTabs defaultValue="a" disabled></div>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### When a panel exists
|
|
225
|
+
|
|
226
|
+
active builds the panel on selection and drops it after, lazy keeps it once built, eager builds every one up front. A panel holding a table or a chart is the reason the default is active.
|
|
227
|
+
|
|
228
|
+
Example
|
|
229
|
+
|
|
230
|
+
```ts
|
|
231
|
+
import { Component } from '@angular/core';
|
|
232
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
233
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
234
|
+
import {
|
|
235
|
+
SlTab,
|
|
236
|
+
SlTabList,
|
|
237
|
+
SlTabPanel,
|
|
238
|
+
SlTabPanelContent,
|
|
239
|
+
SlTabs,
|
|
240
|
+
type TabsMount,
|
|
241
|
+
} from '@slotted/angular/tabs';
|
|
242
|
+
import { SlTextarea } from '@slotted/angular/textarea';
|
|
243
|
+
import { SlText } from '@slotted/angular/typography';
|
|
244
|
+
|
|
245
|
+
const MODES: { mount: TabsMount; caption: string }[] = [
|
|
246
|
+
{ mount: 'active', caption: 'mount="active": the note is built again, empty, on return.' },
|
|
247
|
+
{ mount: 'lazy', caption: 'mount="lazy": the note keeps what was typed.' },
|
|
248
|
+
];
|
|
249
|
+
|
|
250
|
+
@Component({
|
|
251
|
+
selector: 'app-tabs-mount',
|
|
252
|
+
imports: [
|
|
253
|
+
SlField,
|
|
254
|
+
SlFieldLabel,
|
|
255
|
+
SlStack,
|
|
256
|
+
SlTab,
|
|
257
|
+
SlTabList,
|
|
258
|
+
SlTabPanel,
|
|
259
|
+
SlTabPanelContent,
|
|
260
|
+
SlTabs,
|
|
261
|
+
SlText,
|
|
262
|
+
SlTextarea,
|
|
263
|
+
],
|
|
264
|
+
template: `
|
|
265
|
+
<div slStack [gap]="8">
|
|
266
|
+
@for (mode of modes; track mode.mount) {
|
|
267
|
+
<div slStack [gap]="3">
|
|
268
|
+
<span slText size="sm" tone="muted">{{ mode.caption }}</span>
|
|
269
|
+
<div slTabs defaultValue="note" [mount]="mode.mount">
|
|
270
|
+
<div slTabList aria-label="Order SO-1187">
|
|
271
|
+
<div slTab value="note">Picking note</div>
|
|
272
|
+
<div slTab value="summary">Summary</div>
|
|
273
|
+
</div>
|
|
274
|
+
<div slTabPanel value="note">
|
|
275
|
+
<ng-template slTabPanelContent>
|
|
276
|
+
<div slField>
|
|
277
|
+
<label slFieldLabel>Note for the picker</label>
|
|
278
|
+
<textarea
|
|
279
|
+
slTextarea
|
|
280
|
+
placeholder="Pack the brackets separately"
|
|
281
|
+
rows="2"
|
|
282
|
+
></textarea>
|
|
283
|
+
</div>
|
|
284
|
+
</ng-template>
|
|
285
|
+
</div>
|
|
286
|
+
<div slTabPanel value="summary">
|
|
287
|
+
<span slText size="sm">3 lines, picked from zone C at Reno, NV.</span>
|
|
288
|
+
</div>
|
|
289
|
+
</div>
|
|
290
|
+
</div>
|
|
291
|
+
}
|
|
292
|
+
</div>
|
|
293
|
+
`,
|
|
294
|
+
})
|
|
295
|
+
export class TabsMountExample {
|
|
296
|
+
protected readonly modes = MODES;
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Tabs a reader can close
|
|
301
|
+
|
|
302
|
+
Delete closes the focused tab and the pointer closes it from the control; the family then asks for the neighbour — the following tab, or the preceding one when the closed tab was last — and removes nothing itself.
|
|
303
|
+
|
|
304
|
+
Example
|
|
305
|
+
|
|
306
|
+
```ts
|
|
307
|
+
import { Component, signal } from '@angular/core';
|
|
308
|
+
import { SlButton } from '@slotted/angular/button';
|
|
309
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
310
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
311
|
+
import { SlText } from '@slotted/angular/typography';
|
|
312
|
+
|
|
313
|
+
const OPEN = [
|
|
314
|
+
{ id: 'SO-1187', customer: 'Harbor & Pine', total: '$1,240.00' },
|
|
315
|
+
{ id: 'SO-1188', customer: 'Brightline Studio', total: '$318.50' },
|
|
316
|
+
{ id: 'SO-1190', customer: 'Northgate Labs', total: '$2,906.10' },
|
|
317
|
+
{ id: 'SO-1191', customer: 'Verde Kitchen', total: '$86.00' },
|
|
318
|
+
];
|
|
319
|
+
|
|
320
|
+
@Component({
|
|
321
|
+
selector: 'app-tabs-dismissible',
|
|
322
|
+
imports: [SlButton, SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
323
|
+
template: `
|
|
324
|
+
@if (orders().length === 0) {
|
|
325
|
+
<div slStack [gap]="3" align="start">
|
|
326
|
+
<span slText size="sm" tone="muted">No orders open.</span>
|
|
327
|
+
<button slButton size="sm" variant="outline" (click)="reopen()">Reopen orders</button>
|
|
328
|
+
</div>
|
|
329
|
+
} @else {
|
|
330
|
+
<div
|
|
331
|
+
slTabs
|
|
332
|
+
[value]="active()"
|
|
333
|
+
(valueChange)="active.set($event.value ?? active())"
|
|
334
|
+
(tabDismiss)="close($event.value)"
|
|
335
|
+
>
|
|
336
|
+
<div slTabList aria-label="Open orders">
|
|
337
|
+
@for (order of orders(); track order.id) {
|
|
338
|
+
<div slTab dismissible [dismissLabel]="'Close ' + order.id" [value]="order.id">
|
|
339
|
+
{{ order.id }}
|
|
340
|
+
</div>
|
|
341
|
+
}
|
|
342
|
+
</div>
|
|
343
|
+
@for (order of orders(); track order.id) {
|
|
344
|
+
<div slTabPanel [value]="order.id">
|
|
345
|
+
<span slText size="sm">{{ order.customer }}, {{ order.total }}.</span>
|
|
346
|
+
</div>
|
|
347
|
+
}
|
|
348
|
+
</div>
|
|
349
|
+
}
|
|
350
|
+
`,
|
|
351
|
+
})
|
|
352
|
+
export class TabsDismissible {
|
|
353
|
+
protected readonly orders = signal(OPEN);
|
|
354
|
+
protected readonly active = signal('SO-1188');
|
|
355
|
+
|
|
356
|
+
protected close(id: string) {
|
|
357
|
+
this.orders.update((open) => open.filter((order) => order.id !== id));
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
protected reopen() {
|
|
361
|
+
this.orders.set(OPEN);
|
|
362
|
+
this.active.set('SO-1187');
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### A list that does not fit
|
|
368
|
+
|
|
369
|
+
The list scrolls rather than wrapping or truncating, two paging controls appear only while there is somewhere to scroll, and the arrow keys bring each tab into view as focus reaches it.
|
|
370
|
+
|
|
371
|
+
Example
|
|
372
|
+
|
|
373
|
+
```ts
|
|
374
|
+
import { Component } from '@angular/core';
|
|
375
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
376
|
+
import { SlText } from '@slotted/angular/typography';
|
|
377
|
+
|
|
378
|
+
const WAREHOUSES = [
|
|
379
|
+
{ code: 'RNO', city: 'Reno, NV', open: 42 },
|
|
380
|
+
{ code: 'CMH', city: 'Columbus, OH', open: 37 },
|
|
381
|
+
{ code: 'SAV', city: 'Savannah, GA', open: 18 },
|
|
382
|
+
{ code: 'DFW', city: 'Dallas, TX', open: 51 },
|
|
383
|
+
{ code: 'EWR', city: 'Newark, NJ', open: 29 },
|
|
384
|
+
{ code: 'ONT', city: 'Ontario, CA', open: 64 },
|
|
385
|
+
{ code: 'JOT', city: 'Joliet, IL', open: 23 },
|
|
386
|
+
{ code: 'MEM', city: 'Memphis, TN', open: 46 },
|
|
387
|
+
{ code: 'ABE', city: 'Allentown, PA', open: 12 },
|
|
388
|
+
{ code: 'TIW', city: 'Tacoma, WA', open: 31 },
|
|
389
|
+
{ code: 'SCK', city: 'Stockton, CA', open: 9 },
|
|
390
|
+
{ code: 'IND', city: 'Indianapolis, IN', open: 27 },
|
|
391
|
+
];
|
|
392
|
+
|
|
393
|
+
@Component({
|
|
394
|
+
selector: 'app-tabs-overflow',
|
|
395
|
+
imports: [SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
396
|
+
template: `
|
|
397
|
+
<div slTabs defaultValue="MEM">
|
|
398
|
+
<div slTabList aria-label="Warehouses">
|
|
399
|
+
@for (warehouse of warehouses; track warehouse.code) {
|
|
400
|
+
<div slTab [value]="warehouse.code">{{ warehouse.city }}</div>
|
|
401
|
+
}
|
|
402
|
+
</div>
|
|
403
|
+
@for (warehouse of warehouses; track warehouse.code) {
|
|
404
|
+
<div slTabPanel [value]="warehouse.code">
|
|
405
|
+
<span slText size="sm"
|
|
406
|
+
>{{ warehouse.code }}: {{ warehouse.open }} open orders to ship today.</span
|
|
407
|
+
>
|
|
408
|
+
</div>
|
|
409
|
+
}
|
|
410
|
+
</div>
|
|
411
|
+
`,
|
|
412
|
+
})
|
|
413
|
+
export class TabsOverflow {
|
|
414
|
+
protected readonly warehouses = WAREHOUSES;
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### A view a router can deep-link to
|
|
419
|
+
|
|
420
|
+
href makes the control an anchor, so the destination is real: a plain click selects, and a click carrying a modifier key is left to the browser, which opens the view in a new browser tab.
|
|
421
|
+
|
|
422
|
+
Example
|
|
423
|
+
|
|
424
|
+
```ts
|
|
425
|
+
import { Component } from '@angular/core';
|
|
426
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
427
|
+
import { SlText } from '@slotted/angular/typography';
|
|
428
|
+
|
|
429
|
+
const VIEWS = [
|
|
430
|
+
{ value: 'summary', label: 'Summary', panel: 'Harbor & Pine, $1,240.00, Net 30.' },
|
|
431
|
+
{ value: 'items', label: 'Items', panel: '3 lines: shelves, brackets and an assembly kit.' },
|
|
432
|
+
{ value: 'shipments', label: 'Shipments', panel: 'Atlas Freight, expected September 12.' },
|
|
433
|
+
];
|
|
434
|
+
|
|
435
|
+
@Component({
|
|
436
|
+
selector: 'app-tabs-links',
|
|
437
|
+
imports: [SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
438
|
+
template: `
|
|
439
|
+
<div slTabs defaultValue="summary">
|
|
440
|
+
<div slTabList aria-label="Order SO-1187">
|
|
441
|
+
@for (view of views; track view.value) {
|
|
442
|
+
<div slTab [value]="view.value" [href]="'#order-' + view.value">{{ view.label }}</div>
|
|
443
|
+
}
|
|
444
|
+
</div>
|
|
445
|
+
@for (view of views; track view.value) {
|
|
446
|
+
<div slTabPanel [value]="view.value">
|
|
447
|
+
<span slText size="sm">{{ view.panel }}</span>
|
|
448
|
+
</div>
|
|
449
|
+
}
|
|
450
|
+
</div>
|
|
451
|
+
`,
|
|
452
|
+
})
|
|
453
|
+
export class TabsLinks {
|
|
454
|
+
protected readonly views = VIEWS;
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### Content the family did not choose
|
|
459
|
+
|
|
460
|
+
An unbroken digest breaks inside its own tab instead of setting the list’s width, a right-to-left label reads its own way inside a page that reads the other, and a long label scrolls rather than wrapping.
|
|
461
|
+
|
|
462
|
+
Excerpt — not a complete module
|
|
463
|
+
|
|
464
|
+
```html
|
|
465
|
+
<div slTabs defaultValue="a">
|
|
466
|
+
<div slTabList aria-label="Extreme content">
|
|
467
|
+
<div slTab value="a">sha256:9f86d081884c7d659a2feaa0c55ad015</div>
|
|
468
|
+
<div slTab value="b">بيانات التسليم</div>
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Setting it once, and reaching past it
|
|
474
|
+
|
|
475
|
+
The provider carries the seven decisions an application takes once, render substitutes every root so a list can be a real nav, and the actions slot is where a Toolbar goes.
|
|
476
|
+
|
|
477
|
+
Excerpt — not a complete module
|
|
478
|
+
|
|
479
|
+
```ts
|
|
480
|
+
// One decision for every family in the application, in the bootstrap file.
|
|
481
|
+
bootstrapApplication(App, {
|
|
482
|
+
providers: [provideTabsDefaults({ size: 'sm', variant: 'contained' })],
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
// And in a template, the slot beside the list is where a toolbar goes:
|
|
486
|
+
// <div slTabActions><div slToolbar aria-label="Actions">…</div></div>
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### The APG table, and where focus lands
|
|
490
|
+
|
|
491
|
+
Tab enters on the selected tab and leaves to the panel, the arrows of the flow axis move and wrap, Home and End reach the ends, and Delete closes a dismissible tab and moves focus to its neighbour.
|
|
492
|
+
|
|
493
|
+
Example
|
|
494
|
+
|
|
495
|
+
```ts
|
|
496
|
+
import { Component, signal } from '@angular/core';
|
|
497
|
+
import type { ChangeRequest } from '@slotted/core/state';
|
|
498
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
499
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
500
|
+
import { SlText } from '@slotted/angular/typography';
|
|
501
|
+
|
|
502
|
+
const STEPS = [
|
|
503
|
+
{ value: 'picking', label: 'Picking', panel: '18 lines to pick in zone C.' },
|
|
504
|
+
{ value: 'packing', label: 'Packing', panel: '6 orders waiting at station 2.' },
|
|
505
|
+
{ value: 'loading', label: 'Loading', panel: 'Atlas Freight trailer at dock 4 until 15:30.' },
|
|
506
|
+
];
|
|
507
|
+
|
|
508
|
+
@Component({
|
|
509
|
+
selector: 'app-tabs-keyboard',
|
|
510
|
+
imports: [SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
511
|
+
template: `
|
|
512
|
+
<div slStack [gap]="5">
|
|
513
|
+
<div slTabs defaultValue="picking" (valueChange)="report($event)">
|
|
514
|
+
<div slTabList aria-label="Outbound shift">
|
|
515
|
+
@for (step of steps; track step.value) {
|
|
516
|
+
<div slTab [value]="step.value">{{ step.label }}</div>
|
|
517
|
+
}
|
|
518
|
+
</div>
|
|
519
|
+
@for (step of steps; track step.value) {
|
|
520
|
+
<div slTabPanel [value]="step.value">
|
|
521
|
+
<span slText size="sm">{{ step.panel }}</span>
|
|
522
|
+
</div>
|
|
523
|
+
}
|
|
524
|
+
</div>
|
|
525
|
+
<span slText size="sm" tone="muted">{{ last() }}</span>
|
|
526
|
+
</div>
|
|
527
|
+
`,
|
|
528
|
+
})
|
|
529
|
+
export class TabsKeyboard {
|
|
530
|
+
protected readonly steps = STEPS;
|
|
531
|
+
protected readonly last = signal('Nothing selected yet.');
|
|
532
|
+
|
|
533
|
+
protected report(request: ChangeRequest<string | undefined>) {
|
|
534
|
+
const step = STEPS.find((item) => item.value === request.value);
|
|
535
|
+
this.last.set(`${step?.label} selected by ${request.reason}.`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### actions.ts
|
|
541
|
+
|
|
542
|
+
Example
|
|
543
|
+
|
|
544
|
+
```ts
|
|
545
|
+
import { Component } from '@angular/core';
|
|
546
|
+
import { SlButton, SlButtonStart } from '@slotted/angular/button';
|
|
547
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
548
|
+
import { SlTab, SlTabActions, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
549
|
+
import { SlToolbar } from '@slotted/angular/toolbar';
|
|
550
|
+
import { SlText } from '@slotted/angular/typography';
|
|
551
|
+
|
|
552
|
+
const VIEWS = [
|
|
553
|
+
{ value: 'lines', label: 'Lines', panel: '6 lines from Quill & Co., $4,812.00.' },
|
|
554
|
+
{ value: 'receipts', label: 'Receipts', panel: '4 of 6 lines received at Columbus, OH.' },
|
|
555
|
+
{ value: 'history', label: 'History', panel: 'Approved by Marco Ilić on September 22.' },
|
|
556
|
+
];
|
|
557
|
+
|
|
558
|
+
@Component({
|
|
559
|
+
selector: 'app-tabs-actions',
|
|
560
|
+
imports: [
|
|
561
|
+
SlButton,
|
|
562
|
+
SlButtonStart,
|
|
563
|
+
SlGlyph,
|
|
564
|
+
SlTab,
|
|
565
|
+
SlTabActions,
|
|
566
|
+
SlTabList,
|
|
567
|
+
SlTabPanel,
|
|
568
|
+
SlTabs,
|
|
569
|
+
SlText,
|
|
570
|
+
SlToolbar,
|
|
571
|
+
],
|
|
572
|
+
template: `
|
|
573
|
+
<div slTabs defaultValue="lines">
|
|
574
|
+
<div slTabList aria-label="Purchase order PO-4521">
|
|
575
|
+
@for (view of views; track view.value) {
|
|
576
|
+
<div slTab [value]="view.value">{{ view.label }}</div>
|
|
577
|
+
}
|
|
578
|
+
</div>
|
|
579
|
+
<div slTabActions>
|
|
580
|
+
<div slToolbar aria-label="Purchase order actions" size="sm">
|
|
581
|
+
<button slButton size="sm" tone="secondary" variant="ghost">
|
|
582
|
+
<span slButtonStart><svg slGlyph name="upload"></svg></span>
|
|
583
|
+
Export
|
|
584
|
+
</button>
|
|
585
|
+
<button slButton size="sm" tone="secondary" variant="ghost">
|
|
586
|
+
<span slButtonStart><svg slGlyph name="copy"></svg></span>
|
|
587
|
+
Duplicate
|
|
588
|
+
</button>
|
|
589
|
+
</div>
|
|
590
|
+
</div>
|
|
591
|
+
@for (view of views; track view.value) {
|
|
592
|
+
<div slTabPanel [value]="view.value">
|
|
593
|
+
<span slText size="sm">{{ view.panel }}</span>
|
|
594
|
+
</div>
|
|
595
|
+
}
|
|
596
|
+
</div>
|
|
597
|
+
`,
|
|
598
|
+
})
|
|
599
|
+
export class TabsActionsExample {
|
|
600
|
+
protected readonly views = VIEWS;
|
|
601
|
+
}
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
### controlled.ts
|
|
605
|
+
|
|
606
|
+
Example
|
|
607
|
+
|
|
608
|
+
```ts
|
|
609
|
+
import { Component, signal } from '@angular/core';
|
|
610
|
+
import { SlButton } from '@slotted/angular/button';
|
|
611
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
612
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
613
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
614
|
+
import { SlText } from '@slotted/angular/typography';
|
|
615
|
+
|
|
616
|
+
const VIEWS = [
|
|
617
|
+
{ value: 'orders', label: 'Orders', panel: '12 open orders, $14,380.00 in total.' },
|
|
618
|
+
{
|
|
619
|
+
value: 'invoices',
|
|
620
|
+
label: 'Invoices',
|
|
621
|
+
panel: 'INV-20877 and INV-20902 are past due: $2,146.50.',
|
|
622
|
+
},
|
|
623
|
+
{ value: 'payments', label: 'Payments', panel: 'Last payment: $3,200.00 on September 30.' },
|
|
624
|
+
];
|
|
625
|
+
|
|
626
|
+
@Component({
|
|
627
|
+
selector: 'app-tabs-controlled',
|
|
628
|
+
imports: [SlButton, SlInline, SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
629
|
+
template: `
|
|
630
|
+
<div slStack [gap]="5">
|
|
631
|
+
<div slInline [gap]="3" align="center" justify="between">
|
|
632
|
+
<span slText size="sm" tone="muted">2 invoices are past due.</span>
|
|
633
|
+
<button slButton size="sm" variant="outline" (click)="view.set('invoices')">
|
|
634
|
+
Review invoices
|
|
635
|
+
</button>
|
|
636
|
+
</div>
|
|
637
|
+
<div slTabs [value]="view()" (valueChange)="view.set($event.value ?? view())">
|
|
638
|
+
<div slTabList aria-label="Account Harbor & Pine">
|
|
639
|
+
@for (item of views; track item.value) {
|
|
640
|
+
<div slTab [value]="item.value">{{ item.label }}</div>
|
|
641
|
+
}
|
|
642
|
+
</div>
|
|
643
|
+
@for (item of views; track item.value) {
|
|
644
|
+
<div slTabPanel [value]="item.value">
|
|
645
|
+
<span slText size="sm">{{ item.panel }}</span>
|
|
646
|
+
</div>
|
|
647
|
+
}
|
|
648
|
+
</div>
|
|
649
|
+
</div>
|
|
650
|
+
`,
|
|
651
|
+
})
|
|
652
|
+
export class TabsControlled {
|
|
653
|
+
protected readonly views = VIEWS;
|
|
654
|
+
protected readonly view = signal('orders');
|
|
655
|
+
}
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
### defaults.ts
|
|
659
|
+
|
|
660
|
+
Example
|
|
661
|
+
|
|
662
|
+
```ts
|
|
663
|
+
import { Component } from '@angular/core';
|
|
664
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
665
|
+
import { provideTabsDefaults, SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
666
|
+
import { SlText } from '@slotted/angular/typography';
|
|
667
|
+
|
|
668
|
+
@Component({
|
|
669
|
+
selector: 'app-tabs-defaults',
|
|
670
|
+
imports: [SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
671
|
+
providers: [provideTabsDefaults({ size: 'sm', variant: 'contained' })],
|
|
672
|
+
template: `
|
|
673
|
+
<div slStack [gap]="8">
|
|
674
|
+
<div slTabs defaultValue="stock">
|
|
675
|
+
<div slTabList aria-label="Product OAK-90">
|
|
676
|
+
<div slTab value="stock">Stock</div>
|
|
677
|
+
<div slTab value="pricing">Pricing</div>
|
|
678
|
+
</div>
|
|
679
|
+
<div slTabPanel value="stock">
|
|
680
|
+
<span slText size="sm">1,284 units on hand.</span>
|
|
681
|
+
</div>
|
|
682
|
+
<div slTabPanel value="pricing">
|
|
683
|
+
<span slText size="sm">List price $180.00, cost $96.40.</span>
|
|
684
|
+
</div>
|
|
685
|
+
</div>
|
|
686
|
+
<div slTabs defaultValue="open" variant="line">
|
|
687
|
+
<div slTabList aria-label="Purchase orders">
|
|
688
|
+
<div slTab value="open">Open</div>
|
|
689
|
+
<div slTab value="received">Received</div>
|
|
690
|
+
</div>
|
|
691
|
+
<div slTabPanel value="open">
|
|
692
|
+
<span slText size="sm">3 purchase orders for OAK-90 are open.</span>
|
|
693
|
+
</div>
|
|
694
|
+
<div slTabPanel value="received">
|
|
695
|
+
<span slText size="sm">Last received on September 22: 400 units.</span>
|
|
696
|
+
</div>
|
|
697
|
+
</div>
|
|
698
|
+
</div>
|
|
699
|
+
`,
|
|
700
|
+
})
|
|
701
|
+
export class TabsDefaults {}
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
### disabled.ts
|
|
705
|
+
|
|
706
|
+
Example
|
|
707
|
+
|
|
708
|
+
```ts
|
|
709
|
+
import { Component } from '@angular/core';
|
|
710
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
711
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
712
|
+
import { SlText } from '@slotted/angular/typography';
|
|
713
|
+
|
|
714
|
+
@Component({
|
|
715
|
+
selector: 'app-tabs-disabled',
|
|
716
|
+
imports: [SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
717
|
+
template: `
|
|
718
|
+
<div slStack [gap]="8">
|
|
719
|
+
<div slTabs defaultValue="summary">
|
|
720
|
+
<div slTabList aria-label="Order SO-1192">
|
|
721
|
+
<div slTab value="summary">Summary</div>
|
|
722
|
+
<div slTab value="items">Items</div>
|
|
723
|
+
<div slTab value="invoice" disabled>Invoice</div>
|
|
724
|
+
</div>
|
|
725
|
+
<div slTabPanel value="summary">
|
|
726
|
+
<span slText size="sm">Awaiting pickup. The invoice is issued once the order ships.</span>
|
|
727
|
+
</div>
|
|
728
|
+
<div slTabPanel value="items">
|
|
729
|
+
<span slText size="sm">5 items from the Reno, NV warehouse.</span>
|
|
730
|
+
</div>
|
|
731
|
+
<div slTabPanel value="invoice">
|
|
732
|
+
<span slText size="sm">Invoice INV-20931.</span>
|
|
733
|
+
</div>
|
|
734
|
+
</div>
|
|
735
|
+
<div slTabs defaultValue="summary" disabled>
|
|
736
|
+
<div slTabList aria-label="Order SO-1188">
|
|
737
|
+
<div slTab value="summary">Summary</div>
|
|
738
|
+
<div slTab value="items">Items</div>
|
|
739
|
+
<div slTab value="invoice">Invoice</div>
|
|
740
|
+
</div>
|
|
741
|
+
<div slTabPanel value="summary">
|
|
742
|
+
<span slText size="sm">Locked while the warehouse recounts this order.</span>
|
|
743
|
+
</div>
|
|
744
|
+
<div slTabPanel value="items">
|
|
745
|
+
<span slText size="sm">2 items from the Columbus, OH warehouse.</span>
|
|
746
|
+
</div>
|
|
747
|
+
<div slTabPanel value="invoice">
|
|
748
|
+
<span slText size="sm">Invoice INV-20917.</span>
|
|
749
|
+
</div>
|
|
750
|
+
</div>
|
|
751
|
+
</div>
|
|
752
|
+
`,
|
|
753
|
+
})
|
|
754
|
+
export class TabsDisabled {}
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
### filter.ts
|
|
758
|
+
|
|
759
|
+
Example
|
|
760
|
+
|
|
761
|
+
```ts
|
|
762
|
+
import { Component, computed, signal } from '@angular/core';
|
|
763
|
+
import { SlBadge } from '@slotted/angular/badge';
|
|
764
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
765
|
+
import {
|
|
766
|
+
SlTable,
|
|
767
|
+
SlTableBody,
|
|
768
|
+
SlTableCell,
|
|
769
|
+
SlTableColumnHeader,
|
|
770
|
+
SlTableContent,
|
|
771
|
+
SlTableHead,
|
|
772
|
+
SlTableRow,
|
|
773
|
+
SlTableRowHeader,
|
|
774
|
+
} from '@slotted/angular/table';
|
|
775
|
+
import { SlTab, SlTabEnd, SlTabList, SlTabs } from '@slotted/angular/tabs';
|
|
776
|
+
|
|
777
|
+
const ORDERS = [
|
|
778
|
+
{ id: 'SO-1187', customer: 'Harbor & Pine', status: 'open', total: '$1,240.00' },
|
|
779
|
+
{ id: 'SO-1188', customer: 'Brightline Studio', status: 'shipped', total: '$318.50' },
|
|
780
|
+
{ id: 'SO-1190', customer: 'Northgate Labs', status: 'open', total: '$2,906.10' },
|
|
781
|
+
{ id: 'SO-1191', customer: 'Verde Kitchen', status: 'delayed', total: '$86.00' },
|
|
782
|
+
{ id: 'SO-1193', customer: 'Quill & Co.', status: 'shipped', total: '$540.25' },
|
|
783
|
+
];
|
|
784
|
+
|
|
785
|
+
const FILTERS = [
|
|
786
|
+
{ value: 'all', label: 'All' },
|
|
787
|
+
{ value: 'open', label: 'Open' },
|
|
788
|
+
{ value: 'delayed', label: 'Delayed' },
|
|
789
|
+
{ value: 'shipped', label: 'Shipped' },
|
|
790
|
+
];
|
|
791
|
+
|
|
792
|
+
const STATUS: Record<string, string> = { open: 'Open', delayed: 'Delayed', shipped: 'Shipped' };
|
|
793
|
+
|
|
794
|
+
const matching = (filter: string) =>
|
|
795
|
+
filter === 'all' ? ORDERS : ORDERS.filter((order) => order.status === filter);
|
|
796
|
+
|
|
797
|
+
@Component({
|
|
798
|
+
selector: 'app-tabs-filter',
|
|
799
|
+
imports: [
|
|
800
|
+
SlBadge,
|
|
801
|
+
SlStack,
|
|
802
|
+
SlTab,
|
|
803
|
+
SlTabEnd,
|
|
804
|
+
SlTabList,
|
|
805
|
+
SlTable,
|
|
806
|
+
SlTableBody,
|
|
807
|
+
SlTableCell,
|
|
808
|
+
SlTableColumnHeader,
|
|
809
|
+
SlTableContent,
|
|
810
|
+
SlTableHead,
|
|
811
|
+
SlTableRow,
|
|
812
|
+
SlTableRowHeader,
|
|
813
|
+
SlTabs,
|
|
814
|
+
],
|
|
815
|
+
template: `
|
|
816
|
+
<div slStack [gap]="4">
|
|
817
|
+
<div slTabs size="sm" [value]="filter()" (valueChange)="filter.set($event.value ?? filter())">
|
|
818
|
+
<div slTabList aria-label="Orders by status">
|
|
819
|
+
@for (item of filters; track item.value) {
|
|
820
|
+
<div slTab controls="orders-by-status" [value]="item.value">
|
|
821
|
+
{{ item.label }}
|
|
822
|
+
<span slTabEnd
|
|
823
|
+
><span slBadge showZero size="sm" [count]="matching(item.value).length"></span
|
|
824
|
+
></span>
|
|
825
|
+
</div>
|
|
826
|
+
}
|
|
827
|
+
</div>
|
|
828
|
+
</div>
|
|
829
|
+
<div slTable id="orders-by-status" [columns]="4">
|
|
830
|
+
<div slTableContent aria-label="Orders">
|
|
831
|
+
<thead slTableHead>
|
|
832
|
+
<tr slTableRow>
|
|
833
|
+
<th slTableColumnHeader>Order</th>
|
|
834
|
+
<th slTableColumnHeader>Customer</th>
|
|
835
|
+
<th slTableColumnHeader>Status</th>
|
|
836
|
+
<th slTableColumnHeader numeric>Total</th>
|
|
837
|
+
</tr>
|
|
838
|
+
</thead>
|
|
839
|
+
<tbody slTableBody>
|
|
840
|
+
@for (order of rows(); track order.id) {
|
|
841
|
+
<tr slTableRow [value]="order.id">
|
|
842
|
+
<th slTableRowHeader>{{ order.id }}</th>
|
|
843
|
+
<td slTableCell>{{ order.customer }}</td>
|
|
844
|
+
<td slTableCell>{{ status[order.status] }}</td>
|
|
845
|
+
<td slTableCell numeric>{{ order.total }}</td>
|
|
846
|
+
</tr>
|
|
847
|
+
}
|
|
848
|
+
</tbody>
|
|
849
|
+
</div>
|
|
850
|
+
</div>
|
|
851
|
+
</div>
|
|
852
|
+
`,
|
|
853
|
+
})
|
|
854
|
+
export class TabsFilter {
|
|
855
|
+
protected readonly filters = FILTERS;
|
|
856
|
+
protected readonly status = STATUS;
|
|
857
|
+
protected readonly matching = matching;
|
|
858
|
+
protected readonly filter = signal('all');
|
|
859
|
+
protected readonly rows = computed(() => matching(this.filter()));
|
|
860
|
+
}
|
|
861
|
+
```
|
|
862
|
+
|
|
863
|
+
### icons.ts
|
|
864
|
+
|
|
865
|
+
Example
|
|
866
|
+
|
|
867
|
+
```ts
|
|
868
|
+
import { Component } from '@angular/core';
|
|
869
|
+
import { SlBadge } from '@slotted/angular/badge';
|
|
870
|
+
import { SlGlyph, SlIcon, type GlyphName } from '@slotted/angular/icon';
|
|
871
|
+
import { SlTab, SlTabEnd, SlTabList, SlTabPanel, SlTabs, SlTabStart } from '@slotted/angular/tabs';
|
|
872
|
+
import { SlText } from '@slotted/angular/typography';
|
|
873
|
+
|
|
874
|
+
const VIEWS: { value: string; label: string; icon: GlyphName; count?: number; panel: string }[] = [
|
|
875
|
+
{
|
|
876
|
+
value: 'overview',
|
|
877
|
+
label: 'Overview',
|
|
878
|
+
icon: 'file-text',
|
|
879
|
+
panel: 'Harbor & Pine, customer since 2021. Net 30 terms.',
|
|
880
|
+
},
|
|
881
|
+
{
|
|
882
|
+
value: 'orders',
|
|
883
|
+
label: 'Orders',
|
|
884
|
+
icon: 'inbox',
|
|
885
|
+
count: 12,
|
|
886
|
+
panel: '12 open orders, $14,380.00 in total.',
|
|
887
|
+
},
|
|
888
|
+
{
|
|
889
|
+
value: 'contacts',
|
|
890
|
+
label: 'Contacts',
|
|
891
|
+
icon: 'person',
|
|
892
|
+
count: 3,
|
|
893
|
+
panel: 'Dana Whitfield, Marco Ilić and Priya Raman.',
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
value: 'files',
|
|
897
|
+
label: 'Files',
|
|
898
|
+
icon: 'paperclip',
|
|
899
|
+
panel: 'Signed credit application and a W-9 form.',
|
|
900
|
+
},
|
|
901
|
+
];
|
|
902
|
+
|
|
903
|
+
@Component({
|
|
904
|
+
selector: 'app-tabs-icons',
|
|
905
|
+
imports: [
|
|
906
|
+
SlBadge,
|
|
907
|
+
SlGlyph,
|
|
908
|
+
SlIcon,
|
|
909
|
+
SlTab,
|
|
910
|
+
SlTabEnd,
|
|
911
|
+
SlTabList,
|
|
912
|
+
SlTabPanel,
|
|
913
|
+
SlTabs,
|
|
914
|
+
SlTabStart,
|
|
915
|
+
SlText,
|
|
916
|
+
],
|
|
917
|
+
template: `
|
|
918
|
+
<div slTabs defaultValue="orders">
|
|
919
|
+
<div slTabList aria-label="Customer Harbor & Pine">
|
|
920
|
+
@for (view of views; track view.value) {
|
|
921
|
+
<div slTab [value]="view.value">
|
|
922
|
+
<span slTabStart
|
|
923
|
+
><span slIcon><svg slGlyph [name]="view.icon"></svg></span
|
|
924
|
+
></span>
|
|
925
|
+
{{ view.label }}
|
|
926
|
+
@if (view.count !== undefined) {
|
|
927
|
+
<span slTabEnd><span slBadge size="sm" [count]="view.count"></span></span>
|
|
928
|
+
}
|
|
929
|
+
</div>
|
|
930
|
+
}
|
|
931
|
+
</div>
|
|
932
|
+
@for (view of views; track view.value) {
|
|
933
|
+
<div slTabPanel [value]="view.value">
|
|
934
|
+
<span slText size="sm">{{ view.panel }}</span>
|
|
935
|
+
</div>
|
|
936
|
+
}
|
|
937
|
+
</div>
|
|
938
|
+
`,
|
|
939
|
+
})
|
|
940
|
+
export class TabsIcons {
|
|
941
|
+
protected readonly views = VIEWS;
|
|
942
|
+
}
|
|
943
|
+
```
|
|
944
|
+
|
|
945
|
+
### record-header.ts
|
|
946
|
+
|
|
947
|
+
Example
|
|
948
|
+
|
|
949
|
+
```ts
|
|
950
|
+
import { Component } from '@angular/core';
|
|
951
|
+
import { SlBadge } from '@slotted/angular/badge';
|
|
952
|
+
import { SlButton, SlButtonStart } from '@slotted/angular/button';
|
|
953
|
+
import {
|
|
954
|
+
SlDescriptionList,
|
|
955
|
+
SlDescriptionListDescription,
|
|
956
|
+
SlDescriptionListItem,
|
|
957
|
+
SlDescriptionListTerm,
|
|
958
|
+
} from '@slotted/angular/description-list';
|
|
959
|
+
import { SlGlyph, SlIcon } from '@slotted/angular/icon';
|
|
960
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
961
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
962
|
+
import {
|
|
963
|
+
SlTable,
|
|
964
|
+
SlTableBody,
|
|
965
|
+
SlTableCell,
|
|
966
|
+
SlTableColumnHeader,
|
|
967
|
+
SlTableContent,
|
|
968
|
+
SlTableHead,
|
|
969
|
+
SlTableRow,
|
|
970
|
+
SlTableRowHeader,
|
|
971
|
+
} from '@slotted/angular/table';
|
|
972
|
+
import { SlTab, SlTabEnd, SlTabList, SlTabPanel, SlTabs, SlTabStart } from '@slotted/angular/tabs';
|
|
973
|
+
import { SlHeading, SlText } from '@slotted/angular/typography';
|
|
974
|
+
|
|
975
|
+
const FACTS = [
|
|
976
|
+
['Customer', 'Harbor & Pine'],
|
|
977
|
+
['Placed', 'September 8, 2026'],
|
|
978
|
+
['Payment terms', 'Net 30'],
|
|
979
|
+
['Ship to', '88 Dock Street, Portland, OR'],
|
|
980
|
+
['Carrier', 'Atlas Freight'],
|
|
981
|
+
['Total', '$1,240.00'],
|
|
982
|
+
];
|
|
983
|
+
|
|
984
|
+
const LINES = [
|
|
985
|
+
{ sku: 'OAK-90', item: 'Oak shelf, 90 cm', quantity: 4, amount: '$720.00' },
|
|
986
|
+
{ sku: 'BRK-ST', item: 'Wall bracket, steel', quantity: 8, amount: '$192.00' },
|
|
987
|
+
{ sku: 'KIT-AS', item: 'Assembly kit', quantity: 1, amount: '$328.00' },
|
|
988
|
+
];
|
|
989
|
+
|
|
990
|
+
const ACTIVITY = [
|
|
991
|
+
'Sep 9, 14:02 — Picked at Reno, NV by Luis Ortega',
|
|
992
|
+
'Sep 8, 16:45 — Payment approved',
|
|
993
|
+
'Sep 8, 16:41 — Order placed by Dana Whitfield',
|
|
994
|
+
];
|
|
995
|
+
|
|
996
|
+
@Component({
|
|
997
|
+
selector: 'app-tabs-record-header',
|
|
998
|
+
imports: [
|
|
999
|
+
SlBadge,
|
|
1000
|
+
SlButton,
|
|
1001
|
+
SlButtonStart,
|
|
1002
|
+
SlDescriptionList,
|
|
1003
|
+
SlDescriptionListDescription,
|
|
1004
|
+
SlDescriptionListItem,
|
|
1005
|
+
SlDescriptionListTerm,
|
|
1006
|
+
SlGlyph,
|
|
1007
|
+
SlHeading,
|
|
1008
|
+
SlIcon,
|
|
1009
|
+
SlInline,
|
|
1010
|
+
SlStack,
|
|
1011
|
+
SlTab,
|
|
1012
|
+
SlTabEnd,
|
|
1013
|
+
SlTabList,
|
|
1014
|
+
SlTabPanel,
|
|
1015
|
+
SlTable,
|
|
1016
|
+
SlTableBody,
|
|
1017
|
+
SlTableCell,
|
|
1018
|
+
SlTableColumnHeader,
|
|
1019
|
+
SlTableContent,
|
|
1020
|
+
SlTableHead,
|
|
1021
|
+
SlTableRow,
|
|
1022
|
+
SlTableRowHeader,
|
|
1023
|
+
SlTabs,
|
|
1024
|
+
SlTabStart,
|
|
1025
|
+
SlText,
|
|
1026
|
+
],
|
|
1027
|
+
template: `
|
|
1028
|
+
<div slStack [gap]="6">
|
|
1029
|
+
<div slInline [gap]="4" align="start" justify="between" wrap="wrap">
|
|
1030
|
+
<div slStack [gap]="1">
|
|
1031
|
+
<div slInline [gap]="3" align="center">
|
|
1032
|
+
<h2 slHeading size="xl">Order SO-1187</h2>
|
|
1033
|
+
<span slBadge tone="warning">Awaiting pickup</span>
|
|
1034
|
+
</div>
|
|
1035
|
+
<span slText size="sm" tone="muted">Harbor & Pine · Placed September 8, 2026</span>
|
|
1036
|
+
</div>
|
|
1037
|
+
<div slInline [gap]="2">
|
|
1038
|
+
<button slButton size="sm" tone="secondary" variant="outline">
|
|
1039
|
+
<span slButtonStart><svg slGlyph name="file-text"></svg></span>
|
|
1040
|
+
Packing slip
|
|
1041
|
+
</button>
|
|
1042
|
+
<button slButton size="sm">Mark shipped</button>
|
|
1043
|
+
</div>
|
|
1044
|
+
</div>
|
|
1045
|
+
<div slTabs defaultValue="overview">
|
|
1046
|
+
<div slTabList aria-label="Order SO-1187">
|
|
1047
|
+
<div slTab value="overview">
|
|
1048
|
+
<span slTabStart
|
|
1049
|
+
><span slIcon><svg slGlyph name="file-text"></svg></span
|
|
1050
|
+
></span>
|
|
1051
|
+
Overview
|
|
1052
|
+
</div>
|
|
1053
|
+
<div slTab value="items">
|
|
1054
|
+
<span slTabStart
|
|
1055
|
+
><span slIcon><svg slGlyph name="inbox"></svg></span
|
|
1056
|
+
></span>
|
|
1057
|
+
Items
|
|
1058
|
+
<span slTabEnd><span slBadge size="sm" [count]="lines.length"></span></span>
|
|
1059
|
+
</div>
|
|
1060
|
+
<div slTab value="activity">
|
|
1061
|
+
<span slTabStart
|
|
1062
|
+
><span slIcon><svg slGlyph name="clock"></svg></span
|
|
1063
|
+
></span>
|
|
1064
|
+
Activity
|
|
1065
|
+
<span slTabEnd><span slBadge size="sm" [count]="activity.length"></span></span>
|
|
1066
|
+
</div>
|
|
1067
|
+
</div>
|
|
1068
|
+
<div slTabPanel value="overview">
|
|
1069
|
+
<div slDescriptionList [columns]="2">
|
|
1070
|
+
@for (fact of facts; track fact[0]) {
|
|
1071
|
+
<div slDescriptionListItem>
|
|
1072
|
+
<dt slDescriptionListTerm>{{ fact[0] }}</dt>
|
|
1073
|
+
<dd slDescriptionListDescription>{{ fact[1] }}</dd>
|
|
1074
|
+
</div>
|
|
1075
|
+
}
|
|
1076
|
+
</div>
|
|
1077
|
+
</div>
|
|
1078
|
+
<div slTabPanel value="items">
|
|
1079
|
+
<div slTable [columns]="4">
|
|
1080
|
+
<div slTableContent aria-label="Order lines">
|
|
1081
|
+
<thead slTableHead>
|
|
1082
|
+
<tr slTableRow>
|
|
1083
|
+
<th slTableColumnHeader>SKU</th>
|
|
1084
|
+
<th slTableColumnHeader>Item</th>
|
|
1085
|
+
<th slTableColumnHeader numeric>Quantity</th>
|
|
1086
|
+
<th slTableColumnHeader numeric>Amount</th>
|
|
1087
|
+
</tr>
|
|
1088
|
+
</thead>
|
|
1089
|
+
<tbody slTableBody>
|
|
1090
|
+
@for (line of lines; track line.sku) {
|
|
1091
|
+
<tr slTableRow [value]="line.sku">
|
|
1092
|
+
<th slTableRowHeader>{{ line.sku }}</th>
|
|
1093
|
+
<td slTableCell>{{ line.item }}</td>
|
|
1094
|
+
<td slTableCell numeric>{{ line.quantity }}</td>
|
|
1095
|
+
<td slTableCell numeric>{{ line.amount }}</td>
|
|
1096
|
+
</tr>
|
|
1097
|
+
}
|
|
1098
|
+
</tbody>
|
|
1099
|
+
</div>
|
|
1100
|
+
</div>
|
|
1101
|
+
</div>
|
|
1102
|
+
<div slTabPanel value="activity">
|
|
1103
|
+
<div slStack [gap]="2">
|
|
1104
|
+
@for (entry of activity; track entry) {
|
|
1105
|
+
<span slText size="sm">{{ entry }}</span>
|
|
1106
|
+
}
|
|
1107
|
+
</div>
|
|
1108
|
+
</div>
|
|
1109
|
+
</div>
|
|
1110
|
+
</div>
|
|
1111
|
+
`,
|
|
1112
|
+
})
|
|
1113
|
+
export class TabsRecordHeader {
|
|
1114
|
+
protected readonly facts = FACTS;
|
|
1115
|
+
protected readonly lines = LINES;
|
|
1116
|
+
protected readonly activity = ACTIVITY;
|
|
1117
|
+
}
|
|
1118
|
+
```
|
|
1119
|
+
|
|
1120
|
+
### settings.ts
|
|
1121
|
+
|
|
1122
|
+
Example
|
|
1123
|
+
|
|
1124
|
+
```ts
|
|
1125
|
+
import { Component } from '@angular/core';
|
|
1126
|
+
import { SlButton } from '@slotted/angular/button';
|
|
1127
|
+
import {
|
|
1128
|
+
SlDescriptionList,
|
|
1129
|
+
SlDescriptionListDescription,
|
|
1130
|
+
SlDescriptionListItem,
|
|
1131
|
+
SlDescriptionListTerm,
|
|
1132
|
+
} from '@slotted/angular/description-list';
|
|
1133
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1134
|
+
import { SlGlyph, SlIcon } from '@slotted/angular/icon';
|
|
1135
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
1136
|
+
import { SlSwitch } from '@slotted/angular/switch';
|
|
1137
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs, SlTabStart } from '@slotted/angular/tabs';
|
|
1138
|
+
import { SlTextField, SlTextFieldInput } from '@slotted/angular/text-field';
|
|
1139
|
+
import { SlHeading, SlText } from '@slotted/angular/typography';
|
|
1140
|
+
|
|
1141
|
+
const PLAN = [
|
|
1142
|
+
['Plan', 'Operations, annual'],
|
|
1143
|
+
['Seats', '24 of 30 in use'],
|
|
1144
|
+
['Next invoice', 'November 1, 2026: $4,320.00'],
|
|
1145
|
+
];
|
|
1146
|
+
|
|
1147
|
+
@Component({
|
|
1148
|
+
selector: 'app-tabs-settings',
|
|
1149
|
+
imports: [
|
|
1150
|
+
SlButton,
|
|
1151
|
+
SlDescriptionList,
|
|
1152
|
+
SlDescriptionListDescription,
|
|
1153
|
+
SlDescriptionListItem,
|
|
1154
|
+
SlDescriptionListTerm,
|
|
1155
|
+
SlField,
|
|
1156
|
+
SlFieldDescription,
|
|
1157
|
+
SlFieldLabel,
|
|
1158
|
+
SlGlyph,
|
|
1159
|
+
SlHeading,
|
|
1160
|
+
SlIcon,
|
|
1161
|
+
SlStack,
|
|
1162
|
+
SlSwitch,
|
|
1163
|
+
SlTab,
|
|
1164
|
+
SlTabList,
|
|
1165
|
+
SlTabPanel,
|
|
1166
|
+
SlTabs,
|
|
1167
|
+
SlTabStart,
|
|
1168
|
+
SlText,
|
|
1169
|
+
SlTextField,
|
|
1170
|
+
SlTextFieldInput,
|
|
1171
|
+
],
|
|
1172
|
+
template: `
|
|
1173
|
+
<div slTabs defaultValue="workspace" orientation="vertical">
|
|
1174
|
+
<div slTabList aria-label="Settings">
|
|
1175
|
+
<div slTab value="workspace">
|
|
1176
|
+
<span slTabStart
|
|
1177
|
+
><span slIcon><svg slGlyph name="file-text"></svg></span
|
|
1178
|
+
></span>
|
|
1179
|
+
Workspace
|
|
1180
|
+
</div>
|
|
1181
|
+
<div slTab value="notifications">
|
|
1182
|
+
<span slTabStart
|
|
1183
|
+
><span slIcon><svg slGlyph name="bell"></svg></span
|
|
1184
|
+
></span>
|
|
1185
|
+
Notifications
|
|
1186
|
+
</div>
|
|
1187
|
+
<div slTab value="security">
|
|
1188
|
+
<span slTabStart
|
|
1189
|
+
><span slIcon><svg slGlyph name="lock"></svg></span
|
|
1190
|
+
></span>
|
|
1191
|
+
Security
|
|
1192
|
+
</div>
|
|
1193
|
+
<div slTab value="billing">
|
|
1194
|
+
<span slTabStart
|
|
1195
|
+
><span slIcon><svg slGlyph name="calendar"></svg></span
|
|
1196
|
+
></span>
|
|
1197
|
+
Billing
|
|
1198
|
+
</div>
|
|
1199
|
+
</div>
|
|
1200
|
+
<div slTabPanel value="workspace">
|
|
1201
|
+
<div slStack [gap]="5" align="start">
|
|
1202
|
+
<h3 slHeading size="md">Workspace</h3>
|
|
1203
|
+
<div slField>
|
|
1204
|
+
<label slFieldLabel>Company name</label>
|
|
1205
|
+
<div slTextField>
|
|
1206
|
+
<input slTextFieldInput defaultValue="Northwind Traders" />
|
|
1207
|
+
</div>
|
|
1208
|
+
<span slFieldDescription>Printed on every invoice and packing slip.</span>
|
|
1209
|
+
</div>
|
|
1210
|
+
<div slField>
|
|
1211
|
+
<label slFieldLabel>Support email</label>
|
|
1212
|
+
<div slTextField>
|
|
1213
|
+
<input slTextFieldInput defaultValue="support@northwind.example" type="email" />
|
|
1214
|
+
</div>
|
|
1215
|
+
</div>
|
|
1216
|
+
<button slButton size="sm">Save changes</button>
|
|
1217
|
+
</div>
|
|
1218
|
+
</div>
|
|
1219
|
+
<div slTabPanel value="notifications">
|
|
1220
|
+
<div slStack [gap]="4">
|
|
1221
|
+
<h3 slHeading size="md">Notifications</h3>
|
|
1222
|
+
<span slSwitch defaultChecked>Low stock</span>
|
|
1223
|
+
<span slSwitch defaultChecked>Late pickups</span>
|
|
1224
|
+
<span slSwitch>Cycle count variances</span>
|
|
1225
|
+
</div>
|
|
1226
|
+
</div>
|
|
1227
|
+
<div slTabPanel value="security">
|
|
1228
|
+
<div slStack [gap]="4">
|
|
1229
|
+
<h3 slHeading size="md">Security</h3>
|
|
1230
|
+
<span slSwitch defaultChecked>Require two-factor sign-in</span>
|
|
1231
|
+
<span slText size="sm" tone="muted">Changed by Dana Whitfield on August 14.</span>
|
|
1232
|
+
</div>
|
|
1233
|
+
</div>
|
|
1234
|
+
<div slTabPanel value="billing">
|
|
1235
|
+
<div slStack [gap]="4">
|
|
1236
|
+
<h3 slHeading size="md">Billing</h3>
|
|
1237
|
+
<div slDescriptionList>
|
|
1238
|
+
@for (row of plan; track row[0]) {
|
|
1239
|
+
<div slDescriptionListItem>
|
|
1240
|
+
<dt slDescriptionListTerm>{{ row[0] }}</dt>
|
|
1241
|
+
<dd slDescriptionListDescription>{{ row[1] }}</dd>
|
|
1242
|
+
</div>
|
|
1243
|
+
}
|
|
1244
|
+
</div>
|
|
1245
|
+
</div>
|
|
1246
|
+
</div>
|
|
1247
|
+
</div>
|
|
1248
|
+
`,
|
|
1249
|
+
})
|
|
1250
|
+
export class TabsSettings {
|
|
1251
|
+
protected readonly plan = PLAN;
|
|
1252
|
+
}
|
|
1253
|
+
```
|
|
1254
|
+
|
|
1255
|
+
### variants.ts
|
|
1256
|
+
|
|
1257
|
+
Example
|
|
1258
|
+
|
|
1259
|
+
```ts
|
|
1260
|
+
import { Component } from '@angular/core';
|
|
1261
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
1262
|
+
import {
|
|
1263
|
+
SlTab,
|
|
1264
|
+
SlTabList,
|
|
1265
|
+
SlTabPanel,
|
|
1266
|
+
SlTabs,
|
|
1267
|
+
type TabsTrack,
|
|
1268
|
+
type TabsVariant,
|
|
1269
|
+
} from '@slotted/angular/tabs';
|
|
1270
|
+
import { SlText } from '@slotted/angular/typography';
|
|
1271
|
+
|
|
1272
|
+
const LOOKS: { variant: TabsVariant; track: TabsTrack }[] = [
|
|
1273
|
+
{ variant: 'line', track: 'line' },
|
|
1274
|
+
{ variant: 'contained', track: 'line' },
|
|
1275
|
+
{ variant: 'line', track: 'none' },
|
|
1276
|
+
];
|
|
1277
|
+
|
|
1278
|
+
const QUEUES = [
|
|
1279
|
+
{ value: 'incoming', label: 'Incoming', panel: '14 purchase orders due this week.' },
|
|
1280
|
+
{ value: 'outgoing', label: 'Outgoing', panel: '32 sales orders ready to ship.' },
|
|
1281
|
+
{ value: 'returns', label: 'Returns', panel: '3 returns awaiting inspection.' },
|
|
1282
|
+
];
|
|
1283
|
+
|
|
1284
|
+
@Component({
|
|
1285
|
+
selector: 'app-tabs-variants',
|
|
1286
|
+
imports: [SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
1287
|
+
template: `
|
|
1288
|
+
<div slStack [gap]="8">
|
|
1289
|
+
@for (look of looks; track $index) {
|
|
1290
|
+
<div slTabs defaultValue="incoming" [track]="look.track" [variant]="look.variant">
|
|
1291
|
+
<div slTabList aria-label="Warehouse queues">
|
|
1292
|
+
@for (queue of queues; track queue.value) {
|
|
1293
|
+
<div slTab [value]="queue.value">{{ queue.label }}</div>
|
|
1294
|
+
}
|
|
1295
|
+
</div>
|
|
1296
|
+
@for (queue of queues; track queue.value) {
|
|
1297
|
+
<div slTabPanel [value]="queue.value">
|
|
1298
|
+
<span slText size="sm">{{ queue.panel }}</span>
|
|
1299
|
+
</div>
|
|
1300
|
+
}
|
|
1301
|
+
</div>
|
|
1302
|
+
}
|
|
1303
|
+
</div>
|
|
1304
|
+
`,
|
|
1305
|
+
})
|
|
1306
|
+
export class TabsVariants {
|
|
1307
|
+
protected readonly looks = LOOKS;
|
|
1308
|
+
protected readonly queues = QUEUES;
|
|
1309
|
+
}
|
|
1310
|
+
```
|
|
1311
|
+
|
|
1312
|
+
### vertical.ts
|
|
1313
|
+
|
|
1314
|
+
Example
|
|
1315
|
+
|
|
1316
|
+
```ts
|
|
1317
|
+
import { Component } from '@angular/core';
|
|
1318
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
1319
|
+
import { SlTab, SlTabList, SlTabPanel, SlTabs } from '@slotted/angular/tabs';
|
|
1320
|
+
import { SlText } from '@slotted/angular/typography';
|
|
1321
|
+
|
|
1322
|
+
const SECTIONS = [
|
|
1323
|
+
{
|
|
1324
|
+
value: 'general',
|
|
1325
|
+
label: 'General',
|
|
1326
|
+
lines: ['Code: RNO', 'Address: 1450 Terminal Way, Reno, NV 89502', 'Time zone: Pacific Time'],
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
value: 'receiving',
|
|
1330
|
+
label: 'Receiving',
|
|
1331
|
+
lines: ['Dock hours: 06:00–14:00, Monday to Friday', 'Appointment required for full trucks'],
|
|
1332
|
+
},
|
|
1333
|
+
{
|
|
1334
|
+
value: 'shipping',
|
|
1335
|
+
label: 'Shipping',
|
|
1336
|
+
lines: ['Carriers: Atlas Freight, Ridgeway Parcel', 'Daily cut-off: 15:30'],
|
|
1337
|
+
},
|
|
1338
|
+
{
|
|
1339
|
+
value: 'storage',
|
|
1340
|
+
label: 'Storage',
|
|
1341
|
+
lines: ['Zones: A–F, 1,920 bin locations', 'Cycle count: every 30 days'],
|
|
1342
|
+
},
|
|
1343
|
+
];
|
|
1344
|
+
|
|
1345
|
+
@Component({
|
|
1346
|
+
selector: 'app-tabs-vertical',
|
|
1347
|
+
imports: [SlStack, SlTab, SlTabList, SlTabPanel, SlTabs, SlText],
|
|
1348
|
+
template: `
|
|
1349
|
+
<div slTabs defaultValue="general" orientation="vertical">
|
|
1350
|
+
<div slTabList aria-label="Warehouse settings">
|
|
1351
|
+
@for (section of sections; track section.value) {
|
|
1352
|
+
<div slTab [value]="section.value">{{ section.label }}</div>
|
|
1353
|
+
}
|
|
1354
|
+
</div>
|
|
1355
|
+
@for (section of sections; track section.value) {
|
|
1356
|
+
<div slTabPanel [value]="section.value">
|
|
1357
|
+
<div slStack [gap]="2">
|
|
1358
|
+
@for (line of section.lines; track line) {
|
|
1359
|
+
<span slText size="sm">{{ line }}</span>
|
|
1360
|
+
}
|
|
1361
|
+
</div>
|
|
1362
|
+
</div>
|
|
1363
|
+
}
|
|
1364
|
+
</div>
|
|
1365
|
+
`,
|
|
1366
|
+
})
|
|
1367
|
+
export class TabsVertical {
|
|
1368
|
+
protected readonly sections = SECTIONS;
|
|
1369
|
+
}
|
|
1370
|
+
```
|