@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,1269 @@
|
|
|
1
|
+
<!-- index: ./index.md -->
|
|
2
|
+
# datetime-picker
|
|
3
|
+
|
|
4
|
+
`data-ui="datetime-picker"` · Date and time field with a picker popover.
|
|
5
|
+
|
|
6
|
+
## Examples
|
|
7
|
+
|
|
8
|
+
### Playground
|
|
9
|
+
|
|
10
|
+
One Datetime Picker driven by the controls below the canvas. Open it: the calendar and the list are both in the panel, the head shows the value so far, and the panel closes on the press that completes the value.
|
|
11
|
+
|
|
12
|
+
Excerpt — not a complete module
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div slField>
|
|
16
|
+
<label slFieldLabel>Pickup date and time</label>
|
|
17
|
+
<div slDateTimePicker name="pickupAt" [clearable]="true"></div>
|
|
18
|
+
<span slFieldDescription>The carrier collects at this date and time.</span>
|
|
19
|
+
</div>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Two surfaces in one dialog
|
|
23
|
+
|
|
24
|
+
The panel holds a grid drawn by SlCalendar and a listbox drawn by the Datetime Picker. Both are in the DOM at every width; no tabs switch between them, so assistive technology reads the same structure on a wide and a narrow screen.
|
|
25
|
+
|
|
26
|
+
Excerpt — not a complete module
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<div slDateTimePicker [defaultOpen]="true"></div>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Which surface takes focus on open
|
|
33
|
+
|
|
34
|
+
openTo decides where focus lands when the panel opens, not what the panel draws. Both surfaces are present either way, in the same order: the calendar, then the list.
|
|
35
|
+
|
|
36
|
+
Excerpt — not a complete module
|
|
37
|
+
|
|
38
|
+
```html
|
|
39
|
+
<div slDateTimePicker openTo="time"></div>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### The value closes the panel, not a button
|
|
43
|
+
|
|
44
|
+
With closeOnSelect="auto", the press that completes the value closes the panel. A press on a value that was already whole changes one half and leaves the panel open, so the reader can change the day and then the time. always closes on every press that changes the value; never closes on none.
|
|
45
|
+
|
|
46
|
+
Excerpt — not a complete module
|
|
47
|
+
|
|
48
|
+
```html
|
|
49
|
+
<div slDateTimePicker closeOnSelect="auto"></div>
|
|
50
|
+
<div slDateTimePicker closeOnSelect="always"></div>
|
|
51
|
+
<div slDateTimePicker closeOnSelect="never"></div>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Seconds
|
|
55
|
+
|
|
56
|
+
granularity="second" writes seconds in the field, and a step of 30 offers a time every half minute. The list stops at maxOptions rows, so a step in seconds needs a window from minTime to maxTime to stay short.
|
|
57
|
+
|
|
58
|
+
Excerpt — not a complete module
|
|
59
|
+
|
|
60
|
+
```html
|
|
61
|
+
<div slDateTimePicker granularity="second" [step]="30"></div>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### The step, and where it counts from
|
|
65
|
+
|
|
66
|
+
The list counts from min’s time when min is set and from midnight when it is not, the rule input[type=time] uses. A step of 900 from 09:07 offers 09:07, 09:22 and 09:37; the field still accepts 09:15 by typing.
|
|
67
|
+
|
|
68
|
+
Example
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { Component } from '@angular/core';
|
|
72
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
73
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
74
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
75
|
+
|
|
76
|
+
@Component({
|
|
77
|
+
selector: 'app-datetime-picker-step',
|
|
78
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
79
|
+
template: `
|
|
80
|
+
<div slField>
|
|
81
|
+
<label slFieldLabel>Dock appointment</label>
|
|
82
|
+
<div
|
|
83
|
+
slDateTimePicker
|
|
84
|
+
[maxTime]="lastStart"
|
|
85
|
+
[minTime]="firstStart"
|
|
86
|
+
[referenceDateTime]="reference"
|
|
87
|
+
[step]="1800"
|
|
88
|
+
></div>
|
|
89
|
+
<span slFieldDescription>Appointments start every 30 minutes from 7:15 AM.</span>
|
|
90
|
+
</div>
|
|
91
|
+
`,
|
|
92
|
+
})
|
|
93
|
+
export class DateTimePickerStep {
|
|
94
|
+
protected readonly firstStart = plainTime(7, 15);
|
|
95
|
+
protected readonly lastStart = plainTime(16, 45);
|
|
96
|
+
protected readonly reference = plainDateTime(plainDate(2026, 9, 30), plainTime(7, 15));
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Two pairs of bounds together
|
|
101
|
+
|
|
102
|
+
min and max bound the whole value; minTime and maxTime bound the times of every day inside the range. On the day of min the list starts at min’s time, on the day of max it stops at max’s time, and on every day between it runs from minTime to maxTime.
|
|
103
|
+
|
|
104
|
+
Excerpt — not a complete module
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<div
|
|
108
|
+
slDateTimePicker
|
|
109
|
+
[min]="bookingOpens"
|
|
110
|
+
[max]="bookingCloses"
|
|
111
|
+
[minTime]="nine"
|
|
112
|
+
[maxTime]="six"
|
|
113
|
+
></div>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### The list follows the day the reader is on
|
|
117
|
+
|
|
118
|
+
Before a day is chosen, the list answers the day the calendar has focused. Moving through the month recomputes it, so a Saturday that closes early shows its shorter list, or the empty state, while the reader is still deciding.
|
|
119
|
+
|
|
120
|
+
Excerpt — not a complete module
|
|
121
|
+
|
|
122
|
+
```html
|
|
123
|
+
<div slDateTimePicker [isTimeUnavailable]="closesEarlyOnSaturday"></div>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Refused times are disabled or hidden
|
|
127
|
+
|
|
128
|
+
A refused time stays in the list, disabled, so the reader can still see the step. unavailableOptions="hide" removes refused times instead. A day that offers no time shows the empty message.
|
|
129
|
+
|
|
130
|
+
Example
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
import { Component } from '@angular/core';
|
|
134
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
135
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
136
|
+
import {
|
|
137
|
+
dayOfWeek,
|
|
138
|
+
plainDate,
|
|
139
|
+
plainDateTime,
|
|
140
|
+
plainTime,
|
|
141
|
+
type PlainDate,
|
|
142
|
+
type PlainTime,
|
|
143
|
+
} from '@slotted/core/date';
|
|
144
|
+
|
|
145
|
+
@Component({
|
|
146
|
+
selector: 'app-datetime-picker-unavailable',
|
|
147
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
148
|
+
template: `
|
|
149
|
+
<div slField>
|
|
150
|
+
<label slFieldLabel>Warehouse inspection</label>
|
|
151
|
+
<div
|
|
152
|
+
slDateTimePicker
|
|
153
|
+
[isDateUnavailable]="isWeekend"
|
|
154
|
+
[isTimeUnavailable]="isLunch"
|
|
155
|
+
[maxTime]="dayEnds"
|
|
156
|
+
[minTime]="dayStarts"
|
|
157
|
+
[referenceDateTime]="reference"
|
|
158
|
+
[step]="1800"
|
|
159
|
+
></div>
|
|
160
|
+
<span slFieldDescription>Weekdays from 8:00 AM to 5:00 PM, closed for lunch at noon.</span>
|
|
161
|
+
</div>
|
|
162
|
+
`,
|
|
163
|
+
})
|
|
164
|
+
export class DateTimePickerUnavailable {
|
|
165
|
+
protected readonly dayStarts = plainTime(8, 0);
|
|
166
|
+
protected readonly dayEnds = plainTime(17, 0);
|
|
167
|
+
protected readonly reference = plainDateTime(plainDate(2026, 9, 30), plainTime(9, 0));
|
|
168
|
+
protected readonly isWeekend = (date: PlainDate) =>
|
|
169
|
+
dayOfWeek(date) === 0 || dayOfWeek(date) === 6;
|
|
170
|
+
protected readonly isLunch = (time: PlainTime) => time.hour === 12;
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### One press for the current date and time
|
|
175
|
+
|
|
176
|
+
Now writes both halves from the clock in timeZone. It does the same as the relative expression 0 in the field, for a reader who does not know the expression. messages.now replaces its label.
|
|
177
|
+
|
|
178
|
+
Excerpt — not a complete module
|
|
179
|
+
|
|
180
|
+
```html
|
|
181
|
+
<div slDateTimePicker [messages]="{ now: 'Right now' }"></div>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Typing with the panel open
|
|
185
|
+
|
|
186
|
+
Alt+ArrowDown opens the panel and leaves focus in the field, so every key the segments take still works, including +, - and = for a relative expression. Escape closes the expression first and leaves the panel open.
|
|
187
|
+
|
|
188
|
+
Excerpt — not a complete module
|
|
189
|
+
|
|
190
|
+
```html
|
|
191
|
+
<div slDateTimePicker [defaultOpen]="true" [referenceDateTime]="reference"></div>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Your own shortcuts
|
|
195
|
+
|
|
196
|
+
An element with slDateTimePickerPresets adds a row in the head beside Now. The row wraps inside the panel’s width instead of widening it.
|
|
197
|
+
|
|
198
|
+
Excerpt — not a complete module
|
|
199
|
+
|
|
200
|
+
```html
|
|
201
|
+
<div slDateTimePicker>
|
|
202
|
+
<div slDateTimePickerPresets>
|
|
203
|
+
<button slButton size="sm" variant="ghost" type="button" (click)="tomorrowAtNine()">
|
|
204
|
+
Tomorrow, 9:00 AM
|
|
205
|
+
</button>
|
|
206
|
+
<button slButton size="sm" variant="ghost" type="button" (click)="mondayAtTwo()">
|
|
207
|
+
Monday, 2:00 PM
|
|
208
|
+
</button>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Size
|
|
214
|
+
|
|
215
|
+
The three steps of the control scale. Inside a field, an unset size follows the field. The rows of the list follow the same scale.
|
|
216
|
+
|
|
217
|
+
Example
|
|
218
|
+
|
|
219
|
+
```ts
|
|
220
|
+
import { Component } from '@angular/core';
|
|
221
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
222
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
223
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
224
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
225
|
+
|
|
226
|
+
@Component({
|
|
227
|
+
selector: 'app-datetime-picker-sizes',
|
|
228
|
+
imports: [SlDateTimePicker, SlField, SlFieldLabel, SlStack],
|
|
229
|
+
template: `
|
|
230
|
+
<div slStack [gap]="5">
|
|
231
|
+
<div slField>
|
|
232
|
+
<label slFieldLabel>Created after</label>
|
|
233
|
+
<div slDateTimePicker size="sm" [defaultValue]="created"></div>
|
|
234
|
+
</div>
|
|
235
|
+
<div slField>
|
|
236
|
+
<label slFieldLabel>Pickup</label>
|
|
237
|
+
<div slDateTimePicker size="md" [defaultValue]="pickup"></div>
|
|
238
|
+
</div>
|
|
239
|
+
<div slField>
|
|
240
|
+
<label slFieldLabel>Store opening</label>
|
|
241
|
+
<div slDateTimePicker size="lg" [defaultValue]="opening"></div>
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
`,
|
|
245
|
+
})
|
|
246
|
+
export class DateTimePickerSizes {
|
|
247
|
+
protected readonly created = plainDateTime(plainDate(2026, 9, 1), plainTime(0, 0));
|
|
248
|
+
protected readonly pickup = plainDateTime(plainDate(2026, 9, 30), plainTime(9, 0));
|
|
249
|
+
protected readonly opening = plainDateTime(plainDate(2026, 11, 2), plainTime(10, 0));
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Variant
|
|
254
|
+
|
|
255
|
+
The frame is the datetime field’s, the same frame every field in a form draws. plain draws no frame at rest, for a table cell or a toolbar, and still shows hover and focus.
|
|
256
|
+
|
|
257
|
+
Example
|
|
258
|
+
|
|
259
|
+
```ts
|
|
260
|
+
import { Component } from '@angular/core';
|
|
261
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
262
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
263
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
264
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
265
|
+
|
|
266
|
+
@Component({
|
|
267
|
+
selector: 'app-datetime-picker-variants',
|
|
268
|
+
imports: [SlDateTimePicker, SlField, SlFieldLabel, SlStack],
|
|
269
|
+
template: `
|
|
270
|
+
<div slStack [gap]="5">
|
|
271
|
+
<div slField>
|
|
272
|
+
<label slFieldLabel>Pickup</label>
|
|
273
|
+
<div slDateTimePicker variant="outline" [defaultValue]="pickup"></div>
|
|
274
|
+
</div>
|
|
275
|
+
<div slField>
|
|
276
|
+
<label slFieldLabel>Loading starts</label>
|
|
277
|
+
<div slDateTimePicker variant="subtle" [defaultValue]="pickup"></div>
|
|
278
|
+
</div>
|
|
279
|
+
<div slField>
|
|
280
|
+
<label slFieldLabel>Gate opens</label>
|
|
281
|
+
<div slDateTimePicker variant="plain" [defaultValue]="pickup"></div>
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
`,
|
|
285
|
+
})
|
|
286
|
+
export class DateTimePickerVariants {
|
|
287
|
+
protected readonly pickup = plainDateTime(plainDate(2026, 9, 30), plainTime(9, 0));
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Placement
|
|
292
|
+
|
|
293
|
+
Where the panel opens relative to the control. It is a preference: when the panel does not fit on that side, the positioner opens it on the other, and data-placement says which side it chose.
|
|
294
|
+
|
|
295
|
+
Excerpt — not a complete module
|
|
296
|
+
|
|
297
|
+
```html
|
|
298
|
+
<div slDateTimePicker placement="top-start"></div>
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### States
|
|
302
|
+
|
|
303
|
+
Read-only stays focusable and legible. Disabled takes no key and no press, and its trigger is a disabled button. Invalid draws the frame and the focus ring in the danger tone. In the list, the chosen time outranks the highlighted time, which outranks hover.
|
|
304
|
+
|
|
305
|
+
Example
|
|
306
|
+
|
|
307
|
+
```ts
|
|
308
|
+
import { Component } from '@angular/core';
|
|
309
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
310
|
+
import { SlField, SlFieldDescription, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
|
|
311
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
312
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
313
|
+
|
|
314
|
+
@Component({
|
|
315
|
+
selector: 'app-datetime-picker-states',
|
|
316
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldError, SlFieldLabel, SlStack],
|
|
317
|
+
template: `
|
|
318
|
+
<div slStack [gap]="5">
|
|
319
|
+
<div slField invalid required>
|
|
320
|
+
<label slFieldLabel>Pickup</label>
|
|
321
|
+
<div slDateTimePicker [defaultValue]="early"></div>
|
|
322
|
+
<span slFieldError
|
|
323
|
+
>The pickup is before the order was placed, September 30 at 9:00 AM.</span
|
|
324
|
+
>
|
|
325
|
+
</div>
|
|
326
|
+
<div slField readOnly>
|
|
327
|
+
<label slFieldLabel>Order placed</label>
|
|
328
|
+
<div slDateTimePicker [defaultValue]="placed"></div>
|
|
329
|
+
<span slFieldDescription>Set when the order was placed.</span>
|
|
330
|
+
</div>
|
|
331
|
+
<div slField disabled>
|
|
332
|
+
<label slFieldLabel>Delivered</label>
|
|
333
|
+
<div slDateTimePicker></div>
|
|
334
|
+
<span slFieldDescription>Filled in by the carrier on delivery.</span>
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
`,
|
|
338
|
+
})
|
|
339
|
+
export class DateTimePickerStates {
|
|
340
|
+
protected readonly early = plainDateTime(plainDate(2026, 9, 29), plainTime(16, 0));
|
|
341
|
+
protected readonly placed = plainDateTime(plainDate(2026, 9, 30), plainTime(9, 0));
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### In a form
|
|
346
|
+
|
|
347
|
+
The Datetime Picker is a form control: formControlName, formControl and ngModel bind the value, and name adds a hidden input that submits it as YYYY-MM-DDTHH:mm:ss. The field around it supplies the label, the description and the error, and passes its size, disabled state and validity to the Datetime Picker unless it sets its own.
|
|
348
|
+
|
|
349
|
+
Excerpt — not a complete module
|
|
350
|
+
|
|
351
|
+
```html
|
|
352
|
+
<form [formGroup]="form">
|
|
353
|
+
<div slField>
|
|
354
|
+
<label slFieldLabel>Pickup date and time</label>
|
|
355
|
+
<div slDateTimePicker formControlName="pickupAt"></div>
|
|
356
|
+
<span slFieldDescription>The dock is open from 9:00 AM to 6:00 PM.</span>
|
|
357
|
+
</div>
|
|
358
|
+
</form>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Narrow
|
|
362
|
+
|
|
363
|
+
With too little room for both surfaces, the list wraps under the calendar, in the value’s own order. Nothing is hidden and no switch is drawn.
|
|
364
|
+
|
|
365
|
+
Example
|
|
366
|
+
|
|
367
|
+
```ts
|
|
368
|
+
import { Component, signal } from '@angular/core';
|
|
369
|
+
import { SlButton } from '@slotted/angular/button';
|
|
370
|
+
import { SlDateTimePicker, SlDateTimePickerPresets } from '@slotted/angular/datetime-picker';
|
|
371
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
372
|
+
import {
|
|
373
|
+
addDays,
|
|
374
|
+
plainDate,
|
|
375
|
+
plainDateTime,
|
|
376
|
+
plainTime,
|
|
377
|
+
type PlainDateTime,
|
|
378
|
+
} from '@slotted/core/date';
|
|
379
|
+
|
|
380
|
+
const TODAY = plainDate(2026, 9, 30);
|
|
381
|
+
|
|
382
|
+
@Component({
|
|
383
|
+
selector: 'app-datetime-picker-narrow',
|
|
384
|
+
imports: [SlButton, SlDateTimePicker, SlDateTimePickerPresets, SlField, SlFieldLabel],
|
|
385
|
+
template: `
|
|
386
|
+
<div slField>
|
|
387
|
+
<label slFieldLabel>Delivery appointment</label>
|
|
388
|
+
<div
|
|
389
|
+
slDateTimePicker
|
|
390
|
+
#picker="slDateTimePicker"
|
|
391
|
+
[referenceDateTime]="reference"
|
|
392
|
+
[step]="1800"
|
|
393
|
+
[value]="delivery()"
|
|
394
|
+
(valueChange)="delivery.set($event.value)"
|
|
395
|
+
>
|
|
396
|
+
<div slDateTimePickerPresets>
|
|
397
|
+
<button
|
|
398
|
+
slButton
|
|
399
|
+
size="sm"
|
|
400
|
+
type="button"
|
|
401
|
+
variant="ghost"
|
|
402
|
+
(click)="delivery.set(todayAtFive); picker.closeSurface()"
|
|
403
|
+
>
|
|
404
|
+
Today, 5:00 PM
|
|
405
|
+
</button>
|
|
406
|
+
<button
|
|
407
|
+
slButton
|
|
408
|
+
size="sm"
|
|
409
|
+
type="button"
|
|
410
|
+
variant="ghost"
|
|
411
|
+
(click)="delivery.set(tomorrowAtNine); picker.closeSurface()"
|
|
412
|
+
>
|
|
413
|
+
Tomorrow, 9:00 AM
|
|
414
|
+
</button>
|
|
415
|
+
</div>
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
`,
|
|
419
|
+
})
|
|
420
|
+
export class DateTimePickerNarrow {
|
|
421
|
+
protected readonly reference = plainDateTime(TODAY, plainTime(9, 0));
|
|
422
|
+
protected readonly todayAtFive = plainDateTime(TODAY, plainTime(17, 0));
|
|
423
|
+
protected readonly tomorrowAtNine = plainDateTime(addDays(TODAY, 1), plainTime(9, 0));
|
|
424
|
+
protected readonly delivery = signal<PlainDateTime | null>(null);
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### Composition
|
|
429
|
+
|
|
430
|
+
provideDateTimePickerDefaults sets the step and the clock once; provideSlotted sets the language and the words; an ng-template with slDateTimePickerOption draws the content of one row; slDateTimePickerFooter takes your actions; and exportAs reaches focus(), openSurface() and closeSurface(). A value set on one Datetime Picker still wins over the provider.
|
|
431
|
+
|
|
432
|
+
Excerpt — not a complete module
|
|
433
|
+
|
|
434
|
+
```html
|
|
435
|
+
<div slDateTimePicker>
|
|
436
|
+
<ng-template slDateTimePickerOption let-time let-label="label">
|
|
437
|
+
<span>{{ label }}</span>
|
|
438
|
+
<span>{{ seatsLeft(time) }} seats left</span>
|
|
439
|
+
</ng-template>
|
|
440
|
+
</div>
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### Keyboard
|
|
444
|
+
|
|
445
|
+
Alt+ArrowDown opens the panel from a segment and leaves focus in the field. ArrowDown on the trigger opens it and moves focus into the surface openTo names. In the list: the arrow keys, Home, End, type-ahead, and PageUp and PageDown to the previous or next hour. Tab stays inside the panel while it is open, and each surface is one Tab stop.
|
|
446
|
+
|
|
447
|
+
Example
|
|
448
|
+
|
|
449
|
+
```ts
|
|
450
|
+
import { Component, signal } from '@angular/core';
|
|
451
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
452
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
453
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
454
|
+
import type { ChangeRequest } from '@slotted/core/state';
|
|
455
|
+
|
|
456
|
+
@Component({
|
|
457
|
+
selector: 'app-datetime-picker-keyboard',
|
|
458
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
459
|
+
template: `
|
|
460
|
+
<div slField>
|
|
461
|
+
<label slFieldLabel>Dispatch</label>
|
|
462
|
+
<div
|
|
463
|
+
slDateTimePicker
|
|
464
|
+
[defaultValue]="dispatch"
|
|
465
|
+
[messages]="messages"
|
|
466
|
+
(openChange)="record($event)"
|
|
467
|
+
></div>
|
|
468
|
+
<span slFieldDescription>{{ last() }}</span>
|
|
469
|
+
</div>
|
|
470
|
+
`,
|
|
471
|
+
})
|
|
472
|
+
export class DateTimePickerKeyboard {
|
|
473
|
+
protected readonly dispatch = plainDateTime(plainDate(2026, 9, 30), plainTime(16, 30));
|
|
474
|
+
protected readonly messages = {
|
|
475
|
+
choose: 'Choose dispatch time',
|
|
476
|
+
change: 'Change dispatch time, {date}',
|
|
477
|
+
};
|
|
478
|
+
protected readonly last = signal('Focus the field and press Alt+ArrowDown.');
|
|
479
|
+
|
|
480
|
+
protected record(request: ChangeRequest<boolean>): void {
|
|
481
|
+
this.last.set(`${request.value ? 'Opened' : 'Closed'} by ${request.reason}.`);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### bounds.ts
|
|
487
|
+
|
|
488
|
+
Example
|
|
489
|
+
|
|
490
|
+
```ts
|
|
491
|
+
import { Component } from '@angular/core';
|
|
492
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
493
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
494
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
495
|
+
|
|
496
|
+
@Component({
|
|
497
|
+
selector: 'app-datetime-picker-bounds',
|
|
498
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
499
|
+
template: `
|
|
500
|
+
<div slField>
|
|
501
|
+
<label slFieldLabel>Container collection</label>
|
|
502
|
+
<div
|
|
503
|
+
slDateTimePicker
|
|
504
|
+
[defaultValue]="opens"
|
|
505
|
+
[max]="closes"
|
|
506
|
+
[maxTime]="dayEnds"
|
|
507
|
+
[min]="opens"
|
|
508
|
+
[minTime]="dayStarts"
|
|
509
|
+
[step]="3600"
|
|
510
|
+
></div>
|
|
511
|
+
<span slFieldDescription>
|
|
512
|
+
From October 1 at 1:00 PM to October 9 at 12:00 PM, between 8:00 AM and 5:00 PM.
|
|
513
|
+
</span>
|
|
514
|
+
</div>
|
|
515
|
+
`,
|
|
516
|
+
})
|
|
517
|
+
export class DateTimePickerBounds {
|
|
518
|
+
protected readonly opens = plainDateTime(plainDate(2026, 10, 1), plainTime(13, 0));
|
|
519
|
+
protected readonly closes = plainDateTime(plainDate(2026, 10, 9), plainTime(12, 0));
|
|
520
|
+
protected readonly dayStarts = plainTime(8, 0);
|
|
521
|
+
protected readonly dayEnds = plainTime(17, 0);
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### carrier-pickup.ts
|
|
526
|
+
|
|
527
|
+
Example
|
|
528
|
+
|
|
529
|
+
```ts
|
|
530
|
+
import { Component, computed, signal } from '@angular/core';
|
|
531
|
+
import { SlButton } from '@slotted/angular/button';
|
|
532
|
+
import {
|
|
533
|
+
SlDateTimePicker,
|
|
534
|
+
SlDateTimePickerFooter,
|
|
535
|
+
SlDateTimePickerOption,
|
|
536
|
+
} from '@slotted/angular/datetime-picker';
|
|
537
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
538
|
+
import { SlText } from '@slotted/angular/typography';
|
|
539
|
+
import {
|
|
540
|
+
createDateTimeFormat,
|
|
541
|
+
dayOfWeek,
|
|
542
|
+
plainDate,
|
|
543
|
+
plainDateTime,
|
|
544
|
+
plainTime,
|
|
545
|
+
toISODate,
|
|
546
|
+
toISOTime,
|
|
547
|
+
type PlainDate,
|
|
548
|
+
type PlainDateTime,
|
|
549
|
+
type PlainTime,
|
|
550
|
+
} from '@slotted/core/date';
|
|
551
|
+
|
|
552
|
+
const TRUCKS_PER_WINDOW = 3;
|
|
553
|
+
/** Pickups already booked, by date and window. */
|
|
554
|
+
const BOOKED: Record<string, number> = {
|
|
555
|
+
'2026-10-01T08:00:00': 3,
|
|
556
|
+
'2026-10-01T10:30:00': 2,
|
|
557
|
+
'2026-10-02T13:00:00': 3,
|
|
558
|
+
'2026-10-02T15:30:00': 1,
|
|
559
|
+
};
|
|
560
|
+
const words = createDateTimeFormat({ locale: 'en-US' });
|
|
561
|
+
|
|
562
|
+
const trucksLeft = (time: PlainTime, date: PlainDate) =>
|
|
563
|
+
TRUCKS_PER_WINDOW - (BOOKED[`${toISODate(date)}T${toISOTime(time)}`] ?? 0);
|
|
564
|
+
|
|
565
|
+
@Component({
|
|
566
|
+
selector: 'app-datetime-picker-carrier-pickup',
|
|
567
|
+
imports: [
|
|
568
|
+
SlButton,
|
|
569
|
+
SlDateTimePicker,
|
|
570
|
+
SlDateTimePickerFooter,
|
|
571
|
+
SlDateTimePickerOption,
|
|
572
|
+
SlField,
|
|
573
|
+
SlFieldDescription,
|
|
574
|
+
SlFieldLabel,
|
|
575
|
+
SlText,
|
|
576
|
+
],
|
|
577
|
+
template: `
|
|
578
|
+
<div slField required>
|
|
579
|
+
<label slFieldLabel>Carrier pickup slot</label>
|
|
580
|
+
<div
|
|
581
|
+
slDateTimePicker
|
|
582
|
+
#picker="slDateTimePicker"
|
|
583
|
+
closeOnSelect="never"
|
|
584
|
+
[isDateUnavailable]="isWeekend"
|
|
585
|
+
[isTimeUnavailable]="isFull"
|
|
586
|
+
[min]="earliest"
|
|
587
|
+
[options]="windows"
|
|
588
|
+
[referenceDateTime]="reference"
|
|
589
|
+
[value]="pickup()"
|
|
590
|
+
(valueChange)="pickup.set($event.value)"
|
|
591
|
+
>
|
|
592
|
+
<ng-template
|
|
593
|
+
slDateTimePickerOption
|
|
594
|
+
let-time
|
|
595
|
+
let-date="date"
|
|
596
|
+
let-label="label"
|
|
597
|
+
let-unavailable="unavailable"
|
|
598
|
+
>
|
|
599
|
+
<span>{{ label }}</span>
|
|
600
|
+
<span slText size="sm" tone="muted">{{ capacity(time, date, unavailable) }}</span>
|
|
601
|
+
</ng-template>
|
|
602
|
+
<div slDateTimePickerFooter>
|
|
603
|
+
<button slButton size="sm" type="button" (click)="picker.closeSurface()">Done</button>
|
|
604
|
+
</div>
|
|
605
|
+
</div>
|
|
606
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
607
|
+
</div>
|
|
608
|
+
`,
|
|
609
|
+
})
|
|
610
|
+
export class DateTimePickerCarrierPickup {
|
|
611
|
+
/** The windows Harbor Freightways collects in, every weekday. */
|
|
612
|
+
protected readonly windows = [
|
|
613
|
+
plainTime(8, 0),
|
|
614
|
+
plainTime(10, 30),
|
|
615
|
+
plainTime(13, 0),
|
|
616
|
+
plainTime(15, 30),
|
|
617
|
+
];
|
|
618
|
+
protected readonly earliest = plainDateTime(plainDate(2026, 10, 1), plainTime(8, 0));
|
|
619
|
+
protected readonly reference = plainDateTime(plainDate(2026, 10, 1), plainTime(10, 30));
|
|
620
|
+
protected readonly pickup = signal<PlainDateTime | null>(null);
|
|
621
|
+
protected readonly summary = computed(() => {
|
|
622
|
+
const pickup = this.pickup();
|
|
623
|
+
return pickup === null
|
|
624
|
+
? 'Harbor Freightways collects on weekdays, in four windows.'
|
|
625
|
+
: `Harbor Freightways collects on ${words.describe(pickup)}.`;
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
protected readonly isWeekend = (date: PlainDate) =>
|
|
629
|
+
dayOfWeek(date) === 0 || dayOfWeek(date) === 6;
|
|
630
|
+
protected readonly isFull = (time: PlainTime, date: PlainDate) => trucksLeft(time, date) === 0;
|
|
631
|
+
|
|
632
|
+
protected capacity(time: PlainTime, date: PlainDate, unavailable: boolean): string {
|
|
633
|
+
return unavailable ? 'Full' : `${trucksLeft(time, date)} of ${TRUCKS_PER_WINDOW} trucks left`;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
### clearable.ts
|
|
639
|
+
|
|
640
|
+
Example
|
|
641
|
+
|
|
642
|
+
```ts
|
|
643
|
+
import { Component } from '@angular/core';
|
|
644
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
645
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
646
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
647
|
+
|
|
648
|
+
@Component({
|
|
649
|
+
selector: 'app-datetime-picker-clearable',
|
|
650
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
651
|
+
template: `
|
|
652
|
+
<div slField>
|
|
653
|
+
<label slFieldLabel>Hold shipment until</label>
|
|
654
|
+
<div slDateTimePicker clearable [defaultValue]="holdUntil"></div>
|
|
655
|
+
<span slFieldDescription>Clear the date and time to release the shipment.</span>
|
|
656
|
+
</div>
|
|
657
|
+
`,
|
|
658
|
+
})
|
|
659
|
+
export class DateTimePickerClearable {
|
|
660
|
+
protected readonly holdUntil = plainDateTime(plainDate(2026, 10, 9), plainTime(17, 0));
|
|
661
|
+
}
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
### controlled.ts
|
|
665
|
+
|
|
666
|
+
Example
|
|
667
|
+
|
|
668
|
+
```ts
|
|
669
|
+
import { Component, computed, signal } from '@angular/core';
|
|
670
|
+
import { SlButton } from '@slotted/angular/button';
|
|
671
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
672
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
673
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
674
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
675
|
+
import {
|
|
676
|
+
addDays,
|
|
677
|
+
createDateTimeFormat,
|
|
678
|
+
plainDate,
|
|
679
|
+
plainDateTime,
|
|
680
|
+
plainTime,
|
|
681
|
+
type PlainDateTime,
|
|
682
|
+
} from '@slotted/core/date';
|
|
683
|
+
|
|
684
|
+
const TODAY = plainDate(2026, 9, 30);
|
|
685
|
+
const words = createDateTimeFormat({ locale: 'en-US' });
|
|
686
|
+
|
|
687
|
+
@Component({
|
|
688
|
+
selector: 'app-datetime-picker-controlled',
|
|
689
|
+
imports: [
|
|
690
|
+
SlButton,
|
|
691
|
+
SlDateTimePicker,
|
|
692
|
+
SlField,
|
|
693
|
+
SlFieldDescription,
|
|
694
|
+
SlFieldLabel,
|
|
695
|
+
SlInline,
|
|
696
|
+
SlStack,
|
|
697
|
+
],
|
|
698
|
+
template: `
|
|
699
|
+
<div slStack [gap]="4">
|
|
700
|
+
<div slField>
|
|
701
|
+
<label slFieldLabel>Call Harbor Freightways</label>
|
|
702
|
+
<div slDateTimePicker [value]="call()" (valueChange)="call.set($event.value)"></div>
|
|
703
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
704
|
+
</div>
|
|
705
|
+
<div slInline [gap]="2">
|
|
706
|
+
<button
|
|
707
|
+
slButton
|
|
708
|
+
size="sm"
|
|
709
|
+
tone="secondary"
|
|
710
|
+
type="button"
|
|
711
|
+
variant="outline"
|
|
712
|
+
(click)="schedule(1, 9)"
|
|
713
|
+
>
|
|
714
|
+
Tomorrow, 9:00 AM
|
|
715
|
+
</button>
|
|
716
|
+
<button
|
|
717
|
+
slButton
|
|
718
|
+
size="sm"
|
|
719
|
+
tone="secondary"
|
|
720
|
+
type="button"
|
|
721
|
+
variant="outline"
|
|
722
|
+
(click)="schedule(2, 14)"
|
|
723
|
+
>
|
|
724
|
+
Friday, 2:00 PM
|
|
725
|
+
</button>
|
|
726
|
+
<button
|
|
727
|
+
slButton
|
|
728
|
+
size="sm"
|
|
729
|
+
tone="secondary"
|
|
730
|
+
type="button"
|
|
731
|
+
variant="ghost"
|
|
732
|
+
(click)="call.set(null)"
|
|
733
|
+
>
|
|
734
|
+
No call
|
|
735
|
+
</button>
|
|
736
|
+
</div>
|
|
737
|
+
</div>
|
|
738
|
+
`,
|
|
739
|
+
})
|
|
740
|
+
export class DateTimePickerControlled {
|
|
741
|
+
protected readonly call = signal<PlainDateTime | null>(
|
|
742
|
+
plainDateTime(addDays(TODAY, 1), plainTime(9, 0)),
|
|
743
|
+
);
|
|
744
|
+
protected readonly summary = computed(() => {
|
|
745
|
+
const call = this.call();
|
|
746
|
+
return call === null ? 'No call scheduled.' : `Call on ${words.describe(call)}.`;
|
|
747
|
+
});
|
|
748
|
+
|
|
749
|
+
protected schedule(days: number, hour: number): void {
|
|
750
|
+
this.call.set(plainDateTime(addDays(TODAY, days), plainTime(hour, 0)));
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
### footer.ts
|
|
756
|
+
|
|
757
|
+
Example
|
|
758
|
+
|
|
759
|
+
```ts
|
|
760
|
+
import { Component } from '@angular/core';
|
|
761
|
+
import { SlButton } from '@slotted/angular/button';
|
|
762
|
+
import { SlDateTimePicker, SlDateTimePickerFooter } from '@slotted/angular/datetime-picker';
|
|
763
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
764
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
765
|
+
|
|
766
|
+
@Component({
|
|
767
|
+
selector: 'app-datetime-picker-footer',
|
|
768
|
+
imports: [
|
|
769
|
+
SlButton,
|
|
770
|
+
SlDateTimePicker,
|
|
771
|
+
SlDateTimePickerFooter,
|
|
772
|
+
SlField,
|
|
773
|
+
SlFieldDescription,
|
|
774
|
+
SlFieldLabel,
|
|
775
|
+
],
|
|
776
|
+
template: `
|
|
777
|
+
<div slField>
|
|
778
|
+
<label slFieldLabel>Maintenance window starts</label>
|
|
779
|
+
<div
|
|
780
|
+
slDateTimePicker
|
|
781
|
+
#picker="slDateTimePicker"
|
|
782
|
+
closeOnSelect="never"
|
|
783
|
+
[defaultValue]="start"
|
|
784
|
+
[step]="3600"
|
|
785
|
+
>
|
|
786
|
+
<div slDateTimePickerFooter>
|
|
787
|
+
<button slButton size="sm" type="button" (click)="picker.closeSurface()">Done</button>
|
|
788
|
+
</div>
|
|
789
|
+
</div>
|
|
790
|
+
<span slFieldDescription>Conveyors stop for four hours from this time.</span>
|
|
791
|
+
</div>
|
|
792
|
+
`,
|
|
793
|
+
})
|
|
794
|
+
export class DateTimePickerFooter {
|
|
795
|
+
protected readonly start = plainDateTime(plainDate(2026, 10, 3), plainTime(22, 0));
|
|
796
|
+
}
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
### form.ts
|
|
800
|
+
|
|
801
|
+
Example
|
|
802
|
+
|
|
803
|
+
```ts
|
|
804
|
+
import { Component, computed, signal } from '@angular/core';
|
|
805
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
806
|
+
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
807
|
+
import { SlButton } from '@slotted/angular/button';
|
|
808
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
809
|
+
import { SlField, SlFieldError, SlFieldLabel } from '@slotted/angular/field';
|
|
810
|
+
import { SlInline } from '@slotted/angular/inline';
|
|
811
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
812
|
+
import { SlText } from '@slotted/angular/typography';
|
|
813
|
+
import {
|
|
814
|
+
plainDate,
|
|
815
|
+
plainDateTime,
|
|
816
|
+
plainTime,
|
|
817
|
+
toISODateTime,
|
|
818
|
+
type PlainDateTime,
|
|
819
|
+
} from '@slotted/core/date';
|
|
820
|
+
|
|
821
|
+
@Component({
|
|
822
|
+
selector: 'app-datetime-picker-form',
|
|
823
|
+
imports: [
|
|
824
|
+
ReactiveFormsModule,
|
|
825
|
+
SlButton,
|
|
826
|
+
SlDateTimePicker,
|
|
827
|
+
SlField,
|
|
828
|
+
SlFieldError,
|
|
829
|
+
SlFieldLabel,
|
|
830
|
+
SlInline,
|
|
831
|
+
SlStack,
|
|
832
|
+
SlText,
|
|
833
|
+
],
|
|
834
|
+
template: `
|
|
835
|
+
<form novalidate [formGroup]="form" (ngSubmit)="submit()" (reset)="clear()">
|
|
836
|
+
<div slStack [gap]="5">
|
|
837
|
+
<div slField required [invalid]="error() === '' ? undefined : true">
|
|
838
|
+
<label slFieldLabel>Pickup date and time</label>
|
|
839
|
+
<div
|
|
840
|
+
slDateTimePicker
|
|
841
|
+
formControlName="pickupAt"
|
|
842
|
+
name="pickupAt"
|
|
843
|
+
[min]="earliest"
|
|
844
|
+
[referenceDateTime]="earliest"
|
|
845
|
+
></div>
|
|
846
|
+
<span slFieldError live="polite" reserve>{{ error() }}</span>
|
|
847
|
+
</div>
|
|
848
|
+
<div slInline align="center" [gap]="3">
|
|
849
|
+
<button slButton type="submit">Book pickup</button>
|
|
850
|
+
<button slButton tone="secondary" type="reset" variant="outline">Reset</button>
|
|
851
|
+
@if (saved(); as message) {
|
|
852
|
+
<span slText size="sm" tone="muted">{{ message }}</span>
|
|
853
|
+
}
|
|
854
|
+
</div>
|
|
855
|
+
</div>
|
|
856
|
+
</form>
|
|
857
|
+
`,
|
|
858
|
+
})
|
|
859
|
+
export class DateTimePickerForm {
|
|
860
|
+
protected readonly earliest = plainDateTime(plainDate(2026, 10, 1), plainTime(8, 0));
|
|
861
|
+
protected readonly form = new FormGroup({
|
|
862
|
+
pickupAt: new FormControl<PlainDateTime | null>(null, Validators.required),
|
|
863
|
+
});
|
|
864
|
+
private readonly value = toSignal(this.form.controls.pickupAt.valueChanges, {
|
|
865
|
+
initialValue: this.form.controls.pickupAt.value,
|
|
866
|
+
});
|
|
867
|
+
private readonly submitted = signal(false);
|
|
868
|
+
protected readonly saved = signal<string | null>(null);
|
|
869
|
+
protected readonly error = computed(() => {
|
|
870
|
+
this.value();
|
|
871
|
+
const control = this.form.controls.pickupAt;
|
|
872
|
+
if (control.hasError('slottedDateTimeRange')) {
|
|
873
|
+
return 'Choose October 1, 2026 at 8:00 AM or later.';
|
|
874
|
+
}
|
|
875
|
+
if (this.submitted() && control.hasError('required')) return 'Choose a pickup date and time.';
|
|
876
|
+
return '';
|
|
877
|
+
});
|
|
878
|
+
|
|
879
|
+
protected submit(): void {
|
|
880
|
+
this.submitted.set(true);
|
|
881
|
+
const pickup = this.form.controls.pickupAt.value;
|
|
882
|
+
this.saved.set(
|
|
883
|
+
this.form.valid && pickup !== null ? `Pickup booked for ${toISODateTime(pickup)}.` : null,
|
|
884
|
+
);
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
protected clear(): void {
|
|
888
|
+
this.submitted.set(false);
|
|
889
|
+
this.saved.set(null);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
```
|
|
893
|
+
|
|
894
|
+
### granularity.ts
|
|
895
|
+
|
|
896
|
+
Example
|
|
897
|
+
|
|
898
|
+
```ts
|
|
899
|
+
import { Component } from '@angular/core';
|
|
900
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
901
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
902
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
903
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
904
|
+
|
|
905
|
+
@Component({
|
|
906
|
+
selector: 'app-datetime-picker-granularity',
|
|
907
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel, SlStack],
|
|
908
|
+
template: `
|
|
909
|
+
<div slStack [gap]="5">
|
|
910
|
+
<div slField>
|
|
911
|
+
<label slFieldLabel>Shift starts</label>
|
|
912
|
+
<div slDateTimePicker granularity="hour" [defaultValue]="shift" [step]="3600"></div>
|
|
913
|
+
<span slFieldDescription>Shifts start on the hour.</span>
|
|
914
|
+
</div>
|
|
915
|
+
<div slField>
|
|
916
|
+
<label slFieldLabel>Batch run starts</label>
|
|
917
|
+
<div
|
|
918
|
+
slDateTimePicker
|
|
919
|
+
granularity="second"
|
|
920
|
+
[defaultValue]="batch"
|
|
921
|
+
[maxTime]="windowEnd"
|
|
922
|
+
[minTime]="windowStart"
|
|
923
|
+
[step]="30"
|
|
924
|
+
></div>
|
|
925
|
+
<span slFieldDescription>The nightly run starts between 2:00:00 and 2:05:00 AM.</span>
|
|
926
|
+
</div>
|
|
927
|
+
</div>
|
|
928
|
+
`,
|
|
929
|
+
})
|
|
930
|
+
export class DateTimePickerGranularity {
|
|
931
|
+
protected readonly shift = plainDateTime(plainDate(2026, 10, 1), plainTime(6, 0));
|
|
932
|
+
protected readonly batch = plainDateTime(plainDate(2026, 9, 30), plainTime(2, 0, 30));
|
|
933
|
+
protected readonly windowStart = plainTime(2, 0);
|
|
934
|
+
protected readonly windowEnd = plainTime(2, 5);
|
|
935
|
+
}
|
|
936
|
+
```
|
|
937
|
+
|
|
938
|
+
### hour-cycle.ts
|
|
939
|
+
|
|
940
|
+
Example
|
|
941
|
+
|
|
942
|
+
```ts
|
|
943
|
+
import { Component } from '@angular/core';
|
|
944
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
945
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
946
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
947
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
948
|
+
|
|
949
|
+
@Component({
|
|
950
|
+
selector: 'app-datetime-picker-hour-cycle',
|
|
951
|
+
imports: [SlDateTimePicker, SlField, SlFieldLabel, SlStack],
|
|
952
|
+
template: `
|
|
953
|
+
<div slStack [gap]="5">
|
|
954
|
+
<div slField>
|
|
955
|
+
<label slFieldLabel>Departure, 12-hour clock</label>
|
|
956
|
+
<div slDateTimePicker [defaultValue]="departure" [hourCycle]="12"></div>
|
|
957
|
+
</div>
|
|
958
|
+
<div slField>
|
|
959
|
+
<label slFieldLabel>Departure, 24-hour clock</label>
|
|
960
|
+
<div slDateTimePicker [defaultValue]="departure" [hourCycle]="24"></div>
|
|
961
|
+
</div>
|
|
962
|
+
</div>
|
|
963
|
+
`,
|
|
964
|
+
})
|
|
965
|
+
export class DateTimePickerHourCycle {
|
|
966
|
+
protected readonly departure = plainDateTime(plainDate(2026, 9, 30), plainTime(18, 45));
|
|
967
|
+
}
|
|
968
|
+
```
|
|
969
|
+
|
|
970
|
+
### locale.ts
|
|
971
|
+
|
|
972
|
+
Example
|
|
973
|
+
|
|
974
|
+
```ts
|
|
975
|
+
import { Component } from '@angular/core';
|
|
976
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
977
|
+
import { SlField, SlFieldLabel } from '@slotted/angular/field';
|
|
978
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
979
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
980
|
+
|
|
981
|
+
@Component({
|
|
982
|
+
selector: 'app-datetime-picker-locale',
|
|
983
|
+
imports: [SlDateTimePicker, SlField, SlFieldLabel, SlStack],
|
|
984
|
+
template: `
|
|
985
|
+
<div slStack [gap]="5">
|
|
986
|
+
<div slField>
|
|
987
|
+
<label slFieldLabel>Pickup, United States (en-US)</label>
|
|
988
|
+
<div slDateTimePicker locale="en-US" [defaultValue]="pickup"></div>
|
|
989
|
+
</div>
|
|
990
|
+
<div slField>
|
|
991
|
+
<label slFieldLabel>Pickup, United Kingdom (en-GB)</label>
|
|
992
|
+
<div slDateTimePicker locale="en-GB" [defaultValue]="pickup"></div>
|
|
993
|
+
</div>
|
|
994
|
+
<div slField>
|
|
995
|
+
<label slFieldLabel>Pickup, Germany (de-DE)</label>
|
|
996
|
+
<div slDateTimePicker locale="de-DE" [defaultValue]="pickup"></div>
|
|
997
|
+
</div>
|
|
998
|
+
<div slField>
|
|
999
|
+
<label slFieldLabel>Pickup, Japan (ja-JP)</label>
|
|
1000
|
+
<div slDateTimePicker locale="ja-JP" [defaultValue]="pickup"></div>
|
|
1001
|
+
</div>
|
|
1002
|
+
</div>
|
|
1003
|
+
`,
|
|
1004
|
+
})
|
|
1005
|
+
export class DateTimePickerLocale {
|
|
1006
|
+
protected readonly pickup = plainDateTime(plainDate(2026, 9, 30), plainTime(14, 30));
|
|
1007
|
+
}
|
|
1008
|
+
```
|
|
1009
|
+
|
|
1010
|
+
### options.ts
|
|
1011
|
+
|
|
1012
|
+
Example
|
|
1013
|
+
|
|
1014
|
+
```ts
|
|
1015
|
+
import { Component } from '@angular/core';
|
|
1016
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
1017
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1018
|
+
import { plainDate, plainDateTime, plainTime } from '@slotted/core/date';
|
|
1019
|
+
|
|
1020
|
+
@Component({
|
|
1021
|
+
selector: 'app-datetime-picker-options',
|
|
1022
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
1023
|
+
template: `
|
|
1024
|
+
<div slField>
|
|
1025
|
+
<label slFieldLabel>Line-haul departure</label>
|
|
1026
|
+
<div slDateTimePicker [options]="departures" [referenceDateTime]="reference"></div>
|
|
1027
|
+
<span slFieldDescription>The Chicago to Memphis trailer leaves five times a day.</span>
|
|
1028
|
+
</div>
|
|
1029
|
+
`,
|
|
1030
|
+
})
|
|
1031
|
+
export class DateTimePickerOptions {
|
|
1032
|
+
protected readonly departures = [
|
|
1033
|
+
plainTime(5, 40),
|
|
1034
|
+
plainTime(8, 15),
|
|
1035
|
+
plainTime(11, 50),
|
|
1036
|
+
plainTime(16, 5),
|
|
1037
|
+
plainTime(21, 30),
|
|
1038
|
+
];
|
|
1039
|
+
protected readonly reference = plainDateTime(plainDate(2026, 9, 30), plainTime(8, 15));
|
|
1040
|
+
}
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
### publish-at.ts
|
|
1044
|
+
|
|
1045
|
+
Example
|
|
1046
|
+
|
|
1047
|
+
```ts
|
|
1048
|
+
import { Component, computed, signal } from '@angular/core';
|
|
1049
|
+
import { SlButton } from '@slotted/angular/button';
|
|
1050
|
+
import { SlDateTimePicker, SlDateTimePickerPresets } from '@slotted/angular/datetime-picker';
|
|
1051
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1052
|
+
import {
|
|
1053
|
+
addDays,
|
|
1054
|
+
createDateTimeFormat,
|
|
1055
|
+
dayOfWeek,
|
|
1056
|
+
plainDate,
|
|
1057
|
+
plainDateTime,
|
|
1058
|
+
plainTime,
|
|
1059
|
+
type PlainDateTime,
|
|
1060
|
+
} from '@slotted/core/date';
|
|
1061
|
+
|
|
1062
|
+
const NOW = plainDateTime(plainDate(2026, 9, 30), plainTime(9, 0));
|
|
1063
|
+
const TOMORROW = plainDateTime(addDays(NOW.date, 1), plainTime(9, 0));
|
|
1064
|
+
const NEXT_MONDAY = plainDateTime(
|
|
1065
|
+
addDays(NOW.date, (8 - dayOfWeek(NOW.date)) % 7 || 7),
|
|
1066
|
+
plainTime(9, 0),
|
|
1067
|
+
);
|
|
1068
|
+
const words = createDateTimeFormat({ locale: 'en-US' });
|
|
1069
|
+
|
|
1070
|
+
@Component({
|
|
1071
|
+
selector: 'app-datetime-picker-publish-at',
|
|
1072
|
+
imports: [
|
|
1073
|
+
SlButton,
|
|
1074
|
+
SlDateTimePicker,
|
|
1075
|
+
SlDateTimePickerPresets,
|
|
1076
|
+
SlField,
|
|
1077
|
+
SlFieldDescription,
|
|
1078
|
+
SlFieldLabel,
|
|
1079
|
+
],
|
|
1080
|
+
template: `
|
|
1081
|
+
<div slField required>
|
|
1082
|
+
<label slFieldLabel>Publish the autumn price list at</label>
|
|
1083
|
+
<div
|
|
1084
|
+
slDateTimePicker
|
|
1085
|
+
#picker="slDateTimePicker"
|
|
1086
|
+
timeZone="America/New_York"
|
|
1087
|
+
[min]="now"
|
|
1088
|
+
[referenceDateTime]="now"
|
|
1089
|
+
[value]="publishAt()"
|
|
1090
|
+
(valueChange)="publishAt.set($event.value)"
|
|
1091
|
+
>
|
|
1092
|
+
<div slDateTimePickerPresets>
|
|
1093
|
+
<button
|
|
1094
|
+
slButton
|
|
1095
|
+
size="sm"
|
|
1096
|
+
type="button"
|
|
1097
|
+
variant="ghost"
|
|
1098
|
+
(click)="publishAt.set(tomorrow); picker.closeSurface()"
|
|
1099
|
+
>
|
|
1100
|
+
Tomorrow, 9:00 AM
|
|
1101
|
+
</button>
|
|
1102
|
+
<button
|
|
1103
|
+
slButton
|
|
1104
|
+
size="sm"
|
|
1105
|
+
type="button"
|
|
1106
|
+
variant="ghost"
|
|
1107
|
+
(click)="publishAt.set(nextMonday); picker.closeSurface()"
|
|
1108
|
+
>
|
|
1109
|
+
Monday, 9:00 AM
|
|
1110
|
+
</button>
|
|
1111
|
+
</div>
|
|
1112
|
+
</div>
|
|
1113
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
1114
|
+
</div>
|
|
1115
|
+
`,
|
|
1116
|
+
})
|
|
1117
|
+
export class DateTimePickerPublishAt {
|
|
1118
|
+
protected readonly now = NOW;
|
|
1119
|
+
protected readonly tomorrow = TOMORROW;
|
|
1120
|
+
protected readonly nextMonday = NEXT_MONDAY;
|
|
1121
|
+
protected readonly publishAt = signal<PlainDateTime | null>(TOMORROW);
|
|
1122
|
+
protected readonly summary = computed(() => {
|
|
1123
|
+
const publishAt = this.publishAt();
|
|
1124
|
+
return publishAt === null
|
|
1125
|
+
? 'Choose when the new prices go live, New York time.'
|
|
1126
|
+
: `Prices go live on ${words.describe(publishAt)}, New York time.`;
|
|
1127
|
+
});
|
|
1128
|
+
}
|
|
1129
|
+
```
|
|
1130
|
+
|
|
1131
|
+
### reference.ts
|
|
1132
|
+
|
|
1133
|
+
Example
|
|
1134
|
+
|
|
1135
|
+
```ts
|
|
1136
|
+
import { Component, computed, signal } from '@angular/core';
|
|
1137
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
1138
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1139
|
+
import {
|
|
1140
|
+
createDateTimeFormat,
|
|
1141
|
+
plainDate,
|
|
1142
|
+
plainDateTime,
|
|
1143
|
+
plainTime,
|
|
1144
|
+
type PlainDateTime,
|
|
1145
|
+
} from '@slotted/core/date';
|
|
1146
|
+
|
|
1147
|
+
const words = createDateTimeFormat({ locale: 'en-US' });
|
|
1148
|
+
|
|
1149
|
+
@Component({
|
|
1150
|
+
selector: 'app-datetime-picker-reference',
|
|
1151
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
1152
|
+
template: `
|
|
1153
|
+
<div slField>
|
|
1154
|
+
<label slFieldLabel>Courier collection</label>
|
|
1155
|
+
<div
|
|
1156
|
+
slDateTimePicker
|
|
1157
|
+
[referenceDateTime]="endOfShift"
|
|
1158
|
+
[value]="collection()"
|
|
1159
|
+
(valueChange)="collection.set($event.value)"
|
|
1160
|
+
></div>
|
|
1161
|
+
<span slFieldDescription>{{ summary() }}</span>
|
|
1162
|
+
</div>
|
|
1163
|
+
`,
|
|
1164
|
+
})
|
|
1165
|
+
export class DateTimePickerReference {
|
|
1166
|
+
protected readonly endOfShift = plainDateTime(plainDate(2026, 10, 1), plainTime(15, 0));
|
|
1167
|
+
protected readonly collection = signal<PlainDateTime | null>(null);
|
|
1168
|
+
protected readonly summary = computed(() => {
|
|
1169
|
+
const collection = this.collection();
|
|
1170
|
+
return collection === null
|
|
1171
|
+
? 'A day chosen in the calendar opens the time list on 3:00 PM.'
|
|
1172
|
+
: `Collection on ${words.describe(collection)}.`;
|
|
1173
|
+
});
|
|
1174
|
+
}
|
|
1175
|
+
```
|
|
1176
|
+
|
|
1177
|
+
### time-zones.ts
|
|
1178
|
+
|
|
1179
|
+
Example
|
|
1180
|
+
|
|
1181
|
+
```ts
|
|
1182
|
+
import { Component, computed, signal } from '@angular/core';
|
|
1183
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
1184
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1185
|
+
import { SlStack } from '@slotted/angular/stack';
|
|
1186
|
+
import { SlText } from '@slotted/angular/typography';
|
|
1187
|
+
import { toISODateTime, wallClockIn, type PlainDateTime } from '@slotted/core/date';
|
|
1188
|
+
|
|
1189
|
+
/** The pickup as the server stores it: an instant, 7:00 PM UTC on September 30, 2026. */
|
|
1190
|
+
const STORED = Date.UTC(2026, 8, 30, 19, 0);
|
|
1191
|
+
|
|
1192
|
+
@Component({
|
|
1193
|
+
selector: 'app-datetime-picker-time-zones',
|
|
1194
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel, SlStack, SlText],
|
|
1195
|
+
template: `
|
|
1196
|
+
<div slStack [gap]="4">
|
|
1197
|
+
<div slField>
|
|
1198
|
+
<label slFieldLabel>Pickup, Chicago terminal</label>
|
|
1199
|
+
<div
|
|
1200
|
+
slDateTimePicker
|
|
1201
|
+
timeZone="America/Chicago"
|
|
1202
|
+
[value]="pickup()"
|
|
1203
|
+
(valueChange)="pickup.set($event.value)"
|
|
1204
|
+
></div>
|
|
1205
|
+
<span slFieldDescription>Today and Now follow the clock in Chicago.</span>
|
|
1206
|
+
</div>
|
|
1207
|
+
<span slText size="sm" tone="muted">{{ readout() }}</span>
|
|
1208
|
+
</div>
|
|
1209
|
+
`,
|
|
1210
|
+
})
|
|
1211
|
+
export class DateTimePickerTimeZones {
|
|
1212
|
+
protected readonly pickup = signal<PlainDateTime | null>(wallClockIn(STORED, 'America/Chicago'));
|
|
1213
|
+
protected readonly readout = computed(() => {
|
|
1214
|
+
const pickup = this.pickup();
|
|
1215
|
+
return pickup === null ? 'Value: null' : `Value: ${toISODateTime(pickup)}, with no offset`;
|
|
1216
|
+
});
|
|
1217
|
+
}
|
|
1218
|
+
```
|
|
1219
|
+
|
|
1220
|
+
### typing.ts
|
|
1221
|
+
|
|
1222
|
+
Example
|
|
1223
|
+
|
|
1224
|
+
```ts
|
|
1225
|
+
import { Component, signal } from '@angular/core';
|
|
1226
|
+
import { SlDateTimePicker } from '@slotted/angular/datetime-picker';
|
|
1227
|
+
import { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';
|
|
1228
|
+
import {
|
|
1229
|
+
plainDate,
|
|
1230
|
+
plainDateTime,
|
|
1231
|
+
plainTime,
|
|
1232
|
+
toISODateTime,
|
|
1233
|
+
type PlainDateTime,
|
|
1234
|
+
} from '@slotted/core/date';
|
|
1235
|
+
import type { ChangeRequest } from '@slotted/core/state';
|
|
1236
|
+
|
|
1237
|
+
const REASONS: Record<string, string> = {
|
|
1238
|
+
keyboard: 'from the keyboard',
|
|
1239
|
+
select: 'chosen in the panel',
|
|
1240
|
+
clear: 'cleared',
|
|
1241
|
+
blur: 'completed when the field lost focus',
|
|
1242
|
+
};
|
|
1243
|
+
|
|
1244
|
+
@Component({
|
|
1245
|
+
selector: 'app-datetime-picker-typing',
|
|
1246
|
+
imports: [SlDateTimePicker, SlField, SlFieldDescription, SlFieldLabel],
|
|
1247
|
+
template: `
|
|
1248
|
+
<div slField>
|
|
1249
|
+
<label slFieldLabel>Goods received at</label>
|
|
1250
|
+
<div
|
|
1251
|
+
slDateTimePicker
|
|
1252
|
+
[defaultValue]="received"
|
|
1253
|
+
[referenceDateTime]="received"
|
|
1254
|
+
(valueChange)="record($event)"
|
|
1255
|
+
></div>
|
|
1256
|
+
<span slFieldDescription>{{ change() }}</span>
|
|
1257
|
+
</div>
|
|
1258
|
+
`,
|
|
1259
|
+
})
|
|
1260
|
+
export class DateTimePickerTyping {
|
|
1261
|
+
protected readonly received = plainDateTime(plainDate(2026, 9, 30), plainTime(14, 30));
|
|
1262
|
+
protected readonly change = signal('No change yet.');
|
|
1263
|
+
|
|
1264
|
+
protected record(request: ChangeRequest<PlainDateTime | null>): void {
|
|
1265
|
+
const text = request.value === null ? 'empty' : toISODateTime(request.value);
|
|
1266
|
+
this.change.set(`${text}, ${REASONS[request.reason] ?? request.reason}.`);
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
```
|