@ds-mo/ui 15.7.0 → 15.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +7 -2
  4. package/dist/angular/ds-table.d.ts +10 -1
  5. package/dist/angular/ds-table.js +5 -2
  6. package/dist/components/ds-agent-activity.js +1 -1
  7. package/dist/components/ds-agent-questionnaire.js +1 -1
  8. package/dist/components/ds-agent-response.js +1 -1
  9. package/dist/components/ds-agent-source-list.js +1 -1
  10. package/dist/components/ds-agent-tool-call.js +1 -1
  11. package/dist/components/ds-attachment-list.js +1 -1
  12. package/dist/components/ds-avatar.js +1 -1
  13. package/dist/components/ds-avatar.js.map +1 -1
  14. package/dist/components/ds-banner.js +1 -1
  15. package/dist/components/ds-bar-action.js +1 -1
  16. package/dist/components/ds-bar-action.js.map +1 -1
  17. package/dist/components/ds-bar-nav.js +1 -1
  18. package/dist/components/ds-bar-page-title.js +1 -1
  19. package/dist/components/ds-bar-title.js +1 -1
  20. package/dist/components/ds-bar-workflow.js +1 -1
  21. package/dist/components/ds-bar-workflow.js.map +1 -1
  22. package/dist/components/ds-button-filled.js +1 -1
  23. package/dist/components/ds-button-inverted.js +1 -1
  24. package/dist/components/ds-button-unfilled.js +1 -1
  25. package/dist/components/ds-calendar.js +1 -1
  26. package/dist/components/ds-card-action-center.js +1 -1
  27. package/dist/components/ds-card-chart.js +1 -1
  28. package/dist/components/ds-card-navigation.js +1 -1
  29. package/dist/components/ds-card-setting.js +1 -1
  30. package/dist/components/ds-chart.js +1 -1
  31. package/dist/components/ds-chip.js +1 -1
  32. package/dist/components/ds-code-block.js +1 -1
  33. package/dist/components/ds-conversation-list-item.js +1 -1
  34. package/dist/components/ds-conversation-list-item.js.map +1 -1
  35. package/dist/components/ds-data-customize.js +1 -1
  36. package/dist/components/ds-data-filter.js +1 -1
  37. package/dist/components/ds-data-group.js +1 -1
  38. package/dist/components/ds-data-preferences.js +1 -1
  39. package/dist/components/ds-data-preferences.js.map +1 -1
  40. package/dist/components/ds-data-saved-views.js +1 -1
  41. package/dist/components/ds-data-search.js +1 -1
  42. package/dist/components/ds-data-search.js.map +1 -1
  43. package/dist/components/ds-data-sort.js +1 -1
  44. package/dist/components/ds-empty-state.js +1 -1
  45. package/dist/components/ds-filter-menu.js +1 -1
  46. package/dist/components/ds-icon.js +1 -1
  47. package/dist/components/ds-input-date.js +1 -1
  48. package/dist/components/ds-input-time.js +1 -1
  49. package/dist/components/ds-input.js +1 -1
  50. package/dist/components/ds-map-entity-marker.js +1 -1
  51. package/dist/components/ds-markdown.js +1 -1
  52. package/dist/components/ds-menu.js +1 -1
  53. package/dist/components/ds-message-actions.js +1 -1
  54. package/dist/components/ds-message-composer.js +1 -1
  55. package/dist/components/ds-message-scroller.js +1 -1
  56. package/dist/components/ds-mobile-bar-nav.js +1 -1
  57. package/dist/components/ds-mobile-header.js +1 -1
  58. package/dist/components/ds-mobile-section-switcher.js +1 -1
  59. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  60. package/dist/components/ds-modal.js +1 -1
  61. package/dist/components/ds-navigation-tab-group.js +1 -1
  62. package/dist/components/ds-pagination.js +1 -1
  63. package/dist/components/ds-panel-nav.js +1 -1
  64. package/dist/components/ds-panel-tool-header.js +1 -1
  65. package/dist/components/ds-panel-tool-search.js +1 -1
  66. package/dist/components/ds-panel-tool-search.js.map +1 -1
  67. package/dist/components/ds-panel-tools.js +1 -1
  68. package/dist/components/ds-select-toggle.js +1 -1
  69. package/dist/components/ds-select.js +1 -1
  70. package/dist/components/ds-shell-app.js +1 -1
  71. package/dist/components/ds-shell-app.js.map +1 -1
  72. package/dist/components/ds-shell-tools.js +1 -1
  73. package/dist/components/ds-tab-group.js +1 -1
  74. package/dist/components/ds-table.js +1 -1
  75. package/dist/components/ds-table.js.map +1 -1
  76. package/dist/components/ds-tag.js +1 -1
  77. package/dist/components/ds-toast.js +1 -1
  78. package/dist/components/ds-tooltip-chart.js +1 -1
  79. package/dist/components/{p-DKvHBXwn.js → p-B1dnisok.js} +2 -2
  80. package/dist/components/p-B7EfrM6C.js +2 -0
  81. package/dist/components/{p-CLqqb0Jp.js.map → p-B7EfrM6C.js.map} +1 -1
  82. package/dist/components/{p-CgC4SM5b.js → p-B9ZhRwE3.js} +2 -2
  83. package/dist/components/{p-DGrSro-o.js → p-BAcdqJaa.js} +2 -2
  84. package/dist/components/{p-4sBUSsqs.js → p-BREDkBUv.js} +2 -2
  85. package/dist/components/{p-pPtjNRqC.js → p-BVsVUnAw.js} +2 -2
  86. package/dist/components/p-BVsVUnAw.js.map +1 -0
  87. package/dist/components/{p-CKSJwSWd.js → p-BWnL2SWn.js} +2 -2
  88. package/dist/components/{p-CqAC2IQO.js → p-BcmJBzB6.js} +2 -2
  89. package/dist/components/p-BjD1eFx6.js +2 -0
  90. package/dist/components/{p-CHyxUWqL.js.map → p-BjD1eFx6.js.map} +1 -1
  91. package/dist/components/{p-AGqUGzNZ.js → p-Bjm-Rk_x.js} +2 -2
  92. package/dist/components/{p-UBQ5O7B-.js → p-Bls48_RF.js} +2 -2
  93. package/dist/components/{p-oBpjD9OA.js → p-BqZWKYsS.js} +2 -2
  94. package/dist/components/p-C4YUkrr0.js +2 -0
  95. package/dist/components/{p-LJXiEPw1.js.map → p-C4YUkrr0.js.map} +1 -1
  96. package/dist/components/p-C62g3d5y.js +2 -0
  97. package/dist/components/{p-CRhoeCC8.js.map → p-C62g3d5y.js.map} +1 -1
  98. package/dist/components/p-C6EXrs1S.js +2 -0
  99. package/dist/components/{p-CvIHBa8S.js.map → p-C6EXrs1S.js.map} +1 -1
  100. package/dist/components/p-CCoJ7CBB.js +2 -0
  101. package/dist/components/{p-BKyE025p.js.map → p-CCoJ7CBB.js.map} +1 -1
  102. package/dist/components/p-CG4vPDhg.js +2 -0
  103. package/dist/components/{p-DmgDVoDb.js.map → p-CG4vPDhg.js.map} +1 -1
  104. package/dist/components/p-CJSIvfpo.js +2 -0
  105. package/dist/components/{p-C0L-VnSr.js.map → p-CJSIvfpo.js.map} +1 -1
  106. package/dist/components/p-CJuc20pQ.js +2 -0
  107. package/dist/components/p-CJuc20pQ.js.map +1 -0
  108. package/dist/components/{p-dSNHIJz6.js → p-CWAeg9jl.js} +2 -2
  109. package/dist/components/{p-BwNW5nqj.js → p-CantpOo3.js} +2 -2
  110. package/dist/components/p-D-TeAVxE.js +2 -0
  111. package/dist/components/{p-Ct2KQHF4.js.map → p-D-TeAVxE.js.map} +1 -1
  112. package/dist/components/{p-DiPqdcD4.js → p-D3JCih82.js} +2 -2
  113. package/dist/components/p-DHpcv_Os.js +2 -0
  114. package/dist/components/{p-BPDo1eQV.js.map → p-DHpcv_Os.js.map} +1 -1
  115. package/dist/components/{p-D_xZ5SFL.js → p-DWXpMWIp.js} +2 -2
  116. package/dist/components/{p-Dyjs8_Cl.js → p-DagrkX2v.js} +2 -2
  117. package/dist/components/{p-D62yUMhr.js → p-DcMbWqTd.js} +2 -2
  118. package/dist/components/{p-g2OUK8Z0.js → p-DiyL2sI5.js} +2 -2
  119. package/dist/components/p-Dvw7N7TH.js +2 -0
  120. package/dist/components/{p-D9l0QBgN.js.map → p-Dvw7N7TH.js.map} +1 -1
  121. package/dist/components/{p-v9Nhw5yM.js → p-IfsszNF0.js} +2 -2
  122. package/dist/components/p-QU4czL2k.js +2 -0
  123. package/dist/components/p-QU4czL2k.js.map +1 -0
  124. package/dist/components/{p-CCsxoztj.js → p-SXaH5TeC.js} +2 -2
  125. package/dist/components/{p-CCsxoztj.js.map → p-SXaH5TeC.js.map} +1 -1
  126. package/dist/components/p-Tf6odBOV.js +2 -0
  127. package/dist/components/{p-CXB_T13u.js.map → p-Tf6odBOV.js.map} +1 -1
  128. package/dist/components/p-UWU23pbX.js +2 -0
  129. package/dist/components/{p-Cs8Gq-PZ.js.map → p-UWU23pbX.js.map} +1 -1
  130. package/dist/components/p-YFjXYN8s.js +2 -0
  131. package/dist/components/{p-DdNJPBCS.js.map → p-YFjXYN8s.js.map} +1 -1
  132. package/dist/components/{p-pJ6gbwSa.js → p-kL4EOsx5.js} +2 -2
  133. package/dist/components/{p-BjBFJ2dd.js → p-topqlGsI.js} +2 -2
  134. package/dist/components/{p-Bdp2V6-c.js → p-zopMP2ze.js} +2 -2
  135. package/dist/components/{p-Bdp2V6-c.js.map → p-zopMP2ze.js.map} +1 -1
  136. package/dist/docs/components.json +15 -1
  137. package/dist/lib/shell/index.js.map +2 -2
  138. package/dist/lib/shell/shell-responsive.d.ts +2 -0
  139. package/dist/mcp-data/registry/data-preferences.json +1 -1
  140. package/dist/mcp-data/registry/data-sort.json +1 -1
  141. package/dist/mcp-data/registry/registry.json +6 -1
  142. package/dist/mcp-data/registry/shell-app.json +2 -1
  143. package/dist/mcp-data/registry/table.json +19 -3
  144. package/dist/react/ds-table.d.ts +3 -0
  145. package/dist/react/ds-table.js +1 -0
  146. package/dist/styles/table.css +8 -0
  147. package/dist/types/components/ShellApp/ShellApp.d.ts +1 -0
  148. package/dist/types/components/Table/Table.d.ts +5 -0
  149. package/dist/types/components/Table/table-viewport-fit-controller.d.ts +3 -0
  150. package/dist/types/components.d.ts +5 -0
  151. package/dist/types/shell/shell-responsive.d.ts +2 -0
  152. package/dist/vue/ds-table.js +2 -0
  153. package/package.json +1 -1
  154. package/dist/components/p-BKyE025p.js +0 -2
  155. package/dist/components/p-BPDo1eQV.js +0 -2
  156. package/dist/components/p-C0L-VnSr.js +0 -2
  157. package/dist/components/p-CHyxUWqL.js +0 -2
  158. package/dist/components/p-CLqqb0Jp.js +0 -2
  159. package/dist/components/p-CRhoeCC8.js +0 -2
  160. package/dist/components/p-CXB_T13u.js +0 -2
  161. package/dist/components/p-CgGcgMjs.js +0 -2
  162. package/dist/components/p-CgGcgMjs.js.map +0 -1
  163. package/dist/components/p-Cs8Gq-PZ.js +0 -2
  164. package/dist/components/p-Ct2KQHF4.js +0 -2
  165. package/dist/components/p-CvIHBa8S.js +0 -2
  166. package/dist/components/p-D9l0QBgN.js +0 -2
  167. package/dist/components/p-DdNJPBCS.js +0 -2
  168. package/dist/components/p-DlCLfwP4.js +0 -2
  169. package/dist/components/p-DlCLfwP4.js.map +0 -1
  170. package/dist/components/p-DmgDVoDb.js +0 -2
  171. package/dist/components/p-LJXiEPw1.js +0 -2
  172. package/dist/components/p-pPtjNRqC.js.map +0 -1
  173. /package/dist/components/{p-DKvHBXwn.js.map → p-B1dnisok.js.map} +0 -0
  174. /package/dist/components/{p-CgC4SM5b.js.map → p-B9ZhRwE3.js.map} +0 -0
  175. /package/dist/components/{p-DGrSro-o.js.map → p-BAcdqJaa.js.map} +0 -0
  176. /package/dist/components/{p-4sBUSsqs.js.map → p-BREDkBUv.js.map} +0 -0
  177. /package/dist/components/{p-CKSJwSWd.js.map → p-BWnL2SWn.js.map} +0 -0
  178. /package/dist/components/{p-CqAC2IQO.js.map → p-BcmJBzB6.js.map} +0 -0
  179. /package/dist/components/{p-AGqUGzNZ.js.map → p-Bjm-Rk_x.js.map} +0 -0
  180. /package/dist/components/{p-UBQ5O7B-.js.map → p-Bls48_RF.js.map} +0 -0
  181. /package/dist/components/{p-oBpjD9OA.js.map → p-BqZWKYsS.js.map} +0 -0
  182. /package/dist/components/{p-dSNHIJz6.js.map → p-CWAeg9jl.js.map} +0 -0
  183. /package/dist/components/{p-BwNW5nqj.js.map → p-CantpOo3.js.map} +0 -0
  184. /package/dist/components/{p-DiPqdcD4.js.map → p-D3JCih82.js.map} +0 -0
  185. /package/dist/components/{p-D_xZ5SFL.js.map → p-DWXpMWIp.js.map} +0 -0
  186. /package/dist/components/{p-Dyjs8_Cl.js.map → p-DagrkX2v.js.map} +0 -0
  187. /package/dist/components/{p-D62yUMhr.js.map → p-DcMbWqTd.js.map} +0 -0
  188. /package/dist/components/{p-g2OUK8Z0.js.map → p-DiyL2sI5.js.map} +0 -0
  189. /package/dist/components/{p-v9Nhw5yM.js.map → p-IfsszNF0.js.map} +0 -0
  190. /package/dist/components/{p-pJ6gbwSa.js.map → p-kL4EOsx5.js.map} +0 -0
  191. /package/dist/components/{p-BjBFJ2dd.js.map → p-topqlGsI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":["inputTimeCss","idCounter","INVALID_TIME_MESSAGE","TIME_BEFORE_MIN_MESSAGE","TIME_AFTER_MAX_MESSAGE","TIME_STEP_MESSAGE","InputTime","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","generatedId","errorId","popupId","value","disabled","readOnly","required","requiredMessage","DEFAULT_REQUIRED_MESSAGE","step","hourFormat","size","width","hasBorder","hasInteractionFill","isInactive","autoFocus","error","ariaLabel","initialValue","closeTimer","formDisabled","focused","touched","draftText","open","shouldRender","closing","positionReady","pos","x","y","position","AnchoredPositionController","getAnchor","controlEl","getPopup","el","querySelector","getOwnerDocument","ownerDocument","measure","anchor","popup","sectionInsetPx","resolveCssLengthPx","TOKEN_DEFAULTS","space050","anchorRect","getBoundingClientRect","popupWidth","offsetWidth","popupFallbackWidth","popupHeight","offsetHeight","popupFallbackHeight","side","align","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","anchorAlignment","viewportPadPx","viewportWidth","window","innerWidth","viewportHeight","innerHeight","collisionRect","resolveAnchoredOverlayBoundaryRect","apply","onReady","liveUpdate","observeResize","topLayer","interaction","AnchoredOverlayInteractionController","onOutsideActivation","closePicker","togglePicker","openPicker","handleInput","event","pickerInactive","target","parsed","parseDraft","commitIso","handleFocus","displayValue","handleBlur","handleTimeChange","stopPropagation","detail","menuWidthXs","menuFallbackHeight","formInactive","hasConstraintError","isClockTime","min","max","isClockTimeStepAligned","isInvalid","length","componentWillLoad","syncFormValue","disconnectedCallback","teardownListeners","onHourFormatChange","inactive","setFormControlValue","internals","flags","message","valueMissing","badInput","rangeUnderflow","rangeOverflow","stepMismatch","setValidity","onInteractionStateChange","formDisabledCallback","formResetCallback","formStateRestoreCallback","state","restoreStringFormState","setFocus","inputEl","focus","handleHostKeyDown","key","preventDefault","composedPath","includes","tabLeavesPopup","moveFocusAfterTab","shiftKey","formatClockTimeLabel","text","trimmed","trim","iso","parseLooseClockTime","emit","dsChange","unobserve","disconnect","clearTimeout","isConnected","connect","observe","schedule","restore","cancel","clockButton","duration","resolveMotionTimeMs","motionShort2","animationDurationShort3","finishClose","setTimeout","matches","hidePopover","render","inputId","filled","dirty","showError","Boolean","errorMessage","textVariant","CONTROL_TEXT_VARIANT","textClass","replace","describedBy","ariaDescribedby","undefined","filter","join","popupStyle","left","top","transform","Math","round","zIndex","visibility","h","Host","class","controlWidthClass","ref","element","type","id","autoComplete","spellcheck","ariaLabelledby","onInput","onFocus","onBlur","variant","icon","isInset","haspopup","expanded","surfaceOpen","controls","onDsClick","popover","style","role","onDsChange","as","color","textId"],"sources":["src/wc/components/InputTime/InputTime.css?tag=ds-input-time&encapsulation=scoped","src/wc/components/InputTime/InputTime.tsx"],"sourcesContent":["@import '../../utils/datetime-input-control.css';\n@import '../../utils/choice-popup.css';\n@import '../../utils/chrome-layout.css';\n\n.input-time-popup.ds-choice-popup {\n --ds-time-picker-padding: 0;\n padding: var(--dimension-space-050);\n}\n","import {\n AttachInternals,\n Component,\n Element,\n Prop,\n State,\n Event,\n EventEmitter,\n Listen,\n Method,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n controlWidthClass,\n CONTROL_TEXT_VARIANT,\n DEFAULT_REQUIRED_MESSAGE,\n formatClockTimeLabel,\n isClockTime,\n isClockTimeStepAligned,\n parseLooseClockTime,\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n restoreStringFormState,\n setFormControlValue,\n TOKEN_DEFAULTS,\n type ControlSize,\n type ControlWidth,\n} from '../../utils';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\n\nexport type InputTimeSize = ControlSize;\nexport type InputTimeWidth = ControlWidth;\n\nlet idCounter = 0;\n\nconst INVALID_TIME_MESSAGE = 'Enter a valid time.';\nconst TIME_BEFORE_MIN_MESSAGE = 'Time is before the minimum allowed time.';\nconst TIME_AFTER_MAX_MESSAGE = 'Time is after the maximum allowed time.';\nconst TIME_STEP_MESSAGE = 'Time does not match the allowed interval.';\n\n@Component({\n tag: 'ds-input-time',\n styleUrl: 'InputTime.css',\n scoped: true,\n formAssociated: true,\n})\nexport class InputTime {\n @Element() el!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n private generatedId = `ds-input-time-${++idCounter}`;\n private errorId = `${this.generatedId}-error`;\n private popupId = `${this.generatedId}-popup`;\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 @Prop({ reflect: true }) readOnly: boolean = false;\n @Prop({ reflect: true }) required: boolean = false;\n @Prop() requiredMessage: string = DEFAULT_REQUIRED_MESSAGE;\n /** Native time step in seconds. Defaults to minutes (`60`). */\n @Prop() step: string | number = 60;\n /** Display format; submitted values remain HH:MM in either format. */\n @Prop() hourFormat: '12' | '24' = '12';\n @Prop() min: string | undefined;\n @Prop() max: string | undefined;\n @Prop() size: InputTimeSize = 'md';\n @Prop() width: InputTimeWidth = 'fill';\n @Prop() hasBorder: boolean = true;\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 @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 inputEl?: HTMLInputElement;\n private controlEl?: HTMLElement;\n private clockButton?: HTMLDsButtonUnfilledElement;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n @State() private formDisabled = false;\n @State() private focused = false;\n @State() private touched = false;\n @State() private draftText = '';\n @State() private open = false;\n @State() private shouldRender = false;\n @State() private closing = false;\n @State() private positionReady = false;\n @State() private pos = { x: 0, y: 0 };\n\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.controlEl ?? null,\n getPopup: () => this.el.querySelector<HTMLElement>('.input-time-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n if (!this.open) return null;\n const sectionInsetPx = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n return {\n anchorRect: anchor.getBoundingClientRect(),\n popupWidth: popup.offsetWidth || this.popupFallbackWidth,\n popupHeight: popup.offsetHeight || this.popupFallbackHeight,\n side: 'bottom',\n align: 'end',\n sideOffsetPx: resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050),\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: 'end',\n alignOffsetPx: 0,\n sectionInsetPx,\n anchorAlignment: 'popup-frame',\n }),\n viewportPadPx: resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050),\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect: resolveAnchoredOverlayBoundaryRect(anchor),\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.positionReady = true;\n },\n liveUpdate: 'double-frame',\n observeResize: true,\n topLayer: true,\n });\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.controlEl ?? null,\n getPopup: () => this.el.querySelector<HTMLElement>('.input-time-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.closePicker(false),\n });\n\n private get popupFallbackWidth(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthXs, TOKEN_DEFAULTS.menuWidthXs);\n }\n\n private get popupFallbackHeight(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private get formInactive(): boolean {\n return this.isInactive || this.disabled || this.formDisabled;\n }\n\n private get pickerInactive(): boolean {\n return this.formInactive || this.readOnly;\n }\n\n private get hasConstraintError(): boolean {\n if (!this.value) return false;\n if (!isClockTime(this.value)) return true;\n if (this.min && isClockTime(this.min) && this.value < this.min) return true;\n if (this.max && isClockTime(this.max) && this.value > this.max) return true;\n return !isClockTimeStepAligned(this.value, this.step, this.min);\n }\n\n private get isInvalid(): boolean {\n return (\n this.error ||\n (!this.formInactive &&\n ((this.required && this.value.length === 0) || this.hasConstraintError))\n );\n }\n\n componentWillLoad() {\n this.initialValue = this.value;\n this.syncFormValue();\n }\n\n disconnectedCallback() {\n this.teardownListeners();\n this.open = false;\n this.shouldRender = false;\n this.closing = false;\n this.positionReady = false;\n this.focused = false;\n }\n\n @Watch('hourFormat')\n onHourFormatChange() {\n this.draftText = this.displayValue;\n }\n\n @Watch('value')\n @Watch('required')\n @Watch('requiredMessage')\n @Watch('min')\n @Watch('max')\n @Watch('step')\n syncFormValue() {\n const inactive = this.formInactive;\n setFormControlValue(this.internals, this.value, { inactive });\n const flags: ValidityStateFlags = {};\n let message = '';\n if (!inactive) {\n if (this.required && this.value.length === 0) {\n flags.valueMissing = true;\n message = this.requiredMessage;\n } else if (this.value && !isClockTime(this.value)) {\n flags.badInput = true;\n message = INVALID_TIME_MESSAGE;\n } else if (this.value && this.min && isClockTime(this.min) && this.value < this.min) {\n flags.rangeUnderflow = true;\n message = TIME_BEFORE_MIN_MESSAGE;\n } else if (this.value && this.max && isClockTime(this.max) && this.value > this.max) {\n flags.rangeOverflow = true;\n message = TIME_AFTER_MAX_MESSAGE;\n } else if (this.value && !isClockTimeStepAligned(this.value, this.step, this.min)) {\n flags.stepMismatch = true;\n message = TIME_STEP_MESSAGE;\n }\n }\n this.internals.setValidity(flags, message);\n }\n\n @Watch('disabled')\n @Watch('isInactive')\n @Watch('readOnly')\n onInteractionStateChange() {\n this.syncFormValue();\n if (this.pickerInactive && this.shouldRender) this.closePicker(false);\n }\n\n formDisabledCallback(disabled: boolean) {\n this.formDisabled = disabled;\n this.onInteractionStateChange();\n }\n\n formResetCallback() {\n this.value = this.initialValue;\n this.draftText = this.displayValue;\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n this.value = restoreStringFormState(state);\n this.draftText = this.displayValue;\n }\n\n @Method()\n async setFocus() {\n this.inputEl?.focus();\n }\n\n @Listen('keydown')\n handleHostKeyDown(event: KeyboardEvent) {\n if (!this.shouldRender || this.closing) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closePicker('button');\n return;\n }\n if (event.key !== 'Tab') return;\n const popup = this.el.querySelector<HTMLElement>('.input-time-popup');\n if (!popup || !event.composedPath().includes(popup)) return;\n if (!this.interaction.tabLeavesPopup(event)) return;\n event.preventDefault();\n this.closePicker(false);\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n\n private get displayValue(): string {\n return this.hourFormat === '24' ? this.value : formatClockTimeLabel(this.value);\n }\n\n private parseDraft(text: string): string | null {\n const trimmed = text.trim();\n if (!trimmed) return '';\n const iso = parseLooseClockTime(trimmed);\n if (!iso) return null;\n if (this.min && isClockTime(this.min) && iso < this.min) return null;\n if (this.max && isClockTime(this.max) && iso > this.max) return null;\n if (!isClockTimeStepAligned(iso, this.step, this.min)) return null;\n return iso;\n }\n\n private commitIso(iso: string, emit = true) {\n if (this.value !== iso) {\n this.value = iso;\n if (emit) this.dsChange.emit(iso);\n }\n this.draftText = this.hourFormat === '24' ? iso : formatClockTimeLabel(iso);\n }\n\n private teardownListeners() {\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private openPicker() {\n const inactive = this.isInactive || this.disabled || this.formDisabled || this.readOnly;\n if (inactive || this.open || !this.el.isConnected) return;\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.open = true;\n this.teardownListeners();\n this.interaction.connect();\n this.position.observe();\n this.position.schedule();\n }\n\n private closePicker(restore: 'input' | 'button' | false) {\n if (!this.shouldRender || this.closing) return;\n this.open = false;\n this.position.cancel();\n this.closing = true;\n this.interaction.disconnect();\n this.position.unobserve();\n if (restore === 'input') this.inputEl?.focus();\n if (restore === 'button') void this.clockButton?.setFocus();\n const duration = resolveMotionTimeMs(\n TOKEN_DEFAULTS.motionShort2,\n TOKEN_DEFAULTS.animationDurationShort3\n );\n if (duration <= 0) {\n this.finishClose();\n return;\n }\n this.closeTimer = setTimeout(() => this.finishClose(), duration);\n }\n\n private finishClose() {\n const popup = this.el.querySelector<HTMLElement>('.input-time-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.closeTimer = null;\n }\n\n private togglePicker = () => {\n if (this.isInactive || this.disabled || this.formDisabled || this.readOnly) return;\n if (this.open) this.closePicker('button');\n else this.openPicker();\n };\n\n private handleInput = (event: Event) => {\n if (this.pickerInactive) return;\n this.draftText = (event.target as HTMLInputElement).value;\n const parsed = this.parseDraft(this.draftText);\n if (parsed === null) return;\n this.commitIso(parsed);\n };\n\n private handleFocus = () => {\n this.draftText = this.displayValue || this.value;\n this.focused = true;\n };\n\n private handleBlur = () => {\n this.focused = false;\n this.touched = true;\n if (this.pickerInactive) {\n this.draftText = this.displayValue;\n return;\n }\n const parsed = this.parseDraft(this.draftText);\n if (parsed === null) {\n this.draftText = this.displayValue;\n return;\n }\n this.commitIso(parsed);\n };\n\n private handleTimeChange = (event: CustomEvent<string>) => {\n event.stopPropagation();\n if (this.pickerInactive) return;\n const parsed = this.parseDraft(event.detail);\n if (parsed === null) return;\n this.commitIso(parsed);\n };\n\n render() {\n const inputId = this.inputId ?? this.generatedId;\n const inactive = this.formInactive;\n const pickerInactive = this.pickerInactive;\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 textClass = `ds-text--${textVariant.replace('text-', '')}`;\n const describedBy =\n [this.ariaDescribedby, showError ? this.errorId : undefined].filter(Boolean).join(' ') ||\n undefined;\n const popupStyle = {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: `translate(${Math.round(this.pos.x)}px, ${Math.round(this.pos.y)}px)`,\n zIndex: 'var(--dimension-z-index-floating)',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n\n return (\n <Host\n class={{\n 'input-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.isInvalid ? '' : 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 ref={element => {\n this.controlEl = element;\n }}\n class={{\n 'input-control': true,\n 'ds-control-frame': true,\n 'input-control--bordered': this.hasBorder,\n 'input-control--error': this.hasBorder && this.error,\n 'ds-interaction-fill': this.hasInteractionFill,\n [`ds-control--${this.size}`]: true,\n }}\n >\n <input\n ref={element => {\n this.inputEl = element;\n }}\n type=\"text\"\n id={inputId}\n value={this.focused ? this.draftText : this.displayValue}\n disabled={inactive}\n readOnly={this.readOnly}\n required={this.required}\n autoFocus={this.autoFocus}\n autoComplete=\"off\"\n spellcheck={false}\n class={{\n 'native-input': true,\n 'native-input--align-start': true,\n 'ds-control-label-box': true,\n [textClass]: true,\n 'ds-text--regular': true,\n }}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-describedby={describedBy}\n aria-invalid={this.isInvalid ? 'true' : undefined}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n <ds-button-unfilled\n ref={element => {\n this.clockButton = element as HTMLDsButtonUnfilledElement | undefined;\n }}\n class=\"input-control__datetime-action\"\n variant=\"icon\"\n size={this.size}\n icon=\"Clock\"\n hasBorder={false}\n isInset\n isInactive={pickerInactive}\n ariaLabel=\"Choose time\"\n haspopup=\"dialog\"\n expanded={this.open}\n surfaceOpen={this.open || this.closing}\n controls={this.open ? this.popupId : undefined}\n onDsClick={this.togglePicker}\n />\n </div>\n {this.shouldRender ? (\n <div\n id={this.popupId}\n popover=\"manual\"\n class={{\n 'input-time-popup': true,\n 'ds-choice-popup': true,\n 'ds-choice-popup--closing': this.closing,\n 'ds-chrome-column': true,\n 'ds-chrome-space--sm': true,\n }}\n style={popupStyle}\n role=\"dialog\"\n aria-label=\"Choose time\"\n >\n <ds-time-picker\n hourFormat={this.hourFormat}\n value={this.value}\n min={this.min}\n max={this.max}\n step={this.step}\n isInactive={pickerInactive}\n autoFocus\n onDsChange={this.handleTimeChange}\n />\n </div>\n ) : null}\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"],"mappings":"spBAAA,MAAMA,EAAe,IAAM,uh3BCsC3B,IAAIC,EAAY,EAEhB,MAAMC,EAAuB,sBAC7B,MAAMC,EAA0B,2CAChC,MAAMC,EAAyB,0CAC/B,MAAMC,EAAoB,4C,MAQbC,EAASC,EAAA,MAAAD,UAAAE,EANtB,WAAAC,CAAAC,G,qHAUUC,KAAAC,YAAc,mBAAmBX,IACjCU,KAAAE,QAAU,GAAGF,KAAKC,oBAClBD,KAAAG,QAAU,GAAGH,KAAKC,oBAEDD,KAAAI,MAAgB,GAGhBJ,KAAAK,SAAoB,MACpBL,KAAAM,SAAoB,MACpBN,KAAAO,SAAoB,MACrCP,KAAAQ,gBAA0BC,EAE1BT,KAAAU,KAAwB,GAExBV,KAAAW,WAA0B,KAG1BX,KAAAY,KAAsB,KACtBZ,KAAAa,MAAwB,OACxBb,KAAAc,UAAqB,KACrBd,KAAAe,mBAA8B,KAC9Bf,KAAAgB,WAAsB,MACtBhB,KAAAiB,UAAqB,MACrBjB,KAAAkB,MAAiB,MAGUlB,KAAAmB,UAA2B,KAMtDnB,KAAAoB,aAAe,GAIfpB,KAAAqB,WAAmD,KAC1CrB,KAAAsB,aAAe,MACftB,KAAAuB,QAAU,MACVvB,KAAAwB,QAAU,MACVxB,KAAAyB,UAAY,GACZzB,KAAA0B,KAAO,MACP1B,KAAA2B,aAAe,MACf3B,KAAA4B,QAAU,MACV5B,KAAA6B,cAAgB,MAChB7B,KAAA8B,IAAM,CAAEC,EAAG,EAAGC,EAAG,GAEjBhC,KAAAiC,SAAW,IAAIC,EAA2B,CACzDC,UAAW,IAAMnC,KAAKoC,WAAa,KACnCC,SAAU,IAAMrC,KAAKsC,GAAGC,cAA2B,qBACnDC,iBAAkB,IAAMxC,KAAKsC,GAAGG,cAChCC,QAAS,CAACC,EAAQC,KAChB,IAAK5C,KAAK0B,KAAM,OAAO,KACvB,MAAMmB,EAAiBC,EAAmBC,EAAeC,SAAUD,EAAeC,UAClF,MAAO,CACLC,WAAYN,EAAOO,wBACnBC,WAAYP,EAAMQ,aAAepD,KAAKqD,mBACtCC,YAAaV,EAAMW,cAAgBvD,KAAKwD,oBACxCC,KAAM,SACNC,MAAO,MACPC,aAAcb,EAAmBC,EAAeC,SAAUD,EAAeC,UACzEY,cAAeC,EAA8B,CAC3CH,MAAO,MACPE,cAAe,EACff,iBACAiB,gBAAiB,gBAEnBC,cAAejB,EAAmBC,EAAeC,SAAUD,EAAeC,UAC1EgB,cAAeC,OAAOC,WACtBC,eAAgBF,OAAOG,YACvBC,cAAeC,EAAmC3B,GACnD,EAEH4B,MAAO,EAAGxC,IAAGC,QACXhC,KAAK8B,IAAM,CAAEC,IAAGC,IAAG,EAErBwC,QAAS,KACPxE,KAAK6B,cAAgB,IAAI,EAE3B4C,WAAY,eACZC,cAAe,KACfC,SAAU,OAEK3E,KAAA4E,YAAc,IAAIC,EAAqC,CACtE1C,UAAW,IAAMnC,KAAKoC,WAAa,KACnCC,SAAU,IAAMrC,KAAKsC,GAAGC,cAA2B,qBACnDC,iBAAkB,IAAMxC,KAAKsC,GAAGG,cAChCqC,oBAAqB,IAAM9E,KAAK+E,YAAY,SA4MtC/E,KAAAgF,aAAe,KACrB,GAAIhF,KAAKgB,YAAchB,KAAKK,UAAYL,KAAKsB,cAAgBtB,KAAKM,SAAU,OAC5E,GAAIN,KAAK0B,KAAM1B,KAAK+E,YAAY,eAC3B/E,KAAKiF,YAAY,EAGhBjF,KAAAkF,YAAeC,IACrB,GAAInF,KAAKoF,eAAgB,OACzBpF,KAAKyB,UAAa0D,EAAME,OAA4BjF,MACpD,MAAMkF,EAAStF,KAAKuF,WAAWvF,KAAKyB,WACpC,GAAI6D,IAAW,KAAM,OACrBtF,KAAKwF,UAAUF,EAAO,EAGhBtF,KAAAyF,YAAc,KACpBzF,KAAKyB,UAAYzB,KAAK0F,cAAgB1F,KAAKI,MAC3CJ,KAAKuB,QAAU,IAAI,EAGbvB,KAAA2F,WAAa,KACnB3F,KAAKuB,QAAU,MACfvB,KAAKwB,QAAU,KACf,GAAIxB,KAAKoF,eAAgB,CACvBpF,KAAKyB,UAAYzB,KAAK0F,aACtB,M,CAEF,MAAMJ,EAAStF,KAAKuF,WAAWvF,KAAKyB,WACpC,GAAI6D,IAAW,KAAM,CACnBtF,KAAKyB,UAAYzB,KAAK0F,aACtB,M,CAEF1F,KAAKwF,UAAUF,EAAO,EAGhBtF,KAAA4F,iBAAoBT,IAC1BA,EAAMU,kBACN,GAAI7F,KAAKoF,eAAgB,OACzB,MAAME,EAAStF,KAAKuF,WAAWJ,EAAMW,QACrC,GAAIR,IAAW,KAAM,OACrBtF,KAAKwF,UAAUF,EAAO,CAiJzB,CAjYC,sBAAYjC,GACV,OAAOP,EAAmBC,EAAegD,YAAahD,EAAegD,Y,CAGvE,uBAAYvC,GACV,OAAOV,EAAmBC,EAAeiD,mBAAoBjD,EAAeiD,mB,CAG9E,gBAAYC,GACV,OAAOjG,KAAKgB,YAAchB,KAAKK,UAAYL,KAAKsB,Y,CAGlD,kBAAY8D,GACV,OAAOpF,KAAKiG,cAAgBjG,KAAKM,Q,CAGnC,sBAAY4F,GACV,IAAKlG,KAAKI,MAAO,OAAO,MACxB,IAAK+F,EAAYnG,KAAKI,OAAQ,OAAO,KACrC,GAAIJ,KAAKoG,KAAOD,EAAYnG,KAAKoG,MAAQpG,KAAKI,MAAQJ,KAAKoG,IAAK,OAAO,KACvE,GAAIpG,KAAKqG,KAAOF,EAAYnG,KAAKqG,MAAQrG,KAAKI,MAAQJ,KAAKqG,IAAK,OAAO,KACvE,OAAQC,EAAuBtG,KAAKI,MAAOJ,KAAKU,KAAMV,KAAKoG,I,CAG7D,aAAYG,GACV,OACEvG,KAAKkB,QACHlB,KAAKiG,eACHjG,KAAKO,UAAYP,KAAKI,MAAMoG,SAAW,GAAMxG,KAAKkG,mB,CAI1D,iBAAAO,GACEzG,KAAKoB,aAAepB,KAAKI,MACzBJ,KAAK0G,e,CAGP,oBAAAC,GACE3G,KAAK4G,oBACL5G,KAAK0B,KAAO,MACZ1B,KAAK2B,aAAe,MACpB3B,KAAK4B,QAAU,MACf5B,KAAK6B,cAAgB,MACrB7B,KAAKuB,QAAU,K,CAIjB,kBAAAsF,GACE7G,KAAKyB,UAAYzB,KAAK0F,Y,CASxB,aAAAgB,GACE,MAAMI,EAAW9G,KAAKiG,aACtBc,EAAoB/G,KAAKgH,UAAWhH,KAAKI,MAAO,CAAE0G,aAClD,MAAMG,EAA4B,GAClC,IAAIC,EAAU,GACd,IAAKJ,EAAU,CACb,GAAI9G,KAAKO,UAAYP,KAAKI,MAAMoG,SAAW,EAAG,CAC5CS,EAAME,aAAe,KACrBD,EAAUlH,KAAKQ,e,MACV,GAAIR,KAAKI,QAAU+F,EAAYnG,KAAKI,OAAQ,CACjD6G,EAAMG,SAAW,KACjBF,EAAU3H,C,MACL,GAAIS,KAAKI,OAASJ,KAAKoG,KAAOD,EAAYnG,KAAKoG,MAAQpG,KAAKI,MAAQJ,KAAKoG,IAAK,CACnFa,EAAMI,eAAiB,KACvBH,EAAU1H,C,MACL,GAAIQ,KAAKI,OAASJ,KAAKqG,KAAOF,EAAYnG,KAAKqG,MAAQrG,KAAKI,MAAQJ,KAAKqG,IAAK,CACnFY,EAAMK,cAAgB,KACtBJ,EAAUzH,C,MACL,GAAIO,KAAKI,QAAUkG,EAAuBtG,KAAKI,MAAOJ,KAAKU,KAAMV,KAAKoG,KAAM,CACjFa,EAAMM,aAAe,KACrBL,EAAUxH,C,EAGdM,KAAKgH,UAAUQ,YAAYP,EAAOC,E,CAMpC,wBAAAO,GACEzH,KAAK0G,gBACL,GAAI1G,KAAKoF,gBAAkBpF,KAAK2B,aAAc3B,KAAK+E,YAAY,M,CAGjE,oBAAA2C,CAAqBrH,GACnBL,KAAKsB,aAAejB,EACpBL,KAAKyH,0B,CAGP,iBAAAE,GACE3H,KAAKI,MAAQJ,KAAKoB,aAClBpB,KAAKyB,UAAYzB,KAAK0F,Y,CAGxB,wBAAAkC,CAAyBC,GACvB7H,KAAKI,MAAQ0H,EAAuBD,GACpC7H,KAAKyB,UAAYzB,KAAK0F,Y,CAIxB,cAAMqC,GACJ/H,KAAKgI,SAASC,O,CAIhB,iBAAAC,CAAkB/C,GAChB,IAAKnF,KAAK2B,cAAgB3B,KAAK4B,QAAS,OACxC,GAAIuD,EAAMgD,MAAQ,SAAU,CAC1BhD,EAAMiD,iBACNpI,KAAK+E,YAAY,UACjB,M,CAEF,GAAII,EAAMgD,MAAQ,MAAO,OACzB,MAAMvF,EAAQ5C,KAAKsC,GAAGC,cAA2B,qBACjD,IAAKK,IAAUuC,EAAMkD,eAAeC,SAAS1F,GAAQ,OACrD,IAAK5C,KAAK4E,YAAY2D,eAAepD,GAAQ,OAC7CA,EAAMiD,iBACNpI,KAAK+E,YAAY,OACjB/E,KAAK4E,YAAY4D,kBAAkBrD,EAAMsD,S,CAG3C,gBAAY/C,GACV,OAAO1F,KAAKW,aAAe,KAAOX,KAAKI,MAAQsI,EAAqB1I,KAAKI,M,CAGnE,UAAAmF,CAAWoD,GACjB,MAAMC,EAAUD,EAAKE,OACrB,IAAKD,EAAS,MAAO,GACrB,MAAME,EAAMC,EAAoBH,GAChC,IAAKE,EAAK,OAAO,KACjB,GAAI9I,KAAKoG,KAAOD,EAAYnG,KAAKoG,MAAQ0C,EAAM9I,KAAKoG,IAAK,OAAO,KAChE,GAAIpG,KAAKqG,KAAOF,EAAYnG,KAAKqG,MAAQyC,EAAM9I,KAAKqG,IAAK,OAAO,KAChE,IAAKC,EAAuBwC,EAAK9I,KAAKU,KAAMV,KAAKoG,KAAM,OAAO,KAC9D,OAAO0C,C,CAGD,SAAAtD,CAAUsD,EAAaE,EAAO,MACpC,GAAIhJ,KAAKI,QAAU0I,EAAK,CACtB9I,KAAKI,MAAQ0I,EACb,GAAIE,EAAMhJ,KAAKiJ,SAASD,KAAKF,E,CAE/B9I,KAAKyB,UAAYzB,KAAKW,aAAe,KAAOmI,EAAMJ,EAAqBI,E,CAGjE,iBAAAlC,GACN5G,KAAKiC,SAASiH,YACdlJ,KAAK4E,YAAYuE,aACjB,GAAInJ,KAAKqB,WAAY,CACnB+H,aAAapJ,KAAKqB,YAClBrB,KAAKqB,WAAa,I,EAId,UAAA4D,GACN,MAAM6B,EAAW9G,KAAKgB,YAAchB,KAAKK,UAAYL,KAAKsB,cAAgBtB,KAAKM,SAC/E,GAAIwG,GAAY9G,KAAK0B,OAAS1B,KAAKsC,GAAG+G,YAAa,OACnDrJ,KAAK2B,aAAe,KACpB3B,KAAK4B,QAAU,MACf5B,KAAK6B,cAAgB,MACrB7B,KAAK0B,KAAO,KACZ1B,KAAK4G,oBACL5G,KAAK4E,YAAY0E,UACjBtJ,KAAKiC,SAASsH,UACdvJ,KAAKiC,SAASuH,U,CAGR,WAAAzE,CAAY0E,GAClB,IAAKzJ,KAAK2B,cAAgB3B,KAAK4B,QAAS,OACxC5B,KAAK0B,KAAO,MACZ1B,KAAKiC,SAASyH,SACd1J,KAAK4B,QAAU,KACf5B,KAAK4E,YAAYuE,aACjBnJ,KAAKiC,SAASiH,YACd,GAAIO,IAAY,QAASzJ,KAAKgI,SAASC,QACvC,GAAIwB,IAAY,cAAezJ,KAAK2J,aAAa5B,WACjD,MAAM6B,EAAWC,EACf9G,EAAe+G,aACf/G,EAAegH,yBAEjB,GAAIH,GAAY,EAAG,CACjB5J,KAAKgK,cACL,M,CAEFhK,KAAKqB,WAAa4I,YAAW,IAAMjK,KAAKgK,eAAeJ,E,CAGjD,WAAAI,GACN,MAAMpH,EAAQ5C,KAAKsC,GAAGC,cAA2B,qBACjD,GAAIK,GAAOsH,QAAQ,iBAAkBtH,EAAMuH,cAC3CnK,KAAK2B,aAAe,MACpB3B,KAAK4B,QAAU,MACf5B,KAAKqB,WAAa,I,CA6CpB,MAAA+I,GACE,MAAMC,EAAUrK,KAAKqK,SAAWrK,KAAKC,YACrC,MAAM6G,EAAW9G,KAAKiG,aACtB,MAAMb,EAAiBpF,KAAKoF,eAC5B,MAAMkF,EAAStK,KAAKI,MAAMoG,OAAS,EACnC,MAAM+D,EAAQvK,KAAKI,QAAUJ,KAAKoB,aAClC,MAAMoJ,EAAYxK,KAAKkB,OAASuJ,QAAQzK,KAAK0K,cAC7C,MAAMC,EAAcC,EAAqB5K,KAAKY,MAC9C,MAAMiK,EAAY,YAAYF,EAAYG,QAAQ,QAAS,MAC3D,MAAMC,EACJ,CAAC/K,KAAKgL,gBAAiBR,EAAYxK,KAAKE,QAAU+K,WAAWC,OAAOT,SAASU,KAAK,MAClFF,UACF,MAAMG,EAAa,CACjBnJ,SAAU,QACVoJ,KAAM,IACNC,IAAK,IACLC,UAAW,aAAaC,KAAKC,MAAMzL,KAAK8B,IAAIC,SAASyJ,KAAKC,MAAMzL,KAAK8B,IAAIE,QACzE0J,OAAQ,oCACRC,WAAY3L,KAAK6B,cAAgB,UAAY,UAG/C,OACE+J,EAACC,EAAI,CAAA1D,IAAA,2CACH2D,MAAO,CACL,aAAc,KACd,iBAAkB,KAClB,oCAAqC9L,KAAKc,UAC1C,sBAAuBgG,EACvB,CAAC,eAAe9G,KAAKY,QAAS,QAC3BmL,EAAkB/L,KAAKa,QAC3B,gBACciG,EAAW,GAAKmE,UAAS,gBACzBjL,KAAKM,SAAW,GAAK2K,UAAS,gBAC9BjL,KAAKO,SAAW,GAAK0K,UAAS,eAC/BjL,KAAKuG,UAAY,GAAK0E,UAAS,cAChCX,EAAS,GAAKW,UAAS,eACtBjL,KAAKuB,QAAU,GAAK0J,UAAS,aAC/BV,EAAQ,GAAKU,UAAS,eACpBjL,KAAKwB,QAAU,GAAKyJ,WAElCW,EAAA,OAAAzD,IAAA,2CACE6D,IAAKC,IACHjM,KAAKoC,UAAY6J,CAAO,EAE1BH,MAAO,CACL,gBAAiB,KACjB,mBAAoB,KACpB,0BAA2B9L,KAAKc,UAChC,uBAAwBd,KAAKc,WAAad,KAAKkB,MAC/C,sBAAuBlB,KAAKe,mBAC5B,CAAC,eAAef,KAAKY,QAAS,OAGhCgL,EAAA,SAAAzD,IAAA,2CACE6D,IAAKC,IACHjM,KAAKgI,QAAUiE,CAAO,EAExBC,KAAK,OACLC,GAAI9B,EACJjK,MAAOJ,KAAKuB,QAAUvB,KAAKyB,UAAYzB,KAAK0F,aAC5CrF,SAAUyG,EACVxG,SAAUN,KAAKM,SACfC,SAAUP,KAAKO,SACfU,UAAWjB,KAAKiB,UAChBmL,aAAa,MACbC,WAAY,MACZP,MAAO,CACL,eAAgB,KAChB,4BAA6B,KAC7B,uBAAwB,KACxBjB,CAACA,GAAY,KACb,mBAAoB,MACrB,aACW7K,KAAKmB,UAAS,kBACTnB,KAAKsM,eAAc,mBAClBvB,EAAW,eACf/K,KAAKuG,UAAY,OAAS0E,UACxCsB,QAASvM,KAAKkF,YACdsH,QAASxM,KAAKyF,YACdgH,OAAQzM,KAAK2F,aAEfiG,EAAA,sBAAAzD,IAAA,2CACE6D,IAAKC,IACHjM,KAAK2J,YAAcsC,CAAkD,EAEvEH,MAAM,iCACNY,QAAQ,OACR9L,KAAMZ,KAAKY,KACX+L,KAAK,QACL7L,UAAW,MACX8L,QAAO,KACP5L,WAAYoE,EACZjE,UAAU,cACV0L,SAAS,SACTC,SAAU9M,KAAK0B,KACfqL,YAAa/M,KAAK0B,MAAQ1B,KAAK4B,QAC/BoL,SAAUhN,KAAK0B,KAAO1B,KAAKG,QAAU8K,UACrCgC,UAAWjN,KAAKgF,gBAGnBhF,KAAK2B,aACJiK,EAAA,OACEO,GAAInM,KAAKG,QACT+M,QAAQ,SACRpB,MAAO,CACL,mBAAoB,KACpB,kBAAmB,KACnB,2BAA4B9L,KAAK4B,QACjC,mBAAoB,KACpB,sBAAuB,MAEzBuL,MAAO/B,EACPgC,KAAK,SAAQ,aACF,eAEXxB,EAAA,kBACEjL,WAAYX,KAAKW,WACjBP,MAAOJ,KAAKI,MACZgG,IAAKpG,KAAKoG,IACVC,IAAKrG,KAAKqG,IACV3F,KAAMV,KAAKU,KACXM,WAAYoE,EACZnE,UAAS,KACToM,WAAYrN,KAAK4F,oBAGnB,KACH4E,GACCoB,EAAA,WAAAzD,IAAA,2CACE2D,MAAM,aACNwB,GAAG,MACHZ,QAAQ,kBACRa,MAAM,WACNC,OAAQxN,KAAKE,QACbkN,KAAK,SAEJpN,KAAK0K,c","ignoreList":[]}
1
+ {"version":3,"names":["inputTimeCss","idCounter","INVALID_TIME_MESSAGE","TIME_BEFORE_MIN_MESSAGE","TIME_AFTER_MAX_MESSAGE","TIME_STEP_MESSAGE","InputTime","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","generatedId","errorId","popupId","value","disabled","readOnly","required","requiredMessage","DEFAULT_REQUIRED_MESSAGE","step","hourFormat","size","width","hasBorder","hasInteractionFill","isInactive","autoFocus","error","ariaLabel","initialValue","closeTimer","formDisabled","focused","touched","draftText","open","shouldRender","closing","positionReady","pos","x","y","position","AnchoredPositionController","getAnchor","controlEl","getPopup","el","querySelector","getOwnerDocument","ownerDocument","measure","anchor","popup","sectionInsetPx","resolveCssLengthPx","TOKEN_DEFAULTS","space050","anchorRect","getBoundingClientRect","popupWidth","offsetWidth","popupFallbackWidth","popupHeight","offsetHeight","popupFallbackHeight","side","align","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","anchorAlignment","viewportPadPx","viewportWidth","window","innerWidth","viewportHeight","innerHeight","collisionRect","resolveAnchoredOverlayBoundaryRect","apply","onReady","liveUpdate","observeResize","topLayer","interaction","AnchoredOverlayInteractionController","onOutsideActivation","closePicker","togglePicker","openPicker","handleInput","event","pickerInactive","target","parsed","parseDraft","commitIso","handleFocus","displayValue","handleBlur","handleTimeChange","stopPropagation","detail","menuWidthXs","menuFallbackHeight","formInactive","hasConstraintError","isClockTime","min","max","isClockTimeStepAligned","isInvalid","length","componentWillLoad","syncFormValue","disconnectedCallback","teardownListeners","onHourFormatChange","inactive","setFormControlValue","internals","flags","message","valueMissing","badInput","rangeUnderflow","rangeOverflow","stepMismatch","setValidity","onInteractionStateChange","formDisabledCallback","formResetCallback","formStateRestoreCallback","state","restoreStringFormState","setFocus","inputEl","focus","handleHostKeyDown","key","preventDefault","composedPath","includes","tabLeavesPopup","moveFocusAfterTab","shiftKey","formatClockTimeLabel","text","trimmed","trim","iso","parseLooseClockTime","emit","dsChange","unobserve","disconnect","clearTimeout","isConnected","connect","observe","schedule","restore","cancel","clockButton","duration","resolveMotionTimeMs","motionShort2","animationDurationShort3","finishClose","setTimeout","matches","hidePopover","render","inputId","filled","dirty","showError","Boolean","errorMessage","textVariant","CONTROL_TEXT_VARIANT","textClass","replace","describedBy","ariaDescribedby","undefined","filter","join","popupStyle","left","top","transform","Math","round","zIndex","visibility","h","Host","class","controlWidthClass","ref","element","type","id","autoComplete","spellcheck","ariaLabelledby","onInput","onFocus","onBlur","variant","icon","isInset","haspopup","expanded","surfaceOpen","controls","onDsClick","popover","style","role","onDsChange","as","color","textId"],"sources":["src/wc/components/InputTime/InputTime.css?tag=ds-input-time&encapsulation=scoped","src/wc/components/InputTime/InputTime.tsx"],"sourcesContent":["@import '../../utils/datetime-input-control.css';\n@import '../../utils/choice-popup.css';\n@import '../../utils/chrome-layout.css';\n\n.input-time-popup.ds-choice-popup {\n --ds-time-picker-padding: 0;\n padding: var(--dimension-space-050);\n}\n","import {\n AttachInternals,\n Component,\n Element,\n Prop,\n State,\n Event,\n EventEmitter,\n Listen,\n Method,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n controlWidthClass,\n CONTROL_TEXT_VARIANT,\n DEFAULT_REQUIRED_MESSAGE,\n formatClockTimeLabel,\n isClockTime,\n isClockTimeStepAligned,\n parseLooseClockTime,\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n restoreStringFormState,\n setFormControlValue,\n TOKEN_DEFAULTS,\n type ControlSize,\n type ControlWidth,\n} from '../../utils';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\n\nexport type InputTimeSize = ControlSize;\nexport type InputTimeWidth = ControlWidth;\n\nlet idCounter = 0;\n\nconst INVALID_TIME_MESSAGE = 'Enter a valid time.';\nconst TIME_BEFORE_MIN_MESSAGE = 'Time is before the minimum allowed time.';\nconst TIME_AFTER_MAX_MESSAGE = 'Time is after the maximum allowed time.';\nconst TIME_STEP_MESSAGE = 'Time does not match the allowed interval.';\n\n@Component({\n tag: 'ds-input-time',\n styleUrl: 'InputTime.css',\n scoped: true,\n formAssociated: true,\n})\nexport class InputTime {\n @Element() el!: HTMLElement;\n @AttachInternals() internals!: ElementInternals;\n\n private generatedId = `ds-input-time-${++idCounter}`;\n private errorId = `${this.generatedId}-error`;\n private popupId = `${this.generatedId}-popup`;\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 @Prop({ reflect: true }) readOnly: boolean = false;\n @Prop({ reflect: true }) required: boolean = false;\n @Prop() requiredMessage: string = DEFAULT_REQUIRED_MESSAGE;\n /** Native time step in seconds. Defaults to minutes (`60`). */\n @Prop() step: string | number = 60;\n /** Display format; submitted values remain HH:MM in either format. */\n @Prop() hourFormat: '12' | '24' = '12';\n @Prop() min: string | undefined;\n @Prop() max: string | undefined;\n @Prop() size: InputTimeSize = 'md';\n @Prop() width: InputTimeWidth = 'fill';\n @Prop() hasBorder: boolean = true;\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 @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 inputEl?: HTMLInputElement;\n private controlEl?: HTMLElement;\n private clockButton?: HTMLDsButtonUnfilledElement;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n @State() private formDisabled = false;\n @State() private focused = false;\n @State() private touched = false;\n @State() private draftText = '';\n @State() private open = false;\n @State() private shouldRender = false;\n @State() private closing = false;\n @State() private positionReady = false;\n @State() private pos = { x: 0, y: 0 };\n\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.controlEl ?? null,\n getPopup: () => this.el.querySelector<HTMLElement>('.input-time-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n if (!this.open) return null;\n const sectionInsetPx = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n return {\n anchorRect: anchor.getBoundingClientRect(),\n popupWidth: popup.offsetWidth || this.popupFallbackWidth,\n popupHeight: popup.offsetHeight || this.popupFallbackHeight,\n side: 'bottom',\n align: 'end',\n sideOffsetPx: resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050),\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: 'end',\n alignOffsetPx: 0,\n sectionInsetPx,\n anchorAlignment: 'popup-frame',\n }),\n viewportPadPx: resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050),\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect: resolveAnchoredOverlayBoundaryRect(anchor),\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.positionReady = true;\n },\n liveUpdate: 'double-frame',\n observeResize: true,\n topLayer: true,\n });\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.controlEl ?? null,\n getPopup: () => this.el.querySelector<HTMLElement>('.input-time-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.closePicker(false),\n });\n\n private get popupFallbackWidth(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthXs, TOKEN_DEFAULTS.menuWidthXs);\n }\n\n private get popupFallbackHeight(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private get formInactive(): boolean {\n return this.isInactive || this.disabled || this.formDisabled;\n }\n\n private get pickerInactive(): boolean {\n return this.formInactive || this.readOnly;\n }\n\n private get hasConstraintError(): boolean {\n if (!this.value) return false;\n if (!isClockTime(this.value)) return true;\n if (this.min && isClockTime(this.min) && this.value < this.min) return true;\n if (this.max && isClockTime(this.max) && this.value > this.max) return true;\n return !isClockTimeStepAligned(this.value, this.step, this.min);\n }\n\n private get isInvalid(): boolean {\n return (\n this.error ||\n (!this.formInactive &&\n ((this.required && this.value.length === 0) || this.hasConstraintError))\n );\n }\n\n componentWillLoad() {\n this.initialValue = this.value;\n this.syncFormValue();\n }\n\n disconnectedCallback() {\n this.teardownListeners();\n this.open = false;\n this.shouldRender = false;\n this.closing = false;\n this.positionReady = false;\n this.focused = false;\n }\n\n @Watch('hourFormat')\n onHourFormatChange() {\n this.draftText = this.displayValue;\n }\n\n @Watch('value')\n @Watch('required')\n @Watch('requiredMessage')\n @Watch('min')\n @Watch('max')\n @Watch('step')\n syncFormValue() {\n const inactive = this.formInactive;\n setFormControlValue(this.internals, this.value, { inactive });\n const flags: ValidityStateFlags = {};\n let message = '';\n if (!inactive) {\n if (this.required && this.value.length === 0) {\n flags.valueMissing = true;\n message = this.requiredMessage;\n } else if (this.value && !isClockTime(this.value)) {\n flags.badInput = true;\n message = INVALID_TIME_MESSAGE;\n } else if (this.value && this.min && isClockTime(this.min) && this.value < this.min) {\n flags.rangeUnderflow = true;\n message = TIME_BEFORE_MIN_MESSAGE;\n } else if (this.value && this.max && isClockTime(this.max) && this.value > this.max) {\n flags.rangeOverflow = true;\n message = TIME_AFTER_MAX_MESSAGE;\n } else if (this.value && !isClockTimeStepAligned(this.value, this.step, this.min)) {\n flags.stepMismatch = true;\n message = TIME_STEP_MESSAGE;\n }\n }\n this.internals.setValidity(flags, message);\n }\n\n @Watch('disabled')\n @Watch('isInactive')\n @Watch('readOnly')\n onInteractionStateChange() {\n this.syncFormValue();\n if (this.pickerInactive && this.shouldRender) this.closePicker(false);\n }\n\n formDisabledCallback(disabled: boolean) {\n this.formDisabled = disabled;\n this.onInteractionStateChange();\n }\n\n formResetCallback() {\n this.value = this.initialValue;\n this.draftText = this.displayValue;\n }\n\n formStateRestoreCallback(state: string | File | FormData | null) {\n this.value = restoreStringFormState(state);\n this.draftText = this.displayValue;\n }\n\n @Method()\n async setFocus() {\n this.inputEl?.focus();\n }\n\n @Listen('keydown')\n handleHostKeyDown(event: KeyboardEvent) {\n if (!this.shouldRender || this.closing) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closePicker('button');\n return;\n }\n if (event.key !== 'Tab') return;\n const popup = this.el.querySelector<HTMLElement>('.input-time-popup');\n if (!popup || !event.composedPath().includes(popup)) return;\n if (!this.interaction.tabLeavesPopup(event)) return;\n event.preventDefault();\n this.closePicker(false);\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n\n private get displayValue(): string {\n return this.hourFormat === '24' ? this.value : formatClockTimeLabel(this.value);\n }\n\n private parseDraft(text: string): string | null {\n const trimmed = text.trim();\n if (!trimmed) return '';\n const iso = parseLooseClockTime(trimmed);\n if (!iso) return null;\n if (this.min && isClockTime(this.min) && iso < this.min) return null;\n if (this.max && isClockTime(this.max) && iso > this.max) return null;\n if (!isClockTimeStepAligned(iso, this.step, this.min)) return null;\n return iso;\n }\n\n private commitIso(iso: string, emit = true) {\n if (this.value !== iso) {\n this.value = iso;\n if (emit) this.dsChange.emit(iso);\n }\n this.draftText = this.hourFormat === '24' ? iso : formatClockTimeLabel(iso);\n }\n\n private teardownListeners() {\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private openPicker() {\n const inactive = this.isInactive || this.disabled || this.formDisabled || this.readOnly;\n if (inactive || this.open || !this.el.isConnected) return;\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.open = true;\n this.teardownListeners();\n this.interaction.connect();\n this.position.observe();\n this.position.schedule();\n }\n\n private closePicker(restore: 'input' | 'button' | false) {\n if (!this.shouldRender || this.closing) return;\n this.open = false;\n this.position.cancel();\n this.closing = true;\n this.interaction.disconnect();\n this.position.unobserve();\n if (restore === 'input') this.inputEl?.focus();\n if (restore === 'button') void this.clockButton?.setFocus();\n const duration = resolveMotionTimeMs(\n TOKEN_DEFAULTS.motionShort2,\n TOKEN_DEFAULTS.animationDurationShort3\n );\n if (duration <= 0) {\n this.finishClose();\n return;\n }\n this.closeTimer = setTimeout(() => this.finishClose(), duration);\n }\n\n private finishClose() {\n const popup = this.el.querySelector<HTMLElement>('.input-time-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.closeTimer = null;\n }\n\n private togglePicker = () => {\n if (this.isInactive || this.disabled || this.formDisabled || this.readOnly) return;\n if (this.open) this.closePicker('button');\n else this.openPicker();\n };\n\n private handleInput = (event: Event) => {\n if (this.pickerInactive) return;\n this.draftText = (event.target as HTMLInputElement).value;\n const parsed = this.parseDraft(this.draftText);\n if (parsed === null) return;\n this.commitIso(parsed);\n };\n\n private handleFocus = () => {\n this.draftText = this.displayValue || this.value;\n this.focused = true;\n };\n\n private handleBlur = () => {\n this.focused = false;\n this.touched = true;\n if (this.pickerInactive) {\n this.draftText = this.displayValue;\n return;\n }\n const parsed = this.parseDraft(this.draftText);\n if (parsed === null) {\n this.draftText = this.displayValue;\n return;\n }\n this.commitIso(parsed);\n };\n\n private handleTimeChange = (event: CustomEvent<string>) => {\n event.stopPropagation();\n if (this.pickerInactive) return;\n const parsed = this.parseDraft(event.detail);\n if (parsed === null) return;\n this.commitIso(parsed);\n };\n\n render() {\n const inputId = this.inputId ?? this.generatedId;\n const inactive = this.formInactive;\n const pickerInactive = this.pickerInactive;\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 textClass = `ds-text--${textVariant.replace('text-', '')}`;\n const describedBy =\n [this.ariaDescribedby, showError ? this.errorId : undefined].filter(Boolean).join(' ') ||\n undefined;\n const popupStyle = {\n position: 'fixed',\n left: '0',\n top: '0',\n transform: `translate(${Math.round(this.pos.x)}px, ${Math.round(this.pos.y)}px)`,\n zIndex: 'var(--dimension-z-index-floating)',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n\n return (\n <Host\n class={{\n 'input-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.isInvalid ? '' : 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 ref={element => {\n this.controlEl = element;\n }}\n class={{\n 'input-control': true,\n 'ds-control-frame': true,\n 'input-control--bordered': this.hasBorder,\n 'input-control--error': this.hasBorder && this.error,\n 'ds-interaction-fill': this.hasInteractionFill,\n [`ds-control--${this.size}`]: true,\n }}\n >\n <input\n ref={element => {\n this.inputEl = element;\n }}\n type=\"text\"\n id={inputId}\n value={this.focused ? this.draftText : this.displayValue}\n disabled={inactive}\n readOnly={this.readOnly}\n required={this.required}\n autoFocus={this.autoFocus}\n autoComplete=\"off\"\n spellcheck={false}\n class={{\n 'native-input': true,\n 'native-input--align-start': true,\n 'ds-control-label-box': true,\n [textClass]: true,\n 'ds-text--regular': true,\n }}\n aria-label={this.ariaLabel}\n aria-labelledby={this.ariaLabelledby}\n aria-describedby={describedBy}\n aria-invalid={this.isInvalid ? 'true' : undefined}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n <ds-button-unfilled\n ref={element => {\n this.clockButton = element as HTMLDsButtonUnfilledElement | undefined;\n }}\n class=\"input-control__datetime-action\"\n variant=\"icon\"\n size={this.size}\n icon=\"Clock\"\n hasBorder={false}\n isInset\n isInactive={pickerInactive}\n ariaLabel=\"Choose time\"\n haspopup=\"dialog\"\n expanded={this.open}\n surfaceOpen={this.open || this.closing}\n controls={this.open ? this.popupId : undefined}\n onDsClick={this.togglePicker}\n />\n </div>\n {this.shouldRender ? (\n <div\n id={this.popupId}\n popover=\"manual\"\n class={{\n 'input-time-popup': true,\n 'ds-choice-popup': true,\n 'ds-choice-popup--closing': this.closing,\n 'ds-chrome-column': true,\n 'ds-chrome-space--sm': true,\n }}\n style={popupStyle}\n role=\"dialog\"\n aria-label=\"Choose time\"\n >\n <ds-time-picker\n hourFormat={this.hourFormat}\n value={this.value}\n min={this.min}\n max={this.max}\n step={this.step}\n isInactive={pickerInactive}\n autoFocus\n onDsChange={this.handleTimeChange}\n />\n </div>\n ) : null}\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"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-09-22T23:37:03",
2
+ "timestamp": "2026-09-23T23:35:51",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -40487,6 +40487,20 @@
40487
40487
  }
40488
40488
  ],
40489
40489
  "events": [
40490
+ {
40491
+ "event": "dsAlternateViewRendered",
40492
+ "detail": "{ alternateView: boolean; }",
40493
+ "bubbles": true,
40494
+ "complexType": {
40495
+ "original": "{ alternateView: boolean }",
40496
+ "resolved": "{ alternateView: boolean; }",
40497
+ "references": {}
40498
+ },
40499
+ "cancelable": true,
40500
+ "composed": true,
40501
+ "docs": "Fires after a table/alternate-view switch has patched the frame and footer.",
40502
+ "docsTags": []
40503
+ },
40490
40504
  {
40491
40505
  "event": "dsCellAction",
40492
40506
  "detail": "TableCellActionDetail",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/wc/components/PanelTools/panel-tools-types.ts", "../../../src/wc/shell/nav-chrome.ts", "../../../src/wc/components/Menu/menu-placement.ts", "../../../src/wc/shell/shell-gradient-presets.ts", "../../../src/wc/shell/shell-responsive.ts"],
4
- "sourcesContent": ["/** Application-owned tool id for the shell rail and responsive tool views. */\nexport type PanelToolsToolId = string;\n\n/** Canonical Motive shell recipe used when item metadata is omitted. */\nexport type CanonicalPanelToolsToolId =\n | 'search'\n | 'messages'\n | 'agents'\n | 'stacks'\n | 'activity'\n | 'help';\n\nexport const PANEL_TOOLS_TOOL_IDS: CanonicalPanelToolsToolId[] = [\n 'agents',\n 'messages',\n 'activity',\n 'search',\n 'stacks',\n 'help',\n];\n\n/** Rail header slot \u2014 mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: CanonicalPanelToolsToolId = 'agents';\n\n/** Rail footer slot \u2014 flush to the bottom of the tools column. */\nexport const PANEL_TOOLS_FOOTER_TOOL_ID: CanonicalPanelToolsToolId = 'help';\n\nexport const PANEL_TOOLS_LABELS: Record<CanonicalPanelToolsToolId, string> = {\n search: 'Search',\n messages: 'Messages',\n stacks: 'Stacks',\n activity: 'Activity',\n agents: 'Agents',\n help: 'Help & Support',\n};\n\nexport const PANEL_TOOLS_SHORTCUTS: Partial<Record<CanonicalPanelToolsToolId, string>> = {\n search: 'K',\n agents: 'A',\n messages: 'M',\n stacks: 'S',\n activity: 'N',\n help: '/',\n};\n\nexport type PanelToolsRailPlacement = 'header' | 'body' | 'footer';\n\nexport interface PanelToolsItem {\n id: PanelToolsToolId;\n /** Icon name for <ds-icon>. */\n icon: string;\n /** Visible and accessible fallback label for custom tool ids. */\n label?: string;\n /** Explicit rail region; canonical Agents/Help placement is the fallback. */\n railPlacement?: PanelToolsRailPlacement;\n /** Stable ordering within the selected rail region. */\n order?: number;\n /** Optional shortcut label displayed by the tooltip. */\n shortcutKey?: string;\n /** Mobile destination recipe; canonical ids retain their explicit defaults. */\n mobileDestination?: 'search' | 'inbox' | 'activity' | 'messages' | 'agents' | 'help';\n /** Whether this rail button is currently pressed/active. */\n selected?: boolean;\n /** Show a notification dot. */\n dot?: boolean;\n isInactive?: boolean;\n ariaLabel?: string;\n}\n\nexport type PanelToolsRailAccessoryVisual =\n | { type: 'icon'; icon: string }\n | { type: 'initial'; initial: string }\n | { type: 'image'; src: string };\n\nexport interface PanelToolsRailAccessoryAction {\n /** Stable application-owned action id emitted with the accessory id. */\n id: string;\n /** Overrides the accessory label for the primary action. */\n ariaLabel?: string;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsRailAccessorySecondaryAction {\n id: string;\n icon: string;\n ariaLabel: string;\n isInactive?: boolean;\n}\n\nexport type PanelToolsRailTransientTone = 'active' | 'positive';\n\ninterface PanelToolsRailAccessoryBase {\n /** Stable application-owned identity. Duplicate or blank ids are omitted. */\n id: string;\n /** Explicit rail region; accessories never infer placement from their id. */\n railPlacement: PanelToolsRailPlacement;\n /** Stable ordering within the selected rail region. */\n order: number;\n}\n\n/** Decorative boundary between application-owned rail accessory groups. */\nexport interface PanelToolsRailDividerAccessory extends PanelToolsRailAccessoryBase {\n type: 'divider';\n}\n\n/**\n * A compact one-action shortcut that matches standard tool-button geometry.\n * PanelTools owns its initial orb, notification dot, and transient interaction paint.\n */\nexport interface PanelToolsRailShortcutAccessory extends PanelToolsRailAccessoryBase {\n type: 'shortcut';\n /** Accessible shortcut name and action-label fallback. */\n ariaLabel: string;\n /** One or two displayed graphemes. Longer values are truncated visually. */\n initials: string;\n /** Supplemental notification dot. Include its meaning in the accessible label when needed. */\n dot?: boolean;\n action: PanelToolsRailAccessoryAction;\n}\n\n/**\n * A direct application intent that never selects a tool or changes drawer state.\n * PanelTools owns the two-control-height surface and its focus behavior.\n */\nexport interface PanelToolsRailTransientAccessory extends PanelToolsRailAccessoryBase {\n type: 'transient';\n /** Accessible accessory name and primary-action fallback label. */\n ariaLabel: string;\n visual: PanelToolsRailAccessoryVisual;\n /** State announced with the primary action and shown in its tooltip. */\n statusText: string;\n /** Bold surface treatment. Active uses brand; positive uses positive semantic color. */\n statusTone: PanelToolsRailTransientTone;\n primaryAction: PanelToolsRailAccessoryAction;\n secondaryAction?: PanelToolsRailAccessorySecondaryAction;\n}\n\nexport type PanelToolsRailAccessory =\n | PanelToolsRailDividerAccessory\n | PanelToolsRailShortcutAccessory\n | PanelToolsRailTransientAccessory;\n\nexport interface PanelToolsRailAccessoryActionDetail {\n accessoryId: string;\n actionId: string;\n /** Rendered action control, suitable for anchoring an application-owned overlay. */\n anchor: HTMLElement;\n}\n\n/** Canonical shell recipe used by Lab and by managed ShellApp examples. */\nexport const PANEL_TOOLS_DEFAULT_ITEMS: PanelToolsItem[] = [\n {\n id: 'agents',\n icon: 'AIAsterisk',\n label: PANEL_TOOLS_LABELS.agents,\n railPlacement: 'header',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.agents,\n mobileDestination: 'agents',\n },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: PANEL_TOOLS_LABELS.messages,\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.messages,\n mobileDestination: 'messages',\n },\n {\n id: 'activity',\n icon: 'Bell',\n label: PANEL_TOOLS_LABELS.activity,\n order: 1,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.activity,\n mobileDestination: 'activity',\n },\n {\n id: 'search',\n icon: 'MagnifyingGlass',\n label: PANEL_TOOLS_LABELS.search,\n order: 2,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.search,\n mobileDestination: 'search',\n },\n {\n id: 'help',\n icon: 'QuestionCircle',\n label: PANEL_TOOLS_LABELS.help,\n railPlacement: 'footer',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.help,\n mobileDestination: 'help',\n },\n];\n\nexport interface PanelToolsHeaderAction {\n id: string;\n icon: string;\n ariaLabel: string;\n triggerId?: string;\n controls?: string;\n expanded?: boolean;\n /** Associated surface remains visible, including exit motion. */\n surfaceOpen?: boolean;\n haspopup?: 'menu' | 'dialog' | 'listbox' | 'tree' | 'grid';\n pressed?: boolean;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsHeaderActionDetail {\n tool: PanelToolsToolId;\n id: string;\n /** Rendered header action host. Pass this to an external overlay's element anchor prop. */\n anchor?: HTMLElement;\n}\n\nexport interface PanelToolHeaderActionDetail {\n id: string;\n originalEvent: MouseEvent;\n /** Rendered action host, suitable for anchoring an external overlay across a shadow boundary. */\n anchor: HTMLElement;\n}\n\nexport interface PanelToolsHeaderConfig {\n title?: string;\n showBack?: boolean;\n backIcon?: string;\n backAriaLabel?: string;\n actions?: PanelToolsHeaderAction[];\n}\n\n/** Per-tool header state. The application replaces the object when a tool changes depth or actions. */\nexport type PanelToolsHeaders = Partial<Record<PanelToolsToolId, PanelToolsHeaderConfig>>;\n", "/** Nav chrome style slot \u2014 dashboard vs settings. Colors unified for now; texture hooks use the class. */\nexport type NavChromeStyle = 'dashboard' | 'settings';\n\n/** Document hint for first paint before framework props land. */\nexport const NAV_STYLE_HINT_ATTR = 'data-nav-style';\n\nexport function readNavStyleAttr(attr: string | null): NavChromeStyle | undefined {\n if (attr === 'dashboard' || attr === 'settings') return attr;\n return undefined;\n}\n\nexport function setNavStyleHint(style: NavChromeStyle): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute(NAV_STYLE_HINT_ATTR, style);\n}\n\nexport function clearNavStyleHint(): void {\n if (typeof document === 'undefined') return;\n document.documentElement.removeAttribute(NAV_STYLE_HINT_ATTR);\n}\n\nexport function resolveNavChromeStyle(\n styleProp: NavChromeStyle,\n hostAttr: string | null,\n docHint?: string | null\n): NavChromeStyle {\n const fromHost = readNavStyleAttr(hostAttr);\n if (fromHost) return fromHost;\n\n const hint =\n docHint !== undefined\n ? docHint\n : typeof document !== 'undefined'\n ? document.documentElement.getAttribute(NAV_STYLE_HINT_ATTR)\n : null;\n const fromHint = readNavStyleAttr(hint);\n if (fromHint) return fromHint;\n\n return styleProp;\n}\n\nexport function shouldResyncNavChromeStyle(\n renderedStyle: NavChromeStyle,\n style: NavChromeStyle\n): boolean {\n return renderedStyle !== style;\n}\n", "import type { ChoicePopupAnchorAlignment } from '../../utils/choice-popup-alignment';\nimport type { MenuAlign, MenuSide } from './menu-position';\n\n/** Placement props bindable on `ds-menu` (side, align, offsets). */\nexport interface MenuPlacement {\n side: MenuSide;\n align: MenuAlign;\n anchorAlignment: ChoicePopupAnchorAlignment;\n sideOffset: number | string;\n alignOffset: number | string;\n}\n\n/**\n * Canonical `ds-menu` placement for the **panel-nav footer user menu**.\n * Anchor from `dsNavUserAction` detail `{ anchor }` (id `ds-panel-nav-user-menu-anchor`).\n *\n * Not for BarNav overflow menus \u2014 those use `side=\"bottom\"` / `align=\"end\"` internally.\n * `align: 'end'` bottom-aligns the last choice cell on the anchor; the side offset nudges into the content area:\n * - `sideOffset` space-100 + space-050 (12px): 4px past the panel-nav outer edge (anchor is ~8px inset).\n * - `anchorAlignment: 'choice-cell'`: the shared section inset puts the last row edge on the footer user row.\n */\nexport const PANEL_NAV_USER_MENU_PLACEMENT = {\n side: 'right',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n\n/**\n * Canonical placement for PanelNav's collapsed child-route flyout.\n * The parent control is 8px inside the panel edge, so a 12px side offset leaves\n * a 4px visual gap outside the panel. Start choice-cell alignment places the\n * first flyout row on the same block axis as its parent control.\n */\nexport const PANEL_NAV_CHILD_MENU_PLACEMENT = {\n side: 'right',\n align: 'start',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n\n/**\n * Canonical placement for a menu opened by a PanelTools header action.\n * Matches BarNav overflow: the 32px trigger is 8px inside the 48px header, so\n * a 12px side offset places the popup 4px below the header edge. Choice-cell\n * alignment keeps the final menu item edge aligned with the trigger.\n */\nexport const PANEL_TOOLS_HEADER_MENU_PLACEMENT = {\n side: 'bottom',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n", "/** Built-in shell chrome wash presets. */\nexport type ShellGradientPreset = 'none' | 'cool' | 'neutral' | 'warm' | 'fresh';\n\nexport const SHELL_GRADIENT_PRESETS: ShellGradientPreset[] = [\n 'none',\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Wash presets shown after the `none` option in pickers. */\nexport const SHELL_GRADIENT_WASH_PRESETS: Exclude<ShellGradientPreset, 'none'>[] = [\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Default wash when `gradient-preset` is omitted. */\nexport const DEFAULT_SHELL_GRADIENT_PRESET: ShellGradientPreset = 'neutral';\n\nexport const SHELL_GRADIENT_PRESET_LABELS: Record<ShellGradientPreset, string> = {\n none: 'None',\n cool: 'Cool',\n neutral: 'Neutral',\n warm: 'Warm',\n fresh: 'Fresh',\n};\n\nexport interface ShellGradientStop {\n color: string;\n position: number;\n}\n\nexport interface ShellGradientRecipe {\n opacity: number;\n stops: readonly ShellGradientStop[];\n}\n\nexport interface ShellGradientPickerPreview {\n backgroundColor: string;\n backgroundImage?: string;\n opacity?: number;\n}\n\nexport interface ShellGradientPickerOption {\n value: ShellGradientPreset;\n label: string;\n preview: ShellGradientPickerPreview;\n}\n\nexport interface ShellGradientPickerSection {\n options: ShellGradientPickerOption[];\n}\n\nconst SHELL_GRADIENT_RECIPES: Record<Exclude<ShellGradientPreset, 'none'>, ShellGradientRecipe> = {\n cool: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-blue-strong-background)', position: 100 },\n ],\n },\n neutral: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-grey-strong-background)', position: 100 },\n ],\n },\n warm: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-yellow-strong-background)', position: 100 },\n ],\n },\n fresh: {\n opacity: 0.4,\n stops: [\n { color: 'var(--color-color-intent-cyan-faint-background)', position: 0 },\n { color: 'var(--color-background-transparent)', position: 47 },\n { color: 'var(--color-background-transparent)', position: 58 },\n { color: 'var(--color-color-intent-red-faint-background)', position: 83 },\n { color: 'var(--color-color-intent-pink-faint-background)', position: 100 },\n ],\n },\n};\n\nconst GRADIENT_GEOMETRY = '100% 100% at 0% 0%';\n\nexport function shellGradientPresetStopToken(preset: ShellGradientPreset): string | null {\n if (preset === 'none') return null;\n const stops = SHELL_GRADIENT_RECIPES[preset].stops;\n return stops[stops.length - 1]?.color ?? null;\n}\n\nexport function shellGradientPresetRecipe(preset: ShellGradientPreset): ShellGradientRecipe | null {\n const normalized = normalizeShellGradientPreset(preset);\n return normalized === 'none' ? null : SHELL_GRADIENT_RECIPES[normalized];\n}\n\nexport function shellGradientPresetOpacity(preset: ShellGradientPreset): string {\n return String(shellGradientPresetRecipe(preset)?.opacity ?? 0);\n}\n\nexport function isShellGradientPreset(value: string): value is ShellGradientPreset {\n return (SHELL_GRADIENT_PRESETS as string[]).includes(value);\n}\n\n/**\n * Coerce unknown/absent presets to the default. Runtime values escape the\n * type: removing the reflected `gradient-preset` attribute (e.g. an Angular\n * `[attr.gradient-preset]=\"null\"` binding) drives the prop to null past its\n * field default \u2014 without normalization the stop lookup interpolates the\n * literal string \"undefined\" into CSS and the wash silently disappears.\n */\nexport function normalizeShellGradientPreset(\n value: string | null | undefined\n): ShellGradientPreset {\n return value != null && isShellGradientPreset(value) ? value : DEFAULT_SHELL_GRADIENT_PRESET;\n}\n\n/** Radial wash for a preset \u2014 transparent at top-left into the intent stop. `none` returns no image. */\nexport function buildShellRadialGradientForPreset(preset: ShellGradientPreset): string {\n const normalized = normalizeShellGradientPreset(preset);\n if (normalized === 'none') return 'none';\n\n return buildShellRadialGradientFromStops(SHELL_GRADIENT_RECIPES[normalized].stops);\n}\n\n/** Build the production shell geometry from an ordered set of design-time stops. */\nexport function buildShellRadialGradientFromStops(stops: readonly ShellGradientStop[]): string {\n const serialized = stops.map(stop => `${stop.color} ${stop.position}%`).join(', ');\n return `radial-gradient(${GRADIENT_GEOMETRY}, ${serialized})`;\n}\n\n/** Generic SwatchPicker sections for the fixed shell appearance presets. */\nexport function shellGradientPickerSections(): ShellGradientPickerSection[] {\n return [\n {\n options: [\n {\n value: 'none',\n label: SHELL_GRADIENT_PRESET_LABELS.none,\n preview: {\n backgroundColor: 'var(--color-chrome-background-theme)',\n },\n },\n ],\n },\n {\n options: SHELL_GRADIENT_WASH_PRESETS.map(preset => ({\n value: preset,\n label: SHELL_GRADIENT_PRESET_LABELS[preset],\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n backgroundImage: buildShellRadialGradientForPreset(preset),\n opacity: Number(shellGradientPresetOpacity(preset)),\n },\n })),\n },\n ];\n}\n", "import type { PanelToolsToolId } from '../components/PanelTools/panel-tools-types';\n\nexport type ShellResponsiveMode = 'desktop' | 'tablet' | 'mobile';\nexport type MobileDestination =\n | 'area'\n | 'search'\n | 'inbox'\n | 'activity'\n | 'messages'\n | 'agents'\n | 'help';\nexport type ShellInboxToolId = PanelToolsToolId;\n\nexport const SHELL_DESKTOP_BREAKPOINT = 1200;\nexport const SHELL_MOBILE_BREAKPOINT = 768;\nexport const SHELL_DEFAULT_INBOX_TOOL: ShellInboxToolId = 'activity';\n\nexport function resolveShellResponsiveMode(width: number): ShellResponsiveMode {\n if (width >= SHELL_DESKTOP_BREAKPOINT) return 'desktop';\n if (width >= SHELL_MOBILE_BREAKPOINT) return 'tablet';\n return 'mobile';\n}\n\nexport function resolveManagedShellPageCapacity(\n mode: ShellResponsiveMode\n): 'roomy' | 'compact' | 'constrained' {\n return mode === 'desktop' ? 'roomy' : 'compact';\n}\n\nexport function shellMobileDestinationForTool(\n open: boolean,\n tool: PanelToolsToolId | ''\n): MobileDestination {\n if (!open || !tool) return 'area';\n if (tool === 'help') return 'help';\n if (tool === 'search') return 'search';\n if (tool === 'messages') return 'messages';\n if (tool === 'agents') return 'agents';\n return 'inbox';\n}\n\n/** Explicit item metadata wins over the legacy canonical Stacks/Activity grouping. */\nexport function itemUsesShellInbox(item: {\n id: PanelToolsToolId;\n mobileDestination?: MobileDestination;\n}): boolean {\n return (\n item.mobileDestination === 'inbox' ||\n (item.mobileDestination === undefined && isShellInboxTool(item.id))\n );\n}\n\nexport function isShellInboxTool(tool: string): tool is ShellInboxToolId {\n return tool === 'stacks' || tool === 'activity';\n}\n\nexport function resolveAvailableInboxTool(\n preferred: string,\n available: readonly PanelToolsToolId[]\n): ShellInboxToolId | '' {\n const inbox = available.filter(isShellInboxTool);\n if (isShellInboxTool(preferred) && inbox.includes(preferred)) return preferred;\n if (inbox.includes(SHELL_DEFAULT_INBOX_TOOL)) return SHELL_DEFAULT_INBOX_TOOL;\n return inbox[0] ?? '';\n}\n\n/** Active-destination reselects are inert unless they also dismiss the Menu pane. */\nexport function shouldEmitMobileDestinationChange(\n active: MobileDestination,\n next: MobileDestination,\n navigationOpen: boolean\n): boolean {\n return navigationOpen || active !== next;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/** Application-owned tool id for the shell rail and responsive tool views. */\nexport type PanelToolsToolId = string;\n\n/** Canonical Motive shell recipe used when item metadata is omitted. */\nexport type CanonicalPanelToolsToolId =\n | 'search'\n | 'messages'\n | 'agents'\n | 'stacks'\n | 'activity'\n | 'help';\n\nexport const PANEL_TOOLS_TOOL_IDS: CanonicalPanelToolsToolId[] = [\n 'agents',\n 'messages',\n 'activity',\n 'search',\n 'stacks',\n 'help',\n];\n\n/** Rail header slot \u2014 mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: CanonicalPanelToolsToolId = 'agents';\n\n/** Rail footer slot \u2014 flush to the bottom of the tools column. */\nexport const PANEL_TOOLS_FOOTER_TOOL_ID: CanonicalPanelToolsToolId = 'help';\n\nexport const PANEL_TOOLS_LABELS: Record<CanonicalPanelToolsToolId, string> = {\n search: 'Search',\n messages: 'Messages',\n stacks: 'Stacks',\n activity: 'Activity',\n agents: 'Agents',\n help: 'Help & Support',\n};\n\nexport const PANEL_TOOLS_SHORTCUTS: Partial<Record<CanonicalPanelToolsToolId, string>> = {\n search: 'K',\n agents: 'A',\n messages: 'M',\n stacks: 'S',\n activity: 'N',\n help: '/',\n};\n\nexport type PanelToolsRailPlacement = 'header' | 'body' | 'footer';\n\nexport interface PanelToolsItem {\n id: PanelToolsToolId;\n /** Icon name for <ds-icon>. */\n icon: string;\n /** Visible and accessible fallback label for custom tool ids. */\n label?: string;\n /** Explicit rail region; canonical Agents/Help placement is the fallback. */\n railPlacement?: PanelToolsRailPlacement;\n /** Stable ordering within the selected rail region. */\n order?: number;\n /** Optional shortcut label displayed by the tooltip. */\n shortcutKey?: string;\n /** Mobile destination recipe; canonical ids retain their explicit defaults. */\n mobileDestination?: 'search' | 'inbox' | 'activity' | 'messages' | 'agents' | 'help';\n /** Whether this rail button is currently pressed/active. */\n selected?: boolean;\n /** Show a notification dot. */\n dot?: boolean;\n isInactive?: boolean;\n ariaLabel?: string;\n}\n\nexport type PanelToolsRailAccessoryVisual =\n | { type: 'icon'; icon: string }\n | { type: 'initial'; initial: string }\n | { type: 'image'; src: string };\n\nexport interface PanelToolsRailAccessoryAction {\n /** Stable application-owned action id emitted with the accessory id. */\n id: string;\n /** Overrides the accessory label for the primary action. */\n ariaLabel?: string;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsRailAccessorySecondaryAction {\n id: string;\n icon: string;\n ariaLabel: string;\n isInactive?: boolean;\n}\n\nexport type PanelToolsRailTransientTone = 'active' | 'positive';\n\ninterface PanelToolsRailAccessoryBase {\n /** Stable application-owned identity. Duplicate or blank ids are omitted. */\n id: string;\n /** Explicit rail region; accessories never infer placement from their id. */\n railPlacement: PanelToolsRailPlacement;\n /** Stable ordering within the selected rail region. */\n order: number;\n}\n\n/** Decorative boundary between application-owned rail accessory groups. */\nexport interface PanelToolsRailDividerAccessory extends PanelToolsRailAccessoryBase {\n type: 'divider';\n}\n\n/**\n * A compact one-action shortcut that matches standard tool-button geometry.\n * PanelTools owns its initial orb, notification dot, and transient interaction paint.\n */\nexport interface PanelToolsRailShortcutAccessory extends PanelToolsRailAccessoryBase {\n type: 'shortcut';\n /** Accessible shortcut name and action-label fallback. */\n ariaLabel: string;\n /** One or two displayed graphemes. Longer values are truncated visually. */\n initials: string;\n /** Supplemental notification dot. Include its meaning in the accessible label when needed. */\n dot?: boolean;\n action: PanelToolsRailAccessoryAction;\n}\n\n/**\n * A direct application intent that never selects a tool or changes drawer state.\n * PanelTools owns the two-control-height surface and its focus behavior.\n */\nexport interface PanelToolsRailTransientAccessory extends PanelToolsRailAccessoryBase {\n type: 'transient';\n /** Accessible accessory name and primary-action fallback label. */\n ariaLabel: string;\n visual: PanelToolsRailAccessoryVisual;\n /** State announced with the primary action and shown in its tooltip. */\n statusText: string;\n /** Bold surface treatment. Active uses brand; positive uses positive semantic color. */\n statusTone: PanelToolsRailTransientTone;\n primaryAction: PanelToolsRailAccessoryAction;\n secondaryAction?: PanelToolsRailAccessorySecondaryAction;\n}\n\nexport type PanelToolsRailAccessory =\n | PanelToolsRailDividerAccessory\n | PanelToolsRailShortcutAccessory\n | PanelToolsRailTransientAccessory;\n\nexport interface PanelToolsRailAccessoryActionDetail {\n accessoryId: string;\n actionId: string;\n /** Rendered action control, suitable for anchoring an application-owned overlay. */\n anchor: HTMLElement;\n}\n\n/** Canonical shell recipe used by Lab and by managed ShellApp examples. */\nexport const PANEL_TOOLS_DEFAULT_ITEMS: PanelToolsItem[] = [\n {\n id: 'agents',\n icon: 'AIAsterisk',\n label: PANEL_TOOLS_LABELS.agents,\n railPlacement: 'header',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.agents,\n mobileDestination: 'agents',\n },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: PANEL_TOOLS_LABELS.messages,\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.messages,\n mobileDestination: 'messages',\n },\n {\n id: 'activity',\n icon: 'Bell',\n label: PANEL_TOOLS_LABELS.activity,\n order: 1,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.activity,\n mobileDestination: 'activity',\n },\n {\n id: 'search',\n icon: 'MagnifyingGlass',\n label: PANEL_TOOLS_LABELS.search,\n order: 2,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.search,\n mobileDestination: 'search',\n },\n {\n id: 'help',\n icon: 'QuestionCircle',\n label: PANEL_TOOLS_LABELS.help,\n railPlacement: 'footer',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.help,\n mobileDestination: 'help',\n },\n];\n\nexport interface PanelToolsHeaderAction {\n id: string;\n icon: string;\n ariaLabel: string;\n triggerId?: string;\n controls?: string;\n expanded?: boolean;\n /** Associated surface remains visible, including exit motion. */\n surfaceOpen?: boolean;\n haspopup?: 'menu' | 'dialog' | 'listbox' | 'tree' | 'grid';\n pressed?: boolean;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsHeaderActionDetail {\n tool: PanelToolsToolId;\n id: string;\n /** Rendered header action host. Pass this to an external overlay's element anchor prop. */\n anchor?: HTMLElement;\n}\n\nexport interface PanelToolHeaderActionDetail {\n id: string;\n originalEvent: MouseEvent;\n /** Rendered action host, suitable for anchoring an external overlay across a shadow boundary. */\n anchor: HTMLElement;\n}\n\nexport interface PanelToolsHeaderConfig {\n title?: string;\n showBack?: boolean;\n backIcon?: string;\n backAriaLabel?: string;\n actions?: PanelToolsHeaderAction[];\n}\n\n/** Per-tool header state. The application replaces the object when a tool changes depth or actions. */\nexport type PanelToolsHeaders = Partial<Record<PanelToolsToolId, PanelToolsHeaderConfig>>;\n", "/** Nav chrome style slot \u2014 dashboard vs settings. Colors unified for now; texture hooks use the class. */\nexport type NavChromeStyle = 'dashboard' | 'settings';\n\n/** Document hint for first paint before framework props land. */\nexport const NAV_STYLE_HINT_ATTR = 'data-nav-style';\n\nexport function readNavStyleAttr(attr: string | null): NavChromeStyle | undefined {\n if (attr === 'dashboard' || attr === 'settings') return attr;\n return undefined;\n}\n\nexport function setNavStyleHint(style: NavChromeStyle): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute(NAV_STYLE_HINT_ATTR, style);\n}\n\nexport function clearNavStyleHint(): void {\n if (typeof document === 'undefined') return;\n document.documentElement.removeAttribute(NAV_STYLE_HINT_ATTR);\n}\n\nexport function resolveNavChromeStyle(\n styleProp: NavChromeStyle,\n hostAttr: string | null,\n docHint?: string | null\n): NavChromeStyle {\n const fromHost = readNavStyleAttr(hostAttr);\n if (fromHost) return fromHost;\n\n const hint =\n docHint !== undefined\n ? docHint\n : typeof document !== 'undefined'\n ? document.documentElement.getAttribute(NAV_STYLE_HINT_ATTR)\n : null;\n const fromHint = readNavStyleAttr(hint);\n if (fromHint) return fromHint;\n\n return styleProp;\n}\n\nexport function shouldResyncNavChromeStyle(\n renderedStyle: NavChromeStyle,\n style: NavChromeStyle\n): boolean {\n return renderedStyle !== style;\n}\n", "import type { ChoicePopupAnchorAlignment } from '../../utils/choice-popup-alignment';\nimport type { MenuAlign, MenuSide } from './menu-position';\n\n/** Placement props bindable on `ds-menu` (side, align, offsets). */\nexport interface MenuPlacement {\n side: MenuSide;\n align: MenuAlign;\n anchorAlignment: ChoicePopupAnchorAlignment;\n sideOffset: number | string;\n alignOffset: number | string;\n}\n\n/**\n * Canonical `ds-menu` placement for the **panel-nav footer user menu**.\n * Anchor from `dsNavUserAction` detail `{ anchor }` (id `ds-panel-nav-user-menu-anchor`).\n *\n * Not for BarNav overflow menus \u2014 those use `side=\"bottom\"` / `align=\"end\"` internally.\n * `align: 'end'` bottom-aligns the last choice cell on the anchor; the side offset nudges into the content area:\n * - `sideOffset` space-100 + space-050 (12px): 4px past the panel-nav outer edge (anchor is ~8px inset).\n * - `anchorAlignment: 'choice-cell'`: the shared section inset puts the last row edge on the footer user row.\n */\nexport const PANEL_NAV_USER_MENU_PLACEMENT = {\n side: 'right',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n\n/**\n * Canonical placement for PanelNav's collapsed child-route flyout.\n * The parent control is 8px inside the panel edge, so a 12px side offset leaves\n * a 4px visual gap outside the panel. Start choice-cell alignment places the\n * first flyout row on the same block axis as its parent control.\n */\nexport const PANEL_NAV_CHILD_MENU_PLACEMENT = {\n side: 'right',\n align: 'start',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n\n/**\n * Canonical placement for a menu opened by a PanelTools header action.\n * Matches BarNav overflow: the 32px trigger is 8px inside the 48px header, so\n * a 12px side offset places the popup 4px below the header edge. Choice-cell\n * alignment keeps the final menu item edge aligned with the trigger.\n */\nexport const PANEL_TOOLS_HEADER_MENU_PLACEMENT = {\n side: 'bottom',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n", "/** Built-in shell chrome wash presets. */\nexport type ShellGradientPreset = 'none' | 'cool' | 'neutral' | 'warm' | 'fresh';\n\nexport const SHELL_GRADIENT_PRESETS: ShellGradientPreset[] = [\n 'none',\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Wash presets shown after the `none` option in pickers. */\nexport const SHELL_GRADIENT_WASH_PRESETS: Exclude<ShellGradientPreset, 'none'>[] = [\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Default wash when `gradient-preset` is omitted. */\nexport const DEFAULT_SHELL_GRADIENT_PRESET: ShellGradientPreset = 'neutral';\n\nexport const SHELL_GRADIENT_PRESET_LABELS: Record<ShellGradientPreset, string> = {\n none: 'None',\n cool: 'Cool',\n neutral: 'Neutral',\n warm: 'Warm',\n fresh: 'Fresh',\n};\n\nexport interface ShellGradientStop {\n color: string;\n position: number;\n}\n\nexport interface ShellGradientRecipe {\n opacity: number;\n stops: readonly ShellGradientStop[];\n}\n\nexport interface ShellGradientPickerPreview {\n backgroundColor: string;\n backgroundImage?: string;\n opacity?: number;\n}\n\nexport interface ShellGradientPickerOption {\n value: ShellGradientPreset;\n label: string;\n preview: ShellGradientPickerPreview;\n}\n\nexport interface ShellGradientPickerSection {\n options: ShellGradientPickerOption[];\n}\n\nconst SHELL_GRADIENT_RECIPES: Record<Exclude<ShellGradientPreset, 'none'>, ShellGradientRecipe> = {\n cool: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-blue-strong-background)', position: 100 },\n ],\n },\n neutral: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-grey-strong-background)', position: 100 },\n ],\n },\n warm: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-yellow-strong-background)', position: 100 },\n ],\n },\n fresh: {\n opacity: 0.4,\n stops: [\n { color: 'var(--color-color-intent-cyan-faint-background)', position: 0 },\n { color: 'var(--color-background-transparent)', position: 47 },\n { color: 'var(--color-background-transparent)', position: 58 },\n { color: 'var(--color-color-intent-red-faint-background)', position: 83 },\n { color: 'var(--color-color-intent-pink-faint-background)', position: 100 },\n ],\n },\n};\n\nconst GRADIENT_GEOMETRY = '100% 100% at 0% 0%';\n\nexport function shellGradientPresetStopToken(preset: ShellGradientPreset): string | null {\n if (preset === 'none') return null;\n const stops = SHELL_GRADIENT_RECIPES[preset].stops;\n return stops[stops.length - 1]?.color ?? null;\n}\n\nexport function shellGradientPresetRecipe(preset: ShellGradientPreset): ShellGradientRecipe | null {\n const normalized = normalizeShellGradientPreset(preset);\n return normalized === 'none' ? null : SHELL_GRADIENT_RECIPES[normalized];\n}\n\nexport function shellGradientPresetOpacity(preset: ShellGradientPreset): string {\n return String(shellGradientPresetRecipe(preset)?.opacity ?? 0);\n}\n\nexport function isShellGradientPreset(value: string): value is ShellGradientPreset {\n return (SHELL_GRADIENT_PRESETS as string[]).includes(value);\n}\n\n/**\n * Coerce unknown/absent presets to the default. Runtime values escape the\n * type: removing the reflected `gradient-preset` attribute (e.g. an Angular\n * `[attr.gradient-preset]=\"null\"` binding) drives the prop to null past its\n * field default \u2014 without normalization the stop lookup interpolates the\n * literal string \"undefined\" into CSS and the wash silently disappears.\n */\nexport function normalizeShellGradientPreset(\n value: string | null | undefined\n): ShellGradientPreset {\n return value != null && isShellGradientPreset(value) ? value : DEFAULT_SHELL_GRADIENT_PRESET;\n}\n\n/** Radial wash for a preset \u2014 transparent at top-left into the intent stop. `none` returns no image. */\nexport function buildShellRadialGradientForPreset(preset: ShellGradientPreset): string {\n const normalized = normalizeShellGradientPreset(preset);\n if (normalized === 'none') return 'none';\n\n return buildShellRadialGradientFromStops(SHELL_GRADIENT_RECIPES[normalized].stops);\n}\n\n/** Build the production shell geometry from an ordered set of design-time stops. */\nexport function buildShellRadialGradientFromStops(stops: readonly ShellGradientStop[]): string {\n const serialized = stops.map(stop => `${stop.color} ${stop.position}%`).join(', ');\n return `radial-gradient(${GRADIENT_GEOMETRY}, ${serialized})`;\n}\n\n/** Generic SwatchPicker sections for the fixed shell appearance presets. */\nexport function shellGradientPickerSections(): ShellGradientPickerSection[] {\n return [\n {\n options: [\n {\n value: 'none',\n label: SHELL_GRADIENT_PRESET_LABELS.none,\n preview: {\n backgroundColor: 'var(--color-chrome-background-theme)',\n },\n },\n ],\n },\n {\n options: SHELL_GRADIENT_WASH_PRESETS.map(preset => ({\n value: preset,\n label: SHELL_GRADIENT_PRESET_LABELS[preset],\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n backgroundImage: buildShellRadialGradientForPreset(preset),\n opacity: Number(shellGradientPresetOpacity(preset)),\n },\n })),\n },\n ];\n}\n", "import type { PanelToolsToolId } from '../components/PanelTools/panel-tools-types';\n\nexport type ShellResponsiveMode = 'desktop' | 'tablet' | 'mobile';\nexport type MobileDestination =\n | 'area'\n | 'search'\n | 'inbox'\n | 'activity'\n | 'messages'\n | 'agents'\n | 'help';\nexport type ShellInboxToolId = PanelToolsToolId;\n\nexport const SHELL_DESKTOP_BREAKPOINT = 1200;\n/** Reserved wide-desktop boundary; it does not change shell presentation. */\nexport const SHELL_WIDE_DESKTOP_BREAKPOINT = 1920;\nexport const SHELL_MOBILE_BREAKPOINT = 768;\nexport const SHELL_DEFAULT_INBOX_TOOL: ShellInboxToolId = 'activity';\n\nexport function resolveShellResponsiveMode(width: number): ShellResponsiveMode {\n if (width >= SHELL_DESKTOP_BREAKPOINT) return 'desktop';\n if (width >= SHELL_MOBILE_BREAKPOINT) return 'tablet';\n return 'mobile';\n}\n\nexport function resolveManagedShellPageCapacity(\n mode: ShellResponsiveMode\n): 'roomy' | 'compact' | 'constrained' {\n return mode === 'desktop' ? 'roomy' : 'compact';\n}\n\nexport function shellMobileDestinationForTool(\n open: boolean,\n tool: PanelToolsToolId | ''\n): MobileDestination {\n if (!open || !tool) return 'area';\n if (tool === 'help') return 'help';\n if (tool === 'search') return 'search';\n if (tool === 'messages') return 'messages';\n if (tool === 'agents') return 'agents';\n return 'inbox';\n}\n\n/** Explicit item metadata wins over the legacy canonical Stacks/Activity grouping. */\nexport function itemUsesShellInbox(item: {\n id: PanelToolsToolId;\n mobileDestination?: MobileDestination;\n}): boolean {\n return (\n item.mobileDestination === 'inbox' ||\n (item.mobileDestination === undefined && isShellInboxTool(item.id))\n );\n}\n\nexport function isShellInboxTool(tool: string): tool is ShellInboxToolId {\n return tool === 'stacks' || tool === 'activity';\n}\n\nexport function resolveAvailableInboxTool(\n preferred: string,\n available: readonly PanelToolsToolId[]\n): ShellInboxToolId | '' {\n const inbox = available.filter(isShellInboxTool);\n if (isShellInboxTool(preferred) && inbox.includes(preferred)) return preferred;\n if (inbox.includes(SHELL_DEFAULT_INBOX_TOOL)) return SHELL_DEFAULT_INBOX_TOOL;\n return inbox[0] ?? '';\n}\n\n/** Active-destination reselects are inert unless they also dismiss the Menu pane. */\nexport function shouldEmitMobileDestinationChange(\n active: MobileDestination,\n next: MobileDestination,\n navigationOpen: boolean\n): boolean {\n return navigationOpen || active !== next;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,8 @@ export type ShellResponsiveMode = 'desktop' | 'tablet' | 'mobile';
3
3
  export type MobileDestination = 'area' | 'search' | 'inbox' | 'activity' | 'messages' | 'agents' | 'help';
4
4
  export type ShellInboxToolId = PanelToolsToolId;
5
5
  export declare const SHELL_DESKTOP_BREAKPOINT = 1200;
6
+ /** Reserved wide-desktop boundary; it does not change shell presentation. */
7
+ export declare const SHELL_WIDE_DESKTOP_BREAKPOINT = 1920;
6
8
  export declare const SHELL_MOBILE_BREAKPOINT = 768;
7
9
  export declare const SHELL_DEFAULT_INBOX_TOOL: ShellInboxToolId;
8
10
  export declare function resolveShellResponsiveMode(width: number): ShellResponsiveMode;
@@ -595,7 +595,7 @@
595
595
  "files": [
596
596
  {
597
597
  "path": "src/wc/components/DataPreferences/DataPreferences.css",
598
- "content": "@import '../../utils/radius.css';\n\n:host {\n display: inline-flex;\n}\n\n.data-preferences {\n position: fixed;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--ds-radius-menu);\n width: min(var(--dimension-menu-width-lg), calc(100vw - var(--dimension-space-200)));\n max-height: calc(100dvh - var(--dimension-space-400));\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--color-background-primary);\n color: var(--color-foreground-secondary);\n box-shadow: var(--effect-shadow-elevated-floating);\n}\n\n.data-preferences::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-floating);\n pointer-events: none;\n z-index: 4;\n}\n\n.data-preferences__tabs {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n box-sizing: border-box;\n flex: 0 0 var(--dimension-size-500);\n min-block-size: var(--dimension-size-500);\n padding: var(--dimension-space-050);\n background: var(--color-background-primary);\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.data-preferences__body {\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n\n:host:has(.data-preferences-panel) {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.data-preferences-panel {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n min-width: 0;\n}\n.data-preferences-panel .data-preferences__tabs {\n flex: 0 0 auto;\n padding: var(--dimension-space-200);\n background: transparent;\n}\n",
598
+ "content": "@import '../../utils/radius.css';\n\n:host {\n display: inline-flex;\n}\n\n.data-preferences {\n position: fixed;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--ds-radius-menu);\n width: min(var(--dimension-menu-width-lg), calc(100vw - var(--dimension-space-200)));\n max-height: calc(100dvh - var(--dimension-space-400));\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--color-background-primary);\n color: var(--color-foreground-secondary);\n box-shadow: var(--effect-shadow-elevated-floating);\n}\n\n.data-preferences::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-floating);\n pointer-events: none;\n z-index: 4;\n}\n\n.data-preferences__tabs {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n box-sizing: border-box;\n flex: 0 0 var(--dimension-size-500);\n min-block-size: var(--dimension-size-500);\n padding: var(--dimension-space-050);\n background: var(--color-background-primary);\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.data-preferences__body {\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n}\n\n.data-preferences-panel .data-preferences__body {\n --ds-chrome-space-sm-padding: var(--dimension-space-100);\n}\n\n:host:has(.data-preferences-panel) {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.data-preferences-panel {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n min-width: 0;\n}\n.data-preferences-panel .data-preferences__tabs {\n flex: 0 0 auto;\n padding: var(--dimension-space-200);\n background: transparent;\n}\n",
599
599
  "type": "registry:ui"
600
600
  },
601
601
  {
@@ -272,7 +272,7 @@
272
272
  },
273
273
  {
274
274
  "path": "src/wc/components/DataSort/data-sort-menu.ts",
275
- "content": "import type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport { isTableActionColumn } from '../Table/table-column-customizer';\nimport type { TableColumn, DataSortState } from '../Table/table-types';\n\nexport const TABLE_SORT_DIRECTION_ASC = 'direction:asc';\nexport const TABLE_SORT_DIRECTION_DESC = 'direction:desc';\nconst TABLE_SORT_FIELD_PREFIX = 'field:';\n\nexport interface TableSortField {\n id: string;\n label: string;\n}\n\n/** Sortable data fields from the catalog, including compound header segments. */\nexport function dataSortFields(columns: readonly TableColumn[]): TableSortField[] {\n const fields: TableSortField[] = [];\n const seen = new Set<string>();\n\n for (const column of columns) {\n if (isTableActionColumn(column) || !column.sortable) continue;\n const segments = column.segments?.filter(segment => segment.sortKey.trim()) ?? [];\n if (segments.length > 0) {\n for (const segment of segments) {\n if (seen.has(segment.sortKey)) continue;\n seen.add(segment.sortKey);\n fields.push({\n id: segment.sortKey,\n label: segment.dataLabel?.trim() || segment.label.trim() || segment.sortKey,\n });\n }\n continue;\n }\n if (seen.has(column.id)) continue;\n seen.add(column.id);\n fields.push({\n id: column.id,\n label:\n column.dataLabel?.trim() ||\n column.label.trim() ||\n column.accessibleLabel?.trim() ||\n column.id,\n });\n }\n\n return fields;\n}\n\nexport function dataSortMenuSections(\n columns: readonly TableColumn[],\n sort: DataSortState | null | undefined\n): MenuSection[] {\n const fields = dataSortFields(columns);\n return [\n {\n header: 'Data',\n items: fields.map(field => ({\n label: field.label,\n value: `${TABLE_SORT_FIELD_PREFIX}${encodeURIComponent(field.id)}`,\n isSelected: sort?.fieldId === field.id,\n })),\n },\n {\n header: 'Order',\n items: [\n {\n label: 'Ascending',\n value: TABLE_SORT_DIRECTION_ASC,\n icon: 'ArrowUp',\n isSelected: sort?.direction === 'asc',\n },\n {\n label: 'Descending',\n value: TABLE_SORT_DIRECTION_DESC,\n icon: 'ArrowDown',\n isSelected: sort?.direction === 'desc',\n },\n ],\n },\n ];\n}\n\nexport function dataSortStatesEqual(\n left: DataSortState | null | undefined,\n right: DataSortState | null | undefined\n): boolean {\n if (left === right) return true;\n if (!left || !right) return false;\n return left.fieldId === right.fieldId && left.direction === right.direction;\n}\n\n/** Next controlled sort from a Sort menu selection. Does not toggle like a header click. */\nexport function nextDataSortStateFromMenuItem(\n columns: readonly TableColumn[],\n current: DataSortState | null | undefined,\n item: MenuItemData\n): DataSortState | null {\n const fields = dataSortFields(columns);\n if (fields.length === 0) return current ?? null;\n\n if (item.value === TABLE_SORT_DIRECTION_ASC || item.value === TABLE_SORT_DIRECTION_DESC) {\n const direction = item.value === TABLE_SORT_DIRECTION_ASC ? 'asc' : 'desc';\n const fieldId = fields.some(field => field.id === current?.fieldId)\n ? current!.fieldId\n : fields[0]!.id;\n return { fieldId, direction };\n }\n\n if (!item.value?.startsWith(TABLE_SORT_FIELD_PREFIX)) return current ?? null;\n let fieldId: string;\n try {\n fieldId = decodeURIComponent(item.value.slice(TABLE_SORT_FIELD_PREFIX.length));\n } catch {\n return current ?? null;\n }\n if (!fields.some(field => field.id === fieldId)) return current ?? null;\n if (current?.fieldId === fieldId) return current ?? null;\n return { fieldId, direction: current?.direction ?? 'asc' };\n}\n",
275
+ "content": "import type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport { isTableActionColumn } from '../Table/table-column-customizer';\nimport type { TableColumn, DataSortState } from '../Table/table-types';\n\nexport const TABLE_SORT_DIRECTION_ASC = 'direction:asc';\nexport const TABLE_SORT_DIRECTION_DESC = 'direction:desc';\nconst TABLE_SORT_FIELD_PREFIX = 'field:';\n\nexport interface TableSortField {\n id: string;\n label: string;\n}\n\n/** Sortable data fields from the catalog, including compound header segments. */\nexport function dataSortFields(columns: readonly TableColumn[]): TableSortField[] {\n const fields: TableSortField[] = [];\n const seen = new Set<string>();\n\n for (const column of columns) {\n if (isTableActionColumn(column) || !column.sortable) continue;\n const segments = column.segments?.filter(segment => segment.sortKey.trim()) ?? [];\n if (segments.length > 0) {\n for (const segment of segments) {\n if (seen.has(segment.sortKey)) continue;\n seen.add(segment.sortKey);\n fields.push({\n id: segment.sortKey,\n label: segment.dataLabel?.trim() || segment.label.trim() || segment.sortKey,\n });\n }\n continue;\n }\n if (seen.has(column.id)) continue;\n seen.add(column.id);\n fields.push({\n id: column.id,\n label:\n column.dataLabel?.trim() ||\n column.label.trim() ||\n column.accessibleLabel?.trim() ||\n column.id,\n });\n }\n\n return fields;\n}\n\nexport function dataSortMenuSections(\n columns: readonly TableColumn[],\n sort: DataSortState | null | undefined\n): MenuSection[] {\n const fields = dataSortFields(columns);\n return [\n {\n header: 'Data',\n items: fields.map(field => ({\n label: field.label,\n value: `${TABLE_SORT_FIELD_PREFIX}${encodeURIComponent(field.id)}`,\n isSelected: sort?.fieldId === field.id,\n })),\n },\n {\n header: 'Order',\n items: [\n {\n label: 'Ascending',\n value: TABLE_SORT_DIRECTION_ASC,\n isSelected: sort?.direction === 'asc',\n },\n {\n label: 'Descending',\n value: TABLE_SORT_DIRECTION_DESC,\n isSelected: sort?.direction === 'desc',\n },\n ],\n },\n ];\n}\n\nexport function dataSortStatesEqual(\n left: DataSortState | null | undefined,\n right: DataSortState | null | undefined\n): boolean {\n if (left === right) return true;\n if (!left || !right) return false;\n return left.fieldId === right.fieldId && left.direction === right.direction;\n}\n\n/** Next controlled sort from a Sort menu selection. Does not toggle like a header click. */\nexport function nextDataSortStateFromMenuItem(\n columns: readonly TableColumn[],\n current: DataSortState | null | undefined,\n item: MenuItemData\n): DataSortState | null {\n const fields = dataSortFields(columns);\n if (fields.length === 0) return current ?? null;\n\n if (item.value === TABLE_SORT_DIRECTION_ASC || item.value === TABLE_SORT_DIRECTION_DESC) {\n const direction = item.value === TABLE_SORT_DIRECTION_ASC ? 'asc' : 'desc';\n const fieldId = fields.some(field => field.id === current?.fieldId)\n ? current!.fieldId\n : fields[0]!.id;\n return { fieldId, direction };\n }\n\n if (!item.value?.startsWith(TABLE_SORT_FIELD_PREFIX)) return current ?? null;\n let fieldId: string;\n try {\n fieldId = decodeURIComponent(item.value.slice(TABLE_SORT_FIELD_PREFIX.length));\n } catch {\n return current ?? null;\n }\n if (!fields.some(field => field.id === fieldId)) return current ?? null;\n if (current?.fieldId === fieldId) return current ?? null;\n return { fieldId, direction: current?.direction ?? 'asc' };\n}\n",
276
276
  "type": "registry:ui"
277
277
  }
278
278
  ]
@@ -13992,6 +13992,7 @@
13992
13992
  "Render exactly one ShellApp as the workspace root and never nest it.",
13993
13993
  "Managed composition is the standard. Supply navigation, pageChrome, and tools objects plus named tool-view and default page-content slots.",
13994
13994
  "The application router owns the current route, authorization filtering, Dashboard or Settings context, destination collections, section collections, and localized content labels.",
13995
+ "The wide-viewport host flag reserves a desktop range for future product experiments without changing responsive mode or chrome presentation.",
13995
13996
  "ShellApp renders the lower-level desktop, tablet, and mobile chrome, coordinates layout, gradient alignment, transitions, shortcuts, global surfaces, optional Inbox state, focus restoration, and mobile-stage visibility.",
13996
13997
  "Desktop and tablet PanelNav and PanelTools width motion is one continuous layout transition: the shell bar or title and routed page must follow the same intermediate lane widths without terminal-state snapping, overlapping chrome, transform scaling, or temporary replacement backgrounds.",
13997
13998
  "The application router owns authorization, current URLs, history, and route execution; ShellApp forwards navigation and page intent events without routing.",
@@ -15691,7 +15692,7 @@
15691
15692
  "accessibility": [
15692
15693
  "The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty. The native caption remains visually hidden as the table's accessible name. When caption visibility is enabled, a 48px header bar renders as component chrome outside the data scrollport. It defaults to a presentational caption title that does not duplicate the accessible name. Application-owned labeled controls supplied through the single named header slot replace that fallback and share one horizontal caption overflow row with table-owned actions inside the component-owned 8px inset. Table caption buttons keep pressed interaction paint without physically scaling. When columnCustomizer is enabled, the table adds a trailing Customize control named Customize table. Its label uses regular weight and its resting foreground remains neutral when hidden or reordered columns differ from the catalog default. The control is icon-label at typical widths and the icon-only Customize menu button below 900px, where a tooltip preserves the Customize label. The always-icon-only table-variant control also exposes its label through a tooltip. Otherwise the header slot receives the complete content width.",
15693
15694
  "The data-mode switcher is the shared Menu of the table's supported infinite, pagination, and virtual modes. It uses an Ellipses trigger. When the column customizer is also present, a decorative vertical divider separates the two controls. The optional caption-trailing slot follows table-owned caption actions for application-owned presentation controls; the application supplies its own divider when needed. dataMode remains controlled, and the application responds to change intent by supplying the matching records, pagination state, loading behavior, and query consequences. Escape, dismissal, and selection return focus to the trigger.",
15694
- "When alternateView is enabled, the alternate-view slot replaces the table frame body while the shared caption and footer remain mounted. The application owns the replacement content's accessible name, filtering, and interaction. Do not render a hidden duplicate semantic table behind that content.",
15695
+ "When alternateView is enabled, the alternate-view slot replaces the table frame body while the shared caption and footer remain mounted. The application owns the replacement content's accessible name, filtering, and interaction. An adjacent presentation control or footer label should commit when the replacement frame and footer have rendered, so the old and new presentations are never painted together. Do not render a hidden duplicate semantic table behind that content.",
15695
15696
  "The column customizer is the shared Menu surface of composite preference rows. Data columns can be shown, hidden, left-pinned, and reordered. Visibility and pin state are independent, so hidden pinned columns retain their pin state. A tertiary divider separates the visibility switch from an unbordered Pin toggle. Pinned and unpinned sections constrain drag reorder to their own partition; a single pinned row keeps its drag handle visible but inactive in quaternary foreground. Action columns and the selection checkbox remain system-managed and never appear in the menu. Escape and outside click restore focus to the trigger. Persistence stays in the application.",
15696
15697
  "Sorting controls remain buttons inside column headers and expose the table's one controlled member-row sort through aria-sort. ds-data-sort in the toolbar trailing cluster is the matching menu of Data and Order sections; it emits the same dsSortChange shape so header clicks and menu choices stay in sync. Grouping never adds a second sort indicator or header control; ds-data-group controls the grouping data point and ascending or descending group-section order while the application supplies the resulting groups. Optional column help underlines the header label with the shared dotted decoration and shows ds-tooltip from that label; it does not add a second header control or replace the column name.",
15697
15698
  "Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window. In virtual mode the supplied in-memory rows are that loaded set, including rows whose DOM is recycled. When grouping is active with multi-selection, each group section header also exposes a checkbox that selects or clears that group's selectable loaded rows.",
@@ -16166,6 +16167,10 @@
16166
16167
  }
16167
16168
  },
16168
16169
  "events": [
16170
+ {
16171
+ "name": "dsAlternateViewRendered",
16172
+ "detail": "{ alternateView: boolean }"
16173
+ },
16169
16174
  {
16170
16175
  "name": "dsCellAction",
16171
16176
  "detail": "TableCellActionDetail"