@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,1214 @@
|
|
|
1
|
+
<!-- index: ./index.md -->
|
|
2
|
+
# select
|
|
3
|
+
|
|
4
|
+
`data-ui="select"` · Picks one option from a popup list.
|
|
5
|
+
|
|
6
|
+
## Examples
|
|
7
|
+
|
|
8
|
+
### Playground
|
|
9
|
+
|
|
10
|
+
One select with every axis on it, driven by the controls under the canvas. Change size, variant and width and watch the control and its popup answer together.
|
|
11
|
+
|
|
12
|
+
Excerpt — not a complete module
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<sl-select aria-label="Fruit" placeholder="Choose a fruit">
|
|
16
|
+
<sl-select-item value="apple">Apple</sl-select-item>
|
|
17
|
+
<sl-select-item value="blueberry">Blueberry</sl-select-item>
|
|
18
|
+
</sl-select>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Two-way, and the request
|
|
22
|
+
|
|
23
|
+
The model moves the value in both directions; the request output arrives first and carries the reason, so a page can tell a press from a key — or refuse the change.
|
|
24
|
+
|
|
25
|
+
Excerpt — not a complete module
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<sl-select [(value)]="fruit" (valueChangeRequest)="log($event.reason)">…</sl-select>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Placeholder and unresolved values
|
|
32
|
+
|
|
33
|
+
Nothing chosen shows the placeholder in the muted step. A value the collection cannot name shows the value itself, which is what an async list holds for one render.
|
|
34
|
+
|
|
35
|
+
Example
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { Component } from '@angular/core';
|
|
39
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
40
|
+
import { SlSelect, SlSelectItem, type SelectOption } from '@slotted/angular/select';
|
|
41
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
42
|
+
|
|
43
|
+
const REASONS: SelectOption[] = [
|
|
44
|
+
{ value: 'damaged', label: 'Arrived damaged' },
|
|
45
|
+
{ value: 'wrong-item', label: 'Wrong item shipped' },
|
|
46
|
+
{ value: 'not-needed', label: 'No longer needed' },
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
const TERMS: SelectOption[] = [
|
|
50
|
+
{ value: 'prepaid', label: 'Prepaid' },
|
|
51
|
+
{ value: 'net-30', label: 'Net 30' },
|
|
52
|
+
{ value: 'net-45', label: 'Net 45' },
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
@Component({
|
|
56
|
+
selector: 'app-select-placeholder',
|
|
57
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem, SlStack],
|
|
58
|
+
template: `
|
|
59
|
+
<div slStack [gap]="5">
|
|
60
|
+
<div slField>
|
|
61
|
+
<label slFieldLabel>Return reason</label>
|
|
62
|
+
<sl-select placeholder="Choose a reason">
|
|
63
|
+
@for (reason of reasons; track reason.value) {
|
|
64
|
+
<sl-select-item [value]="reason.value">{{ reason.label }}</sl-select-item>
|
|
65
|
+
}
|
|
66
|
+
</sl-select>
|
|
67
|
+
</div>
|
|
68
|
+
<div slField>
|
|
69
|
+
<label slFieldLabel>Payment terms</label>
|
|
70
|
+
<sl-select placeholder="Choose terms" value="net-30" [items]="terms">
|
|
71
|
+
@for (term of terms; track term.value) {
|
|
72
|
+
<sl-select-item [value]="term.value">{{ term.label }}</sl-select-item>
|
|
73
|
+
}
|
|
74
|
+
</sl-select>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
`,
|
|
78
|
+
})
|
|
79
|
+
export class SelectPlaceholder {
|
|
80
|
+
protected readonly reasons = REASONS;
|
|
81
|
+
protected readonly terms = TERMS;
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Groups, icons and descriptions
|
|
86
|
+
|
|
87
|
+
Two named groups with a line between them. Every label starts on the same line whether or not its option carries artwork, because the column belongs to the list.
|
|
88
|
+
|
|
89
|
+
Example
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import { Component } from '@angular/core';
|
|
93
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
94
|
+
import {
|
|
95
|
+
SlSelect,
|
|
96
|
+
SlSelectGroup,
|
|
97
|
+
SlSelectItem,
|
|
98
|
+
SlSelectSeparator,
|
|
99
|
+
type SelectOptionGroup,
|
|
100
|
+
} from '@slotted/angular/select';
|
|
101
|
+
|
|
102
|
+
const METHODS: SelectOptionGroup[] = [
|
|
103
|
+
{
|
|
104
|
+
label: 'Ground',
|
|
105
|
+
options: [
|
|
106
|
+
{ value: 'ups-ground', label: 'UPS Ground' },
|
|
107
|
+
{ value: 'fedex-ground', label: 'FedEx Ground' },
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
label: 'Express',
|
|
112
|
+
options: [
|
|
113
|
+
{ value: 'ups-2day', label: 'UPS 2nd Day Air' },
|
|
114
|
+
{ value: 'fedex-overnight', label: 'FedEx Priority Overnight' },
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
label: 'Freight',
|
|
119
|
+
options: [{ value: 'ltl', label: 'LTL freight, palletised' }],
|
|
120
|
+
},
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
@Component({
|
|
124
|
+
selector: 'app-select-groups',
|
|
125
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectGroup, SlSelectItem, SlSelectSeparator],
|
|
126
|
+
template: `
|
|
127
|
+
<div slField>
|
|
128
|
+
<label slFieldLabel>Shipping method</label>
|
|
129
|
+
<sl-select placeholder="Choose a method">
|
|
130
|
+
@for (group of methods; track group.label; let first = $first) {
|
|
131
|
+
@if (!first) {
|
|
132
|
+
<sl-select-separator />
|
|
133
|
+
}
|
|
134
|
+
<sl-select-group [label]="group.label">
|
|
135
|
+
@for (method of group.options; track method.value) {
|
|
136
|
+
<sl-select-item [value]="method.value">{{ method.label }}</sl-select-item>
|
|
137
|
+
}
|
|
138
|
+
</sl-select-group>
|
|
139
|
+
}
|
|
140
|
+
</sl-select>
|
|
141
|
+
</div>
|
|
142
|
+
`,
|
|
143
|
+
})
|
|
144
|
+
export class SelectGroups {
|
|
145
|
+
protected readonly methods = METHODS;
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Multiple selection
|
|
150
|
+
|
|
151
|
+
The popup stays open as options are taken, and the control shows the first label and how many more. Space toggles without closing, which is the listbox pattern’s own model.
|
|
152
|
+
|
|
153
|
+
Example
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
import { Component, signal } from '@angular/core';
|
|
157
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
158
|
+
import {
|
|
159
|
+
SlSelect,
|
|
160
|
+
SlSelectItem,
|
|
161
|
+
type SelectOption,
|
|
162
|
+
type SelectSelection,
|
|
163
|
+
} from '@slotted/angular/select';
|
|
164
|
+
|
|
165
|
+
const TEAMS: SelectOption[] = [
|
|
166
|
+
{ value: 'fulfilment', label: 'Fulfilment' },
|
|
167
|
+
{ value: 'finance', label: 'Finance' },
|
|
168
|
+
{ value: 'customer-care', label: 'Customer care' },
|
|
169
|
+
{ value: 'purchasing', label: 'Purchasing' },
|
|
170
|
+
{ value: 'returns', label: 'Returns desk' },
|
|
171
|
+
];
|
|
172
|
+
|
|
173
|
+
@Component({
|
|
174
|
+
selector: 'app-select-multiple',
|
|
175
|
+
imports: [SlField, SlFieldDescription, SlFieldLabel, SlSelect, SlSelectItem],
|
|
176
|
+
template: `
|
|
177
|
+
<div slField>
|
|
178
|
+
<label slFieldLabel>Notify teams</label>
|
|
179
|
+
<sl-select
|
|
180
|
+
multiple
|
|
181
|
+
clearable
|
|
182
|
+
placeholder="No one is notified"
|
|
183
|
+
[items]="teams"
|
|
184
|
+
[(value)]="notified"
|
|
185
|
+
>
|
|
186
|
+
@for (team of teams; track team.value) {
|
|
187
|
+
<sl-select-item [value]="team.value">{{ team.label }}</sl-select-item>
|
|
188
|
+
}
|
|
189
|
+
</sl-select>
|
|
190
|
+
<span slFieldDescription>Each team gets an email when the order is delayed.</span>
|
|
191
|
+
</div>
|
|
192
|
+
`,
|
|
193
|
+
})
|
|
194
|
+
export class SelectMultiple {
|
|
195
|
+
protected readonly teams = TEAMS;
|
|
196
|
+
protected readonly notified = signal<SelectSelection>(['fulfilment', 'finance']);
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Clearable
|
|
201
|
+
|
|
202
|
+
The clear button appears only once something is chosen, and focus goes back to the control it belonged to rather than to the document.
|
|
203
|
+
|
|
204
|
+
Example
|
|
205
|
+
|
|
206
|
+
```ts
|
|
207
|
+
import { Component } from '@angular/core';
|
|
208
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
209
|
+
import { SlSelect, SlSelectItem, type SelectOption } from '@slotted/angular/select';
|
|
210
|
+
|
|
211
|
+
const OWNERS: SelectOption[] = [
|
|
212
|
+
{ value: 'avery', label: 'Avery Collins' },
|
|
213
|
+
{ value: 'kenji', label: 'Kenji Watanabe' },
|
|
214
|
+
{ value: 'lucia', label: 'Lucía Fernández' },
|
|
215
|
+
{ value: 'ruth', label: 'Ruth Adeyemi' },
|
|
216
|
+
];
|
|
217
|
+
|
|
218
|
+
@Component({
|
|
219
|
+
selector: 'app-select-clearable',
|
|
220
|
+
imports: [SlField, SlFieldDescription, SlFieldLabel, SlSelect, SlSelectItem],
|
|
221
|
+
template: `
|
|
222
|
+
<div slField>
|
|
223
|
+
<label slFieldLabel>Assignee</label>
|
|
224
|
+
<sl-select clearable placeholder="Unassigned" value="kenji" [items]="owners">
|
|
225
|
+
@for (owner of owners; track owner.value) {
|
|
226
|
+
<sl-select-item [value]="owner.value">{{ owner.label }}</sl-select-item>
|
|
227
|
+
}
|
|
228
|
+
</sl-select>
|
|
229
|
+
<span slFieldDescription>Clear the assignee to return the ticket to the queue.</span>
|
|
230
|
+
</div>
|
|
231
|
+
`,
|
|
232
|
+
})
|
|
233
|
+
export class SelectClearable {
|
|
234
|
+
protected readonly owners = OWNERS;
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Sizes
|
|
239
|
+
|
|
240
|
+
Three steps, and every one of them reads control geometry — so a select beside a text field of the same size is the same height to the pixel.
|
|
241
|
+
|
|
242
|
+
Example
|
|
243
|
+
|
|
244
|
+
```ts
|
|
245
|
+
import { Component } from '@angular/core';
|
|
246
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
247
|
+
import {
|
|
248
|
+
SlSelect,
|
|
249
|
+
SlSelectItem,
|
|
250
|
+
type SelectOption,
|
|
251
|
+
type SelectSize,
|
|
252
|
+
} from '@slotted/angular/select';
|
|
253
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
254
|
+
|
|
255
|
+
const SIZES: { size: SelectSize; label: string }[] = [
|
|
256
|
+
{ size: 'sm', label: 'Small' },
|
|
257
|
+
{ size: 'md', label: 'Medium' },
|
|
258
|
+
{ size: 'lg', label: 'Large' },
|
|
259
|
+
];
|
|
260
|
+
|
|
261
|
+
const WAREHOUSES: SelectOption[] = [
|
|
262
|
+
{ value: 'RNO', label: 'Reno, NV' },
|
|
263
|
+
{ value: 'CMH', label: 'Columbus, OH' },
|
|
264
|
+
{ value: 'SAV', label: 'Savannah, GA' },
|
|
265
|
+
];
|
|
266
|
+
|
|
267
|
+
@Component({
|
|
268
|
+
selector: 'app-select-sizes',
|
|
269
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem, SlStack],
|
|
270
|
+
template: `
|
|
271
|
+
<div slStack [gap]="5">
|
|
272
|
+
@for (step of sizes; track step.size) {
|
|
273
|
+
<div slField>
|
|
274
|
+
<label slFieldLabel>{{ step.label }}</label>
|
|
275
|
+
<sl-select value="RNO" [size]="step.size" [items]="warehouses">
|
|
276
|
+
@for (warehouse of warehouses; track warehouse.value) {
|
|
277
|
+
<sl-select-item [value]="warehouse.value">{{ warehouse.label }}</sl-select-item>
|
|
278
|
+
}
|
|
279
|
+
</sl-select>
|
|
280
|
+
</div>
|
|
281
|
+
}
|
|
282
|
+
</div>
|
|
283
|
+
`,
|
|
284
|
+
})
|
|
285
|
+
export class SelectSizes {
|
|
286
|
+
protected readonly sizes = SIZES;
|
|
287
|
+
protected readonly warehouses = WAREHOUSES;
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Variants
|
|
292
|
+
|
|
293
|
+
outline on the page, subtle where a form sinks into its card, and plain for a table cell that is only a control while it is being used.
|
|
294
|
+
|
|
295
|
+
Example
|
|
296
|
+
|
|
297
|
+
```ts
|
|
298
|
+
import { Component } from '@angular/core';
|
|
299
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
300
|
+
import { SlSelect, SlSelectItem, type SelectVariant } from '@slotted/angular/select';
|
|
301
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
302
|
+
|
|
303
|
+
const VARIANTS: { variant: SelectVariant; label: string }[] = [
|
|
304
|
+
{ variant: 'outline', label: 'Outline' },
|
|
305
|
+
{ variant: 'subtle', label: 'Subtle' },
|
|
306
|
+
{ variant: 'plain', label: 'Plain' },
|
|
307
|
+
];
|
|
308
|
+
|
|
309
|
+
const WAREHOUSES = [
|
|
310
|
+
{ value: 'RNO', label: 'Reno, NV' },
|
|
311
|
+
{ value: 'CMH', label: 'Columbus, OH' },
|
|
312
|
+
{ value: 'SAV', label: 'Savannah, GA' },
|
|
313
|
+
];
|
|
314
|
+
|
|
315
|
+
@Component({
|
|
316
|
+
selector: 'app-select-variants',
|
|
317
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem, SlStack],
|
|
318
|
+
template: `
|
|
319
|
+
<div slStack [gap]="5">
|
|
320
|
+
@for (step of variants; track step.variant) {
|
|
321
|
+
<div slField>
|
|
322
|
+
<label slFieldLabel>{{ step.label }}</label>
|
|
323
|
+
<sl-select placeholder="Choose a warehouse" [variant]="step.variant">
|
|
324
|
+
@for (warehouse of warehouses; track warehouse.value) {
|
|
325
|
+
<sl-select-item [value]="warehouse.value">{{ warehouse.label }}</sl-select-item>
|
|
326
|
+
}
|
|
327
|
+
</sl-select>
|
|
328
|
+
</div>
|
|
329
|
+
}
|
|
330
|
+
</div>
|
|
331
|
+
`,
|
|
332
|
+
})
|
|
333
|
+
export class SelectVariants {
|
|
334
|
+
protected readonly variants = VARIANTS;
|
|
335
|
+
protected readonly warehouses = WAREHOUSES;
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### States
|
|
340
|
+
|
|
341
|
+
Required, invalid, read-only and disabled side by side. Read-only keeps its value legible and refuses to open; disabled answers nothing at all.
|
|
342
|
+
|
|
343
|
+
Example
|
|
344
|
+
|
|
345
|
+
```ts
|
|
346
|
+
import { Component } from '@angular/core';
|
|
347
|
+
import { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
|
|
348
|
+
import { SlSelect, SlSelectItem, type SelectOption } from '@slotted/angular/select';
|
|
349
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
350
|
+
|
|
351
|
+
const WAREHOUSES: SelectOption[] = [
|
|
352
|
+
{ value: 'RNO', label: 'Reno, NV' },
|
|
353
|
+
{ value: 'CMH', label: 'Columbus, OH' },
|
|
354
|
+
{ value: 'SAV', label: 'Savannah, GA' },
|
|
355
|
+
];
|
|
356
|
+
|
|
357
|
+
@Component({
|
|
358
|
+
selector: 'app-select-states',
|
|
359
|
+
imports: [
|
|
360
|
+
SlField,
|
|
361
|
+
SlFieldDescription,
|
|
362
|
+
SlFieldError,
|
|
363
|
+
SlFieldLabel,
|
|
364
|
+
SlSelect,
|
|
365
|
+
SlSelectItem,
|
|
366
|
+
SlStack,
|
|
367
|
+
],
|
|
368
|
+
template: `
|
|
369
|
+
<div slStack [gap]="5">
|
|
370
|
+
<div slField invalid required>
|
|
371
|
+
<label slFieldLabel>Return warehouse</label>
|
|
372
|
+
<sl-select value="SAV" [items]="warehouses">
|
|
373
|
+
@for (warehouse of warehouses; track warehouse.value) {
|
|
374
|
+
<sl-select-item [value]="warehouse.value">{{ warehouse.label }}</sl-select-item>
|
|
375
|
+
}
|
|
376
|
+
</sl-select>
|
|
377
|
+
<span slFieldError>Savannah does not accept returns. Choose Reno or Columbus.</span>
|
|
378
|
+
</div>
|
|
379
|
+
<div slField readOnly>
|
|
380
|
+
<label slFieldLabel>Origin warehouse</label>
|
|
381
|
+
<sl-select value="RNO" [items]="warehouses">
|
|
382
|
+
@for (warehouse of warehouses; track warehouse.value) {
|
|
383
|
+
<sl-select-item [value]="warehouse.value">{{ warehouse.label }}</sl-select-item>
|
|
384
|
+
}
|
|
385
|
+
</sl-select>
|
|
386
|
+
<span slFieldDescription>Set when the order was picked.</span>
|
|
387
|
+
</div>
|
|
388
|
+
<div slField disabled>
|
|
389
|
+
<label slFieldLabel>Transfer warehouse</label>
|
|
390
|
+
<sl-select value="CMH" [items]="warehouses">
|
|
391
|
+
@for (warehouse of warehouses; track warehouse.value) {
|
|
392
|
+
<sl-select-item [value]="warehouse.value">{{ warehouse.label }}</sl-select-item>
|
|
393
|
+
}
|
|
394
|
+
</sl-select>
|
|
395
|
+
<span slFieldDescription>Transfers open once the order is invoiced.</span>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
`,
|
|
399
|
+
})
|
|
400
|
+
export class SelectStates {
|
|
401
|
+
protected readonly warehouses = WAREHOUSES;
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Loading and empty
|
|
406
|
+
|
|
407
|
+
A popup with nothing in it opens onto a sentence rather than onto a two-pixel box, and a loading one keeps that measure so nothing jumps when the options land.
|
|
408
|
+
|
|
409
|
+
Excerpt — not a complete module
|
|
410
|
+
|
|
411
|
+
```html
|
|
412
|
+
<sl-select loading [messages]="{ loading: 'Fetching teams…' }">…</sl-select>
|
|
413
|
+
<sl-select [messages]="{ empty: 'No teams yet' }"></sl-select>
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Content the family did not choose
|
|
417
|
+
|
|
418
|
+
A translated label, an unbroken identifier and a hundred options. The label clamps at two lines with the whole string still in the DOM, and the token breaks inside the option.
|
|
419
|
+
|
|
420
|
+
Excerpt — not a complete module
|
|
421
|
+
|
|
422
|
+
```html
|
|
423
|
+
<sl-select-item value="urn">urn:acme:catalogue:9f2c41ab8de07c5511903fbe</sl-select-item>
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Searching a long list
|
|
427
|
+
|
|
428
|
+
search opens the popup onto a field. The query filters the options, the span it matched is marked, and the count is announced. It is transient: it never becomes a value, it is emptied when an option is taken, and the control goes on showing the chosen label. Escape clears the query before it closes the popup, and Tab commits and leaves the control.
|
|
429
|
+
|
|
430
|
+
Example
|
|
431
|
+
|
|
432
|
+
```ts
|
|
433
|
+
import { Component } from '@angular/core';
|
|
434
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
435
|
+
import { SlSelect, SlSelectItem, type SelectOption } from '@slotted/angular/select';
|
|
436
|
+
|
|
437
|
+
const COUNTRIES: SelectOption[] = [
|
|
438
|
+
{ value: 'AR', label: 'Argentina' },
|
|
439
|
+
{ value: 'AU', label: 'Australia' },
|
|
440
|
+
{ value: 'AT', label: 'Austria' },
|
|
441
|
+
{ value: 'BE', label: 'Belgium' },
|
|
442
|
+
{ value: 'BR', label: 'Brazil' },
|
|
443
|
+
{ value: 'CA', label: 'Canada' },
|
|
444
|
+
{ value: 'CL', label: 'Chile' },
|
|
445
|
+
{ value: 'CO', label: 'Colombia' },
|
|
446
|
+
{ value: 'CI', label: 'Côte d’Ivoire' },
|
|
447
|
+
{ value: 'DK', label: 'Denmark' },
|
|
448
|
+
{ value: 'FI', label: 'Finland' },
|
|
449
|
+
{ value: 'FR', label: 'France' },
|
|
450
|
+
{ value: 'DE', label: 'Germany' },
|
|
451
|
+
{ value: 'IE', label: 'Ireland' },
|
|
452
|
+
{ value: 'IT', label: 'Italy' },
|
|
453
|
+
{ value: 'JP', label: 'Japan' },
|
|
454
|
+
{ value: 'MX', label: 'Mexico' },
|
|
455
|
+
{ value: 'NL', label: 'Netherlands' },
|
|
456
|
+
{ value: 'NZ', label: 'New Zealand' },
|
|
457
|
+
{ value: 'NO', label: 'Norway' },
|
|
458
|
+
{ value: 'PL', label: 'Poland' },
|
|
459
|
+
{ value: 'PT', label: 'Portugal' },
|
|
460
|
+
{ value: 'ES', label: 'Spain' },
|
|
461
|
+
{ value: 'SE', label: 'Sweden' },
|
|
462
|
+
{ value: 'CH', label: 'Switzerland' },
|
|
463
|
+
{ value: 'TR', label: 'Türkiye' },
|
|
464
|
+
{ value: 'GB', label: 'United Kingdom' },
|
|
465
|
+
{ value: 'US', label: 'United States' },
|
|
466
|
+
{ value: 'UY', label: 'Uruguay' },
|
|
467
|
+
{ value: 'VN', label: 'Vietnam' },
|
|
468
|
+
];
|
|
469
|
+
|
|
470
|
+
@Component({
|
|
471
|
+
selector: 'app-select-search',
|
|
472
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem],
|
|
473
|
+
template: `
|
|
474
|
+
<div slField>
|
|
475
|
+
<label slFieldLabel>Ship-to country</label>
|
|
476
|
+
<sl-select
|
|
477
|
+
search
|
|
478
|
+
placeholder="Choose a country"
|
|
479
|
+
value="US"
|
|
480
|
+
[items]="countries"
|
|
481
|
+
[messages]="{ searchPlaceholder: 'Filter countries' }"
|
|
482
|
+
>
|
|
483
|
+
@for (country of countries; track country.value) {
|
|
484
|
+
<sl-select-item [value]="country.value" [label]="country.label" />
|
|
485
|
+
}
|
|
486
|
+
</sl-select>
|
|
487
|
+
</div>
|
|
488
|
+
`,
|
|
489
|
+
})
|
|
490
|
+
export class SelectSearch {
|
|
491
|
+
protected readonly countries = COUNTRIES;
|
|
492
|
+
}
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### Placement and width
|
|
496
|
+
|
|
497
|
+
The popup hangs from the start edge of its control. It is never narrower than the control and grows when an option needs more room, so a narrow control does not wrap its labels. width="anchor" pins it to the width of the control.
|
|
498
|
+
|
|
499
|
+
Example
|
|
500
|
+
|
|
501
|
+
```ts
|
|
502
|
+
import { Component } from '@angular/core';
|
|
503
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
504
|
+
import { SlSelect, SlSelectItem, type SelectOption } from '@slotted/angular/select';
|
|
505
|
+
|
|
506
|
+
const PAGE_SIZES: SelectOption[] = [
|
|
507
|
+
{ value: '25', label: '25 rows' },
|
|
508
|
+
{ value: '50', label: '50 rows' },
|
|
509
|
+
{ value: '100', label: '100 rows' },
|
|
510
|
+
];
|
|
511
|
+
|
|
512
|
+
const SORTS: (SelectOption & { description: string })[] = [
|
|
513
|
+
{ value: 'newest', label: 'Newest', description: 'Most recent order date first.' },
|
|
514
|
+
{ value: 'total', label: 'Total', description: 'Largest order total first.' },
|
|
515
|
+
{ value: 'ship-date', label: 'Ship date', description: 'Earliest promised ship date first.' },
|
|
516
|
+
];
|
|
517
|
+
|
|
518
|
+
@Component({
|
|
519
|
+
selector: 'app-select-placement',
|
|
520
|
+
imports: [SlInline, SlSelect, SlSelectItem],
|
|
521
|
+
template: `
|
|
522
|
+
<div slInline [gap]="3" justify="between" align="center">
|
|
523
|
+
<sl-select
|
|
524
|
+
aria-label="Rows per page"
|
|
525
|
+
side="top"
|
|
526
|
+
value="25"
|
|
527
|
+
[fullWidth]="false"
|
|
528
|
+
[items]="pageSizes"
|
|
529
|
+
>
|
|
530
|
+
@for (size of pageSizes; track size.value) {
|
|
531
|
+
<sl-select-item [value]="size.value">{{ size.label }}</sl-select-item>
|
|
532
|
+
}
|
|
533
|
+
</sl-select>
|
|
534
|
+
<sl-select
|
|
535
|
+
aria-label="Sort orders"
|
|
536
|
+
align="end"
|
|
537
|
+
width="content"
|
|
538
|
+
value="newest"
|
|
539
|
+
[fullWidth]="false"
|
|
540
|
+
[items]="sorts"
|
|
541
|
+
>
|
|
542
|
+
@for (sort of sorts; track sort.value) {
|
|
543
|
+
<sl-select-item [value]="sort.value" [description]="sort.description">{{
|
|
544
|
+
sort.label
|
|
545
|
+
}}</sl-select-item>
|
|
546
|
+
}
|
|
547
|
+
</sl-select>
|
|
548
|
+
</div>
|
|
549
|
+
`,
|
|
550
|
+
})
|
|
551
|
+
export class SelectPlacement {
|
|
552
|
+
protected readonly pageSizes = PAGE_SIZES;
|
|
553
|
+
protected readonly sorts = SORTS;
|
|
554
|
+
}
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
### Keyboard
|
|
558
|
+
|
|
559
|
+
Focus never leaves the button: the arrows, Home, End and the page keys move aria-activedescendant, and typing jumps to the first option that begins with it.
|
|
560
|
+
|
|
561
|
+
Excerpt — not a complete module
|
|
562
|
+
|
|
563
|
+
```html
|
|
564
|
+
<sl-select typeahead [typeaheadTimeout]="500" [loop]="false">…</sl-select>
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
### In a Reactive Form
|
|
568
|
+
|
|
569
|
+
The control is a ControlValueAccessor and a Validator, so formControl moves the value and required is reported by the family — the hidden native select always holds an option, so the browser cannot answer it.
|
|
570
|
+
|
|
571
|
+
Example
|
|
572
|
+
|
|
573
|
+
```ts
|
|
574
|
+
import { Component, computed, signal } from '@angular/core';
|
|
575
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
576
|
+
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
577
|
+
import { SlButton } from '@slotted/angular/button';
|
|
578
|
+
import { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
|
|
579
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
580
|
+
import {
|
|
581
|
+
SlSelect,
|
|
582
|
+
SlSelectItem,
|
|
583
|
+
type SelectOption,
|
|
584
|
+
type SelectSelection,
|
|
585
|
+
} from '@slotted/angular/select';
|
|
586
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
587
|
+
import { SlText } from '@slotted/angular/typography';
|
|
588
|
+
|
|
589
|
+
const WAREHOUSES: SelectOption[] = [
|
|
590
|
+
{ value: 'RNO', label: 'Reno, NV' },
|
|
591
|
+
{ value: 'CMH', label: 'Columbus, OH' },
|
|
592
|
+
{ value: 'SAV', label: 'Savannah, GA' },
|
|
593
|
+
];
|
|
594
|
+
|
|
595
|
+
const CARRIERS: SelectOption[] = [
|
|
596
|
+
{ value: 'ups', label: 'UPS Ground' },
|
|
597
|
+
{ value: 'fedex', label: 'FedEx Ground' },
|
|
598
|
+
{ value: 'usps', label: 'USPS Priority Mail' },
|
|
599
|
+
];
|
|
600
|
+
|
|
601
|
+
const labelOf = (options: SelectOption[], value: SelectSelection) =>
|
|
602
|
+
options.find((option) => option.value === value)?.label;
|
|
603
|
+
|
|
604
|
+
@Component({
|
|
605
|
+
selector: 'app-select-form',
|
|
606
|
+
imports: [
|
|
607
|
+
ReactiveFormsModule,
|
|
608
|
+
SlButton,
|
|
609
|
+
SlField,
|
|
610
|
+
SlFieldError,
|
|
611
|
+
SlFieldLabel,
|
|
612
|
+
SlInline,
|
|
613
|
+
SlSelect,
|
|
614
|
+
SlSelectItem,
|
|
615
|
+
SlStack,
|
|
616
|
+
SlText,
|
|
617
|
+
],
|
|
618
|
+
template: `
|
|
619
|
+
<form novalidate [formGroup]="form" (ngSubmit)="submit()" (reset)="clear()">
|
|
620
|
+
<div slStack [gap]="5">
|
|
621
|
+
<div slField required [invalid]="missing() ? true : undefined">
|
|
622
|
+
<label slFieldLabel>Fulfilment warehouse</label>
|
|
623
|
+
<sl-select
|
|
624
|
+
name="warehouse"
|
|
625
|
+
placeholder="Choose a warehouse"
|
|
626
|
+
formControlName="warehouse"
|
|
627
|
+
[items]="warehouses"
|
|
628
|
+
>
|
|
629
|
+
@for (warehouse of warehouses; track warehouse.value) {
|
|
630
|
+
<sl-select-item [value]="warehouse.value">{{ warehouse.label }}</sl-select-item>
|
|
631
|
+
}
|
|
632
|
+
</sl-select>
|
|
633
|
+
<span slFieldError live="polite" reserve>{{
|
|
634
|
+
missing() ? 'Choose the warehouse that ships this order.' : ''
|
|
635
|
+
}}</span>
|
|
636
|
+
</div>
|
|
637
|
+
<div slField>
|
|
638
|
+
<label slFieldLabel>Carrier</label>
|
|
639
|
+
<sl-select name="carrier" formControlName="carrier" [items]="carriers">
|
|
640
|
+
@for (carrier of carriers; track carrier.value) {
|
|
641
|
+
<sl-select-item [value]="carrier.value">{{ carrier.label }}</sl-select-item>
|
|
642
|
+
}
|
|
643
|
+
</sl-select>
|
|
644
|
+
</div>
|
|
645
|
+
<div slInline [gap]="3" align="center">
|
|
646
|
+
<button slButton type="submit">Save</button>
|
|
647
|
+
<button slButton type="reset" tone="secondary" variant="outline">Reset</button>
|
|
648
|
+
@if (saved(); as message) {
|
|
649
|
+
<span slText size="sm" tone="muted">{{ message }}</span>
|
|
650
|
+
}
|
|
651
|
+
</div>
|
|
652
|
+
</div>
|
|
653
|
+
</form>
|
|
654
|
+
`,
|
|
655
|
+
})
|
|
656
|
+
export class SelectForm {
|
|
657
|
+
protected readonly warehouses = WAREHOUSES;
|
|
658
|
+
protected readonly carriers = CARRIERS;
|
|
659
|
+
protected readonly form = new FormGroup({
|
|
660
|
+
warehouse: new FormControl<SelectSelection>(null, Validators.required),
|
|
661
|
+
carrier: new FormControl<SelectSelection>('ups', { nonNullable: true }),
|
|
662
|
+
});
|
|
663
|
+
private readonly warehouse = toSignal(this.form.controls.warehouse.valueChanges, {
|
|
664
|
+
initialValue: this.form.controls.warehouse.value,
|
|
665
|
+
});
|
|
666
|
+
private readonly submitted = signal(false);
|
|
667
|
+
protected readonly missing = computed(() => this.submitted() && this.warehouse() === null);
|
|
668
|
+
protected readonly saved = signal<string | null>(null);
|
|
669
|
+
|
|
670
|
+
protected submit(): void {
|
|
671
|
+
this.submitted.set(true);
|
|
672
|
+
const { warehouse, carrier } = this.form.getRawValue();
|
|
673
|
+
this.saved.set(
|
|
674
|
+
this.form.valid
|
|
675
|
+
? `Ships from ${labelOf(WAREHOUSES, warehouse)} by ${labelOf(CARRIERS, carrier)}.`
|
|
676
|
+
: null,
|
|
677
|
+
);
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
protected clear(): void {
|
|
681
|
+
this.submitted.set(false);
|
|
682
|
+
this.saved.set(null);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
### Composition
|
|
688
|
+
|
|
689
|
+
Defaults provided once for a whole application, a summary the consumer writes as a template, and the instance reached from the template through exportAs.
|
|
690
|
+
|
|
691
|
+
Excerpt — not a complete module
|
|
692
|
+
|
|
693
|
+
```ts
|
|
694
|
+
providers: [provideSelectDefaults({ size: 'sm', variant: 'subtle', width: 'anchor' })];
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
### controlled.ts
|
|
698
|
+
|
|
699
|
+
Example
|
|
700
|
+
|
|
701
|
+
```ts
|
|
702
|
+
import { Component, computed, signal } from '@angular/core';
|
|
703
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
704
|
+
import { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';
|
|
705
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
706
|
+
|
|
707
|
+
const SPEEDS = [
|
|
708
|
+
{ value: 'ground', label: 'Ground', transit: '3–5 business days', price: '$8.40' },
|
|
709
|
+
{ value: 'two-day', label: 'Two-day', transit: '2 business days', price: '$18.90' },
|
|
710
|
+
{ value: 'overnight', label: 'Overnight', transit: 'Next business day', price: '$42.75' },
|
|
711
|
+
];
|
|
712
|
+
|
|
713
|
+
@Component({
|
|
714
|
+
selector: 'app-select-controlled',
|
|
715
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem, SlStack],
|
|
716
|
+
template: `
|
|
717
|
+
<div slStack [gap]="4">
|
|
718
|
+
<div slField>
|
|
719
|
+
<label slFieldLabel>Delivery speed</label>
|
|
720
|
+
<sl-select [items]="speeds" [(value)]="speed">
|
|
721
|
+
@for (option of speeds; track option.value) {
|
|
722
|
+
<sl-select-item [value]="option.value">{{ option.label }}</sl-select-item>
|
|
723
|
+
}
|
|
724
|
+
</sl-select>
|
|
725
|
+
</div>
|
|
726
|
+
<span>Arrives in {{ chosen()?.transit }}. Shipping: {{ chosen()?.price }}</span>
|
|
727
|
+
</div>
|
|
728
|
+
`,
|
|
729
|
+
})
|
|
730
|
+
export class SelectControlled {
|
|
731
|
+
protected readonly speeds = SPEEDS;
|
|
732
|
+
protected readonly speed = signal<SelectSelection>('ground');
|
|
733
|
+
protected readonly chosen = computed(() =>
|
|
734
|
+
SPEEDS.find((option) => option.value === this.speed()),
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
### defaults.ts
|
|
740
|
+
|
|
741
|
+
Example
|
|
742
|
+
|
|
743
|
+
```ts
|
|
744
|
+
import { Component } from '@angular/core';
|
|
745
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
746
|
+
import {
|
|
747
|
+
provideSelectDefaults,
|
|
748
|
+
SlSelect,
|
|
749
|
+
SlSelectItem,
|
|
750
|
+
type SelectOption,
|
|
751
|
+
} from '@slotted/angular/select';
|
|
752
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
753
|
+
|
|
754
|
+
const OWNERS: SelectOption[] = [
|
|
755
|
+
{ value: 'avery', label: 'Avery Collins' },
|
|
756
|
+
{ value: 'kenji', label: 'Kenji Watanabe' },
|
|
757
|
+
{ value: 'lucia', label: 'Lucía Fernández' },
|
|
758
|
+
];
|
|
759
|
+
|
|
760
|
+
const SEGMENTS: SelectOption[] = [
|
|
761
|
+
{ value: 'enterprise', label: 'Enterprise' },
|
|
762
|
+
{ value: 'wholesale', label: 'Wholesale' },
|
|
763
|
+
{ value: 'retail', label: 'Retail' },
|
|
764
|
+
];
|
|
765
|
+
|
|
766
|
+
@Component({
|
|
767
|
+
selector: 'app-select-defaults',
|
|
768
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem, SlStack],
|
|
769
|
+
providers: [provideSelectDefaults({ size: 'sm', variant: 'subtle', clearable: true })],
|
|
770
|
+
template: `
|
|
771
|
+
<div slStack [gap]="4">
|
|
772
|
+
<div slField>
|
|
773
|
+
<label slFieldLabel>Account owner</label>
|
|
774
|
+
<sl-select placeholder="Any owner" value="lucia" [items]="owners">
|
|
775
|
+
@for (owner of owners; track owner.value) {
|
|
776
|
+
<sl-select-item [value]="owner.value">{{ owner.label }}</sl-select-item>
|
|
777
|
+
}
|
|
778
|
+
</sl-select>
|
|
779
|
+
</div>
|
|
780
|
+
<div slField>
|
|
781
|
+
<label slFieldLabel>Segment</label>
|
|
782
|
+
<sl-select placeholder="Any segment" value="wholesale" [items]="segments">
|
|
783
|
+
@for (segment of segments; track segment.value) {
|
|
784
|
+
<sl-select-item [value]="segment.value">{{ segment.label }}</sl-select-item>
|
|
785
|
+
}
|
|
786
|
+
</sl-select>
|
|
787
|
+
</div>
|
|
788
|
+
</div>
|
|
789
|
+
`,
|
|
790
|
+
})
|
|
791
|
+
export class SelectDefaults {
|
|
792
|
+
protected readonly owners = OWNERS;
|
|
793
|
+
protected readonly segments = SEGMENTS;
|
|
794
|
+
}
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
### descriptions.ts
|
|
798
|
+
|
|
799
|
+
Example
|
|
800
|
+
|
|
801
|
+
```ts
|
|
802
|
+
import { Component } from '@angular/core';
|
|
803
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
804
|
+
import type { GlyphName } from '@slotted/angular/icon';
|
|
805
|
+
import { SlSelect, SlSelectItem, type SelectOption } from '@slotted/angular/select';
|
|
806
|
+
|
|
807
|
+
const FORMATS: (SelectOption & { icon: GlyphName; description: string })[] = [
|
|
808
|
+
{
|
|
809
|
+
value: 'csv',
|
|
810
|
+
label: 'CSV',
|
|
811
|
+
icon: 'file-spreadsheet',
|
|
812
|
+
description: 'Opens in Excel and Google Sheets.',
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
value: 'pdf',
|
|
816
|
+
label: 'PDF',
|
|
817
|
+
icon: 'file-text',
|
|
818
|
+
description: 'Paginated, with the company letterhead.',
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
value: 'json',
|
|
822
|
+
label: 'JSON',
|
|
823
|
+
icon: 'file',
|
|
824
|
+
description: 'For an import into another system.',
|
|
825
|
+
},
|
|
826
|
+
];
|
|
827
|
+
|
|
828
|
+
@Component({
|
|
829
|
+
selector: 'app-select-descriptions',
|
|
830
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem],
|
|
831
|
+
template: `
|
|
832
|
+
<div slField>
|
|
833
|
+
<label slFieldLabel>Export format</label>
|
|
834
|
+
<sl-select value="csv" [items]="formats">
|
|
835
|
+
@for (format of formats; track format.value) {
|
|
836
|
+
<sl-select-item
|
|
837
|
+
[value]="format.value"
|
|
838
|
+
[description]="format.description"
|
|
839
|
+
[icon]="format.icon"
|
|
840
|
+
>{{ format.label }}</sl-select-item
|
|
841
|
+
>
|
|
842
|
+
}
|
|
843
|
+
</sl-select>
|
|
844
|
+
</div>
|
|
845
|
+
`,
|
|
846
|
+
})
|
|
847
|
+
export class SelectDescriptions {
|
|
848
|
+
protected readonly formats = FORMATS;
|
|
849
|
+
}
|
|
850
|
+
```
|
|
851
|
+
|
|
852
|
+
### disabled-options.ts
|
|
853
|
+
|
|
854
|
+
Example
|
|
855
|
+
|
|
856
|
+
```ts
|
|
857
|
+
import { Component } from '@angular/core';
|
|
858
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
859
|
+
import { SlSelect, SlSelectItem } from '@slotted/angular/select';
|
|
860
|
+
|
|
861
|
+
const CARRIERS: { value: string; label: string; disabled?: boolean; description?: string }[] = [
|
|
862
|
+
{ value: 'ups', label: 'UPS Ground' },
|
|
863
|
+
{ value: 'fedex', label: 'FedEx Ground' },
|
|
864
|
+
{
|
|
865
|
+
value: 'dhl',
|
|
866
|
+
label: 'DHL Express',
|
|
867
|
+
disabled: true,
|
|
868
|
+
description: 'Account on hold until invoice INV-21462 is paid.',
|
|
869
|
+
},
|
|
870
|
+
{ value: 'usps', label: 'USPS Priority Mail' },
|
|
871
|
+
];
|
|
872
|
+
|
|
873
|
+
@Component({
|
|
874
|
+
selector: 'app-select-disabled-options',
|
|
875
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem],
|
|
876
|
+
template: `
|
|
877
|
+
<div slField>
|
|
878
|
+
<label slFieldLabel>Carrier</label>
|
|
879
|
+
<sl-select placeholder="Choose a carrier">
|
|
880
|
+
@for (carrier of carriers; track carrier.value) {
|
|
881
|
+
<sl-select-item
|
|
882
|
+
[value]="carrier.value"
|
|
883
|
+
[disabled]="carrier.disabled ?? false"
|
|
884
|
+
[description]="carrier.description"
|
|
885
|
+
>{{ carrier.label }}</sl-select-item
|
|
886
|
+
>
|
|
887
|
+
}
|
|
888
|
+
</sl-select>
|
|
889
|
+
</div>
|
|
890
|
+
`,
|
|
891
|
+
})
|
|
892
|
+
export class SelectDisabledOptions {
|
|
893
|
+
protected readonly carriers = CARRIERS;
|
|
894
|
+
}
|
|
895
|
+
```
|
|
896
|
+
|
|
897
|
+
### empty.ts
|
|
898
|
+
|
|
899
|
+
Example
|
|
900
|
+
|
|
901
|
+
```ts
|
|
902
|
+
import { Component } from '@angular/core';
|
|
903
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
904
|
+
import { SlSelect } from '@slotted/angular/select';
|
|
905
|
+
|
|
906
|
+
@Component({
|
|
907
|
+
selector: 'app-select-empty',
|
|
908
|
+
imports: [SlField, SlFieldDescription, SlFieldLabel, SlSelect],
|
|
909
|
+
template: `
|
|
910
|
+
<div slField>
|
|
911
|
+
<label slFieldLabel>Purchase order to receive</label>
|
|
912
|
+
<sl-select
|
|
913
|
+
placeholder="Choose a purchase order"
|
|
914
|
+
[messages]="{ empty: 'No open purchase orders for Kiln & Co.' }"
|
|
915
|
+
></sl-select>
|
|
916
|
+
<span slFieldDescription>Only orders awaiting receipt are listed.</span>
|
|
917
|
+
</div>
|
|
918
|
+
`,
|
|
919
|
+
})
|
|
920
|
+
export class SelectEmpty {}
|
|
921
|
+
```
|
|
922
|
+
|
|
923
|
+
### loading.ts
|
|
924
|
+
|
|
925
|
+
Example
|
|
926
|
+
|
|
927
|
+
```ts
|
|
928
|
+
import { Component, signal } from '@angular/core';
|
|
929
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
930
|
+
import { SlSelect, SlSelectItem, type SelectOption } from '@slotted/angular/select';
|
|
931
|
+
|
|
932
|
+
const SLOTS: SelectOption[] = [
|
|
933
|
+
{ value: 'thu-am', label: 'Thursday, 8:00–12:00' },
|
|
934
|
+
{ value: 'thu-pm', label: 'Thursday, 13:00–17:00' },
|
|
935
|
+
{ value: 'fri-am', label: 'Friday, 8:00–12:00' },
|
|
936
|
+
];
|
|
937
|
+
|
|
938
|
+
/** Stands in for a request to the carrier's pickup API. */
|
|
939
|
+
const fetchSlots = () =>
|
|
940
|
+
new Promise<SelectOption[]>((resolve) => setTimeout(() => resolve(SLOTS), 1500));
|
|
941
|
+
|
|
942
|
+
@Component({
|
|
943
|
+
selector: 'app-select-loading',
|
|
944
|
+
imports: [SlField, SlFieldDescription, SlFieldLabel, SlSelect, SlSelectItem],
|
|
945
|
+
template: `
|
|
946
|
+
<div slField>
|
|
947
|
+
<label slFieldLabel>Pickup slot</label>
|
|
948
|
+
<sl-select
|
|
949
|
+
placeholder="Choose a slot"
|
|
950
|
+
[loading]="loading()"
|
|
951
|
+
[items]="slots()"
|
|
952
|
+
[messages]="{ loading: 'Fetching pickup slots…' }"
|
|
953
|
+
(openChange)="load($event)"
|
|
954
|
+
>
|
|
955
|
+
@for (slot of slots(); track slot.value) {
|
|
956
|
+
<sl-select-item [value]="slot.value">{{ slot.label }}</sl-select-item>
|
|
957
|
+
}
|
|
958
|
+
</sl-select>
|
|
959
|
+
<span slFieldDescription>Slots load from the carrier when the list opens.</span>
|
|
960
|
+
</div>
|
|
961
|
+
`,
|
|
962
|
+
})
|
|
963
|
+
export class SelectLoading {
|
|
964
|
+
protected readonly slots = signal<SelectOption[]>([]);
|
|
965
|
+
protected readonly loading = signal(false);
|
|
966
|
+
private loaded = false;
|
|
967
|
+
|
|
968
|
+
protected async load(open: boolean): Promise<void> {
|
|
969
|
+
if (!open || this.loaded || this.loading()) return;
|
|
970
|
+
this.loading.set(true);
|
|
971
|
+
this.slots.set(await fetchSlots());
|
|
972
|
+
this.loading.set(false);
|
|
973
|
+
this.loaded = true;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
### long-labels.ts
|
|
979
|
+
|
|
980
|
+
Example
|
|
981
|
+
|
|
982
|
+
```ts
|
|
983
|
+
import { Component } from '@angular/core';
|
|
984
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
985
|
+
import { SlSelect, SlSelectItem, type SelectOption } from '@slotted/angular/select';
|
|
986
|
+
|
|
987
|
+
const LISTINGS: SelectOption[] = [
|
|
988
|
+
{
|
|
989
|
+
value: 'mug-sage',
|
|
990
|
+
label: 'Stoneware mug, 12 oz, sage glaze, case of 24, for the autumn wholesale catalogue',
|
|
991
|
+
},
|
|
992
|
+
{ value: 'mug-sku', label: 'SKU-NW-STONEWARE-MUG-12OZ-SAGE-GLAZE-CASE24-WHOLESALE' },
|
|
993
|
+
{ value: 'tumbler', label: 'Glass tumbler, 8 oz' },
|
|
994
|
+
];
|
|
995
|
+
|
|
996
|
+
@Component({
|
|
997
|
+
selector: 'app-select-long-labels',
|
|
998
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem],
|
|
999
|
+
template: `
|
|
1000
|
+
<div slField>
|
|
1001
|
+
<label slFieldLabel>Catalogue listing</label>
|
|
1002
|
+
<sl-select value="mug-sage" [items]="listings">
|
|
1003
|
+
@for (listing of listings; track listing.value) {
|
|
1004
|
+
<sl-select-item [value]="listing.value">{{ listing.label }}</sl-select-item>
|
|
1005
|
+
}
|
|
1006
|
+
</sl-select>
|
|
1007
|
+
</div>
|
|
1008
|
+
`,
|
|
1009
|
+
})
|
|
1010
|
+
export class SelectLongLabels {
|
|
1011
|
+
protected readonly listings = LISTINGS;
|
|
1012
|
+
}
|
|
1013
|
+
```
|
|
1014
|
+
|
|
1015
|
+
### narrow.ts
|
|
1016
|
+
|
|
1017
|
+
Example
|
|
1018
|
+
|
|
1019
|
+
```ts
|
|
1020
|
+
import { Component, signal } from '@angular/core';
|
|
1021
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
1022
|
+
import {
|
|
1023
|
+
SlSelect,
|
|
1024
|
+
SlSelectItem,
|
|
1025
|
+
type SelectOption,
|
|
1026
|
+
type SelectSelection,
|
|
1027
|
+
} from '@slotted/angular/select';
|
|
1028
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
1029
|
+
|
|
1030
|
+
const STATUSES: SelectOption[] = [
|
|
1031
|
+
{ value: 'open', label: 'Open' },
|
|
1032
|
+
{ value: 'on-hold', label: 'On hold' },
|
|
1033
|
+
{ value: 'shipped', label: 'Shipped' },
|
|
1034
|
+
];
|
|
1035
|
+
|
|
1036
|
+
const CHANNELS: SelectOption[] = [
|
|
1037
|
+
{ value: 'web', label: 'Web store' },
|
|
1038
|
+
{ value: 'marketplace', label: 'Marketplace' },
|
|
1039
|
+
{ value: 'wholesale', label: 'Wholesale' },
|
|
1040
|
+
{ value: 'phone', label: 'Phone orders' },
|
|
1041
|
+
];
|
|
1042
|
+
|
|
1043
|
+
const WAREHOUSES: SelectOption[] = [
|
|
1044
|
+
{ value: 'RNO', label: 'Reno, NV' },
|
|
1045
|
+
{ value: 'CMH', label: 'Columbus, OH' },
|
|
1046
|
+
{ value: 'SAV', label: 'Savannah, GA' },
|
|
1047
|
+
];
|
|
1048
|
+
|
|
1049
|
+
@Component({
|
|
1050
|
+
selector: 'app-select-narrow',
|
|
1051
|
+
imports: [SlField, SlFieldLabel, SlSelect, SlSelectItem, SlStack],
|
|
1052
|
+
template: `
|
|
1053
|
+
<div slStack [gap]="4" style="inline-size: 7rem">
|
|
1054
|
+
<div slField>
|
|
1055
|
+
<label slFieldLabel>Status</label>
|
|
1056
|
+
<sl-select size="sm" value="on-hold" [items]="statuses">
|
|
1057
|
+
@for (status of statuses; track status.value) {
|
|
1058
|
+
<sl-select-item [value]="status.value">{{ status.label }}</sl-select-item>
|
|
1059
|
+
}
|
|
1060
|
+
</sl-select>
|
|
1061
|
+
</div>
|
|
1062
|
+
<div slField>
|
|
1063
|
+
<label slFieldLabel>Channels</label>
|
|
1064
|
+
<sl-select size="sm" multiple [items]="channels" [(value)]="chosenChannels">
|
|
1065
|
+
@for (channel of channels; track channel.value) {
|
|
1066
|
+
<sl-select-item [value]="channel.value">{{ channel.label }}</sl-select-item>
|
|
1067
|
+
}
|
|
1068
|
+
</sl-select>
|
|
1069
|
+
</div>
|
|
1070
|
+
<div slField>
|
|
1071
|
+
<label slFieldLabel>Warehouse</label>
|
|
1072
|
+
<sl-select size="sm" width="content" value="CMH" [items]="warehouses">
|
|
1073
|
+
@for (warehouse of warehouses; track warehouse.value) {
|
|
1074
|
+
<sl-select-item [value]="warehouse.value">{{ warehouse.label }}</sl-select-item>
|
|
1075
|
+
}
|
|
1076
|
+
</sl-select>
|
|
1077
|
+
</div>
|
|
1078
|
+
</div>
|
|
1079
|
+
`,
|
|
1080
|
+
})
|
|
1081
|
+
export class SelectNarrow {
|
|
1082
|
+
protected readonly statuses = STATUSES;
|
|
1083
|
+
protected readonly channels = CHANNELS;
|
|
1084
|
+
protected readonly warehouses = WAREHOUSES;
|
|
1085
|
+
protected readonly chosenChannels = signal<SelectSelection>(['web', 'marketplace', 'wholesale']);
|
|
1086
|
+
}
|
|
1087
|
+
```
|
|
1088
|
+
|
|
1089
|
+
### status-filter.ts
|
|
1090
|
+
|
|
1091
|
+
Example
|
|
1092
|
+
|
|
1093
|
+
```ts
|
|
1094
|
+
import { Component, computed, signal } from '@angular/core';
|
|
1095
|
+
import type { GlyphName } from '@slotted/angular/icon';
|
|
1096
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
1097
|
+
import {
|
|
1098
|
+
SlSelect,
|
|
1099
|
+
SlSelectItem,
|
|
1100
|
+
SlSelectSeparator,
|
|
1101
|
+
type SelectOption,
|
|
1102
|
+
type SelectSelection,
|
|
1103
|
+
} from '@slotted/angular/select';
|
|
1104
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
1105
|
+
import {
|
|
1106
|
+
SlTable,
|
|
1107
|
+
SlTableBody,
|
|
1108
|
+
SlTableCell,
|
|
1109
|
+
SlTableColumnHeader,
|
|
1110
|
+
SlTableContent,
|
|
1111
|
+
SlTableHead,
|
|
1112
|
+
SlTableRow,
|
|
1113
|
+
SlTableRowHeader,
|
|
1114
|
+
} from '@slotted/angular/table';
|
|
1115
|
+
import { SlText } from '@slotted/angular/typography';
|
|
1116
|
+
|
|
1117
|
+
const ORDERS = [
|
|
1118
|
+
{ id: 'SO-10482', customer: 'Harbor & Pine', status: 'open', total: '$1,240.00' },
|
|
1119
|
+
{ id: 'SO-10483', customer: 'Brightline Studio', status: 'on-hold', total: '$318.50' },
|
|
1120
|
+
{ id: 'SO-10484', customer: 'Northgate Labs', status: 'shipped', total: '$2,906.10' },
|
|
1121
|
+
{ id: 'SO-10485', customer: 'Verde Kitchen', status: 'delayed', total: '$86.00' },
|
|
1122
|
+
{ id: 'SO-10486', customer: 'Quill & Co.', status: 'shipped', total: '$540.25' },
|
|
1123
|
+
{ id: 'SO-10487', customer: 'Atlas Freight', status: 'open', total: '$1,912.00' },
|
|
1124
|
+
];
|
|
1125
|
+
|
|
1126
|
+
const STATUSES: (SelectOption & { icon: GlyphName })[] = [
|
|
1127
|
+
{ value: 'open', label: 'Open', icon: 'circle' },
|
|
1128
|
+
{ value: 'on-hold', label: 'On hold', icon: 'clock' },
|
|
1129
|
+
{ value: 'delayed', label: 'Delayed', icon: 'triangle-alert' },
|
|
1130
|
+
{ value: 'shipped', label: 'Shipped', icon: 'circle-check' },
|
|
1131
|
+
];
|
|
1132
|
+
|
|
1133
|
+
const ALL: SelectOption = { value: 'all', label: 'All statuses' };
|
|
1134
|
+
|
|
1135
|
+
@Component({
|
|
1136
|
+
selector: 'app-select-status-filter',
|
|
1137
|
+
imports: [
|
|
1138
|
+
SlInline,
|
|
1139
|
+
SlSelect,
|
|
1140
|
+
SlSelectItem,
|
|
1141
|
+
SlSelectSeparator,
|
|
1142
|
+
SlStack,
|
|
1143
|
+
SlTable,
|
|
1144
|
+
SlTableBody,
|
|
1145
|
+
SlTableCell,
|
|
1146
|
+
SlTableColumnHeader,
|
|
1147
|
+
SlTableContent,
|
|
1148
|
+
SlTableHead,
|
|
1149
|
+
SlTableRow,
|
|
1150
|
+
SlTableRowHeader,
|
|
1151
|
+
SlText,
|
|
1152
|
+
],
|
|
1153
|
+
template: `
|
|
1154
|
+
<div slStack [gap]="3">
|
|
1155
|
+
<div slInline [gap]="3" justify="between" align="center">
|
|
1156
|
+
<span slText size="sm" tone="muted">{{ rows().length }} of {{ orders.length }} orders</span>
|
|
1157
|
+
<sl-select
|
|
1158
|
+
aria-label="Filter by status"
|
|
1159
|
+
size="sm"
|
|
1160
|
+
align="end"
|
|
1161
|
+
[fullWidth]="false"
|
|
1162
|
+
[items]="options"
|
|
1163
|
+
[(value)]="status"
|
|
1164
|
+
>
|
|
1165
|
+
<sl-select-item [value]="all.value">{{ all.label }}</sl-select-item>
|
|
1166
|
+
<sl-select-separator />
|
|
1167
|
+
@for (option of statuses; track option.value) {
|
|
1168
|
+
<sl-select-item [value]="option.value" [icon]="option.icon">{{
|
|
1169
|
+
option.label
|
|
1170
|
+
}}</sl-select-item>
|
|
1171
|
+
}
|
|
1172
|
+
</sl-select>
|
|
1173
|
+
</div>
|
|
1174
|
+
<div slTable [columns]="4">
|
|
1175
|
+
<div slTableContent aria-label="Orders">
|
|
1176
|
+
<thead slTableHead>
|
|
1177
|
+
<tr slTableRow>
|
|
1178
|
+
<th slTableColumnHeader>Order</th>
|
|
1179
|
+
<th slTableColumnHeader>Customer</th>
|
|
1180
|
+
<th slTableColumnHeader>Status</th>
|
|
1181
|
+
<th slTableColumnHeader numeric>Total</th>
|
|
1182
|
+
</tr>
|
|
1183
|
+
</thead>
|
|
1184
|
+
<tbody slTableBody>
|
|
1185
|
+
@for (order of rows(); track order.id) {
|
|
1186
|
+
<tr slTableRow [value]="order.id">
|
|
1187
|
+
<th slTableRowHeader>{{ order.id }}</th>
|
|
1188
|
+
<td slTableCell>{{ order.customer }}</td>
|
|
1189
|
+
<td slTableCell>{{ labelOf(order.status) }}</td>
|
|
1190
|
+
<td slTableCell numeric>{{ order.total }}</td>
|
|
1191
|
+
</tr>
|
|
1192
|
+
}
|
|
1193
|
+
</tbody>
|
|
1194
|
+
</div>
|
|
1195
|
+
</div>
|
|
1196
|
+
</div>
|
|
1197
|
+
`,
|
|
1198
|
+
})
|
|
1199
|
+
export class SelectStatusFilter {
|
|
1200
|
+
protected readonly orders = ORDERS;
|
|
1201
|
+
protected readonly statuses = STATUSES;
|
|
1202
|
+
protected readonly all = ALL;
|
|
1203
|
+
protected readonly options = [ALL, ...STATUSES];
|
|
1204
|
+
protected readonly status = signal<SelectSelection>('all');
|
|
1205
|
+
protected readonly rows = computed(() => {
|
|
1206
|
+
const status = this.status();
|
|
1207
|
+
return status === 'all' ? ORDERS : ORDERS.filter((order) => order.status === status);
|
|
1208
|
+
});
|
|
1209
|
+
|
|
1210
|
+
protected labelOf(status: string): string | undefined {
|
|
1211
|
+
return STATUSES.find((option) => option.value === status)?.label;
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
```
|