@ds-mo/ui 15.2.0 → 15.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +3 -3
- package/dist/agent.json +936 -80
- package/dist/angular/ds-card-setting.d.ts +1 -1
- package/dist/angular/ds-card-setting.js +3 -3
- package/dist/angular/ds-checkbox-group.d.ts +12 -0
- package/dist/angular/ds-checkbox-group.js +38 -0
- package/dist/angular/ds-checkbox.d.ts +1 -1
- package/dist/angular/ds-checkbox.js +3 -3
- package/dist/angular/ds-inline-banner-settings.d.ts +12 -0
- package/dist/angular/ds-inline-banner-settings.js +38 -0
- package/dist/angular/ds-input-time.d.ts +1 -1
- package/dist/angular/ds-input-time.js +3 -3
- package/dist/angular/ds-input.d.ts +5 -1
- package/dist/angular/ds-input.js +10 -4
- package/dist/angular/ds-map-entity-marker.d.ts +1 -1
- package/dist/angular/ds-map-entity-marker.js +3 -3
- package/dist/angular/ds-radio-tile.d.ts +15 -0
- package/dist/angular/ds-radio-tile.js +43 -0
- package/dist/angular/ds-radio.d.ts +1 -1
- package/dist/angular/ds-radio.js +3 -3
- package/dist/angular/ds-setting-row-checkbox.d.ts +12 -0
- package/dist/angular/ds-setting-row-checkbox.js +38 -0
- package/dist/angular/ds-setting-row-radio.d.ts +12 -0
- package/dist/angular/ds-setting-row-radio.js +38 -0
- package/dist/angular/ds-setting-row-toggle.d.ts +18 -0
- package/dist/angular/ds-setting-row-toggle.js +42 -0
- package/dist/angular/ds-slider.d.ts +1 -1
- package/dist/angular/ds-slider.js +3 -3
- package/dist/angular/ds-textarea.d.ts +1 -1
- package/dist/angular/ds-textarea.js +3 -3
- package/dist/angular/ds-time-picker.d.ts +1 -1
- package/dist/angular/ds-time-picker.js +3 -3
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +6 -0
- package/dist/angular/number-value-accessor.d.ts +9 -0
- package/dist/angular/number-value-accessor.js +39 -0
- package/dist/angular/proxies.d.ts +6 -0
- package/dist/angular/proxies.js +6 -0
- package/dist/angular/radio-value-accessor.d.ts +1 -1
- package/dist/angular/radio-value-accessor.js +2 -2
- package/dist/angular/select-value-accessor.d.ts +1 -1
- package/dist/angular/select-value-accessor.js +2 -2
- package/dist/angular/text-value-accessor.d.ts +1 -1
- package/dist/angular/text-value-accessor.js +2 -2
- package/dist/components/ds-agent-activity.js +1 -1
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-agent-response.js.map +1 -1
- package/dist/components/ds-agent-source-list.js +1 -1
- package/dist/components/ds-agent-tool-call.js +1 -1
- package/dist/components/ds-attachment-list.js +1 -1
- package/dist/components/ds-badge.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-action.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-page-title.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-breadcrumb.js +1 -1
- package/dist/components/ds-button-filled.js +1 -1
- package/dist/components/ds-button-inverted.js +1 -1
- package/dist/components/ds-button-inverted.js.map +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-calendar.js +1 -1
- package/dist/components/ds-card-action-center.js +1 -1
- package/dist/components/ds-card-action-center.js.map +1 -1
- package/dist/components/ds-card-chart.js +1 -1
- package/dist/components/ds-card-navigation.js +1 -1
- package/dist/components/ds-card-navigation.js.map +1 -1
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-card-overview.js.map +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-card-setting.js.map +1 -1
- package/dist/components/ds-card-settings-scope.js +1 -1
- package/dist/components/ds-card-settings-scope.js.map +1 -1
- package/dist/components/ds-chart-legend.js +1 -1
- package/dist/components/ds-chart-legend.js.map +1 -1
- package/dist/components/ds-chart.js +1 -1
- package/dist/components/ds-checkbox-group.d.ts +11 -0
- package/dist/components/ds-checkbox-group.js +2 -0
- package/dist/components/ds-checkbox-group.js.map +1 -0
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-conversation-list-item.js +1 -1
- package/dist/components/ds-conversation-list-item.js.map +1 -1
- package/dist/components/ds-conversation-list-section.js +1 -1
- package/dist/components/ds-conversation-list.js +1 -1
- package/dist/components/ds-data-customize.js +1 -1
- package/dist/components/ds-data-customize.js.map +1 -1
- package/dist/components/ds-data-filter.js +1 -1
- package/dist/components/ds-data-filter.js.map +1 -1
- package/dist/components/ds-data-group.js +1 -1
- package/dist/components/ds-data-preferences.js +1 -1
- package/dist/components/ds-data-preferences.js.map +1 -1
- package/dist/components/ds-data-saved-views.js +1 -1
- package/dist/components/ds-data-saved-views.js.map +1 -1
- package/dist/components/ds-data-search.js +1 -1
- package/dist/components/ds-data-search.js.map +1 -1
- package/dist/components/ds-data-sort.js +1 -1
- package/dist/components/ds-data-toolbar.js +1 -1
- package/dist/components/ds-divider.js +1 -1
- package/dist/components/ds-empty-state.js +1 -1
- package/dist/components/ds-field.js +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-inline-banner-settings.d.ts +11 -0
- package/dist/components/ds-inline-banner-settings.js +2 -0
- package/dist/components/ds-inline-banner-settings.js.map +1 -0
- package/dist/components/ds-input-date.js +1 -1
- package/dist/components/ds-input-date.js.map +1 -1
- package/dist/components/ds-input-time.js +1 -1
- package/dist/components/ds-input-time.js.map +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-map-cluster-marker.js +1 -1
- package/dist/components/ds-map-entity-marker.js +1 -1
- package/dist/components/ds-map-entity-marker.js.map +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-actions.js +1 -1
- package/dist/components/ds-message-bubble.js +1 -1
- package/dist/components/ds-message-bubble.js.map +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-composer.js.map +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-message.js +1 -1
- package/dist/components/ds-mobile-bar-nav.js +1 -1
- package/dist/components/ds-mobile-header.js +1 -1
- package/dist/components/ds-mobile-section-switcher.js +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-pagination.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-sub-nav.js +1 -1
- package/dist/components/ds-panel-sub-nav.js.map +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tool-search.js.map +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-paper-texture.js +1 -1
- package/dist/components/ds-radio-tile.d.ts +11 -0
- package/dist/components/ds-radio-tile.js +2 -0
- package/dist/components/ds-radio-tile.js.map +1 -0
- package/dist/components/ds-radio.js +1 -1
- package/dist/components/ds-score.js +1 -1
- package/dist/components/ds-scroll-overlay.js +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-setting-row-checkbox.d.ts +11 -0
- package/dist/components/ds-setting-row-checkbox.js +2 -0
- package/dist/components/ds-setting-row-checkbox.js.map +1 -0
- package/dist/components/ds-setting-row-radio.d.ts +11 -0
- package/dist/components/ds-setting-row-radio.js +2 -0
- package/dist/components/ds-setting-row-radio.js.map +1 -0
- package/dist/components/ds-setting-row-toggle.d.ts +11 -0
- package/dist/components/ds-setting-row-toggle.js +2 -0
- package/dist/components/ds-setting-row-toggle.js.map +1 -0
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-app.js.map +1 -1
- package/dist/components/ds-shell-page.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-skeleton.js +1 -1
- package/dist/components/ds-slider.js +1 -1
- package/dist/components/ds-slider.js.map +1 -1
- package/dist/components/ds-swatch-picker.js +1 -1
- package/dist/components/ds-switch.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-table.js.map +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-text.js +1 -1
- package/dist/components/ds-textarea.js +1 -1
- package/dist/components/ds-textarea.js.map +1 -1
- package/dist/components/ds-time-picker.js +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-tooltip-chart.js +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/ds-typing-indicator.js +1 -1
- package/dist/components/p-7TVdPhGR.js +2 -0
- package/dist/components/{p-YrnU2fM7.js.map → p-7TVdPhGR.js.map} +1 -1
- package/dist/components/{p-7V1AhetH.js → p-B0BQCVkq.js} +2 -2
- package/dist/components/p-B0EpvBDs.js +2 -0
- package/dist/components/{p-lamoJZE4.js.map → p-B0EpvBDs.js.map} +1 -1
- package/dist/components/{p-Cu8o2rOz.js → p-B39iJO8F.js} +2 -2
- package/dist/components/p-B9TM6FqC.js +2 -0
- package/dist/components/{p-BJJh-Bf7.js.map → p-B9TM6FqC.js.map} +1 -1
- package/dist/components/{p-B6qQaYkB.js → p-B9y6azEw.js} +2 -2
- package/dist/components/p-BDdlJZyL.js +2 -0
- package/dist/components/{p-CZ7hxDy_.js.map → p-BDdlJZyL.js.map} +1 -1
- package/dist/components/{p-5SVmAjXY.js → p-BERXvOCf.js} +2 -2
- package/dist/components/{p-xhn1cZgU.js → p-BFHpU-uU.js} +2 -2
- package/dist/components/{p-CuWPWC3t.js → p-BQspV5U7.js} +2 -2
- package/dist/components/p-BWSIw8AQ.js +2 -0
- package/dist/components/p-BWSIw8AQ.js.map +1 -0
- package/dist/components/p-BhjqYTiY.js +2 -0
- package/dist/components/p-BhjqYTiY.js.map +1 -0
- package/dist/components/{p-BOhefRMt.js → p-Bk3poU91.js} +2 -2
- package/dist/components/{p-QWukusRL.js → p-BnuNaXR2.js} +2 -2
- package/dist/components/p-BwdnVqAY.js +2 -0
- package/dist/components/p-BwdnVqAY.js.map +1 -0
- package/dist/components/p-C4huuwed.js +2 -0
- package/dist/components/{p-CRk0TjQv.js.map → p-C4huuwed.js.map} +1 -1
- package/dist/components/{p-BtnTQp4K.js → p-C8V4lkVy.js} +2 -2
- package/dist/components/p-CJ1NnOEW.js +2 -0
- package/dist/components/p-CJ1NnOEW.js.map +1 -0
- package/dist/components/p-CPamUzaj.js +2 -0
- package/dist/components/{p-CNZ6-kWd.js.map → p-CPamUzaj.js.map} +1 -1
- package/dist/components/{p-Dqfc6Nvd.js → p-CUDocY23.js} +2 -2
- package/dist/components/{p-Dqfc6Nvd.js.map → p-CUDocY23.js.map} +1 -1
- package/dist/components/p-CX6ZxUQT.js +2 -0
- package/dist/components/p-CX6ZxUQT.js.map +1 -0
- package/dist/components/p-CZNZTcYS.js +2 -0
- package/dist/components/p-CZNZTcYS.js.map +1 -0
- package/dist/components/p-CbCN9ew9.js +2 -0
- package/dist/components/p-CbCN9ew9.js.map +1 -0
- package/dist/components/p-CeXf9-X3.js.map +1 -1
- package/dist/components/p-Cgn-BORA.js +2 -0
- package/dist/components/p-Cgn-BORA.js.map +1 -0
- package/dist/components/{p-mux14tWZ.js → p-Co1rUdOR.js} +2 -2
- package/dist/components/p-Co1rUdOR.js.map +1 -0
- package/dist/components/{p-CGidq1iC.js → p-CuwopElg.js} +2 -2
- package/dist/components/p-CwUXroLs.js +2 -0
- package/dist/components/{p-etg-Uk1u.js.map → p-CwUXroLs.js.map} +1 -1
- package/dist/components/{p-Cn6AfzeF.js → p-CwdRaJER.js} +2 -2
- package/dist/components/p-D6FRqNhN.js +2 -0
- package/dist/components/p-D6FRqNhN.js.map +1 -0
- package/dist/components/{p-ZwRLjD5M.js → p-D8OWhnID.js} +2 -2
- package/dist/components/p-DCyJ3_PL.js +2 -0
- package/dist/components/{p-BZ_e69zx.js.map → p-DCyJ3_PL.js.map} +1 -1
- package/dist/components/{p-C_Ma6Xa-.js → p-DIQiHX0q.js} +2 -2
- package/dist/components/{p-B3CZvMXs.js → p-DJDbskZf.js} +2 -2
- package/dist/components/p-DRdoGSGX.js +2 -0
- package/dist/components/{p-CTGgXIXM.js.map → p-DRdoGSGX.js.map} +1 -1
- package/dist/components/{p-C1gaWjOm.js → p-DSZPO06T.js} +2 -2
- package/dist/components/{p-uADksYMl.js → p-DSmDyI2o.js} +2 -2
- package/dist/components/{p-UY63jmrO.js → p-DVEx-Xg9.js} +2 -2
- package/dist/components/p-DXk1eml1.js +2 -0
- package/dist/components/{p-Dlp1HqgS.js.map → p-DXk1eml1.js.map} +1 -1
- package/dist/components/{p-p0FVyEFa.js → p-DYQa1DVF.js} +2 -2
- package/dist/components/p-DYQa1DVF.js.map +1 -0
- package/dist/components/p-DYsE6HLk.js +2 -0
- package/dist/components/p-DYsE6HLk.js.map +1 -0
- package/dist/components/{p-vfCu7XSc.js → p-DZ58Sg5a.js} +2 -2
- package/dist/components/p-DebLYW7A.js +2 -0
- package/dist/components/p-DebLYW7A.js.map +1 -0
- package/dist/components/p-DhKvqh5G.js +2 -0
- package/dist/components/p-DhKvqh5G.js.map +1 -0
- package/dist/components/{p-DFO5lV_A.js → p-DmSnHVW6.js} +2 -2
- package/dist/components/p-Dnt5xUBD.js +2 -0
- package/dist/components/{p-BR5OC2PX.js.map → p-Dnt5xUBD.js.map} +1 -1
- package/dist/components/p-Doa2blZT.js +2 -0
- package/dist/components/{p-BLuqpHvp.js.map → p-Doa2blZT.js.map} +1 -1
- package/dist/components/{p-DsLXlxt3.js → p-Dyqd-cub.js} +2 -2
- package/dist/components/p-Dyqd-cub.js.map +1 -0
- package/dist/components/p-DzvTC27M.js +2 -0
- package/dist/components/p-DzvTC27M.js.map +1 -0
- package/dist/components/p-JBki_jyY.js +2 -0
- package/dist/components/{p-C0JkLR83.js.map → p-JBki_jyY.js.map} +1 -1
- package/dist/components/p-MOJmB6vX.js +2 -0
- package/dist/components/{p-BzYW1IqO.js.map → p-MOJmB6vX.js.map} +1 -1
- package/dist/components/p-TVkFIMXz.js +2 -0
- package/dist/components/p-TVkFIMXz.js.map +1 -0
- package/dist/components/{p-ER5M085B.js → p-UJMEz8_O.js} +2 -2
- package/dist/components/{p-CR-Jjdcn.js → p-_IqSPt5V.js} +2 -2
- package/dist/components/p-g0jsfEXz.js +2 -0
- package/dist/components/{p-BfF4RZdp.js.map → p-g0jsfEXz.js.map} +1 -1
- package/dist/components/{p-BLSSaVWm.js → p-pp1IQN4Z.js} +2 -2
- package/dist/docs/components.json +2901 -835
- package/dist/framework/angular.d.ts +1 -0
- package/dist/framework/angular.js +1 -0
- package/dist/lib/shell/index.js +1 -1
- package/dist/lib/shell/index.js.map +1 -1
- package/dist/lint/index.js +1 -1
- package/dist/mcp-data/registry/agent-activity.json +2 -2
- package/dist/mcp-data/registry/agent-questionnaire.json +2 -2
- package/dist/mcp-data/registry/agent-response.json +3 -3
- package/dist/mcp-data/registry/agent-source-list.json +2 -2
- package/dist/mcp-data/registry/agent-tool-call.json +2 -2
- package/dist/mcp-data/registry/attachment-list.json +2 -2
- package/dist/mcp-data/registry/avatar.json +2 -2
- package/dist/mcp-data/registry/badge.json +2 -2
- package/dist/mcp-data/registry/banner.json +2 -2
- package/dist/mcp-data/registry/bar-action.json +2 -2
- package/dist/mcp-data/registry/bar-nav.json +5 -5
- package/dist/mcp-data/registry/bar-page-title.json +4 -4
- package/dist/mcp-data/registry/bar-title.json +4 -4
- package/dist/mcp-data/registry/bar-workflow.json +2 -2
- package/dist/mcp-data/registry/breadcrumb.json +2 -2
- package/dist/mcp-data/registry/button-filled.json +2 -2
- package/dist/mcp-data/registry/button-inverted.json +2 -2
- package/dist/mcp-data/registry/button-unfilled.json +9 -9
- package/dist/mcp-data/registry/calendar.json +2 -2
- package/dist/mcp-data/registry/card-action-center.json +2 -2
- package/dist/mcp-data/registry/card-chart.json +2 -2
- package/dist/mcp-data/registry/card-navigation.json +2 -2
- package/dist/mcp-data/registry/card-overview.json +2 -2
- package/dist/mcp-data/registry/card-setting.json +50 -15
- package/dist/mcp-data/registry/card-settings-scope.json +2 -2
- package/dist/mcp-data/registry/chart-legend.json +2 -2
- package/dist/mcp-data/registry/chart.json +2 -2
- package/dist/mcp-data/registry/checkbox-group.json +246 -0
- package/dist/mcp-data/registry/checkbox.json +26 -6
- package/dist/mcp-data/registry/chip.json +2 -2
- package/dist/mcp-data/registry/code-block.json +2 -2
- package/dist/mcp-data/registry/conversation-list-item.json +2 -2
- package/dist/mcp-data/registry/conversation-list-section.json +2 -2
- package/dist/mcp-data/registry/conversation-list.json +2 -2
- package/dist/mcp-data/registry/data-customize.json +3 -3
- package/dist/mcp-data/registry/data-filter.json +2 -2
- package/dist/mcp-data/registry/data-group.json +2 -2
- package/dist/mcp-data/registry/data-preferences.json +2 -2
- package/dist/mcp-data/registry/data-saved-views.json +2 -2
- package/dist/mcp-data/registry/data-search.json +2 -2
- package/dist/mcp-data/registry/data-sort.json +2 -2
- package/dist/mcp-data/registry/data-toolbar.json +2 -2
- package/dist/mcp-data/registry/divider.json +2 -2
- package/dist/mcp-data/registry/empty-state.json +27 -14
- package/dist/mcp-data/registry/field.json +6 -5
- package/dist/mcp-data/registry/filter-menu.json +2 -2
- package/dist/mcp-data/registry/icon.json +2 -2
- package/dist/mcp-data/registry/inline-banner-settings.json +175 -0
- package/dist/mcp-data/registry/input-date.json +2 -2
- package/dist/mcp-data/registry/input-time.json +26 -7
- package/dist/mcp-data/registry/input.json +265 -15
- package/dist/mcp-data/registry/loader.json +2 -2
- package/dist/mcp-data/registry/map-cluster-marker.json +3 -3
- package/dist/mcp-data/registry/map-entity-marker.json +56 -56
- package/dist/mcp-data/registry/markdown.json +2 -2
- package/dist/mcp-data/registry/menu.json +2 -2
- package/dist/mcp-data/registry/message-actions.json +2 -2
- package/dist/mcp-data/registry/message-bubble.json +5 -5
- package/dist/mcp-data/registry/message-composer.json +7 -7
- package/dist/mcp-data/registry/message-scroller.json +2 -2
- package/dist/mcp-data/registry/message.json +3 -3
- package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
- package/dist/mcp-data/registry/mobile-header.json +2 -2
- package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
- package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
- package/dist/mcp-data/registry/modal.json +2 -2
- package/dist/mcp-data/registry/pagination.json +2 -2
- package/dist/mcp-data/registry/panel-nav.json +4 -4
- package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
- package/dist/mcp-data/registry/panel-tool-header.json +4 -4
- package/dist/mcp-data/registry/panel-tool-search.json +3 -3
- package/dist/mcp-data/registry/panel-tools.json +4 -4
- package/dist/mcp-data/registry/paper-texture.json +2 -2
- package/dist/mcp-data/registry/radio-tile.json +399 -0
- package/dist/mcp-data/registry/radio.json +51 -9
- package/dist/mcp-data/registry/registry.json +954 -80
- package/dist/mcp-data/registry/score.json +2 -2
- package/dist/mcp-data/registry/scroll-overlay.json +2 -2
- package/dist/mcp-data/registry/select.json +2 -2
- package/dist/mcp-data/registry/setting-row-checkbox.json +197 -0
- package/dist/mcp-data/registry/setting-row-radio.json +196 -0
- package/dist/mcp-data/registry/setting-row-toggle.json +233 -0
- package/dist/mcp-data/registry/shell-app.json +4 -4
- package/dist/mcp-data/registry/shell-page.json +2 -2
- package/dist/mcp-data/registry/shell-tools.json +2 -2
- package/dist/mcp-data/registry/skeleton.json +2 -2
- package/dist/mcp-data/registry/slider.json +32 -12
- package/dist/mcp-data/registry/swatch-picker.json +2 -2
- package/dist/mcp-data/registry/switch.json +4 -4
- package/dist/mcp-data/registry/tab-group.json +2 -2
- package/dist/mcp-data/registry/table.json +5 -5
- package/dist/mcp-data/registry/tag.json +2 -2
- package/dist/mcp-data/registry/text.json +2 -2
- package/dist/mcp-data/registry/textarea.json +72 -5
- package/dist/mcp-data/registry/time-picker.json +28 -9
- package/dist/mcp-data/registry/toast.json +2 -2
- package/dist/mcp-data/registry/tooltip-chart.json +2 -2
- package/dist/mcp-data/registry/tooltip.json +2 -2
- package/dist/mcp-data/registry/typing-indicator.json +2 -2
- package/dist/react/components.d.ts +6 -0
- package/dist/react/components.js +6 -0
- package/dist/react/ds-checkbox-group.d.ts +9 -0
- package/dist/react/ds-checkbox-group.js +12 -0
- package/dist/react/ds-inline-banner-settings.d.ts +9 -0
- package/dist/react/ds-inline-banner-settings.js +12 -0
- package/dist/react/ds-input.d.ts +2 -0
- package/dist/react/ds-input.js +2 -0
- package/dist/react/ds-radio-tile.d.ts +12 -0
- package/dist/react/ds-radio-tile.js +12 -0
- package/dist/react/ds-setting-row-checkbox.d.ts +9 -0
- package/dist/react/ds-setting-row-checkbox.js +12 -0
- package/dist/react/ds-setting-row-radio.d.ts +9 -0
- package/dist/react/ds-setting-row-radio.js +12 -0
- package/dist/react/ds-setting-row-toggle.d.ts +12 -0
- package/dist/react/ds-setting-row-toggle.js +12 -0
- package/dist/types/components/BarPageTitle/BarPageTitle.d.ts +2 -0
- package/dist/types/components/BarTitle/bar-title-action-chrome.d.ts +4 -0
- package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +5 -2
- package/dist/types/components/CardSetting/CardSetting.d.ts +15 -3
- package/dist/types/components/CardSetting/index.d.ts +1 -1
- package/dist/types/components/Checkbox/Checkbox.d.ts +2 -0
- package/dist/types/components/CheckboxGroup/CheckboxGroup.d.ts +20 -0
- package/dist/types/components/EmptyState/EmptyState.d.ts +3 -0
- package/dist/types/components/Field/Field.d.ts +4 -0
- package/dist/types/components/InlineBannerSettings/InlineBannerSettings.d.ts +6 -0
- package/dist/types/components/Input/Input.d.ts +50 -1
- package/dist/types/components/InputTime/InputTime.d.ts +3 -0
- package/dist/types/components/MapEntityMarker/MapEntityMarker.d.ts +5 -5
- package/dist/types/components/Radio/Radio.d.ts +8 -0
- package/dist/types/components/RadioTile/RadioTile.d.ts +40 -0
- package/dist/types/components/RadioTile/index.d.ts +2 -0
- package/dist/types/components/SettingRowCheckbox/SettingRowCheckbox.d.ts +19 -0
- package/dist/types/components/SettingRowRadio/SettingRowRadio.d.ts +19 -0
- package/dist/types/components/SettingRowToggle/SettingRowToggle.d.ts +21 -0
- package/dist/types/components/Slider/Slider.d.ts +8 -1
- package/dist/types/components/Slider/index.d.ts +1 -1
- package/dist/types/components/Switch/Switch.d.ts +7 -0
- package/dist/types/components/Textarea/Textarea.d.ts +12 -0
- package/dist/types/components/TimePicker/TimePicker.d.ts +4 -0
- package/dist/types/components.d.ts +728 -37
- package/dist/types/utils/text-constraints.d.ts +20 -0
- package/dist/vue/components.d.ts +6 -0
- package/dist/vue/components.js +6 -0
- package/dist/vue/ds-card-setting.js +1 -0
- package/dist/vue/ds-checkbox-group.d.ts +3 -0
- package/dist/vue/ds-checkbox-group.js +12 -0
- package/dist/vue/ds-checkbox.js +1 -0
- package/dist/vue/ds-inline-banner-settings.d.ts +3 -0
- package/dist/vue/ds-inline-banner-settings.js +8 -0
- package/dist/vue/ds-input-time.js +1 -0
- package/dist/vue/ds-input.js +17 -0
- package/dist/vue/ds-map-entity-marker.js +2 -2
- package/dist/vue/ds-radio-tile.d.ts +3 -0
- package/dist/vue/ds-radio-tile.js +24 -0
- package/dist/vue/ds-radio.js +2 -0
- package/dist/vue/ds-setting-row-checkbox.d.ts +3 -0
- package/dist/vue/ds-setting-row-checkbox.js +11 -0
- package/dist/vue/ds-setting-row-radio.d.ts +3 -0
- package/dist/vue/ds-setting-row-radio.js +11 -0
- package/dist/vue/ds-setting-row-toggle.d.ts +3 -0
- package/dist/vue/ds-setting-row-toggle.js +15 -0
- package/dist/vue/ds-slider.d.ts +1 -1
- package/dist/vue/ds-slider.js +2 -1
- package/dist/vue/ds-textarea.js +4 -0
- package/dist/vue/ds-time-picker.js +1 -0
- package/package.json +5 -5
- package/dist/components/p-BCnzbfma.js +0 -2
- package/dist/components/p-BCnzbfma.js.map +0 -1
- package/dist/components/p-BJJh-Bf7.js +0 -2
- package/dist/components/p-BLuqpHvp.js +0 -2
- package/dist/components/p-BR5OC2PX.js +0 -2
- package/dist/components/p-BX506yEW.js +0 -2
- package/dist/components/p-BX506yEW.js.map +0 -1
- package/dist/components/p-BZ_e69zx.js +0 -2
- package/dist/components/p-BfF4RZdp.js +0 -2
- package/dist/components/p-Br5e83Fr.js +0 -2
- package/dist/components/p-Br5e83Fr.js.map +0 -1
- package/dist/components/p-Bv9rSkp0.js +0 -2
- package/dist/components/p-Bv9rSkp0.js.map +0 -1
- package/dist/components/p-BzYW1IqO.js +0 -2
- package/dist/components/p-C0JkLR83.js +0 -2
- package/dist/components/p-C6Aavz9h.js +0 -2
- package/dist/components/p-C6Aavz9h.js.map +0 -1
- package/dist/components/p-C6zycbhC.js +0 -2
- package/dist/components/p-C6zycbhC.js.map +0 -1
- package/dist/components/p-CNZ6-kWd.js +0 -2
- package/dist/components/p-CRk0TjQv.js +0 -2
- package/dist/components/p-CTGgXIXM.js +0 -2
- package/dist/components/p-CZ7hxDy_.js +0 -2
- package/dist/components/p-Cc3ZUQlJ.js +0 -2
- package/dist/components/p-Cc3ZUQlJ.js.map +0 -1
- package/dist/components/p-D5HxZrMA.js +0 -2
- package/dist/components/p-D5HxZrMA.js.map +0 -1
- package/dist/components/p-D7K1ZHML.js +0 -2
- package/dist/components/p-D7K1ZHML.js.map +0 -1
- package/dist/components/p-Dlp1HqgS.js +0 -2
- package/dist/components/p-DsLXlxt3.js.map +0 -1
- package/dist/components/p-YrnU2fM7.js +0 -2
- package/dist/components/p-ZYWnJaye.js +0 -2
- package/dist/components/p-ZYWnJaye.js.map +0 -1
- package/dist/components/p-etg-Uk1u.js +0 -2
- package/dist/components/p-lamoJZE4.js +0 -2
- package/dist/components/p-mV4vSjSK.js +0 -2
- package/dist/components/p-mV4vSjSK.js.map +0 -1
- package/dist/components/p-mux14tWZ.js.map +0 -1
- package/dist/components/p-mxZoWfnS.js +0 -2
- package/dist/components/p-mxZoWfnS.js.map +0 -1
- package/dist/components/p-p0FVyEFa.js.map +0 -1
- package/dist/components/p-xtGGIZmU.js +0 -2
- package/dist/components/p-xtGGIZmU.js.map +0 -1
- /package/dist/components/{p-7V1AhetH.js.map → p-B0BQCVkq.js.map} +0 -0
- /package/dist/components/{p-Cu8o2rOz.js.map → p-B39iJO8F.js.map} +0 -0
- /package/dist/components/{p-B6qQaYkB.js.map → p-B9y6azEw.js.map} +0 -0
- /package/dist/components/{p-5SVmAjXY.js.map → p-BERXvOCf.js.map} +0 -0
- /package/dist/components/{p-xhn1cZgU.js.map → p-BFHpU-uU.js.map} +0 -0
- /package/dist/components/{p-CuWPWC3t.js.map → p-BQspV5U7.js.map} +0 -0
- /package/dist/components/{p-BOhefRMt.js.map → p-Bk3poU91.js.map} +0 -0
- /package/dist/components/{p-QWukusRL.js.map → p-BnuNaXR2.js.map} +0 -0
- /package/dist/components/{p-BtnTQp4K.js.map → p-C8V4lkVy.js.map} +0 -0
- /package/dist/components/{p-CGidq1iC.js.map → p-CuwopElg.js.map} +0 -0
- /package/dist/components/{p-Cn6AfzeF.js.map → p-CwdRaJER.js.map} +0 -0
- /package/dist/components/{p-ZwRLjD5M.js.map → p-D8OWhnID.js.map} +0 -0
- /package/dist/components/{p-C_Ma6Xa-.js.map → p-DIQiHX0q.js.map} +0 -0
- /package/dist/components/{p-B3CZvMXs.js.map → p-DJDbskZf.js.map} +0 -0
- /package/dist/components/{p-C1gaWjOm.js.map → p-DSZPO06T.js.map} +0 -0
- /package/dist/components/{p-uADksYMl.js.map → p-DSmDyI2o.js.map} +0 -0
- /package/dist/components/{p-UY63jmrO.js.map → p-DVEx-Xg9.js.map} +0 -0
- /package/dist/components/{p-vfCu7XSc.js.map → p-DZ58Sg5a.js.map} +0 -0
- /package/dist/components/{p-DFO5lV_A.js.map → p-DmSnHVW6.js.map} +0 -0
- /package/dist/components/{p-ER5M085B.js.map → p-UJMEz8_O.js.map} +0 -0
- /package/dist/components/{p-CR-Jjdcn.js.map → p-_IqSPt5V.js.map} +0 -0
- /package/dist/components/{p-BLSSaVWm.js.map → p-pp1IQN4Z.js.map} +0 -0
|
@@ -52,7 +52,8 @@
|
|
|
52
52
|
"The default four visible rows can be changed with rows; rows is clamped to at least one.",
|
|
53
53
|
"Vertical resizing is enabled by default and can be disabled when the surrounding layout owns the field height.",
|
|
54
54
|
"Size changes typography and inset spacing without changing the authored row count.",
|
|
55
|
-
"Border, focus, error, placeholder, inactive, hover, and pressed treatments follow the same shared recipes as Input. When hasBorder is false, supporting error copy insets to the text origin rather than the resting border box."
|
|
55
|
+
"Border, focus, error, placeholder, inactive, hover, and pressed treatments follow the same shared recipes as Input. When hasBorder is false, supporting error copy insets to the text origin rather than the resting border box.",
|
|
56
|
+
"Length constraints validate typed and programmatic text. Excess content is retained with an error by default; restrict mode enforces the maximum during editing. A character count appears below the field, right of supporting text or left when no supporting text exists."
|
|
56
57
|
],
|
|
57
58
|
"responsiveBehavior": [
|
|
58
59
|
"Textarea fills its parent by default and follows the width supplied by Field or the form layout.",
|
|
@@ -241,6 +242,31 @@
|
|
|
241
242
|
"required": false,
|
|
242
243
|
"mutable": false
|
|
243
244
|
},
|
|
245
|
+
"lengthBehavior": {
|
|
246
|
+
"type": "'error' | 'restrict'",
|
|
247
|
+
"resolvedType": "\"error\" | \"restrict\"",
|
|
248
|
+
"attribute": "length-behavior",
|
|
249
|
+
"default": "'error'",
|
|
250
|
+
"required": false,
|
|
251
|
+
"mutable": false,
|
|
252
|
+
"description": "Error preserves extra text; restrict uses the browser's hard input limit."
|
|
253
|
+
},
|
|
254
|
+
"maxLength": {
|
|
255
|
+
"type": "number | undefined",
|
|
256
|
+
"resolvedType": "number | undefined",
|
|
257
|
+
"attribute": "max-length",
|
|
258
|
+
"required": false,
|
|
259
|
+
"mutable": false,
|
|
260
|
+
"description": "Maximum text length. A visible counter accompanies this constraint by default."
|
|
261
|
+
},
|
|
262
|
+
"minLength": {
|
|
263
|
+
"type": "number | undefined",
|
|
264
|
+
"resolvedType": "number | undefined",
|
|
265
|
+
"attribute": "min-length",
|
|
266
|
+
"required": false,
|
|
267
|
+
"mutable": false,
|
|
268
|
+
"description": "Minimum non-empty text length, in native UTF-16 code units."
|
|
269
|
+
},
|
|
244
270
|
"name": {
|
|
245
271
|
"type": "string | undefined",
|
|
246
272
|
"resolvedType": "string | undefined",
|
|
@@ -298,6 +324,14 @@
|
|
|
298
324
|
"mutable": false,
|
|
299
325
|
"description": "Visible text rows before the field scrolls."
|
|
300
326
|
},
|
|
327
|
+
"showCharacterCount": {
|
|
328
|
+
"type": "boolean",
|
|
329
|
+
"resolvedType": "boolean",
|
|
330
|
+
"attribute": "show-character-count",
|
|
331
|
+
"default": "true",
|
|
332
|
+
"required": false,
|
|
333
|
+
"mutable": false
|
|
334
|
+
},
|
|
301
335
|
"size": {
|
|
302
336
|
"type": "TextareaSize",
|
|
303
337
|
"resolvedType": "\"lg\" | \"md\" | \"sm\" | \"xs\"",
|
|
@@ -472,6 +506,31 @@
|
|
|
472
506
|
"required": false,
|
|
473
507
|
"mutable": false
|
|
474
508
|
},
|
|
509
|
+
"lengthBehavior": {
|
|
510
|
+
"type": "'error' | 'restrict'",
|
|
511
|
+
"resolvedType": "\"error\" | \"restrict\"",
|
|
512
|
+
"attribute": "length-behavior",
|
|
513
|
+
"default": "'error'",
|
|
514
|
+
"required": false,
|
|
515
|
+
"mutable": false,
|
|
516
|
+
"description": "Error preserves extra text; restrict uses the browser's hard input limit."
|
|
517
|
+
},
|
|
518
|
+
"maxLength": {
|
|
519
|
+
"type": "number | undefined",
|
|
520
|
+
"resolvedType": "number | undefined",
|
|
521
|
+
"attribute": "max-length",
|
|
522
|
+
"required": false,
|
|
523
|
+
"mutable": false,
|
|
524
|
+
"description": "Maximum text length. A visible counter accompanies this constraint by default."
|
|
525
|
+
},
|
|
526
|
+
"minLength": {
|
|
527
|
+
"type": "number | undefined",
|
|
528
|
+
"resolvedType": "number | undefined",
|
|
529
|
+
"attribute": "min-length",
|
|
530
|
+
"required": false,
|
|
531
|
+
"mutable": false,
|
|
532
|
+
"description": "Minimum non-empty text length, in native UTF-16 code units."
|
|
533
|
+
},
|
|
475
534
|
"name": {
|
|
476
535
|
"type": "string | undefined",
|
|
477
536
|
"resolvedType": "string | undefined",
|
|
@@ -529,6 +588,14 @@
|
|
|
529
588
|
"mutable": false,
|
|
530
589
|
"description": "Visible text rows before the field scrolls."
|
|
531
590
|
},
|
|
591
|
+
"showCharacterCount": {
|
|
592
|
+
"type": "boolean",
|
|
593
|
+
"resolvedType": "boolean",
|
|
594
|
+
"attribute": "show-character-count",
|
|
595
|
+
"default": "true",
|
|
596
|
+
"required": false,
|
|
597
|
+
"mutable": false
|
|
598
|
+
},
|
|
532
599
|
"size": {
|
|
533
600
|
"type": "TextareaSize",
|
|
534
601
|
"resolvedType": "\"lg\" | \"md\" | \"sm\" | \"xs\"",
|
|
@@ -608,8 +675,8 @@
|
|
|
608
675
|
},
|
|
609
676
|
"peerDependencies": {
|
|
610
677
|
"required": [
|
|
611
|
-
"@ds-mo/tokens ^6.
|
|
612
|
-
"@ds-mo/icons ^8.1.
|
|
678
|
+
"@ds-mo/tokens ^6.6.1",
|
|
679
|
+
"@ds-mo/icons ^8.1.1"
|
|
613
680
|
],
|
|
614
681
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
615
682
|
}
|
|
@@ -625,12 +692,12 @@
|
|
|
625
692
|
"files": [
|
|
626
693
|
{
|
|
627
694
|
"path": "src/wc/components/Textarea/Textarea.css",
|
|
628
|
-
"content": "@import '../../utils/interaction-fill.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-width.css';\n@import '../../utils/field-stack.css';\n@import '../../utils/typography.css';\n@import '../../utils/forced-colors.css';\n\n:host(.textarea-host) {\n display: inline-flex;\n --ds-textarea-fg: var(--color-foreground-primary);\n --ds-textarea-placeholder: var(--color-foreground-secondary);\n --ds-textarea-placeholder-active: var(--color-foreground-quaternary);\n --ds-textarea-border: var(--color-border-secondary);\n}\n\n:host(.ds-control-width--fill),\n:host(.ds-control-width--fill) .textarea-control {\n width: 100%;\n}\n\n.textarea-control {\n display: flex;\n box-sizing: border-box;\n min-width: 0;\n overflow: hidden;\n background: transparent;\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n color: var(--ds-textarea-fg);\n}\n\n.textarea-control--resizable {\n padding-block-end: var(--dimension-space-025);\n padding-inline-end: var(--dimension-space-025);\n}\n\n.textarea-control--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-textarea-border);\n}\n\n.textarea-control--error {\n --ds-interaction-border-width: var(--dimension-stroke-width-018);\n --ds-interaction-border-color: var(--color-border-bold-negative);\n}\n\n.textarea-control--bordered:focus-within:not(.textarea-control--error) {\n --ds-interaction-border-width: var(--dimension-stroke-width-018);\n --ds-interaction-border-color: var(--color-border-bold-brand);\n}\n\n:host(.ds-control-inactive) .textarea-control::after {\n background: transparent;\n}\n\n.native-textarea {\n position: relative;\n z-index: 2;\n box-sizing: border-box;\n min-width: 0;\n width: 100%;\n padding-block: var(--ds-control-padding-inline, var(--dimension-space-075));\n padding-inline: calc(\n var(--ds-control-padding-inline, var(--dimension-space-075)) +\n var(--ds-control-label-inset, var(--dimension-space-025))\n );\n background: transparent;\n border: none;\n border-radius: inherit;\n outline: none;\n color: var(--ds-textarea-fg);\n font-family: inherit;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.native-textarea--resize-vertical {\n resize: vertical;\n}\n\n.native-textarea--resize-none {\n resize: none;\n}\n\n.native-textarea:disabled {\n cursor: not-allowed;\n}\n\n.native-textarea:read-only:not(:disabled) {\n cursor: default;\n}\n\n.native-textarea::placeholder {\n color: var(--ds-textarea-placeholder);\n}\n\n.native-textarea:focus::placeholder {\n color: var(--ds-textarea-placeholder-active);\n}\n\n.error-text {\n width: 100%;\n}\n\n@media (forced-colors: active) {\n .textarea-control--bordered:focus-within:not(.textarea-control--error)::after {\n outline-color: var(--ds-forced-color-selected);\n }\n\n .textarea-control--error::after {\n outline-style: dashed;\n }\n}\n",
|
|
695
|
+
"content": "@import '../../utils/text-field-support.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-width.css';\n@import '../../utils/field-stack.css';\n@import '../../utils/typography.css';\n@import '../../utils/forced-colors.css';\n\n:host(.textarea-host) {\n display: inline-flex;\n --ds-textarea-fg: var(--color-foreground-primary);\n --ds-textarea-placeholder: var(--color-foreground-secondary);\n --ds-textarea-placeholder-active: var(--color-foreground-quaternary);\n --ds-textarea-border: var(--color-border-secondary);\n}\n\n:host(.ds-control-width--fill),\n:host(.ds-control-width--fill) .textarea-control {\n width: 100%;\n}\n\n.textarea-control {\n display: flex;\n box-sizing: border-box;\n min-width: 0;\n overflow: hidden;\n background: transparent;\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n color: var(--ds-textarea-fg);\n}\n\n.textarea-control--resizable {\n padding-block-end: var(--dimension-space-025);\n padding-inline-end: var(--dimension-space-025);\n}\n\n.textarea-control--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-textarea-border);\n}\n\n.textarea-control--error {\n --ds-interaction-border-width: var(--dimension-stroke-width-018);\n --ds-interaction-border-color: var(--color-border-bold-negative);\n}\n\n.textarea-control--bordered:focus-within:not(.textarea-control--error) {\n --ds-interaction-border-width: var(--dimension-stroke-width-018);\n --ds-interaction-border-color: var(--color-border-bold-brand);\n}\n\n:host(.ds-control-inactive) .textarea-control::after {\n background: transparent;\n}\n\n.native-textarea {\n position: relative;\n z-index: 2;\n box-sizing: border-box;\n min-width: 0;\n width: 100%;\n padding-block: var(--ds-control-padding-inline, var(--dimension-space-075));\n padding-inline: calc(\n var(--ds-control-padding-inline, var(--dimension-space-075)) +\n var(--ds-control-label-inset, var(--dimension-space-025))\n );\n background: transparent;\n border: none;\n border-radius: inherit;\n outline: none;\n color: var(--ds-textarea-fg);\n font-family: inherit;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.native-textarea--resize-vertical {\n resize: vertical;\n}\n\n.native-textarea--resize-none {\n resize: none;\n}\n\n.native-textarea:disabled {\n cursor: not-allowed;\n}\n\n.native-textarea:read-only:not(:disabled) {\n cursor: default;\n}\n\n.native-textarea::placeholder {\n color: var(--ds-textarea-placeholder);\n}\n\n.native-textarea:focus::placeholder {\n color: var(--ds-textarea-placeholder-active);\n}\n\n.error-text {\n width: 100%;\n}\n\n@media (forced-colors: active) {\n .textarea-control--bordered:focus-within:not(.textarea-control--error)::after {\n outline-color: var(--ds-forced-color-selected);\n }\n\n .textarea-control--error::after {\n outline-style: dashed;\n }\n}\n",
|
|
629
696
|
"type": "registry:ui"
|
|
630
697
|
},
|
|
631
698
|
{
|
|
632
699
|
"path": "src/wc/components/Textarea/Textarea.tsx",
|
|
633
|
-
"content": "import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n controlWidthClass,\n CONTROL_TEXT_VARIANT,\n DEFAULT_REQUIRED_MESSAGE,\n restoreStringFormState,\n setFormControlValue,\n setRequiredValidity,\n type ControlWidth,\n} from '../../utils';\n\nexport type TextareaSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type TextareaWidth = ControlWidth;\nexport type TextareaResize = 'vertical' | 'none';\n\nlet idCounter = 0;\n\n@Component({\n tag: 'ds-textarea',\n styleUrl: 'Textarea.css',\n scoped: true,\n formAssociated: true,\n})\nexport class Textarea {\n @Element() el!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n private generatedId = `ds-textarea-${++idCounter}`;\n private errorId = `${this.generatedId}-error`;\n\n @Prop({ mutable: true }) value: string = '';\n @Prop({ reflect: true }) name: string | undefined;\n @Prop({ reflect: true }) form: string | undefined;\n @Prop({ reflect: true }) disabled: boolean = false;\n /** Keeps the value focusable and submittable while preventing edits. */\n @Prop({ reflect: true }) readOnly: boolean = false;\n @Prop({ reflect: true }) required: boolean = false;\n @Prop() requiredMessage: string = DEFAULT_REQUIRED_MESSAGE;\n @Prop() placeholder: string | undefined;\n /** Visible text rows before the field scrolls. */\n @Prop() rows: number = 4;\n /** Whether the user can resize the field vertically. */\n @Prop() resize: TextareaResize = 'vertical';\n /** Native browser autofill hint. */\n @Prop({ attribute: 'autocomplete' }) autoComplete: string | undefined;\n /** Preferred virtual keyboard without changing the value semantics. */\n @Prop({ attribute: 'inputmode' }) inputMode: string = '';\n /** Preferred virtual-keyboard action label. */\n @Prop({ attribute: 'enterkeyhint' }) enterKeyHint: string = '';\n /** Whether the browser should check spelling and grammar. */\n @Prop({ attribute: 'spellcheck' }) spellCheck: boolean = true;\n /** Control density for typography and inset spacing. */\n @Prop() size: TextareaSize = 'md';\n /** Width fit — fill the parent (default) or hug the available content. */\n @Prop() width: TextareaWidth = 'fill';\n /** Show the standard inset border, including focused and invalid strokes. */\n @Prop() hasBorder: boolean = true;\n /** Show the standard hover and pressed fill when the field is not embedded in interactive chrome. */\n @Prop() hasInteractionFill: boolean = true;\n @Prop() isInactive: boolean = false;\n @Prop() autoFocus: boolean = false;\n @Prop() error: boolean = false;\n @Prop() errorMessage: string | undefined;\n /** Associates the internal textarea with an external <label>. */\n @Prop() inputId: string | undefined;\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n @Prop({ attribute: 'aria-describedby' }) ariaDescribedby: string | undefined;\n\n @Event() dsChange!: EventEmitter<string>;\n\n private initialValue = '';\n private textareaEl?: HTMLTextAreaElement;\n @State() private formDisabled = false;\n @State() private focused = false;\n @State() private touched = false;\n\n componentWillLoad() {\n this.initialValue = this.value;\n this.syncFormValue();\n }\n\n @Watch('value')\n @Watch('disabled')\n @Watch('isInactive')\n @Watch('required')\n syncFormValue() {\n const inactive = this.isInactive || this.disabled || this.formDisabled;\n setFormControlValue(this.internals, this.value, { inactive });\n const missing = this.required && !inactive && this.value.length === 0;\n setRequiredValidity(this.internals, missing, this.requiredMessage);\n }\n\n formDisabledCallback(disabled: boolean) {\n this.formDisabled = disabled;\n this.syncFormValue();\n }\n\n formResetCallback() {\n this.value = this.initialValue;\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n this.value = restoreStringFormState(state);\n }\n\n @Method()\n async setFocus() {\n this.textareaEl?.focus();\n }\n\n private handleInput = (event: Event) => {\n this.value = (event.target as HTMLTextAreaElement).value;\n this.dsChange.emit(this.value);\n };\n\n private handleFocus = () => {\n this.focused = true;\n };\n\n private handleBlur = () => {\n this.focused = false;\n this.touched = true;\n };\n\n render() {\n const inputId = this.inputId ?? this.generatedId;\n const inactive = this.isInactive || this.disabled || this.formDisabled;\n const filled = this.value.length > 0;\n const dirty = this.value !== this.initialValue;\n const showError = this.error && Boolean(this.errorMessage);\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const rows = Number.isFinite(this.rows) ? Math.max(1, Math.floor(this.rows)) : 4;\n const describedBy =\n [this.ariaDescribedby, showError ? this.errorId : undefined].filter(Boolean).join(' ') ||\n undefined;\n\n return (\n <Host\n class={{\n 'textarea-host': true,\n 'ds-field-stack': true,\n 'ds-field-stack--supporting-inset': !this.hasBorder,\n 'ds-control-inactive': inactive,\n [`ds-control--${this.size}`]: true,\n ...controlWidthClass(this.width),\n }}\n data-disabled={inactive ? '' : undefined}\n data-readonly={this.readOnly ? '' : undefined}\n data-required={this.required ? '' : undefined}\n data-invalid={this.error ? '' : undefined}\n data-filled={filled ? '' : undefined}\n data-focused={this.focused ? '' : undefined}\n data-dirty={dirty ? '' : undefined}\n data-touched={this.touched ? '' : undefined}\n >\n <div\n class={{\n 'textarea-control': true,\n 'textarea-control--resizable': this.resize === 'vertical',\n 'textarea-control--bordered': this.hasBorder,\n 'textarea-control--error': this.hasBorder && this.error,\n 'ds-interaction-fill': this.hasInteractionFill,\n [`ds-control--${this.size}`]: true,\n }}\n >\n <textarea\n ref={element => {\n this.textareaEl = element;\n }}\n id={inputId}\n value={this.value}\n placeholder={this.placeholder}\n rows={rows}\n disabled={inactive}\n readOnly={this.readOnly}\n required={this.required}\n autoFocus={this.autoFocus}\n autoComplete={this.autoComplete}\n inputMode={this.inputMode || undefined}\n enterKeyHint={this.enterKeyHint || undefined}\n spellcheck={this.spellCheck}\n class={`native-textarea native-textarea--resize-${this.resize} ds-text--${textVariant.replace('text-', '')} ds-text--regular ds-interaction-fill__content`}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-describedby={describedBy}\n aria-invalid={this.error ? 'true' : undefined}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n </div>\n {showError && (\n <ds-text\n class=\"error-text\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {this.errorMessage}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n",
|
|
700
|
+
"content": "import {\n AttachInternals,\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n controlWidthClass,\n CONTROL_TEXT_VARIANT,\n DEFAULT_REQUIRED_MESSAGE,\n restoreStringFormState,\n setFormControlValue,\n type ControlWidth,\n} from '../../utils';\n\nimport { lengthLimit, textConstraintValidity } from '../../utils/text-constraints';\n\nexport type TextareaSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type TextareaWidth = ControlWidth;\nexport type TextareaResize = 'vertical' | 'none';\n\nlet idCounter = 0;\n\n@Component({\n tag: 'ds-textarea',\n styleUrl: 'Textarea.css',\n scoped: true,\n formAssociated: true,\n})\nexport class Textarea {\n @Element() el!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n private generatedId = `ds-textarea-${++idCounter}`;\n private errorId = `${this.generatedId}-error`;\n\n @Prop({ mutable: true }) value: string = '';\n @Prop({ reflect: true }) name: string | undefined;\n @Prop({ reflect: true }) form: string | undefined;\n @Prop({ reflect: true }) disabled: boolean = false;\n /** Keeps the value focusable and submittable while preventing edits. */\n @Prop({ reflect: true }) readOnly: boolean = false;\n @Prop({ reflect: true }) required: boolean = false;\n @Prop() requiredMessage: string = DEFAULT_REQUIRED_MESSAGE;\n /** Minimum non-empty text length, in native UTF-16 code units. */\n @Prop() minLength: number | undefined;\n /** Maximum text length. A visible counter accompanies this constraint by default. */\n @Prop() maxLength: number | undefined;\n /** Error preserves extra text; restrict uses the browser's hard input limit. */\n @Prop() lengthBehavior: 'error' | 'restrict' = 'error';\n @Prop() showCharacterCount: boolean = true;\n @Prop() placeholder: string | undefined;\n /** Visible text rows before the field scrolls. */\n @Prop() rows: number = 4;\n /** Whether the user can resize the field vertically. */\n @Prop() resize: TextareaResize = 'vertical';\n /** Native browser autofill hint. */\n @Prop({ attribute: 'autocomplete' }) autoComplete: string | undefined;\n /** Preferred virtual keyboard without changing the value semantics. */\n @Prop({ attribute: 'inputmode' }) inputMode: string = '';\n /** Preferred virtual-keyboard action label. */\n @Prop({ attribute: 'enterkeyhint' }) enterKeyHint: string = '';\n /** Whether the browser should check spelling and grammar. */\n @Prop({ attribute: 'spellcheck' }) spellCheck: boolean = true;\n /** Control density for typography and inset spacing. */\n @Prop() size: TextareaSize = 'md';\n /** Width fit — fill the parent (default) or hug the available content. */\n @Prop() width: TextareaWidth = 'fill';\n /** Show the standard inset border, including focused and invalid strokes. */\n @Prop() hasBorder: boolean = true;\n /** Show the standard hover and pressed fill when the field is not embedded in interactive chrome. */\n @Prop() hasInteractionFill: boolean = true;\n @Prop() isInactive: boolean = false;\n @Prop() autoFocus: boolean = false;\n @Prop() error: boolean = false;\n @Prop() errorMessage: string | undefined;\n /** Associates the internal textarea with an external <label>. */\n @Prop() inputId: string | undefined;\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n @Prop({ attribute: 'aria-labelledby' }) ariaLabelledby: string | undefined;\n @Prop({ attribute: 'aria-describedby' }) ariaDescribedby: string | undefined;\n\n @Event() dsChange!: EventEmitter<string>;\n\n @State() private constraintMessage = '';\n @State() private submitted = false;\n private get managedByField(): boolean {\n return Boolean(this.el.closest('ds-field'));\n }\n private get visibleConstraintMessage(): string {\n return this.touched ||\n this.submitted ||\n (this.maxLength !== undefined && this.value.length > this.maxLength)\n ? this.constraintMessage\n : '';\n }\n private get hasCounter(): boolean {\n return this.showCharacterCount && lengthLimit(this.maxLength) !== undefined;\n }\n\n private initialValue = '';\n private textareaEl?: HTMLTextAreaElement;\n @State() private formDisabled = false;\n @State() private focused = false;\n @State() private touched = false;\n\n componentWillLoad() {\n this.initialValue = this.value;\n this.syncFormValue();\n }\n\n @Watch('value')\n @Watch('disabled')\n @Watch('isInactive')\n @Watch('required')\n @Watch('readOnly')\n @Watch('minLength')\n @Watch('maxLength')\n @Watch('requiredMessage')\n syncFormValue() {\n const inactive = this.isInactive || this.disabled || this.formDisabled;\n setFormControlValue(this.internals, this.value, { inactive });\n const validity =\n inactive || this.readOnly ? { flags: {}, message: '' } : textConstraintValidity(this);\n this.constraintMessage = validity.message;\n this.internals.setValidity(validity.flags, validity.message);\n }\n\n formDisabledCallback(disabled: boolean) {\n this.formDisabled = disabled;\n this.syncFormValue();\n }\n\n formResetCallback() {\n this.value = this.initialValue;\n this.touched = false;\n this.submitted = false;\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n this.value = restoreStringFormState(state);\n }\n\n @Method()\n async setFocus() {\n this.textareaEl?.focus();\n }\n\n private handleInput = (event: Event) => {\n this.value = (event.target as HTMLTextAreaElement).value;\n this.dsChange.emit(this.value);\n };\n\n private handleFocus = () => {\n this.focused = true;\n };\n\n private handleBlur = () => {\n this.focused = false;\n this.touched = true;\n };\n\n render() {\n const inputId = this.inputId ?? this.generatedId;\n const inactive = this.isInactive || this.disabled || this.formDisabled;\n const filled = this.value.length > 0;\n const dirty = this.value !== this.initialValue;\n const message =\n this.error && this.errorMessage ? this.errorMessage : this.visibleConstraintMessage;\n const invalid = this.error || Boolean(this.visibleConstraintMessage);\n const showError = Boolean(message) && !this.managedByField;\n const showCounter = this.hasCounter && !this.managedByField;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const rows = Number.isFinite(this.rows) ? Math.max(1, Math.floor(this.rows)) : 4;\n const describedBy =\n [\n this.ariaDescribedby,\n showError ? this.errorId : undefined,\n showCounter ? `${this.generatedId}-count` : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <Host\n class={{\n 'textarea-host': true,\n 'ds-field-stack': true,\n 'ds-field-stack--supporting-inset': !this.hasBorder,\n 'ds-control-inactive': inactive,\n [`ds-control--${this.size}`]: true,\n ...controlWidthClass(this.width),\n }}\n data-disabled={inactive ? '' : undefined}\n data-readonly={this.readOnly ? '' : undefined}\n data-required={this.required ? '' : undefined}\n data-invalid={invalid ? '' : undefined}\n data-constraint-message={this.visibleConstraintMessage || undefined}\n data-character-count={this.hasCounter ? String(this.value.length) : undefined}\n data-character-limit={this.hasCounter ? String(lengthLimit(this.maxLength)) : undefined}\n onInvalid={() => {\n this.submitted = true;\n }}\n data-filled={filled ? '' : undefined}\n data-focused={this.focused ? '' : undefined}\n data-dirty={dirty ? '' : undefined}\n data-touched={this.touched ? '' : undefined}\n >\n <div\n class={{\n 'textarea-control': true,\n 'textarea-control--resizable': this.resize === 'vertical',\n 'textarea-control--bordered': this.hasBorder,\n 'textarea-control--error': this.hasBorder && invalid,\n 'ds-interaction-fill': this.hasInteractionFill,\n [`ds-control--${this.size}`]: true,\n }}\n >\n <textarea\n ref={element => {\n this.textareaEl = element;\n }}\n id={inputId}\n value={this.value}\n placeholder={this.placeholder}\n rows={rows}\n disabled={inactive}\n readOnly={this.readOnly}\n required={this.required}\n minLength={lengthLimit(this.minLength)}\n maxLength={this.lengthBehavior === 'restrict' ? lengthLimit(this.maxLength) : undefined}\n autoFocus={this.autoFocus}\n autoComplete={this.autoComplete}\n inputMode={this.inputMode || undefined}\n enterKeyHint={this.enterKeyHint || undefined}\n spellcheck={this.spellCheck}\n class={`native-textarea native-textarea--resize-${this.resize} ds-text--${textVariant.replace('text-', '')} ds-text--regular ds-interaction-fill__content`}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-describedby={describedBy}\n aria-invalid={invalid ? 'true' : undefined}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n </div>\n {(showError || showCounter) && (\n <div class=\"text-field-support\">\n {showError && (\n <ds-text\n class=\"error-text\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {message}\n </ds-text>\n )}\n {showCounter && (\n <ds-text\n as=\"span\"\n class=\"text-field-count\"\n variant=\"text-body-small\"\n color={invalid ? 'negative' : 'secondary'}\n textId={`${this.generatedId}-count`}\n >\n {this.value.length}/{lengthLimit(this.maxLength)}\n </ds-text>\n )}\n </div>\n )}\n </Host>\n );\n }\n}\n",
|
|
634
701
|
"type": "registry:ui"
|
|
635
702
|
}
|
|
636
703
|
]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "time-picker",
|
|
4
4
|
"title": "TimePicker",
|
|
5
|
-
"description": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
|
|
5
|
+
"description": "Bounded 12- or 24-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
|
|
6
6
|
"type": "registry:ui",
|
|
7
7
|
"meta": {
|
|
8
8
|
"library": "@ds-mo/ui",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"intent": {
|
|
14
14
|
"audience": "general",
|
|
15
15
|
"status": "stable",
|
|
16
|
-
"summary": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
|
|
16
|
+
"summary": "Bounded 12- or 24-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
|
|
17
17
|
"useWhen": [
|
|
18
18
|
"A user picks a clock time from hour, minute, and AM/PM lists.",
|
|
19
19
|
"A time field needs 32px clock tiles that match calendar day geometry and the shared choice-list selected treatment."
|
|
@@ -41,13 +41,14 @@
|
|
|
41
41
|
],
|
|
42
42
|
"accessibility": [
|
|
43
43
|
"Hour, minute, and AM/PM are separate labelled listboxes without visible column headings. Each list keeps one tab stop on the selected option.",
|
|
44
|
-
"Arrow keys move to the next or previous option and stop at the first and last values; they do not wrap. Home and End jump to those ends. Left and Right move between columns and stop at
|
|
44
|
+
"Arrow keys move to the next or previous option and stop at the first and last values; they do not wrap. Home and End jump to those ends. Left and Right move between columns and stop at the first and last visible columns.",
|
|
45
45
|
"Inactive pickers disable every option. Optional min and max times disable combinations outside that inclusive bound."
|
|
46
46
|
],
|
|
47
47
|
"states": [
|
|
48
48
|
"Selected hour, minute, and period tiles use the shared interaction-fill selected wash and primary text. Resting tiles use secondary text on a transparent 32px square.",
|
|
49
|
-
"Lists are finite.
|
|
50
|
-
"An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state."
|
|
49
|
+
"Lists are finite. Hours follow the selected clock format, minutes follow the step, and the twelve-hour period list has two values. Scrolling and keyboard movement stop at those ends instead of looping.",
|
|
50
|
+
"An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state.",
|
|
51
|
+
"The default twelve-hour presentation includes AM/PM. Twenty-four-hour presentation uses hours 00–23 and omits the period column; both keep HH:MM form values and the same time bounds."
|
|
51
52
|
],
|
|
52
53
|
"responsiveBehavior": [
|
|
53
54
|
"The three columns fill the width supplied by the owner. Tile size, 4px gaps, and the seven-tile list viewport are owned here; the owner supplies the popup or pane width."
|
|
@@ -91,6 +92,15 @@
|
|
|
91
92
|
"mutable": false,
|
|
92
93
|
"description": "Move keyboard focus into the hour list after the picker is rendered."
|
|
93
94
|
},
|
|
95
|
+
"hourFormat": {
|
|
96
|
+
"type": "'12' | '24'",
|
|
97
|
+
"resolvedType": "\"12\" | \"24\"",
|
|
98
|
+
"attribute": "hour-format",
|
|
99
|
+
"default": "'12'",
|
|
100
|
+
"required": false,
|
|
101
|
+
"mutable": false,
|
|
102
|
+
"description": "Display 12-hour lists with AM/PM or a 24-hour clock. Stored values remain HH:MM."
|
|
103
|
+
},
|
|
94
104
|
"isInactive": {
|
|
95
105
|
"type": "boolean",
|
|
96
106
|
"resolvedType": "boolean",
|
|
@@ -159,6 +169,15 @@
|
|
|
159
169
|
"mutable": false,
|
|
160
170
|
"description": "Move keyboard focus into the hour list after the picker is rendered."
|
|
161
171
|
},
|
|
172
|
+
"hourFormat": {
|
|
173
|
+
"type": "'12' | '24'",
|
|
174
|
+
"resolvedType": "\"12\" | \"24\"",
|
|
175
|
+
"attribute": "hour-format",
|
|
176
|
+
"default": "'12'",
|
|
177
|
+
"required": false,
|
|
178
|
+
"mutable": false,
|
|
179
|
+
"description": "Display 12-hour lists with AM/PM or a 24-hour clock. Stored values remain HH:MM."
|
|
180
|
+
},
|
|
162
181
|
"isInactive": {
|
|
163
182
|
"type": "boolean",
|
|
164
183
|
"resolvedType": "boolean",
|
|
@@ -243,8 +262,8 @@
|
|
|
243
262
|
},
|
|
244
263
|
"peerDependencies": {
|
|
245
264
|
"required": [
|
|
246
|
-
"@ds-mo/tokens ^6.
|
|
247
|
-
"@ds-mo/icons ^8.1.
|
|
265
|
+
"@ds-mo/tokens ^6.6.1",
|
|
266
|
+
"@ds-mo/icons ^8.1.1"
|
|
248
267
|
],
|
|
249
268
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
250
269
|
}
|
|
@@ -260,12 +279,12 @@
|
|
|
260
279
|
"files": [
|
|
261
280
|
{
|
|
262
281
|
"path": "src/wc/components/TimePicker/TimePicker.css",
|
|
263
|
-
"content": "@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n display: flex;\n min-height: 0;\n flex-direction: column;\n}\n\n.time-picker {\n display: grid;\n grid-template-columns: repeat(3, minmax(var(--dimension-size-400), 1fr));\n column-gap: var(--dimension-space-050);\n min-width: calc(\n (var(--dimension-size-400) * 3) + (var(--dimension-space-050) * 2) +\n (var(--ds-time-picker-padding, var(--dimension-space-100)) * 2)\n );\n padding: var(--ds-time-picker-padding, var(--dimension-space-100));\n}\n\n.time-picker__column {\n display: flex;\n min-width: 0;\n flex-direction: column;\n}\n\n.time-picker__list {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n max-height: calc((var(--dimension-size-400) * 7) + (var(--dimension-space-050) * 6));\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.time-picker-tile {\n appearance: none;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n min-width: 0;\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: var(--color-foreground-primary);\n cursor: default;\n}\n\n.time-picker-tile:disabled {\n cursor: not-allowed;\n}\n",
|
|
282
|
+
"content": "@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n display: flex;\n min-height: 0;\n flex-direction: column;\n}\n\n.time-picker {\n display: grid;\n grid-template-columns: repeat(3, minmax(var(--dimension-size-400), 1fr));\n column-gap: var(--dimension-space-050);\n min-width: calc(\n (var(--dimension-size-400) * 3) + (var(--dimension-space-050) * 2) +\n (var(--ds-time-picker-padding, var(--dimension-space-100)) * 2)\n );\n padding: var(--ds-time-picker-padding, var(--dimension-space-100));\n}\n\n.time-picker__column {\n display: flex;\n min-width: 0;\n flex-direction: column;\n}\n\n.time-picker__list {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n max-height: calc((var(--dimension-size-400) * 7) + (var(--dimension-space-050) * 6));\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.time-picker-tile {\n appearance: none;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n min-width: 0;\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: var(--color-foreground-primary);\n cursor: default;\n}\n\n.time-picker-tile:disabled {\n cursor: not-allowed;\n}\n\n.time-picker--24 {\n grid-template-columns: repeat(2, minmax(var(--dimension-size-400), 1fr));\n min-width: calc(\n var(--dimension-size-400) * 2 + var(--dimension-space-050) +\n var(--ds-time-picker-padding, var(--dimension-space-100)) * 2\n );\n}\n",
|
|
264
283
|
"type": "registry:ui"
|
|
265
284
|
},
|
|
266
285
|
{
|
|
267
286
|
"path": "src/wc/components/TimePicker/TimePicker.tsx",
|
|
268
|
-
"content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n CLOCK_HOURS,\n CLOCK_PERIODS,\n clockMinuteStep,\n clockMinutes,\n isClockTimeStepAligned,\n isClockTimeOutOfRange,\n joinClockTime,\n splitClockTime,\n stepBoundedIndex,\n type ClockPeriod,\n type ClockTimeParts,\n} from '../../utils';\n\ntype TimePickerColumn = 'hour' | 'minute' | 'period';\n\n@Component({\n tag: 'ds-time-picker',\n styleUrl: 'TimePicker.css',\n scoped: true,\n})\nexport class TimePicker {\n @Element() el!: HTMLElement;\n\n /** Clock value as `HH:MM`. */\n @Prop() value: string = '';\n @Prop() min: string | undefined;\n @Prop() max: string | undefined;\n /** Native time step in seconds. Defaults to minutes (`60`). */\n @Prop() step: string | number = 60;\n @Prop() isInactive: boolean = false;\n /** Move keyboard focus into the hour list after the picker is rendered. */\n @Prop() autoFocus: boolean = false;\n\n @Event() dsChange!: EventEmitter<string>;\n\n componentDidLoad() {\n this.scrollSelectedIntoView();\n if (this.autoFocus) void this.setFocus();\n }\n\n @Watch('value')\n onValueChange() {\n this.scrollSelectedIntoView();\n }\n\n @Method()\n async setFocus() {\n this.focusColumn('hour', CLOCK_HOURS);\n }\n\n private parts(): ClockTimeParts {\n return splitClockTime(this.value) ?? { hour12: 12, minute: 0, period: 'AM' };\n }\n\n private minutes(): number[] {\n const minimum = this.min ? splitClockTime(this.min) : null;\n return clockMinutes(clockMinuteStep(this.step), minimum?.minute ?? 0);\n }\n\n private isDisabledTime(iso: string): boolean {\n if (this.isInactive) return true;\n return (\n isClockTimeOutOfRange(iso, this.min, this.max) ||\n !isClockTimeStepAligned(iso, this.step, this.min)\n );\n }\n\n private optionParts(\n column: TimePickerColumn,\n value: number | ClockPeriod\n ): Partial<ClockTimeParts> {\n return column === 'hour'\n ? { hour12: value as number }\n : column === 'minute'\n ? { minute: value as number }\n : { period: value as ClockPeriod };\n }\n\n private isDisabledPart(column: TimePickerColumn, next: Partial<ClockTimeParts>): boolean {\n if (this.isInactive) return true;\n\n const current = { ...this.parts(), ...next };\n const hours: ReadonlyArray<number> = column === 'hour' ? [current.hour12] : CLOCK_HOURS;\n const minutes: ReadonlyArray<number> = column === 'minute' ? [current.minute] : this.minutes();\n const periods: ReadonlyArray<ClockPeriod> =\n column === 'period' ? [current.period] : CLOCK_PERIODS;\n\n return !hours.some(hour =>\n minutes.some(minute =>\n periods.some(\n period => !this.isDisabledTime(joinClockTime({ hour12: hour, minute, period }))\n )\n )\n );\n }\n\n private orderedValues<T>(current: T, values: ReadonlyArray<T>): T[] {\n return [current, ...values.filter(value => value !== current)];\n }\n\n private commit(column: TimePickerColumn, next: Partial<ClockTimeParts>) {\n const current = { ...this.parts(), ...next };\n const hours =\n column === 'hour' ? [current.hour12] : this.orderedValues(current.hour12, CLOCK_HOURS);\n const minutes =\n column === 'minute' ? [current.minute] : this.orderedValues(current.minute, this.minutes());\n const periods =\n column === 'period' ? [current.period] : this.orderedValues(current.period, CLOCK_PERIODS);\n\n for (const hour of hours) {\n for (const minute of minutes) {\n for (const period of periods) {\n const iso = joinClockTime({ hour12: hour, minute, period });\n if (!this.isDisabledTime(iso)) {\n this.dsChange.emit(iso);\n return;\n }\n }\n }\n }\n }\n\n private optionEl(column: TimePickerColumn, value: number | ClockPeriod): HTMLElement | null {\n return this.el.querySelector<HTMLElement>(`[data-${column}-option=\"${value}\"]`);\n }\n\n private scrollSelectedIntoView() {\n const parts = this.parts();\n this.optionEl('hour', parts.hour12)?.scrollIntoView({ block: 'nearest' });\n this.optionEl('minute', parts.minute)?.scrollIntoView({ block: 'nearest' });\n this.optionEl('period', parts.period)?.scrollIntoView({ block: 'nearest' });\n }\n\n private focusOption(column: TimePickerColumn, value: number | ClockPeriod) {\n requestAnimationFrame(() => {\n this.optionEl(column, value)?.focus();\n });\n }\n\n private focusValue(\n column: TimePickerColumn,\n values: ReadonlyArray<number | ClockPeriod>\n ): number | ClockPeriod | undefined {\n const current = this.parts();\n const currentValue =\n column === 'hour' ? current.hour12 : column === 'minute' ? current.minute : current.period;\n if (!this.isDisabledPart(column, this.optionParts(column, currentValue))) return currentValue;\n return values.find(value => !this.isDisabledPart(column, this.optionParts(column, value)));\n }\n\n private focusColumn(column: TimePickerColumn, values: ReadonlyArray<number | ClockPeriod>): void {\n const value = this.focusValue(column, values);\n if (value !== undefined) this.optionEl(column, value)?.focus();\n }\n\n private handleColumnKeyDown = (\n event: KeyboardEvent,\n column: TimePickerColumn,\n values: ReadonlyArray<number | ClockPeriod>,\n current: number | ClockPeriod\n ) => {\n const columns: TimePickerColumn[] = ['hour', 'minute', 'period'];\n const columnIndex = columns.indexOf(column);\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n const nextColumn =\n columns[stepBoundedIndex(columnIndex, event.key === 'ArrowLeft' ? -1 : 1, columns.length)];\n if (!nextColumn || nextColumn === column) {\n event.preventDefault();\n return;\n }\n event.preventDefault();\n const nextValues =\n nextColumn === 'hour'\n ? CLOCK_HOURS\n : nextColumn === 'minute'\n ? this.minutes()\n : CLOCK_PERIODS;\n const nextValue = this.focusValue(nextColumn, nextValues);\n if (nextValue !== undefined) this.focusOption(nextColumn, nextValue);\n return;\n }\n\n let offset: number | null = null;\n if (event.key === 'ArrowUp') offset = -1;\n else if (event.key === 'ArrowDown') offset = 1;\n else if (event.key === 'Home' || event.key === 'End') offset = 0;\n if (offset === null) return;\n event.preventDefault();\n let next: number | ClockPeriod | undefined;\n if (event.key === 'Home') {\n next = values.find(value => !this.isDisabledPart(column, this.optionParts(column, value)));\n } else if (event.key === 'End') {\n for (let index = values.length - 1; index >= 0; index -= 1) {\n const value = values[index];\n if (value !== undefined && !this.isDisabledPart(column, this.optionParts(column, value))) {\n next = value;\n break;\n }\n }\n } else {\n const direction = offset;\n let index = values.indexOf(current);\n if (index < 0) index = direction > 0 ? -1 : values.length;\n for (\n let candidate = index + direction;\n candidate >= 0 && candidate < values.length;\n candidate += direction\n ) {\n const value = values[candidate];\n if (value !== undefined && !this.isDisabledPart(column, this.optionParts(column, value))) {\n next = value;\n break;\n }\n }\n }\n if (next === undefined) return;\n this.focusOption(column, next);\n };\n\n private renderTile(\n column: TimePickerColumn,\n value: number | ClockPeriod,\n selected: boolean,\n focused: boolean,\n label: string,\n values: ReadonlyArray<number | ClockPeriod>\n ) {\n const next = this.optionParts(column, value);\n const disabled = this.isDisabledPart(column, next);\n return (\n <button\n type=\"button\"\n role=\"option\"\n data-hour-option={column === 'hour' ? String(value) : undefined}\n data-minute-option={column === 'minute' ? String(value) : undefined}\n data-period-option={column === 'period' ? String(value) : undefined}\n class={{\n 'time-picker-tile': true,\n 'time-picker-tile--selected': selected,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': !disabled,\n 'ds-interaction-fill--selected': selected && !disabled,\n }}\n disabled={disabled}\n aria-selected={selected ? 'true' : 'false'}\n tabIndex={focused ? 0 : -1}\n onClick={() => this.commit(column, next)}\n onKeyDown={event => this.handleColumnKeyDown(event, column, values, value)}\n >\n <ds-text\n class=\"ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={selected ? 'primary' : 'secondary'}\n >\n {label}\n </ds-text>\n </button>\n );\n }\n\n render() {\n const parts = this.parts();\n const minutes = this.minutes();\n const minuteValues = minutes.includes(parts.minute)\n ? minutes\n : [...minutes, parts.minute].sort((a, b) => a - b);\n const hourFocus = this.focusValue('hour', CLOCK_HOURS);\n const minuteFocus = this.focusValue('minute', minuteValues);\n const periodFocus = this.focusValue('period', CLOCK_PERIODS);\n\n return (\n <Host>\n <div class=\"time-picker\" role=\"group\" aria-label=\"Choose time\">\n <div class=\"time-picker__column\">\n <div class=\"time-picker__list\" role=\"listbox\" aria-label=\"Hour\">\n {CLOCK_HOURS.map(hour =>\n this.renderTile(\n 'hour',\n hour,\n hour === parts.hour12,\n hour === hourFocus,\n String(hour),\n CLOCK_HOURS\n )\n )}\n </div>\n </div>\n <div class=\"time-picker__column\">\n <div class=\"time-picker__list\" role=\"listbox\" aria-label=\"Minute\">\n {minuteValues.map(minute =>\n this.renderTile(\n 'minute',\n minute,\n minute === parts.minute,\n minute === minuteFocus,\n String(minute).padStart(2, '0'),\n minuteValues\n )\n )}\n </div>\n </div>\n <div class=\"time-picker__column\">\n <div class=\"time-picker__list\" role=\"listbox\" aria-label=\"AM/PM\">\n {CLOCK_PERIODS.map(period =>\n this.renderTile(\n 'period',\n period,\n period === parts.period,\n period === periodFocus,\n period,\n CLOCK_PERIODS\n )\n )}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n",
|
|
287
|
+
"content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n CLOCK_HOURS,\n CLOCK_PERIODS,\n clockMinuteStep,\n clockMinutes,\n isClockTimeStepAligned,\n isClockTimeOutOfRange,\n joinClockTime,\n splitClockTime,\n stepBoundedIndex,\n type ClockPeriod,\n type ClockTimeParts,\n} from '../../utils';\n\nconst HOURS_24 = Array.from({ length: 24 }, (_, hour) => hour);\n\ntype TimePickerColumn = 'hour' | 'minute' | 'period';\n\n@Component({\n tag: 'ds-time-picker',\n styleUrl: 'TimePicker.css',\n scoped: true,\n})\nexport class TimePicker {\n @Element() el!: HTMLElement;\n\n /** Clock value as `HH:MM`. */\n @Prop() value: string = '';\n /** Display 12-hour lists with AM/PM or a 24-hour clock. Stored values remain HH:MM. */\n @Prop() hourFormat: '12' | '24' = '12';\n @Prop() min: string | undefined;\n @Prop() max: string | undefined;\n /** Native time step in seconds. Defaults to minutes (`60`). */\n @Prop() step: string | number = 60;\n @Prop() isInactive: boolean = false;\n /** Move keyboard focus into the hour list after the picker is rendered. */\n @Prop() autoFocus: boolean = false;\n\n @Event() dsChange!: EventEmitter<string>;\n\n componentDidLoad() {\n this.scrollSelectedIntoView();\n if (this.autoFocus) void this.setFocus();\n }\n\n @Watch('value')\n @Watch('hourFormat')\n onValueChange() {\n this.scrollSelectedIntoView();\n }\n\n @Method()\n async setFocus() {\n this.focusColumn('hour', this.hours());\n }\n\n private parts(): ClockTimeParts {\n return splitClockTime(this.value) ?? { hour12: 12, minute: 0, period: 'AM' };\n }\n\n private hours(): readonly number[] {\n return this.hourFormat === '24' ? HOURS_24 : CLOCK_HOURS;\n }\n\n private displayHour(): number {\n const parts = this.parts();\n return this.hourFormat === '24'\n ? (parts.hour12 % 12) + (parts.period === 'PM' ? 12 : 0)\n : parts.hour12;\n }\n\n private minutes(): number[] {\n const minimum = this.min ? splitClockTime(this.min) : null;\n return clockMinutes(clockMinuteStep(this.step), minimum?.minute ?? 0);\n }\n\n private isDisabledTime(iso: string): boolean {\n if (this.isInactive) return true;\n return (\n isClockTimeOutOfRange(iso, this.min, this.max) ||\n !isClockTimeStepAligned(iso, this.step, this.min)\n );\n }\n\n private optionParts(\n column: TimePickerColumn,\n value: number | ClockPeriod\n ): Partial<ClockTimeParts> {\n return column === 'hour'\n ? this.hourFormat === '24'\n ? { hour12: Number(value) % 12 || 12, period: Number(value) >= 12 ? 'PM' : 'AM' }\n : { hour12: value as number }\n : column === 'minute'\n ? { minute: value as number }\n : { period: value as ClockPeriod };\n }\n\n private isDisabledPart(column: TimePickerColumn, next: Partial<ClockTimeParts>): boolean {\n if (this.isInactive) return true;\n\n const current = { ...this.parts(), ...next };\n const hours: ReadonlyArray<number> = column === 'hour' ? [current.hour12] : CLOCK_HOURS;\n const minutes: ReadonlyArray<number> = column === 'minute' ? [current.minute] : this.minutes();\n const periods: ReadonlyArray<ClockPeriod> =\n column === 'period' || (column === 'hour' && this.hourFormat === '24')\n ? [current.period]\n : CLOCK_PERIODS;\n\n return !hours.some(hour =>\n minutes.some(minute =>\n periods.some(\n period => !this.isDisabledTime(joinClockTime({ hour12: hour, minute, period }))\n )\n )\n );\n }\n\n private orderedValues<T>(current: T, values: ReadonlyArray<T>): T[] {\n return [current, ...values.filter(value => value !== current)];\n }\n\n private commit(column: TimePickerColumn, next: Partial<ClockTimeParts>) {\n const current = { ...this.parts(), ...next };\n const hours =\n column === 'hour' ? [current.hour12] : this.orderedValues(current.hour12, CLOCK_HOURS);\n const minutes =\n column === 'minute' ? [current.minute] : this.orderedValues(current.minute, this.minutes());\n const periods =\n column === 'period' || (column === 'hour' && this.hourFormat === '24')\n ? [current.period]\n : this.orderedValues(current.period, CLOCK_PERIODS);\n\n for (const hour of hours) {\n for (const minute of minutes) {\n for (const period of periods) {\n const iso = joinClockTime({ hour12: hour, minute, period });\n if (!this.isDisabledTime(iso)) {\n this.dsChange.emit(iso);\n return;\n }\n }\n }\n }\n }\n\n private optionEl(column: TimePickerColumn, value: number | ClockPeriod): HTMLElement | null {\n return this.el.querySelector<HTMLElement>(`[data-${column}-option=\"${value}\"]`);\n }\n\n private scrollSelectedIntoView() {\n const parts = this.parts();\n this.optionEl('hour', this.displayHour())?.scrollIntoView({ block: 'nearest' });\n this.optionEl('minute', parts.minute)?.scrollIntoView({ block: 'nearest' });\n this.optionEl('period', parts.period)?.scrollIntoView({ block: 'nearest' });\n }\n\n private focusOption(column: TimePickerColumn, value: number | ClockPeriod) {\n requestAnimationFrame(() => {\n this.optionEl(column, value)?.focus();\n });\n }\n\n private focusValue(\n column: TimePickerColumn,\n values: ReadonlyArray<number | ClockPeriod>\n ): number | ClockPeriod | undefined {\n const current = this.parts();\n const currentValue =\n column === 'hour'\n ? this.displayHour()\n : column === 'minute'\n ? current.minute\n : current.period;\n if (!this.isDisabledPart(column, this.optionParts(column, currentValue))) return currentValue;\n return values.find(value => !this.isDisabledPart(column, this.optionParts(column, value)));\n }\n\n private focusColumn(column: TimePickerColumn, values: ReadonlyArray<number | ClockPeriod>): void {\n const value = this.focusValue(column, values);\n if (value !== undefined) this.optionEl(column, value)?.focus();\n }\n\n private handleColumnKeyDown = (\n event: KeyboardEvent,\n column: TimePickerColumn,\n values: ReadonlyArray<number | ClockPeriod>,\n current: number | ClockPeriod\n ) => {\n const columns: TimePickerColumn[] =\n this.hourFormat === '24' ? ['hour', 'minute'] : ['hour', 'minute', 'period'];\n const columnIndex = columns.indexOf(column);\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n const nextColumn =\n columns[stepBoundedIndex(columnIndex, event.key === 'ArrowLeft' ? -1 : 1, columns.length)];\n if (!nextColumn || nextColumn === column) {\n event.preventDefault();\n return;\n }\n event.preventDefault();\n const nextValues =\n nextColumn === 'hour'\n ? this.hours()\n : nextColumn === 'minute'\n ? this.minutes()\n : CLOCK_PERIODS;\n const nextValue = this.focusValue(nextColumn, nextValues);\n if (nextValue !== undefined) this.focusOption(nextColumn, nextValue);\n return;\n }\n\n let offset: number | null = null;\n if (event.key === 'ArrowUp') offset = -1;\n else if (event.key === 'ArrowDown') offset = 1;\n else if (event.key === 'Home' || event.key === 'End') offset = 0;\n if (offset === null) return;\n event.preventDefault();\n let next: number | ClockPeriod | undefined;\n if (event.key === 'Home') {\n next = values.find(value => !this.isDisabledPart(column, this.optionParts(column, value)));\n } else if (event.key === 'End') {\n for (let index = values.length - 1; index >= 0; index -= 1) {\n const value = values[index];\n if (value !== undefined && !this.isDisabledPart(column, this.optionParts(column, value))) {\n next = value;\n break;\n }\n }\n } else {\n const direction = offset;\n let index = values.indexOf(current);\n if (index < 0) index = direction > 0 ? -1 : values.length;\n for (\n let candidate = index + direction;\n candidate >= 0 && candidate < values.length;\n candidate += direction\n ) {\n const value = values[candidate];\n if (value !== undefined && !this.isDisabledPart(column, this.optionParts(column, value))) {\n next = value;\n break;\n }\n }\n }\n if (next === undefined) return;\n this.focusOption(column, next);\n };\n\n private renderTile(\n column: TimePickerColumn,\n value: number | ClockPeriod,\n selected: boolean,\n focused: boolean,\n label: string,\n values: ReadonlyArray<number | ClockPeriod>\n ) {\n const next = this.optionParts(column, value);\n const disabled = this.isDisabledPart(column, next);\n return (\n <button\n type=\"button\"\n role=\"option\"\n data-hour-option={column === 'hour' ? String(value) : undefined}\n data-minute-option={column === 'minute' ? String(value) : undefined}\n data-period-option={column === 'period' ? String(value) : undefined}\n class={{\n 'time-picker-tile': true,\n 'time-picker-tile--selected': selected,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': !disabled,\n 'ds-interaction-fill--selected': selected && !disabled,\n }}\n disabled={disabled}\n aria-selected={selected ? 'true' : 'false'}\n tabIndex={focused ? 0 : -1}\n onClick={() => this.commit(column, next)}\n onKeyDown={event => this.handleColumnKeyDown(event, column, values, value)}\n >\n <ds-text\n class=\"ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={selected ? 'primary' : 'secondary'}\n >\n {label}\n </ds-text>\n </button>\n );\n }\n\n render() {\n const parts = this.parts();\n const minutes = this.minutes();\n const minuteValues = minutes.includes(parts.minute)\n ? minutes\n : [...minutes, parts.minute].sort((a, b) => a - b);\n const hourFocus = this.focusValue('hour', this.hours());\n const minuteFocus = this.focusValue('minute', minuteValues);\n const periodFocus = this.focusValue('period', CLOCK_PERIODS);\n\n return (\n <Host>\n <div\n class={{ 'time-picker': true, 'time-picker--24': this.hourFormat === '24' }}\n role=\"group\"\n aria-label=\"Choose time\"\n >\n <div class=\"time-picker__column\">\n <div class=\"time-picker__list\" role=\"listbox\" aria-label=\"Hour\">\n {this.hours().map(hour =>\n this.renderTile(\n 'hour',\n hour,\n hour === this.displayHour(),\n hour === hourFocus,\n this.hourFormat === '24' ? String(hour).padStart(2, '0') : String(hour),\n this.hours()\n )\n )}\n </div>\n </div>\n <div class=\"time-picker__column\">\n <div class=\"time-picker__list\" role=\"listbox\" aria-label=\"Minute\">\n {minuteValues.map(minute =>\n this.renderTile(\n 'minute',\n minute,\n minute === parts.minute,\n minute === minuteFocus,\n String(minute).padStart(2, '0'),\n minuteValues\n )\n )}\n </div>\n </div>\n {this.hourFormat !== '24' && (\n <div class=\"time-picker__column\">\n <div class=\"time-picker__list\" role=\"listbox\" aria-label=\"AM/PM\">\n {CLOCK_PERIODS.map(period =>\n this.renderTile(\n 'period',\n period,\n period === parts.period,\n period === periodFocus,\n period,\n CLOCK_PERIODS\n )\n )}\n </div>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",
|
|
269
288
|
"type": "registry:ui"
|
|
270
289
|
}
|
|
271
290
|
]
|
|
@@ -335,8 +335,8 @@
|
|
|
335
335
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: manager, swipeDirections.",
|
|
336
336
|
"peerDependencies": {
|
|
337
337
|
"required": [
|
|
338
|
-
"@ds-mo/tokens ^6.
|
|
339
|
-
"@ds-mo/icons ^8.1.
|
|
338
|
+
"@ds-mo/tokens ^6.6.1",
|
|
339
|
+
"@ds-mo/icons ^8.1.1"
|
|
340
340
|
],
|
|
341
341
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
342
342
|
}
|
|
@@ -254,8 +254,8 @@
|
|
|
254
254
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
|
|
255
255
|
"peerDependencies": {
|
|
256
256
|
"required": [
|
|
257
|
-
"@ds-mo/tokens ^6.
|
|
258
|
-
"@ds-mo/icons ^8.1.
|
|
257
|
+
"@ds-mo/tokens ^6.6.1",
|
|
258
|
+
"@ds-mo/icons ^8.1.1"
|
|
259
259
|
],
|
|
260
260
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
261
261
|
}
|
|
@@ -386,8 +386,8 @@
|
|
|
386
386
|
},
|
|
387
387
|
"peerDependencies": {
|
|
388
388
|
"required": [
|
|
389
|
-
"@ds-mo/tokens ^6.
|
|
390
|
-
"@ds-mo/icons ^8.1.
|
|
389
|
+
"@ds-mo/tokens ^6.6.1",
|
|
390
|
+
"@ds-mo/icons ^8.1.1"
|
|
391
391
|
],
|
|
392
392
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
393
393
|
}
|
|
@@ -108,8 +108,8 @@
|
|
|
108
108
|
},
|
|
109
109
|
"peerDependencies": {
|
|
110
110
|
"required": [
|
|
111
|
-
"@ds-mo/tokens ^6.
|
|
112
|
-
"@ds-mo/icons ^8.1.
|
|
111
|
+
"@ds-mo/tokens ^6.6.1",
|
|
112
|
+
"@ds-mo/icons ^8.1.1"
|
|
113
113
|
],
|
|
114
114
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
115
115
|
}
|
|
@@ -29,6 +29,7 @@ export { DsCardSetting } from "./ds-card-setting.js";
|
|
|
29
29
|
export { DsCardSettingsScope } from "./ds-card-settings-scope.js";
|
|
30
30
|
export { DsChartLegend } from "./ds-chart-legend.js";
|
|
31
31
|
export { DsChart } from "./ds-chart.js";
|
|
32
|
+
export { DsCheckboxGroup } from "./ds-checkbox-group.js";
|
|
32
33
|
export { DsCheckbox } from "./ds-checkbox.js";
|
|
33
34
|
export { DsChip } from "./ds-chip.js";
|
|
34
35
|
export { DsCodeBlock } from "./ds-code-block.js";
|
|
@@ -48,6 +49,7 @@ export { DsEmptyState } from "./ds-empty-state.js";
|
|
|
48
49
|
export { DsField } from "./ds-field.js";
|
|
49
50
|
export { DsFilterMenu } from "./ds-filter-menu.js";
|
|
50
51
|
export { DsIcon } from "./ds-icon.js";
|
|
52
|
+
export { DsInlineBannerSettings } from "./ds-inline-banner-settings.js";
|
|
51
53
|
export { DsInputDate } from "./ds-input-date.js";
|
|
52
54
|
export { DsInputTime } from "./ds-input-time.js";
|
|
53
55
|
export { DsInput } from "./ds-input.js";
|
|
@@ -73,10 +75,14 @@ export { DsPanelToolHeader } from "./ds-panel-tool-header.js";
|
|
|
73
75
|
export { DsPanelToolSearch } from "./ds-panel-tool-search.js";
|
|
74
76
|
export { DsPanelTools } from "./ds-panel-tools.js";
|
|
75
77
|
export { DsPaperTexture } from "./ds-paper-texture.js";
|
|
78
|
+
export { DsRadioTile } from "./ds-radio-tile.js";
|
|
76
79
|
export { DsRadio } from "./ds-radio.js";
|
|
77
80
|
export { DsScore } from "./ds-score.js";
|
|
78
81
|
export { DsScrollOverlay } from "./ds-scroll-overlay.js";
|
|
79
82
|
export { DsSelect } from "./ds-select.js";
|
|
83
|
+
export { DsSettingRowCheckbox } from "./ds-setting-row-checkbox.js";
|
|
84
|
+
export { DsSettingRowRadio } from "./ds-setting-row-radio.js";
|
|
85
|
+
export { DsSettingRowToggle } from "./ds-setting-row-toggle.js";
|
|
80
86
|
export { DsShellApp } from "./ds-shell-app.js";
|
|
81
87
|
export { DsShellPage } from "./ds-shell-page.js";
|
|
82
88
|
export { DsShellTools } from "./ds-shell-tools.js";
|
package/dist/react/components.js
CHANGED
|
@@ -30,6 +30,7 @@ export { DsCardSetting } from "./ds-card-setting.js";
|
|
|
30
30
|
export { DsCardSettingsScope } from "./ds-card-settings-scope.js";
|
|
31
31
|
export { DsChartLegend } from "./ds-chart-legend.js";
|
|
32
32
|
export { DsChart } from "./ds-chart.js";
|
|
33
|
+
export { DsCheckboxGroup } from "./ds-checkbox-group.js";
|
|
33
34
|
export { DsCheckbox } from "./ds-checkbox.js";
|
|
34
35
|
export { DsChip } from "./ds-chip.js";
|
|
35
36
|
export { DsCodeBlock } from "./ds-code-block.js";
|
|
@@ -49,6 +50,7 @@ export { DsEmptyState } from "./ds-empty-state.js";
|
|
|
49
50
|
export { DsField } from "./ds-field.js";
|
|
50
51
|
export { DsFilterMenu } from "./ds-filter-menu.js";
|
|
51
52
|
export { DsIcon } from "./ds-icon.js";
|
|
53
|
+
export { DsInlineBannerSettings } from "./ds-inline-banner-settings.js";
|
|
52
54
|
export { DsInputDate } from "./ds-input-date.js";
|
|
53
55
|
export { DsInputTime } from "./ds-input-time.js";
|
|
54
56
|
export { DsInput } from "./ds-input.js";
|
|
@@ -74,10 +76,14 @@ export { DsPanelToolHeader } from "./ds-panel-tool-header.js";
|
|
|
74
76
|
export { DsPanelToolSearch } from "./ds-panel-tool-search.js";
|
|
75
77
|
export { DsPanelTools } from "./ds-panel-tools.js";
|
|
76
78
|
export { DsPaperTexture } from "./ds-paper-texture.js";
|
|
79
|
+
export { DsRadioTile } from "./ds-radio-tile.js";
|
|
77
80
|
export { DsRadio } from "./ds-radio.js";
|
|
78
81
|
export { DsScore } from "./ds-score.js";
|
|
79
82
|
export { DsScrollOverlay } from "./ds-scroll-overlay.js";
|
|
80
83
|
export { DsSelect } from "./ds-select.js";
|
|
84
|
+
export { DsSettingRowCheckbox } from "./ds-setting-row-checkbox.js";
|
|
85
|
+
export { DsSettingRowRadio } from "./ds-setting-row-radio.js";
|
|
86
|
+
export { DsSettingRowToggle } from "./ds-setting-row-toggle.js";
|
|
81
87
|
export { DsShellApp } from "./ds-shell-app.js";
|
|
82
88
|
export { DsShellPage } from "./ds-shell-page.js";
|
|
83
89
|
export { DsShellTools } from "./ds-shell-tools.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file was automatically generated by the Stencil React Output Target.
|
|
3
|
+
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
|
+
*/
|
|
5
|
+
import type { StencilReactComponent } from './react-runtime.js';
|
|
6
|
+
import type { Components } from "@ds-mo/ui/dist/components";
|
|
7
|
+
import { DsCheckboxGroup as DsCheckboxGroupElement } from "@ds-mo/ui/dist/components/ds-checkbox-group.js";
|
|
8
|
+
export type DsCheckboxGroupEvents = NonNullable<unknown>;
|
|
9
|
+
export declare const DsCheckboxGroup: StencilReactComponent<DsCheckboxGroupElement, DsCheckboxGroupEvents, Components.DsCheckboxGroup>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createComponent } from './react-runtime.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { DsCheckboxGroup as DsCheckboxGroupElement, defineCustomElement as defineDsCheckboxGroup } from "@ds-mo/ui/dist/components/ds-checkbox-group.js";
|
|
5
|
+
export const DsCheckboxGroup = /*@__PURE__*/ createComponent({
|
|
6
|
+
tagName: 'ds-checkbox-group',
|
|
7
|
+
elementClass: DsCheckboxGroupElement,
|
|
8
|
+
// @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
|
|
9
|
+
react: React,
|
|
10
|
+
events: {},
|
|
11
|
+
defineCustomElement: defineDsCheckboxGroup
|
|
12
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file was automatically generated by the Stencil React Output Target.
|
|
3
|
+
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
|
+
*/
|
|
5
|
+
import type { StencilReactComponent } from './react-runtime.js';
|
|
6
|
+
import type { Components } from "@ds-mo/ui/dist/components";
|
|
7
|
+
import { DsInlineBannerSettings as DsInlineBannerSettingsElement } from "@ds-mo/ui/dist/components/ds-inline-banner-settings.js";
|
|
8
|
+
export type DsInlineBannerSettingsEvents = NonNullable<unknown>;
|
|
9
|
+
export declare const DsInlineBannerSettings: StencilReactComponent<DsInlineBannerSettingsElement, DsInlineBannerSettingsEvents, Components.DsInlineBannerSettings, 'description'>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createComponent } from './react-runtime.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { DsInlineBannerSettings as DsInlineBannerSettingsElement, defineCustomElement as defineDsInlineBannerSettings } from "@ds-mo/ui/dist/components/ds-inline-banner-settings.js";
|
|
5
|
+
export const DsInlineBannerSettings = /*@__PURE__*/ createComponent({
|
|
6
|
+
tagName: 'ds-inline-banner-settings',
|
|
7
|
+
elementClass: DsInlineBannerSettingsElement,
|
|
8
|
+
// @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
|
|
9
|
+
react: React,
|
|
10
|
+
events: {},
|
|
11
|
+
defineCustomElement: defineDsInlineBannerSettings
|
|
12
|
+
});
|
package/dist/react/ds-input.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ import type { Components } from "@ds-mo/ui/dist/components";
|
|
|
8
8
|
import { DsInput as DsInputElement } from "@ds-mo/ui/dist/components/ds-input.js";
|
|
9
9
|
export type DsInputEvents = {
|
|
10
10
|
onDsChange: EventName<DsInputCustomEvent<string>>;
|
|
11
|
+
onDsTokensChange: EventName<DsInputCustomEvent<string[]>>;
|
|
12
|
+
onDsSuggestionSelect: EventName<DsInputCustomEvent<string>>;
|
|
11
13
|
onDsClear: EventName<DsInputCustomEvent<void>>;
|
|
12
14
|
};
|
|
13
15
|
export declare const DsInput: StencilReactComponent<DsInputElement, DsInputEvents, Components.DsInput>;
|
package/dist/react/ds-input.js
CHANGED
|
@@ -9,6 +9,8 @@ export const DsInput = /*@__PURE__*/ createComponent({
|
|
|
9
9
|
react: React,
|
|
10
10
|
events: {
|
|
11
11
|
onDsChange: 'dsChange',
|
|
12
|
+
onDsTokensChange: 'dsTokensChange',
|
|
13
|
+
onDsSuggestionSelect: 'dsSuggestionSelect',
|
|
12
14
|
onDsClear: 'dsClear'
|
|
13
15
|
},
|
|
14
16
|
defineCustomElement: defineDsInput
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file was automatically generated by the Stencil React Output Target.
|
|
3
|
+
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
|
+
*/
|
|
5
|
+
import type { EventName, StencilReactComponent } from './react-runtime.js';
|
|
6
|
+
import { type DsRadioTileCustomEvent } from "@ds-mo/ui";
|
|
7
|
+
import type { Components } from "@ds-mo/ui/dist/components";
|
|
8
|
+
import { DsRadioTile as DsRadioTileElement } from "@ds-mo/ui/dist/components/ds-radio-tile.js";
|
|
9
|
+
export type DsRadioTileEvents = {
|
|
10
|
+
onDsChange: EventName<DsRadioTileCustomEvent<string>>;
|
|
11
|
+
};
|
|
12
|
+
export declare const DsRadioTile: StencilReactComponent<DsRadioTileElement, DsRadioTileEvents, Components.DsRadioTile>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createComponent } from './react-runtime.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { DsRadioTile as DsRadioTileElement, defineCustomElement as defineDsRadioTile } from "@ds-mo/ui/dist/components/ds-radio-tile.js";
|
|
5
|
+
export const DsRadioTile = /*@__PURE__*/ createComponent({
|
|
6
|
+
tagName: 'ds-radio-tile',
|
|
7
|
+
elementClass: DsRadioTileElement,
|
|
8
|
+
// @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
|
|
9
|
+
react: React,
|
|
10
|
+
events: { onDsChange: 'dsChange' },
|
|
11
|
+
defineCustomElement: defineDsRadioTile
|
|
12
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file was automatically generated by the Stencil React Output Target.
|
|
3
|
+
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
|
+
*/
|
|
5
|
+
import type { StencilReactComponent } from './react-runtime.js';
|
|
6
|
+
import type { Components } from "@ds-mo/ui/dist/components";
|
|
7
|
+
import { DsSettingRowCheckbox as DsSettingRowCheckboxElement } from "@ds-mo/ui/dist/components/ds-setting-row-checkbox.js";
|
|
8
|
+
export type DsSettingRowCheckboxEvents = NonNullable<unknown>;
|
|
9
|
+
export declare const DsSettingRowCheckbox: StencilReactComponent<DsSettingRowCheckboxElement, DsSettingRowCheckboxEvents, Components.DsSettingRowCheckbox>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createComponent } from './react-runtime.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { DsSettingRowCheckbox as DsSettingRowCheckboxElement, defineCustomElement as defineDsSettingRowCheckbox } from "@ds-mo/ui/dist/components/ds-setting-row-checkbox.js";
|
|
5
|
+
export const DsSettingRowCheckbox = /*@__PURE__*/ createComponent({
|
|
6
|
+
tagName: 'ds-setting-row-checkbox',
|
|
7
|
+
elementClass: DsSettingRowCheckboxElement,
|
|
8
|
+
// @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
|
|
9
|
+
react: React,
|
|
10
|
+
events: {},
|
|
11
|
+
defineCustomElement: defineDsSettingRowCheckbox
|
|
12
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file was automatically generated by the Stencil React Output Target.
|
|
3
|
+
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
|
+
*/
|
|
5
|
+
import type { StencilReactComponent } from './react-runtime.js';
|
|
6
|
+
import type { Components } from "@ds-mo/ui/dist/components";
|
|
7
|
+
import { DsSettingRowRadio as DsSettingRowRadioElement } from "@ds-mo/ui/dist/components/ds-setting-row-radio.js";
|
|
8
|
+
export type DsSettingRowRadioEvents = NonNullable<unknown>;
|
|
9
|
+
export declare const DsSettingRowRadio: StencilReactComponent<DsSettingRowRadioElement, DsSettingRowRadioEvents, Components.DsSettingRowRadio>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createComponent } from './react-runtime.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { DsSettingRowRadio as DsSettingRowRadioElement, defineCustomElement as defineDsSettingRowRadio } from "@ds-mo/ui/dist/components/ds-setting-row-radio.js";
|
|
5
|
+
export const DsSettingRowRadio = /*@__PURE__*/ createComponent({
|
|
6
|
+
tagName: 'ds-setting-row-radio',
|
|
7
|
+
elementClass: DsSettingRowRadioElement,
|
|
8
|
+
// @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
|
|
9
|
+
react: React,
|
|
10
|
+
events: {},
|
|
11
|
+
defineCustomElement: defineDsSettingRowRadio
|
|
12
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file was automatically generated by the Stencil React Output Target.
|
|
3
|
+
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
|
+
*/
|
|
5
|
+
import type { EventName, StencilReactComponent } from './react-runtime.js';
|
|
6
|
+
import { type DsSettingRowToggleCustomEvent } from "@ds-mo/ui";
|
|
7
|
+
import type { Components } from "@ds-mo/ui/dist/components";
|
|
8
|
+
import { DsSettingRowToggle as DsSettingRowToggleElement } from "@ds-mo/ui/dist/components/ds-setting-row-toggle.js";
|
|
9
|
+
export type DsSettingRowToggleEvents = {
|
|
10
|
+
onDsChange: EventName<DsSettingRowToggleCustomEvent<boolean>>;
|
|
11
|
+
};
|
|
12
|
+
export declare const DsSettingRowToggle: StencilReactComponent<DsSettingRowToggleElement, DsSettingRowToggleEvents, Components.DsSettingRowToggle, 'label'>;
|