@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
package/docs/wizard.md
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
<!-- index: ./index.md -->
|
|
2
|
+
# wizard
|
|
3
|
+
|
|
4
|
+
`data-ui="wizard"` · Multi-step form with validation per step.
|
|
5
|
+
|
|
6
|
+
## Import
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
import { SlWizard, SlWizardStep, SlWizardForm, SlWizardComplete, SlWizardEdit, provideWizardDefaults } from '@slotted/angular/wizard';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Selector: `[slWizard], ng-template[slWizardStep], form[slWizardForm], ng-template[slWizardComplete], ng-template[slWizardActions], button[slWizardEdit]` · exportAs: `slWizard`
|
|
13
|
+
|
|
14
|
+
## Minimal example
|
|
15
|
+
|
|
16
|
+
Excerpt — not a complete module
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<div slWizard [submitWizard]="open">
|
|
20
|
+
<ng-template slWizardStep="account" label="Account">
|
|
21
|
+
<form slForm slWizardForm [formGroup]="account">
|
|
22
|
+
<div slField>
|
|
23
|
+
<label slFieldLabel>Work email</label>
|
|
24
|
+
<div slTextField>
|
|
25
|
+
<input slTextFieldInput formControlName="email" type="email" />
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</form>
|
|
29
|
+
</ng-template>
|
|
30
|
+
<ng-template slWizardComplete>…</ng-template>
|
|
31
|
+
</div>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Anatomy
|
|
35
|
+
|
|
36
|
+
| Part | Element | Required |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| `root` | the element slWizard is on | yes |
|
|
39
|
+
| `layout` | div | yes |
|
|
40
|
+
| `progress` | div | no |
|
|
41
|
+
| `progress-toggle` | button | no |
|
|
42
|
+
| `progress-position` | span | no |
|
|
43
|
+
| `progress-track` | span | no |
|
|
44
|
+
| `progress-segment` | span | no |
|
|
45
|
+
| `main` | div | yes |
|
|
46
|
+
| `error` | div around an slAlert | no |
|
|
47
|
+
| `step` | div | yes |
|
|
48
|
+
| `step-header` | div | yes |
|
|
49
|
+
| `step-title` | h2, h3 or h4 | yes |
|
|
50
|
+
| `position` | span | yes |
|
|
51
|
+
| `optional` | span around an slTag | no |
|
|
52
|
+
| `step-description` | p | no |
|
|
53
|
+
| `actions` | div | yes |
|
|
54
|
+
| `actions-start` | div (slWizardActionsStart) | yes |
|
|
55
|
+
| `actions-end` | div (slWizardActionsEnd) | yes |
|
|
56
|
+
| `cancel` | button[slWizardCancel] | no |
|
|
57
|
+
| `save-draft` | button[slWizardSaveDraft] | no |
|
|
58
|
+
| `draft-status` | [slWizardDraftStatus] role="status" | no |
|
|
59
|
+
| `skip` | button[slWizardSkip] | no |
|
|
60
|
+
| `previous` | button[slWizardPrevious] | no |
|
|
61
|
+
| `next` | button[slWizardNext] | no |
|
|
62
|
+
| `submit` | button[slWizardNext] | no |
|
|
63
|
+
| `edit` | button[slWizardEdit] | no |
|
|
64
|
+
| `complete` | div | no |
|
|
65
|
+
| `skeleton` | div | no |
|
|
66
|
+
|
|
67
|
+
## Props
|
|
68
|
+
|
|
69
|
+
| Name | Type | Default | Applies to | Description |
|
|
70
|
+
| --- | --- | --- | --- | --- |
|
|
71
|
+
| `step` | `model<string \| undefined>` | — | slWizard | The current step’s name; [(step)] binds it |
|
|
72
|
+
| `defaultStep` | `string` | the first incomplete step | slWizard | Where an unbound wizard starts, read once and clamped |
|
|
73
|
+
| `value` | `model<WizardValue \| undefined>` | — | slWizard | The accepted answers; [(value)] binds it |
|
|
74
|
+
| `defaultValue` | `WizardValue` | {} | slWizard | The unbound answers, read once |
|
|
75
|
+
| `progressOpen` | `model<boolean>` | false | slWizard | Whether the compact list is open; [(progressOpen)] binds it |
|
|
76
|
+
| `defaultProgressOpen` | `boolean` | false | slWizard | Whether an unbound list starts open, read once |
|
|
77
|
+
| `progress` | `'start' \| 'top' \| 'none'` | start | slWizard, provideWizardDefaults | Where the list of steps stands |
|
|
78
|
+
| `scroll` | `'ancestor' \| 'self'` | ancestor | slWizard, provideWizardDefaults | self takes the height given and pins the actions |
|
|
79
|
+
| `linear` | `boolean` | true | slWizard, provideWizardDefaults | A step ahead is reached only once every step before it is complete |
|
|
80
|
+
| `level` | `2 \| 3 \| 4` | 2 | slWizard, provideWizardDefaults | The step heading’s level |
|
|
81
|
+
| `messages` | `PartialMessages<WizardMessages>` | — | slWizard | Words laid over the language in force, key by key: position, progress (the name of the list of steps), previous, next, submit, return, cancel, saveDraft, saving, saved with {time}, draftFailed, skip, optional, edit, incomplete, submitFailed, restoring |
|
|
82
|
+
| `error` | `string` | — | slWizard | An error of your own above the step |
|
|
83
|
+
| `disabled` | `boolean` | false | slWizard | Every action refused |
|
|
84
|
+
| `submitWizard` | `(values, request) => void \| WizardFailure \| Promise<…>` | — | slWizard | Called with the steps present once the last step is accepted |
|
|
85
|
+
| `persistence` | `WizardPersistence` | — | slWizard | load, save and clear; storagePersistence keeps drafts in Storage |
|
|
86
|
+
| `version` | `string \| number` | — | slWizard | A draft of another version is not restored |
|
|
87
|
+
| `autosave` | `'none' \| 'step'` | step with persistence | slWizard | step writes a draft after every accepted step |
|
|
88
|
+
| `guardUnsaved` | `boolean` | false | slWizard | A beforeunload guard while anything is unsubmitted |
|
|
89
|
+
| `cancellable` | `boolean` | false | slWizard | Shows the cancel action |
|
|
90
|
+
| `draftable` | `boolean` | false | slWizard | Shows save draft without persistence |
|
|
91
|
+
| `delay` | `number` | 200 | slWizard, provideWizardDefaults | How long a restore may take before its skeleton is drawn |
|
|
92
|
+
| `minDuration` | `number` | 400 | slWizard, provideWizardDefaults | How long a drawn skeleton stays |
|
|
93
|
+
| `slWizardStep` | `string` | — | ng-template[slWizardStep] | The step’s name |
|
|
94
|
+
| `label` | `string` | — | ng-template[slWizardStep] | The step’s name in the heading and the progress |
|
|
95
|
+
| `description` | `string` | — | ng-template[slWizardStep] | A sentence under the heading |
|
|
96
|
+
| `optional` | `boolean` | false | ng-template[slWizardStep] | Marked Optional, and skippable |
|
|
97
|
+
| `disabled` | `boolean` | false | ng-template[slWizardStep] | Out of reach and stepped over |
|
|
98
|
+
| `validate` | `WizardValidate` | — | ng-template[slWizardStep] | Runs after the group’s validators; errors by control name |
|
|
99
|
+
| `values` | `StepValues` | the group’s raw value | ng-template[slWizardStep] | Typed answers to accept instead |
|
|
100
|
+
| `template context` | `{ $implicit: values, values, name, complete, optional, errors }` | — | ng-template[slWizardStep] | errors is what a failed submission sent back, for the form’s [defaultErrors] |
|
|
101
|
+
| `slWizardEdit` | `string` | — | button[slWizardEdit] | The step to change and come back from |
|
|
102
|
+
| `exportAs slWizard` | `next, previous, goTo, edit, skip, saveDraft, clearDraft, reset, focus` | — | slWizard | The imperative moves, from a template reference |
|
|
103
|
+
|
|
104
|
+
## Events
|
|
105
|
+
|
|
106
|
+
| Name | Payload | When |
|
|
107
|
+
| --- | --- | --- |
|
|
108
|
+
| `stepChangeRequest` | `ChangeRequest<string> & { reason }` | Before the step moves: an accepted step or Enter (submit), a header or Back (pointer, keyboard), a clamp or a restore (programmatic). cancel() refuses it; otherwise step is written. |
|
|
109
|
+
| `valueChangeRequest` | `ChangeRequest<WizardValue> & { reason }` | Before the accepted answers move: a step accepted (submit), reset (clear), a restored draft (programmatic). |
|
|
110
|
+
| `progressOpenChangeRequest` | `ChangeRequest<boolean> & { reason }` | Before the compact list opens or closes: its bar (pointer, keyboard), a step chosen (select), Escape (escape). |
|
|
111
|
+
| `cancelRequest` | `{ dirty, source }` | When cancel is pressed. The family closes nothing. |
|
|
112
|
+
| `draftSave` | `{ snapshot, reason, source }` | When a draft is written, before persistence keeps it. |
|
|
113
|
+
| `completed` | `WizardValue` | After submitWizard accepted the submission. |
|
|
114
|
+
|
|
115
|
+
## Axes and defaults
|
|
116
|
+
|
|
117
|
+
| Axis | Values | Default |
|
|
118
|
+
| --- | --- | --- |
|
|
119
|
+
| `progress` | `start`, `top`, `none` | `start` |
|
|
120
|
+
| `scroll` | `ancestor`, `self` | `ancestor` |
|
|
121
|
+
| `level` | `2`, `3`, `4` | `2` |
|
|
122
|
+
| `autosave` | `none`, `step` | — |
|
|
123
|
+
|
|
124
|
+
## Rules
|
|
125
|
+
|
|
126
|
+
- No WAI-ARIA pattern names a wizard; the WAI Multi-page Forms tutorial is the source. The progress is the slStepper, an ordered list whose current header carries aria-current="step" and whose headers say their status.
|
|
127
|
+
- Every step change moves focus to the step’s heading, which starts with its position, so a reader hears “Step 2 of 4, Company”; focus is not moved on the first render.
|
|
128
|
+
- Each step’s form is the consumer’s form[slForm]: Enter in a text field submits it, Reactive Forms marks every control touched on a refused step, and the error summary takes focus.
|
|
129
|
+
- A failed submission shows an slAlert above the step and moves focus to it; an accepted one moves focus to the complete part. The draft status is a polite status.
|
|
130
|
+
- Back and a header behind the current step keep what was typed; a header ahead is reached only once the steps before it are complete, and stays in the tab order with aria-disabled until then.
|
|
131
|
+
|
|
132
|
+
## Tokens
|
|
133
|
+
|
|
134
|
+
`--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-border-color`, `--slotted-control-border-width`, `--slotted-control-gap-md`, `--slotted-control-height-lg`, `--slotted-control-padding-inline-md`, `--slotted-control-radius`, `--slotted-control-shadow`, `--slotted-control-shadow-focus-geometry`, `--slotted-control-surface`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-disabled-foreground`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-2xl`, `--slotted-font-size-md`, `--slotted-font-size-sm`, `--slotted-font-weight-medium`, `--slotted-font-weight-semibold`, `--slotted-line-height-2xl`, `--slotted-line-height-md`, `--slotted-line-height-sm`, `--slotted-page-ground`, `--slotted-radius-full`, `--slotted-radius-xs`, `--slotted-space-1`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-surface`, `--slotted-surface-sunken`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-border`, `--slotted-tone-accent-solid`, `--slotted-tone-accent-text`, `--slotted-tone-danger-solid`, `--slotted-tone-secondary-subtle-hover`, `--slotted-wizard-border`, `--slotted-wizard-edit-color`, `--slotted-wizard-gap`, `--slotted-wizard-header-gap`, `--slotted-wizard-progress-inline-size`, `--slotted-wizard-rhythm`, `--slotted-wizard-segment-color`, `--slotted-wizard-segment-color-complete`, `--slotted-wizard-segment-color-invalid`, `--slotted-wizard-toggle-active-background`, `--slotted-wizard-toggle-hover-border-color`
|
|
135
|
+
|
|
136
|
+
## Examples
|
|
137
|
+
|
|
138
|
+
### Where the progress stands
|
|
139
|
+
|
|
140
|
+
progress="start" is a column beside the step, "top" a row above it, "none" leaves the position in the heading alone.
|
|
141
|
+
|
|
142
|
+
Excerpt — not a complete module
|
|
143
|
+
|
|
144
|
+
```html
|
|
145
|
+
<div slWizard progress="top">…</div>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### A step refused, by Reactive Forms and by the server
|
|
149
|
+
|
|
150
|
+
The email is required, and validate asks the server whether it is taken: Next waits, the answer lands in the form’s summary, and the step turns red in the progress.
|
|
151
|
+
|
|
152
|
+
Excerpt — not a complete module
|
|
153
|
+
|
|
154
|
+
```html
|
|
155
|
+
<ng-template slWizardStep="account" label="Account" [validate]="emailFree">
|
|
156
|
+
<form slForm slWizardForm [formGroup]="account">…</form>
|
|
157
|
+
</ng-template>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Steps that depend on an answer
|
|
161
|
+
|
|
162
|
+
Choose Business and accept the step: a Company step appears after it. Choose Personal again and it leaves — its answers are kept and never submitted.
|
|
163
|
+
|
|
164
|
+
Excerpt — not a complete module
|
|
165
|
+
|
|
166
|
+
```html
|
|
167
|
+
<div slWizard [(value)]="value">
|
|
168
|
+
<ng-template slWizardStep="account" label="Account">…</ng-template>
|
|
169
|
+
@if (value()?.account?.type === 'business') {
|
|
170
|
+
<ng-template slWizardStep="company" label="Company">…</ng-template>
|
|
171
|
+
}
|
|
172
|
+
<ng-template slWizardStep="billing" label="Billing">…</ng-template>
|
|
173
|
+
</div>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### An optional step
|
|
177
|
+
|
|
178
|
+
The heading and the progress both say Optional; Skip accepts the step with no answers.
|
|
179
|
+
|
|
180
|
+
Excerpt — not a complete module
|
|
181
|
+
|
|
182
|
+
```html
|
|
183
|
+
<ng-template slWizardStep="invite" label="Invite teammates" optional> … </ng-template>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Review, change and come back
|
|
187
|
+
|
|
188
|
+
Change goes to the step and Next reads Save and return: accepting it comes back to the review.
|
|
189
|
+
|
|
190
|
+
Excerpt — not a complete module
|
|
191
|
+
|
|
192
|
+
```html
|
|
193
|
+
<dd slDescriptionListAction>
|
|
194
|
+
<button slWizardEdit="billing"></button>
|
|
195
|
+
</dd>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Submitting, failing and finishing
|
|
199
|
+
|
|
200
|
+
The first try is refused with the step and the field named: the wizard goes back to Account with the error above it. The second succeeds and the complete part takes focus.
|
|
201
|
+
|
|
202
|
+
Excerpt — not a complete module
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
const open: WizardSubmit = async (values) => {
|
|
206
|
+
const answer = await api.openAccount(values);
|
|
207
|
+
if (answer.error === 'email-taken') {
|
|
208
|
+
return { step: 'account', errors: { email: 'Taken since you started' } };
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Drafts, reload and a draft of another version
|
|
214
|
+
|
|
215
|
+
Save draft writes to sessionStorage and the status says when. Reload the page and the wizard opens where the draft left it; a slow store shows the step’s own skeleton meanwhile.
|
|
216
|
+
|
|
217
|
+
Excerpt — not a complete module
|
|
218
|
+
|
|
219
|
+
```html
|
|
220
|
+
<div slWizard [persistence]="drafts" [version]="3" guardUnsaved>…</div>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### The step in the address
|
|
224
|
+
|
|
225
|
+
A router binds step two-way. A link to a step past the work done is clamped to the first incomplete one.
|
|
226
|
+
|
|
227
|
+
Excerpt — not a complete module
|
|
228
|
+
|
|
229
|
+
```html
|
|
230
|
+
<div slWizard [(step)]="step" (stepChangeRequest)="navigate($event.value)">…</div>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### On a phone
|
|
234
|
+
|
|
235
|
+
Below 600 pixels the progress folds behind a bar that says the position; the actions stack.
|
|
236
|
+
|
|
237
|
+
Excerpt — not a complete module
|
|
238
|
+
|
|
239
|
+
```html
|
|
240
|
+
<div slWizard [(progressOpen)]="open">…</div>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Inside a layer
|
|
244
|
+
|
|
245
|
+
scroll="self" takes the height it is given: the step scrolls and the actions stay at the bottom.
|
|
246
|
+
|
|
247
|
+
Excerpt — not a complete module
|
|
248
|
+
|
|
249
|
+
```html
|
|
250
|
+
<div slWizard progress="none" scroll="self">…</div>
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Seven steps, in German
|
|
254
|
+
|
|
255
|
+
Long translated names wrap in the column and in the heading; the row of actions wraps before it squeezes a button.
|
|
256
|
+
|
|
257
|
+
Excerpt — not a complete module
|
|
258
|
+
|
|
259
|
+
```html
|
|
260
|
+
<ng-template slWizardStep="zahlung" label="Zahlungsinformationen und Rechnungsanschrift">
|
|
261
|
+
…
|
|
262
|
+
</ng-template>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Reactive Forms
|
|
266
|
+
|
|
267
|
+
The group lives in your component and keeps what was typed across steps; its raw value is the step’s answers, and a pending async validator holds Next.
|
|
268
|
+
|
|
269
|
+
Excerpt — not a complete module
|
|
270
|
+
|
|
271
|
+
```html
|
|
272
|
+
<form slForm slWizardForm [formGroup]="billing">
|
|
273
|
+
<input slTextFieldInput formControlName="city" />
|
|
274
|
+
</form>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Words for another product
|
|
278
|
+
|
|
279
|
+
Every word is a message; provideSlotted sets the language once, and a wizard lays its own words over it.
|
|
280
|
+
|
|
281
|
+
Excerpt — not a complete module
|
|
282
|
+
|
|
283
|
+
```ts
|
|
284
|
+
providers: [provideSlotted({ locale: 'pt-BR', catalogs: { 'pt-BR': PT_BR } })];
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### What a screen reader hears
|
|
288
|
+
|
|
289
|
+
Each step change moves focus to the heading, which says “Step 2 of 4, Company”; Enter in any text field submits the step.
|
|
290
|
+
|
|
291
|
+
Excerpt — not a complete module
|
|
292
|
+
|
|
293
|
+
```html
|
|
294
|
+
<div slWizard [messages]="{ progress: 'Account opening' }">…</div>
|
|
295
|
+
```
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { isHeldOpen, nextOpenValues, sameOpenValues } from '@slotted/core/disclosure';
|
|
2
|
+
import { createArrowNavigation } from '@slotted/core/focus';
|
|
3
|
+
import { createControllable } from '@slotted/core/state';
|
|
4
|
+
import * as i0 from '@angular/core';
|
|
5
|
+
import { InjectionToken, inject, Injectable, model, input, booleanAttribute, output, ElementRef, DestroyRef, computed, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
6
|
+
|
|
7
|
+
const FALLBACK = {
|
|
8
|
+
headingLevel: '3',
|
|
9
|
+
indicator: 'chevron',
|
|
10
|
+
loop: true,
|
|
11
|
+
mount: 'eager',
|
|
12
|
+
multiple: false,
|
|
13
|
+
requireOpen: false,
|
|
14
|
+
size: 'md',
|
|
15
|
+
togglePlacement: 'end',
|
|
16
|
+
truncate: false,
|
|
17
|
+
variant: 'ruled',
|
|
18
|
+
};
|
|
19
|
+
const ACCORDION_DEFAULTS = new InjectionToken('slotted accordion defaults', { providedIn: 'root', factory: () => FALLBACK });
|
|
20
|
+
/**
|
|
21
|
+
* An application decides once how its accordions look and behave, rather than
|
|
22
|
+
* repeating the same ten inputs on every set in a product. A set that states
|
|
23
|
+
* any of them itself still wins.
|
|
24
|
+
*/
|
|
25
|
+
function provideAccordionDefaults(defaults) {
|
|
26
|
+
return {
|
|
27
|
+
provide: ACCORDION_DEFAULTS,
|
|
28
|
+
useFactory: () => ({ ...FALLBACK, ...defaults }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** What an accordion renders as here, before it states anything of its own. */
|
|
32
|
+
function injectAccordionDefaults() {
|
|
33
|
+
return inject(ACCORDION_DEFAULTS);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Application-scoped rather than module-scoped, for the reason `field` records:
|
|
37
|
+
* a module-level counter produces colliding sequences when two applications
|
|
38
|
+
* render in one server process, and the server and the client sequences must
|
|
39
|
+
* match for hydration.
|
|
40
|
+
*/
|
|
41
|
+
class SlAccordionIdFactory {
|
|
42
|
+
count = 0;
|
|
43
|
+
next() {
|
|
44
|
+
this.count += 1;
|
|
45
|
+
return `slotted-collapsible-${this.count}`;
|
|
46
|
+
}
|
|
47
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlAccordionIdFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
48
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlAccordionIdFactory, providedIn: 'root' });
|
|
49
|
+
}
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlAccordionIdFactory, decorators: [{
|
|
51
|
+
type: Injectable,
|
|
52
|
+
args: [{ providedIn: 'root' }]
|
|
53
|
+
}] });
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The header of every item this set owns, and of no set nested inside it.
|
|
57
|
+
* `:scope` is what keeps a nested accordion's headers out of the outer one's
|
|
58
|
+
* arrow ring: root, item, header, trigger is exactly four levels.
|
|
59
|
+
*/
|
|
60
|
+
const ACCORDION_TRIGGER_SELECTOR = ':scope > * > [data-part="header"] > [data-part="trigger"]';
|
|
61
|
+
/** The variant the set hands its items, per variant the set is drawn in. */
|
|
62
|
+
const ITEM_VARIANT = {
|
|
63
|
+
plain: 'plain',
|
|
64
|
+
ruled: 'ruled',
|
|
65
|
+
framed: 'ruled',
|
|
66
|
+
separated: 'framed',
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* A set of disclosures that share a value.
|
|
70
|
+
*
|
|
71
|
+
* **The keyboard is the pattern's, plus four keys that are not.** `Enter`,
|
|
72
|
+
* `Space`, `Tab` and `Shift + Tab` are the platform's, and every header stays
|
|
73
|
+
* in the page tab sequence — `w3c/aria-practices#3434` removed the roving
|
|
74
|
+
* alternative from the pattern, and Base UI deprecated its own `loopFocus` and
|
|
75
|
+
* `orientation` in the same change. `ArrowDown`, `ArrowUp`, `Home` and `End`
|
|
76
|
+
* are shipped on top of that sequence, because Radix and Ark both ship them and
|
|
77
|
+
* readers have learned them; they move focus and write no `tabindex`.
|
|
78
|
+
*
|
|
79
|
+
* **`requireOpen` marks the header it holds.** The pattern asks an accordion
|
|
80
|
+
* that does not permit a panel to be collapsed to write `aria-disabled="true"`
|
|
81
|
+
* on that header, and the APG's own example is the only surveyed source that
|
|
82
|
+
* ships it.
|
|
83
|
+
*
|
|
84
|
+
* **The items are `collapsible`s, and nothing here selects into them.** The set
|
|
85
|
+
* hands each one its appearance as a value, which is the rule `checkbox-group`
|
|
86
|
+
* set for every group family in the library.
|
|
87
|
+
*/
|
|
88
|
+
class SlAccordion {
|
|
89
|
+
/** The set of open values. Two-way, so a template may bind it directly. */
|
|
90
|
+
value = model([], /* @ts-ignore */
|
|
91
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
92
|
+
multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
93
|
+
/**
|
|
94
|
+
* Whether the set refuses to empty. The one open header then carries
|
|
95
|
+
* `aria-disabled="true"`, which is what the pattern asks of an accordion that
|
|
96
|
+
* does not permit its panel to be collapsed.
|
|
97
|
+
*/
|
|
98
|
+
requireOpen = input(false, { ...(ngDevMode ? { debugName: "requireOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
99
|
+
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
100
|
+
size = input(undefined, /* @ts-ignore */
|
|
101
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
102
|
+
variant = input(undefined, /* @ts-ignore */
|
|
103
|
+
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
104
|
+
indicator = input(undefined, /* @ts-ignore */
|
|
105
|
+
...(ngDevMode ? [{ debugName: "indicator" }] : /* istanbul ignore next */ []));
|
|
106
|
+
togglePlacement = input(undefined, /* @ts-ignore */
|
|
107
|
+
...(ngDevMode ? [{ debugName: "togglePlacement" }] : /* istanbul ignore next */ []));
|
|
108
|
+
headingLevel = input(undefined, /* @ts-ignore */
|
|
109
|
+
...(ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []));
|
|
110
|
+
mount = input(undefined, /* @ts-ignore */
|
|
111
|
+
...(ngDevMode ? [{ debugName: "mount" }] : /* istanbul ignore next */ []));
|
|
112
|
+
truncate = input(undefined, { ...(ngDevMode ? { debugName: "truncate" } : /* istanbul ignore next */ {}), transform: (state) => (state === undefined ? undefined : booleanAttribute(state)) });
|
|
113
|
+
loop = input(undefined, { ...(ngDevMode ? { debugName: "loop" } : /* istanbul ignore next */ {}), transform: (state) => (state === undefined ? undefined : booleanAttribute(state)) });
|
|
114
|
+
/**
|
|
115
|
+
* One output for one transition, carrying the reason and the event. `value`
|
|
116
|
+
* is the two-way half the ecosystem expects; this is the half a boolean
|
|
117
|
+
* cannot say.
|
|
118
|
+
*/
|
|
119
|
+
valueChangeRequest = output();
|
|
120
|
+
defaults = injectAccordionDefaults();
|
|
121
|
+
host = inject(ElementRef).nativeElement;
|
|
122
|
+
destroyRef = inject(DestroyRef);
|
|
123
|
+
resolvedSize = computed(() => this.size() ?? this.defaults.size, /* @ts-ignore */
|
|
124
|
+
...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
|
|
125
|
+
resolvedVariant = computed(() => this.variant() ?? this.defaults.variant, /* @ts-ignore */
|
|
126
|
+
...(ngDevMode ? [{ debugName: "resolvedVariant" }] : /* istanbul ignore next */ []));
|
|
127
|
+
resolvedIndicator = computed(() => this.indicator() ?? this.defaults.indicator, /* @ts-ignore */
|
|
128
|
+
...(ngDevMode ? [{ debugName: "resolvedIndicator" }] : /* istanbul ignore next */ []));
|
|
129
|
+
resolvedTogglePlacement = computed(() => this.togglePlacement() ?? this.defaults.togglePlacement, /* @ts-ignore */
|
|
130
|
+
...(ngDevMode ? [{ debugName: "resolvedTogglePlacement" }] : /* istanbul ignore next */ []));
|
|
131
|
+
resolvedHeadingLevel = computed(() => this.headingLevel() ?? this.defaults.headingLevel, /* @ts-ignore */
|
|
132
|
+
...(ngDevMode ? [{ debugName: "resolvedHeadingLevel" }] : /* istanbul ignore next */ []));
|
|
133
|
+
resolvedMount = computed(() => this.mount() ?? this.defaults.mount, /* @ts-ignore */
|
|
134
|
+
...(ngDevMode ? [{ debugName: "resolvedMount" }] : /* istanbul ignore next */ []));
|
|
135
|
+
resolvedTruncate = computed(() => this.truncate() ?? this.defaults.truncate, /* @ts-ignore */
|
|
136
|
+
...(ngDevMode ? [{ debugName: "resolvedTruncate" }] : /* istanbul ignore next */ []));
|
|
137
|
+
resolvedLoop = computed(() => this.loop() ?? this.defaults.loop, /* @ts-ignore */
|
|
138
|
+
...(ngDevMode ? [{ debugName: "resolvedLoop" }] : /* istanbul ignore next */ []));
|
|
139
|
+
resolvedMultiple = computed(() => this.multiple() ?? this.defaults.multiple, /* @ts-ignore */
|
|
140
|
+
...(ngDevMode ? [{ debugName: "resolvedMultiple" }] : /* istanbul ignore next */ []));
|
|
141
|
+
resolvedRequireOpen = computed(() => this.requireOpen() ?? this.defaults.requireOpen, /* @ts-ignore */
|
|
142
|
+
...(ngDevMode ? [{ debugName: "resolvedRequireOpen" }] : /* istanbul ignore next */ []));
|
|
143
|
+
/** The variant this set hands each of its items, which is not always its own. */
|
|
144
|
+
itemVariant = computed(() => ITEM_VARIANT[this.resolvedVariant()], /* @ts-ignore */
|
|
145
|
+
...(ngDevMode ? [{ debugName: "itemVariant" }] : /* istanbul ignore next */ []));
|
|
146
|
+
constructor() {
|
|
147
|
+
/**
|
|
148
|
+
* The arrows move focus and nothing else. The engine writes no `tabindex`,
|
|
149
|
+
* which is the whole difference between it and the roving stop `tabs` uses.
|
|
150
|
+
*/
|
|
151
|
+
afterNextRender(() => {
|
|
152
|
+
const navigation = createArrowNavigation(this.host, {
|
|
153
|
+
itemSelector: ACCORDION_TRIGGER_SELECTOR,
|
|
154
|
+
loop: () => this.resolvedLoop(),
|
|
155
|
+
orientation: () => 'vertical',
|
|
156
|
+
});
|
|
157
|
+
const observer = new MutationObserver(() => navigation.refresh());
|
|
158
|
+
observer.observe(this.host, { childList: true, subtree: true });
|
|
159
|
+
this.destroyRef.onDestroy(() => {
|
|
160
|
+
observer.disconnect();
|
|
161
|
+
navigation.destroy();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
options() {
|
|
166
|
+
return { multiple: this.resolvedMultiple(), requireOpen: this.resolvedRequireOpen() };
|
|
167
|
+
}
|
|
168
|
+
/** Whether this value is one of the open ones. */
|
|
169
|
+
holds(value) {
|
|
170
|
+
return this.value().includes(value);
|
|
171
|
+
}
|
|
172
|
+
/** Whether this value is open and the set refuses to let it close. */
|
|
173
|
+
isHeld(value) {
|
|
174
|
+
return isHeldOpen(this.value(), value, this.options());
|
|
175
|
+
}
|
|
176
|
+
/** Asks the set to open or close one value. */
|
|
177
|
+
toggle(value, reason, source) {
|
|
178
|
+
const next = nextOpenValues(this.value(), value, this.options());
|
|
179
|
+
if (next === this.value())
|
|
180
|
+
return;
|
|
181
|
+
this.commit(next, reason, source);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Opens every item that is not disabled. It is Angular Material's `openAll`,
|
|
185
|
+
* and it is reached through `exportAs` rather than through a handle.
|
|
186
|
+
*/
|
|
187
|
+
openAll() {
|
|
188
|
+
const values = this.items()
|
|
189
|
+
.filter((item) => !item.hasAttribute('data-disabled'))
|
|
190
|
+
.map((item) => item.getAttribute('data-value') ?? '');
|
|
191
|
+
this.commit(this.resolvedMultiple() ? values : values.slice(0, 1), 'programmatic');
|
|
192
|
+
}
|
|
193
|
+
/** Closes every item, unless `requireOpen` holds the last one. */
|
|
194
|
+
closeAll() {
|
|
195
|
+
const current = this.value();
|
|
196
|
+
if (this.resolvedRequireOpen() && current.length > 0) {
|
|
197
|
+
this.commit(current.slice(0, 1), 'programmatic');
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
this.commit([], 'programmatic');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* The items, read from the DOM rather than from a registry. It is the one
|
|
204
|
+
* order that is never stale, and it is how `tabs` reads its own collection.
|
|
205
|
+
*/
|
|
206
|
+
items() {
|
|
207
|
+
return [...this.host.querySelectorAll(':scope > [data-value]')];
|
|
208
|
+
}
|
|
209
|
+
commit(next, reason, source) {
|
|
210
|
+
let cancelled = false;
|
|
211
|
+
const state = createControllable({
|
|
212
|
+
/* A `model` writes the change back itself, so the state is owned here and
|
|
213
|
+
the request is what a consumer inspects and may refuse. */
|
|
214
|
+
initial: this.value(),
|
|
215
|
+
/* Two arrays are never `Object.is`, so a set states its own equality or
|
|
216
|
+
emits a request on every change detection. */
|
|
217
|
+
equals: sameOpenValues,
|
|
218
|
+
onRequest: (request) => {
|
|
219
|
+
this.valueChangeRequest.emit(request);
|
|
220
|
+
cancelled = request.cancelled;
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
const moved = state.request(next, reason, source);
|
|
224
|
+
if (cancelled || !moved)
|
|
225
|
+
return;
|
|
226
|
+
this.value.set(next);
|
|
227
|
+
}
|
|
228
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlAccordion, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
229
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlAccordion, isStandalone: true, selector: "[slAccordion]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, requireOpen: { classPropertyName: "requireOpen", publicName: "requireOpen", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, indicator: { classPropertyName: "indicator", publicName: "indicator", isSignal: true, isRequired: false, transformFunction: null }, togglePlacement: { classPropertyName: "togglePlacement", publicName: "togglePlacement", isSignal: true, isRequired: false, transformFunction: null }, headingLevel: { classPropertyName: "headingLevel", publicName: "headingLevel", isSignal: true, isRequired: false, transformFunction: null }, mount: { classPropertyName: "mount", publicName: "mount", isSignal: true, isRequired: false, transformFunction: null }, truncate: { classPropertyName: "truncate", publicName: "truncate", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", valueChangeRequest: "valueChangeRequest" }, host: { attributes: { "data-ui": "accordion", "data-part": "root" }, properties: { "attr.data-size": "resolvedSize()", "attr.data-variant": "resolvedVariant()", "attr.data-disabled": "disabled() ? '' : null" } }, exportAs: ["slAccordion"], ngImport: i0, template: '<ng-content />', isInline: true, styles: ["@layer slotted.components{[data-ui=accordion]{--_rule-size: var(--slotted-border-width-thin, 1px);--_gap: var(--slotted-space-4, .5rem);display:grid;grid-auto-flow:row;grid-auto-rows:min-content;min-inline-size:0}[data-ui=accordion][data-size=sm]{--_gap: var(--slotted-space-3, .375rem)}[data-ui=accordion][data-size=lg]{--_gap: var(--slotted-space-5, .75rem)}[data-ui=accordion][data-variant=ruled]{border-block-end:var(--_rule-size) solid var(--slotted-accordion-rule-color, var(--slotted-border-subtle, ButtonBorder))}[data-ui=accordion][data-variant=framed]{background-color:var(--slotted-accordion-surface, var(--slotted-surface-raised, Canvas));border:var(--_rule-size) solid var(--slotted-accordion-rule-color, var(--slotted-border-subtle, ButtonBorder));border-radius:var(--slotted-accordion-radius, var(--slotted-radius-md, 6px));overflow:clip}[data-ui=accordion][data-variant=framed]>:first-child{border-block-start-color:transparent}[data-ui=accordion][data-variant=separated]{row-gap:var(--slotted-accordion-gap, var(--_gap))}[data-ui=accordion][data-disabled]{color:var(--slotted-disabled-foreground, GrayText)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
230
|
+
}
|
|
231
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlAccordion, decorators: [{
|
|
232
|
+
type: Component,
|
|
233
|
+
args: [{ selector: '[slAccordion]', standalone: true, exportAs: 'slAccordion', template: '<ng-content />', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
234
|
+
'data-ui': 'accordion',
|
|
235
|
+
'data-part': 'root',
|
|
236
|
+
'[attr.data-size]': 'resolvedSize()',
|
|
237
|
+
'[attr.data-variant]': 'resolvedVariant()',
|
|
238
|
+
'[attr.data-disabled]': "disabled() ? '' : null",
|
|
239
|
+
}, styles: ["@layer slotted.components{[data-ui=accordion]{--_rule-size: var(--slotted-border-width-thin, 1px);--_gap: var(--slotted-space-4, .5rem);display:grid;grid-auto-flow:row;grid-auto-rows:min-content;min-inline-size:0}[data-ui=accordion][data-size=sm]{--_gap: var(--slotted-space-3, .375rem)}[data-ui=accordion][data-size=lg]{--_gap: var(--slotted-space-5, .75rem)}[data-ui=accordion][data-variant=ruled]{border-block-end:var(--_rule-size) solid var(--slotted-accordion-rule-color, var(--slotted-border-subtle, ButtonBorder))}[data-ui=accordion][data-variant=framed]{background-color:var(--slotted-accordion-surface, var(--slotted-surface-raised, Canvas));border:var(--_rule-size) solid var(--slotted-accordion-rule-color, var(--slotted-border-subtle, ButtonBorder));border-radius:var(--slotted-accordion-radius, var(--slotted-radius-md, 6px));overflow:clip}[data-ui=accordion][data-variant=framed]>:first-child{border-block-start-color:transparent}[data-ui=accordion][data-variant=separated]{row-gap:var(--slotted-accordion-gap, var(--_gap))}[data-ui=accordion][data-disabled]{color:var(--slotted-disabled-foreground, GrayText)}}\n"] }]
|
|
240
|
+
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], requireOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "requireOpen", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], indicator: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicator", required: false }] }], togglePlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "togglePlacement", required: false }] }], headingLevel: [{ type: i0.Input, args: [{ isSignal: true, alias: "headingLevel", required: false }] }], mount: [{ type: i0.Input, args: [{ isSignal: true, alias: "mount", required: false }] }], truncate: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncate", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], valueChangeRequest: [{ type: i0.Output, args: ["valueChangeRequest"] }] } });
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Generated bundle index. Do not edit.
|
|
244
|
+
*/
|
|
245
|
+
|
|
246
|
+
export { ACCORDION_DEFAULTS, ACCORDION_TRIGGER_SELECTOR, SlAccordion, SlAccordionIdFactory, injectAccordionDefaults, provideAccordionDefaults };
|
|
247
|
+
//# sourceMappingURL=slotted-angular-accordion.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slotted-angular-accordion.mjs","sources":["../../accordion/src/accordion-defaults.ts","../../accordion/src/accordion.ts","../../accordion/src/slotted-angular-accordion.ts"],"sourcesContent":["import { inject, Injectable, InjectionToken } from '@angular/core';\n\n/** The type step the set and its items sit at. */\nexport type AccordionSize = 'sm' | 'md' | 'lg';\n\n/**\n * How the set is drawn. `plain` paints nothing, `ruled` puts one hairline per\n * seam, `framed` wraps the ruled set in one frame, and `separated` gives every\n * item a card of its own.\n */\nexport type AccordionVariant = 'plain' | 'ruled' | 'framed' | 'separated';\n\n/** The mark each header carries. Handed to every item. */\nexport type AccordionIndicator = 'chevron' | 'plus-minus' | 'none';\n\n/** Which side of the words that mark stands on. Handed to every item. */\nexport type AccordionTogglePlacement = 'end' | 'start';\n\n/**\n * The heading level every item's header answers to. `3` is the default, which\n * is the level the APG's own example uses for a set inside a section.\n */\nexport type AccordionHeadingLevel = 'none' | '1' | '2' | '3' | '4' | '5' | '6';\n\n/** When each panel's content exists. Handed to every item. */\nexport type AccordionMount = 'active' | 'lazy' | 'eager' | 'until-found';\n\n/** Why the set of open panels moved. */\nexport type AccordionSelectionReason = 'pointer' | 'keyboard' | 'select' | 'programmatic';\n\nexport interface AccordionDefaults {\n headingLevel: AccordionHeadingLevel;\n indicator: AccordionIndicator;\n loop: boolean;\n mount: AccordionMount;\n multiple: boolean;\n requireOpen: boolean;\n size: AccordionSize;\n togglePlacement: AccordionTogglePlacement;\n truncate: boolean;\n variant: AccordionVariant;\n}\n\nconst FALLBACK: AccordionDefaults = {\n headingLevel: '3',\n indicator: 'chevron',\n loop: true,\n mount: 'eager',\n multiple: false,\n requireOpen: false,\n size: 'md',\n togglePlacement: 'end',\n truncate: false,\n variant: 'ruled',\n};\n\nexport const ACCORDION_DEFAULTS = new InjectionToken<AccordionDefaults>(\n 'slotted accordion defaults',\n { providedIn: 'root', factory: () => FALLBACK },\n);\n\n/**\n * An application decides once how its accordions look and behave, rather than\n * repeating the same ten inputs on every set in a product. A set that states\n * any of them itself still wins.\n */\nexport function provideAccordionDefaults(defaults: Partial<AccordionDefaults>) {\n return {\n provide: ACCORDION_DEFAULTS,\n useFactory: (): AccordionDefaults => ({ ...FALLBACK, ...defaults }),\n };\n}\n\n/** What an accordion renders as here, before it states anything of its own. */\nexport function injectAccordionDefaults(): AccordionDefaults {\n return inject(ACCORDION_DEFAULTS);\n}\n\n/**\n * Application-scoped rather than module-scoped, for the reason `field` records:\n * a module-level counter produces colliding sequences when two applications\n * render in one server process, and the server and the client sequences must\n * match for hydration.\n */\n@Injectable({ providedIn: 'root' })\nexport class SlAccordionIdFactory {\n private count = 0;\n\n next() {\n this.count += 1;\n return `slotted-collapsible-${this.count}`;\n }\n}\n","import { isHeldOpen, nextOpenValues, sameOpenValues } from '@slotted/core/disclosure';\nimport { createArrowNavigation } from '@slotted/core/focus';\nimport { createControllable } from '@slotted/core/state';\nimport type { ChangeRequest } from '@slotted/core/state';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n model,\n output,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { ACCORDION_DEFAULTS, injectAccordionDefaults } from './accordion-defaults';\nimport type {\n AccordionHeadingLevel,\n AccordionIndicator,\n AccordionMount,\n AccordionSelectionReason,\n AccordionSize,\n AccordionTogglePlacement,\n AccordionVariant,\n} from './accordion-defaults';\n\nexport type {\n AccordionDefaults,\n AccordionHeadingLevel,\n AccordionIndicator,\n AccordionMount,\n AccordionSelectionReason,\n AccordionSize,\n AccordionTogglePlacement,\n AccordionVariant,\n} from './accordion-defaults';\n\n/**\n * The header of every item this set owns, and of no set nested inside it.\n * `:scope` is what keeps a nested accordion's headers out of the outer one's\n * arrow ring: root, item, header, trigger is exactly four levels.\n */\nexport const ACCORDION_TRIGGER_SELECTOR =\n ':scope > * > [data-part=\"header\"] > [data-part=\"trigger\"]';\n\n/** The variant the set hands its items, per variant the set is drawn in. */\nconst ITEM_VARIANT: Record<AccordionVariant, 'plain' | 'ruled' | 'framed'> = {\n plain: 'plain',\n ruled: 'ruled',\n framed: 'ruled',\n separated: 'framed',\n};\n\n/**\n * A set of disclosures that share a value.\n *\n * **The keyboard is the pattern's, plus four keys that are not.** `Enter`,\n * `Space`, `Tab` and `Shift + Tab` are the platform's, and every header stays\n * in the page tab sequence — `w3c/aria-practices#3434` removed the roving\n * alternative from the pattern, and Base UI deprecated its own `loopFocus` and\n * `orientation` in the same change. `ArrowDown`, `ArrowUp`, `Home` and `End`\n * are shipped on top of that sequence, because Radix and Ark both ship them and\n * readers have learned them; they move focus and write no `tabindex`.\n *\n * **`requireOpen` marks the header it holds.** The pattern asks an accordion\n * that does not permit a panel to be collapsed to write `aria-disabled=\"true\"`\n * on that header, and the APG's own example is the only surveyed source that\n * ships it.\n *\n * **The items are `collapsible`s, and nothing here selects into them.** The set\n * hands each one its appearance as a value, which is the rule `checkbox-group`\n * set for every group family in the library.\n */\n@Component({\n selector: '[slAccordion]',\n standalone: true,\n exportAs: 'slAccordion',\n template: '<ng-content />',\n styleUrl: '../../../styles/src/accordion/accordion.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'data-ui': 'accordion',\n 'data-part': 'root',\n '[attr.data-size]': 'resolvedSize()',\n '[attr.data-variant]': 'resolvedVariant()',\n '[attr.data-disabled]': \"disabled() ? '' : null\",\n },\n})\nexport class SlAccordion {\n /** The set of open values. Two-way, so a template may bind it directly. */\n readonly value = model<readonly string[]>([]);\n readonly multiple = input(false, { transform: booleanAttribute });\n /**\n * Whether the set refuses to empty. The one open header then carries\n * `aria-disabled=\"true\"`, which is what the pattern asks of an accordion that\n * does not permit its panel to be collapsed.\n */\n readonly requireOpen = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly size = input<AccordionSize | undefined>(undefined);\n readonly variant = input<AccordionVariant | undefined>(undefined);\n readonly indicator = input<AccordionIndicator | undefined>(undefined);\n readonly togglePlacement = input<AccordionTogglePlacement | undefined>(undefined);\n readonly headingLevel = input<AccordionHeadingLevel | undefined>(undefined);\n readonly mount = input<AccordionMount | undefined>(undefined);\n readonly truncate = input<boolean | undefined, boolean | string | undefined>(undefined, {\n transform: (state) => (state === undefined ? undefined : booleanAttribute(state)),\n });\n readonly loop = input<boolean | undefined, boolean | string | undefined>(undefined, {\n transform: (state) => (state === undefined ? undefined : booleanAttribute(state)),\n });\n\n /**\n * One output for one transition, carrying the reason and the event. `value`\n * is the two-way half the ecosystem expects; this is the half a boolean\n * cannot say.\n */\n readonly valueChangeRequest = output<ChangeRequest<readonly string[]>>();\n\n private readonly defaults = injectAccordionDefaults();\n private readonly host: HTMLElement = inject(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n\n readonly resolvedSize = computed(() => this.size() ?? this.defaults.size);\n readonly resolvedVariant = computed(() => this.variant() ?? this.defaults.variant);\n readonly resolvedIndicator = computed(() => this.indicator() ?? this.defaults.indicator);\n readonly resolvedTogglePlacement = computed(\n () => this.togglePlacement() ?? this.defaults.togglePlacement,\n );\n readonly resolvedHeadingLevel = computed(() => this.headingLevel() ?? this.defaults.headingLevel);\n readonly resolvedMount = computed(() => this.mount() ?? this.defaults.mount);\n readonly resolvedTruncate = computed(() => this.truncate() ?? this.defaults.truncate);\n readonly resolvedLoop = computed(() => this.loop() ?? this.defaults.loop);\n readonly resolvedMultiple = computed(() => this.multiple() ?? this.defaults.multiple);\n readonly resolvedRequireOpen = computed(() => this.requireOpen() ?? this.defaults.requireOpen);\n\n /** The variant this set hands each of its items, which is not always its own. */\n readonly itemVariant = computed(() => ITEM_VARIANT[this.resolvedVariant()]);\n\n constructor() {\n /**\n * The arrows move focus and nothing else. The engine writes no `tabindex`,\n * which is the whole difference between it and the roving stop `tabs` uses.\n */\n afterNextRender(() => {\n const navigation = createArrowNavigation(this.host, {\n itemSelector: ACCORDION_TRIGGER_SELECTOR,\n loop: () => this.resolvedLoop(),\n orientation: () => 'vertical',\n });\n const observer = new MutationObserver(() => navigation.refresh());\n observer.observe(this.host, { childList: true, subtree: true });\n\n this.destroyRef.onDestroy(() => {\n observer.disconnect();\n navigation.destroy();\n });\n });\n }\n\n private options() {\n return { multiple: this.resolvedMultiple(), requireOpen: this.resolvedRequireOpen() };\n }\n\n /** Whether this value is one of the open ones. */\n holds(value: string): boolean {\n return this.value().includes(value);\n }\n\n /** Whether this value is open and the set refuses to let it close. */\n isHeld(value: string): boolean {\n return isHeldOpen(this.value(), value, this.options());\n }\n\n /** Asks the set to open or close one value. */\n toggle(value: string, reason: AccordionSelectionReason, source?: Event) {\n const next = nextOpenValues(this.value(), value, this.options());\n if (next === this.value()) return;\n this.commit(next, reason, source);\n }\n\n /**\n * Opens every item that is not disabled. It is Angular Material's `openAll`,\n * and it is reached through `exportAs` rather than through a handle.\n */\n openAll() {\n const values = this.items()\n .filter((item) => !item.hasAttribute('data-disabled'))\n .map((item) => item.getAttribute('data-value') ?? '');\n this.commit(this.resolvedMultiple() ? values : values.slice(0, 1), 'programmatic');\n }\n\n /** Closes every item, unless `requireOpen` holds the last one. */\n closeAll() {\n const current = this.value();\n if (this.resolvedRequireOpen() && current.length > 0) {\n this.commit(current.slice(0, 1), 'programmatic');\n return;\n }\n this.commit([], 'programmatic');\n }\n\n /**\n * The items, read from the DOM rather than from a registry. It is the one\n * order that is never stale, and it is how `tabs` reads its own collection.\n */\n private items(): HTMLElement[] {\n return [...this.host.querySelectorAll<HTMLElement>(':scope > [data-value]')];\n }\n\n private commit(next: readonly string[], reason: AccordionSelectionReason, source?: Event) {\n let cancelled = false;\n const state = createControllable<readonly string[]>({\n /* A `model` writes the change back itself, so the state is owned here and\n the request is what a consumer inspects and may refuse. */\n initial: this.value(),\n /* Two arrays are never `Object.is`, so a set states its own equality or\n emits a request on every change detection. */\n equals: sameOpenValues,\n onRequest: (request) => {\n this.valueChangeRequest.emit(request);\n cancelled = request.cancelled;\n },\n });\n const moved = state.request(next, reason, source);\n if (cancelled || !moved) return;\n this.value.set(next);\n }\n}\n\nexport { ACCORDION_DEFAULTS, injectAccordionDefaults };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|