@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,1651 @@
|
|
|
1
|
+
<!-- index: ./index.md -->
|
|
2
|
+
# menu
|
|
3
|
+
|
|
4
|
+
`data-ui="menu"` · List of actions opened from a trigger.
|
|
5
|
+
|
|
6
|
+
## Examples
|
|
7
|
+
|
|
8
|
+
### Playground
|
|
9
|
+
|
|
10
|
+
One menu with every input on it, driven by the controls under the canvas. Change side and align and watch the surface move around the control that opened it.
|
|
11
|
+
|
|
12
|
+
Excerpt — not a complete module
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<button slButton variant="outline" [slMenuTriggerFor]="document">Document</button>
|
|
16
|
+
<sl-menu #document>
|
|
17
|
+
<button slMenuItem shortcut="Mod+D">Duplicate</button>
|
|
18
|
+
<button slMenuItem [disabled]="true">Publish</button>
|
|
19
|
+
<hr slMenuSeparator />
|
|
20
|
+
<button slMenuItem tone="danger">Delete…</button>
|
|
21
|
+
</sl-menu>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Commands
|
|
25
|
+
|
|
26
|
+
The default: an item runs and the menu closes. The second asks to stay open, which is what a command a reader repeats needs.
|
|
27
|
+
|
|
28
|
+
Excerpt — not a complete module
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<button slMenuItem (select)="duplicate($event.reason)">Duplicate</button>
|
|
32
|
+
<button slMenuItem [closeOnSelect]="false" (select)="zoomIn()">Zoom in</button>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Icons
|
|
36
|
+
|
|
37
|
+
Two items carry a mark and two do not, and every label still starts on the same line: the column exists for the menu rather than for the item.
|
|
38
|
+
|
|
39
|
+
Example
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { Component } from '@angular/core';
|
|
43
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
44
|
+
import { SlGlyph, SlIcon } from '@slotted/angular/icon';
|
|
45
|
+
import {
|
|
46
|
+
SlMenu,
|
|
47
|
+
SlMenuItem,
|
|
48
|
+
SlMenuItemIcon,
|
|
49
|
+
SlMenuSeparator,
|
|
50
|
+
SlMenuTrigger,
|
|
51
|
+
} from '@slotted/angular/menu';
|
|
52
|
+
|
|
53
|
+
@Component({
|
|
54
|
+
selector: 'app-menu-icons',
|
|
55
|
+
imports: [
|
|
56
|
+
SlButton,
|
|
57
|
+
SlButtonEnd,
|
|
58
|
+
SlGlyph,
|
|
59
|
+
SlIcon,
|
|
60
|
+
SlMenu,
|
|
61
|
+
SlMenuItem,
|
|
62
|
+
SlMenuItemIcon,
|
|
63
|
+
SlMenuSeparator,
|
|
64
|
+
SlMenuTrigger,
|
|
65
|
+
],
|
|
66
|
+
template: `
|
|
67
|
+
<button slButton variant="outline" [slMenuTriggerFor]="invoice">
|
|
68
|
+
Invoice INV-2041
|
|
69
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
70
|
+
</button>
|
|
71
|
+
<sl-menu #invoice>
|
|
72
|
+
<button slMenuItem shortcut="Mod+D">
|
|
73
|
+
<span slMenuItemIcon
|
|
74
|
+
><span slIcon><svg slGlyph name="copy"></svg></span
|
|
75
|
+
></span>
|
|
76
|
+
Duplicate
|
|
77
|
+
</button>
|
|
78
|
+
<button slMenuItem shortcut="Mod+Enter">
|
|
79
|
+
<span slMenuItemIcon
|
|
80
|
+
><span slIcon><svg slGlyph name="external"></svg></span
|
|
81
|
+
></span>
|
|
82
|
+
Open in new tab
|
|
83
|
+
</button>
|
|
84
|
+
<button slMenuItem shortcut="Mod+P">
|
|
85
|
+
<span slMenuItemIcon
|
|
86
|
+
><span slIcon><svg slGlyph name="file-text"></svg></span
|
|
87
|
+
></span>
|
|
88
|
+
Print
|
|
89
|
+
</button>
|
|
90
|
+
<button slMenuItem>
|
|
91
|
+
<span slMenuItemIcon
|
|
92
|
+
><span slIcon><svg slGlyph name="pin"></svg></span
|
|
93
|
+
></span>
|
|
94
|
+
Pin to dashboard
|
|
95
|
+
</button>
|
|
96
|
+
<button slMenuItem shortcut="Shift+Mod+R">Rename…</button>
|
|
97
|
+
<hr slMenuSeparator />
|
|
98
|
+
<button slMenuItem shortcut="Mod+Backspace" tone="danger">
|
|
99
|
+
<span slMenuItemIcon
|
|
100
|
+
><span slIcon><svg slGlyph name="trash"></svg></span
|
|
101
|
+
></span>
|
|
102
|
+
Delete draft
|
|
103
|
+
</button>
|
|
104
|
+
</sl-menu>
|
|
105
|
+
`,
|
|
106
|
+
})
|
|
107
|
+
export class MenuIcons {}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Shortcuts
|
|
111
|
+
|
|
112
|
+
Written once as Mod+S and printed as ⌘S on a Mac and Ctrl+S elsewhere. The legend is hidden from a screen reader, which hears aria-keyshortcuts instead.
|
|
113
|
+
|
|
114
|
+
Excerpt — not a complete module
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<button slMenuItem shortcut="Mod+S">Save</button>
|
|
118
|
+
<button slMenuItem shortcut="Shift+Mod+S">Save as…</button>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Checkbox items
|
|
122
|
+
|
|
123
|
+
Each item holds a state of its own and the menu stays open, so a reader can turn three things on without opening it three times. Space toggles without closing.
|
|
124
|
+
|
|
125
|
+
Example
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
import { Component, computed, signal } from '@angular/core';
|
|
129
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
130
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
131
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
132
|
+
import { SlMenu, SlMenuItem, SlMenuTrigger } from '@slotted/angular/menu';
|
|
133
|
+
import { SlText } from '@slotted/angular/typography';
|
|
134
|
+
|
|
135
|
+
@Component({
|
|
136
|
+
selector: 'app-menu-checkbox-items',
|
|
137
|
+
imports: [SlButton, SlButtonEnd, SlGlyph, SlInline, SlMenu, SlMenuItem, SlMenuTrigger, SlText],
|
|
138
|
+
template: `
|
|
139
|
+
<div slInline align="center" [gap]="3">
|
|
140
|
+
<button slButton variant="outline" [slMenuTriggerFor]="show">
|
|
141
|
+
Show
|
|
142
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
143
|
+
</button>
|
|
144
|
+
<sl-menu #show>
|
|
145
|
+
<button slMenuCheckboxItem [(checked)]="archived">Archived orders</button>
|
|
146
|
+
<button slMenuCheckboxItem [(checked)]="test">Test orders</button>
|
|
147
|
+
<button slMenuCheckboxItem [(checked)]="cancelled">Cancelled orders</button>
|
|
148
|
+
</sl-menu>
|
|
149
|
+
<span slText size="sm" tone="muted">{{ summary() }}</span>
|
|
150
|
+
</div>
|
|
151
|
+
`,
|
|
152
|
+
})
|
|
153
|
+
export class MenuCheckboxItems {
|
|
154
|
+
protected readonly archived = signal(false);
|
|
155
|
+
protected readonly test = signal(false);
|
|
156
|
+
protected readonly cancelled = signal(true);
|
|
157
|
+
protected readonly summary = computed(() => {
|
|
158
|
+
const shown = [
|
|
159
|
+
this.archived() && 'archived',
|
|
160
|
+
this.test() && 'test',
|
|
161
|
+
this.cancelled() && 'cancelled',
|
|
162
|
+
].filter(Boolean);
|
|
163
|
+
return shown.length === 0 ? 'Open orders only' : `Including ${shown.join(', ')}`;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Radio items
|
|
169
|
+
|
|
170
|
+
One value across the group, chosen among the items inside it. The mark sits in the same column an icon would, so the labels stay in line.
|
|
171
|
+
|
|
172
|
+
Example
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
import { Component, computed, signal } from '@angular/core';
|
|
176
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
177
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
178
|
+
import { SlMenu, SlMenuItem, SlMenuRadioGroup, SlMenuTrigger } from '@slotted/angular/menu';
|
|
179
|
+
|
|
180
|
+
const GROUPINGS = [
|
|
181
|
+
{ value: 'none', label: 'No grouping' },
|
|
182
|
+
{ value: 'status', label: 'Status' },
|
|
183
|
+
{ value: 'customer', label: 'Customer' },
|
|
184
|
+
{ value: 'warehouse', label: 'Warehouse' },
|
|
185
|
+
];
|
|
186
|
+
|
|
187
|
+
@Component({
|
|
188
|
+
selector: 'app-menu-radio-items',
|
|
189
|
+
imports: [SlButton, SlButtonEnd, SlGlyph, SlMenu, SlMenuItem, SlMenuRadioGroup, SlMenuTrigger],
|
|
190
|
+
template: `
|
|
191
|
+
<button slButton variant="outline" [slMenuTriggerFor]="group">
|
|
192
|
+
Group by: {{ current() }}
|
|
193
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
194
|
+
</button>
|
|
195
|
+
<sl-menu #group>
|
|
196
|
+
<sl-menu-radio-group aria-label="Group orders by" [(value)]="grouping">
|
|
197
|
+
@for (option of groupings; track option.value) {
|
|
198
|
+
<button slMenuRadioItem [value]="option.value">{{ option.label }}</button>
|
|
199
|
+
}
|
|
200
|
+
</sl-menu-radio-group>
|
|
201
|
+
</sl-menu>
|
|
202
|
+
`,
|
|
203
|
+
})
|
|
204
|
+
export class MenuRadioItems {
|
|
205
|
+
protected readonly groupings = GROUPINGS;
|
|
206
|
+
protected readonly grouping = signal<string | undefined>('status');
|
|
207
|
+
protected readonly current = computed(
|
|
208
|
+
() => GROUPINGS.find((option) => option.value === this.grouping())?.label,
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Groups
|
|
214
|
+
|
|
215
|
+
A label names the run under it and the group points at it, so a reader hears "Sort by" before the options rather than a heading belonging to nothing.
|
|
216
|
+
|
|
217
|
+
Example
|
|
218
|
+
|
|
219
|
+
```ts
|
|
220
|
+
import { Component } from '@angular/core';
|
|
221
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
222
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
223
|
+
import {
|
|
224
|
+
SlMenu,
|
|
225
|
+
SlMenuGroup,
|
|
226
|
+
SlMenuItem,
|
|
227
|
+
SlMenuSeparator,
|
|
228
|
+
SlMenuTrigger,
|
|
229
|
+
} from '@slotted/angular/menu';
|
|
230
|
+
|
|
231
|
+
@Component({
|
|
232
|
+
selector: 'app-menu-groups',
|
|
233
|
+
imports: [
|
|
234
|
+
SlButton,
|
|
235
|
+
SlButtonEnd,
|
|
236
|
+
SlGlyph,
|
|
237
|
+
SlMenu,
|
|
238
|
+
SlMenuGroup,
|
|
239
|
+
SlMenuItem,
|
|
240
|
+
SlMenuSeparator,
|
|
241
|
+
SlMenuTrigger,
|
|
242
|
+
],
|
|
243
|
+
template: `
|
|
244
|
+
<button slButton variant="outline" [slMenuTriggerFor]="order">
|
|
245
|
+
SO-10482
|
|
246
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
247
|
+
</button>
|
|
248
|
+
<sl-menu #order>
|
|
249
|
+
<sl-menu-group label="Fulfilment">
|
|
250
|
+
<button slMenuItem>Mark as packed</button>
|
|
251
|
+
<button slMenuItem>Mark as shipped</button>
|
|
252
|
+
<button slMenuItem>Print packing slip</button>
|
|
253
|
+
</sl-menu-group>
|
|
254
|
+
<hr slMenuSeparator />
|
|
255
|
+
<sl-menu-group label="Billing">
|
|
256
|
+
<button slMenuItem>Send invoice</button>
|
|
257
|
+
<button slMenuItem>Record payment…</button>
|
|
258
|
+
</sl-menu-group>
|
|
259
|
+
<hr slMenuSeparator />
|
|
260
|
+
<sl-menu-group label="Customer">
|
|
261
|
+
<button slMenuItem>Open Northwind Traders</button>
|
|
262
|
+
<button slMenuItem>Email the buyer</button>
|
|
263
|
+
</sl-menu-group>
|
|
264
|
+
</sl-menu>
|
|
265
|
+
`,
|
|
266
|
+
})
|
|
267
|
+
export class MenuGroups {}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Submenus
|
|
271
|
+
|
|
272
|
+
A menu nested in a menu. Hover opens it after a pause, the inline-end arrow opens it from the keyboard, and the pointer may cut diagonally across the items between.
|
|
273
|
+
|
|
274
|
+
Excerpt — not a complete module
|
|
275
|
+
|
|
276
|
+
```html
|
|
277
|
+
<sl-menu #share>
|
|
278
|
+
<button slMenuItem>Copy link</button>
|
|
279
|
+
<button slMenuItem [slMenuTriggerFor]="sendTo">Send to</button>
|
|
280
|
+
<sl-menu #sendTo>
|
|
281
|
+
<button slMenuItem>Slack</button>
|
|
282
|
+
</sl-menu>
|
|
283
|
+
</sl-menu>
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Submenu open
|
|
287
|
+
|
|
288
|
+
The submenu as it lands: its panel one gap out from the parent surface, not against the item, and its first item level with the item that opened it. Every other scene keeps its submenu closed until it is hovered or the inline-end arrow asks for it.
|
|
289
|
+
|
|
290
|
+
Excerpt — not a complete module
|
|
291
|
+
|
|
292
|
+
```html
|
|
293
|
+
<sl-menu #sendTo [open]="true">
|
|
294
|
+
<button slMenuItem>Slack</button>
|
|
295
|
+
</sl-menu>
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Header
|
|
299
|
+
|
|
300
|
+
An account menu opens with who it belongs to. The avatar starts at the icons' edge, the arrows begin at the first command, and a reader hears the name and the address as the surface's description.
|
|
301
|
+
|
|
302
|
+
Excerpt — not a complete module
|
|
303
|
+
|
|
304
|
+
```html
|
|
305
|
+
<sl-menu #account>
|
|
306
|
+
<div slMenuHeader>
|
|
307
|
+
<span slAvatar name="Ada Lovelace" size="md" decorative></span>
|
|
308
|
+
<span data-part="label">Ada Lovelace</span>
|
|
309
|
+
<span slMenuItemDescription>ada@analytical.engine</span>
|
|
310
|
+
</div>
|
|
311
|
+
<hr slMenuSeparator />
|
|
312
|
+
<button slMenuItem>Profile</button>
|
|
313
|
+
<button slMenuItem tone="danger">Sign out</button>
|
|
314
|
+
</sl-menu>
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Meta
|
|
318
|
+
|
|
319
|
+
Counts and the value a submenu holds, in a column of their own: the numbers end on one edge, the shortcuts keep theirs, and a submenu trigger shows its current value before the chevron.
|
|
320
|
+
|
|
321
|
+
Example
|
|
322
|
+
|
|
323
|
+
```ts
|
|
324
|
+
import { Component } from '@angular/core';
|
|
325
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
326
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
327
|
+
import {
|
|
328
|
+
SlMenu,
|
|
329
|
+
SlMenuItem,
|
|
330
|
+
SlMenuItemMeta,
|
|
331
|
+
SlMenuSeparator,
|
|
332
|
+
SlMenuTrigger,
|
|
333
|
+
} from '@slotted/angular/menu';
|
|
334
|
+
|
|
335
|
+
const VIEWS = [
|
|
336
|
+
{ label: 'Awaiting payment', count: '18' },
|
|
337
|
+
{ label: 'Ready to ship', count: '42' },
|
|
338
|
+
{ label: 'On hold', count: '3' },
|
|
339
|
+
{ label: 'Returns', count: '7' },
|
|
340
|
+
];
|
|
341
|
+
|
|
342
|
+
@Component({
|
|
343
|
+
selector: 'app-menu-meta',
|
|
344
|
+
imports: [
|
|
345
|
+
SlButton,
|
|
346
|
+
SlButtonEnd,
|
|
347
|
+
SlGlyph,
|
|
348
|
+
SlMenu,
|
|
349
|
+
SlMenuItem,
|
|
350
|
+
SlMenuItemMeta,
|
|
351
|
+
SlMenuSeparator,
|
|
352
|
+
SlMenuTrigger,
|
|
353
|
+
],
|
|
354
|
+
template: `
|
|
355
|
+
<button slButton variant="outline" [slMenuTriggerFor]="viewMenu">
|
|
356
|
+
All orders
|
|
357
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
358
|
+
</button>
|
|
359
|
+
<sl-menu #viewMenu>
|
|
360
|
+
<button slMenuItem>All orders <span slMenuItemMeta>1,284</span></button>
|
|
361
|
+
<hr slMenuSeparator />
|
|
362
|
+
@for (view of views; track view.label) {
|
|
363
|
+
<button slMenuItem>
|
|
364
|
+
{{ view.label }} <span slMenuItemMeta>{{ view.count }}</span>
|
|
365
|
+
</button>
|
|
366
|
+
}
|
|
367
|
+
</sl-menu>
|
|
368
|
+
`,
|
|
369
|
+
})
|
|
370
|
+
export class MenuMeta {
|
|
371
|
+
protected readonly views = VIEWS;
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### Tone
|
|
376
|
+
|
|
377
|
+
A destructive command reads as destructive before it is read at all: the tone paints the label, the mark and the highlight together, in all three schemes.
|
|
378
|
+
|
|
379
|
+
Excerpt — not a complete module
|
|
380
|
+
|
|
381
|
+
```html
|
|
382
|
+
<button slMenuItem tone="danger" (select)="remove()">
|
|
383
|
+
Delete document
|
|
384
|
+
<span slMenuItemDescription>This cannot be undone.</span>
|
|
385
|
+
</button>
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### Placement
|
|
389
|
+
|
|
390
|
+
The surface hangs from the start edge of its control by default, and flips or slides rather than leaving the screen. Both inline values mirror in a right-to-left document.
|
|
391
|
+
|
|
392
|
+
Example
|
|
393
|
+
|
|
394
|
+
```ts
|
|
395
|
+
import { Component } from '@angular/core';
|
|
396
|
+
import { SlButton } from '@slotted/angular/button';
|
|
397
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
398
|
+
import {
|
|
399
|
+
SlMenu,
|
|
400
|
+
SlMenuItem,
|
|
401
|
+
SlMenuTrigger,
|
|
402
|
+
type MenuAlign,
|
|
403
|
+
type MenuSide,
|
|
404
|
+
} from '@slotted/angular/menu';
|
|
405
|
+
|
|
406
|
+
const PLACEMENTS: { label: string; side: MenuSide; align: MenuAlign }[] = [
|
|
407
|
+
{ label: 'Bottom, start', side: 'bottom', align: 'start' },
|
|
408
|
+
{ label: 'Bottom, end', side: 'bottom', align: 'end' },
|
|
409
|
+
{ label: 'Top, start', side: 'top', align: 'start' },
|
|
410
|
+
{ label: 'Inline end', side: 'inline-end', align: 'start' },
|
|
411
|
+
];
|
|
412
|
+
|
|
413
|
+
@Component({
|
|
414
|
+
selector: 'app-menu-placement',
|
|
415
|
+
imports: [SlButton, SlInline, SlMenu, SlMenuItem, SlMenuTrigger],
|
|
416
|
+
template: `
|
|
417
|
+
<div slInline align="center" wrap="wrap" [gap]="3">
|
|
418
|
+
@for (placement of placements; track placement.label) {
|
|
419
|
+
<button slButton variant="outline" [slMenuTriggerFor]="menu">{{ placement.label }}</button>
|
|
420
|
+
<sl-menu #menu [align]="placement.align" [side]="placement.side">
|
|
421
|
+
<button slMenuItem>Rename…</button>
|
|
422
|
+
<button slMenuItem>Duplicate</button>
|
|
423
|
+
<button slMenuItem>Archive</button>
|
|
424
|
+
</sl-menu>
|
|
425
|
+
}
|
|
426
|
+
</div>
|
|
427
|
+
`,
|
|
428
|
+
})
|
|
429
|
+
export class MenuPlacement {
|
|
430
|
+
protected readonly placements = PLACEMENTS;
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### A menu taller than the screen
|
|
435
|
+
|
|
436
|
+
The surface is bounded by the room the positioner reports and scrolls inside it, so thirty commands never run off the bottom of the window.
|
|
437
|
+
|
|
438
|
+
Excerpt — not a complete module
|
|
439
|
+
|
|
440
|
+
```html
|
|
441
|
+
<sl-menu #moveTo aria-label="Move to">
|
|
442
|
+
@for (folder of folders; track folder) {
|
|
443
|
+
<button slMenuItem>{{ folder }}</button>
|
|
444
|
+
}
|
|
445
|
+
</sl-menu>
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### States
|
|
449
|
+
|
|
450
|
+
Disabled, checked, the parent item while its submenu is open, and the surface waiting for its items. A disabled item still takes focus and still runs nothing.
|
|
451
|
+
|
|
452
|
+
Excerpt — not a complete module
|
|
453
|
+
|
|
454
|
+
```html
|
|
455
|
+
<sl-menu #labels [loading]="pending()">
|
|
456
|
+
<button slMenuItem [disabled]="true">Publish</button>
|
|
457
|
+
<button slMenuCheckboxItem [checked]="true">Show comments</button>
|
|
458
|
+
<div slMenuEmpty>Loading labels…</div>
|
|
459
|
+
</sl-menu>
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### Keyboard
|
|
463
|
+
|
|
464
|
+
Arrows move and wrap, Home and End reach the ends, typing jumps to a command by name, Escape closes one surface and Tab closes them all and moves on down the page.
|
|
465
|
+
|
|
466
|
+
Example
|
|
467
|
+
|
|
468
|
+
```ts
|
|
469
|
+
import { Component, signal } from '@angular/core';
|
|
470
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
471
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
472
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
473
|
+
import {
|
|
474
|
+
SlMenu,
|
|
475
|
+
SlMenuItem,
|
|
476
|
+
SlMenuSeparator,
|
|
477
|
+
SlMenuTrigger,
|
|
478
|
+
type MenuSelectEvent,
|
|
479
|
+
} from '@slotted/angular/menu';
|
|
480
|
+
import { SlText } from '@slotted/angular/typography';
|
|
481
|
+
|
|
482
|
+
const FORMATS = ['CSV', 'PDF', 'Excel'];
|
|
483
|
+
|
|
484
|
+
@Component({
|
|
485
|
+
selector: 'app-menu-keyboard',
|
|
486
|
+
imports: [
|
|
487
|
+
SlButton,
|
|
488
|
+
SlButtonEnd,
|
|
489
|
+
SlGlyph,
|
|
490
|
+
SlInline,
|
|
491
|
+
SlMenu,
|
|
492
|
+
SlMenuItem,
|
|
493
|
+
SlMenuSeparator,
|
|
494
|
+
SlMenuTrigger,
|
|
495
|
+
SlText,
|
|
496
|
+
],
|
|
497
|
+
template: `
|
|
498
|
+
<div slInline align="center" wrap="wrap" [gap]="3">
|
|
499
|
+
<button slButton variant="outline" [slMenuTriggerFor]="order">
|
|
500
|
+
Order
|
|
501
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
502
|
+
</button>
|
|
503
|
+
<sl-menu #order>
|
|
504
|
+
<button slMenuItem shortcut="Mod+E" (select)="ran('Edit order', $event)">Edit order</button>
|
|
505
|
+
<button slMenuItem shortcut="Mod+D" (select)="ran('Duplicate', $event)">Duplicate</button>
|
|
506
|
+
<button slMenuItem [slMenuTriggerFor]="exportAs">Export as</button>
|
|
507
|
+
<sl-menu #exportAs>
|
|
508
|
+
@for (format of formats; track format) {
|
|
509
|
+
<button slMenuItem (select)="ran('Export as ' + format, $event)">{{ format }}</button>
|
|
510
|
+
}
|
|
511
|
+
</sl-menu>
|
|
512
|
+
<hr slMenuSeparator />
|
|
513
|
+
<button slMenuItem (select)="ran('Archive', $event)">Archive</button>
|
|
514
|
+
</sl-menu>
|
|
515
|
+
<span slText size="sm" tone="muted">{{ last() }}</span>
|
|
516
|
+
</div>
|
|
517
|
+
`,
|
|
518
|
+
})
|
|
519
|
+
export class MenuKeyboard {
|
|
520
|
+
protected readonly formats = FORMATS;
|
|
521
|
+
protected readonly last = signal('Focus Order, then press ArrowDown.');
|
|
522
|
+
|
|
523
|
+
protected ran(command: string, event: MenuSelectEvent): void {
|
|
524
|
+
this.last.set(`${command}, by ${event.reason}`);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### In context
|
|
530
|
+
|
|
531
|
+
A row of actions in a table: the trigger is the consumer's own icon button, the menu holds the row's commands, and provideMenuDefaults sets the side once.
|
|
532
|
+
|
|
533
|
+
Excerpt — not a complete module
|
|
534
|
+
|
|
535
|
+
```html
|
|
536
|
+
<button slButton variant="ghost" aria-label="Row actions" [slMenuTriggerFor]="rowActions">⋯</button>
|
|
537
|
+
<sl-menu #rowActions>
|
|
538
|
+
<button slMenuItem>Open</button>
|
|
539
|
+
</sl-menu>
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
### account-menu.ts
|
|
543
|
+
|
|
544
|
+
Example
|
|
545
|
+
|
|
546
|
+
```ts
|
|
547
|
+
import { Component, computed, signal } from '@angular/core';
|
|
548
|
+
import { SlAvatar } from '@slotted/angular/avatar';
|
|
549
|
+
import { SlButton, SlButtonStart } from '@slotted/angular/button';
|
|
550
|
+
import { SlGlyph, SlIcon } from '@slotted/angular/icon';
|
|
551
|
+
import {
|
|
552
|
+
SlMenu,
|
|
553
|
+
SlMenuHeader,
|
|
554
|
+
SlMenuItem,
|
|
555
|
+
SlMenuItemDescription,
|
|
556
|
+
SlMenuItemIcon,
|
|
557
|
+
SlMenuItemMeta,
|
|
558
|
+
SlMenuRadioGroup,
|
|
559
|
+
SlMenuSeparator,
|
|
560
|
+
SlMenuTrigger,
|
|
561
|
+
} from '@slotted/angular/menu';
|
|
562
|
+
|
|
563
|
+
const WORKSPACES = ['Northwind Operations', 'Northwind Europe', 'Northwind Wholesale'];
|
|
564
|
+
|
|
565
|
+
@Component({
|
|
566
|
+
selector: 'app-menu-account-menu',
|
|
567
|
+
imports: [
|
|
568
|
+
SlAvatar,
|
|
569
|
+
SlButton,
|
|
570
|
+
SlButtonStart,
|
|
571
|
+
SlGlyph,
|
|
572
|
+
SlIcon,
|
|
573
|
+
SlMenu,
|
|
574
|
+
SlMenuHeader,
|
|
575
|
+
SlMenuItem,
|
|
576
|
+
SlMenuItemDescription,
|
|
577
|
+
SlMenuItemIcon,
|
|
578
|
+
SlMenuItemMeta,
|
|
579
|
+
SlMenuRadioGroup,
|
|
580
|
+
SlMenuSeparator,
|
|
581
|
+
SlMenuTrigger,
|
|
582
|
+
],
|
|
583
|
+
template: `
|
|
584
|
+
<button slButton variant="ghost" [slMenuTriggerFor]="account">
|
|
585
|
+
<span slButtonStart><span slAvatar decorative name="Maria Chen" size="sm"></span></span>
|
|
586
|
+
Maria Chen
|
|
587
|
+
</button>
|
|
588
|
+
<sl-menu #account align="end">
|
|
589
|
+
<div slMenuHeader>
|
|
590
|
+
<span slAvatar decorative name="Maria Chen" size="md"></span>
|
|
591
|
+
<span data-part="label">Maria Chen</span>
|
|
592
|
+
<span slMenuItemDescription>maria.chen@northwind.example</span>
|
|
593
|
+
</div>
|
|
594
|
+
<hr slMenuSeparator />
|
|
595
|
+
<button slMenuItem>
|
|
596
|
+
<span slMenuItemIcon
|
|
597
|
+
><span slIcon><svg slGlyph name="person"></svg></span
|
|
598
|
+
></span>
|
|
599
|
+
Profile
|
|
600
|
+
</button>
|
|
601
|
+
<button slMenuItem>
|
|
602
|
+
<span slMenuItemIcon
|
|
603
|
+
><span slIcon><svg slGlyph name="bell"></svg></span
|
|
604
|
+
></span>
|
|
605
|
+
Notifications
|
|
606
|
+
</button>
|
|
607
|
+
<button slMenuItem [slMenuTriggerFor]="workspaces">
|
|
608
|
+
Workspace <span slMenuItemMeta>{{ short() }}</span>
|
|
609
|
+
</button>
|
|
610
|
+
<sl-menu #workspaces>
|
|
611
|
+
<sl-menu-radio-group [(value)]="workspace">
|
|
612
|
+
@for (name of names; track name) {
|
|
613
|
+
<button slMenuRadioItem [value]="name">{{ name }}</button>
|
|
614
|
+
}
|
|
615
|
+
</sl-menu-radio-group>
|
|
616
|
+
</sl-menu>
|
|
617
|
+
<hr slMenuSeparator />
|
|
618
|
+
<button slMenuItem tone="danger">
|
|
619
|
+
<span slMenuItemIcon
|
|
620
|
+
><span slIcon><svg slGlyph name="arrow-left"></svg></span
|
|
621
|
+
></span>
|
|
622
|
+
Sign out
|
|
623
|
+
</button>
|
|
624
|
+
</sl-menu>
|
|
625
|
+
`,
|
|
626
|
+
})
|
|
627
|
+
export class MenuAccountMenu {
|
|
628
|
+
protected readonly names = WORKSPACES;
|
|
629
|
+
protected readonly workspace = signal<string | undefined>('Northwind Operations');
|
|
630
|
+
protected readonly short = computed(() => this.workspace()?.replace('Northwind ', ''));
|
|
631
|
+
}
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
### column-visibility.ts
|
|
635
|
+
|
|
636
|
+
Example
|
|
637
|
+
|
|
638
|
+
```ts
|
|
639
|
+
import { Component, computed, signal } from '@angular/core';
|
|
640
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
641
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
642
|
+
import { SlMenu, SlMenuGroup, SlMenuItem, SlMenuTrigger } from '@slotted/angular/menu';
|
|
643
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
644
|
+
import {
|
|
645
|
+
SlTable,
|
|
646
|
+
SlTableBody,
|
|
647
|
+
SlTableCell,
|
|
648
|
+
SlTableColumnHeader,
|
|
649
|
+
SlTableContent,
|
|
650
|
+
SlTableHead,
|
|
651
|
+
SlTableRow,
|
|
652
|
+
SlTableRowHeader,
|
|
653
|
+
} from '@slotted/angular/table';
|
|
654
|
+
|
|
655
|
+
type Column = 'customer' | 'status' | 'warehouse' | 'total';
|
|
656
|
+
|
|
657
|
+
const COLUMNS: { key: Column; label: string; numeric?: boolean }[] = [
|
|
658
|
+
{ key: 'customer', label: 'Customer' },
|
|
659
|
+
{ key: 'status', label: 'Status' },
|
|
660
|
+
{ key: 'warehouse', label: 'Warehouse' },
|
|
661
|
+
{ key: 'total', label: 'Total', numeric: true },
|
|
662
|
+
];
|
|
663
|
+
|
|
664
|
+
const ORDERS: (Record<Column, string> & { id: string })[] = [
|
|
665
|
+
{
|
|
666
|
+
id: 'SO-10482',
|
|
667
|
+
customer: 'Northwind Traders',
|
|
668
|
+
status: 'Packed',
|
|
669
|
+
warehouse: 'Rotterdam',
|
|
670
|
+
total: '$1,240.00',
|
|
671
|
+
},
|
|
672
|
+
{
|
|
673
|
+
id: 'SO-10483',
|
|
674
|
+
customer: 'Contoso Foods',
|
|
675
|
+
status: 'Awaiting payment',
|
|
676
|
+
warehouse: 'Leipzig',
|
|
677
|
+
total: '$860.50',
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
id: 'SO-10484',
|
|
681
|
+
customer: 'Fabrikam Supply',
|
|
682
|
+
status: 'Shipped',
|
|
683
|
+
warehouse: 'Lyon',
|
|
684
|
+
total: '$2,315.75',
|
|
685
|
+
},
|
|
686
|
+
];
|
|
687
|
+
|
|
688
|
+
@Component({
|
|
689
|
+
selector: 'app-menu-column-visibility',
|
|
690
|
+
imports: [
|
|
691
|
+
SlButton,
|
|
692
|
+
SlButtonEnd,
|
|
693
|
+
SlGlyph,
|
|
694
|
+
SlMenu,
|
|
695
|
+
SlMenuGroup,
|
|
696
|
+
SlMenuItem,
|
|
697
|
+
SlMenuTrigger,
|
|
698
|
+
SlStack,
|
|
699
|
+
SlTable,
|
|
700
|
+
SlTableBody,
|
|
701
|
+
SlTableCell,
|
|
702
|
+
SlTableColumnHeader,
|
|
703
|
+
SlTableContent,
|
|
704
|
+
SlTableHead,
|
|
705
|
+
SlTableRow,
|
|
706
|
+
SlTableRowHeader,
|
|
707
|
+
],
|
|
708
|
+
template: `
|
|
709
|
+
<div slStack align="end" [gap]="3">
|
|
710
|
+
<button slButton size="sm" variant="outline" [slMenuTriggerFor]="columnMenu">
|
|
711
|
+
Columns
|
|
712
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
713
|
+
</button>
|
|
714
|
+
<sl-menu #columnMenu align="end">
|
|
715
|
+
<sl-menu-group label="Show columns">
|
|
716
|
+
@for (column of columns; track column.key) {
|
|
717
|
+
<button
|
|
718
|
+
slMenuCheckboxItem
|
|
719
|
+
[checked]="visible()[column.key]"
|
|
720
|
+
(checkedChange)="toggle(column.key, $event)"
|
|
721
|
+
>
|
|
722
|
+
{{ column.label }}
|
|
723
|
+
</button>
|
|
724
|
+
}
|
|
725
|
+
</sl-menu-group>
|
|
726
|
+
</sl-menu>
|
|
727
|
+
<div slTable [columns]="shown().length + 1">
|
|
728
|
+
<div slTableContent>
|
|
729
|
+
<thead slTableHead>
|
|
730
|
+
<tr slTableRow>
|
|
731
|
+
<th slTableColumnHeader>Order</th>
|
|
732
|
+
@for (column of shown(); track column.key) {
|
|
733
|
+
<th slTableColumnHeader [numeric]="column.numeric ?? false">{{ column.label }}</th>
|
|
734
|
+
}
|
|
735
|
+
</tr>
|
|
736
|
+
</thead>
|
|
737
|
+
<tbody slTableBody>
|
|
738
|
+
@for (order of orders; track order.id) {
|
|
739
|
+
<tr slTableRow [value]="order.id">
|
|
740
|
+
<th slTableRowHeader>{{ order.id }}</th>
|
|
741
|
+
@for (column of shown(); track column.key) {
|
|
742
|
+
<td slTableCell [numeric]="column.numeric ?? false">{{ order[column.key] }}</td>
|
|
743
|
+
}
|
|
744
|
+
</tr>
|
|
745
|
+
}
|
|
746
|
+
</tbody>
|
|
747
|
+
</div>
|
|
748
|
+
</div>
|
|
749
|
+
</div>
|
|
750
|
+
`,
|
|
751
|
+
})
|
|
752
|
+
export class MenuColumnVisibility {
|
|
753
|
+
protected readonly columns = COLUMNS;
|
|
754
|
+
protected readonly orders = ORDERS;
|
|
755
|
+
protected readonly visible = signal<Record<Column, boolean>>({
|
|
756
|
+
customer: true,
|
|
757
|
+
status: true,
|
|
758
|
+
warehouse: false,
|
|
759
|
+
total: true,
|
|
760
|
+
});
|
|
761
|
+
protected readonly shown = computed(() => COLUMNS.filter((column) => this.visible()[column.key]));
|
|
762
|
+
|
|
763
|
+
protected toggle(key: Column, checked: boolean): void {
|
|
764
|
+
this.visible.update((current) => ({ ...current, [key]: checked }));
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
### controlled.ts
|
|
770
|
+
|
|
771
|
+
Example
|
|
772
|
+
|
|
773
|
+
```ts
|
|
774
|
+
import { Component, signal } from '@angular/core';
|
|
775
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
776
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
777
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
778
|
+
import { SlMenu, SlMenuItem, SlMenuTrigger } from '@slotted/angular/menu';
|
|
779
|
+
import type { ChangeRequest } from '@slotted/core/state';
|
|
780
|
+
import { SlText } from '@slotted/angular/typography';
|
|
781
|
+
|
|
782
|
+
@Component({
|
|
783
|
+
selector: 'app-menu-controlled',
|
|
784
|
+
imports: [SlButton, SlButtonEnd, SlGlyph, SlInline, SlMenu, SlMenuItem, SlMenuTrigger, SlText],
|
|
785
|
+
template: `
|
|
786
|
+
<div slInline align="center" wrap="wrap" [gap]="3">
|
|
787
|
+
<button slButton variant="outline" [slMenuTriggerFor]="bulk">
|
|
788
|
+
Bulk actions
|
|
789
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
790
|
+
</button>
|
|
791
|
+
<sl-menu #bulk [(open)]="open" (openChangeRequest)="record($event)">
|
|
792
|
+
<button slMenuItem>Mark 12 orders as packed</button>
|
|
793
|
+
<button slMenuItem>Print 12 packing slips</button>
|
|
794
|
+
<button slMenuItem>Export selection</button>
|
|
795
|
+
</sl-menu>
|
|
796
|
+
<button slButton variant="ghost" (click)="open.set(true)">Open from code</button>
|
|
797
|
+
<span slText size="sm" tone="muted">{{ last() }}</span>
|
|
798
|
+
</div>
|
|
799
|
+
`,
|
|
800
|
+
})
|
|
801
|
+
export class MenuControlled {
|
|
802
|
+
protected readonly open = signal(false);
|
|
803
|
+
protected readonly last = signal('Closed');
|
|
804
|
+
|
|
805
|
+
protected record(request: ChangeRequest<boolean>): void {
|
|
806
|
+
this.last.set(`${request.value ? 'Opened' : 'Closed'} by ${request.reason}`);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
### descriptions.ts
|
|
812
|
+
|
|
813
|
+
Example
|
|
814
|
+
|
|
815
|
+
```ts
|
|
816
|
+
import { Component } from '@angular/core';
|
|
817
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
818
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
819
|
+
import { SlMenu, SlMenuItem, SlMenuItemDescription, SlMenuTrigger } from '@slotted/angular/menu';
|
|
820
|
+
|
|
821
|
+
@Component({
|
|
822
|
+
selector: 'app-menu-descriptions',
|
|
823
|
+
imports: [
|
|
824
|
+
SlButton,
|
|
825
|
+
SlButtonEnd,
|
|
826
|
+
SlGlyph,
|
|
827
|
+
SlMenu,
|
|
828
|
+
SlMenuItem,
|
|
829
|
+
SlMenuItemDescription,
|
|
830
|
+
SlMenuTrigger,
|
|
831
|
+
],
|
|
832
|
+
template: `
|
|
833
|
+
<button slButton variant="outline" [slMenuTriggerFor]="refund">
|
|
834
|
+
Refund
|
|
835
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
836
|
+
</button>
|
|
837
|
+
<sl-menu #refund>
|
|
838
|
+
<button slMenuItem>
|
|
839
|
+
Full refund
|
|
840
|
+
<span slMenuItemDescription>Returns $1,240.00 to the card used at checkout.</span>
|
|
841
|
+
</button>
|
|
842
|
+
<button slMenuItem>
|
|
843
|
+
Partial refund…
|
|
844
|
+
<span slMenuItemDescription>Choose the lines and the amount to return.</span>
|
|
845
|
+
</button>
|
|
846
|
+
<button slMenuItem>
|
|
847
|
+
Store credit
|
|
848
|
+
<span slMenuItemDescription>Adds $1,240.00 to the customer's account balance.</span>
|
|
849
|
+
</button>
|
|
850
|
+
</sl-menu>
|
|
851
|
+
`,
|
|
852
|
+
})
|
|
853
|
+
export class MenuDescriptions {}
|
|
854
|
+
```
|
|
855
|
+
|
|
856
|
+
### destructive.ts
|
|
857
|
+
|
|
858
|
+
Example
|
|
859
|
+
|
|
860
|
+
```ts
|
|
861
|
+
import { Component } from '@angular/core';
|
|
862
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
863
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
864
|
+
import {
|
|
865
|
+
SlMenu,
|
|
866
|
+
SlMenuItem,
|
|
867
|
+
SlMenuItemDescription,
|
|
868
|
+
SlMenuSeparator,
|
|
869
|
+
SlMenuTrigger,
|
|
870
|
+
} from '@slotted/angular/menu';
|
|
871
|
+
|
|
872
|
+
@Component({
|
|
873
|
+
selector: 'app-menu-destructive',
|
|
874
|
+
imports: [
|
|
875
|
+
SlButton,
|
|
876
|
+
SlButtonEnd,
|
|
877
|
+
SlGlyph,
|
|
878
|
+
SlMenu,
|
|
879
|
+
SlMenuItem,
|
|
880
|
+
SlMenuItemDescription,
|
|
881
|
+
SlMenuSeparator,
|
|
882
|
+
SlMenuTrigger,
|
|
883
|
+
],
|
|
884
|
+
template: `
|
|
885
|
+
<button slButton variant="outline" [slMenuTriggerFor]="supplier">
|
|
886
|
+
Supplier
|
|
887
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
888
|
+
</button>
|
|
889
|
+
<sl-menu #supplier>
|
|
890
|
+
<button slMenuItem>Edit details</button>
|
|
891
|
+
<button slMenuItem tone="success">Approve for purchasing</button>
|
|
892
|
+
<button slMenuItem tone="warning">Put payments on hold</button>
|
|
893
|
+
<hr slMenuSeparator />
|
|
894
|
+
<button slMenuItem tone="danger">
|
|
895
|
+
Delete supplier…
|
|
896
|
+
<span slMenuItemDescription
|
|
897
|
+
>Removes Northwind Traders and its 18 open purchase orders.</span
|
|
898
|
+
>
|
|
899
|
+
</button>
|
|
900
|
+
</sl-menu>
|
|
901
|
+
`,
|
|
902
|
+
})
|
|
903
|
+
export class MenuDestructive {}
|
|
904
|
+
```
|
|
905
|
+
|
|
906
|
+
### disabled.ts
|
|
907
|
+
|
|
908
|
+
Example
|
|
909
|
+
|
|
910
|
+
```ts
|
|
911
|
+
import { Component } from '@angular/core';
|
|
912
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
913
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
914
|
+
import {
|
|
915
|
+
SlMenu,
|
|
916
|
+
SlMenuItem,
|
|
917
|
+
SlMenuItemDescription,
|
|
918
|
+
SlMenuSeparator,
|
|
919
|
+
SlMenuTrigger,
|
|
920
|
+
} from '@slotted/angular/menu';
|
|
921
|
+
|
|
922
|
+
@Component({
|
|
923
|
+
selector: 'app-menu-disabled',
|
|
924
|
+
imports: [
|
|
925
|
+
SlButton,
|
|
926
|
+
SlButtonEnd,
|
|
927
|
+
SlGlyph,
|
|
928
|
+
SlMenu,
|
|
929
|
+
SlMenuItem,
|
|
930
|
+
SlMenuItemDescription,
|
|
931
|
+
SlMenuSeparator,
|
|
932
|
+
SlMenuTrigger,
|
|
933
|
+
],
|
|
934
|
+
template: `
|
|
935
|
+
<button slButton variant="outline" [slMenuTriggerFor]="shipped">
|
|
936
|
+
SO-10477 · Shipped
|
|
937
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
938
|
+
</button>
|
|
939
|
+
<sl-menu #shipped>
|
|
940
|
+
<button slMenuItem>Track shipment</button>
|
|
941
|
+
<button slMenuItem>Create return…</button>
|
|
942
|
+
<button slMenuItem [disabled]="true">
|
|
943
|
+
Edit order
|
|
944
|
+
<span slMenuItemDescription>A shipped order can no longer be edited.</span>
|
|
945
|
+
</button>
|
|
946
|
+
<hr slMenuSeparator />
|
|
947
|
+
<button slMenuItem tone="danger" [disabled]="true">
|
|
948
|
+
Cancel order
|
|
949
|
+
<span slMenuItemDescription>Create a return instead.</span>
|
|
950
|
+
</button>
|
|
951
|
+
</sl-menu>
|
|
952
|
+
`,
|
|
953
|
+
})
|
|
954
|
+
export class MenuDisabled {}
|
|
955
|
+
```
|
|
956
|
+
|
|
957
|
+
### keep-open.ts
|
|
958
|
+
|
|
959
|
+
Example
|
|
960
|
+
|
|
961
|
+
```ts
|
|
962
|
+
import { Component, signal } from '@angular/core';
|
|
963
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
964
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
965
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
966
|
+
import { SlMenu, SlMenuItem, SlMenuSeparator, SlMenuTrigger } from '@slotted/angular/menu';
|
|
967
|
+
import { SlText } from '@slotted/angular/typography';
|
|
968
|
+
|
|
969
|
+
@Component({
|
|
970
|
+
selector: 'app-menu-keep-open',
|
|
971
|
+
imports: [
|
|
972
|
+
SlButton,
|
|
973
|
+
SlButtonEnd,
|
|
974
|
+
SlGlyph,
|
|
975
|
+
SlInline,
|
|
976
|
+
SlMenu,
|
|
977
|
+
SlMenuItem,
|
|
978
|
+
SlMenuSeparator,
|
|
979
|
+
SlMenuTrigger,
|
|
980
|
+
SlText,
|
|
981
|
+
],
|
|
982
|
+
template: `
|
|
983
|
+
<div slInline align="center" [gap]="3">
|
|
984
|
+
<button slButton variant="outline" [slMenuTriggerFor]="quantity">
|
|
985
|
+
Adjust quantity
|
|
986
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
987
|
+
</button>
|
|
988
|
+
<sl-menu #quantity>
|
|
989
|
+
<button slMenuItem [closeOnSelect]="false" (select)="add(1)">Add 1 carton</button>
|
|
990
|
+
<button slMenuItem [closeOnSelect]="false" (select)="add(10)">Add 10 cartons</button>
|
|
991
|
+
<button slMenuItem [closeOnSelect]="false" (select)="add(-1)">Remove 1 carton</button>
|
|
992
|
+
<hr slMenuSeparator />
|
|
993
|
+
<button slMenuItem (select)="cartons.set(24)">Reset to ordered quantity</button>
|
|
994
|
+
</sl-menu>
|
|
995
|
+
<span slText size="sm" tone="muted">{{ cartons() }} cartons</span>
|
|
996
|
+
</div>
|
|
997
|
+
`,
|
|
998
|
+
})
|
|
999
|
+
export class MenuKeepOpen {
|
|
1000
|
+
protected readonly cartons = signal(24);
|
|
1001
|
+
|
|
1002
|
+
protected add(count: number): void {
|
|
1003
|
+
this.cartons.update((current) => Math.max(0, current + count));
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
```
|
|
1007
|
+
|
|
1008
|
+
### links.ts
|
|
1009
|
+
|
|
1010
|
+
Example
|
|
1011
|
+
|
|
1012
|
+
```ts
|
|
1013
|
+
import { Component } from '@angular/core';
|
|
1014
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
1015
|
+
import { SlGlyph, SlIcon } from '@slotted/angular/icon';
|
|
1016
|
+
import {
|
|
1017
|
+
SlMenu,
|
|
1018
|
+
SlMenuItem,
|
|
1019
|
+
SlMenuItemIcon,
|
|
1020
|
+
SlMenuSeparator,
|
|
1021
|
+
SlMenuTrigger,
|
|
1022
|
+
} from '@slotted/angular/menu';
|
|
1023
|
+
|
|
1024
|
+
@Component({
|
|
1025
|
+
selector: 'app-menu-links',
|
|
1026
|
+
imports: [
|
|
1027
|
+
SlButton,
|
|
1028
|
+
SlButtonEnd,
|
|
1029
|
+
SlGlyph,
|
|
1030
|
+
SlIcon,
|
|
1031
|
+
SlMenu,
|
|
1032
|
+
SlMenuItem,
|
|
1033
|
+
SlMenuItemIcon,
|
|
1034
|
+
SlMenuSeparator,
|
|
1035
|
+
SlMenuTrigger,
|
|
1036
|
+
],
|
|
1037
|
+
template: `
|
|
1038
|
+
<button slButton variant="outline" [slMenuTriggerFor]="open">
|
|
1039
|
+
Open
|
|
1040
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
1041
|
+
</button>
|
|
1042
|
+
<sl-menu #open>
|
|
1043
|
+
<a slMenuItem href="#order-SO-10482">Order page</a>
|
|
1044
|
+
<a slMenuItem href="#customer-northwind">Customer profile</a>
|
|
1045
|
+
<hr slMenuSeparator />
|
|
1046
|
+
<a
|
|
1047
|
+
slMenuItem
|
|
1048
|
+
href="https://example.com/carriers/track/1Z999AA10123456784"
|
|
1049
|
+
rel="noreferrer"
|
|
1050
|
+
target="_blank"
|
|
1051
|
+
>
|
|
1052
|
+
<span slMenuItemIcon
|
|
1053
|
+
><span slIcon><svg slGlyph name="external"></svg></span
|
|
1054
|
+
></span>
|
|
1055
|
+
Carrier tracking
|
|
1056
|
+
</a>
|
|
1057
|
+
</sl-menu>
|
|
1058
|
+
`,
|
|
1059
|
+
})
|
|
1060
|
+
export class MenuLinks {}
|
|
1061
|
+
```
|
|
1062
|
+
|
|
1063
|
+
### loading.ts
|
|
1064
|
+
|
|
1065
|
+
Example
|
|
1066
|
+
|
|
1067
|
+
```ts
|
|
1068
|
+
import { Component, signal } from '@angular/core';
|
|
1069
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
1070
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
1071
|
+
import { SlMenu, SlMenuEmpty, SlMenuItem, SlMenuTrigger } from '@slotted/angular/menu';
|
|
1072
|
+
|
|
1073
|
+
const LABELS = ['Fragile', 'Gift wrap', 'Priority', 'Wholesale'];
|
|
1074
|
+
|
|
1075
|
+
@Component({
|
|
1076
|
+
selector: 'app-menu-loading',
|
|
1077
|
+
imports: [SlButton, SlButtonEnd, SlGlyph, SlMenu, SlMenuEmpty, SlMenuItem, SlMenuTrigger],
|
|
1078
|
+
template: `
|
|
1079
|
+
<button slButton variant="outline" [slMenuTriggerFor]="labelMenu">
|
|
1080
|
+
Labels
|
|
1081
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
1082
|
+
</button>
|
|
1083
|
+
<sl-menu #labelMenu [loading]="labels() === null" (openChange)="load($event)">
|
|
1084
|
+
@if (labels(); as loaded) {
|
|
1085
|
+
@for (label of loaded; track label) {
|
|
1086
|
+
<button slMenuCheckboxItem>{{ label }}</button>
|
|
1087
|
+
}
|
|
1088
|
+
} @else {
|
|
1089
|
+
<div slMenuEmpty>Loading labels…</div>
|
|
1090
|
+
}
|
|
1091
|
+
</sl-menu>
|
|
1092
|
+
`,
|
|
1093
|
+
})
|
|
1094
|
+
export class MenuLoading {
|
|
1095
|
+
protected readonly labels = signal<string[] | null>(null);
|
|
1096
|
+
private requested = false;
|
|
1097
|
+
|
|
1098
|
+
protected load(open: boolean): void {
|
|
1099
|
+
if (!open || this.requested) return;
|
|
1100
|
+
this.requested = true;
|
|
1101
|
+
setTimeout(() => this.labels.set(LABELS), 1200);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
```
|
|
1105
|
+
|
|
1106
|
+
### long-list.ts
|
|
1107
|
+
|
|
1108
|
+
Example
|
|
1109
|
+
|
|
1110
|
+
```ts
|
|
1111
|
+
import { Component } from '@angular/core';
|
|
1112
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
1113
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
1114
|
+
import { SlMenu, SlMenuItem, SlMenuTrigger } from '@slotted/angular/menu';
|
|
1115
|
+
|
|
1116
|
+
const LOCATIONS = [
|
|
1117
|
+
'Amsterdam',
|
|
1118
|
+
'Antwerp',
|
|
1119
|
+
'Barcelona',
|
|
1120
|
+
'Berlin',
|
|
1121
|
+
'Bologna',
|
|
1122
|
+
'Bordeaux',
|
|
1123
|
+
'Bratislava',
|
|
1124
|
+
'Brno',
|
|
1125
|
+
'Brussels',
|
|
1126
|
+
'Budapest',
|
|
1127
|
+
'Copenhagen',
|
|
1128
|
+
'Dublin',
|
|
1129
|
+
'Gdańsk',
|
|
1130
|
+
'Geneva',
|
|
1131
|
+
'Hamburg',
|
|
1132
|
+
'Helsinki',
|
|
1133
|
+
'Kraków',
|
|
1134
|
+
'Leipzig',
|
|
1135
|
+
'Lisbon',
|
|
1136
|
+
'Ljubljana',
|
|
1137
|
+
'Lyon',
|
|
1138
|
+
'Madrid',
|
|
1139
|
+
'Milan',
|
|
1140
|
+
'Munich',
|
|
1141
|
+
'Oslo',
|
|
1142
|
+
'Porto',
|
|
1143
|
+
'Prague',
|
|
1144
|
+
'Rotterdam',
|
|
1145
|
+
'Stockholm',
|
|
1146
|
+
'Tallinn',
|
|
1147
|
+
'Valencia',
|
|
1148
|
+
'Vienna',
|
|
1149
|
+
'Vilnius',
|
|
1150
|
+
'Warsaw',
|
|
1151
|
+
'Zagreb',
|
|
1152
|
+
'Zürich',
|
|
1153
|
+
];
|
|
1154
|
+
|
|
1155
|
+
@Component({
|
|
1156
|
+
selector: 'app-menu-long-list',
|
|
1157
|
+
imports: [SlButton, SlButtonEnd, SlGlyph, SlMenu, SlMenuItem, SlMenuTrigger],
|
|
1158
|
+
template: `
|
|
1159
|
+
<button slButton variant="outline" [slMenuTriggerFor]="warehouses">
|
|
1160
|
+
Move to warehouse
|
|
1161
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
1162
|
+
</button>
|
|
1163
|
+
<sl-menu #warehouses>
|
|
1164
|
+
@for (location of locations; track location) {
|
|
1165
|
+
<button slMenuItem>{{ location }}</button>
|
|
1166
|
+
}
|
|
1167
|
+
</sl-menu>
|
|
1168
|
+
`,
|
|
1169
|
+
})
|
|
1170
|
+
export class MenuLongList {
|
|
1171
|
+
protected readonly locations = LOCATIONS;
|
|
1172
|
+
}
|
|
1173
|
+
```
|
|
1174
|
+
|
|
1175
|
+
### row-actions.ts
|
|
1176
|
+
|
|
1177
|
+
Example
|
|
1178
|
+
|
|
1179
|
+
```ts
|
|
1180
|
+
import { Component, signal } from '@angular/core';
|
|
1181
|
+
import { SlButton, SlIconButton } from '@slotted/angular/button';
|
|
1182
|
+
import {
|
|
1183
|
+
SlAlertDialog,
|
|
1184
|
+
SlAlertDialogAction,
|
|
1185
|
+
SlAlertDialogCancel,
|
|
1186
|
+
SlAlertDialogIcon,
|
|
1187
|
+
SlDialogDescription,
|
|
1188
|
+
SlDialogFooter,
|
|
1189
|
+
SlDialogHeader,
|
|
1190
|
+
SlDialogTitle,
|
|
1191
|
+
} from '@slotted/angular/dialog';
|
|
1192
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
1193
|
+
import { SlMenu, SlMenuItem, SlMenuSeparator, SlMenuTrigger } from '@slotted/angular/menu';
|
|
1194
|
+
import {
|
|
1195
|
+
SlTable,
|
|
1196
|
+
SlTableBody,
|
|
1197
|
+
SlTableCell,
|
|
1198
|
+
SlTableColumnHeader,
|
|
1199
|
+
SlTableContent,
|
|
1200
|
+
SlTableHead,
|
|
1201
|
+
SlTableRow,
|
|
1202
|
+
SlTableRowHeader,
|
|
1203
|
+
} from '@slotted/angular/table';
|
|
1204
|
+
|
|
1205
|
+
interface Order {
|
|
1206
|
+
id: string;
|
|
1207
|
+
customer: string;
|
|
1208
|
+
total: string;
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
const ORDERS: Order[] = [
|
|
1212
|
+
{ id: 'SO-10482', customer: 'Northwind Traders', total: '$1,240.00' },
|
|
1213
|
+
{ id: 'SO-10483', customer: 'Contoso Foods', total: '$860.50' },
|
|
1214
|
+
{ id: 'SO-10484', customer: 'Fabrikam Supply', total: '$2,315.75' },
|
|
1215
|
+
];
|
|
1216
|
+
|
|
1217
|
+
@Component({
|
|
1218
|
+
selector: 'app-menu-row-actions',
|
|
1219
|
+
imports: [
|
|
1220
|
+
SlAlertDialog,
|
|
1221
|
+
SlAlertDialogAction,
|
|
1222
|
+
SlAlertDialogCancel,
|
|
1223
|
+
SlAlertDialogIcon,
|
|
1224
|
+
SlButton,
|
|
1225
|
+
SlDialogDescription,
|
|
1226
|
+
SlDialogFooter,
|
|
1227
|
+
SlDialogHeader,
|
|
1228
|
+
SlDialogTitle,
|
|
1229
|
+
SlGlyph,
|
|
1230
|
+
SlIconButton,
|
|
1231
|
+
SlMenu,
|
|
1232
|
+
SlMenuItem,
|
|
1233
|
+
SlMenuSeparator,
|
|
1234
|
+
SlMenuTrigger,
|
|
1235
|
+
SlTable,
|
|
1236
|
+
SlTableBody,
|
|
1237
|
+
SlTableCell,
|
|
1238
|
+
SlTableColumnHeader,
|
|
1239
|
+
SlTableContent,
|
|
1240
|
+
SlTableHead,
|
|
1241
|
+
SlTableRow,
|
|
1242
|
+
SlTableRowHeader,
|
|
1243
|
+
],
|
|
1244
|
+
template: `
|
|
1245
|
+
<div slTable [columns]="4">
|
|
1246
|
+
<div slTableContent>
|
|
1247
|
+
<thead slTableHead>
|
|
1248
|
+
<tr slTableRow>
|
|
1249
|
+
<th slTableColumnHeader>Order</th>
|
|
1250
|
+
<th slTableColumnHeader>Customer</th>
|
|
1251
|
+
<th slTableColumnHeader numeric>Total</th>
|
|
1252
|
+
<th slTableColumnHeader align="end">Actions</th>
|
|
1253
|
+
</tr>
|
|
1254
|
+
</thead>
|
|
1255
|
+
<tbody slTableBody>
|
|
1256
|
+
@for (order of orders(); track order.id) {
|
|
1257
|
+
<tr slTableRow [value]="order.id">
|
|
1258
|
+
<th slTableRowHeader>{{ order.id }}</th>
|
|
1259
|
+
<td slTableCell>{{ order.customer }}</td>
|
|
1260
|
+
<td slTableCell numeric>{{ order.total }}</td>
|
|
1261
|
+
<td slTableCell align="end">
|
|
1262
|
+
<button
|
|
1263
|
+
slIconButton
|
|
1264
|
+
size="sm"
|
|
1265
|
+
[attr.aria-label]="'Actions for ' + order.id"
|
|
1266
|
+
[slMenuTriggerFor]="actions"
|
|
1267
|
+
>
|
|
1268
|
+
<svg slGlyph name="ellipsis"></svg>
|
|
1269
|
+
</button>
|
|
1270
|
+
<sl-menu #actions align="end">
|
|
1271
|
+
<button slMenuItem>View order</button>
|
|
1272
|
+
<button slMenuItem shortcut="Mod+D">Duplicate</button>
|
|
1273
|
+
<hr slMenuSeparator />
|
|
1274
|
+
<button slMenuItem tone="danger" (select)="confirm(order)">Delete order…</button>
|
|
1275
|
+
</sl-menu>
|
|
1276
|
+
</td>
|
|
1277
|
+
</tr>
|
|
1278
|
+
}
|
|
1279
|
+
</tbody>
|
|
1280
|
+
</div>
|
|
1281
|
+
</div>
|
|
1282
|
+
<sl-alert-dialog [(open)]="confirming">
|
|
1283
|
+
<header slDialogHeader>
|
|
1284
|
+
<span slAlertDialogIcon></span>
|
|
1285
|
+
<h2 slDialogTitle>Delete {{ pending()?.id }}?</h2>
|
|
1286
|
+
<p slDialogDescription>
|
|
1287
|
+
The order for {{ pending()?.customer }} and its invoice are removed. This cannot be
|
|
1288
|
+
undone.
|
|
1289
|
+
</p>
|
|
1290
|
+
</header>
|
|
1291
|
+
<footer slDialogFooter>
|
|
1292
|
+
<button slButton slAlertDialogCancel tone="secondary" variant="outline">Keep order</button>
|
|
1293
|
+
<button slButton slAlertDialogAction tone="danger" (click)="remove()">Delete order</button>
|
|
1294
|
+
</footer>
|
|
1295
|
+
</sl-alert-dialog>
|
|
1296
|
+
`,
|
|
1297
|
+
})
|
|
1298
|
+
export class MenuRowActions {
|
|
1299
|
+
protected readonly orders = signal(ORDERS);
|
|
1300
|
+
protected readonly pending = signal<Order | null>(null);
|
|
1301
|
+
protected readonly confirming = signal(false);
|
|
1302
|
+
|
|
1303
|
+
protected confirm(order: Order): void {
|
|
1304
|
+
this.pending.set(order);
|
|
1305
|
+
this.confirming.set(true);
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
protected remove(): void {
|
|
1309
|
+
const id = this.pending()?.id;
|
|
1310
|
+
this.orders.update((rows) => rows.filter((row) => row.id !== id));
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
```
|
|
1314
|
+
|
|
1315
|
+
### sizes.ts
|
|
1316
|
+
|
|
1317
|
+
Example
|
|
1318
|
+
|
|
1319
|
+
```ts
|
|
1320
|
+
import { Component } from '@angular/core';
|
|
1321
|
+
import { SlButton } from '@slotted/angular/button';
|
|
1322
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
1323
|
+
import { SlMenu, SlMenuItem, SlMenuTrigger, type MenuSize } from '@slotted/angular/menu';
|
|
1324
|
+
|
|
1325
|
+
const SIZES: MenuSize[] = ['sm', 'md', 'lg'];
|
|
1326
|
+
|
|
1327
|
+
@Component({
|
|
1328
|
+
selector: 'app-menu-sizes',
|
|
1329
|
+
imports: [SlButton, SlInline, SlMenu, SlMenuItem, SlMenuTrigger],
|
|
1330
|
+
template: `
|
|
1331
|
+
<div slInline align="center" [gap]="3">
|
|
1332
|
+
@for (size of sizes; track size) {
|
|
1333
|
+
<button slButton variant="outline" [size]="size" [slMenuTriggerFor]="menu">
|
|
1334
|
+
Actions, {{ size }}
|
|
1335
|
+
</button>
|
|
1336
|
+
<sl-menu #menu [size]="size">
|
|
1337
|
+
<button slMenuItem shortcut="Mod+E">Edit order</button>
|
|
1338
|
+
<button slMenuItem shortcut="Mod+D">Duplicate</button>
|
|
1339
|
+
<button slMenuItem>Print packing slip</button>
|
|
1340
|
+
</sl-menu>
|
|
1341
|
+
}
|
|
1342
|
+
</div>
|
|
1343
|
+
`,
|
|
1344
|
+
})
|
|
1345
|
+
export class MenuSizes {
|
|
1346
|
+
protected readonly sizes = SIZES;
|
|
1347
|
+
}
|
|
1348
|
+
```
|
|
1349
|
+
|
|
1350
|
+
### sort-menu.ts
|
|
1351
|
+
|
|
1352
|
+
Example
|
|
1353
|
+
|
|
1354
|
+
```ts
|
|
1355
|
+
import { Component, computed, signal } from '@angular/core';
|
|
1356
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
1357
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
1358
|
+
import { SlMenu, SlMenuItem, SlMenuRadioGroup, SlMenuTrigger } from '@slotted/angular/menu';
|
|
1359
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
1360
|
+
import {
|
|
1361
|
+
SlTable,
|
|
1362
|
+
SlTableBody,
|
|
1363
|
+
SlTableCell,
|
|
1364
|
+
SlTableColumnHeader,
|
|
1365
|
+
SlTableContent,
|
|
1366
|
+
SlTableHead,
|
|
1367
|
+
SlTableRow,
|
|
1368
|
+
SlTableRowHeader,
|
|
1369
|
+
} from '@slotted/angular/table';
|
|
1370
|
+
|
|
1371
|
+
interface Order {
|
|
1372
|
+
id: string;
|
|
1373
|
+
customer: string;
|
|
1374
|
+
placed: string;
|
|
1375
|
+
total: number;
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
const ORDERS: Order[] = [
|
|
1379
|
+
{ id: 'SO-10482', customer: 'Northwind Traders', placed: '2026-10-02', total: 1240 },
|
|
1380
|
+
{ id: 'SO-10483', customer: 'Contoso Foods', placed: '2026-10-03', total: 860.5 },
|
|
1381
|
+
{ id: 'SO-10484', customer: 'Fabrikam Supply', placed: '2026-10-01', total: 2315.75 },
|
|
1382
|
+
{ id: 'SO-10485', customer: 'Adventure Works', placed: '2026-10-04', total: 412 },
|
|
1383
|
+
];
|
|
1384
|
+
|
|
1385
|
+
const SORTS: { value: string; label: string; compare: (a: Order, b: Order) => number }[] = [
|
|
1386
|
+
{ value: 'newest', label: 'Newest first', compare: (a, b) => b.placed.localeCompare(a.placed) },
|
|
1387
|
+
{ value: 'oldest', label: 'Oldest first', compare: (a, b) => a.placed.localeCompare(b.placed) },
|
|
1388
|
+
{ value: 'total-desc', label: 'Highest total', compare: (a, b) => b.total - a.total },
|
|
1389
|
+
{ value: 'total-asc', label: 'Lowest total', compare: (a, b) => a.total - b.total },
|
|
1390
|
+
{
|
|
1391
|
+
value: 'customer',
|
|
1392
|
+
label: 'Customer, A to Z',
|
|
1393
|
+
compare: (a, b) => a.customer.localeCompare(b.customer),
|
|
1394
|
+
},
|
|
1395
|
+
];
|
|
1396
|
+
|
|
1397
|
+
const money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
|
|
1398
|
+
|
|
1399
|
+
@Component({
|
|
1400
|
+
selector: 'app-menu-sort-menu',
|
|
1401
|
+
imports: [
|
|
1402
|
+
SlButton,
|
|
1403
|
+
SlButtonEnd,
|
|
1404
|
+
SlGlyph,
|
|
1405
|
+
SlMenu,
|
|
1406
|
+
SlMenuItem,
|
|
1407
|
+
SlMenuRadioGroup,
|
|
1408
|
+
SlMenuTrigger,
|
|
1409
|
+
SlStack,
|
|
1410
|
+
SlTable,
|
|
1411
|
+
SlTableBody,
|
|
1412
|
+
SlTableCell,
|
|
1413
|
+
SlTableColumnHeader,
|
|
1414
|
+
SlTableContent,
|
|
1415
|
+
SlTableHead,
|
|
1416
|
+
SlTableRow,
|
|
1417
|
+
SlTableRowHeader,
|
|
1418
|
+
],
|
|
1419
|
+
template: `
|
|
1420
|
+
<div slStack align="end" [gap]="3">
|
|
1421
|
+
<button slButton size="sm" variant="outline" [slMenuTriggerFor]="sortMenu">
|
|
1422
|
+
Sort: {{ current().label }}
|
|
1423
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
1424
|
+
</button>
|
|
1425
|
+
<sl-menu #sortMenu align="end">
|
|
1426
|
+
<sl-menu-radio-group aria-label="Sort orders" [(value)]="sort">
|
|
1427
|
+
@for (option of sorts; track option.value) {
|
|
1428
|
+
<button slMenuRadioItem [value]="option.value">{{ option.label }}</button>
|
|
1429
|
+
}
|
|
1430
|
+
</sl-menu-radio-group>
|
|
1431
|
+
</sl-menu>
|
|
1432
|
+
<div slTable [columns]="4">
|
|
1433
|
+
<div slTableContent>
|
|
1434
|
+
<thead slTableHead>
|
|
1435
|
+
<tr slTableRow>
|
|
1436
|
+
<th slTableColumnHeader>Order</th>
|
|
1437
|
+
<th slTableColumnHeader>Customer</th>
|
|
1438
|
+
<th slTableColumnHeader>Placed</th>
|
|
1439
|
+
<th slTableColumnHeader numeric>Total</th>
|
|
1440
|
+
</tr>
|
|
1441
|
+
</thead>
|
|
1442
|
+
<tbody slTableBody>
|
|
1443
|
+
@for (order of rows(); track order.id) {
|
|
1444
|
+
<tr slTableRow [value]="order.id">
|
|
1445
|
+
<th slTableRowHeader>{{ order.id }}</th>
|
|
1446
|
+
<td slTableCell>{{ order.customer }}</td>
|
|
1447
|
+
<td slTableCell>{{ order.placed }}</td>
|
|
1448
|
+
<td slTableCell numeric>{{ format(order.total) }}</td>
|
|
1449
|
+
</tr>
|
|
1450
|
+
}
|
|
1451
|
+
</tbody>
|
|
1452
|
+
</div>
|
|
1453
|
+
</div>
|
|
1454
|
+
</div>
|
|
1455
|
+
`,
|
|
1456
|
+
})
|
|
1457
|
+
export class MenuSortMenu {
|
|
1458
|
+
protected readonly sorts = SORTS;
|
|
1459
|
+
protected readonly sort = signal<string | undefined>('newest');
|
|
1460
|
+
protected readonly current = computed(
|
|
1461
|
+
() => SORTS.find((option) => option.value === this.sort()) ?? SORTS[0]!,
|
|
1462
|
+
);
|
|
1463
|
+
protected readonly rows = computed(() => [...ORDERS].sort(this.current().compare));
|
|
1464
|
+
|
|
1465
|
+
protected format(total: number): string {
|
|
1466
|
+
return money.format(total);
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
```
|
|
1470
|
+
|
|
1471
|
+
### submenus.ts
|
|
1472
|
+
|
|
1473
|
+
Example
|
|
1474
|
+
|
|
1475
|
+
```ts
|
|
1476
|
+
import { Component, signal } from '@angular/core';
|
|
1477
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
1478
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
1479
|
+
import {
|
|
1480
|
+
SlMenu,
|
|
1481
|
+
SlMenuItem,
|
|
1482
|
+
SlMenuItemMeta,
|
|
1483
|
+
SlMenuRadioGroup,
|
|
1484
|
+
SlMenuSeparator,
|
|
1485
|
+
SlMenuTrigger,
|
|
1486
|
+
} from '@slotted/angular/menu';
|
|
1487
|
+
|
|
1488
|
+
const PEOPLE = ['Maria Chen', 'Tomás Ortega', 'Aiko Tanaka', 'Unassigned'];
|
|
1489
|
+
const WAREHOUSES = ['Rotterdam', 'Leipzig', 'Lyon', 'Gdańsk'];
|
|
1490
|
+
|
|
1491
|
+
@Component({
|
|
1492
|
+
selector: 'app-menu-submenus',
|
|
1493
|
+
imports: [
|
|
1494
|
+
SlButton,
|
|
1495
|
+
SlButtonEnd,
|
|
1496
|
+
SlGlyph,
|
|
1497
|
+
SlMenu,
|
|
1498
|
+
SlMenuItem,
|
|
1499
|
+
SlMenuItemMeta,
|
|
1500
|
+
SlMenuRadioGroup,
|
|
1501
|
+
SlMenuSeparator,
|
|
1502
|
+
SlMenuTrigger,
|
|
1503
|
+
],
|
|
1504
|
+
template: `
|
|
1505
|
+
<button slButton variant="outline" [slMenuTriggerFor]="order">
|
|
1506
|
+
SO-10482
|
|
1507
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
1508
|
+
</button>
|
|
1509
|
+
<sl-menu #order>
|
|
1510
|
+
<button slMenuItem>View order</button>
|
|
1511
|
+
<button slMenuItem [slMenuTriggerFor]="assign">
|
|
1512
|
+
Assign to <span slMenuItemMeta>{{ assignee() }}</span>
|
|
1513
|
+
</button>
|
|
1514
|
+
<sl-menu #assign>
|
|
1515
|
+
<sl-menu-radio-group [(value)]="assignee">
|
|
1516
|
+
@for (person of people; track person) {
|
|
1517
|
+
<button slMenuRadioItem [value]="person">{{ person }}</button>
|
|
1518
|
+
}
|
|
1519
|
+
</sl-menu-radio-group>
|
|
1520
|
+
</sl-menu>
|
|
1521
|
+
<button slMenuItem [slMenuTriggerFor]="move">Move to warehouse</button>
|
|
1522
|
+
<sl-menu #move>
|
|
1523
|
+
@for (warehouse of warehouses; track warehouse) {
|
|
1524
|
+
<button slMenuItem>{{ warehouse }}</button>
|
|
1525
|
+
}
|
|
1526
|
+
</sl-menu>
|
|
1527
|
+
<hr slMenuSeparator />
|
|
1528
|
+
<button slMenuItem tone="danger">Cancel order…</button>
|
|
1529
|
+
</sl-menu>
|
|
1530
|
+
`,
|
|
1531
|
+
})
|
|
1532
|
+
export class MenuSubmenus {
|
|
1533
|
+
protected readonly people = PEOPLE;
|
|
1534
|
+
protected readonly warehouses = WAREHOUSES;
|
|
1535
|
+
protected readonly assignee = signal<string | undefined>('Maria Chen');
|
|
1536
|
+
}
|
|
1537
|
+
```
|
|
1538
|
+
|
|
1539
|
+
### triggers.ts
|
|
1540
|
+
|
|
1541
|
+
Example
|
|
1542
|
+
|
|
1543
|
+
```ts
|
|
1544
|
+
import { Component } from '@angular/core';
|
|
1545
|
+
import { SlButton, SlButtonEnd, SlIconButton } from '@slotted/angular/button';
|
|
1546
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
1547
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
1548
|
+
import { SlMenu, SlMenuItem, SlMenuTrigger } from '@slotted/angular/menu';
|
|
1549
|
+
import {
|
|
1550
|
+
SlSplitButton,
|
|
1551
|
+
SlSplitButtonMenuTrigger,
|
|
1552
|
+
SlSplitButtonPrimary,
|
|
1553
|
+
} from '@slotted/angular/split-button';
|
|
1554
|
+
|
|
1555
|
+
@Component({
|
|
1556
|
+
selector: 'app-menu-triggers',
|
|
1557
|
+
imports: [
|
|
1558
|
+
SlButton,
|
|
1559
|
+
SlButtonEnd,
|
|
1560
|
+
SlGlyph,
|
|
1561
|
+
SlIconButton,
|
|
1562
|
+
SlInline,
|
|
1563
|
+
SlMenu,
|
|
1564
|
+
SlMenuItem,
|
|
1565
|
+
SlMenuTrigger,
|
|
1566
|
+
SlSplitButton,
|
|
1567
|
+
SlSplitButtonMenuTrigger,
|
|
1568
|
+
SlSplitButtonPrimary,
|
|
1569
|
+
],
|
|
1570
|
+
template: `
|
|
1571
|
+
<div slInline align="center" [gap]="3">
|
|
1572
|
+
<button slButton variant="outline" [slMenuTriggerFor]="exportMenu">
|
|
1573
|
+
Export
|
|
1574
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
1575
|
+
</button>
|
|
1576
|
+
<sl-menu #exportMenu>
|
|
1577
|
+
<button slMenuItem>CSV for spreadsheets</button>
|
|
1578
|
+
<button slMenuItem>PDF summary</button>
|
|
1579
|
+
<button slMenuItem>Accounting journal</button>
|
|
1580
|
+
</sl-menu>
|
|
1581
|
+
|
|
1582
|
+
<button slIconButton aria-label="More actions for SO-10482" [slMenuTriggerFor]="more">
|
|
1583
|
+
<svg slGlyph name="ellipsis"></svg>
|
|
1584
|
+
</button>
|
|
1585
|
+
<sl-menu #more align="end">
|
|
1586
|
+
<button slMenuItem>Copy order number</button>
|
|
1587
|
+
<button slMenuItem>Add internal note</button>
|
|
1588
|
+
<button slMenuItem>Open customer</button>
|
|
1589
|
+
</sl-menu>
|
|
1590
|
+
|
|
1591
|
+
<div slSplitButton>
|
|
1592
|
+
<button slSplitButtonPrimary>Ship order</button>
|
|
1593
|
+
<button
|
|
1594
|
+
slSplitButtonMenuTrigger
|
|
1595
|
+
aria-label="More ways to ship"
|
|
1596
|
+
[slMenuTriggerFor]="ship"
|
|
1597
|
+
></button>
|
|
1598
|
+
<sl-menu #ship>
|
|
1599
|
+
<button slMenuItem>Ship and print label</button>
|
|
1600
|
+
<button slMenuItem>Ship part of the order…</button>
|
|
1601
|
+
<button slMenuItem>Schedule for tomorrow</button>
|
|
1602
|
+
</sl-menu>
|
|
1603
|
+
</div>
|
|
1604
|
+
</div>
|
|
1605
|
+
`,
|
|
1606
|
+
})
|
|
1607
|
+
export class MenuTriggers {}
|
|
1608
|
+
```
|
|
1609
|
+
|
|
1610
|
+
### typeahead.ts
|
|
1611
|
+
|
|
1612
|
+
Example
|
|
1613
|
+
|
|
1614
|
+
```ts
|
|
1615
|
+
import { Component } from '@angular/core';
|
|
1616
|
+
import { SlButton, SlButtonEnd } from '@slotted/angular/button';
|
|
1617
|
+
import { SlGlyph } from '@slotted/angular/icon';
|
|
1618
|
+
import { SlMenu, SlMenuItem, SlMenuItemMeta, SlMenuTrigger } from '@slotted/angular/menu';
|
|
1619
|
+
|
|
1620
|
+
const CARRIERS = [
|
|
1621
|
+
{ name: 'DHL Express', transit: '1 day' },
|
|
1622
|
+
{ name: 'DPD', transit: '2 days' },
|
|
1623
|
+
{ name: 'FedEx', transit: '1 day' },
|
|
1624
|
+
{ name: 'GLS', transit: '3 days' },
|
|
1625
|
+
{ name: 'PostNL', transit: '2 days' },
|
|
1626
|
+
{ name: 'Royal Mail', transit: '3 days' },
|
|
1627
|
+
{ name: 'UPS', transit: '2 days' },
|
|
1628
|
+
{ name: 'USPS', transit: '5 days' },
|
|
1629
|
+
];
|
|
1630
|
+
|
|
1631
|
+
@Component({
|
|
1632
|
+
selector: 'app-menu-typeahead',
|
|
1633
|
+
imports: [SlButton, SlButtonEnd, SlGlyph, SlMenu, SlMenuItem, SlMenuItemMeta, SlMenuTrigger],
|
|
1634
|
+
template: `
|
|
1635
|
+
<button slButton variant="outline" [slMenuTriggerFor]="carrierMenu">
|
|
1636
|
+
Ship with
|
|
1637
|
+
<span slButtonEnd><svg slGlyph name="chevron-down"></svg></span>
|
|
1638
|
+
</button>
|
|
1639
|
+
<sl-menu #carrierMenu>
|
|
1640
|
+
@for (carrier of carriers; track carrier.name) {
|
|
1641
|
+
<button slMenuItem>
|
|
1642
|
+
{{ carrier.name }} <span slMenuItemMeta>{{ carrier.transit }}</span>
|
|
1643
|
+
</button>
|
|
1644
|
+
}
|
|
1645
|
+
</sl-menu>
|
|
1646
|
+
`,
|
|
1647
|
+
})
|
|
1648
|
+
export class MenuTypeahead {
|
|
1649
|
+
protected readonly carriers = CARRIERS;
|
|
1650
|
+
}
|
|
1651
|
+
```
|