@slotted/angular 0.0.0-stage → 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +51 -2
- package/docs/AGENTS.snippet.md +10 -0
- package/docs/accordion.json +345 -0
- package/docs/accordion.md +207 -0
- package/docs/action-bar.json +421 -0
- package/docs/action-bar.md +364 -0
- package/docs/action-sheet.json +210 -0
- package/docs/action-sheet.md +19 -0
- package/docs/alert.json +407 -0
- package/docs/alert.md +239 -0
- package/docs/app-shell.examples.md +349 -0
- package/docs/app-shell.json +835 -0
- package/docs/app-shell.md +214 -0
- package/docs/aspect-ratio.json +159 -0
- package/docs/aspect-ratio.md +134 -0
- package/docs/attachment.json +486 -0
- package/docs/attachment.md +253 -0
- package/docs/avatar-group.json +208 -0
- package/docs/avatar-group.md +130 -0
- package/docs/avatar.json +342 -0
- package/docs/avatar.md +142 -0
- package/docs/badge.json +334 -0
- package/docs/badge.md +138 -0
- package/docs/breadcrumb.json +368 -0
- package/docs/breadcrumb.md +237 -0
- package/docs/button-group.json +158 -0
- package/docs/button-group.md +72 -0
- package/docs/button.examples.md +621 -0
- package/docs/button.json +977 -0
- package/docs/button.md +200 -0
- package/docs/calendar.json +592 -0
- package/docs/calendar.md +242 -0
- package/docs/card.json +283 -0
- package/docs/card.md +130 -0
- package/docs/carousel.json +560 -0
- package/docs/carousel.md +357 -0
- package/docs/cascader.json +933 -0
- package/docs/cascader.md +379 -0
- package/docs/chart.examples.md +582 -0
- package/docs/chart.json +1359 -0
- package/docs/chart.md +187 -0
- package/docs/checkbox-group.examples.md +612 -0
- package/docs/checkbox-group.json +395 -0
- package/docs/checkbox-group.md +106 -0
- package/docs/checkbox.examples.md +546 -0
- package/docs/checkbox.json +506 -0
- package/docs/checkbox.md +104 -0
- package/docs/code-block.json +616 -0
- package/docs/code-block.md +303 -0
- package/docs/collapsible.json +456 -0
- package/docs/collapsible.md +261 -0
- package/docs/color-picker.json +523 -0
- package/docs/color-picker.md +201 -0
- package/docs/column-manager.json +486 -0
- package/docs/column-manager.md +277 -0
- package/docs/combobox.examples.md +1732 -0
- package/docs/combobox.json +1250 -0
- package/docs/combobox.md +209 -0
- package/docs/command-palette.json +800 -0
- package/docs/command-palette.md +419 -0
- package/docs/container.json +156 -0
- package/docs/container.md +92 -0
- package/docs/context-menu.json +231 -0
- package/docs/context-menu.md +176 -0
- package/docs/currency-field.examples.md +321 -0
- package/docs/currency-field.json +649 -0
- package/docs/currency-field.md +128 -0
- package/docs/dashboard-grid.json +680 -0
- package/docs/dashboard-grid.md +265 -0
- package/docs/data-grid.examples.md +3064 -0
- package/docs/data-grid.json +1577 -0
- package/docs/data-grid.md +237 -0
- package/docs/data-grid.props.md +81 -0
- package/docs/data-list.json +685 -0
- package/docs/data-list.md +327 -0
- package/docs/date-field.json +490 -0
- package/docs/date-field.md +235 -0
- package/docs/date-picker.examples.md +1226 -0
- package/docs/date-picker.json +696 -0
- package/docs/date-picker.md +121 -0
- package/docs/date-range-picker.examples.md +1300 -0
- package/docs/date-range-picker.json +903 -0
- package/docs/date-range-picker.md +142 -0
- package/docs/datetime-field.json +665 -0
- package/docs/datetime-field.md +337 -0
- package/docs/datetime-picker.examples.md +1269 -0
- package/docs/datetime-picker.json +928 -0
- package/docs/datetime-picker.md +150 -0
- package/docs/datetime-range-picker.examples.md +225 -0
- package/docs/datetime-range-picker.json +1015 -0
- package/docs/datetime-range-picker.md +162 -0
- package/docs/description-list.json +471 -0
- package/docs/description-list.md +268 -0
- package/docs/detail-panel.json +530 -0
- package/docs/detail-panel.md +361 -0
- package/docs/dialog.examples.md +2467 -0
- package/docs/dialog.json +1141 -0
- package/docs/dialog.md +217 -0
- package/docs/dialog.props.md +63 -0
- package/docs/divider.json +148 -0
- package/docs/divider.md +83 -0
- package/docs/drawer.examples.md +1929 -0
- package/docs/drawer.json +753 -0
- package/docs/drawer.md +199 -0
- package/docs/entity-picker.json +946 -0
- package/docs/entity-picker.md +365 -0
- package/docs/event-calendar.examples.md +308 -0
- package/docs/event-calendar.json +1202 -0
- package/docs/event-calendar.md +201 -0
- package/docs/field-group.json +333 -0
- package/docs/field-group.md +181 -0
- package/docs/field.examples.md +676 -0
- package/docs/field.json +528 -0
- package/docs/field.md +127 -0
- package/docs/filter-bar.json +817 -0
- package/docs/filter-bar.md +380 -0
- package/docs/form.json +378 -0
- package/docs/form.md +235 -0
- package/docs/fullscreen.json +395 -0
- package/docs/fullscreen.md +225 -0
- package/docs/grid.json +176 -0
- package/docs/grid.md +74 -0
- package/docs/highlight.json +279 -0
- package/docs/highlight.md +210 -0
- package/docs/hover-card.json +254 -0
- package/docs/hover-card.md +213 -0
- package/docs/icon.json +173 -0
- package/docs/icon.md +101 -0
- package/docs/image.json +476 -0
- package/docs/image.md +254 -0
- package/docs/import-export-center.json +836 -0
- package/docs/import-export-center.md +345 -0
- package/docs/index.md +141 -0
- package/docs/inline-message.json +312 -0
- package/docs/inline-message.md +191 -0
- package/docs/inline.json +149 -0
- package/docs/inline.md +72 -0
- package/docs/kbd.json +350 -0
- package/docs/kbd.md +210 -0
- package/docs/link.json +264 -0
- package/docs/link.md +167 -0
- package/docs/list-item.json +463 -0
- package/docs/list-item.md +236 -0
- package/docs/list.json +321 -0
- package/docs/list.md +185 -0
- package/docs/listbox.json +807 -0
- package/docs/listbox.md +413 -0
- package/docs/loading-overlay.json +440 -0
- package/docs/loading-overlay.md +248 -0
- package/docs/markdown.json +461 -0
- package/docs/markdown.md +266 -0
- package/docs/menu.examples.md +1651 -0
- package/docs/menu.json +922 -0
- package/docs/menu.md +155 -0
- package/docs/menubar.json +292 -0
- package/docs/menubar.md +173 -0
- package/docs/message-scroller.json +401 -0
- package/docs/message-scroller.md +212 -0
- package/docs/message.json +862 -0
- package/docs/message.md +473 -0
- package/docs/multi-select.examples.md +1922 -0
- package/docs/multi-select.json +1314 -0
- package/docs/multi-select.md +213 -0
- package/docs/navigation-menu.json +529 -0
- package/docs/navigation-menu.md +329 -0
- package/docs/notification-center.json +664 -0
- package/docs/notification-center.md +372 -0
- package/docs/number-field.examples.md +1078 -0
- package/docs/number-field.json +668 -0
- package/docs/number-field.md +137 -0
- package/docs/otp-input.json +479 -0
- package/docs/otp-input.md +291 -0
- package/docs/page-header.json +574 -0
- package/docs/page-header.md +338 -0
- package/docs/page.json +332 -0
- package/docs/page.md +184 -0
- package/docs/pagination.json +434 -0
- package/docs/pagination.md +238 -0
- package/docs/popover.examples.md +1235 -0
- package/docs/popover.json +656 -0
- package/docs/popover.md +199 -0
- package/docs/progress-indicator.json +501 -0
- package/docs/progress-indicator.md +329 -0
- package/docs/prompt-composer.json +498 -0
- package/docs/prompt-composer.md +278 -0
- package/docs/prose.json +357 -0
- package/docs/prose.md +226 -0
- package/docs/radio-group.examples.md +626 -0
- package/docs/radio-group.json +541 -0
- package/docs/radio-group.md +112 -0
- package/docs/rating.json +1053 -0
- package/docs/rating.md +435 -0
- package/docs/result-state.json +376 -0
- package/docs/result-state.md +286 -0
- package/docs/saved-views.json +384 -0
- package/docs/saved-views.md +242 -0
- package/docs/scroll-area.json +120 -0
- package/docs/scroll-area.md +8 -0
- package/docs/section.json +344 -0
- package/docs/section.md +208 -0
- package/docs/segmented-control.json +429 -0
- package/docs/segmented-control.md +240 -0
- package/docs/select.examples.md +1214 -0
- package/docs/select.json +1147 -0
- package/docs/select.md +199 -0
- package/docs/side-navigation.json +632 -0
- package/docs/side-navigation.md +430 -0
- package/docs/skeleton.json +358 -0
- package/docs/skeleton.md +223 -0
- package/docs/slider.json +522 -0
- package/docs/slider.md +261 -0
- package/docs/sparkline.json +426 -0
- package/docs/sparkline.md +206 -0
- package/docs/split-button.json +361 -0
- package/docs/split-button.md +275 -0
- package/docs/splitter.json +142 -0
- package/docs/splitter.md +14 -0
- package/docs/stack.json +135 -0
- package/docs/stack.md +74 -0
- package/docs/stat-card.json +529 -0
- package/docs/stat-card.md +270 -0
- package/docs/status-indicator.json +314 -0
- package/docs/status-indicator.md +197 -0
- package/docs/stepper.json +451 -0
- package/docs/stepper.md +250 -0
- package/docs/switch.json +451 -0
- package/docs/switch.md +508 -0
- package/docs/table-of-contents.json +553 -0
- package/docs/table-of-contents.md +289 -0
- package/docs/table.examples.md +1981 -0
- package/docs/table.json +1059 -0
- package/docs/table.md +290 -0
- package/docs/tabs.examples.md +1370 -0
- package/docs/tabs.json +661 -0
- package/docs/tabs.md +211 -0
- package/docs/tag.json +813 -0
- package/docs/tag.md +241 -0
- package/docs/tags-input.json +771 -0
- package/docs/tags-input.md +361 -0
- package/docs/text-field.examples.md +821 -0
- package/docs/text-field.json +604 -0
- package/docs/text-field.md +125 -0
- package/docs/textarea.examples.md +612 -0
- package/docs/textarea.json +440 -0
- package/docs/textarea.md +98 -0
- package/docs/time-field.json +584 -0
- package/docs/time-field.md +291 -0
- package/docs/time-picker.json +679 -0
- package/docs/time-picker.md +315 -0
- package/docs/time-range-picker.examples.md +191 -0
- package/docs/time-range-picker.json +924 -0
- package/docs/time-range-picker.md +152 -0
- package/docs/timeline.json +839 -0
- package/docs/timeline.md +401 -0
- package/docs/toast.json +642 -0
- package/docs/toast.md +311 -0
- package/docs/toggle-group.json +417 -0
- package/docs/toggle-group.md +255 -0
- package/docs/toggle.json +326 -0
- package/docs/toggle.md +222 -0
- package/docs/toolbar.json +380 -0
- package/docs/toolbar.md +240 -0
- package/docs/tooltip.examples.md +664 -0
- package/docs/tooltip.json +604 -0
- package/docs/tooltip.md +146 -0
- package/docs/top-navigation.examples.md +287 -0
- package/docs/top-navigation.json +648 -0
- package/docs/top-navigation.md +138 -0
- package/docs/tour.json +759 -0
- package/docs/tour.md +337 -0
- package/docs/transfer.json +746 -0
- package/docs/transfer.md +273 -0
- package/docs/tree.json +918 -0
- package/docs/tree.md +397 -0
- package/docs/typography.json +317 -0
- package/docs/typography.md +107 -0
- package/docs/upload.examples.md +358 -0
- package/docs/upload.json +1103 -0
- package/docs/upload.md +166 -0
- package/docs/visually-hidden.json +71 -0
- package/docs/visually-hidden.md +42 -0
- package/docs/wizard.json +724 -0
- package/docs/wizard.md +295 -0
- package/fesm2022/slotted-angular-accordion.mjs +247 -0
- package/fesm2022/slotted-angular-accordion.mjs.map +1 -0
- package/fesm2022/slotted-angular-action-bar.mjs +639 -0
- package/fesm2022/slotted-angular-action-bar.mjs.map +1 -0
- package/fesm2022/slotted-angular-action-sheet.mjs +749 -0
- package/fesm2022/slotted-angular-action-sheet.mjs.map +1 -0
- package/fesm2022/slotted-angular-alert.mjs +427 -0
- package/fesm2022/slotted-angular-alert.mjs.map +1 -0
- package/fesm2022/slotted-angular-app-shell.mjs +1334 -0
- package/fesm2022/slotted-angular-app-shell.mjs.map +1 -0
- package/fesm2022/slotted-angular-aspect-ratio.mjs +63 -0
- package/fesm2022/slotted-angular-aspect-ratio.mjs.map +1 -0
- package/fesm2022/slotted-angular-attachment.mjs +595 -0
- package/fesm2022/slotted-angular-attachment.mjs.map +1 -0
- package/fesm2022/slotted-angular-avatar-group.mjs +230 -0
- package/fesm2022/slotted-angular-avatar-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-avatar.mjs +330 -0
- package/fesm2022/slotted-angular-avatar.mjs.map +1 -0
- package/fesm2022/slotted-angular-badge.mjs +255 -0
- package/fesm2022/slotted-angular-badge.mjs.map +1 -0
- package/fesm2022/slotted-angular-breadcrumb.mjs +544 -0
- package/fesm2022/slotted-angular-breadcrumb.mjs.map +1 -0
- package/fesm2022/slotted-angular-button-group.mjs +146 -0
- package/fesm2022/slotted-angular-button-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-button.mjs +692 -0
- package/fesm2022/slotted-angular-button.mjs.map +1 -0
- package/fesm2022/slotted-angular-calendar.mjs +916 -0
- package/fesm2022/slotted-angular-calendar.mjs.map +1 -0
- package/fesm2022/slotted-angular-card.mjs +225 -0
- package/fesm2022/slotted-angular-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-carousel.mjs +840 -0
- package/fesm2022/slotted-angular-carousel.mjs.map +1 -0
- package/fesm2022/slotted-angular-cascader.mjs +1839 -0
- package/fesm2022/slotted-angular-cascader.mjs.map +1 -0
- package/fesm2022/slotted-angular-chart.mjs +974 -0
- package/fesm2022/slotted-angular-chart.mjs.map +1 -0
- package/fesm2022/slotted-angular-checkbox-group.mjs +283 -0
- package/fesm2022/slotted-angular-checkbox-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-checkbox.mjs +468 -0
- package/fesm2022/slotted-angular-checkbox.mjs.map +1 -0
- package/fesm2022/slotted-angular-code-block.mjs +476 -0
- package/fesm2022/slotted-angular-code-block.mjs.map +1 -0
- package/fesm2022/slotted-angular-collapsible.mjs +479 -0
- package/fesm2022/slotted-angular-collapsible.mjs.map +1 -0
- package/fesm2022/slotted-angular-color-picker.mjs +910 -0
- package/fesm2022/slotted-angular-color-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-column-manager.mjs +1037 -0
- package/fesm2022/slotted-angular-column-manager.mjs.map +1 -0
- package/fesm2022/slotted-angular-combobox.mjs +1480 -0
- package/fesm2022/slotted-angular-combobox.mjs.map +1 -0
- package/fesm2022/slotted-angular-command-palette.mjs +1283 -0
- package/fesm2022/slotted-angular-command-palette.mjs.map +1 -0
- package/fesm2022/slotted-angular-container.mjs +105 -0
- package/fesm2022/slotted-angular-container.mjs.map +1 -0
- package/fesm2022/slotted-angular-context-menu.mjs +221 -0
- package/fesm2022/slotted-angular-context-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-currency-field.mjs +1131 -0
- package/fesm2022/slotted-angular-currency-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-dashboard-grid.mjs +1928 -0
- package/fesm2022/slotted-angular-dashboard-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-data-grid.mjs +6697 -0
- package/fesm2022/slotted-angular-data-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-data-list.mjs +1418 -0
- package/fesm2022/slotted-angular-data-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-field.mjs +772 -0
- package/fesm2022/slotted-angular-date-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-picker.mjs +690 -0
- package/fesm2022/slotted-angular-date-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-range-picker.mjs +1150 -0
- package/fesm2022/slotted-angular-date-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-field.mjs +1058 -0
- package/fesm2022/slotted-angular-datetime-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-picker.mjs +1362 -0
- package/fesm2022/slotted-angular-datetime-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-range-picker.mjs +1872 -0
- package/fesm2022/slotted-angular-datetime-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-description-list.mjs +545 -0
- package/fesm2022/slotted-angular-description-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-detail-panel.mjs +754 -0
- package/fesm2022/slotted-angular-detail-panel.mjs.map +1 -0
- package/fesm2022/slotted-angular-dialog.mjs +980 -0
- package/fesm2022/slotted-angular-dialog.mjs.map +1 -0
- package/fesm2022/slotted-angular-divider.mjs +76 -0
- package/fesm2022/slotted-angular-divider.mjs.map +1 -0
- package/fesm2022/slotted-angular-drawer.mjs +1397 -0
- package/fesm2022/slotted-angular-drawer.mjs.map +1 -0
- package/fesm2022/slotted-angular-entity-picker.mjs +1987 -0
- package/fesm2022/slotted-angular-entity-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-event-calendar.mjs +2934 -0
- package/fesm2022/slotted-angular-event-calendar.mjs.map +1 -0
- package/fesm2022/slotted-angular-field-group.mjs +301 -0
- package/fesm2022/slotted-angular-field-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-field.mjs +928 -0
- package/fesm2022/slotted-angular-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-filter-bar.mjs +3107 -0
- package/fesm2022/slotted-angular-filter-bar.mjs.map +1 -0
- package/fesm2022/slotted-angular-form.mjs +592 -0
- package/fesm2022/slotted-angular-form.mjs.map +1 -0
- package/fesm2022/slotted-angular-fullscreen.mjs +314 -0
- package/fesm2022/slotted-angular-fullscreen.mjs.map +1 -0
- package/fesm2022/slotted-angular-grid.mjs +58 -0
- package/fesm2022/slotted-angular-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-highlight.mjs +123 -0
- package/fesm2022/slotted-angular-highlight.mjs.map +1 -0
- package/fesm2022/slotted-angular-hover-card.mjs +326 -0
- package/fesm2022/slotted-angular-hover-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-i18n.mjs +75 -0
- package/fesm2022/slotted-angular-i18n.mjs.map +1 -0
- package/fesm2022/slotted-angular-icon.mjs +232 -0
- package/fesm2022/slotted-angular-icon.mjs.map +1 -0
- package/fesm2022/slotted-angular-image.mjs +442 -0
- package/fesm2022/slotted-angular-image.mjs.map +1 -0
- package/fesm2022/slotted-angular-import-export-center.mjs +1792 -0
- package/fesm2022/slotted-angular-import-export-center.mjs.map +1 -0
- package/fesm2022/slotted-angular-inline-message.mjs +280 -0
- package/fesm2022/slotted-angular-inline-message.mjs.map +1 -0
- package/fesm2022/slotted-angular-inline.mjs +52 -0
- package/fesm2022/slotted-angular-inline.mjs.map +1 -0
- package/fesm2022/slotted-angular-kbd.mjs +284 -0
- package/fesm2022/slotted-angular-kbd.mjs.map +1 -0
- package/fesm2022/slotted-angular-link.mjs +182 -0
- package/fesm2022/slotted-angular-link.mjs.map +1 -0
- package/fesm2022/slotted-angular-list-item.mjs +367 -0
- package/fesm2022/slotted-angular-list-item.mjs.map +1 -0
- package/fesm2022/slotted-angular-list.mjs +256 -0
- package/fesm2022/slotted-angular-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-listbox.mjs +1274 -0
- package/fesm2022/slotted-angular-listbox.mjs.map +1 -0
- package/fesm2022/slotted-angular-loading-overlay.mjs +451 -0
- package/fesm2022/slotted-angular-loading-overlay.mjs.map +1 -0
- package/fesm2022/slotted-angular-markdown.mjs +914 -0
- package/fesm2022/slotted-angular-markdown.mjs.map +1 -0
- package/fesm2022/slotted-angular-menu.mjs +1211 -0
- package/fesm2022/slotted-angular-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-menubar.mjs +230 -0
- package/fesm2022/slotted-angular-menubar.mjs.map +1 -0
- package/fesm2022/slotted-angular-message-scroller.mjs +378 -0
- package/fesm2022/slotted-angular-message-scroller.mjs.map +1 -0
- package/fesm2022/slotted-angular-message.mjs +866 -0
- package/fesm2022/slotted-angular-message.mjs.map +1 -0
- package/fesm2022/slotted-angular-multi-select.mjs +1939 -0
- package/fesm2022/slotted-angular-multi-select.mjs.map +1 -0
- package/fesm2022/slotted-angular-navigation-menu.mjs +770 -0
- package/fesm2022/slotted-angular-navigation-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-notification-center.mjs +1172 -0
- package/fesm2022/slotted-angular-notification-center.mjs.map +1 -0
- package/fesm2022/slotted-angular-number-field.mjs +966 -0
- package/fesm2022/slotted-angular-number-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-otp-input.mjs +629 -0
- package/fesm2022/slotted-angular-otp-input.mjs.map +1 -0
- package/fesm2022/slotted-angular-page-header.mjs +788 -0
- package/fesm2022/slotted-angular-page-header.mjs.map +1 -0
- package/fesm2022/slotted-angular-page.mjs +255 -0
- package/fesm2022/slotted-angular-page.mjs.map +1 -0
- package/fesm2022/slotted-angular-pagination.mjs +562 -0
- package/fesm2022/slotted-angular-pagination.mjs.map +1 -0
- package/fesm2022/slotted-angular-popover.mjs +799 -0
- package/fesm2022/slotted-angular-popover.mjs.map +1 -0
- package/fesm2022/slotted-angular-progress-indicator.mjs +572 -0
- package/fesm2022/slotted-angular-progress-indicator.mjs.map +1 -0
- package/fesm2022/slotted-angular-prompt-composer.mjs +596 -0
- package/fesm2022/slotted-angular-prompt-composer.mjs.map +1 -0
- package/fesm2022/slotted-angular-prose.mjs +314 -0
- package/fesm2022/slotted-angular-prose.mjs.map +1 -0
- package/fesm2022/slotted-angular-radio-group.mjs +469 -0
- package/fesm2022/slotted-angular-radio-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-rating.mjs +1174 -0
- package/fesm2022/slotted-angular-rating.mjs.map +1 -0
- package/fesm2022/slotted-angular-result-state.mjs +330 -0
- package/fesm2022/slotted-angular-result-state.mjs.map +1 -0
- package/fesm2022/slotted-angular-saved-views.mjs +877 -0
- package/fesm2022/slotted-angular-saved-views.mjs.map +1 -0
- package/fesm2022/slotted-angular-scroll-area.mjs +294 -0
- package/fesm2022/slotted-angular-scroll-area.mjs.map +1 -0
- package/fesm2022/slotted-angular-section.mjs +266 -0
- package/fesm2022/slotted-angular-section.mjs.map +1 -0
- package/fesm2022/slotted-angular-segmented-control.mjs +454 -0
- package/fesm2022/slotted-angular-segmented-control.mjs.map +1 -0
- package/fesm2022/slotted-angular-select.mjs +1899 -0
- package/fesm2022/slotted-angular-select.mjs.map +1 -0
- package/fesm2022/slotted-angular-side-navigation.mjs +1042 -0
- package/fesm2022/slotted-angular-side-navigation.mjs.map +1 -0
- package/fesm2022/slotted-angular-skeleton.mjs +316 -0
- package/fesm2022/slotted-angular-skeleton.mjs.map +1 -0
- package/fesm2022/slotted-angular-slider.mjs +586 -0
- package/fesm2022/slotted-angular-slider.mjs.map +1 -0
- package/fesm2022/slotted-angular-sparkline.mjs +235 -0
- package/fesm2022/slotted-angular-sparkline.mjs.map +1 -0
- package/fesm2022/slotted-angular-split-button.mjs +331 -0
- package/fesm2022/slotted-angular-split-button.mjs.map +1 -0
- package/fesm2022/slotted-angular-splitter.mjs +516 -0
- package/fesm2022/slotted-angular-splitter.mjs.map +1 -0
- package/fesm2022/slotted-angular-stack.mjs +48 -0
- package/fesm2022/slotted-angular-stack.mjs.map +1 -0
- package/fesm2022/slotted-angular-stat-card.mjs +478 -0
- package/fesm2022/slotted-angular-stat-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-status-indicator.mjs +155 -0
- package/fesm2022/slotted-angular-status-indicator.mjs.map +1 -0
- package/fesm2022/slotted-angular-stepper.mjs +536 -0
- package/fesm2022/slotted-angular-stepper.mjs.map +1 -0
- package/fesm2022/slotted-angular-switch.mjs +447 -0
- package/fesm2022/slotted-angular-switch.mjs.map +1 -0
- package/fesm2022/slotted-angular-table-of-contents.mjs +750 -0
- package/fesm2022/slotted-angular-table-of-contents.mjs.map +1 -0
- package/fesm2022/slotted-angular-table.mjs +2518 -0
- package/fesm2022/slotted-angular-table.mjs.map +1 -0
- package/fesm2022/slotted-angular-tabs.mjs +829 -0
- package/fesm2022/slotted-angular-tabs.mjs.map +1 -0
- package/fesm2022/slotted-angular-tag.mjs +595 -0
- package/fesm2022/slotted-angular-tag.mjs.map +1 -0
- package/fesm2022/slotted-angular-tags-input.mjs +1211 -0
- package/fesm2022/slotted-angular-tags-input.mjs.map +1 -0
- package/fesm2022/slotted-angular-text-field.mjs +674 -0
- package/fesm2022/slotted-angular-text-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-textarea.mjs +275 -0
- package/fesm2022/slotted-angular-textarea.mjs.map +1 -0
- package/fesm2022/slotted-angular-theme.mjs +45 -0
- package/fesm2022/slotted-angular-theme.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-field.mjs +895 -0
- package/fesm2022/slotted-angular-time-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-picker.mjs +856 -0
- package/fesm2022/slotted-angular-time-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-range-picker.mjs +1534 -0
- package/fesm2022/slotted-angular-time-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-timeline.mjs +928 -0
- package/fesm2022/slotted-angular-timeline.mjs.map +1 -0
- package/fesm2022/slotted-angular-toast.mjs +917 -0
- package/fesm2022/slotted-angular-toast.mjs.map +1 -0
- package/fesm2022/slotted-angular-toggle-group.mjs +311 -0
- package/fesm2022/slotted-angular-toggle-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-toggle.mjs +162 -0
- package/fesm2022/slotted-angular-toggle.mjs.map +1 -0
- package/fesm2022/slotted-angular-toolbar.mjs +536 -0
- package/fesm2022/slotted-angular-toolbar.mjs.map +1 -0
- package/fesm2022/slotted-angular-tooltip.mjs +798 -0
- package/fesm2022/slotted-angular-tooltip.mjs.map +1 -0
- package/fesm2022/slotted-angular-top-navigation.mjs +1308 -0
- package/fesm2022/slotted-angular-top-navigation.mjs.map +1 -0
- package/fesm2022/slotted-angular-tour.mjs +1330 -0
- package/fesm2022/slotted-angular-tour.mjs.map +1 -0
- package/fesm2022/slotted-angular-transfer.mjs +1406 -0
- package/fesm2022/slotted-angular-transfer.mjs.map +1 -0
- package/fesm2022/slotted-angular-tree.mjs +1448 -0
- package/fesm2022/slotted-angular-tree.mjs.map +1 -0
- package/fesm2022/slotted-angular-typography.mjs +184 -0
- package/fesm2022/slotted-angular-typography.mjs.map +1 -0
- package/fesm2022/slotted-angular-upload.mjs +1523 -0
- package/fesm2022/slotted-angular-upload.mjs.map +1 -0
- package/fesm2022/slotted-angular-visually-hidden.mjs +32 -0
- package/fesm2022/slotted-angular-visually-hidden.mjs.map +1 -0
- package/fesm2022/slotted-angular-wizard.mjs +1715 -0
- package/fesm2022/slotted-angular-wizard.mjs.map +1 -0
- package/fesm2022/slotted-angular.mjs +4 -0
- package/fesm2022/slotted-angular.mjs.map +1 -0
- package/package.json +537 -3
- package/types/slotted-angular-accordion.d.ts +156 -0
- package/types/slotted-angular-accordion.d.ts.map +1 -0
- package/types/slotted-angular-action-bar.d.ts +291 -0
- package/types/slotted-angular-action-bar.d.ts.map +1 -0
- package/types/slotted-angular-action-sheet.d.ts +294 -0
- package/types/slotted-angular-action-sheet.d.ts.map +1 -0
- package/types/slotted-angular-alert.d.ts +214 -0
- package/types/slotted-angular-alert.d.ts.map +1 -0
- package/types/slotted-angular-app-shell.d.ts +549 -0
- package/types/slotted-angular-app-shell.d.ts.map +1 -0
- package/types/slotted-angular-aspect-ratio.d.ts +57 -0
- package/types/slotted-angular-aspect-ratio.d.ts.map +1 -0
- package/types/slotted-angular-attachment.d.ts +294 -0
- package/types/slotted-angular-attachment.d.ts.map +1 -0
- package/types/slotted-angular-avatar-group.d.ts +119 -0
- package/types/slotted-angular-avatar-group.d.ts.map +1 -0
- package/types/slotted-angular-avatar.d.ts +202 -0
- package/types/slotted-angular-avatar.d.ts.map +1 -0
- package/types/slotted-angular-badge.d.ts +166 -0
- package/types/slotted-angular-badge.d.ts.map +1 -0
- package/types/slotted-angular-breadcrumb.d.ts +251 -0
- package/types/slotted-angular-breadcrumb.d.ts.map +1 -0
- package/types/slotted-angular-button-group.d.ts +89 -0
- package/types/slotted-angular-button-group.d.ts.map +1 -0
- package/types/slotted-angular-button.d.ts +390 -0
- package/types/slotted-angular-button.d.ts.map +1 -0
- package/types/slotted-angular-calendar.d.ts +280 -0
- package/types/slotted-angular-calendar.d.ts.map +1 -0
- package/types/slotted-angular-card.d.ts +140 -0
- package/types/slotted-angular-card.d.ts.map +1 -0
- package/types/slotted-angular-carousel.d.ts +288 -0
- package/types/slotted-angular-carousel.d.ts.map +1 -0
- package/types/slotted-angular-cascader.d.ts +351 -0
- package/types/slotted-angular-cascader.d.ts.map +1 -0
- package/types/slotted-angular-chart.d.ts +319 -0
- package/types/slotted-angular-chart.d.ts.map +1 -0
- package/types/slotted-angular-checkbox-group.d.ts +156 -0
- package/types/slotted-angular-checkbox-group.d.ts.map +1 -0
- package/types/slotted-angular-checkbox.d.ts +197 -0
- package/types/slotted-angular-checkbox.d.ts.map +1 -0
- package/types/slotted-angular-code-block.d.ts +158 -0
- package/types/slotted-angular-code-block.d.ts.map +1 -0
- package/types/slotted-angular-collapsible.d.ts +272 -0
- package/types/slotted-angular-collapsible.d.ts.map +1 -0
- package/types/slotted-angular-color-picker.d.ts +181 -0
- package/types/slotted-angular-color-picker.d.ts.map +1 -0
- package/types/slotted-angular-column-manager.d.ts +200 -0
- package/types/slotted-angular-column-manager.d.ts.map +1 -0
- package/types/slotted-angular-combobox.d.ts +449 -0
- package/types/slotted-angular-combobox.d.ts.map +1 -0
- package/types/slotted-angular-command-palette.d.ts +256 -0
- package/types/slotted-angular-command-palette.d.ts.map +1 -0
- package/types/slotted-angular-container.d.ts +84 -0
- package/types/slotted-angular-container.d.ts.map +1 -0
- package/types/slotted-angular-context-menu.d.ts +84 -0
- package/types/slotted-angular-context-menu.d.ts.map +1 -0
- package/types/slotted-angular-currency-field.d.ts +480 -0
- package/types/slotted-angular-currency-field.d.ts.map +1 -0
- package/types/slotted-angular-dashboard-grid.d.ts +341 -0
- package/types/slotted-angular-dashboard-grid.d.ts.map +1 -0
- package/types/slotted-angular-data-grid.d.ts +1077 -0
- package/types/slotted-angular-data-grid.d.ts.map +1 -0
- package/types/slotted-angular-data-list.d.ts +272 -0
- package/types/slotted-angular-data-list.d.ts.map +1 -0
- package/types/slotted-angular-date-field.d.ts +320 -0
- package/types/slotted-angular-date-field.d.ts.map +1 -0
- package/types/slotted-angular-date-picker.d.ts +224 -0
- package/types/slotted-angular-date-picker.d.ts.map +1 -0
- package/types/slotted-angular-date-range-picker.d.ts +310 -0
- package/types/slotted-angular-date-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-datetime-field.d.ts +362 -0
- package/types/slotted-angular-datetime-field.d.ts.map +1 -0
- package/types/slotted-angular-datetime-picker.d.ts +370 -0
- package/types/slotted-angular-datetime-picker.d.ts.map +1 -0
- package/types/slotted-angular-datetime-range-picker.d.ts +459 -0
- package/types/slotted-angular-datetime-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-description-list.d.ts +281 -0
- package/types/slotted-angular-description-list.d.ts.map +1 -0
- package/types/slotted-angular-detail-panel.d.ts +240 -0
- package/types/slotted-angular-detail-panel.d.ts.map +1 -0
- package/types/slotted-angular-dialog.d.ts +497 -0
- package/types/slotted-angular-dialog.d.ts.map +1 -0
- package/types/slotted-angular-divider.d.ts +40 -0
- package/types/slotted-angular-divider.d.ts.map +1 -0
- package/types/slotted-angular-drawer.d.ts +532 -0
- package/types/slotted-angular-drawer.d.ts.map +1 -0
- package/types/slotted-angular-entity-picker.d.ts +338 -0
- package/types/slotted-angular-entity-picker.d.ts.map +1 -0
- package/types/slotted-angular-event-calendar.d.ts +574 -0
- package/types/slotted-angular-event-calendar.d.ts.map +1 -0
- package/types/slotted-angular-field-group.d.ts +152 -0
- package/types/slotted-angular-field-group.d.ts.map +1 -0
- package/types/slotted-angular-field.d.ts +535 -0
- package/types/slotted-angular-field.d.ts.map +1 -0
- package/types/slotted-angular-filter-bar.d.ts +573 -0
- package/types/slotted-angular-filter-bar.d.ts.map +1 -0
- package/types/slotted-angular-form.d.ts +298 -0
- package/types/slotted-angular-form.d.ts.map +1 -0
- package/types/slotted-angular-fullscreen.d.ts +145 -0
- package/types/slotted-angular-fullscreen.d.ts.map +1 -0
- package/types/slotted-angular-grid.d.ts +50 -0
- package/types/slotted-angular-grid.d.ts.map +1 -0
- package/types/slotted-angular-highlight.d.ts +93 -0
- package/types/slotted-angular-highlight.d.ts.map +1 -0
- package/types/slotted-angular-hover-card.d.ts +140 -0
- package/types/slotted-angular-hover-card.d.ts.map +1 -0
- package/types/slotted-angular-i18n.d.ts +46 -0
- package/types/slotted-angular-i18n.d.ts.map +1 -0
- package/types/slotted-angular-icon.d.ts +94 -0
- package/types/slotted-angular-icon.d.ts.map +1 -0
- package/types/slotted-angular-image.d.ts +251 -0
- package/types/slotted-angular-image.d.ts.map +1 -0
- package/types/slotted-angular-import-export-center.d.ts +351 -0
- package/types/slotted-angular-import-export-center.d.ts.map +1 -0
- package/types/slotted-angular-inline-message.d.ts +195 -0
- package/types/slotted-angular-inline-message.d.ts.map +1 -0
- package/types/slotted-angular-inline.d.ts +41 -0
- package/types/slotted-angular-inline.d.ts.map +1 -0
- package/types/slotted-angular-kbd.d.ts +174 -0
- package/types/slotted-angular-kbd.d.ts.map +1 -0
- package/types/slotted-angular-link.d.ts +94 -0
- package/types/slotted-angular-link.d.ts.map +1 -0
- package/types/slotted-angular-list-item.d.ts +210 -0
- package/types/slotted-angular-list-item.d.ts.map +1 -0
- package/types/slotted-angular-list.d.ts +176 -0
- package/types/slotted-angular-list.d.ts.map +1 -0
- package/types/slotted-angular-listbox.d.ts +470 -0
- package/types/slotted-angular-listbox.d.ts.map +1 -0
- package/types/slotted-angular-loading-overlay.d.ts +219 -0
- package/types/slotted-angular-loading-overlay.d.ts.map +1 -0
- package/types/slotted-angular-markdown.d.ts +172 -0
- package/types/slotted-angular-markdown.d.ts.map +1 -0
- package/types/slotted-angular-menu.d.ts +448 -0
- package/types/slotted-angular-menu.d.ts.map +1 -0
- package/types/slotted-angular-menubar.d.ts +90 -0
- package/types/slotted-angular-menubar.d.ts.map +1 -0
- package/types/slotted-angular-message-scroller.d.ts +151 -0
- package/types/slotted-angular-message-scroller.d.ts.map +1 -0
- package/types/slotted-angular-message.d.ts +348 -0
- package/types/slotted-angular-message.d.ts.map +1 -0
- package/types/slotted-angular-multi-select.d.ts +462 -0
- package/types/slotted-angular-multi-select.d.ts.map +1 -0
- package/types/slotted-angular-navigation-menu.d.ts +309 -0
- package/types/slotted-angular-navigation-menu.d.ts.map +1 -0
- package/types/slotted-angular-notification-center.d.ts +318 -0
- package/types/slotted-angular-notification-center.d.ts.map +1 -0
- package/types/slotted-angular-number-field.d.ts +402 -0
- package/types/slotted-angular-number-field.d.ts.map +1 -0
- package/types/slotted-angular-otp-input.d.ts +286 -0
- package/types/slotted-angular-otp-input.d.ts.map +1 -0
- package/types/slotted-angular-page-header.d.ts +334 -0
- package/types/slotted-angular-page-header.d.ts.map +1 -0
- package/types/slotted-angular-page.d.ts +141 -0
- package/types/slotted-angular-page.d.ts.map +1 -0
- package/types/slotted-angular-pagination.d.ts +213 -0
- package/types/slotted-angular-pagination.d.ts.map +1 -0
- package/types/slotted-angular-popover.d.ts +366 -0
- package/types/slotted-angular-popover.d.ts.map +1 -0
- package/types/slotted-angular-progress-indicator.d.ts +312 -0
- package/types/slotted-angular-progress-indicator.d.ts.map +1 -0
- package/types/slotted-angular-prompt-composer.d.ts +242 -0
- package/types/slotted-angular-prompt-composer.d.ts.map +1 -0
- package/types/slotted-angular-prose.d.ts +171 -0
- package/types/slotted-angular-prose.d.ts.map +1 -0
- package/types/slotted-angular-radio-group.d.ts +268 -0
- package/types/slotted-angular-radio-group.d.ts.map +1 -0
- package/types/slotted-angular-rating.d.ts +374 -0
- package/types/slotted-angular-rating.d.ts.map +1 -0
- package/types/slotted-angular-result-state.d.ts +217 -0
- package/types/slotted-angular-result-state.d.ts.map +1 -0
- package/types/slotted-angular-saved-views.d.ts +198 -0
- package/types/slotted-angular-saved-views.d.ts.map +1 -0
- package/types/slotted-angular-scroll-area.d.ts +186 -0
- package/types/slotted-angular-scroll-area.d.ts.map +1 -0
- package/types/slotted-angular-section.d.ts +143 -0
- package/types/slotted-angular-section.d.ts.map +1 -0
- package/types/slotted-angular-segmented-control.d.ts +251 -0
- package/types/slotted-angular-segmented-control.d.ts.map +1 -0
- package/types/slotted-angular-select.d.ts +507 -0
- package/types/slotted-angular-select.d.ts.map +1 -0
- package/types/slotted-angular-side-navigation.d.ts +373 -0
- package/types/slotted-angular-side-navigation.d.ts.map +1 -0
- package/types/slotted-angular-skeleton.d.ts +198 -0
- package/types/slotted-angular-skeleton.d.ts.map +1 -0
- package/types/slotted-angular-slider.d.ts +216 -0
- package/types/slotted-angular-slider.d.ts.map +1 -0
- package/types/slotted-angular-sparkline.d.ts +106 -0
- package/types/slotted-angular-sparkline.d.ts.map +1 -0
- package/types/slotted-angular-split-button.d.ts +180 -0
- package/types/slotted-angular-split-button.d.ts.map +1 -0
- package/types/slotted-angular-splitter.d.ts +206 -0
- package/types/slotted-angular-splitter.d.ts.map +1 -0
- package/types/slotted-angular-stack.d.ts +38 -0
- package/types/slotted-angular-stack.d.ts.map +1 -0
- package/types/slotted-angular-stat-card.d.ts +232 -0
- package/types/slotted-angular-stat-card.d.ts.map +1 -0
- package/types/slotted-angular-status-indicator.d.ts +106 -0
- package/types/slotted-angular-status-indicator.d.ts.map +1 -0
- package/types/slotted-angular-stepper.d.ts +198 -0
- package/types/slotted-angular-stepper.d.ts.map +1 -0
- package/types/slotted-angular-switch.d.ts +243 -0
- package/types/slotted-angular-switch.d.ts.map +1 -0
- package/types/slotted-angular-table-of-contents.d.ts +210 -0
- package/types/slotted-angular-table-of-contents.d.ts.map +1 -0
- package/types/slotted-angular-table.d.ts +888 -0
- package/types/slotted-angular-table.d.ts.map +1 -0
- package/types/slotted-angular-tabs.d.ts +340 -0
- package/types/slotted-angular-tabs.d.ts.map +1 -0
- package/types/slotted-angular-tag.d.ts +279 -0
- package/types/slotted-angular-tag.d.ts.map +1 -0
- package/types/slotted-angular-tags-input.d.ts +302 -0
- package/types/slotted-angular-tags-input.d.ts.map +1 -0
- package/types/slotted-angular-text-field.d.ts +334 -0
- package/types/slotted-angular-text-field.d.ts.map +1 -0
- package/types/slotted-angular-textarea.d.ts +150 -0
- package/types/slotted-angular-textarea.d.ts.map +1 -0
- package/types/slotted-angular-theme.d.ts +26 -0
- package/types/slotted-angular-theme.d.ts.map +1 -0
- package/types/slotted-angular-time-field.d.ts +300 -0
- package/types/slotted-angular-time-field.d.ts.map +1 -0
- package/types/slotted-angular-time-picker.d.ts +260 -0
- package/types/slotted-angular-time-picker.d.ts.map +1 -0
- package/types/slotted-angular-time-range-picker.d.ts +401 -0
- package/types/slotted-angular-time-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-timeline.d.ts +329 -0
- package/types/slotted-angular-timeline.d.ts.map +1 -0
- package/types/slotted-angular-toast.d.ts +340 -0
- package/types/slotted-angular-toast.d.ts.map +1 -0
- package/types/slotted-angular-toggle-group.d.ts +167 -0
- package/types/slotted-angular-toggle-group.d.ts.map +1 -0
- package/types/slotted-angular-toggle.d.ts +106 -0
- package/types/slotted-angular-toggle.d.ts.map +1 -0
- package/types/slotted-angular-toolbar.d.ts +252 -0
- package/types/slotted-angular-toolbar.d.ts.map +1 -0
- package/types/slotted-angular-tooltip.d.ts +388 -0
- package/types/slotted-angular-tooltip.d.ts.map +1 -0
- package/types/slotted-angular-top-navigation.d.ts +442 -0
- package/types/slotted-angular-top-navigation.d.ts.map +1 -0
- package/types/slotted-angular-tour.d.ts +440 -0
- package/types/slotted-angular-tour.d.ts.map +1 -0
- package/types/slotted-angular-transfer.d.ts +296 -0
- package/types/slotted-angular-transfer.d.ts.map +1 -0
- package/types/slotted-angular-tree.d.ts +499 -0
- package/types/slotted-angular-tree.d.ts.map +1 -0
- package/types/slotted-angular-typography.d.ts +89 -0
- package/types/slotted-angular-typography.d.ts.map +1 -0
- package/types/slotted-angular-upload.d.ts +365 -0
- package/types/slotted-angular-upload.d.ts.map +1 -0
- package/types/slotted-angular-visually-hidden.d.ts +19 -0
- package/types/slotted-angular-visually-hidden.d.ts.map +1 -0
- package/types/slotted-angular-wizard.d.ts +441 -0
- package/types/slotted-angular-wizard.d.ts.map +1 -0
- package/types/slotted-angular.d.ts +3 -0
- package/types/slotted-angular.d.ts.map +1 -0
|
@@ -0,0 +1,1226 @@
|
|
|
1
|
+
<!-- index: ./index.md -->
|
|
2
|
+
# date-picker
|
|
3
|
+
|
|
4
|
+
`data-ui="date-picker"` · Date field with a calendar popover.
|
|
5
|
+
|
|
6
|
+
## Examples
|
|
7
|
+
|
|
8
|
+
### Playground
|
|
9
|
+
|
|
10
|
+
A field, a trigger and a calendar, driven by the controls below the canvas. Type into the field, or press the trigger and move through the calendar with the arrow keys: both write the same value.
|
|
11
|
+
|
|
12
|
+
Excerpt — not a complete module
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div slField>
|
|
16
|
+
<label slFieldLabel>Due date</label>
|
|
17
|
+
<div slDatePicker name="dueDate" (valueChange)="onValue($event)"></div>
|
|
18
|
+
</div>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Size
|
|
22
|
+
|
|
23
|
+
The three steps of the control scale. The trigger follows the field: its box is the icon plus one step of space, inside the frame, as in every other control with an inner button.
|
|
24
|
+
|
|
25
|
+
Example
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { Component } from '@angular/core';
|
|
29
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
30
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
31
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
32
|
+
import { plainDate } from '@slotted/core/date';
|
|
33
|
+
|
|
34
|
+
@Component({
|
|
35
|
+
selector: 'app-date-picker-sizes',
|
|
36
|
+
imports: [SlDatePicker, SlField, SlFieldLabel, SlStack],
|
|
37
|
+
template: `
|
|
38
|
+
<div slStack [gap]="5">
|
|
39
|
+
<div slField>
|
|
40
|
+
<label slFieldLabel>Shipped after</label>
|
|
41
|
+
<div slDatePicker size="sm" [defaultValue]="shippedAfter"></div>
|
|
42
|
+
</div>
|
|
43
|
+
<div slField>
|
|
44
|
+
<label slFieldLabel>Ship date</label>
|
|
45
|
+
<div slDatePicker size="md" [defaultValue]="shipDate"></div>
|
|
46
|
+
</div>
|
|
47
|
+
<div slField>
|
|
48
|
+
<label slFieldLabel>Move-in date</label>
|
|
49
|
+
<div slDatePicker size="lg" [defaultValue]="moveIn"></div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
`,
|
|
53
|
+
})
|
|
54
|
+
export class DatePickerSizes {
|
|
55
|
+
protected readonly shippedAfter = plainDate(2026, 9, 1);
|
|
56
|
+
protected readonly shipDate = plainDate(2026, 9, 30);
|
|
57
|
+
protected readonly moveIn = plainDate(2026, 11, 2);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Variant
|
|
62
|
+
|
|
63
|
+
How much frame the field draws at rest. The trigger keeps its calendar icon in all three.
|
|
64
|
+
|
|
65
|
+
Example
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { Component } from '@angular/core';
|
|
69
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
70
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
71
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
72
|
+
import { plainDate } from '@slotted/core/date';
|
|
73
|
+
|
|
74
|
+
@Component({
|
|
75
|
+
selector: 'app-date-picker-variants',
|
|
76
|
+
imports: [SlDatePicker, SlField, SlFieldLabel, SlStack],
|
|
77
|
+
template: `
|
|
78
|
+
<div slStack [gap]="5">
|
|
79
|
+
<div slField>
|
|
80
|
+
<label slFieldLabel>Invoice date</label>
|
|
81
|
+
<div slDatePicker variant="outline" [defaultValue]="invoiced"></div>
|
|
82
|
+
</div>
|
|
83
|
+
<div slField>
|
|
84
|
+
<label slFieldLabel>Posting date</label>
|
|
85
|
+
<div slDatePicker variant="subtle" [defaultValue]="invoiced"></div>
|
|
86
|
+
</div>
|
|
87
|
+
<div slField>
|
|
88
|
+
<label slFieldLabel>Value date</label>
|
|
89
|
+
<div slDatePicker variant="plain" [defaultValue]="valueDate"></div>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
`,
|
|
93
|
+
})
|
|
94
|
+
export class DatePickerVariants {
|
|
95
|
+
protected readonly invoiced = plainDate(2026, 9, 30);
|
|
96
|
+
protected readonly valueDate = plainDate(2026, 10, 1);
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Where the surface opens
|
|
101
|
+
|
|
102
|
+
A preference: when the calendar does not fit on that side, it opens on the other, and data-placement on the positioner records the side it took.
|
|
103
|
+
|
|
104
|
+
Example
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
import { Component } from '@angular/core';
|
|
108
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
109
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
110
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
111
|
+
import { plainDate } from '@slotted/core/date';
|
|
112
|
+
|
|
113
|
+
@Component({
|
|
114
|
+
selector: 'app-date-picker-placement',
|
|
115
|
+
imports: [SlDatePicker, SlField, SlFieldLabel, SlStack],
|
|
116
|
+
template: `
|
|
117
|
+
<div slStack [gap]="5">
|
|
118
|
+
<div slField>
|
|
119
|
+
<label slFieldLabel>Opens above, from the start edge</label>
|
|
120
|
+
<div slDatePicker placement="top-start" [defaultValue]="today"></div>
|
|
121
|
+
</div>
|
|
122
|
+
<div slField>
|
|
123
|
+
<label slFieldLabel>Opens below, from the end edge</label>
|
|
124
|
+
<div slDatePicker placement="bottom-end" [defaultValue]="today"></div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
`,
|
|
128
|
+
})
|
|
129
|
+
export class DatePickerPlacement {
|
|
130
|
+
protected readonly today = plainDate(2026, 9, 30);
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Bounds
|
|
135
|
+
|
|
136
|
+
min and max bound the field and the calendar together: the calendar disables the days outside them, and a typed date outside them marks the date picker invalid.
|
|
137
|
+
|
|
138
|
+
Excerpt — not a complete module
|
|
139
|
+
|
|
140
|
+
```html
|
|
141
|
+
<div slDatePicker [min]="first" [max]="last"></div>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Days that are refused
|
|
145
|
+
|
|
146
|
+
One function reaches the field and the calendar. A refused date marks the date picker invalid when it is typed, and is disabled in the calendar.
|
|
147
|
+
|
|
148
|
+
Example
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
import { Component } from '@angular/core';
|
|
152
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
153
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
154
|
+
import { dayOfWeek, plainDate, toISODate, type PlainDate } from '@slotted/core/date';
|
|
155
|
+
|
|
156
|
+
/** Columbus Day, Veterans Day, Thanksgiving and Christmas Day, 2026. */
|
|
157
|
+
const HOLIDAYS = new Set(['2026-10-12', '2026-11-11', '2026-11-26', '2026-12-25']);
|
|
158
|
+
|
|
159
|
+
const isClosed = (date: PlainDate) =>
|
|
160
|
+
dayOfWeek(date) === 0 || dayOfWeek(date) === 6 || HOLIDAYS.has(toISODate(date));
|
|
161
|
+
|
|
162
|
+
@Component({
|
|
163
|
+
selector: 'app-date-picker-unavailable',
|
|
164
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
165
|
+
template: `
|
|
166
|
+
<div slField>
|
|
167
|
+
<label slFieldLabel>Pickup date</label>
|
|
168
|
+
<div slDatePicker [defaultValue]="pickup" [isDateUnavailable]="isClosed"></div>
|
|
169
|
+
<span slFieldDescription>The Reno dock is closed on weekends and federal holidays.</span>
|
|
170
|
+
</div>
|
|
171
|
+
`,
|
|
172
|
+
})
|
|
173
|
+
export class DatePickerUnavailable {
|
|
174
|
+
protected readonly pickup = plainDate(2026, 10, 13);
|
|
175
|
+
protected readonly isClosed = isClosed;
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Shortcuts and actions
|
|
180
|
+
|
|
181
|
+
The two slots you fill: shortcuts beside the calendar and actions under it. The Date Picker ships no list of shortcuts, because the labels and dates belong to your product.
|
|
182
|
+
|
|
183
|
+
Example
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
import { Component, signal } from '@angular/core';
|
|
187
|
+
import { SlButton } from '@slotted/angular/button';
|
|
188
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
189
|
+
import { SlDatePicker, SlDatePickerPresets } from '@slotted/angular/date-picker';
|
|
190
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
191
|
+
import { addDays, isPlainDate, plainDate, type PlainDate } from '@slotted/core/date';
|
|
192
|
+
|
|
193
|
+
const TODAY = plainDate(2026, 9, 30);
|
|
194
|
+
|
|
195
|
+
const PRESETS = [
|
|
196
|
+
{ label: 'Today', date: TODAY },
|
|
197
|
+
{ label: 'Tomorrow', date: addDays(TODAY, 1) },
|
|
198
|
+
{ label: 'Next Monday', date: plainDate(2026, 10, 5) },
|
|
199
|
+
{ label: 'In 2 weeks', date: addDays(TODAY, 14) },
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
@Component({
|
|
203
|
+
selector: 'app-date-picker-presets',
|
|
204
|
+
imports: [SlButton, SlDatePicker, SlDatePickerPresets, SlField, SlFieldLabel],
|
|
205
|
+
template: `
|
|
206
|
+
<div slField>
|
|
207
|
+
<label slFieldLabel>Dispatch date</label>
|
|
208
|
+
<div slDatePicker #picker="slDatePicker" [value]="date()" (valueChange)="set($event.value)">
|
|
209
|
+
<div slDatePickerPresets>
|
|
210
|
+
@for (preset of presets; track preset.label) {
|
|
211
|
+
<button
|
|
212
|
+
slButton
|
|
213
|
+
size="sm"
|
|
214
|
+
variant="ghost"
|
|
215
|
+
type="button"
|
|
216
|
+
(click)="date.set(preset.date); picker.closeSurface()"
|
|
217
|
+
>
|
|
218
|
+
{{ preset.label }}
|
|
219
|
+
</button>
|
|
220
|
+
}
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
`,
|
|
225
|
+
})
|
|
226
|
+
export class DatePickerPresets {
|
|
227
|
+
protected readonly presets = PRESETS;
|
|
228
|
+
protected readonly date = signal<PlainDate | null>(TODAY);
|
|
229
|
+
|
|
230
|
+
protected set(value: CalendarValue): void {
|
|
231
|
+
this.date.set(isPlainDate(value) ? value : null);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### States
|
|
237
|
+
|
|
238
|
+
Disabled and read-only both disable the trigger, so the calendar cannot open. Invalid draws the frame and the focus ring in the danger tone.
|
|
239
|
+
|
|
240
|
+
Example
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
import { Component } from '@angular/core';
|
|
244
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
245
|
+
import { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
|
|
246
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
247
|
+
import { plainDate } from '@slotted/core/date';
|
|
248
|
+
|
|
249
|
+
@Component({
|
|
250
|
+
selector: 'app-date-picker-states',
|
|
251
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldError, SlFieldLabel, SlStack],
|
|
252
|
+
template: `
|
|
253
|
+
<div slStack [gap]="5">
|
|
254
|
+
<div slField invalid required>
|
|
255
|
+
<label slFieldLabel>Delivery date</label>
|
|
256
|
+
<div slDatePicker [defaultValue]="delivery"></div>
|
|
257
|
+
<span slFieldError>The delivery date is before the order date, September 30, 2026.</span>
|
|
258
|
+
</div>
|
|
259
|
+
<div slField readOnly>
|
|
260
|
+
<label slFieldLabel>Order date</label>
|
|
261
|
+
<div slDatePicker [defaultValue]="ordered"></div>
|
|
262
|
+
<span slFieldDescription>Set when the order was placed.</span>
|
|
263
|
+
</div>
|
|
264
|
+
<div slField disabled>
|
|
265
|
+
<label slFieldLabel>Return by</label>
|
|
266
|
+
<div slDatePicker [defaultValue]="returnBy"></div>
|
|
267
|
+
<span slFieldDescription>Returns open once the order is delivered.</span>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
`,
|
|
271
|
+
})
|
|
272
|
+
export class DatePickerStates {
|
|
273
|
+
protected readonly delivery = plainDate(2026, 9, 28);
|
|
274
|
+
protected readonly ordered = plainDate(2026, 9, 30);
|
|
275
|
+
protected readonly returnBy = plainDate(2026, 10, 30);
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### In a form
|
|
280
|
+
|
|
281
|
+
name adds a hidden input that submits the date as an ISO 8601 string, so a plain form post sends 2026-09-09 whether the reader typed the date or chose it. formControlName binds it to a reactive form.
|
|
282
|
+
|
|
283
|
+
Excerpt — not a complete module
|
|
284
|
+
|
|
285
|
+
```html
|
|
286
|
+
<form action="/bookings" method="post">
|
|
287
|
+
<div slDatePicker name="checkIn" required></div>
|
|
288
|
+
<button type="submit">Book</button>
|
|
289
|
+
</form>
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### On a narrow touch screen
|
|
293
|
+
|
|
294
|
+
Under 480 pixels on a coarse pointer, the calendar opens as a sheet attached to the bottom of the viewport. The markup stays the same, and data-presentation on the positioner records which presentation is showing.
|
|
295
|
+
|
|
296
|
+
Example
|
|
297
|
+
|
|
298
|
+
```ts
|
|
299
|
+
import { Component, signal } from '@angular/core';
|
|
300
|
+
import { SlButton } from '@slotted/angular/button';
|
|
301
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
302
|
+
import { SlDatePicker, SlDatePickerPresets } from '@slotted/angular/date-picker';
|
|
303
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
304
|
+
import { addDays, isPlainDate, plainDate, type PlainDate } from '@slotted/core/date';
|
|
305
|
+
|
|
306
|
+
const TODAY = plainDate(2026, 9, 30);
|
|
307
|
+
|
|
308
|
+
@Component({
|
|
309
|
+
selector: 'app-date-picker-narrow',
|
|
310
|
+
imports: [SlButton, SlDatePicker, SlDatePickerPresets, SlField, SlFieldLabel],
|
|
311
|
+
template: `
|
|
312
|
+
<div slField>
|
|
313
|
+
<label slFieldLabel>Proof of delivery date</label>
|
|
314
|
+
<div slDatePicker #picker="slDatePicker" [value]="date()" (valueChange)="set($event.value)">
|
|
315
|
+
<div slDatePickerPresets>
|
|
316
|
+
<button
|
|
317
|
+
slButton
|
|
318
|
+
size="sm"
|
|
319
|
+
variant="ghost"
|
|
320
|
+
type="button"
|
|
321
|
+
(click)="date.set(today); picker.closeSurface()"
|
|
322
|
+
>
|
|
323
|
+
Today
|
|
324
|
+
</button>
|
|
325
|
+
<button
|
|
326
|
+
slButton
|
|
327
|
+
size="sm"
|
|
328
|
+
variant="ghost"
|
|
329
|
+
type="button"
|
|
330
|
+
(click)="date.set(yesterday); picker.closeSurface()"
|
|
331
|
+
>
|
|
332
|
+
Yesterday
|
|
333
|
+
</button>
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
`,
|
|
338
|
+
})
|
|
339
|
+
export class DatePickerNarrow {
|
|
340
|
+
protected readonly today = TODAY;
|
|
341
|
+
protected readonly yesterday = addDays(TODAY, -1);
|
|
342
|
+
protected readonly date = signal<PlainDate | null>(null);
|
|
343
|
+
|
|
344
|
+
protected set(value: CalendarValue): void {
|
|
345
|
+
this.date.set(isPlainDate(value) ? value : null);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Composition and escape hatches
|
|
351
|
+
|
|
352
|
+
provideDatePickerDefaults sets the time zone and the placement once, provideSlotted sets the language and the trigger’s names, exportAs returns focus(), openSurface() and closeSurface(), and cancel() refuses a value before it is applied.
|
|
353
|
+
|
|
354
|
+
Excerpt — not a complete module
|
|
355
|
+
|
|
356
|
+
```html
|
|
357
|
+
<div slDatePicker #picker="slDatePicker" (valueChange)="$event.cancel()"></div>
|
|
358
|
+
<button type="button" (click)="picker.openSurface()">Open calendar</button>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### The keyboard
|
|
362
|
+
|
|
363
|
+
Alt+ArrowDown opens the calendar from the field and moves focus to the chosen day. Escape closes it and returns focus to the trigger; while the calendar shows months or years, Escape first returns to the day grid.
|
|
364
|
+
|
|
365
|
+
Example
|
|
366
|
+
|
|
367
|
+
```ts
|
|
368
|
+
import { Component, signal } from '@angular/core';
|
|
369
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
370
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
371
|
+
import { plainDate } from '@slotted/core/date';
|
|
372
|
+
import type { ChangeRequest } from '@slotted/core/state';
|
|
373
|
+
|
|
374
|
+
@Component({
|
|
375
|
+
selector: 'app-date-picker-keyboard',
|
|
376
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
377
|
+
template: `
|
|
378
|
+
<div slField>
|
|
379
|
+
<label slFieldLabel>Dispatch date</label>
|
|
380
|
+
<div
|
|
381
|
+
slDatePicker
|
|
382
|
+
[defaultValue]="dispatch"
|
|
383
|
+
[messages]="messages"
|
|
384
|
+
(openChange)="record($event)"
|
|
385
|
+
></div>
|
|
386
|
+
<span slFieldDescription>{{ last() }}</span>
|
|
387
|
+
</div>
|
|
388
|
+
`,
|
|
389
|
+
})
|
|
390
|
+
export class DatePickerKeyboard {
|
|
391
|
+
protected readonly dispatch = plainDate(2026, 9, 30);
|
|
392
|
+
protected readonly messages = {
|
|
393
|
+
choose: 'Choose dispatch date',
|
|
394
|
+
change: 'Change dispatch date, {date}',
|
|
395
|
+
};
|
|
396
|
+
protected readonly last = signal('Focus the field and press Alt+ArrowDown.');
|
|
397
|
+
|
|
398
|
+
protected record(request: ChangeRequest<boolean>): void {
|
|
399
|
+
this.last.set(`${request.value ? 'Opened' : 'Closed'} by ${request.reason}.`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### bounds.ts
|
|
405
|
+
|
|
406
|
+
Example
|
|
407
|
+
|
|
408
|
+
```ts
|
|
409
|
+
import { Component } from '@angular/core';
|
|
410
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
411
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
412
|
+
import { plainDate } from '@slotted/core/date';
|
|
413
|
+
|
|
414
|
+
@Component({
|
|
415
|
+
selector: 'app-date-picker-bounds',
|
|
416
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
417
|
+
template: `
|
|
418
|
+
<div slField>
|
|
419
|
+
<label slFieldLabel>Delivery window</label>
|
|
420
|
+
<div slDatePicker [defaultValue]="delivery" [max]="last" [min]="first"></div>
|
|
421
|
+
<span slFieldDescription>Carriers book October 2026 only.</span>
|
|
422
|
+
</div>
|
|
423
|
+
`,
|
|
424
|
+
})
|
|
425
|
+
export class DatePickerBounds {
|
|
426
|
+
protected readonly delivery = plainDate(2026, 10, 15);
|
|
427
|
+
protected readonly first = plainDate(2026, 10, 1);
|
|
428
|
+
protected readonly last = plainDate(2026, 10, 31);
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### clearable.ts
|
|
433
|
+
|
|
434
|
+
Example
|
|
435
|
+
|
|
436
|
+
```ts
|
|
437
|
+
import { Component } from '@angular/core';
|
|
438
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
439
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
440
|
+
import { plainDate } from '@slotted/core/date';
|
|
441
|
+
|
|
442
|
+
@Component({
|
|
443
|
+
selector: 'app-date-picker-clearable',
|
|
444
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
445
|
+
template: `
|
|
446
|
+
<div slField>
|
|
447
|
+
<label slFieldLabel>Hold shipment until</label>
|
|
448
|
+
<div slDatePicker clearable [defaultValue]="holdUntil"></div>
|
|
449
|
+
<span slFieldDescription>Clear the date to release the shipment.</span>
|
|
450
|
+
</div>
|
|
451
|
+
`,
|
|
452
|
+
})
|
|
453
|
+
export class DatePickerClearable {
|
|
454
|
+
protected readonly holdUntil = plainDate(2026, 10, 9);
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### controlled.ts
|
|
459
|
+
|
|
460
|
+
Example
|
|
461
|
+
|
|
462
|
+
```ts
|
|
463
|
+
import { Component, computed, signal } from '@angular/core';
|
|
464
|
+
import { SlButton } from '@slotted/angular/button';
|
|
465
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
466
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
467
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
468
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
469
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
470
|
+
import {
|
|
471
|
+
addDays,
|
|
472
|
+
createDateFormat,
|
|
473
|
+
isPlainDate,
|
|
474
|
+
plainDate,
|
|
475
|
+
type PlainDate,
|
|
476
|
+
} from '@slotted/core/date';
|
|
477
|
+
|
|
478
|
+
const TODAY = plainDate(2026, 9, 30);
|
|
479
|
+
const words = createDateFormat({ locale: 'en-US' });
|
|
480
|
+
|
|
481
|
+
@Component({
|
|
482
|
+
selector: 'app-date-picker-controlled',
|
|
483
|
+
imports: [SlButton, SlDatePicker, SlField, SlFieldDescription, SlFieldLabel, SlInline, SlStack],
|
|
484
|
+
template: `
|
|
485
|
+
<div slStack [gap]="4">
|
|
486
|
+
<div slField>
|
|
487
|
+
<label slFieldLabel>Follow up with Harbor Freightways</label>
|
|
488
|
+
<div slDatePicker [value]="followUp()" (valueChange)="set($event.value)"></div>
|
|
489
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
490
|
+
</div>
|
|
491
|
+
<div slInline [gap]="2">
|
|
492
|
+
<button
|
|
493
|
+
slButton
|
|
494
|
+
size="sm"
|
|
495
|
+
tone="secondary"
|
|
496
|
+
variant="outline"
|
|
497
|
+
type="button"
|
|
498
|
+
(click)="inDays(7)"
|
|
499
|
+
>
|
|
500
|
+
In 1 week
|
|
501
|
+
</button>
|
|
502
|
+
<button
|
|
503
|
+
slButton
|
|
504
|
+
size="sm"
|
|
505
|
+
tone="secondary"
|
|
506
|
+
variant="outline"
|
|
507
|
+
type="button"
|
|
508
|
+
(click)="inDays(14)"
|
|
509
|
+
>
|
|
510
|
+
In 2 weeks
|
|
511
|
+
</button>
|
|
512
|
+
<button
|
|
513
|
+
slButton
|
|
514
|
+
size="sm"
|
|
515
|
+
tone="secondary"
|
|
516
|
+
variant="ghost"
|
|
517
|
+
type="button"
|
|
518
|
+
(click)="followUp.set(null)"
|
|
519
|
+
>
|
|
520
|
+
No follow-up
|
|
521
|
+
</button>
|
|
522
|
+
</div>
|
|
523
|
+
</div>
|
|
524
|
+
`,
|
|
525
|
+
})
|
|
526
|
+
export class DatePickerControlled {
|
|
527
|
+
protected readonly followUp = signal<PlainDate | null>(addDays(TODAY, 7));
|
|
528
|
+
protected readonly summary = computed(() => {
|
|
529
|
+
const date = this.followUp();
|
|
530
|
+
return date === null ? 'No follow-up scheduled.' : `Reminder on ${words.describe(date)}.`;
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
protected set(value: CalendarValue): void {
|
|
534
|
+
this.followUp.set(isPlainDate(value) ? value : null);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
protected inDays(days: number): void {
|
|
538
|
+
this.followUp.set(addDays(TODAY, days));
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### default-view.ts
|
|
544
|
+
|
|
545
|
+
Example
|
|
546
|
+
|
|
547
|
+
```ts
|
|
548
|
+
import { Component } from '@angular/core';
|
|
549
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
550
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
551
|
+
import { plainDate } from '@slotted/core/date';
|
|
552
|
+
|
|
553
|
+
@Component({
|
|
554
|
+
selector: 'app-date-picker-default-view',
|
|
555
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
556
|
+
template: `
|
|
557
|
+
<div slField>
|
|
558
|
+
<label slFieldLabel>Date of incorporation</label>
|
|
559
|
+
<div slDatePicker defaultView="year" [max]="today"></div>
|
|
560
|
+
<span slFieldDescription>As printed on the certificate of incorporation.</span>
|
|
561
|
+
</div>
|
|
562
|
+
`,
|
|
563
|
+
})
|
|
564
|
+
export class DatePickerDefaultView {
|
|
565
|
+
protected readonly today = plainDate(2026, 9, 30);
|
|
566
|
+
}
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
### defaults.ts
|
|
570
|
+
|
|
571
|
+
Example
|
|
572
|
+
|
|
573
|
+
```ts
|
|
574
|
+
import { Component } from '@angular/core';
|
|
575
|
+
import { provideDatePickerDefaults, SlDatePicker } from '@slotted/angular/date-picker';
|
|
576
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
577
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
578
|
+
import { plainDate } from '@slotted/core/date';
|
|
579
|
+
|
|
580
|
+
@Component({
|
|
581
|
+
selector: 'app-date-picker-defaults',
|
|
582
|
+
imports: [SlDatePicker, SlField, SlFieldLabel, SlStack],
|
|
583
|
+
providers: [
|
|
584
|
+
provideDatePickerDefaults({ size: 'sm', variant: 'subtle', placement: 'bottom-end' }),
|
|
585
|
+
],
|
|
586
|
+
template: `
|
|
587
|
+
<div slStack [gap]="4">
|
|
588
|
+
<div slField>
|
|
589
|
+
<label slFieldLabel>Posted after</label>
|
|
590
|
+
<div slDatePicker [defaultValue]="postedAfter"></div>
|
|
591
|
+
</div>
|
|
592
|
+
<div slField>
|
|
593
|
+
<label slFieldLabel>Due before</label>
|
|
594
|
+
<div slDatePicker [defaultValue]="dueBefore"></div>
|
|
595
|
+
</div>
|
|
596
|
+
</div>
|
|
597
|
+
`,
|
|
598
|
+
})
|
|
599
|
+
export class DatePickerDefaults {
|
|
600
|
+
protected readonly postedAfter = plainDate(2026, 9, 1);
|
|
601
|
+
protected readonly dueBefore = plainDate(2026, 10, 31);
|
|
602
|
+
}
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
### first-day.ts
|
|
606
|
+
|
|
607
|
+
Example
|
|
608
|
+
|
|
609
|
+
```ts
|
|
610
|
+
import { Component } from '@angular/core';
|
|
611
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
612
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
613
|
+
import { plainDate } from '@slotted/core/date';
|
|
614
|
+
|
|
615
|
+
@Component({
|
|
616
|
+
selector: 'app-date-picker-first-day',
|
|
617
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
618
|
+
template: `
|
|
619
|
+
<div slField>
|
|
620
|
+
<label slFieldLabel>Shift starts</label>
|
|
621
|
+
<div slDatePicker locale="en-US" [defaultValue]="shift" [firstDayOfWeek]="1"></div>
|
|
622
|
+
<span slFieldDescription>Rosters run Monday to Sunday.</span>
|
|
623
|
+
</div>
|
|
624
|
+
`,
|
|
625
|
+
})
|
|
626
|
+
export class DatePickerFirstDay {
|
|
627
|
+
protected readonly shift = plainDate(2026, 9, 30);
|
|
628
|
+
}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
### focus-and-open.ts
|
|
632
|
+
|
|
633
|
+
Example
|
|
634
|
+
|
|
635
|
+
```ts
|
|
636
|
+
import { Component } from '@angular/core';
|
|
637
|
+
import { SlButton } from '@slotted/angular/button';
|
|
638
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
639
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
640
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
641
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
642
|
+
import { plainDate } from '@slotted/core/date';
|
|
643
|
+
|
|
644
|
+
@Component({
|
|
645
|
+
selector: 'app-date-picker-focus-and-open',
|
|
646
|
+
imports: [SlButton, SlDatePicker, SlField, SlFieldLabel, SlInline, SlStack],
|
|
647
|
+
template: `
|
|
648
|
+
<div slStack [gap]="4">
|
|
649
|
+
<div slField>
|
|
650
|
+
<label slFieldLabel>Contract renewal date</label>
|
|
651
|
+
<div slDatePicker #picker="slDatePicker" [defaultValue]="renewal"></div>
|
|
652
|
+
</div>
|
|
653
|
+
<div slInline [gap]="2">
|
|
654
|
+
<button
|
|
655
|
+
slButton
|
|
656
|
+
size="sm"
|
|
657
|
+
tone="secondary"
|
|
658
|
+
variant="outline"
|
|
659
|
+
type="button"
|
|
660
|
+
(click)="picker.focus()"
|
|
661
|
+
>
|
|
662
|
+
Edit date
|
|
663
|
+
</button>
|
|
664
|
+
<button
|
|
665
|
+
slButton
|
|
666
|
+
size="sm"
|
|
667
|
+
tone="secondary"
|
|
668
|
+
variant="outline"
|
|
669
|
+
type="button"
|
|
670
|
+
(click)="picker.openSurface()"
|
|
671
|
+
>
|
|
672
|
+
Open calendar
|
|
673
|
+
</button>
|
|
674
|
+
</div>
|
|
675
|
+
</div>
|
|
676
|
+
`,
|
|
677
|
+
})
|
|
678
|
+
export class DatePickerFocusAndOpen {
|
|
679
|
+
protected readonly renewal = plainDate(2027, 3, 31);
|
|
680
|
+
}
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
### footer.ts
|
|
684
|
+
|
|
685
|
+
Example
|
|
686
|
+
|
|
687
|
+
```ts
|
|
688
|
+
import { Component } from '@angular/core';
|
|
689
|
+
import { SlButton } from '@slotted/angular/button';
|
|
690
|
+
import { SlDatePicker, SlDatePickerFooter } from '@slotted/angular/date-picker';
|
|
691
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
692
|
+
import { plainDate } from '@slotted/core/date';
|
|
693
|
+
|
|
694
|
+
@Component({
|
|
695
|
+
selector: 'app-date-picker-footer',
|
|
696
|
+
imports: [SlButton, SlDatePicker, SlDatePickerFooter, SlField, SlFieldDescription, SlFieldLabel],
|
|
697
|
+
template: `
|
|
698
|
+
<div slField>
|
|
699
|
+
<label slFieldLabel>Stock count date</label>
|
|
700
|
+
<div slDatePicker #picker="slDatePicker" closeOnSelect="never" [defaultValue]="count">
|
|
701
|
+
<div slDatePickerFooter>
|
|
702
|
+
<button slButton size="sm" type="button" (click)="picker.closeSurface()">Done</button>
|
|
703
|
+
</div>
|
|
704
|
+
</div>
|
|
705
|
+
<span slFieldDescription>The calendar stays open until you press Done.</span>
|
|
706
|
+
</div>
|
|
707
|
+
`,
|
|
708
|
+
})
|
|
709
|
+
export class DatePickerFooter {
|
|
710
|
+
protected readonly count = plainDate(2026, 10, 3);
|
|
711
|
+
}
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
### form.ts
|
|
715
|
+
|
|
716
|
+
Example
|
|
717
|
+
|
|
718
|
+
```ts
|
|
719
|
+
import { Component, computed, signal } from '@angular/core';
|
|
720
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
721
|
+
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
722
|
+
import { SlButton } from '@slotted/angular/button';
|
|
723
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
724
|
+
import { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
|
|
725
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
726
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
727
|
+
import { SlText } from '@slotted/angular/typography';
|
|
728
|
+
import { plainDate, toISODate, type PlainDate } from '@slotted/core/date';
|
|
729
|
+
|
|
730
|
+
@Component({
|
|
731
|
+
selector: 'app-date-picker-form',
|
|
732
|
+
imports: [
|
|
733
|
+
ReactiveFormsModule,
|
|
734
|
+
SlButton,
|
|
735
|
+
SlDatePicker,
|
|
736
|
+
SlField,
|
|
737
|
+
SlFieldError,
|
|
738
|
+
SlFieldLabel,
|
|
739
|
+
SlInline,
|
|
740
|
+
SlStack,
|
|
741
|
+
SlText,
|
|
742
|
+
],
|
|
743
|
+
template: `
|
|
744
|
+
<form novalidate [formGroup]="form" (ngSubmit)="submit()" (reset)="clear()">
|
|
745
|
+
<div slStack [gap]="5">
|
|
746
|
+
<div slField required [invalid]="error() === '' ? undefined : true">
|
|
747
|
+
<label slFieldLabel>Delivery date</label>
|
|
748
|
+
<div
|
|
749
|
+
slDatePicker
|
|
750
|
+
name="deliveryDate"
|
|
751
|
+
formControlName="deliveryDate"
|
|
752
|
+
[min]="earliest"
|
|
753
|
+
></div>
|
|
754
|
+
<span slFieldError live="polite" reserve>{{ error() }}</span>
|
|
755
|
+
</div>
|
|
756
|
+
<div slInline [gap]="3" align="center">
|
|
757
|
+
<button slButton type="submit">Book delivery</button>
|
|
758
|
+
<button slButton type="reset" tone="secondary" variant="outline">Reset</button>
|
|
759
|
+
@if (saved(); as message) {
|
|
760
|
+
<span slText size="sm" tone="muted">{{ message }}</span>
|
|
761
|
+
}
|
|
762
|
+
</div>
|
|
763
|
+
</div>
|
|
764
|
+
</form>
|
|
765
|
+
`,
|
|
766
|
+
})
|
|
767
|
+
export class DatePickerForm {
|
|
768
|
+
protected readonly earliest = plainDate(2026, 10, 1);
|
|
769
|
+
protected readonly form = new FormGroup({
|
|
770
|
+
deliveryDate: new FormControl<PlainDate | null>(null, Validators.required),
|
|
771
|
+
});
|
|
772
|
+
private readonly value = toSignal(this.form.controls.deliveryDate.valueChanges, {
|
|
773
|
+
initialValue: this.form.controls.deliveryDate.value,
|
|
774
|
+
});
|
|
775
|
+
private readonly submitted = signal(false);
|
|
776
|
+
protected readonly saved = signal<string | null>(null);
|
|
777
|
+
protected readonly error = computed(() => {
|
|
778
|
+
this.value();
|
|
779
|
+
const control = this.form.controls.deliveryDate;
|
|
780
|
+
if (control.hasError('slottedDateRange')) return 'Choose October 1, 2026 or later.';
|
|
781
|
+
if (this.submitted() && control.hasError('required')) return 'Choose a delivery date.';
|
|
782
|
+
return '';
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
protected submit(): void {
|
|
786
|
+
this.submitted.set(true);
|
|
787
|
+
const date = this.form.controls.deliveryDate.value;
|
|
788
|
+
this.saved.set(
|
|
789
|
+
this.form.valid && date !== null ? `Delivery booked for ${toISODate(date)}.` : null,
|
|
790
|
+
);
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
protected clear(): void {
|
|
794
|
+
this.submitted.set(false);
|
|
795
|
+
this.saved.set(null);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
```
|
|
799
|
+
|
|
800
|
+
### invoice-due.ts
|
|
801
|
+
|
|
802
|
+
Example
|
|
803
|
+
|
|
804
|
+
```ts
|
|
805
|
+
import { Component, computed, signal } from '@angular/core';
|
|
806
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
807
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
808
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
809
|
+
import { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';
|
|
810
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
811
|
+
import {
|
|
812
|
+
addDays,
|
|
813
|
+
createDateFormat,
|
|
814
|
+
isPlainDate,
|
|
815
|
+
plainDate,
|
|
816
|
+
type PlainDate,
|
|
817
|
+
} from '@slotted/core/date';
|
|
818
|
+
|
|
819
|
+
const TERMS = [
|
|
820
|
+
{ value: 'receipt', label: 'Due on receipt', days: 0 },
|
|
821
|
+
{ value: 'net-15', label: 'Net 15', days: 15 },
|
|
822
|
+
{ value: 'net-30', label: 'Net 30', days: 30 },
|
|
823
|
+
{ value: 'net-60', label: 'Net 60', days: 60 },
|
|
824
|
+
];
|
|
825
|
+
const words = createDateFormat({ locale: 'en-US' });
|
|
826
|
+
|
|
827
|
+
@Component({
|
|
828
|
+
selector: 'app-date-picker-invoice-due',
|
|
829
|
+
imports: [
|
|
830
|
+
SlDatePicker,
|
|
831
|
+
SlField,
|
|
832
|
+
SlFieldDescription,
|
|
833
|
+
SlFieldLabel,
|
|
834
|
+
SlSelect,
|
|
835
|
+
SlSelectItem,
|
|
836
|
+
SlStack,
|
|
837
|
+
],
|
|
838
|
+
template: `
|
|
839
|
+
<div slStack [gap]="5">
|
|
840
|
+
<div slField required>
|
|
841
|
+
<label slFieldLabel>Invoice date</label>
|
|
842
|
+
<div slDatePicker [value]="issued()" (valueChange)="setIssued($event.value)"></div>
|
|
843
|
+
</div>
|
|
844
|
+
<div slField>
|
|
845
|
+
<label slFieldLabel>Payment terms</label>
|
|
846
|
+
<sl-select [items]="terms" [(value)]="term">
|
|
847
|
+
@for (option of terms; track option.value) {
|
|
848
|
+
<sl-select-item [value]="option.value">{{ option.label }}</sl-select-item>
|
|
849
|
+
}
|
|
850
|
+
</sl-select>
|
|
851
|
+
</div>
|
|
852
|
+
<div slField readOnly>
|
|
853
|
+
<label slFieldLabel>Due date</label>
|
|
854
|
+
<div slDatePicker [value]="due()"></div>
|
|
855
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
856
|
+
</div>
|
|
857
|
+
</div>
|
|
858
|
+
`,
|
|
859
|
+
})
|
|
860
|
+
export class DatePickerInvoiceDue {
|
|
861
|
+
protected readonly terms = TERMS;
|
|
862
|
+
protected readonly issued = signal<PlainDate | null>(plainDate(2026, 9, 30));
|
|
863
|
+
protected readonly term = signal<SelectSelection>('net-30');
|
|
864
|
+
protected readonly due = computed(() => {
|
|
865
|
+
const issued = this.issued();
|
|
866
|
+
const days = TERMS.find((option) => option.value === this.term())?.days ?? 0;
|
|
867
|
+
return issued === null ? null : addDays(issued, days);
|
|
868
|
+
});
|
|
869
|
+
protected readonly summary = computed(() => {
|
|
870
|
+
const due = this.due();
|
|
871
|
+
return due === null ? 'Set the invoice date first.' : `Payment is due ${words.describe(due)}.`;
|
|
872
|
+
});
|
|
873
|
+
|
|
874
|
+
protected setIssued(value: CalendarValue): void {
|
|
875
|
+
this.issued.set(isPlainDate(value) ? value : null);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
```
|
|
879
|
+
|
|
880
|
+
### locale.ts
|
|
881
|
+
|
|
882
|
+
Example
|
|
883
|
+
|
|
884
|
+
```ts
|
|
885
|
+
import { Component } from '@angular/core';
|
|
886
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
887
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
888
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
889
|
+
import { plainDate } from '@slotted/core/date';
|
|
890
|
+
|
|
891
|
+
@Component({
|
|
892
|
+
selector: 'app-date-picker-locale',
|
|
893
|
+
imports: [SlDatePicker, SlField, SlFieldLabel, SlStack],
|
|
894
|
+
template: `
|
|
895
|
+
<div slStack [gap]="5">
|
|
896
|
+
<div slField>
|
|
897
|
+
<label slFieldLabel>Ship date, United States (en-US)</label>
|
|
898
|
+
<div slDatePicker locale="en-US" [defaultValue]="shipDate"></div>
|
|
899
|
+
</div>
|
|
900
|
+
<div slField>
|
|
901
|
+
<label slFieldLabel>Ship date, United Kingdom (en-GB)</label>
|
|
902
|
+
<div slDatePicker locale="en-GB" [defaultValue]="shipDate"></div>
|
|
903
|
+
</div>
|
|
904
|
+
<div slField>
|
|
905
|
+
<label slFieldLabel>Ship date, Germany (de-DE)</label>
|
|
906
|
+
<div slDatePicker locale="de-DE" [defaultValue]="shipDate"></div>
|
|
907
|
+
</div>
|
|
908
|
+
<div slField>
|
|
909
|
+
<label slFieldLabel>Ship date, Japan (ja-JP)</label>
|
|
910
|
+
<div slDatePicker locale="ja-JP" [defaultValue]="shipDate"></div>
|
|
911
|
+
</div>
|
|
912
|
+
</div>
|
|
913
|
+
`,
|
|
914
|
+
})
|
|
915
|
+
export class DatePickerLocale {
|
|
916
|
+
protected readonly shipDate = plainDate(2026, 9, 30);
|
|
917
|
+
}
|
|
918
|
+
```
|
|
919
|
+
|
|
920
|
+
### months.ts
|
|
921
|
+
|
|
922
|
+
Example
|
|
923
|
+
|
|
924
|
+
```ts
|
|
925
|
+
import { Component } from '@angular/core';
|
|
926
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
927
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
928
|
+
import { plainDate } from '@slotted/core/date';
|
|
929
|
+
|
|
930
|
+
@Component({
|
|
931
|
+
selector: 'app-date-picker-months',
|
|
932
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
933
|
+
template: `
|
|
934
|
+
<div slField>
|
|
935
|
+
<label slFieldLabel>Installation appointment</label>
|
|
936
|
+
<div slDatePicker [defaultValue]="appointment" [months]="2"></div>
|
|
937
|
+
<span slFieldDescription>Technicians book up to eight weeks ahead.</span>
|
|
938
|
+
</div>
|
|
939
|
+
`,
|
|
940
|
+
})
|
|
941
|
+
export class DatePickerMonths {
|
|
942
|
+
protected readonly appointment = plainDate(2026, 10, 20);
|
|
943
|
+
}
|
|
944
|
+
```
|
|
945
|
+
|
|
946
|
+
### report-date.ts
|
|
947
|
+
|
|
948
|
+
Example
|
|
949
|
+
|
|
950
|
+
```ts
|
|
951
|
+
import { Component, computed, signal } from '@angular/core';
|
|
952
|
+
import { SlButton } from '@slotted/angular/button';
|
|
953
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
954
|
+
import { SlDatePicker, SlDatePickerPresets } from '@slotted/angular/date-picker';
|
|
955
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
956
|
+
import { createDateFormat, isPlainDate, plainDate, type PlainDate } from '@slotted/core/date';
|
|
957
|
+
|
|
958
|
+
const TODAY = plainDate(2026, 9, 30);
|
|
959
|
+
const PRESETS = [
|
|
960
|
+
{ label: 'Today', date: TODAY },
|
|
961
|
+
{ label: 'End of last month', date: plainDate(2026, 8, 31) },
|
|
962
|
+
{ label: 'End of last quarter', date: plainDate(2026, 6, 30) },
|
|
963
|
+
{ label: 'End of fiscal 2025', date: plainDate(2025, 12, 31) },
|
|
964
|
+
];
|
|
965
|
+
const words = createDateFormat({ locale: 'en-US' });
|
|
966
|
+
|
|
967
|
+
@Component({
|
|
968
|
+
selector: 'app-date-picker-report-date',
|
|
969
|
+
imports: [SlButton, SlDatePicker, SlDatePickerPresets, SlField, SlFieldDescription, SlFieldLabel],
|
|
970
|
+
template: `
|
|
971
|
+
<div slField>
|
|
972
|
+
<label slFieldLabel>Balance sheet as of</label>
|
|
973
|
+
<div
|
|
974
|
+
slDatePicker
|
|
975
|
+
#picker="slDatePicker"
|
|
976
|
+
[max]="today"
|
|
977
|
+
[value]="asOf()"
|
|
978
|
+
(valueChange)="set($event.value)"
|
|
979
|
+
>
|
|
980
|
+
<div slDatePickerPresets>
|
|
981
|
+
@for (preset of presets; track preset.label) {
|
|
982
|
+
<button
|
|
983
|
+
slButton
|
|
984
|
+
size="sm"
|
|
985
|
+
variant="ghost"
|
|
986
|
+
type="button"
|
|
987
|
+
(click)="asOf.set(preset.date); picker.closeSurface()"
|
|
988
|
+
>
|
|
989
|
+
{{ preset.label }}
|
|
990
|
+
</button>
|
|
991
|
+
}
|
|
992
|
+
</div>
|
|
993
|
+
</div>
|
|
994
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
995
|
+
</div>
|
|
996
|
+
`,
|
|
997
|
+
})
|
|
998
|
+
export class DatePickerReportDate {
|
|
999
|
+
protected readonly today = TODAY;
|
|
1000
|
+
protected readonly presets = PRESETS;
|
|
1001
|
+
protected readonly asOf = signal<PlainDate | null>(plainDate(2026, 8, 31));
|
|
1002
|
+
protected readonly summary = computed(() => {
|
|
1003
|
+
const asOf = this.asOf();
|
|
1004
|
+
return asOf === null
|
|
1005
|
+
? 'Choose the closing date of the report.'
|
|
1006
|
+
: `Balances close at the end of ${words.describe(asOf)}.`;
|
|
1007
|
+
});
|
|
1008
|
+
|
|
1009
|
+
protected set(value: CalendarValue): void {
|
|
1010
|
+
this.asOf.set(isPlainDate(value) ? value : null);
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
```
|
|
1014
|
+
|
|
1015
|
+
### shipping-date.ts
|
|
1016
|
+
|
|
1017
|
+
Example
|
|
1018
|
+
|
|
1019
|
+
```ts
|
|
1020
|
+
import { Component, computed, signal } from '@angular/core';
|
|
1021
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
1022
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
1023
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1024
|
+
import {
|
|
1025
|
+
addDays,
|
|
1026
|
+
compareDate,
|
|
1027
|
+
createDateFormat,
|
|
1028
|
+
dayOfWeek,
|
|
1029
|
+
isPlainDate,
|
|
1030
|
+
plainDate,
|
|
1031
|
+
toISODate,
|
|
1032
|
+
type PlainDate,
|
|
1033
|
+
} from '@slotted/core/date';
|
|
1034
|
+
|
|
1035
|
+
const ORDERED = plainDate(2026, 9, 30);
|
|
1036
|
+
const HOLIDAYS = new Set(['2026-10-12', '2026-11-11', '2026-11-26', '2026-12-25']);
|
|
1037
|
+
const words = createDateFormat({ locale: 'en-US' });
|
|
1038
|
+
|
|
1039
|
+
const isBusinessDay = (date: PlainDate) =>
|
|
1040
|
+
dayOfWeek(date) !== 0 && dayOfWeek(date) !== 6 && !HOLIDAYS.has(toISODate(date));
|
|
1041
|
+
|
|
1042
|
+
const addBusinessDays = (from: PlainDate, count: number) => {
|
|
1043
|
+
let date = from;
|
|
1044
|
+
for (let added = 0; added < count;) {
|
|
1045
|
+
date = addDays(date, 1);
|
|
1046
|
+
if (isBusinessDay(date)) added += 1;
|
|
1047
|
+
}
|
|
1048
|
+
return date;
|
|
1049
|
+
};
|
|
1050
|
+
|
|
1051
|
+
const businessDaysBetween = (from: PlainDate, to: PlainDate) => {
|
|
1052
|
+
let count = 0;
|
|
1053
|
+
for (let date = addDays(from, 1); compareDate(date, to) <= 0; date = addDays(date, 1)) {
|
|
1054
|
+
if (isBusinessDay(date)) count += 1;
|
|
1055
|
+
}
|
|
1056
|
+
return count;
|
|
1057
|
+
};
|
|
1058
|
+
|
|
1059
|
+
const EARLIEST = addBusinessDays(ORDERED, 2);
|
|
1060
|
+
const LATEST = addBusinessDays(ORDERED, 40);
|
|
1061
|
+
|
|
1062
|
+
@Component({
|
|
1063
|
+
selector: 'app-date-picker-shipping-date',
|
|
1064
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
1065
|
+
template: `
|
|
1066
|
+
<div slField required>
|
|
1067
|
+
<label slFieldLabel>Ship date</label>
|
|
1068
|
+
<div
|
|
1069
|
+
slDatePicker
|
|
1070
|
+
[isDateUnavailable]="isClosed"
|
|
1071
|
+
[max]="latest"
|
|
1072
|
+
[min]="earliest"
|
|
1073
|
+
[value]="date()"
|
|
1074
|
+
(valueChange)="set($event.value)"
|
|
1075
|
+
></div>
|
|
1076
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
1077
|
+
</div>
|
|
1078
|
+
`,
|
|
1079
|
+
})
|
|
1080
|
+
export class DatePickerShippingDate {
|
|
1081
|
+
protected readonly earliest = EARLIEST;
|
|
1082
|
+
protected readonly latest = LATEST;
|
|
1083
|
+
protected readonly isClosed = (day: PlainDate) => !isBusinessDay(day);
|
|
1084
|
+
protected readonly date = signal<PlainDate | null>(EARLIEST);
|
|
1085
|
+
protected readonly summary = computed(() => {
|
|
1086
|
+
const date = this.date();
|
|
1087
|
+
return date === null
|
|
1088
|
+
? 'Orders ship 2 to 40 business days after they are placed.'
|
|
1089
|
+
: `Ships ${words.describe(date)}, ${businessDaysBetween(ORDERED, date)} business days after the order.`;
|
|
1090
|
+
});
|
|
1091
|
+
|
|
1092
|
+
protected set(value: CalendarValue): void {
|
|
1093
|
+
this.date.set(isPlainDate(value) ? value : null);
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
### time-zones.ts
|
|
1099
|
+
|
|
1100
|
+
Example
|
|
1101
|
+
|
|
1102
|
+
```ts
|
|
1103
|
+
import { Component, computed, signal } from '@angular/core';
|
|
1104
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
1105
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
1106
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1107
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
1108
|
+
import { SlText } from '@slotted/angular/typography';
|
|
1109
|
+
import { isPlainDate, plainDate, toISODate, type PlainDate } from '@slotted/core/date';
|
|
1110
|
+
|
|
1111
|
+
@Component({
|
|
1112
|
+
selector: 'app-date-picker-time-zones',
|
|
1113
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel, SlStack, SlText],
|
|
1114
|
+
template: `
|
|
1115
|
+
<div slStack [gap]="4">
|
|
1116
|
+
<div slField>
|
|
1117
|
+
<label slFieldLabel>Settlement date, Auckland desk</label>
|
|
1118
|
+
<div
|
|
1119
|
+
slDatePicker
|
|
1120
|
+
timeZone="Pacific/Auckland"
|
|
1121
|
+
[value]="date()"
|
|
1122
|
+
(valueChange)="set($event.value)"
|
|
1123
|
+
></div>
|
|
1124
|
+
<span slFieldDescription>Today is marked by the date in Auckland.</span>
|
|
1125
|
+
</div>
|
|
1126
|
+
<span slText size="sm" tone="muted">{{ readout() }}</span>
|
|
1127
|
+
</div>
|
|
1128
|
+
`,
|
|
1129
|
+
})
|
|
1130
|
+
export class DatePickerTimeZones {
|
|
1131
|
+
protected readonly date = signal<PlainDate | null>(plainDate(2026, 9, 30));
|
|
1132
|
+
protected readonly readout = computed(() => {
|
|
1133
|
+
const date = this.date();
|
|
1134
|
+
return date === null
|
|
1135
|
+
? 'Value: null'
|
|
1136
|
+
: `Value: ${JSON.stringify(date)}, sent as ${toISODate(date)}`;
|
|
1137
|
+
});
|
|
1138
|
+
|
|
1139
|
+
protected set(value: CalendarValue): void {
|
|
1140
|
+
this.date.set(isPlainDate(value) ? value : null);
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
```
|
|
1144
|
+
|
|
1145
|
+
### typing.ts
|
|
1146
|
+
|
|
1147
|
+
Example
|
|
1148
|
+
|
|
1149
|
+
```ts
|
|
1150
|
+
import { Component, signal } from '@angular/core';
|
|
1151
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
1152
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
1153
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1154
|
+
import { isPlainDate, plainDate, toISODate } from '@slotted/core/date';
|
|
1155
|
+
import type { ChangeRequest } from '@slotted/core/state';
|
|
1156
|
+
|
|
1157
|
+
const REASONS: Record<string, string> = {
|
|
1158
|
+
keyboard: 'from the keyboard',
|
|
1159
|
+
pointer: 'pressed in the calendar',
|
|
1160
|
+
clear: 'cleared',
|
|
1161
|
+
blur: 'completed when the field lost focus',
|
|
1162
|
+
};
|
|
1163
|
+
|
|
1164
|
+
@Component({
|
|
1165
|
+
selector: 'app-date-picker-typing',
|
|
1166
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
1167
|
+
template: `
|
|
1168
|
+
<div slField>
|
|
1169
|
+
<label slFieldLabel>Goods received on</label>
|
|
1170
|
+
<div slDatePicker [defaultValue]="received" (valueChange)="record($event)"></div>
|
|
1171
|
+
<span slFieldDescription>{{ change() }}</span>
|
|
1172
|
+
</div>
|
|
1173
|
+
`,
|
|
1174
|
+
})
|
|
1175
|
+
export class DatePickerTyping {
|
|
1176
|
+
protected readonly received = plainDate(2026, 9, 30);
|
|
1177
|
+
protected readonly change = signal('No change yet.');
|
|
1178
|
+
|
|
1179
|
+
protected record(request: ChangeRequest<CalendarValue>): void {
|
|
1180
|
+
const date = isPlainDate(request.value) ? toISODate(request.value) : 'empty';
|
|
1181
|
+
this.change.set(`${date}, ${REASONS[request.reason] ?? request.reason}.`);
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
```
|
|
1185
|
+
|
|
1186
|
+
### week-numbers.ts
|
|
1187
|
+
|
|
1188
|
+
Example
|
|
1189
|
+
|
|
1190
|
+
```ts
|
|
1191
|
+
import { Component, computed, signal } from '@angular/core';
|
|
1192
|
+
import type { CalendarValue } from '@slotted/angular/calendar';
|
|
1193
|
+
import { SlDatePicker } from '@slotted/angular/date-picker';
|
|
1194
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1195
|
+
import { isPlainDate, isoWeekNumber, plainDate, type PlainDate } from '@slotted/core/date';
|
|
1196
|
+
|
|
1197
|
+
@Component({
|
|
1198
|
+
selector: 'app-date-picker-week-numbers',
|
|
1199
|
+
imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
1200
|
+
template: `
|
|
1201
|
+
<div slField>
|
|
1202
|
+
<label slFieldLabel>Production run</label>
|
|
1203
|
+
<div
|
|
1204
|
+
slDatePicker
|
|
1205
|
+
weekNumbers
|
|
1206
|
+
[firstDayOfWeek]="1"
|
|
1207
|
+
[value]="date()"
|
|
1208
|
+
(valueChange)="set($event.value)"
|
|
1209
|
+
></div>
|
|
1210
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
1211
|
+
</div>
|
|
1212
|
+
`,
|
|
1213
|
+
})
|
|
1214
|
+
export class DatePickerWeekNumbers {
|
|
1215
|
+
protected readonly date = signal<PlainDate | null>(plainDate(2026, 9, 30));
|
|
1216
|
+
|
|
1217
|
+
protected set(value: CalendarValue): void {
|
|
1218
|
+
this.date.set(isPlainDate(value) ? value : null);
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
protected readonly summary = computed(() => {
|
|
1222
|
+
const date = this.date();
|
|
1223
|
+
return date === null ? 'No week planned.' : `Planned for week ${isoWeekNumber(date)}.`;
|
|
1224
|
+
});
|
|
1225
|
+
}
|
|
1226
|
+
```
|