@slotted/angular 0.0.0-stage → 0.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +51 -2
- package/docs/AGENTS.snippet.md +10 -0
- package/docs/accordion.json +345 -0
- package/docs/accordion.md +207 -0
- package/docs/action-bar.json +421 -0
- package/docs/action-bar.md +364 -0
- package/docs/action-sheet.json +210 -0
- package/docs/action-sheet.md +19 -0
- package/docs/alert.json +407 -0
- package/docs/alert.md +239 -0
- package/docs/app-shell.examples.md +349 -0
- package/docs/app-shell.json +835 -0
- package/docs/app-shell.md +214 -0
- package/docs/aspect-ratio.json +159 -0
- package/docs/aspect-ratio.md +134 -0
- package/docs/attachment.json +486 -0
- package/docs/attachment.md +253 -0
- package/docs/avatar-group.json +208 -0
- package/docs/avatar-group.md +130 -0
- package/docs/avatar.json +342 -0
- package/docs/avatar.md +142 -0
- package/docs/badge.json +334 -0
- package/docs/badge.md +138 -0
- package/docs/breadcrumb.json +368 -0
- package/docs/breadcrumb.md +237 -0
- package/docs/button-group.json +158 -0
- package/docs/button-group.md +72 -0
- package/docs/button.examples.md +621 -0
- package/docs/button.json +977 -0
- package/docs/button.md +200 -0
- package/docs/calendar.json +592 -0
- package/docs/calendar.md +242 -0
- package/docs/card.json +283 -0
- package/docs/card.md +130 -0
- package/docs/carousel.json +560 -0
- package/docs/carousel.md +357 -0
- package/docs/cascader.json +933 -0
- package/docs/cascader.md +379 -0
- package/docs/chart.examples.md +582 -0
- package/docs/chart.json +1359 -0
- package/docs/chart.md +187 -0
- package/docs/checkbox-group.examples.md +612 -0
- package/docs/checkbox-group.json +395 -0
- package/docs/checkbox-group.md +106 -0
- package/docs/checkbox.examples.md +546 -0
- package/docs/checkbox.json +506 -0
- package/docs/checkbox.md +104 -0
- package/docs/code-block.json +616 -0
- package/docs/code-block.md +303 -0
- package/docs/collapsible.json +456 -0
- package/docs/collapsible.md +261 -0
- package/docs/color-picker.json +523 -0
- package/docs/color-picker.md +201 -0
- package/docs/column-manager.json +486 -0
- package/docs/column-manager.md +277 -0
- package/docs/combobox.examples.md +1732 -0
- package/docs/combobox.json +1250 -0
- package/docs/combobox.md +209 -0
- package/docs/command-palette.json +800 -0
- package/docs/command-palette.md +419 -0
- package/docs/container.json +156 -0
- package/docs/container.md +92 -0
- package/docs/context-menu.json +231 -0
- package/docs/context-menu.md +176 -0
- package/docs/currency-field.examples.md +321 -0
- package/docs/currency-field.json +649 -0
- package/docs/currency-field.md +128 -0
- package/docs/dashboard-grid.json +680 -0
- package/docs/dashboard-grid.md +265 -0
- package/docs/data-grid.examples.md +3064 -0
- package/docs/data-grid.json +1577 -0
- package/docs/data-grid.md +237 -0
- package/docs/data-grid.props.md +81 -0
- package/docs/data-list.json +685 -0
- package/docs/data-list.md +327 -0
- package/docs/date-field.json +490 -0
- package/docs/date-field.md +235 -0
- package/docs/date-picker.examples.md +1226 -0
- package/docs/date-picker.json +696 -0
- package/docs/date-picker.md +121 -0
- package/docs/date-range-picker.examples.md +1300 -0
- package/docs/date-range-picker.json +903 -0
- package/docs/date-range-picker.md +142 -0
- package/docs/datetime-field.json +665 -0
- package/docs/datetime-field.md +337 -0
- package/docs/datetime-picker.examples.md +1269 -0
- package/docs/datetime-picker.json +928 -0
- package/docs/datetime-picker.md +150 -0
- package/docs/datetime-range-picker.examples.md +225 -0
- package/docs/datetime-range-picker.json +1015 -0
- package/docs/datetime-range-picker.md +162 -0
- package/docs/description-list.json +471 -0
- package/docs/description-list.md +268 -0
- package/docs/detail-panel.json +530 -0
- package/docs/detail-panel.md +361 -0
- package/docs/dialog.examples.md +2467 -0
- package/docs/dialog.json +1141 -0
- package/docs/dialog.md +217 -0
- package/docs/dialog.props.md +63 -0
- package/docs/divider.json +148 -0
- package/docs/divider.md +83 -0
- package/docs/drawer.examples.md +1929 -0
- package/docs/drawer.json +753 -0
- package/docs/drawer.md +199 -0
- package/docs/entity-picker.json +946 -0
- package/docs/entity-picker.md +365 -0
- package/docs/event-calendar.examples.md +308 -0
- package/docs/event-calendar.json +1202 -0
- package/docs/event-calendar.md +201 -0
- package/docs/field-group.json +333 -0
- package/docs/field-group.md +181 -0
- package/docs/field.examples.md +676 -0
- package/docs/field.json +528 -0
- package/docs/field.md +127 -0
- package/docs/filter-bar.json +817 -0
- package/docs/filter-bar.md +380 -0
- package/docs/form.json +378 -0
- package/docs/form.md +235 -0
- package/docs/fullscreen.json +395 -0
- package/docs/fullscreen.md +225 -0
- package/docs/grid.json +176 -0
- package/docs/grid.md +74 -0
- package/docs/highlight.json +279 -0
- package/docs/highlight.md +210 -0
- package/docs/hover-card.json +254 -0
- package/docs/hover-card.md +213 -0
- package/docs/icon.json +173 -0
- package/docs/icon.md +101 -0
- package/docs/image.json +476 -0
- package/docs/image.md +254 -0
- package/docs/import-export-center.json +836 -0
- package/docs/import-export-center.md +345 -0
- package/docs/index.md +141 -0
- package/docs/inline-message.json +312 -0
- package/docs/inline-message.md +191 -0
- package/docs/inline.json +149 -0
- package/docs/inline.md +72 -0
- package/docs/kbd.json +350 -0
- package/docs/kbd.md +210 -0
- package/docs/link.json +264 -0
- package/docs/link.md +167 -0
- package/docs/list-item.json +463 -0
- package/docs/list-item.md +236 -0
- package/docs/list.json +321 -0
- package/docs/list.md +185 -0
- package/docs/listbox.json +807 -0
- package/docs/listbox.md +413 -0
- package/docs/loading-overlay.json +440 -0
- package/docs/loading-overlay.md +248 -0
- package/docs/markdown.json +461 -0
- package/docs/markdown.md +266 -0
- package/docs/menu.examples.md +1651 -0
- package/docs/menu.json +922 -0
- package/docs/menu.md +155 -0
- package/docs/menubar.json +292 -0
- package/docs/menubar.md +173 -0
- package/docs/message-scroller.json +401 -0
- package/docs/message-scroller.md +212 -0
- package/docs/message.json +862 -0
- package/docs/message.md +473 -0
- package/docs/multi-select.examples.md +1922 -0
- package/docs/multi-select.json +1314 -0
- package/docs/multi-select.md +213 -0
- package/docs/navigation-menu.json +529 -0
- package/docs/navigation-menu.md +329 -0
- package/docs/notification-center.json +664 -0
- package/docs/notification-center.md +372 -0
- package/docs/number-field.examples.md +1078 -0
- package/docs/number-field.json +668 -0
- package/docs/number-field.md +137 -0
- package/docs/otp-input.json +479 -0
- package/docs/otp-input.md +291 -0
- package/docs/page-header.json +574 -0
- package/docs/page-header.md +338 -0
- package/docs/page.json +332 -0
- package/docs/page.md +184 -0
- package/docs/pagination.json +434 -0
- package/docs/pagination.md +238 -0
- package/docs/popover.examples.md +1235 -0
- package/docs/popover.json +656 -0
- package/docs/popover.md +199 -0
- package/docs/progress-indicator.json +501 -0
- package/docs/progress-indicator.md +329 -0
- package/docs/prompt-composer.json +498 -0
- package/docs/prompt-composer.md +278 -0
- package/docs/prose.json +357 -0
- package/docs/prose.md +226 -0
- package/docs/radio-group.examples.md +626 -0
- package/docs/radio-group.json +541 -0
- package/docs/radio-group.md +112 -0
- package/docs/rating.json +1053 -0
- package/docs/rating.md +435 -0
- package/docs/result-state.json +376 -0
- package/docs/result-state.md +286 -0
- package/docs/saved-views.json +384 -0
- package/docs/saved-views.md +242 -0
- package/docs/scroll-area.json +120 -0
- package/docs/scroll-area.md +8 -0
- package/docs/section.json +344 -0
- package/docs/section.md +208 -0
- package/docs/segmented-control.json +429 -0
- package/docs/segmented-control.md +240 -0
- package/docs/select.examples.md +1214 -0
- package/docs/select.json +1147 -0
- package/docs/select.md +199 -0
- package/docs/side-navigation.json +632 -0
- package/docs/side-navigation.md +430 -0
- package/docs/skeleton.json +358 -0
- package/docs/skeleton.md +223 -0
- package/docs/slider.json +522 -0
- package/docs/slider.md +261 -0
- package/docs/sparkline.json +426 -0
- package/docs/sparkline.md +206 -0
- package/docs/split-button.json +361 -0
- package/docs/split-button.md +275 -0
- package/docs/splitter.json +142 -0
- package/docs/splitter.md +14 -0
- package/docs/stack.json +135 -0
- package/docs/stack.md +74 -0
- package/docs/stat-card.json +529 -0
- package/docs/stat-card.md +270 -0
- package/docs/status-indicator.json +314 -0
- package/docs/status-indicator.md +197 -0
- package/docs/stepper.json +451 -0
- package/docs/stepper.md +250 -0
- package/docs/switch.json +451 -0
- package/docs/switch.md +508 -0
- package/docs/table-of-contents.json +553 -0
- package/docs/table-of-contents.md +289 -0
- package/docs/table.examples.md +1981 -0
- package/docs/table.json +1059 -0
- package/docs/table.md +290 -0
- package/docs/tabs.examples.md +1370 -0
- package/docs/tabs.json +661 -0
- package/docs/tabs.md +211 -0
- package/docs/tag.json +813 -0
- package/docs/tag.md +241 -0
- package/docs/tags-input.json +771 -0
- package/docs/tags-input.md +361 -0
- package/docs/text-field.examples.md +821 -0
- package/docs/text-field.json +604 -0
- package/docs/text-field.md +125 -0
- package/docs/textarea.examples.md +612 -0
- package/docs/textarea.json +440 -0
- package/docs/textarea.md +98 -0
- package/docs/time-field.json +584 -0
- package/docs/time-field.md +291 -0
- package/docs/time-picker.json +679 -0
- package/docs/time-picker.md +315 -0
- package/docs/time-range-picker.examples.md +191 -0
- package/docs/time-range-picker.json +924 -0
- package/docs/time-range-picker.md +152 -0
- package/docs/timeline.json +839 -0
- package/docs/timeline.md +401 -0
- package/docs/toast.json +642 -0
- package/docs/toast.md +311 -0
- package/docs/toggle-group.json +417 -0
- package/docs/toggle-group.md +255 -0
- package/docs/toggle.json +326 -0
- package/docs/toggle.md +222 -0
- package/docs/toolbar.json +380 -0
- package/docs/toolbar.md +240 -0
- package/docs/tooltip.examples.md +664 -0
- package/docs/tooltip.json +604 -0
- package/docs/tooltip.md +146 -0
- package/docs/top-navigation.examples.md +287 -0
- package/docs/top-navigation.json +648 -0
- package/docs/top-navigation.md +138 -0
- package/docs/tour.json +759 -0
- package/docs/tour.md +337 -0
- package/docs/transfer.json +746 -0
- package/docs/transfer.md +273 -0
- package/docs/tree.json +918 -0
- package/docs/tree.md +397 -0
- package/docs/typography.json +317 -0
- package/docs/typography.md +107 -0
- package/docs/upload.examples.md +358 -0
- package/docs/upload.json +1103 -0
- package/docs/upload.md +166 -0
- package/docs/visually-hidden.json +71 -0
- package/docs/visually-hidden.md +42 -0
- package/docs/wizard.json +724 -0
- package/docs/wizard.md +295 -0
- package/fesm2022/slotted-angular-accordion.mjs +247 -0
- package/fesm2022/slotted-angular-accordion.mjs.map +1 -0
- package/fesm2022/slotted-angular-action-bar.mjs +639 -0
- package/fesm2022/slotted-angular-action-bar.mjs.map +1 -0
- package/fesm2022/slotted-angular-action-sheet.mjs +749 -0
- package/fesm2022/slotted-angular-action-sheet.mjs.map +1 -0
- package/fesm2022/slotted-angular-alert.mjs +427 -0
- package/fesm2022/slotted-angular-alert.mjs.map +1 -0
- package/fesm2022/slotted-angular-app-shell.mjs +1334 -0
- package/fesm2022/slotted-angular-app-shell.mjs.map +1 -0
- package/fesm2022/slotted-angular-aspect-ratio.mjs +63 -0
- package/fesm2022/slotted-angular-aspect-ratio.mjs.map +1 -0
- package/fesm2022/slotted-angular-attachment.mjs +595 -0
- package/fesm2022/slotted-angular-attachment.mjs.map +1 -0
- package/fesm2022/slotted-angular-avatar-group.mjs +230 -0
- package/fesm2022/slotted-angular-avatar-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-avatar.mjs +330 -0
- package/fesm2022/slotted-angular-avatar.mjs.map +1 -0
- package/fesm2022/slotted-angular-badge.mjs +255 -0
- package/fesm2022/slotted-angular-badge.mjs.map +1 -0
- package/fesm2022/slotted-angular-breadcrumb.mjs +544 -0
- package/fesm2022/slotted-angular-breadcrumb.mjs.map +1 -0
- package/fesm2022/slotted-angular-button-group.mjs +146 -0
- package/fesm2022/slotted-angular-button-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-button.mjs +692 -0
- package/fesm2022/slotted-angular-button.mjs.map +1 -0
- package/fesm2022/slotted-angular-calendar.mjs +916 -0
- package/fesm2022/slotted-angular-calendar.mjs.map +1 -0
- package/fesm2022/slotted-angular-card.mjs +225 -0
- package/fesm2022/slotted-angular-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-carousel.mjs +840 -0
- package/fesm2022/slotted-angular-carousel.mjs.map +1 -0
- package/fesm2022/slotted-angular-cascader.mjs +1839 -0
- package/fesm2022/slotted-angular-cascader.mjs.map +1 -0
- package/fesm2022/slotted-angular-chart.mjs +974 -0
- package/fesm2022/slotted-angular-chart.mjs.map +1 -0
- package/fesm2022/slotted-angular-checkbox-group.mjs +283 -0
- package/fesm2022/slotted-angular-checkbox-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-checkbox.mjs +468 -0
- package/fesm2022/slotted-angular-checkbox.mjs.map +1 -0
- package/fesm2022/slotted-angular-code-block.mjs +476 -0
- package/fesm2022/slotted-angular-code-block.mjs.map +1 -0
- package/fesm2022/slotted-angular-collapsible.mjs +479 -0
- package/fesm2022/slotted-angular-collapsible.mjs.map +1 -0
- package/fesm2022/slotted-angular-color-picker.mjs +910 -0
- package/fesm2022/slotted-angular-color-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-column-manager.mjs +1037 -0
- package/fesm2022/slotted-angular-column-manager.mjs.map +1 -0
- package/fesm2022/slotted-angular-combobox.mjs +1480 -0
- package/fesm2022/slotted-angular-combobox.mjs.map +1 -0
- package/fesm2022/slotted-angular-command-palette.mjs +1283 -0
- package/fesm2022/slotted-angular-command-palette.mjs.map +1 -0
- package/fesm2022/slotted-angular-container.mjs +105 -0
- package/fesm2022/slotted-angular-container.mjs.map +1 -0
- package/fesm2022/slotted-angular-context-menu.mjs +221 -0
- package/fesm2022/slotted-angular-context-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-currency-field.mjs +1131 -0
- package/fesm2022/slotted-angular-currency-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-dashboard-grid.mjs +1928 -0
- package/fesm2022/slotted-angular-dashboard-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-data-grid.mjs +6697 -0
- package/fesm2022/slotted-angular-data-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-data-list.mjs +1418 -0
- package/fesm2022/slotted-angular-data-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-field.mjs +772 -0
- package/fesm2022/slotted-angular-date-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-picker.mjs +690 -0
- package/fesm2022/slotted-angular-date-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-date-range-picker.mjs +1150 -0
- package/fesm2022/slotted-angular-date-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-field.mjs +1058 -0
- package/fesm2022/slotted-angular-datetime-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-picker.mjs +1362 -0
- package/fesm2022/slotted-angular-datetime-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-datetime-range-picker.mjs +1872 -0
- package/fesm2022/slotted-angular-datetime-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-description-list.mjs +545 -0
- package/fesm2022/slotted-angular-description-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-detail-panel.mjs +754 -0
- package/fesm2022/slotted-angular-detail-panel.mjs.map +1 -0
- package/fesm2022/slotted-angular-dialog.mjs +980 -0
- package/fesm2022/slotted-angular-dialog.mjs.map +1 -0
- package/fesm2022/slotted-angular-divider.mjs +76 -0
- package/fesm2022/slotted-angular-divider.mjs.map +1 -0
- package/fesm2022/slotted-angular-drawer.mjs +1397 -0
- package/fesm2022/slotted-angular-drawer.mjs.map +1 -0
- package/fesm2022/slotted-angular-entity-picker.mjs +1987 -0
- package/fesm2022/slotted-angular-entity-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-event-calendar.mjs +2934 -0
- package/fesm2022/slotted-angular-event-calendar.mjs.map +1 -0
- package/fesm2022/slotted-angular-field-group.mjs +301 -0
- package/fesm2022/slotted-angular-field-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-field.mjs +928 -0
- package/fesm2022/slotted-angular-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-filter-bar.mjs +3107 -0
- package/fesm2022/slotted-angular-filter-bar.mjs.map +1 -0
- package/fesm2022/slotted-angular-form.mjs +592 -0
- package/fesm2022/slotted-angular-form.mjs.map +1 -0
- package/fesm2022/slotted-angular-fullscreen.mjs +314 -0
- package/fesm2022/slotted-angular-fullscreen.mjs.map +1 -0
- package/fesm2022/slotted-angular-grid.mjs +58 -0
- package/fesm2022/slotted-angular-grid.mjs.map +1 -0
- package/fesm2022/slotted-angular-highlight.mjs +123 -0
- package/fesm2022/slotted-angular-highlight.mjs.map +1 -0
- package/fesm2022/slotted-angular-hover-card.mjs +326 -0
- package/fesm2022/slotted-angular-hover-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-i18n.mjs +75 -0
- package/fesm2022/slotted-angular-i18n.mjs.map +1 -0
- package/fesm2022/slotted-angular-icon.mjs +232 -0
- package/fesm2022/slotted-angular-icon.mjs.map +1 -0
- package/fesm2022/slotted-angular-image.mjs +442 -0
- package/fesm2022/slotted-angular-image.mjs.map +1 -0
- package/fesm2022/slotted-angular-import-export-center.mjs +1792 -0
- package/fesm2022/slotted-angular-import-export-center.mjs.map +1 -0
- package/fesm2022/slotted-angular-inline-message.mjs +280 -0
- package/fesm2022/slotted-angular-inline-message.mjs.map +1 -0
- package/fesm2022/slotted-angular-inline.mjs +52 -0
- package/fesm2022/slotted-angular-inline.mjs.map +1 -0
- package/fesm2022/slotted-angular-kbd.mjs +284 -0
- package/fesm2022/slotted-angular-kbd.mjs.map +1 -0
- package/fesm2022/slotted-angular-link.mjs +182 -0
- package/fesm2022/slotted-angular-link.mjs.map +1 -0
- package/fesm2022/slotted-angular-list-item.mjs +367 -0
- package/fesm2022/slotted-angular-list-item.mjs.map +1 -0
- package/fesm2022/slotted-angular-list.mjs +256 -0
- package/fesm2022/slotted-angular-list.mjs.map +1 -0
- package/fesm2022/slotted-angular-listbox.mjs +1274 -0
- package/fesm2022/slotted-angular-listbox.mjs.map +1 -0
- package/fesm2022/slotted-angular-loading-overlay.mjs +451 -0
- package/fesm2022/slotted-angular-loading-overlay.mjs.map +1 -0
- package/fesm2022/slotted-angular-markdown.mjs +914 -0
- package/fesm2022/slotted-angular-markdown.mjs.map +1 -0
- package/fesm2022/slotted-angular-menu.mjs +1211 -0
- package/fesm2022/slotted-angular-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-menubar.mjs +230 -0
- package/fesm2022/slotted-angular-menubar.mjs.map +1 -0
- package/fesm2022/slotted-angular-message-scroller.mjs +378 -0
- package/fesm2022/slotted-angular-message-scroller.mjs.map +1 -0
- package/fesm2022/slotted-angular-message.mjs +866 -0
- package/fesm2022/slotted-angular-message.mjs.map +1 -0
- package/fesm2022/slotted-angular-multi-select.mjs +1939 -0
- package/fesm2022/slotted-angular-multi-select.mjs.map +1 -0
- package/fesm2022/slotted-angular-navigation-menu.mjs +770 -0
- package/fesm2022/slotted-angular-navigation-menu.mjs.map +1 -0
- package/fesm2022/slotted-angular-notification-center.mjs +1172 -0
- package/fesm2022/slotted-angular-notification-center.mjs.map +1 -0
- package/fesm2022/slotted-angular-number-field.mjs +966 -0
- package/fesm2022/slotted-angular-number-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-otp-input.mjs +629 -0
- package/fesm2022/slotted-angular-otp-input.mjs.map +1 -0
- package/fesm2022/slotted-angular-page-header.mjs +788 -0
- package/fesm2022/slotted-angular-page-header.mjs.map +1 -0
- package/fesm2022/slotted-angular-page.mjs +255 -0
- package/fesm2022/slotted-angular-page.mjs.map +1 -0
- package/fesm2022/slotted-angular-pagination.mjs +562 -0
- package/fesm2022/slotted-angular-pagination.mjs.map +1 -0
- package/fesm2022/slotted-angular-popover.mjs +799 -0
- package/fesm2022/slotted-angular-popover.mjs.map +1 -0
- package/fesm2022/slotted-angular-progress-indicator.mjs +572 -0
- package/fesm2022/slotted-angular-progress-indicator.mjs.map +1 -0
- package/fesm2022/slotted-angular-prompt-composer.mjs +596 -0
- package/fesm2022/slotted-angular-prompt-composer.mjs.map +1 -0
- package/fesm2022/slotted-angular-prose.mjs +314 -0
- package/fesm2022/slotted-angular-prose.mjs.map +1 -0
- package/fesm2022/slotted-angular-radio-group.mjs +469 -0
- package/fesm2022/slotted-angular-radio-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-rating.mjs +1174 -0
- package/fesm2022/slotted-angular-rating.mjs.map +1 -0
- package/fesm2022/slotted-angular-result-state.mjs +330 -0
- package/fesm2022/slotted-angular-result-state.mjs.map +1 -0
- package/fesm2022/slotted-angular-saved-views.mjs +877 -0
- package/fesm2022/slotted-angular-saved-views.mjs.map +1 -0
- package/fesm2022/slotted-angular-scroll-area.mjs +294 -0
- package/fesm2022/slotted-angular-scroll-area.mjs.map +1 -0
- package/fesm2022/slotted-angular-section.mjs +266 -0
- package/fesm2022/slotted-angular-section.mjs.map +1 -0
- package/fesm2022/slotted-angular-segmented-control.mjs +454 -0
- package/fesm2022/slotted-angular-segmented-control.mjs.map +1 -0
- package/fesm2022/slotted-angular-select.mjs +1899 -0
- package/fesm2022/slotted-angular-select.mjs.map +1 -0
- package/fesm2022/slotted-angular-side-navigation.mjs +1042 -0
- package/fesm2022/slotted-angular-side-navigation.mjs.map +1 -0
- package/fesm2022/slotted-angular-skeleton.mjs +316 -0
- package/fesm2022/slotted-angular-skeleton.mjs.map +1 -0
- package/fesm2022/slotted-angular-slider.mjs +586 -0
- package/fesm2022/slotted-angular-slider.mjs.map +1 -0
- package/fesm2022/slotted-angular-sparkline.mjs +235 -0
- package/fesm2022/slotted-angular-sparkline.mjs.map +1 -0
- package/fesm2022/slotted-angular-split-button.mjs +331 -0
- package/fesm2022/slotted-angular-split-button.mjs.map +1 -0
- package/fesm2022/slotted-angular-splitter.mjs +516 -0
- package/fesm2022/slotted-angular-splitter.mjs.map +1 -0
- package/fesm2022/slotted-angular-stack.mjs +48 -0
- package/fesm2022/slotted-angular-stack.mjs.map +1 -0
- package/fesm2022/slotted-angular-stat-card.mjs +478 -0
- package/fesm2022/slotted-angular-stat-card.mjs.map +1 -0
- package/fesm2022/slotted-angular-status-indicator.mjs +155 -0
- package/fesm2022/slotted-angular-status-indicator.mjs.map +1 -0
- package/fesm2022/slotted-angular-stepper.mjs +536 -0
- package/fesm2022/slotted-angular-stepper.mjs.map +1 -0
- package/fesm2022/slotted-angular-switch.mjs +447 -0
- package/fesm2022/slotted-angular-switch.mjs.map +1 -0
- package/fesm2022/slotted-angular-table-of-contents.mjs +750 -0
- package/fesm2022/slotted-angular-table-of-contents.mjs.map +1 -0
- package/fesm2022/slotted-angular-table.mjs +2518 -0
- package/fesm2022/slotted-angular-table.mjs.map +1 -0
- package/fesm2022/slotted-angular-tabs.mjs +829 -0
- package/fesm2022/slotted-angular-tabs.mjs.map +1 -0
- package/fesm2022/slotted-angular-tag.mjs +595 -0
- package/fesm2022/slotted-angular-tag.mjs.map +1 -0
- package/fesm2022/slotted-angular-tags-input.mjs +1211 -0
- package/fesm2022/slotted-angular-tags-input.mjs.map +1 -0
- package/fesm2022/slotted-angular-text-field.mjs +674 -0
- package/fesm2022/slotted-angular-text-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-textarea.mjs +275 -0
- package/fesm2022/slotted-angular-textarea.mjs.map +1 -0
- package/fesm2022/slotted-angular-theme.mjs +45 -0
- package/fesm2022/slotted-angular-theme.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-field.mjs +895 -0
- package/fesm2022/slotted-angular-time-field.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-picker.mjs +856 -0
- package/fesm2022/slotted-angular-time-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-time-range-picker.mjs +1534 -0
- package/fesm2022/slotted-angular-time-range-picker.mjs.map +1 -0
- package/fesm2022/slotted-angular-timeline.mjs +928 -0
- package/fesm2022/slotted-angular-timeline.mjs.map +1 -0
- package/fesm2022/slotted-angular-toast.mjs +917 -0
- package/fesm2022/slotted-angular-toast.mjs.map +1 -0
- package/fesm2022/slotted-angular-toggle-group.mjs +311 -0
- package/fesm2022/slotted-angular-toggle-group.mjs.map +1 -0
- package/fesm2022/slotted-angular-toggle.mjs +162 -0
- package/fesm2022/slotted-angular-toggle.mjs.map +1 -0
- package/fesm2022/slotted-angular-toolbar.mjs +536 -0
- package/fesm2022/slotted-angular-toolbar.mjs.map +1 -0
- package/fesm2022/slotted-angular-tooltip.mjs +798 -0
- package/fesm2022/slotted-angular-tooltip.mjs.map +1 -0
- package/fesm2022/slotted-angular-top-navigation.mjs +1308 -0
- package/fesm2022/slotted-angular-top-navigation.mjs.map +1 -0
- package/fesm2022/slotted-angular-tour.mjs +1330 -0
- package/fesm2022/slotted-angular-tour.mjs.map +1 -0
- package/fesm2022/slotted-angular-transfer.mjs +1406 -0
- package/fesm2022/slotted-angular-transfer.mjs.map +1 -0
- package/fesm2022/slotted-angular-tree.mjs +1448 -0
- package/fesm2022/slotted-angular-tree.mjs.map +1 -0
- package/fesm2022/slotted-angular-typography.mjs +184 -0
- package/fesm2022/slotted-angular-typography.mjs.map +1 -0
- package/fesm2022/slotted-angular-upload.mjs +1523 -0
- package/fesm2022/slotted-angular-upload.mjs.map +1 -0
- package/fesm2022/slotted-angular-visually-hidden.mjs +32 -0
- package/fesm2022/slotted-angular-visually-hidden.mjs.map +1 -0
- package/fesm2022/slotted-angular-wizard.mjs +1715 -0
- package/fesm2022/slotted-angular-wizard.mjs.map +1 -0
- package/fesm2022/slotted-angular.mjs +4 -0
- package/fesm2022/slotted-angular.mjs.map +1 -0
- package/package.json +537 -3
- package/types/slotted-angular-accordion.d.ts +156 -0
- package/types/slotted-angular-accordion.d.ts.map +1 -0
- package/types/slotted-angular-action-bar.d.ts +291 -0
- package/types/slotted-angular-action-bar.d.ts.map +1 -0
- package/types/slotted-angular-action-sheet.d.ts +294 -0
- package/types/slotted-angular-action-sheet.d.ts.map +1 -0
- package/types/slotted-angular-alert.d.ts +214 -0
- package/types/slotted-angular-alert.d.ts.map +1 -0
- package/types/slotted-angular-app-shell.d.ts +549 -0
- package/types/slotted-angular-app-shell.d.ts.map +1 -0
- package/types/slotted-angular-aspect-ratio.d.ts +57 -0
- package/types/slotted-angular-aspect-ratio.d.ts.map +1 -0
- package/types/slotted-angular-attachment.d.ts +294 -0
- package/types/slotted-angular-attachment.d.ts.map +1 -0
- package/types/slotted-angular-avatar-group.d.ts +119 -0
- package/types/slotted-angular-avatar-group.d.ts.map +1 -0
- package/types/slotted-angular-avatar.d.ts +202 -0
- package/types/slotted-angular-avatar.d.ts.map +1 -0
- package/types/slotted-angular-badge.d.ts +166 -0
- package/types/slotted-angular-badge.d.ts.map +1 -0
- package/types/slotted-angular-breadcrumb.d.ts +251 -0
- package/types/slotted-angular-breadcrumb.d.ts.map +1 -0
- package/types/slotted-angular-button-group.d.ts +89 -0
- package/types/slotted-angular-button-group.d.ts.map +1 -0
- package/types/slotted-angular-button.d.ts +390 -0
- package/types/slotted-angular-button.d.ts.map +1 -0
- package/types/slotted-angular-calendar.d.ts +280 -0
- package/types/slotted-angular-calendar.d.ts.map +1 -0
- package/types/slotted-angular-card.d.ts +140 -0
- package/types/slotted-angular-card.d.ts.map +1 -0
- package/types/slotted-angular-carousel.d.ts +288 -0
- package/types/slotted-angular-carousel.d.ts.map +1 -0
- package/types/slotted-angular-cascader.d.ts +351 -0
- package/types/slotted-angular-cascader.d.ts.map +1 -0
- package/types/slotted-angular-chart.d.ts +319 -0
- package/types/slotted-angular-chart.d.ts.map +1 -0
- package/types/slotted-angular-checkbox-group.d.ts +156 -0
- package/types/slotted-angular-checkbox-group.d.ts.map +1 -0
- package/types/slotted-angular-checkbox.d.ts +197 -0
- package/types/slotted-angular-checkbox.d.ts.map +1 -0
- package/types/slotted-angular-code-block.d.ts +158 -0
- package/types/slotted-angular-code-block.d.ts.map +1 -0
- package/types/slotted-angular-collapsible.d.ts +272 -0
- package/types/slotted-angular-collapsible.d.ts.map +1 -0
- package/types/slotted-angular-color-picker.d.ts +181 -0
- package/types/slotted-angular-color-picker.d.ts.map +1 -0
- package/types/slotted-angular-column-manager.d.ts +200 -0
- package/types/slotted-angular-column-manager.d.ts.map +1 -0
- package/types/slotted-angular-combobox.d.ts +449 -0
- package/types/slotted-angular-combobox.d.ts.map +1 -0
- package/types/slotted-angular-command-palette.d.ts +256 -0
- package/types/slotted-angular-command-palette.d.ts.map +1 -0
- package/types/slotted-angular-container.d.ts +84 -0
- package/types/slotted-angular-container.d.ts.map +1 -0
- package/types/slotted-angular-context-menu.d.ts +84 -0
- package/types/slotted-angular-context-menu.d.ts.map +1 -0
- package/types/slotted-angular-currency-field.d.ts +480 -0
- package/types/slotted-angular-currency-field.d.ts.map +1 -0
- package/types/slotted-angular-dashboard-grid.d.ts +341 -0
- package/types/slotted-angular-dashboard-grid.d.ts.map +1 -0
- package/types/slotted-angular-data-grid.d.ts +1077 -0
- package/types/slotted-angular-data-grid.d.ts.map +1 -0
- package/types/slotted-angular-data-list.d.ts +272 -0
- package/types/slotted-angular-data-list.d.ts.map +1 -0
- package/types/slotted-angular-date-field.d.ts +320 -0
- package/types/slotted-angular-date-field.d.ts.map +1 -0
- package/types/slotted-angular-date-picker.d.ts +224 -0
- package/types/slotted-angular-date-picker.d.ts.map +1 -0
- package/types/slotted-angular-date-range-picker.d.ts +310 -0
- package/types/slotted-angular-date-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-datetime-field.d.ts +362 -0
- package/types/slotted-angular-datetime-field.d.ts.map +1 -0
- package/types/slotted-angular-datetime-picker.d.ts +370 -0
- package/types/slotted-angular-datetime-picker.d.ts.map +1 -0
- package/types/slotted-angular-datetime-range-picker.d.ts +459 -0
- package/types/slotted-angular-datetime-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-description-list.d.ts +281 -0
- package/types/slotted-angular-description-list.d.ts.map +1 -0
- package/types/slotted-angular-detail-panel.d.ts +240 -0
- package/types/slotted-angular-detail-panel.d.ts.map +1 -0
- package/types/slotted-angular-dialog.d.ts +497 -0
- package/types/slotted-angular-dialog.d.ts.map +1 -0
- package/types/slotted-angular-divider.d.ts +40 -0
- package/types/slotted-angular-divider.d.ts.map +1 -0
- package/types/slotted-angular-drawer.d.ts +532 -0
- package/types/slotted-angular-drawer.d.ts.map +1 -0
- package/types/slotted-angular-entity-picker.d.ts +338 -0
- package/types/slotted-angular-entity-picker.d.ts.map +1 -0
- package/types/slotted-angular-event-calendar.d.ts +574 -0
- package/types/slotted-angular-event-calendar.d.ts.map +1 -0
- package/types/slotted-angular-field-group.d.ts +152 -0
- package/types/slotted-angular-field-group.d.ts.map +1 -0
- package/types/slotted-angular-field.d.ts +535 -0
- package/types/slotted-angular-field.d.ts.map +1 -0
- package/types/slotted-angular-filter-bar.d.ts +573 -0
- package/types/slotted-angular-filter-bar.d.ts.map +1 -0
- package/types/slotted-angular-form.d.ts +298 -0
- package/types/slotted-angular-form.d.ts.map +1 -0
- package/types/slotted-angular-fullscreen.d.ts +145 -0
- package/types/slotted-angular-fullscreen.d.ts.map +1 -0
- package/types/slotted-angular-grid.d.ts +50 -0
- package/types/slotted-angular-grid.d.ts.map +1 -0
- package/types/slotted-angular-highlight.d.ts +93 -0
- package/types/slotted-angular-highlight.d.ts.map +1 -0
- package/types/slotted-angular-hover-card.d.ts +140 -0
- package/types/slotted-angular-hover-card.d.ts.map +1 -0
- package/types/slotted-angular-i18n.d.ts +46 -0
- package/types/slotted-angular-i18n.d.ts.map +1 -0
- package/types/slotted-angular-icon.d.ts +94 -0
- package/types/slotted-angular-icon.d.ts.map +1 -0
- package/types/slotted-angular-image.d.ts +251 -0
- package/types/slotted-angular-image.d.ts.map +1 -0
- package/types/slotted-angular-import-export-center.d.ts +351 -0
- package/types/slotted-angular-import-export-center.d.ts.map +1 -0
- package/types/slotted-angular-inline-message.d.ts +195 -0
- package/types/slotted-angular-inline-message.d.ts.map +1 -0
- package/types/slotted-angular-inline.d.ts +41 -0
- package/types/slotted-angular-inline.d.ts.map +1 -0
- package/types/slotted-angular-kbd.d.ts +174 -0
- package/types/slotted-angular-kbd.d.ts.map +1 -0
- package/types/slotted-angular-link.d.ts +94 -0
- package/types/slotted-angular-link.d.ts.map +1 -0
- package/types/slotted-angular-list-item.d.ts +210 -0
- package/types/slotted-angular-list-item.d.ts.map +1 -0
- package/types/slotted-angular-list.d.ts +176 -0
- package/types/slotted-angular-list.d.ts.map +1 -0
- package/types/slotted-angular-listbox.d.ts +470 -0
- package/types/slotted-angular-listbox.d.ts.map +1 -0
- package/types/slotted-angular-loading-overlay.d.ts +219 -0
- package/types/slotted-angular-loading-overlay.d.ts.map +1 -0
- package/types/slotted-angular-markdown.d.ts +172 -0
- package/types/slotted-angular-markdown.d.ts.map +1 -0
- package/types/slotted-angular-menu.d.ts +448 -0
- package/types/slotted-angular-menu.d.ts.map +1 -0
- package/types/slotted-angular-menubar.d.ts +90 -0
- package/types/slotted-angular-menubar.d.ts.map +1 -0
- package/types/slotted-angular-message-scroller.d.ts +151 -0
- package/types/slotted-angular-message-scroller.d.ts.map +1 -0
- package/types/slotted-angular-message.d.ts +348 -0
- package/types/slotted-angular-message.d.ts.map +1 -0
- package/types/slotted-angular-multi-select.d.ts +462 -0
- package/types/slotted-angular-multi-select.d.ts.map +1 -0
- package/types/slotted-angular-navigation-menu.d.ts +309 -0
- package/types/slotted-angular-navigation-menu.d.ts.map +1 -0
- package/types/slotted-angular-notification-center.d.ts +318 -0
- package/types/slotted-angular-notification-center.d.ts.map +1 -0
- package/types/slotted-angular-number-field.d.ts +402 -0
- package/types/slotted-angular-number-field.d.ts.map +1 -0
- package/types/slotted-angular-otp-input.d.ts +286 -0
- package/types/slotted-angular-otp-input.d.ts.map +1 -0
- package/types/slotted-angular-page-header.d.ts +334 -0
- package/types/slotted-angular-page-header.d.ts.map +1 -0
- package/types/slotted-angular-page.d.ts +141 -0
- package/types/slotted-angular-page.d.ts.map +1 -0
- package/types/slotted-angular-pagination.d.ts +213 -0
- package/types/slotted-angular-pagination.d.ts.map +1 -0
- package/types/slotted-angular-popover.d.ts +366 -0
- package/types/slotted-angular-popover.d.ts.map +1 -0
- package/types/slotted-angular-progress-indicator.d.ts +312 -0
- package/types/slotted-angular-progress-indicator.d.ts.map +1 -0
- package/types/slotted-angular-prompt-composer.d.ts +242 -0
- package/types/slotted-angular-prompt-composer.d.ts.map +1 -0
- package/types/slotted-angular-prose.d.ts +171 -0
- package/types/slotted-angular-prose.d.ts.map +1 -0
- package/types/slotted-angular-radio-group.d.ts +268 -0
- package/types/slotted-angular-radio-group.d.ts.map +1 -0
- package/types/slotted-angular-rating.d.ts +374 -0
- package/types/slotted-angular-rating.d.ts.map +1 -0
- package/types/slotted-angular-result-state.d.ts +217 -0
- package/types/slotted-angular-result-state.d.ts.map +1 -0
- package/types/slotted-angular-saved-views.d.ts +198 -0
- package/types/slotted-angular-saved-views.d.ts.map +1 -0
- package/types/slotted-angular-scroll-area.d.ts +186 -0
- package/types/slotted-angular-scroll-area.d.ts.map +1 -0
- package/types/slotted-angular-section.d.ts +143 -0
- package/types/slotted-angular-section.d.ts.map +1 -0
- package/types/slotted-angular-segmented-control.d.ts +251 -0
- package/types/slotted-angular-segmented-control.d.ts.map +1 -0
- package/types/slotted-angular-select.d.ts +507 -0
- package/types/slotted-angular-select.d.ts.map +1 -0
- package/types/slotted-angular-side-navigation.d.ts +373 -0
- package/types/slotted-angular-side-navigation.d.ts.map +1 -0
- package/types/slotted-angular-skeleton.d.ts +198 -0
- package/types/slotted-angular-skeleton.d.ts.map +1 -0
- package/types/slotted-angular-slider.d.ts +216 -0
- package/types/slotted-angular-slider.d.ts.map +1 -0
- package/types/slotted-angular-sparkline.d.ts +106 -0
- package/types/slotted-angular-sparkline.d.ts.map +1 -0
- package/types/slotted-angular-split-button.d.ts +180 -0
- package/types/slotted-angular-split-button.d.ts.map +1 -0
- package/types/slotted-angular-splitter.d.ts +206 -0
- package/types/slotted-angular-splitter.d.ts.map +1 -0
- package/types/slotted-angular-stack.d.ts +38 -0
- package/types/slotted-angular-stack.d.ts.map +1 -0
- package/types/slotted-angular-stat-card.d.ts +232 -0
- package/types/slotted-angular-stat-card.d.ts.map +1 -0
- package/types/slotted-angular-status-indicator.d.ts +106 -0
- package/types/slotted-angular-status-indicator.d.ts.map +1 -0
- package/types/slotted-angular-stepper.d.ts +198 -0
- package/types/slotted-angular-stepper.d.ts.map +1 -0
- package/types/slotted-angular-switch.d.ts +243 -0
- package/types/slotted-angular-switch.d.ts.map +1 -0
- package/types/slotted-angular-table-of-contents.d.ts +210 -0
- package/types/slotted-angular-table-of-contents.d.ts.map +1 -0
- package/types/slotted-angular-table.d.ts +888 -0
- package/types/slotted-angular-table.d.ts.map +1 -0
- package/types/slotted-angular-tabs.d.ts +340 -0
- package/types/slotted-angular-tabs.d.ts.map +1 -0
- package/types/slotted-angular-tag.d.ts +279 -0
- package/types/slotted-angular-tag.d.ts.map +1 -0
- package/types/slotted-angular-tags-input.d.ts +302 -0
- package/types/slotted-angular-tags-input.d.ts.map +1 -0
- package/types/slotted-angular-text-field.d.ts +334 -0
- package/types/slotted-angular-text-field.d.ts.map +1 -0
- package/types/slotted-angular-textarea.d.ts +150 -0
- package/types/slotted-angular-textarea.d.ts.map +1 -0
- package/types/slotted-angular-theme.d.ts +26 -0
- package/types/slotted-angular-theme.d.ts.map +1 -0
- package/types/slotted-angular-time-field.d.ts +300 -0
- package/types/slotted-angular-time-field.d.ts.map +1 -0
- package/types/slotted-angular-time-picker.d.ts +260 -0
- package/types/slotted-angular-time-picker.d.ts.map +1 -0
- package/types/slotted-angular-time-range-picker.d.ts +401 -0
- package/types/slotted-angular-time-range-picker.d.ts.map +1 -0
- package/types/slotted-angular-timeline.d.ts +329 -0
- package/types/slotted-angular-timeline.d.ts.map +1 -0
- package/types/slotted-angular-toast.d.ts +340 -0
- package/types/slotted-angular-toast.d.ts.map +1 -0
- package/types/slotted-angular-toggle-group.d.ts +167 -0
- package/types/slotted-angular-toggle-group.d.ts.map +1 -0
- package/types/slotted-angular-toggle.d.ts +106 -0
- package/types/slotted-angular-toggle.d.ts.map +1 -0
- package/types/slotted-angular-toolbar.d.ts +252 -0
- package/types/slotted-angular-toolbar.d.ts.map +1 -0
- package/types/slotted-angular-tooltip.d.ts +388 -0
- package/types/slotted-angular-tooltip.d.ts.map +1 -0
- package/types/slotted-angular-top-navigation.d.ts +442 -0
- package/types/slotted-angular-top-navigation.d.ts.map +1 -0
- package/types/slotted-angular-tour.d.ts +440 -0
- package/types/slotted-angular-tour.d.ts.map +1 -0
- package/types/slotted-angular-transfer.d.ts +296 -0
- package/types/slotted-angular-transfer.d.ts.map +1 -0
- package/types/slotted-angular-tree.d.ts +499 -0
- package/types/slotted-angular-tree.d.ts.map +1 -0
- package/types/slotted-angular-typography.d.ts +89 -0
- package/types/slotted-angular-typography.d.ts.map +1 -0
- package/types/slotted-angular-upload.d.ts +365 -0
- package/types/slotted-angular-upload.d.ts.map +1 -0
- package/types/slotted-angular-visually-hidden.d.ts +19 -0
- package/types/slotted-angular-visually-hidden.d.ts.map +1 -0
- package/types/slotted-angular-wizard.d.ts +441 -0
- package/types/slotted-angular-wizard.d.ts.map +1 -0
- package/types/slotted-angular.d.ts +3 -0
- package/types/slotted-angular.d.ts.map +1 -0
|
@@ -0,0 +1,928 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, Injectable, HostAttributeToken, computed, input, booleanAttribute, Directive, ElementRef, signal, DestroyRef, afterNextRender, contentChild, forwardRef, ViewEncapsulation, ChangeDetectionStrategy, Component, effect } from '@angular/core';
|
|
3
|
+
import { injectMessages } from '@slotted/angular/i18n';
|
|
4
|
+
import { SlInlineMessage } from '@slotted/angular/inline-message';
|
|
5
|
+
import { fieldMessages } from '@slotted/core/i18n';
|
|
6
|
+
import { SlGlyph, SlIcon } from '@slotted/angular/icon';
|
|
7
|
+
import * as i1 from '@slotted/angular/tooltip';
|
|
8
|
+
import { SlTooltip, SlTooltipArrow, SlTooltipContent, SlTooltipLayer, provideTooltipDefaults, SlTooltipTrigger } from '@slotted/angular/tooltip';
|
|
9
|
+
|
|
10
|
+
const FIELD_DESCRIBED_ORDER = [
|
|
11
|
+
'indicator',
|
|
12
|
+
'help',
|
|
13
|
+
'description',
|
|
14
|
+
'counter',
|
|
15
|
+
'error',
|
|
16
|
+
];
|
|
17
|
+
const FALLBACK = {
|
|
18
|
+
disabled: undefined,
|
|
19
|
+
labelPlacement: 'top',
|
|
20
|
+
necessity: 'mark',
|
|
21
|
+
readOnly: undefined,
|
|
22
|
+
size: 'md',
|
|
23
|
+
};
|
|
24
|
+
const FIELD_DEFAULTS = new InjectionToken('slotted field defaults', {
|
|
25
|
+
providedIn: 'root',
|
|
26
|
+
factory: () => FALLBACK,
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* An application decides once what its fields look like, rather than repeating
|
|
30
|
+
* the same inputs on every field in a form. Their words come from the language
|
|
31
|
+
* in force (`provideSlotted`).
|
|
32
|
+
* `SlFieldGroup` provides an overriding value for its own subtree, so a compact
|
|
33
|
+
* section — or a disabled one — is one attribute rather than one per field.
|
|
34
|
+
*
|
|
35
|
+
* Among the surveyed implementations only Angular Material ships
|
|
36
|
+
* application-wide defaults, and this is that idea taken to both bindings.
|
|
37
|
+
*
|
|
38
|
+
* `disabled` and `readOnly` are here and `invalid` and `required` are not. The
|
|
39
|
+
* first two describe a context a whole section can be in; the second two are
|
|
40
|
+
* facts about one value, and a token that set them would mark every field in an
|
|
41
|
+
* application as required for a reason no field could name.
|
|
42
|
+
*/
|
|
43
|
+
function provideFieldDefaults(defaults) {
|
|
44
|
+
return {
|
|
45
|
+
provide: FIELD_DEFAULTS,
|
|
46
|
+
useFactory: () => ({
|
|
47
|
+
disabled: defaults.disabled ?? FALLBACK.disabled,
|
|
48
|
+
labelPlacement: defaults.labelPlacement ?? FALLBACK.labelPlacement,
|
|
49
|
+
necessity: defaults.necessity ?? FALLBACK.necessity,
|
|
50
|
+
readOnly: defaults.readOnly ?? FALLBACK.readOnly,
|
|
51
|
+
size: defaults.size ?? FALLBACK.size,
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** What a field renders as here, before it states anything of its own. */
|
|
56
|
+
function injectFieldDefaults() {
|
|
57
|
+
return inject(FIELD_DEFAULTS);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A component in the tree answering for the fields under it, which is what
|
|
61
|
+
* `field-group` is. It exists as a class of its own so `@slotted/angular/field`
|
|
62
|
+
* never has to know that `field-group` exists — the dependency runs one way,
|
|
63
|
+
* from the group to the field.
|
|
64
|
+
*
|
|
65
|
+
* It is read rather than snapshotted, because Angular creates every directive
|
|
66
|
+
* in a template before it binds any input: a group that handed its fields a
|
|
67
|
+
* value in its constructor would hand them the value its inputs had before the
|
|
68
|
+
* consumer's bindings ran, which is the default for all six.
|
|
69
|
+
*/
|
|
70
|
+
class SlFieldDefaultsSource {
|
|
71
|
+
}
|
|
72
|
+
/** The identifiers a field derives from its base, in one place. */
|
|
73
|
+
function deriveFieldIds(base) {
|
|
74
|
+
return {
|
|
75
|
+
control: `${base}-control`,
|
|
76
|
+
counter: `${base}-counter`,
|
|
77
|
+
description: `${base}-description`,
|
|
78
|
+
error: `${base}-error`,
|
|
79
|
+
help: `${base}-help`,
|
|
80
|
+
indicator: `${base}-indicator`,
|
|
81
|
+
label: `${base}-label`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* What the necessity mark says, and whether a reader hears it. The asterisk is
|
|
86
|
+
* hidden, because `aria-required` on the control already carries the fact and a
|
|
87
|
+
* form of twenty required fields does not need "asterisk" twenty times; the
|
|
88
|
+
* words are not, because `(optional)` is information rather than decoration.
|
|
89
|
+
* `null` when nothing is drawn. `slFieldGroupLegend` draws its mark with the
|
|
90
|
+
* same answer.
|
|
91
|
+
*/
|
|
92
|
+
function necessityMark(necessity, required, t) {
|
|
93
|
+
switch (necessity) {
|
|
94
|
+
case 'mark':
|
|
95
|
+
return required ? { hidden: true, text: '*' } : null;
|
|
96
|
+
case 'optional':
|
|
97
|
+
return required ? null : { hidden: false, text: t('optional') };
|
|
98
|
+
case 'words':
|
|
99
|
+
return { hidden: false, text: t(required ? 'required' : 'optional') };
|
|
100
|
+
case 'none':
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The field as the parts that live in a module `field.ts` imports see it — the
|
|
106
|
+
* counter today. Provided by `SlField` as itself, so the counter reaches the
|
|
107
|
+
* field's identifiers without importing it, which would be a cycle.
|
|
108
|
+
*/
|
|
109
|
+
class SlFieldContext {
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The parts the field looks for without importing them. Each part provides
|
|
113
|
+
* its marker as itself, and the field queries the marker; importing the part
|
|
114
|
+
* classes into `field.ts` would be a cycle, since every one of them injects
|
|
115
|
+
* `SlField`.
|
|
116
|
+
*/
|
|
117
|
+
class SlFieldHeaderSlot {
|
|
118
|
+
}
|
|
119
|
+
class SlFieldHelpSlot {
|
|
120
|
+
}
|
|
121
|
+
class SlFieldIndicatorSlot {
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Application-scoped rather than module-scoped, for the reason `inline-message`
|
|
125
|
+
* records: a module-level counter produces colliding sequences when two
|
|
126
|
+
* applications render in one server process, and the server and the client
|
|
127
|
+
* sequences must match for hydration.
|
|
128
|
+
*/
|
|
129
|
+
class SlFieldIdFactory {
|
|
130
|
+
count = 0;
|
|
131
|
+
next() {
|
|
132
|
+
this.count += 1;
|
|
133
|
+
return `slotted-field-${this.count}`;
|
|
134
|
+
}
|
|
135
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldIdFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
136
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldIdFactory, providedIn: 'root' });
|
|
137
|
+
}
|
|
138
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldIdFactory, decorators: [{
|
|
139
|
+
type: Injectable,
|
|
140
|
+
args: [{ providedIn: 'root' }]
|
|
141
|
+
}] });
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* How a count reads: `12/280` when there is a limit and `12` when there is
|
|
145
|
+
* none. Carbon and Polaris both write the pair; Angular Material writes it in
|
|
146
|
+
* the subscript, where a count that appears on the first keystroke shares a row
|
|
147
|
+
* with the error and pushes it.
|
|
148
|
+
*/
|
|
149
|
+
function formatFieldCount(count) {
|
|
150
|
+
return count.max === undefined ? String(count.length) : `${count.length}/${count.max}`;
|
|
151
|
+
}
|
|
152
|
+
/** Whether a count has passed the limit it was given. */
|
|
153
|
+
function isFieldCountOver(count) {
|
|
154
|
+
return count.max !== undefined && count.length > count.max;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A count the page writes itself, at the end of the label row — which is where
|
|
158
|
+
* Carbon puts it. Angular Material puts it in the subscript beside the error,
|
|
159
|
+
* where a count that appears on the first keystroke shares a row with the
|
|
160
|
+
* message and pushes it.
|
|
161
|
+
*
|
|
162
|
+
* A field whose control publishes a count gets a counter drawn by the field, so
|
|
163
|
+
* this directive is for the page that counts something the control cannot:
|
|
164
|
+
* words, bytes, line items. Writing one withdraws the field's own, because two
|
|
165
|
+
* counters in one row is one row too many.
|
|
166
|
+
*
|
|
167
|
+
* It lives in a module of its own so `field.ts` can look for it without
|
|
168
|
+
* importing the parts that inject `SlField`, which would be a cycle; it reaches
|
|
169
|
+
* the field through `SlFieldContext` for the same reason.
|
|
170
|
+
*/
|
|
171
|
+
class SlFieldCounter {
|
|
172
|
+
field = inject(SlFieldContext, { optional: true });
|
|
173
|
+
writtenId = inject(new HostAttributeToken('id'), { optional: true });
|
|
174
|
+
/**
|
|
175
|
+
* The identifier the field's description reads the count by, which
|
|
176
|
+
* `docs/component-features.md` §2.8 requires of a counter. A consumer's own
|
|
177
|
+
* `id` wins.
|
|
178
|
+
*/
|
|
179
|
+
counterId = computed(() => this.writtenId ?? this.field?.ids().counter ?? null, /* @ts-ignore */
|
|
180
|
+
...(ngDevMode ? [{ debugName: "counterId" }] : /* istanbul ignore next */ []));
|
|
181
|
+
/**
|
|
182
|
+
* The count has passed its limit. It is the counter's own state rather than
|
|
183
|
+
* the field's: a count can pass its maximum while validation has not run, and
|
|
184
|
+
* a counter that only turned at submit would say nothing at the moment it is
|
|
185
|
+
* being read.
|
|
186
|
+
*/
|
|
187
|
+
invalid = input(false, { ...(ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
188
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldCounter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
189
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: SlFieldCounter, isStandalone: true, selector: "[slFieldCounter]", inputs: { invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "counter" }, properties: { "attr.id": "counterId()", "attr.data-invalid": "invalid() ? '' : null" } }, exportAs: ["slFieldCounter"], ngImport: i0 });
|
|
190
|
+
}
|
|
191
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldCounter, decorators: [{
|
|
192
|
+
type: Directive,
|
|
193
|
+
args: [{
|
|
194
|
+
selector: '[slFieldCounter]',
|
|
195
|
+
standalone: true,
|
|
196
|
+
exportAs: 'slFieldCounter',
|
|
197
|
+
host: {
|
|
198
|
+
'data-part': 'counter',
|
|
199
|
+
'[attr.id]': 'counterId()',
|
|
200
|
+
'[attr.data-invalid]': "invalid() ? '' : null",
|
|
201
|
+
},
|
|
202
|
+
}]
|
|
203
|
+
}], propDecorators: { invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }] } });
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* What the page wants said, and how — carried by the element the page writes
|
|
207
|
+
* and read by the field, which renders the `inline-message` around it.
|
|
208
|
+
*
|
|
209
|
+
* The field renders the message rather than the page, because `SlInlineMessage`
|
|
210
|
+
* takes its values as `input()` signals and nothing outside the template that
|
|
211
|
+
* instantiates it can write one. A directive sharing the element could only set
|
|
212
|
+
* attributes the component's own host bindings would then overwrite, and the
|
|
213
|
+
* identifier the field derives is exactly such a value.
|
|
214
|
+
*/
|
|
215
|
+
class SlFieldMessage {
|
|
216
|
+
/** Replaces the message's own tone. `inline-message` owns the five. */
|
|
217
|
+
tone = input(undefined, /* @ts-ignore */
|
|
218
|
+
...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
|
|
219
|
+
/** Whether the message announces itself when it arrives. */
|
|
220
|
+
live = input(undefined, /* @ts-ignore */
|
|
221
|
+
...(ngDevMode ? [{ debugName: "live" }] : /* istanbul ignore next */ []));
|
|
222
|
+
/**
|
|
223
|
+
* Which mark the message draws. A field's messages default to `none`, and
|
|
224
|
+
* `glyph` asks for the tone's own silhouette, `dot` for one neutral bullet.
|
|
225
|
+
*/
|
|
226
|
+
mark = input(undefined, /* @ts-ignore */
|
|
227
|
+
...(ngDevMode ? [{ debugName: "mark" }] : /* istanbul ignore next */ []));
|
|
228
|
+
/** The word read before the message; the empty string removes it. */
|
|
229
|
+
prefix = input(undefined, /* @ts-ignore */
|
|
230
|
+
...(ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []));
|
|
231
|
+
/** Draws no mark, for a message that carries its own artwork. */
|
|
232
|
+
hideIcon = input(false, { ...(ngDevMode ? { debugName: "hideIcon" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
233
|
+
/** Holds one line box open so nothing below moves when the message arrives. */
|
|
234
|
+
reserve = input(false, { ...(ngDevMode ? { debugName: "reserve" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
235
|
+
host = inject(ElementRef).nativeElement;
|
|
236
|
+
content = signal(false, /* @ts-ignore */
|
|
237
|
+
...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
|
|
238
|
+
/**
|
|
239
|
+
* Whether the message has text to say. An empty one — a `reserve` line
|
|
240
|
+
* waiting for its text — keeps its box and describes nothing, which is what
|
|
241
|
+
* React's messages register.
|
|
242
|
+
*
|
|
243
|
+
* It is read after the template that declares the message writes its text
|
|
244
|
+
* and before the host bindings of that template run, so the first render,
|
|
245
|
+
* the only one a server performs, names exactly the messages that have text.
|
|
246
|
+
* In the browser an observer also reports text that arrives from anywhere
|
|
247
|
+
* else.
|
|
248
|
+
*/
|
|
249
|
+
hasContent = this.content.asReadonly();
|
|
250
|
+
constructor() {
|
|
251
|
+
const destroyRef = inject(DestroyRef);
|
|
252
|
+
afterNextRender(() => {
|
|
253
|
+
const observer = new MutationObserver(() => this.read());
|
|
254
|
+
observer.observe(this.host, { characterData: true, childList: true, subtree: true });
|
|
255
|
+
destroyRef.onDestroy(() => observer.disconnect());
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
ngAfterContentChecked() {
|
|
259
|
+
this.read();
|
|
260
|
+
}
|
|
261
|
+
read() {
|
|
262
|
+
this.content.set((this.host.textContent ?? '').trim() !== '');
|
|
263
|
+
}
|
|
264
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldMessage, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
265
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: SlFieldMessage, isStandalone: true, inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, live: { classPropertyName: "live", publicName: "live", isSignal: true, isRequired: false, transformFunction: null }, mark: { classPropertyName: "mark", publicName: "mark", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, hideIcon: { classPropertyName: "hideIcon", publicName: "hideIcon", isSignal: true, isRequired: false, transformFunction: null }, reserve: { classPropertyName: "reserve", publicName: "reserve", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
266
|
+
}
|
|
267
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldMessage, decorators: [{
|
|
268
|
+
type: Directive
|
|
269
|
+
}], ctorParameters: () => [], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], live: [{ type: i0.Input, args: [{ isSignal: true, alias: "live", required: false }] }], mark: [{ type: i0.Input, args: [{ isSignal: true, alias: "mark", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], hideIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideIcon", required: false }] }], reserve: [{ type: i0.Input, args: [{ isSignal: true, alias: "reserve", required: false }] }] } });
|
|
270
|
+
/**
|
|
271
|
+
* Help about the field, projected into the `inline-message` the field renders.
|
|
272
|
+
*
|
|
273
|
+
* It arrives with a tone, a mark, a clipped severity word an application
|
|
274
|
+
* translates once and a reserved line — none of which the field reimplements.
|
|
275
|
+
* `docs/process/build-order.md` states that as the reason `inline-message` was built
|
|
276
|
+
* in wave 2.
|
|
277
|
+
*/
|
|
278
|
+
class SlFieldDescription extends SlFieldMessage {
|
|
279
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldDescription, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
280
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlFieldDescription, isStandalone: true, selector: "[slFieldDescription]", exportAs: ["slFieldDescription"], usesInheritance: true, ngImport: i0 });
|
|
281
|
+
}
|
|
282
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldDescription, decorators: [{
|
|
283
|
+
type: Directive,
|
|
284
|
+
args: [{
|
|
285
|
+
selector: '[slFieldDescription]',
|
|
286
|
+
standalone: true,
|
|
287
|
+
exportAs: 'slFieldDescription',
|
|
288
|
+
}]
|
|
289
|
+
}] });
|
|
290
|
+
/**
|
|
291
|
+
* What is wrong with the value, in words — which is what WCAG 2.2 SC 3.3.1
|
|
292
|
+
* requires and what colour and a mark alone do not satisfy.
|
|
293
|
+
*
|
|
294
|
+
* `tone` accepts the other four, so a warning that does not block submission is
|
|
295
|
+
* the same part in another tone rather than a member of its own. Fluent spends
|
|
296
|
+
* a `validationState` axis on that distinction and Carbon a second component.
|
|
297
|
+
*/
|
|
298
|
+
class SlFieldError extends SlFieldMessage {
|
|
299
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldError, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
300
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlFieldError, isStandalone: true, selector: "[slFieldError]", exportAs: ["slFieldError"], usesInheritance: true, ngImport: i0 });
|
|
301
|
+
}
|
|
302
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldError, decorators: [{
|
|
303
|
+
type: Directive,
|
|
304
|
+
args: [{
|
|
305
|
+
selector: '[slFieldError]',
|
|
306
|
+
standalone: true,
|
|
307
|
+
exportAs: 'slFieldError',
|
|
308
|
+
}]
|
|
309
|
+
}] });
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* One control, its name, its necessity, its help and its error — and the
|
|
313
|
+
* identifiers that bind the four together.
|
|
314
|
+
*
|
|
315
|
+
* **Every shared state is unset rather than `false`.** `disabled`, `invalid`,
|
|
316
|
+
* `required` and `readOnly` default to `undefined`, so a field defers to the
|
|
317
|
+
* `slFieldGroup` around it and the group to the application. A field that
|
|
318
|
+
* defaulted to `false` could not be told from a consumer saying "not disabled",
|
|
319
|
+
* and it would quietly override a disabled section.
|
|
320
|
+
*
|
|
321
|
+
* **The identifiers are derived, not registered.** One base yields four, so
|
|
322
|
+
* `label[for]` resolves to the identifier the control will use with no ordering
|
|
323
|
+
* dependency between siblings and nothing to coordinate during hydration.
|
|
324
|
+
*
|
|
325
|
+
* **The field renders its own messages.** The page writes what it wants said —
|
|
326
|
+
* `<span slFieldError>` — and the field puts it inside an `inline-message` it
|
|
327
|
+
* renders itself, with the identifier, the step and the disabled state already
|
|
328
|
+
* resolved. `SlInlineMessage` takes its values as `input()` signals, and nothing
|
|
329
|
+
* outside the template that instantiates it can write one; a directive sharing
|
|
330
|
+
* the element could only set attributes its host bindings would overwrite. A
|
|
331
|
+
* message the page did not write is not drawn, which is the DOM React's
|
|
332
|
+
* `FieldDescription` and `FieldError` produce.
|
|
333
|
+
*/
|
|
334
|
+
class SlField {
|
|
335
|
+
/** Defaults to the token, then to `md`. */
|
|
336
|
+
size = input(undefined, /* @ts-ignore */
|
|
337
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
338
|
+
/** Defaults to the token, then to `top`. */
|
|
339
|
+
labelPlacement = input(undefined, /* @ts-ignore */
|
|
340
|
+
...(ngDevMode ? [{ debugName: "labelPlacement" }] : /* istanbul ignore next */ []));
|
|
341
|
+
/** Defaults to the token, then to `mark`. */
|
|
342
|
+
necessity = input(undefined, /* @ts-ignore */
|
|
343
|
+
...(ngDevMode ? [{ debugName: "necessity" }] : /* istanbul ignore next */ []));
|
|
344
|
+
/**
|
|
345
|
+
* Words laid over the catalog of the language in force, key by key: the
|
|
346
|
+
* necessity words (`optional`, `required`) and the help control's name (`help`).
|
|
347
|
+
*/
|
|
348
|
+
messages = input(undefined, /* @ts-ignore */
|
|
349
|
+
...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
|
|
350
|
+
/**
|
|
351
|
+
* Unstated rather than `false`, so the field defers to its group and the group
|
|
352
|
+
* to the application. Stated, it wins, and it reaches the control as the
|
|
353
|
+
* native attribute: removing it from the tab order and from submission is what
|
|
354
|
+
* the word means.
|
|
355
|
+
*/
|
|
356
|
+
disabled = input(undefined, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: (value) => (value === undefined ? undefined : booleanAttribute(value)) });
|
|
357
|
+
/** Unstated rather than `false`. Reaches the control as `aria-invalid`. */
|
|
358
|
+
invalid = input(undefined, { ...(ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {}), transform: (value) => (value === undefined ? undefined : booleanAttribute(value)) });
|
|
359
|
+
/**
|
|
360
|
+
* Unstated rather than `false`. Reaches the control as `aria-required` and
|
|
361
|
+
* never as the native `required`, which would engage browser constraint
|
|
362
|
+
* validation and change submit behaviour.
|
|
363
|
+
*/
|
|
364
|
+
required = input(undefined, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: (value) => (value === undefined ? undefined : booleanAttribute(value)) });
|
|
365
|
+
/** Unstated rather than `false`. Reaches the control as the native `readonly`. */
|
|
366
|
+
readOnly = input(undefined, { ...(ngDevMode ? { debugName: "readOnly" } : /* istanbul ignore next */ {}), transform: (value) => (value === undefined ? undefined : booleanAttribute(value)) });
|
|
367
|
+
/**
|
|
368
|
+
* What the control inside published about its value. A control this library
|
|
369
|
+
* ships calls `setCount`; the field draws the counter in the spare column of
|
|
370
|
+
* its label row — the header draws it at its own end when there is one — and
|
|
371
|
+
* only when the page wrote none of its own.
|
|
372
|
+
*/
|
|
373
|
+
countState = signal(undefined, /* @ts-ignore */
|
|
374
|
+
...(ngDevMode ? [{ debugName: "countState" }] : /* istanbul ignore next */ []));
|
|
375
|
+
/** The counter the page wrote, anywhere in the field. */
|
|
376
|
+
writtenCounter = contentChild(SlFieldCounter, { ...(ngDevMode ? { debugName: "writtenCounter" } : /* istanbul ignore next */ {}), descendants: true });
|
|
377
|
+
header = contentChild(SlFieldHeaderSlot, /* @ts-ignore */
|
|
378
|
+
...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
|
|
379
|
+
help = contentChild(SlFieldHelpSlot, { ...(ngDevMode ? { debugName: "help" } : /* istanbul ignore next */ {}), descendants: true });
|
|
380
|
+
indicator = contentChild(SlFieldIndicatorSlot, { ...(ngDevMode ? { debugName: "indicator" } : /* istanbul ignore next */ {}), descendants: true });
|
|
381
|
+
drawnCount = computed(() => this.writtenCounter() === undefined && this.header() === undefined
|
|
382
|
+
? this.countState()
|
|
383
|
+
: undefined, /* @ts-ignore */
|
|
384
|
+
...(ngDevMode ? [{ debugName: "drawnCount" }] : /* istanbul ignore next */ []));
|
|
385
|
+
countOver = computed(() => {
|
|
386
|
+
const count = this.drawnCount();
|
|
387
|
+
return count !== undefined && isFieldCountOver(count);
|
|
388
|
+
}, /* @ts-ignore */
|
|
389
|
+
...(ngDevMode ? [{ debugName: "countOver" }] : /* istanbul ignore next */ []));
|
|
390
|
+
formatCount = formatFieldCount;
|
|
391
|
+
/** The count a control this library ships publishes, whenever its value changes. */
|
|
392
|
+
setCount(count) {
|
|
393
|
+
this.countState.set(count);
|
|
394
|
+
}
|
|
395
|
+
/** What the control published, for a page that draws the counter itself. */
|
|
396
|
+
count = this.countState.asReadonly();
|
|
397
|
+
token = injectFieldDefaults();
|
|
398
|
+
/**
|
|
399
|
+
* The group around this field, if there is one. It answers before the
|
|
400
|
+
* application's own token, and it is read on every change rather than
|
|
401
|
+
* captured, because Angular binds a component's inputs after it has created
|
|
402
|
+
* the directives its template declares.
|
|
403
|
+
*/
|
|
404
|
+
source = inject(SlFieldDefaultsSource, { optional: true });
|
|
405
|
+
defaults = computed(() => this.source?.fieldDefaults() ?? this.token, /* @ts-ignore */
|
|
406
|
+
...(ngDevMode ? [{ debugName: "defaults" }] : /* istanbul ignore next */ []));
|
|
407
|
+
/**
|
|
408
|
+
* The base every identifier is derived from. A consumer's own `id` is the
|
|
409
|
+
* base and stays on the element; the generated one is not written anywhere,
|
|
410
|
+
* because the field is addressable through its parts rather than as a box.
|
|
411
|
+
*/
|
|
412
|
+
base = inject(new HostAttributeToken('id'), { optional: true }) ?? inject(SlFieldIdFactory).next();
|
|
413
|
+
ids = computed(() => deriveFieldIds(this.base), /* @ts-ignore */
|
|
414
|
+
...(ngDevMode ? [{ debugName: "ids" }] : /* istanbul ignore next */ []));
|
|
415
|
+
/**
|
|
416
|
+
* Direct content rather than any descendant: a field nested inside another
|
|
417
|
+
* field's control — a composed control, a fieldset of its own — must not have
|
|
418
|
+
* its message read as this field's.
|
|
419
|
+
*/
|
|
420
|
+
description = contentChild(SlFieldDescription, { ...(ngDevMode ? { debugName: "description" } : /* istanbul ignore next */ {}), descendants: false });
|
|
421
|
+
error = contentChild(SlFieldError, { ...(ngDevMode ? { debugName: "error" } : /* istanbul ignore next */ {}), descendants: false });
|
|
422
|
+
resolvedSize = computed(() => this.size() ?? this.defaults().size, /* @ts-ignore */
|
|
423
|
+
...(ngDevMode ? [{ debugName: "resolvedSize" }] : /* istanbul ignore next */ []));
|
|
424
|
+
resolvedLabelPlacement = computed(() => this.labelPlacement() ?? this.defaults().labelPlacement, /* @ts-ignore */
|
|
425
|
+
...(ngDevMode ? [{ debugName: "resolvedLabelPlacement" }] : /* istanbul ignore next */ []));
|
|
426
|
+
resolvedNecessity = computed(() => this.necessity() ?? this.defaults().necessity, /* @ts-ignore */
|
|
427
|
+
...(ngDevMode ? [{ debugName: "resolvedNecessity" }] : /* istanbul ignore next */ []));
|
|
428
|
+
resolvedDisabled = computed(() => this.disabled() ?? this.defaults().disabled, /* @ts-ignore */
|
|
429
|
+
...(ngDevMode ? [{ debugName: "resolvedDisabled" }] : /* istanbul ignore next */ []));
|
|
430
|
+
resolvedReadOnly = computed(() => this.readOnly() ?? this.defaults().readOnly, /* @ts-ignore */
|
|
431
|
+
...(ngDevMode ? [{ debugName: "resolvedReadOnly" }] : /* istanbul ignore next */ []));
|
|
432
|
+
/** The field's words in the language in force, with this field's `messages` laid over them. */
|
|
433
|
+
t = injectMessages(fieldMessages, this.messages);
|
|
434
|
+
/**
|
|
435
|
+
* A message is quieter than the control it is about, so it starts one step
|
|
436
|
+
* below and only the largest field's message reaches the second step.
|
|
437
|
+
*/
|
|
438
|
+
messageSize = computed(() => this.resolvedSize() === 'lg' ? 'md' : 'sm', /* @ts-ignore */
|
|
439
|
+
...(ngDevMode ? [{ debugName: "messageSize" }] : /* istanbul ignore next */ []));
|
|
440
|
+
/**
|
|
441
|
+
* The contract's order, and only the parts with something to say: the
|
|
442
|
+
* indicator, the help, the description, the count, the error. Known slots
|
|
443
|
+
* have one correct reading order, so it is stated rather than read from the
|
|
444
|
+
* DOM. The count is there whenever one is drawn — the page's, or the one the
|
|
445
|
+
* field or its header draws from what the control published.
|
|
446
|
+
*/
|
|
447
|
+
describedBy = computed(() => {
|
|
448
|
+
const present = {
|
|
449
|
+
counter: this.writtenCounter() !== undefined || this.countState() !== undefined,
|
|
450
|
+
description: this.description()?.hasContent() === true,
|
|
451
|
+
error: this.error()?.hasContent() === true,
|
|
452
|
+
help: this.help() !== undefined,
|
|
453
|
+
indicator: this.indicator() !== undefined,
|
|
454
|
+
};
|
|
455
|
+
const ids = this.ids();
|
|
456
|
+
const parts = FIELD_DESCRIBED_ORDER.filter((slot) => present[slot]).map((slot) => ids[slot]);
|
|
457
|
+
return parts.length === 0 ? null : parts.join(' ');
|
|
458
|
+
}, /* @ts-ignore */
|
|
459
|
+
...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
|
|
460
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
461
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlField, isStandalone: true, selector: "[slField]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, labelPlacement: { classPropertyName: "labelPlacement", publicName: "labelPlacement", isSignal: true, isRequired: false, transformFunction: null }, necessity: { classPropertyName: "necessity", publicName: "necessity", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-ui": "field", "data-part": "root" }, properties: { "attr.data-size": "resolvedSize()", "attr.data-label-placement": "resolvedLabelPlacement()", "attr.data-necessity": "resolvedNecessity()", "attr.data-disabled": "resolvedDisabled() === true ? '' : null", "attr.data-invalid": "invalid() === true ? '' : null", "attr.data-readonly": "resolvedReadOnly() === true ? '' : null", "attr.data-required": "required() === true ? '' : null" } }, providers: [{ provide: SlFieldContext, useExisting: forwardRef(() => SlField) }], queries: [{ propertyName: "writtenCounter", first: true, predicate: SlFieldCounter, descendants: true, isSignal: true }, { propertyName: "header", first: true, predicate: SlFieldHeaderSlot, descendants: true, isSignal: true }, { propertyName: "help", first: true, predicate: SlFieldHelpSlot, descendants: true, isSignal: true }, { propertyName: "indicator", first: true, predicate: SlFieldIndicatorSlot, descendants: true, isSignal: true }, { propertyName: "description", first: true, predicate: SlFieldDescription, isSignal: true }, { propertyName: "error", first: true, predicate: SlFieldError, isSignal: true }], exportAs: ["slField"], ngImport: i0, template: `<ng-content select="[slFieldLabel], [slFieldHeader]" />
|
|
462
|
+
<ng-content select="[slFieldCounter]" />
|
|
463
|
+
@if (drawnCount(); as count) {
|
|
464
|
+
<span
|
|
465
|
+
data-part="counter"
|
|
466
|
+
[id]="ids().counter"
|
|
467
|
+
[attr.data-invalid]="countOver() ? '' : null"
|
|
468
|
+
>{{ formatCount(count) }}</span
|
|
469
|
+
>
|
|
470
|
+
}
|
|
471
|
+
<ng-content />
|
|
472
|
+
@if (description(); as message) {
|
|
473
|
+
<p
|
|
474
|
+
slInlineMessage
|
|
475
|
+
[id]="ids().description"
|
|
476
|
+
[size]="messageSize()"
|
|
477
|
+
[disabled]="resolvedDisabled()"
|
|
478
|
+
[mark]="message.mark() ?? 'none'"
|
|
479
|
+
[tone]="message.tone() ?? 'secondary'"
|
|
480
|
+
[live]="message.live() ?? 'off'"
|
|
481
|
+
[hideIcon]="message.hideIcon() ?? false"
|
|
482
|
+
[reserve]="message.reserve() ?? false"
|
|
483
|
+
[prefix]="message.prefix()"
|
|
484
|
+
>
|
|
485
|
+
<ng-content select="[slFieldDescription]" />
|
|
486
|
+
</p>
|
|
487
|
+
}
|
|
488
|
+
@if (error(); as message) {
|
|
489
|
+
<p
|
|
490
|
+
slInlineMessage
|
|
491
|
+
[id]="ids().error"
|
|
492
|
+
[size]="messageSize()"
|
|
493
|
+
[disabled]="resolvedDisabled()"
|
|
494
|
+
[mark]="message.mark() ?? 'none'"
|
|
495
|
+
[tone]="message.tone() ?? 'danger'"
|
|
496
|
+
[live]="message.live() ?? 'off'"
|
|
497
|
+
[hideIcon]="message.hideIcon() ?? false"
|
|
498
|
+
[reserve]="message.reserve() ?? false"
|
|
499
|
+
[prefix]="message.prefix()"
|
|
500
|
+
>
|
|
501
|
+
<ng-content select="[slFieldError]" />
|
|
502
|
+
</p>
|
|
503
|
+
}`, isInline: true, styles: ["@layer slotted.components{[data-ui=field][data-part=root]{--_font-size: var(--slotted-control-font-size-md, 13px);--_control-block-size: var(--slotted-control-height-md, 34px);--_row-gap: var(--slotted-field-row-gap, var(--slotted-space-3, .375rem));--_column-gap: var(--slotted-field-column-gap, var(--slotted-space-5, .75rem));align-content:start;container-name:slotted-field;container-type:inline-size;display:grid;font-family:var(--slotted-field-font-family, var(--slotted-control-font-family, sans-serif));grid-template-columns:minmax(0,var(--slotted-field-label-inline-size, 12rem)) minmax(0,1fr) auto;min-inline-size:0;row-gap:var(--_row-gap)}[data-ui=field][data-part=root]>*{grid-column:1 / -1}[data-ui=field]>[data-part=control]{min-inline-size:0}[data-ui=field][data-part=root][data-size=sm]{--_help-glyph: max( var(--slotted-field-icon-size-min, 14px), var(--slotted-control-icon-size-sm, 14px) );--_help-inner-size: var(--slotted-control-inner-size-sm, 22px);--_font-size: var(--slotted-control-font-size-sm, 12px);--_control-block-size: var(--slotted-control-height-sm, 30px)}[data-ui=field][data-part=root][data-size=md]{--_help-glyph: max( var(--slotted-field-icon-size-min, 14px), var(--slotted-control-icon-size-sm, 14px) );--_help-inner-size: var(--slotted-control-inner-size-sm, 22px);--_font-size: var(--slotted-control-font-size-md, 13px);--_control-block-size: var(--slotted-control-height-md, 34px)}[data-ui=field][data-part=root][data-size=lg]{--_help-glyph: max( var(--slotted-field-icon-size-min, 14px), var(--slotted-control-icon-size-md, 16px) );--_help-inner-size: var(--slotted-control-inner-size-md, 24px);--_font-size: var(--slotted-control-font-size-lg, 14px);--_control-block-size: var(--slotted-control-height-lg, 38px)}[data-ui=field]>[data-part=label],[data-ui=field]>[data-part=header]>[data-part=label]{color:var(--slotted-field-label-color, var(--slotted-text));font-size:var(--_font-size);font-weight:var(--slotted-field-label-font-weight, var(--slotted-font-weight-medium, 500));line-height:var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45));min-inline-size:0;overflow-wrap:anywhere;transition:color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=field]>[data-part=label],[data-ui=field]>[data-part=header]{grid-column:1 / -1;grid-row:1}[data-ui=field][data-part=root]:has(>[data-part=counter])>[data-part=label]{grid-column:1 / 3}[data-ui=field]>[data-part=label]>[data-part=mark],[data-ui=field]>[data-part=header]>[data-part=label]>[data-part=mark]{color:var(--slotted-field-mark-color, var(--slotted-tone-danger-text));margin-inline-start:var(--slotted-field-mark-gap, var(--slotted-space-2, .25rem));overflow-wrap:normal;unicode-bidi:isolate}[data-ui=field]:is([data-necessity=optional],[data-necessity=words])>[data-part=label]>[data-part=mark],[data-ui=field]:is([data-necessity=optional],[data-necessity=words])>[data-part=header]>[data-part=label]>[data-part=mark]{color:var(--slotted-field-mark-text-color, var(--slotted-text-muted));font-size:var(--slotted-control-font-size-sm, 12px);font-weight:var(--slotted-font-weight-regular, 400)}[data-ui=field]>[data-part=header]{align-items:baseline;column-gap:var(--slotted-field-header-gap, var(--slotted-space-3, .375rem));display:flex;flex-wrap:wrap;font-size:var(--_font-size);line-height:var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45));min-inline-size:0}[data-ui=field]>[data-part=header]>[data-part=label]{flex:0 1 auto}[data-ui=field]>[data-part=header]>[data-part=action],[data-ui=field]>[data-part=header]>[data-part=counter]{margin-inline-start:auto}[data-ui=field]>[data-part=header]>[data-part=action]~[data-part=counter]{margin-inline-start:var(--slotted-space-3, .375rem)}[data-ui=field]>[data-part=header]>[data-part=help]{--_box: max( min(calc(var(--_help-glyph) + 2 * var(--slotted-space-2, .25rem)), var(--_help-inner-size)), 1lh );--slotted-icon-size: var(--_help-glyph);appearance:none;background-color:transparent;block-size:var(--_box);border:0;border-radius:var(--slotted-field-help-radius, var(--slotted-control-radius, 4px));color:var(--slotted-field-help-color, var(--slotted-text-muted));cursor:pointer;display:inline-block;flex:none;font:inherit;inline-size:var(--_box);margin-block:calc((var(--_font-size) * var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45)) - var(--_box)) / 2);margin-inline-start:calc(var(--slotted-space-1, .125rem) - var(--slotted-field-header-gap, var(--slotted-space-3, .375rem)));padding:0;position:relative;text-align:center;transition:background-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=field]>[data-part=header]>[data-part=help]:before{content:\"\";inset:min(0px,calc((100% - var(--slotted-target-min, 24px)) / 2));position:absolute}[data-ui=field]>[data-part=header]>[data-part=help]>[data-ui=icon]{vertical-align:calc(((1cap + 1ex) / 2 - var(--_help-glyph)) / 2)}[data-ui=field]>[data-part=header]>[data-part=help]:enabled:hover,[data-ui=field]>[data-part=header]>[data-part=help][data-open]{background-color:var( --slotted-field-help-surface-hover, var(--slotted-tone-secondary-subtle-hover, ButtonFace) )}[data-ui=field]>[data-part=header]>[data-part=help]:enabled:active{background-color:var( --slotted-field-help-surface-active, var(--slotted-tone-secondary-subtle-active, ButtonFace) )}[data-ui=field]>[data-part=header]>[data-part=help]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px)}[data-ui=field]>[data-part=header]>[data-part=indicator]{align-items:center;align-self:center;column-gap:var(--slotted-space-2, .25rem);display:inline-flex;flex-wrap:wrap}[data-ui=field]>[data-part=header]>[data-part=action]{--_rest: var(--slotted-field-action-color, var(--slotted-tone-accent-text, LinkText));align-items:center;appearance:none;background:none;block-size:var(--slotted-target-min, 24px);border:0;border-radius:var(--slotted-field-action-radius, var(--slotted-control-radius, 4px));color:var(--_rest);cursor:pointer;display:inline-flex;flex:none;font-family:inherit;font-size:var(--slotted-control-font-size-sm, 12px);font-weight:var(--slotted-font-weight-regular, 400);line-height:var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45));margin-block:calc((1lh - var(--slotted-target-min, 24px)) / 2);padding:0;text-decoration-color:transparent;text-decoration-line:underline;text-decoration-thickness:from-font;text-underline-offset:.15em;transition:color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing),text-decoration-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);unicode-bidi:plaintext}[data-ui=field]>[data-part=header]>[data-part=action]:not(:disabled,[aria-disabled=true]):hover{color:var( --slotted-field-action-color-hover, color-mix(in oklab, var(--_rest) 65%, var(--slotted-text, CanvasText)) );text-decoration-color:currentColor}[data-ui=field]>[data-part=header]>[data-part=action]:not(:disabled,[aria-disabled=true]):active{color:var( --slotted-field-action-color-active, color-mix(in oklab, var(--_rest) 35%, var(--slotted-text, CanvasText)) );text-decoration-color:currentColor}[data-ui=field]>[data-part=header]>[data-part=action]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px);text-decoration-color:currentColor}[data-ui=field]>[data-part=header]>[data-part=action]:is(:disabled,[aria-disabled=true]){color:var(--slotted-disabled-foreground, GrayText);cursor:not-allowed}@media(pointer:coarse){[data-ui=field]>[data-part=header]>[data-part=action]{position:relative}[data-ui=field]>[data-part=header]>[data-part=help]:before,[data-ui=field]>[data-part=header]>[data-part=action]:before{content:\"\";inset:min(0px,calc((100% - var(--slotted-target-comfortable, 44px)) / 2));position:absolute}}[data-ui=field]>[data-part=counter],[data-ui=field]>[data-part=header]>[data-part=counter]{color:var(--slotted-field-counter-color, var(--slotted-text-muted));font-size:var(--slotted-control-font-size-sm, 12px);font-variant-numeric:tabular-nums;line-height:var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45));transition:color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=field]>[data-part=counter]{align-self:end;grid-column:3;grid-row:1;justify-self:end;padding-inline-start:var(--_column-gap)}[data-ui=field]>[data-part=counter][data-invalid],[data-ui=field]>[data-part=header]>[data-part=counter][data-invalid]{color:var(--slotted-field-counter-invalid-color, var(--slotted-tone-danger-text));font-weight:var(--slotted-font-weight-medium, 500)}[data-ui=field]>[data-ui=inline-message]:not([data-reserve]):has([data-part=text]:empty){display:none}[data-ui=field][data-part=root]>[data-ui=inline-message]{font-size:var(--slotted-font-size-xs, .75rem)}[data-ui=field][data-part=root]>[data-ui=inline-message][data-tone=danger],[data-ui=field][data-part=root]>[data-ui=inline-message][data-tone=success]{font-weight:var(--slotted-font-weight-medium, 500)}@container slotted-field (min-width: 320px){[data-ui=field][data-part=root][data-label-placement=side]>*{align-self:start;grid-column:2 / 3}[data-ui=field][data-part=root][data-label-placement=side]>[data-part=label],[data-ui=field][data-part=root][data-label-placement=side]>[data-part=header]{grid-column:1;grid-row:1;padding-block-start:max(0px,calc((var(--_control-block-size) - 1lh) / 2));padding-inline-end:var(--_column-gap)}[data-ui=field][data-part=root][data-label-placement=side]>[data-part=counter]{grid-column:1;grid-row:2;justify-self:end;padding-inline:0 var(--_column-gap)}[data-ui=field][data-part=root][data-label-placement=side]>[data-part=header]>[data-part=counter]{flex-basis:100%;margin-inline-start:0;text-align:end}}[data-ui=field][data-part=root][data-disabled]>[data-part=label],[data-ui=field][data-part=root][data-disabled]>[data-part=counter],[data-ui=field][data-part=root][data-disabled]>[data-part=header]>[data-part=label],[data-ui=field][data-part=root][data-disabled]>[data-part=header]>[data-part=counter]{color:var(--slotted-disabled-foreground)}[data-ui=field][data-part=root][data-disabled]>[data-part=label]>[data-part=mark],[data-ui=field][data-part=root][data-disabled]>[data-part=header]>[data-part=label]>[data-part=mark]{color:var(--slotted-disabled-foreground)}[data-ui=field][data-part=root][data-disabled]>[data-part=counter][data-invalid],[data-ui=field][data-part=root][data-disabled]>[data-part=header]>[data-part=counter][data-invalid]{color:var(--slotted-disabled-foreground);font-weight:var(--slotted-font-weight-regular, 400)}}\n"], dependencies: [{ kind: "component", type: SlInlineMessage, selector: "[slInlineMessage]", inputs: ["tone", "size", "live", "mark", "prefix", "hideIcon", "loading", "disabled", "reserve", "id"], exportAs: ["slInlineMessage"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
504
|
+
}
|
|
505
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlField, decorators: [{
|
|
506
|
+
type: Component,
|
|
507
|
+
args: [{ selector: '[slField]', standalone: true, exportAs: 'slField', imports: [SlInlineMessage], template: `<ng-content select="[slFieldLabel], [slFieldHeader]" />
|
|
508
|
+
<ng-content select="[slFieldCounter]" />
|
|
509
|
+
@if (drawnCount(); as count) {
|
|
510
|
+
<span
|
|
511
|
+
data-part="counter"
|
|
512
|
+
[id]="ids().counter"
|
|
513
|
+
[attr.data-invalid]="countOver() ? '' : null"
|
|
514
|
+
>{{ formatCount(count) }}</span
|
|
515
|
+
>
|
|
516
|
+
}
|
|
517
|
+
<ng-content />
|
|
518
|
+
@if (description(); as message) {
|
|
519
|
+
<p
|
|
520
|
+
slInlineMessage
|
|
521
|
+
[id]="ids().description"
|
|
522
|
+
[size]="messageSize()"
|
|
523
|
+
[disabled]="resolvedDisabled()"
|
|
524
|
+
[mark]="message.mark() ?? 'none'"
|
|
525
|
+
[tone]="message.tone() ?? 'secondary'"
|
|
526
|
+
[live]="message.live() ?? 'off'"
|
|
527
|
+
[hideIcon]="message.hideIcon() ?? false"
|
|
528
|
+
[reserve]="message.reserve() ?? false"
|
|
529
|
+
[prefix]="message.prefix()"
|
|
530
|
+
>
|
|
531
|
+
<ng-content select="[slFieldDescription]" />
|
|
532
|
+
</p>
|
|
533
|
+
}
|
|
534
|
+
@if (error(); as message) {
|
|
535
|
+
<p
|
|
536
|
+
slInlineMessage
|
|
537
|
+
[id]="ids().error"
|
|
538
|
+
[size]="messageSize()"
|
|
539
|
+
[disabled]="resolvedDisabled()"
|
|
540
|
+
[mark]="message.mark() ?? 'none'"
|
|
541
|
+
[tone]="message.tone() ?? 'danger'"
|
|
542
|
+
[live]="message.live() ?? 'off'"
|
|
543
|
+
[hideIcon]="message.hideIcon() ?? false"
|
|
544
|
+
[reserve]="message.reserve() ?? false"
|
|
545
|
+
[prefix]="message.prefix()"
|
|
546
|
+
>
|
|
547
|
+
<ng-content select="[slFieldError]" />
|
|
548
|
+
</p>
|
|
549
|
+
}`, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [{ provide: SlFieldContext, useExisting: forwardRef(() => SlField) }], host: {
|
|
550
|
+
'data-ui': 'field',
|
|
551
|
+
'data-part': 'root',
|
|
552
|
+
'[attr.data-size]': 'resolvedSize()',
|
|
553
|
+
'[attr.data-label-placement]': 'resolvedLabelPlacement()',
|
|
554
|
+
'[attr.data-necessity]': 'resolvedNecessity()',
|
|
555
|
+
'[attr.data-disabled]': "resolvedDisabled() === true ? '' : null",
|
|
556
|
+
'[attr.data-invalid]': "invalid() === true ? '' : null",
|
|
557
|
+
'[attr.data-readonly]': "resolvedReadOnly() === true ? '' : null",
|
|
558
|
+
'[attr.data-required]': "required() === true ? '' : null",
|
|
559
|
+
}, styles: ["@layer slotted.components{[data-ui=field][data-part=root]{--_font-size: var(--slotted-control-font-size-md, 13px);--_control-block-size: var(--slotted-control-height-md, 34px);--_row-gap: var(--slotted-field-row-gap, var(--slotted-space-3, .375rem));--_column-gap: var(--slotted-field-column-gap, var(--slotted-space-5, .75rem));align-content:start;container-name:slotted-field;container-type:inline-size;display:grid;font-family:var(--slotted-field-font-family, var(--slotted-control-font-family, sans-serif));grid-template-columns:minmax(0,var(--slotted-field-label-inline-size, 12rem)) minmax(0,1fr) auto;min-inline-size:0;row-gap:var(--_row-gap)}[data-ui=field][data-part=root]>*{grid-column:1 / -1}[data-ui=field]>[data-part=control]{min-inline-size:0}[data-ui=field][data-part=root][data-size=sm]{--_help-glyph: max( var(--slotted-field-icon-size-min, 14px), var(--slotted-control-icon-size-sm, 14px) );--_help-inner-size: var(--slotted-control-inner-size-sm, 22px);--_font-size: var(--slotted-control-font-size-sm, 12px);--_control-block-size: var(--slotted-control-height-sm, 30px)}[data-ui=field][data-part=root][data-size=md]{--_help-glyph: max( var(--slotted-field-icon-size-min, 14px), var(--slotted-control-icon-size-sm, 14px) );--_help-inner-size: var(--slotted-control-inner-size-sm, 22px);--_font-size: var(--slotted-control-font-size-md, 13px);--_control-block-size: var(--slotted-control-height-md, 34px)}[data-ui=field][data-part=root][data-size=lg]{--_help-glyph: max( var(--slotted-field-icon-size-min, 14px), var(--slotted-control-icon-size-md, 16px) );--_help-inner-size: var(--slotted-control-inner-size-md, 24px);--_font-size: var(--slotted-control-font-size-lg, 14px);--_control-block-size: var(--slotted-control-height-lg, 38px)}[data-ui=field]>[data-part=label],[data-ui=field]>[data-part=header]>[data-part=label]{color:var(--slotted-field-label-color, var(--slotted-text));font-size:var(--_font-size);font-weight:var(--slotted-field-label-font-weight, var(--slotted-font-weight-medium, 500));line-height:var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45));min-inline-size:0;overflow-wrap:anywhere;transition:color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=field]>[data-part=label],[data-ui=field]>[data-part=header]{grid-column:1 / -1;grid-row:1}[data-ui=field][data-part=root]:has(>[data-part=counter])>[data-part=label]{grid-column:1 / 3}[data-ui=field]>[data-part=label]>[data-part=mark],[data-ui=field]>[data-part=header]>[data-part=label]>[data-part=mark]{color:var(--slotted-field-mark-color, var(--slotted-tone-danger-text));margin-inline-start:var(--slotted-field-mark-gap, var(--slotted-space-2, .25rem));overflow-wrap:normal;unicode-bidi:isolate}[data-ui=field]:is([data-necessity=optional],[data-necessity=words])>[data-part=label]>[data-part=mark],[data-ui=field]:is([data-necessity=optional],[data-necessity=words])>[data-part=header]>[data-part=label]>[data-part=mark]{color:var(--slotted-field-mark-text-color, var(--slotted-text-muted));font-size:var(--slotted-control-font-size-sm, 12px);font-weight:var(--slotted-font-weight-regular, 400)}[data-ui=field]>[data-part=header]{align-items:baseline;column-gap:var(--slotted-field-header-gap, var(--slotted-space-3, .375rem));display:flex;flex-wrap:wrap;font-size:var(--_font-size);line-height:var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45));min-inline-size:0}[data-ui=field]>[data-part=header]>[data-part=label]{flex:0 1 auto}[data-ui=field]>[data-part=header]>[data-part=action],[data-ui=field]>[data-part=header]>[data-part=counter]{margin-inline-start:auto}[data-ui=field]>[data-part=header]>[data-part=action]~[data-part=counter]{margin-inline-start:var(--slotted-space-3, .375rem)}[data-ui=field]>[data-part=header]>[data-part=help]{--_box: max( min(calc(var(--_help-glyph) + 2 * var(--slotted-space-2, .25rem)), var(--_help-inner-size)), 1lh );--slotted-icon-size: var(--_help-glyph);appearance:none;background-color:transparent;block-size:var(--_box);border:0;border-radius:var(--slotted-field-help-radius, var(--slotted-control-radius, 4px));color:var(--slotted-field-help-color, var(--slotted-text-muted));cursor:pointer;display:inline-block;flex:none;font:inherit;inline-size:var(--_box);margin-block:calc((var(--_font-size) * var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45)) - var(--_box)) / 2);margin-inline-start:calc(var(--slotted-space-1, .125rem) - var(--slotted-field-header-gap, var(--slotted-space-3, .375rem)));padding:0;position:relative;text-align:center;transition:background-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=field]>[data-part=header]>[data-part=help]:before{content:\"\";inset:min(0px,calc((100% - var(--slotted-target-min, 24px)) / 2));position:absolute}[data-ui=field]>[data-part=header]>[data-part=help]>[data-ui=icon]{vertical-align:calc(((1cap + 1ex) / 2 - var(--_help-glyph)) / 2)}[data-ui=field]>[data-part=header]>[data-part=help]:enabled:hover,[data-ui=field]>[data-part=header]>[data-part=help][data-open]{background-color:var( --slotted-field-help-surface-hover, var(--slotted-tone-secondary-subtle-hover, ButtonFace) )}[data-ui=field]>[data-part=header]>[data-part=help]:enabled:active{background-color:var( --slotted-field-help-surface-active, var(--slotted-tone-secondary-subtle-active, ButtonFace) )}[data-ui=field]>[data-part=header]>[data-part=help]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px)}[data-ui=field]>[data-part=header]>[data-part=indicator]{align-items:center;align-self:center;column-gap:var(--slotted-space-2, .25rem);display:inline-flex;flex-wrap:wrap}[data-ui=field]>[data-part=header]>[data-part=action]{--_rest: var(--slotted-field-action-color, var(--slotted-tone-accent-text, LinkText));align-items:center;appearance:none;background:none;block-size:var(--slotted-target-min, 24px);border:0;border-radius:var(--slotted-field-action-radius, var(--slotted-control-radius, 4px));color:var(--_rest);cursor:pointer;display:inline-flex;flex:none;font-family:inherit;font-size:var(--slotted-control-font-size-sm, 12px);font-weight:var(--slotted-font-weight-regular, 400);line-height:var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45));margin-block:calc((1lh - var(--slotted-target-min, 24px)) / 2);padding:0;text-decoration-color:transparent;text-decoration-line:underline;text-decoration-thickness:from-font;text-underline-offset:.15em;transition:color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing),text-decoration-color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);unicode-bidi:plaintext}[data-ui=field]>[data-part=header]>[data-part=action]:not(:disabled,[aria-disabled=true]):hover{color:var( --slotted-field-action-color-hover, color-mix(in oklab, var(--_rest) 65%, var(--slotted-text, CanvasText)) );text-decoration-color:currentColor}[data-ui=field]>[data-part=header]>[data-part=action]:not(:disabled,[aria-disabled=true]):active{color:var( --slotted-field-action-color-active, color-mix(in oklab, var(--_rest) 35%, var(--slotted-text, CanvasText)) );text-decoration-color:currentColor}[data-ui=field]>[data-part=header]>[data-part=action]:focus-visible{outline:var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);outline-offset:var(--slotted-focus-ring-offset, 2px);text-decoration-color:currentColor}[data-ui=field]>[data-part=header]>[data-part=action]:is(:disabled,[aria-disabled=true]){color:var(--slotted-disabled-foreground, GrayText);cursor:not-allowed}@media(pointer:coarse){[data-ui=field]>[data-part=header]>[data-part=action]{position:relative}[data-ui=field]>[data-part=header]>[data-part=help]:before,[data-ui=field]>[data-part=header]>[data-part=action]:before{content:\"\";inset:min(0px,calc((100% - var(--slotted-target-comfortable, 44px)) / 2));position:absolute}}[data-ui=field]>[data-part=counter],[data-ui=field]>[data-part=header]>[data-part=counter]{color:var(--slotted-field-counter-color, var(--slotted-text-muted));font-size:var(--slotted-control-font-size-sm, 12px);font-variant-numeric:tabular-nums;line-height:var(--slotted-field-line-height, var(--slotted-line-height-sm, 1.45));transition:color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing)}[data-ui=field]>[data-part=counter]{align-self:end;grid-column:3;grid-row:1;justify-self:end;padding-inline-start:var(--_column-gap)}[data-ui=field]>[data-part=counter][data-invalid],[data-ui=field]>[data-part=header]>[data-part=counter][data-invalid]{color:var(--slotted-field-counter-invalid-color, var(--slotted-tone-danger-text));font-weight:var(--slotted-font-weight-medium, 500)}[data-ui=field]>[data-ui=inline-message]:not([data-reserve]):has([data-part=text]:empty){display:none}[data-ui=field][data-part=root]>[data-ui=inline-message]{font-size:var(--slotted-font-size-xs, .75rem)}[data-ui=field][data-part=root]>[data-ui=inline-message][data-tone=danger],[data-ui=field][data-part=root]>[data-ui=inline-message][data-tone=success]{font-weight:var(--slotted-font-weight-medium, 500)}@container slotted-field (min-width: 320px){[data-ui=field][data-part=root][data-label-placement=side]>*{align-self:start;grid-column:2 / 3}[data-ui=field][data-part=root][data-label-placement=side]>[data-part=label],[data-ui=field][data-part=root][data-label-placement=side]>[data-part=header]{grid-column:1;grid-row:1;padding-block-start:max(0px,calc((var(--_control-block-size) - 1lh) / 2));padding-inline-end:var(--_column-gap)}[data-ui=field][data-part=root][data-label-placement=side]>[data-part=counter]{grid-column:1;grid-row:2;justify-self:end;padding-inline:0 var(--_column-gap)}[data-ui=field][data-part=root][data-label-placement=side]>[data-part=header]>[data-part=counter]{flex-basis:100%;margin-inline-start:0;text-align:end}}[data-ui=field][data-part=root][data-disabled]>[data-part=label],[data-ui=field][data-part=root][data-disabled]>[data-part=counter],[data-ui=field][data-part=root][data-disabled]>[data-part=header]>[data-part=label],[data-ui=field][data-part=root][data-disabled]>[data-part=header]>[data-part=counter]{color:var(--slotted-disabled-foreground)}[data-ui=field][data-part=root][data-disabled]>[data-part=label]>[data-part=mark],[data-ui=field][data-part=root][data-disabled]>[data-part=header]>[data-part=label]>[data-part=mark]{color:var(--slotted-disabled-foreground)}[data-ui=field][data-part=root][data-disabled]>[data-part=counter][data-invalid],[data-ui=field][data-part=root][data-disabled]>[data-part=header]>[data-part=counter][data-invalid]{color:var(--slotted-disabled-foreground);font-weight:var(--slotted-font-weight-regular, 400)}}\n"] }]
|
|
560
|
+
}], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], labelPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPlacement", required: false }] }], necessity: [{ type: i0.Input, args: [{ isSignal: true, alias: "necessity", required: false }] }], messages: [{ type: i0.Input, args: [{ isSignal: true, alias: "messages", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], readOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readOnly", required: false }] }], writtenCounter: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SlFieldCounter), { ...{ descendants: true }, isSignal: true }] }], header: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SlFieldHeaderSlot), { isSignal: true }] }], help: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SlFieldHelpSlot), { ...{ descendants: true }, isSignal: true }] }], indicator: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SlFieldIndicatorSlot), { ...{ descendants: true }, isSignal: true }] }], description: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SlFieldDescription), { ...{ descendants: false }, isSignal: true }] }], error: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SlFieldError), { ...{ descendants: false }, isSignal: true }] }] } });
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Names the control, and says whether it has to be answered.
|
|
564
|
+
*
|
|
565
|
+
* The association is explicit — `for` pointing at the control's identifier —
|
|
566
|
+
* because the APG's naming practice records that some combinations of assistive
|
|
567
|
+
* technology and browser fail to treat the implicit form, wrapping the control
|
|
568
|
+
* in the label, as having an accessible name at all.
|
|
569
|
+
*
|
|
570
|
+
* The necessity marker is drawn here rather than written by the page. The glyph
|
|
571
|
+
* is `aria-hidden`, because `aria-required` on the control already carries the
|
|
572
|
+
* semantics and a reader working a form of twenty required fields does not need
|
|
573
|
+
* to hear "asterisk" twenty times; the two word forms are not hidden, because
|
|
574
|
+
* `(optional)` is information rather than decoration.
|
|
575
|
+
*/
|
|
576
|
+
class SlFieldLabel {
|
|
577
|
+
field = inject(SlField);
|
|
578
|
+
writtenFor = inject(new HostAttributeToken('for'), { optional: true });
|
|
579
|
+
writtenId = inject(new HostAttributeToken('id'), { optional: true });
|
|
580
|
+
labelFor = computed(() => this.writtenFor ?? this.field.ids().control, /* @ts-ignore */
|
|
581
|
+
...(ngDevMode ? [{ debugName: "labelFor" }] : /* istanbul ignore next */ []));
|
|
582
|
+
labelId = computed(() => this.writtenId ?? this.field.ids().label, /* @ts-ignore */
|
|
583
|
+
...(ngDevMode ? [{ debugName: "labelId" }] : /* istanbul ignore next */ []));
|
|
584
|
+
necessity = computed(() => necessityMark(this.field.resolvedNecessity(), this.field.required() === true, this.field.t), /* @ts-ignore */
|
|
585
|
+
...(ngDevMode ? [{ debugName: "necessity" }] : /* istanbul ignore next */ []));
|
|
586
|
+
markHidden = computed(() => this.necessity()?.hidden === true, /* @ts-ignore */
|
|
587
|
+
...(ngDevMode ? [{ debugName: "markHidden" }] : /* istanbul ignore next */ []));
|
|
588
|
+
mark = computed(() => this.necessity()?.text ?? null, /* @ts-ignore */
|
|
589
|
+
...(ngDevMode ? [{ debugName: "mark" }] : /* istanbul ignore next */ []));
|
|
590
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldLabel, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
591
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlFieldLabel, isStandalone: true, selector: "label[slFieldLabel]", host: { attributes: { "data-part": "label" }, properties: { "attr.for": "labelFor()", "attr.id": "labelId()" } }, exportAs: ["slFieldLabel"], ngImport: i0, template: `<ng-content />
|
|
592
|
+
@if (mark(); as text) {
|
|
593
|
+
<span data-part="mark" [attr.aria-hidden]="markHidden() ? 'true' : null">{{ text }}</span>
|
|
594
|
+
}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
595
|
+
}
|
|
596
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldLabel, decorators: [{
|
|
597
|
+
type: Component,
|
|
598
|
+
args: [{
|
|
599
|
+
selector: 'label[slFieldLabel]',
|
|
600
|
+
standalone: true,
|
|
601
|
+
exportAs: 'slFieldLabel',
|
|
602
|
+
template: `<ng-content />
|
|
603
|
+
@if (mark(); as text) {
|
|
604
|
+
<span data-part="mark" [attr.aria-hidden]="markHidden() ? 'true' : null">{{ text }}</span>
|
|
605
|
+
}`,
|
|
606
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
607
|
+
encapsulation: ViewEncapsulation.None,
|
|
608
|
+
host: {
|
|
609
|
+
'data-part': 'label',
|
|
610
|
+
'[attr.for]': 'labelFor()',
|
|
611
|
+
'[attr.id]': 'labelId()',
|
|
612
|
+
},
|
|
613
|
+
}]
|
|
614
|
+
}] });
|
|
615
|
+
/**
|
|
616
|
+
* Applies the field's wiring to a control the library does not own.
|
|
617
|
+
*
|
|
618
|
+
* Controls this library ships read the field themselves and need no directive,
|
|
619
|
+
* which is what
|
|
620
|
+
* `docs/history/designs/2026-08-31-field-aware-controls-design.md` decides.
|
|
621
|
+
* This exists for the two cases that cannot: a plain native element, and a
|
|
622
|
+
* component written before this library.
|
|
623
|
+
*
|
|
624
|
+
* Every value the consumer wrote wins. A host binding beats a static attribute
|
|
625
|
+
* in Angular, so each written value is read before the binding is computed
|
|
626
|
+
* rather than after — the asymmetry with React, where a consumer's prop simply
|
|
627
|
+
* spreads over the family's.
|
|
628
|
+
*/
|
|
629
|
+
class SlFieldControl {
|
|
630
|
+
field = inject(SlField);
|
|
631
|
+
writtenId = inject(new HostAttributeToken('id'), { optional: true });
|
|
632
|
+
writtenDescribedBy = inject(new HostAttributeToken('aria-describedby'), {
|
|
633
|
+
optional: true,
|
|
634
|
+
});
|
|
635
|
+
writtenInvalid = inject(new HostAttributeToken('aria-invalid'), {
|
|
636
|
+
optional: true,
|
|
637
|
+
});
|
|
638
|
+
writtenRequired = inject(new HostAttributeToken('aria-required'), {
|
|
639
|
+
optional: true,
|
|
640
|
+
});
|
|
641
|
+
writtenDisabled = inject(new HostAttributeToken('disabled'), { optional: true });
|
|
642
|
+
writtenReadonly = inject(new HostAttributeToken('readonly'), { optional: true });
|
|
643
|
+
controlId = computed(() => this.writtenId ?? this.field.ids().control, /* @ts-ignore */
|
|
644
|
+
...(ngDevMode ? [{ debugName: "controlId" }] : /* istanbul ignore next */ []));
|
|
645
|
+
/** Merged after the consumer's own, so a tour step is read before the help. */
|
|
646
|
+
describedBy = computed(() => {
|
|
647
|
+
const merged = [this.writtenDescribedBy, this.field.describedBy()].filter(Boolean);
|
|
648
|
+
return merged.length === 0 ? null : merged.join(' ');
|
|
649
|
+
}, /* @ts-ignore */
|
|
650
|
+
...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
|
|
651
|
+
ariaInvalid = computed(() => this.writtenInvalid ?? (this.field.invalid() === true ? 'true' : null), /* @ts-ignore */
|
|
652
|
+
...(ngDevMode ? [{ debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
|
|
653
|
+
ariaRequired = computed(() => this.writtenRequired ?? (this.field.required() === true ? 'true' : null), /* @ts-ignore */
|
|
654
|
+
...(ngDevMode ? [{ debugName: "ariaRequired" }] : /* istanbul ignore next */ []));
|
|
655
|
+
disabledAttribute = computed(() => this.writtenDisabled ?? (this.field.resolvedDisabled() === true ? '' : null), /* @ts-ignore */
|
|
656
|
+
...(ngDevMode ? [{ debugName: "disabledAttribute" }] : /* istanbul ignore next */ []));
|
|
657
|
+
readonlyAttribute = computed(() => this.writtenReadonly ?? (this.field.resolvedReadOnly() === true ? '' : null), /* @ts-ignore */
|
|
658
|
+
...(ngDevMode ? [{ debugName: "readonlyAttribute" }] : /* istanbul ignore next */ []));
|
|
659
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldControl, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
660
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlFieldControl, isStandalone: true, selector: "[slFieldControl]", host: { attributes: { "data-part": "control" }, properties: { "attr.id": "controlId()", "attr.aria-describedby": "describedBy()", "attr.aria-invalid": "ariaInvalid()", "attr.aria-required": "ariaRequired()", "attr.disabled": "disabledAttribute()", "attr.readonly": "readonlyAttribute()" } }, exportAs: ["slFieldControl"], ngImport: i0 });
|
|
661
|
+
}
|
|
662
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldControl, decorators: [{
|
|
663
|
+
type: Directive,
|
|
664
|
+
args: [{
|
|
665
|
+
selector: '[slFieldControl]',
|
|
666
|
+
standalone: true,
|
|
667
|
+
exportAs: 'slFieldControl',
|
|
668
|
+
host: {
|
|
669
|
+
'data-part': 'control',
|
|
670
|
+
'[attr.id]': 'controlId()',
|
|
671
|
+
'[attr.aria-describedby]': 'describedBy()',
|
|
672
|
+
'[attr.aria-invalid]': 'ariaInvalid()',
|
|
673
|
+
'[attr.aria-required]': 'ariaRequired()',
|
|
674
|
+
'[attr.disabled]': 'disabledAttribute()',
|
|
675
|
+
'[attr.readonly]': 'readonlyAttribute()',
|
|
676
|
+
},
|
|
677
|
+
}]
|
|
678
|
+
}] });
|
|
679
|
+
/**
|
|
680
|
+
* A link or a button at the end of the label row — `Forgot password?`,
|
|
681
|
+
* `Generate` — written on the consumer's own `a` or `button`. On a `button` the
|
|
682
|
+
* directive writes `type="button"` unless the page wrote a type, so it never
|
|
683
|
+
* submits the form it sits in; on a link it writes nothing. The field does not
|
|
684
|
+
* disable it with the control: what it does is the page's.
|
|
685
|
+
*/
|
|
686
|
+
class SlFieldAction {
|
|
687
|
+
writtenType = inject(new HostAttributeToken('type'), { optional: true });
|
|
688
|
+
type = this.writtenType ??
|
|
689
|
+
(inject(ElementRef).nativeElement.tagName === 'BUTTON'
|
|
690
|
+
? 'button'
|
|
691
|
+
: null);
|
|
692
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
693
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlFieldAction, isStandalone: true, selector: "[slFieldAction]", host: { attributes: { "data-part": "action" }, properties: { "attr.type": "type" } }, exportAs: ["slFieldAction"], ngImport: i0 });
|
|
694
|
+
}
|
|
695
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldAction, decorators: [{
|
|
696
|
+
type: Directive,
|
|
697
|
+
args: [{
|
|
698
|
+
selector: '[slFieldAction]',
|
|
699
|
+
standalone: true,
|
|
700
|
+
exportAs: 'slFieldAction',
|
|
701
|
+
host: {
|
|
702
|
+
'data-part': 'action',
|
|
703
|
+
'[attr.type]': 'type',
|
|
704
|
+
},
|
|
705
|
+
}]
|
|
706
|
+
}] });
|
|
707
|
+
|
|
708
|
+
/**
|
|
709
|
+
* The label row, when the label has company: the help, an indicator, an action
|
|
710
|
+
* and the counter beside it. ReUI writes the same row by hand in four of its
|
|
711
|
+
* examples; here it is a part, so its alignment, its gap and its place in a
|
|
712
|
+
* side layout are the family's.
|
|
713
|
+
*
|
|
714
|
+
* It draws the count the control published at its own end when the page wrote
|
|
715
|
+
* no counter, which is where a field without a header puts it too.
|
|
716
|
+
*/
|
|
717
|
+
class SlFieldHeader {
|
|
718
|
+
field = inject(SlField);
|
|
719
|
+
drawnCount = computed(() => this.field.writtenCounter() === undefined ? this.field.count() : undefined, /* @ts-ignore */
|
|
720
|
+
...(ngDevMode ? [{ debugName: "drawnCount" }] : /* istanbul ignore next */ []));
|
|
721
|
+
countOver = computed(() => {
|
|
722
|
+
const count = this.drawnCount();
|
|
723
|
+
return count !== undefined && isFieldCountOver(count);
|
|
724
|
+
}, /* @ts-ignore */
|
|
725
|
+
...(ngDevMode ? [{ debugName: "countOver" }] : /* istanbul ignore next */ []));
|
|
726
|
+
formatCount = formatFieldCount;
|
|
727
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
728
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlFieldHeader, isStandalone: true, selector: "[slFieldHeader]", host: { attributes: { "data-part": "header" } }, providers: [{ provide: SlFieldHeaderSlot, useExisting: forwardRef(() => SlFieldHeader) }], exportAs: ["slFieldHeader"], ngImport: i0, template: `<ng-content />
|
|
729
|
+
@if (drawnCount(); as count) {
|
|
730
|
+
<span
|
|
731
|
+
data-part="counter"
|
|
732
|
+
[id]="field.ids().counter"
|
|
733
|
+
[attr.data-invalid]="countOver() ? '' : null"
|
|
734
|
+
>{{ formatCount(count) }}</span
|
|
735
|
+
>
|
|
736
|
+
}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
737
|
+
}
|
|
738
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldHeader, decorators: [{
|
|
739
|
+
type: Component,
|
|
740
|
+
args: [{
|
|
741
|
+
selector: '[slFieldHeader]',
|
|
742
|
+
standalone: true,
|
|
743
|
+
exportAs: 'slFieldHeader',
|
|
744
|
+
template: `<ng-content />
|
|
745
|
+
@if (drawnCount(); as count) {
|
|
746
|
+
<span
|
|
747
|
+
data-part="counter"
|
|
748
|
+
[id]="field.ids().counter"
|
|
749
|
+
[attr.data-invalid]="countOver() ? '' : null"
|
|
750
|
+
>{{ formatCount(count) }}</span
|
|
751
|
+
>
|
|
752
|
+
}`,
|
|
753
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
754
|
+
encapsulation: ViewEncapsulation.None,
|
|
755
|
+
providers: [{ provide: SlFieldHeaderSlot, useExisting: forwardRef(() => SlFieldHeader) }],
|
|
756
|
+
host: { 'data-part': 'header' },
|
|
757
|
+
}]
|
|
758
|
+
}] });
|
|
759
|
+
/**
|
|
760
|
+
* What qualifies the field — `Beta`, `Pro`, `New` — as one or more `slBadge`s
|
|
761
|
+
* after the label. It stands outside the `label`, so the necessity mark stays
|
|
762
|
+
* against the label's last word, and it joins the control's description, so a
|
|
763
|
+
* reader on the control hears it.
|
|
764
|
+
*/
|
|
765
|
+
class SlFieldIndicator {
|
|
766
|
+
field = inject(SlField);
|
|
767
|
+
writtenId = inject(new HostAttributeToken('id'), { optional: true });
|
|
768
|
+
indicatorId = computed(() => this.writtenId ?? this.field.ids().indicator, /* @ts-ignore */
|
|
769
|
+
...(ngDevMode ? [{ debugName: "indicatorId" }] : /* istanbul ignore next */ []));
|
|
770
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
771
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlFieldIndicator, isStandalone: true, selector: "[slFieldIndicator]", host: { attributes: { "data-part": "indicator" }, properties: { "attr.id": "indicatorId()" } }, providers: [{ provide: SlFieldIndicatorSlot, useExisting: forwardRef(() => SlFieldIndicator) }], exportAs: ["slFieldIndicator"], ngImport: i0 });
|
|
772
|
+
}
|
|
773
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldIndicator, decorators: [{
|
|
774
|
+
type: Directive,
|
|
775
|
+
args: [{
|
|
776
|
+
selector: '[slFieldIndicator]',
|
|
777
|
+
standalone: true,
|
|
778
|
+
exportAs: 'slFieldIndicator',
|
|
779
|
+
providers: [{ provide: SlFieldIndicatorSlot, useExisting: forwardRef(() => SlFieldIndicator) }],
|
|
780
|
+
host: {
|
|
781
|
+
'data-part': 'indicator',
|
|
782
|
+
'[attr.id]': 'indicatorId()',
|
|
783
|
+
},
|
|
784
|
+
}]
|
|
785
|
+
}] });
|
|
786
|
+
/**
|
|
787
|
+
* The help beside the label: the button itself, drawing `circle-question`, with
|
|
788
|
+
* the hint in a tooltip. The hint is the directive's value —
|
|
789
|
+
* `<button slFieldHelp="Dias corridos."></button>` — because it is written once
|
|
790
|
+
* and read in two places: the tooltip's layer, and a hidden node inside the
|
|
791
|
+
* button that describes the button and the control while the layer is closed. A
|
|
792
|
+
* directly referenced hidden element still enters the description (accname 1.2,
|
|
793
|
+
* step 2A), and the tooltip is asked to describe nothing, so the hint is not
|
|
794
|
+
* read twice.
|
|
795
|
+
*
|
|
796
|
+
* **A press is the hint.** A tooltip opens on a coarse pointer only by a long
|
|
797
|
+
* press, because a tap is the trigger's own action; this button has no other
|
|
798
|
+
* action, so the tooltip is composed on the button as host directives and run
|
|
799
|
+
* by hand (`openOn: 'manual'`, provided here): a press pins the hint open and a
|
|
800
|
+
* second press closes it, while hover and keyboard focus open it the way every
|
|
801
|
+
* tooltip opens. It is Carbon's toggletip. `[(open)]` and `(openChangeRequest)`
|
|
802
|
+
* are the tooltip's own, exposed on the button.
|
|
803
|
+
*
|
|
804
|
+
* **It stays operable on a disabled field.** The help is often where the reason
|
|
805
|
+
* the field is off is written.
|
|
806
|
+
*/
|
|
807
|
+
class SlFieldHelp {
|
|
808
|
+
/** The hint. */
|
|
809
|
+
slFieldHelp = input('', /* @ts-ignore */
|
|
810
|
+
...(ngDevMode ? [{ debugName: "slFieldHelp" }] : /* istanbul ignore next */ []));
|
|
811
|
+
field = inject(SlField, { optional: true });
|
|
812
|
+
tooltip = inject(SlTooltip);
|
|
813
|
+
writtenLabel = inject(new HostAttributeToken('aria-label'), { optional: true });
|
|
814
|
+
writtenDescribedBy = inject(new HostAttributeToken('aria-describedby'), {
|
|
815
|
+
optional: true,
|
|
816
|
+
});
|
|
817
|
+
fallbackId = `${inject(SlFieldIdFactory).next()}-help`;
|
|
818
|
+
/** The field family's words, for a help control outside a field. */
|
|
819
|
+
own = injectMessages(fieldMessages);
|
|
820
|
+
textId = computed(() => this.field?.ids().help ?? this.fallbackId, /* @ts-ignore */
|
|
821
|
+
...(ngDevMode ? [{ debugName: "textId" }] : /* istanbul ignore next */ []));
|
|
822
|
+
label = computed(() => this.writtenLabel ?? (this.field?.t ?? this.own)('help'), /* @ts-ignore */
|
|
823
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
824
|
+
describedBy = computed(() => this.writtenDescribedBy ?? this.textId(), /* @ts-ignore */
|
|
825
|
+
...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
|
|
826
|
+
/** Whether a press opened the hint; a hover-opened hint closes when the pointer leaves. */
|
|
827
|
+
pinned = signal(false, /* @ts-ignore */
|
|
828
|
+
...(ngDevMode ? [{ debugName: "pinned" }] : /* istanbul ignore next */ []));
|
|
829
|
+
constructor() {
|
|
830
|
+
/* A hint closed from anywhere — Escape, a press outside, the consumer — is
|
|
831
|
+
no longer pinned by the press that opened it. */
|
|
832
|
+
effect(() => {
|
|
833
|
+
if (!this.tooltip.isOpen())
|
|
834
|
+
this.pinned.set(false);
|
|
835
|
+
});
|
|
836
|
+
}
|
|
837
|
+
enter(event) {
|
|
838
|
+
if (event.pointerType === 'touch' || this.tooltip.isOpen())
|
|
839
|
+
return;
|
|
840
|
+
this.tooltip.openAfterDelay(event);
|
|
841
|
+
}
|
|
842
|
+
leave(event) {
|
|
843
|
+
if (event.pointerType === 'touch' || this.pinned())
|
|
844
|
+
return;
|
|
845
|
+
this.tooltip.closeAfterDelay(event);
|
|
846
|
+
}
|
|
847
|
+
/** `:focus-visible` rather than every focus: a press focuses the button too. */
|
|
848
|
+
focus(event) {
|
|
849
|
+
if (!event.target.matches(':focus-visible'))
|
|
850
|
+
return;
|
|
851
|
+
this.tooltip.toggle(true, 'keyboard', event);
|
|
852
|
+
}
|
|
853
|
+
blur(event) {
|
|
854
|
+
this.pinned.set(false);
|
|
855
|
+
this.tooltip.toggle(false, 'blur', event);
|
|
856
|
+
}
|
|
857
|
+
/**
|
|
858
|
+
* A click synthesised by the keyboard reports no detail; a real one reports
|
|
859
|
+
* the click count, which is how `Enter` and `Space` are told from a press.
|
|
860
|
+
*/
|
|
861
|
+
press(event) {
|
|
862
|
+
const reason = event.detail === 0 ? 'keyboard' : 'pointer';
|
|
863
|
+
if (this.tooltip.isOpen() && this.pinned()) {
|
|
864
|
+
this.pinned.set(false);
|
|
865
|
+
this.tooltip.toggle(false, reason, event);
|
|
866
|
+
return;
|
|
867
|
+
}
|
|
868
|
+
this.pinned.set(true);
|
|
869
|
+
this.tooltip.toggle(true, reason, event);
|
|
870
|
+
}
|
|
871
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldHelp, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
872
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: SlFieldHelp, isStandalone: true, selector: "button[slFieldHelp]", inputs: { slFieldHelp: { classPropertyName: "slFieldHelp", publicName: "slFieldHelp", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-part": "help", "type": "button" }, listeners: { "pointerenter": "enter($event)", "pointerleave": "leave($event)", "focus": "focus($event)", "blur": "blur($event)", "click": "press($event)" }, properties: { "attr.aria-label": "label()", "attr.aria-describedby": "describedBy()" } }, providers: [
|
|
873
|
+
provideTooltipDefaults({ closeOnPress: false, describes: 'none', openOn: 'manual' }),
|
|
874
|
+
{ provide: SlFieldHelpSlot, useExisting: forwardRef(() => SlFieldHelp) },
|
|
875
|
+
], exportAs: ["slFieldHelp"], hostDirectives: [{ directive: i1.SlTooltip, inputs: ["open", "open", "side", "side"], outputs: ["openChange", "openChange", "openChangeRequest", "openChangeRequest"] }, { directive: i1.SlTooltipTrigger }], ngImport: i0, template: `<span slIcon aria-hidden="true"><svg slGlyph name="circle-question"></svg></span>
|
|
876
|
+
<span data-part="help-text" hidden [id]="textId()">{{ slFieldHelp() }}</span>
|
|
877
|
+
<ng-template slTooltipLayer>
|
|
878
|
+
<div slTooltipContent>{{ slFieldHelp() }}</div>
|
|
879
|
+
<div slTooltipArrow></div>
|
|
880
|
+
</ng-template>`, isInline: true, dependencies: [{ kind: "component", type: SlGlyph, selector: "svg[slGlyph]", inputs: ["name", "solid"] }, { kind: "component", type: SlIcon, selector: "[slIcon]", inputs: ["directional", "label", "size", "tone"], exportAs: ["slIcon"] }, { kind: "directive", type: SlTooltipArrow, selector: "[slTooltipArrow]", exportAs: ["slTooltipArrow"] }, { kind: "component", type: SlTooltipContent, selector: "[slTooltipContent]", exportAs: ["slTooltipContent"] }, { kind: "directive", type: SlTooltipLayer, selector: "ng-template[slTooltipLayer]", exportAs: ["slTooltipLayer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
881
|
+
}
|
|
882
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlFieldHelp, decorators: [{
|
|
883
|
+
type: Component,
|
|
884
|
+
args: [{
|
|
885
|
+
selector: 'button[slFieldHelp]',
|
|
886
|
+
standalone: true,
|
|
887
|
+
exportAs: 'slFieldHelp',
|
|
888
|
+
imports: [SlGlyph, SlIcon, SlTooltipArrow, SlTooltipContent, SlTooltipLayer],
|
|
889
|
+
hostDirectives: [
|
|
890
|
+
{
|
|
891
|
+
directive: SlTooltip,
|
|
892
|
+
inputs: ['open', 'side'],
|
|
893
|
+
outputs: ['openChange', 'openChangeRequest'],
|
|
894
|
+
},
|
|
895
|
+
SlTooltipTrigger,
|
|
896
|
+
],
|
|
897
|
+
template: `<span slIcon aria-hidden="true"><svg slGlyph name="circle-question"></svg></span>
|
|
898
|
+
<span data-part="help-text" hidden [id]="textId()">{{ slFieldHelp() }}</span>
|
|
899
|
+
<ng-template slTooltipLayer>
|
|
900
|
+
<div slTooltipContent>{{ slFieldHelp() }}</div>
|
|
901
|
+
<div slTooltipArrow></div>
|
|
902
|
+
</ng-template>`,
|
|
903
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
904
|
+
encapsulation: ViewEncapsulation.None,
|
|
905
|
+
providers: [
|
|
906
|
+
provideTooltipDefaults({ closeOnPress: false, describes: 'none', openOn: 'manual' }),
|
|
907
|
+
{ provide: SlFieldHelpSlot, useExisting: forwardRef(() => SlFieldHelp) },
|
|
908
|
+
],
|
|
909
|
+
host: {
|
|
910
|
+
'data-part': 'help',
|
|
911
|
+
type: 'button',
|
|
912
|
+
'[attr.aria-label]': 'label()',
|
|
913
|
+
'[attr.aria-describedby]': 'describedBy()',
|
|
914
|
+
'(pointerenter)': 'enter($event)',
|
|
915
|
+
'(pointerleave)': 'leave($event)',
|
|
916
|
+
'(focus)': 'focus($event)',
|
|
917
|
+
'(blur)': 'blur($event)',
|
|
918
|
+
'(click)': 'press($event)',
|
|
919
|
+
},
|
|
920
|
+
}]
|
|
921
|
+
}], ctorParameters: () => [], propDecorators: { slFieldHelp: [{ type: i0.Input, args: [{ isSignal: true, alias: "slFieldHelp", required: false }] }] } });
|
|
922
|
+
|
|
923
|
+
/**
|
|
924
|
+
* Generated bundle index. Do not edit.
|
|
925
|
+
*/
|
|
926
|
+
|
|
927
|
+
export { FIELD_DEFAULTS, FIELD_DESCRIBED_ORDER, SlField, SlFieldAction, SlFieldContext, SlFieldControl, SlFieldCounter, SlFieldDefaultsSource, SlFieldDescription, SlFieldError, SlFieldHeader, SlFieldHeaderSlot, SlFieldHelp, SlFieldHelpSlot, SlFieldIdFactory, SlFieldIndicator, SlFieldIndicatorSlot, SlFieldLabel, SlFieldMessage, deriveFieldIds, formatFieldCount, injectFieldDefaults, isFieldCountOver, necessityMark, provideFieldDefaults };
|
|
928
|
+
//# sourceMappingURL=slotted-angular-field.mjs.map
|