themelia-react-ui 2.0.4 → 2.0.5

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 (588) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +113 -18
  3. package/dist/{accordion-96o0pN62.js → accordion-B9MHG0cT.js} +11 -11
  4. package/dist/accordion-B9MHG0cT.js.map +1 -0
  5. package/dist/{action-menu-CHgs8vmj.js → action-menu-Dr8K-ghE.js} +48 -45
  6. package/dist/action-menu-Dr8K-ghE.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-B8yGOr8-.js → affordance-geometry.generated-P-aVJisu.js} +36 -36
  8. package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
  9. package/dist/{ai-artifact-BZUGwBq6.js → ai-artifact-C58tQcBy.js} +210 -174
  10. package/dist/ai-artifact-C58tQcBy.js.map +1 -0
  11. package/dist/app-shell-B_IuNWOo.js +321 -0
  12. package/dist/app-shell-B_IuNWOo.js.map +1 -0
  13. package/dist/{attachment-DkoqHPPl.js → attachment-Dg_69lPS.js} +9 -9
  14. package/dist/{attachment-DkoqHPPl.js.map → attachment-Dg_69lPS.js.map} +1 -1
  15. package/dist/{auth-D2FVZ1MH.js → auth-DTkkshS8.js} +43 -46
  16. package/dist/auth-DTkkshS8.js.map +1 -0
  17. package/dist/{avatar-DWO_HHhB.js → avatar-CeZaFmNH.js} +8 -8
  18. package/dist/avatar-CeZaFmNH.js.map +1 -0
  19. package/dist/{badge-DErMA7ul.js → badge-xIiV_E7f.js} +5 -5
  20. package/dist/{badge-DErMA7ul.js.map → badge-xIiV_E7f.js.map} +1 -1
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/batch-action-bar.js +1 -1
  27. package/dist/base/buttons.js +1 -1
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +3 -3
  30. package/dist/base/cascader.js +2 -372
  31. package/dist/base/chart.js +1 -1
  32. package/dist/base/choice-inputs.js +2 -2
  33. package/dist/base/code-block.js +1 -1
  34. package/dist/base/combobox.js +2 -2
  35. package/dist/base/command.js +1 -1
  36. package/dist/base/copyable.js +1 -1
  37. package/dist/base/date-pickers.js +2 -2
  38. package/dist/base/display.js +6 -6
  39. package/dist/base/feedback.js +3 -3
  40. package/dist/base/forms-numeric.js +1 -1
  41. package/dist/base/forms.js +2 -2
  42. package/dist/base/inline-edit.js +10 -10
  43. package/dist/base/item.js +1 -1
  44. package/dist/base/media-gallery.js +1 -1
  45. package/dist/base/metadata-list.js +1 -1
  46. package/dist/base/navigation.js +7 -7
  47. package/dist/base/popover-menu.js +1 -1
  48. package/dist/base/popover.js +1 -1
  49. package/dist/base/qr-code.js +1 -1
  50. package/dist/base/repeaters.js +12 -12
  51. package/dist/base/repeaters.js.map +1 -1
  52. package/dist/base/sheet.js +1 -1
  53. package/dist/base/sidebar.js +2 -2
  54. package/dist/base/signature-pad.js +7 -7
  55. package/dist/base/signature-pad.js.map +1 -1
  56. package/dist/base/skeleton.js +1 -1
  57. package/dist/base/spinner.js +4 -4
  58. package/dist/base/structure.js +1 -1
  59. package/dist/base/table.js +1 -1
  60. package/dist/base/text-inputs.js +2 -2
  61. package/dist/base/toaster.js +36 -36
  62. package/dist/base/toaster.js.map +1 -1
  63. package/dist/base/tree.js +1 -1
  64. package/dist/base/upload-queue.js +1 -1
  65. package/dist/base/upload.js +3 -3
  66. package/dist/base/value-inputs.js +1 -1
  67. package/dist/{batch-action-bar-CdfIkCsV.js → batch-action-bar-Cb8cuvyy.js} +6 -6
  68. package/dist/batch-action-bar-Cb8cuvyy.js.map +1 -0
  69. package/dist/blocks/admin.js +21 -21
  70. package/dist/blocks/admin.js.map +1 -1
  71. package/dist/blocks/ai.js +230 -216
  72. package/dist/blocks/ai.js.map +1 -1
  73. package/dist/blocks/analytics/usage-card.js +1 -1
  74. package/dist/blocks/analytics.js +325 -306
  75. package/dist/blocks/analytics.js.map +1 -1
  76. package/dist/blocks/collaboration.js +1 -1
  77. package/dist/blocks/commerce/receipt.js +1 -1
  78. package/dist/blocks/commerce.js +1259 -1184
  79. package/dist/blocks/commerce.js.map +1 -1
  80. package/dist/blocks/data-display.js +2 -2
  81. package/dist/blocks/onboarding.js +6 -6
  82. package/dist/blocks/onboarding.js.map +1 -1
  83. package/dist/blocks/planning.js +11 -11
  84. package/dist/blocks/timelines.js +1 -1
  85. package/dist/{breadcrumbs-B-WFKecD.js → breadcrumbs-J-K2kl4c.js} +6 -6
  86. package/dist/{breadcrumbs-B-WFKecD.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
  87. package/dist/{button-DkmK-z8E.js → button-S2Cubiiz.js} +3 -3
  88. package/dist/button-S2Cubiiz.js.map +1 -0
  89. package/dist/{buttons-BbfzgczK.js → buttons-BedGfygC.js} +16 -16
  90. package/dist/buttons-BedGfygC.js.map +1 -0
  91. package/dist/cards-rNX1M4Xn.js +69 -0
  92. package/dist/cards-rNX1M4Xn.js.map +1 -0
  93. package/dist/cascader-B1MiqkBq.js +439 -0
  94. package/dist/cascader-B1MiqkBq.js.map +1 -0
  95. package/dist/chart-Darg_0Kv.js +162 -0
  96. package/dist/chart-Darg_0Kv.js.map +1 -0
  97. package/dist/{checkbox-CzYUTPeJ.js → checkbox-fflqmODR.js} +2 -2
  98. package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-fflqmODR.js.map} +1 -1
  99. package/dist/{choice-inputs-JLtij2y4.js → choice-inputs-zUgBZfE4.js} +258 -257
  100. package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
  101. package/dist/{code-block-CGNaUtAE.js → code-block-BzmM9Eig.js} +8 -8
  102. package/dist/code-block-BzmM9Eig.js.map +1 -0
  103. package/dist/{collapsible-Do4G0zcC.js → collapsible-BkAI_XD4.js} +5 -5
  104. package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BkAI_XD4.js.map} +1 -1
  105. package/dist/{collection-content-C0e8SsTm.js → collection-content-gDh1v6O4.js} +3 -3
  106. package/dist/{collection-content-C0e8SsTm.js.map → collection-content-gDh1v6O4.js.map} +1 -1
  107. package/dist/combobox-BEx0vJgF.js +362 -0
  108. package/dist/combobox-BEx0vJgF.js.map +1 -0
  109. package/dist/{combobox-CBJDs6w_.js → combobox-BwzoXFSG.js} +254 -247
  110. package/dist/combobox-BwzoXFSG.js.map +1 -0
  111. package/dist/{command-D8NrBj-b.js → command-CrlPIL6m.js} +11 -11
  112. package/dist/command-CrlPIL6m.js.map +1 -0
  113. package/dist/{comments-Di4w0H_S.js → comments-Dmpp0YIc.js} +29 -29
  114. package/dist/{comments-Di4w0H_S.js.map → comments-Dmpp0YIc.js.map} +1 -1
  115. package/dist/components/base/action-menu/action-menu.d.ts +7 -1
  116. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  117. package/dist/components/base/cards/card.recipes.d.ts +6 -4
  118. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -2
  119. package/dist/components/base/cards/partials/smart-card-header-row.d.ts +3 -1
  120. package/dist/components/base/cards/smart-card.types.d.ts +3 -4
  121. package/dist/components/base/cascader/cascader-panel.d.ts +76 -0
  122. package/dist/components/base/chart/chart.d.ts +6 -1
  123. package/dist/components/base/choice-inputs/choice-types.d.ts +1 -1
  124. package/dist/components/base/combobox/index.d.ts +4 -2
  125. package/dist/components/base/feedback/alert.d.ts +1 -1
  126. package/dist/components/base/forms/form-sizing.d.ts +7 -7
  127. package/dist/components/base/forms/workflow.d.ts +7 -1
  128. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
  129. package/dist/components/base/metadata-list/metadata-list.d.ts +1 -1
  130. package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
  131. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
  132. package/dist/components/base/navigation/page-header/page-header.d.ts +10 -3
  133. package/dist/components/base/popover/popover.d.ts +3 -3
  134. package/dist/components/base/popover/popover.recipes.d.ts +10 -6
  135. package/dist/components/base/sheet/sheet.d.ts +2 -0
  136. package/dist/components/base/sidebar/index.d.ts +1 -1
  137. package/dist/components/base/sidebar/sidebar.d.ts +27 -5
  138. package/dist/components/base/toaster/index.d.ts +1 -0
  139. package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
  140. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +3 -1
  141. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  142. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  143. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  144. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +1 -1
  145. package/dist/components/blocks/commerce/cart-summary/types.d.ts +3 -1
  146. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +1 -1
  147. package/dist/components/blocks/commerce/discount-stack/types.d.ts +3 -1
  148. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  149. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +11 -2
  150. package/dist/components/blocks/commerce/index.d.ts +7 -6
  151. package/dist/components/blocks/commerce/inventory-section/inventory-section.d.ts +1 -1
  152. package/dist/components/blocks/commerce/inventory-section/types.d.ts +7 -2
  153. package/dist/components/blocks/commerce/invoice-header/index.d.ts +2 -1
  154. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  155. package/dist/components/blocks/commerce/invoice-header/types.d.ts +20 -6
  156. package/dist/components/blocks/commerce/invoice-line-items/invoice-line-items.d.ts +1 -1
  157. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +24 -7
  158. package/dist/components/blocks/commerce/invoice-mini/index.d.ts +2 -1
  159. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +7 -1
  160. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +1 -1
  161. package/dist/components/blocks/commerce/order-customer/types.d.ts +9 -1
  162. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +1 -1
  163. package/dist/components/blocks/commerce/refund-status/types.d.ts +3 -1
  164. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  165. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +3 -1
  166. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  167. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +3 -1
  168. package/dist/components/features/activities/activities.types.d.ts +8 -2
  169. package/dist/components/features/activities/partials/activity-marker.d.ts +7 -3
  170. package/dist/components/features/activities/partials/activity-row.d.ts +24 -0
  171. package/dist/components/features/event-calendar/colors.d.ts +2 -2
  172. package/dist/components/features/event-calendar/event-calendar.types.d.ts +4 -0
  173. package/dist/components/features/filters/facets/select-facet.d.ts +2 -1
  174. package/dist/components/features/filters/filters.strings.d.ts +4 -0
  175. package/dist/components/features/filters/filters.types.d.ts +3 -0
  176. package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
  177. package/dist/components/features/filters/partials/filter-popover-content.d.ts +1 -1
  178. package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
  179. package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
  180. package/dist/components/features/filters/utils/filter-utils.d.ts +21 -3
  181. package/dist/components/features/global-search/global-search.types.d.ts +2 -0
  182. package/dist/components/features/global-search/partials/global-search-input.d.ts +10 -0
  183. package/dist/components/features/global-search/partials/global-search-result-row.d.ts +7 -1
  184. package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
  185. package/dist/components/features/media-library/media-library.types.d.ts +14 -4
  186. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  187. package/dist/components/features/products/components/product-options-matrix.d.ts +1 -1
  188. package/dist/components/features/products/components/product-variant-editor.d.ts +1 -1
  189. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  190. package/dist/components/features/products/products.strings.d.ts +9 -1
  191. package/dist/components/features/products/products.types.d.ts +43 -6
  192. package/dist/components/features/resource/resource.d.ts +5 -1
  193. package/dist/components/features/resource/resource.types.d.ts +12 -1
  194. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
  195. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
  196. package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
  197. package/dist/components/features/table/table.types.d.ts +1 -1
  198. package/dist/components/layout/app-shell/app-shell.types.d.ts +35 -6
  199. package/dist/components/layout/app-shell/index.d.ts +1 -1
  200. package/dist/components/layout/app-shell/shell-regions.d.ts +27 -0
  201. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  202. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  203. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  204. package/dist/components/layout/containers/two-column-layout.d.ts +2 -0
  205. package/dist/components/layout/header/header.recipes.d.ts +6 -0
  206. package/dist/components/layout/header/header.types.d.ts +6 -6
  207. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
  208. package/dist/components/layout/page/index.d.ts +2 -1
  209. package/dist/components/layout/page/page.d.ts +1 -0
  210. package/dist/components/layout/page/page.strings.d.ts +11 -0
  211. package/dist/components/layout/page/page.types.d.ts +69 -17
  212. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  213. package/dist/components/layout/settings/settings.d.ts +9 -2
  214. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  215. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  216. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  217. package/dist/components/layout/sidebar/index.d.ts +2 -1
  218. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +36 -0
  219. package/dist/components/layout/sidebar/sidebar.context.d.ts +5 -7
  220. package/dist/components/layout/sidebar/sidebar.types.d.ts +48 -10
  221. package/dist/components/layout/sidebar/sidebar.utils.d.ts +9 -1
  222. package/dist/components/layout/workspace/workspace.types.d.ts +8 -1
  223. package/dist/components/ui/alert-dialog.d.ts +2 -2
  224. package/dist/components/ui/combobox.d.ts +1 -1
  225. package/dist/components/ui/dialog.d.ts +2 -2
  226. package/dist/components/ui/overlay-layer.d.ts +18 -0
  227. package/dist/components/ui/sheet.d.ts +5 -1
  228. package/dist/components/ui/sidebar-state.d.ts +82 -0
  229. package/dist/components/ui/sidebar.d.ts +5 -17
  230. package/dist/{containers-CRmHf7GP.js → containers-CIxwbZt5.js} +26 -18
  231. package/dist/containers-CIxwbZt5.js.map +1 -0
  232. package/dist/{control-group-recipes-DBXmfh2E.js → control-group-recipes-fMuFo0H7.js} +6 -6
  233. package/dist/control-group-recipes-fMuFo0H7.js.map +1 -0
  234. package/dist/{copyable-CnGCZdX4.js → copyable-DIznBqiT.js} +7 -7
  235. package/dist/{copyable-CnGCZdX4.js.map → copyable-DIznBqiT.js.map} +1 -1
  236. package/dist/{data-display-D4oujtx0.js → data-display-BdgCAw8T.js} +268 -277
  237. package/dist/data-display-BdgCAw8T.js.map +1 -0
  238. package/dist/{date-Q7jnXxpk.js → date-Cq8ioE4o.js} +5 -5
  239. package/dist/{date-Q7jnXxpk.js.map → date-Cq8ioE4o.js.map} +1 -1
  240. package/dist/{date-picker-zOt1oNss.js → date-picker-RlIzKom_.js} +446 -437
  241. package/dist/date-picker-RlIzKom_.js.map +1 -0
  242. package/dist/{date-pickers-cj8IXbDC.js → date-pickers-DY-CpXS1.js} +12 -12
  243. package/dist/{date-pickers-cj8IXbDC.js.map → date-pickers-DY-CpXS1.js.map} +1 -1
  244. package/dist/{display-BB4BL_-K.js → display-KsZLw9Ov.js} +9 -9
  245. package/dist/{display-BB4BL_-K.js.map → display-KsZLw9Ov.js.map} +1 -1
  246. package/dist/dropdown-menu-CLs8Lihj.js +194 -0
  247. package/dist/dropdown-menu-CLs8Lihj.js.map +1 -0
  248. package/dist/features/activities.js +302 -253
  249. package/dist/features/activities.js.map +1 -1
  250. package/dist/features/ai-chat.js +15 -14
  251. package/dist/features/ai-chat.js.map +1 -1
  252. package/dist/features/appointment-calendar.js +22 -22
  253. package/dist/features/appointment-calendar.js.map +1 -1
  254. package/dist/features/async-preview.js +11 -10
  255. package/dist/features/async-preview.js.map +1 -1
  256. package/dist/features/combobox.js +1 -1
  257. package/dist/features/comments.js +1 -1
  258. package/dist/features/data-view.js +13 -13
  259. package/dist/features/data-view.js.map +1 -1
  260. package/dist/features/email-composer.js +237 -238
  261. package/dist/features/email-composer.js.map +1 -1
  262. package/dist/features/event-calendar.js +140 -146
  263. package/dist/features/event-calendar.js.map +1 -1
  264. package/dist/features/filters.js +1 -1
  265. package/dist/features/global-search.js +167 -138
  266. package/dist/features/global-search.js.map +1 -1
  267. package/dist/features/kanban.js +6 -7
  268. package/dist/features/kanban.js.map +1 -1
  269. package/dist/features/map.js +269 -260
  270. package/dist/features/map.js.map +1 -1
  271. package/dist/features/media-library.js +375 -326
  272. package/dist/features/media-library.js.map +1 -1
  273. package/dist/features/mentions.js +1 -1
  274. package/dist/features/overlays.js +1 -1
  275. package/dist/features/products.js +1266 -1193
  276. package/dist/features/products.js.map +1 -1
  277. package/dist/features/questionnaire.js +13 -13
  278. package/dist/features/questionnaire.js.map +1 -1
  279. package/dist/features/resource-assignment.js +8 -8
  280. package/dist/features/resource.js +69 -66
  281. package/dist/features/resource.js.map +1 -1
  282. package/dist/features/rich-text-editor.js +2 -2
  283. package/dist/features/schema-form.js +13 -13
  284. package/dist/features/suggestions.js +3 -3
  285. package/dist/features/sync.js +3 -3
  286. package/dist/features/table.js +1 -1
  287. package/dist/features/theme-tweaker.js +94 -95
  288. package/dist/features/theme-tweaker.js.map +1 -1
  289. package/dist/{feedback-DZNL5Lg1.js → feedback-Dm4izqFn.js} +80 -79
  290. package/dist/feedback-Dm4izqFn.js.map +1 -0
  291. package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
  292. package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
  293. package/dist/{filters-BcT-uoFy.js → filters-DzgSJpMK.js} +693 -645
  294. package/dist/filters-DzgSJpMK.js.map +1 -0
  295. package/dist/{form-field-CsgRmdit.js → form-field-BriWAXyg.js} +6 -6
  296. package/dist/{form-field-CsgRmdit.js.map → form-field-BriWAXyg.js.map} +1 -1
  297. package/dist/{form-sizing-NXgjkmBG.js → form-sizing-Bs2qFUeE.js} +4 -4
  298. package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
  299. package/dist/{forms-BV5m5aQF.js → forms-C0RGnJTe.js} +17 -13
  300. package/dist/forms-C0RGnJTe.js.map +1 -0
  301. package/dist/{forms-numeric-Cd33AKbD.js → forms-numeric-DIhghX1Q.js} +86 -82
  302. package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
  303. package/dist/{header-BA697l4a.js → header-DMMxG__r.js} +67 -63
  304. package/dist/header-DMMxG__r.js.map +1 -0
  305. package/dist/header.recipes-BigdJjw1.js +6 -0
  306. package/dist/header.recipes-BigdJjw1.js.map +1 -0
  307. package/dist/{hooks-BQ-L7Uu2.js → hooks-DB6CJ4MR.js} +26 -14
  308. package/dist/hooks-DB6CJ4MR.js.map +1 -0
  309. package/dist/{icon-badge-COWbCCWu.js → icon-badge-DZF-YjQp.js} +4 -4
  310. package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
  311. package/dist/index.js +4 -5
  312. package/dist/{input-Cdw4k0fb.js → input-CvyDQlY7.js} +8 -8
  313. package/dist/{input-Cdw4k0fb.js.map → input-CvyDQlY7.js.map} +1 -1
  314. package/dist/input-DMBwAZmr.js +21 -0
  315. package/dist/input-DMBwAZmr.js.map +1 -0
  316. package/dist/{item-BvZ2DR_x.js → item-DjCcM18E.js} +16 -16
  317. package/dist/item-DjCcM18E.js.map +1 -0
  318. package/dist/layout/app-shell.js +1 -1
  319. package/dist/layout/auth.js +1 -1
  320. package/dist/layout/containers.js +1 -1
  321. package/dist/layout/header.js +1 -1
  322. package/dist/layout/hooks.js +1 -1
  323. package/dist/layout/navigation.js +1 -1
  324. package/dist/layout/page.js +2 -2
  325. package/dist/layout/settings.js +1 -1
  326. package/dist/layout/sidebar.js +3 -3
  327. package/dist/layout/workspace.js +1 -1
  328. package/dist/layout.js +11 -11
  329. package/dist/lib/affordance-geometry.generated.d.ts +35 -35
  330. package/dist/lib/control-group-recipes.d.ts +5 -5
  331. package/dist/lib/field-affordance-recipes.d.ts +2 -2
  332. package/dist/lib/motion-recipes.d.ts +3 -0
  333. package/dist/lib/navigation-row-recipes.d.ts +7 -7
  334. package/dist/lib/overlay-anatomy-recipes.d.ts +3 -3
  335. package/dist/lib/portal-recipes.d.ts +3 -0
  336. package/dist/lib/token-merge.generated.d.ts +13 -10
  337. package/dist/lib/utils.js +1 -1
  338. package/dist/map-demo-tile.svg +1 -1
  339. package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C-vChPmE.js} +6 -6
  340. package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C-vChPmE.js.map} +1 -1
  341. package/dist/{mentions-RKOQaaIB.js → mentions-0_4nWuI-.js} +10 -10
  342. package/dist/{mentions-RKOQaaIB.js.map → mentions-0_4nWuI-.js.map} +1 -1
  343. package/dist/{message-INU2xsxu.js → message-g8p7eVtN.js} +7 -7
  344. package/dist/message-g8p7eVtN.js.map +1 -0
  345. package/dist/{metadata-list-qVV7AVxa.js → metadata-list-C3MkU-Om.js} +64 -64
  346. package/dist/metadata-list-C3MkU-Om.js.map +1 -0
  347. package/dist/{motion-recipes-ChBg4HBq.js → motion-recipes-DitYv6P2.js} +10 -2
  348. package/dist/motion-recipes-DitYv6P2.js.map +1 -0
  349. package/dist/navigation-C90-oQFq.js +255 -0
  350. package/dist/navigation-C90-oQFq.js.map +1 -0
  351. package/dist/{navigation-BQNcg1jT.js → navigation-DaRjthVk.js} +101 -82
  352. package/dist/navigation-DaRjthVk.js.map +1 -0
  353. package/dist/{navigation-row-recipes-WZEs-hYo.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
  354. package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
  355. package/dist/{number-E_OiIfJz.js → number-CRU3kGuk.js} +5 -5
  356. package/dist/{number-E_OiIfJz.js.map → number-CRU3kGuk.js.map} +1 -1
  357. package/dist/overflow-tab-bar-IVFVQFV6.js +172 -0
  358. package/dist/overflow-tab-bar-IVFVQFV6.js.map +1 -0
  359. package/dist/overlays-BSgCtM2v.js +1013 -0
  360. package/dist/overlays-BSgCtM2v.js.map +1 -0
  361. package/dist/page-DUUKDAjo.js +331 -0
  362. package/dist/page-DUUKDAjo.js.map +1 -0
  363. package/dist/page-header-commands-7P3sfE9u.js +193 -0
  364. package/dist/page-header-commands-7P3sfE9u.js.map +1 -0
  365. package/dist/{pagination-Ch8X_47u.js → pagination-CgCjElfu.js} +7 -7
  366. package/dist/{pagination-Ch8X_47u.js.map → pagination-CgCjElfu.js.map} +1 -1
  367. package/dist/popover-B85RenIl.js +201 -0
  368. package/dist/popover-B85RenIl.js.map +1 -0
  369. package/dist/{popover-menu-BYaCdFhf.js → popover-menu-DlnQ2zlR.js} +7 -7
  370. package/dist/{popover-menu-BYaCdFhf.js.map → popover-menu-DlnQ2zlR.js.map} +1 -1
  371. package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DdiEp0rd.js} +18 -11
  372. package/dist/popover.recipes-DdiEp0rd.js.map +1 -0
  373. package/dist/portal-recipes-BpsV_iRw.js +9 -0
  374. package/dist/portal-recipes-BpsV_iRw.js.map +1 -0
  375. package/dist/{primitives-Du64iDbb.js → primitives-ByWgGUgt.js} +5 -5
  376. package/dist/{primitives-Du64iDbb.js.map → primitives-ByWgGUgt.js.map} +1 -1
  377. package/dist/primitives.js +4 -4
  378. package/dist/{progress-BvF2oCdV.js → progress-BJhQP9WX.js} +9 -9
  379. package/dist/{progress-BvF2oCdV.js.map → progress-BJhQP9WX.js.map} +1 -1
  380. package/dist/{receipt-D789Jwyy.js → receipt-tOc7B3hw.js} +7 -7
  381. package/dist/receipt-tOc7B3hw.js.map +1 -0
  382. package/dist/{rich-text-CLJEf76s.js → rich-text-Dth5E882.js} +3 -3
  383. package/dist/{rich-text-CLJEf76s.js.map → rich-text-Dth5E882.js.map} +1 -1
  384. package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-C1fOjBTd.js} +429 -430
  385. package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
  386. package/dist/{rich-text-editor-toolbar-L__e4x47.js → rich-text-editor-toolbar-laT3tpBT.js} +32 -28
  387. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
  388. package/dist/{scroll-area-La5RXsEk.js → scroll-area-B0dB2cBi.js} +2 -2
  389. package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
  390. package/dist/{separator-DAEV0w65.js → separator-Bb17I4pu.js} +2 -2
  391. package/dist/{separator-DAEV0w65.js.map → separator-Bb17I4pu.js.map} +1 -1
  392. package/dist/{separator-GNfPG-90.js → separator-Ct_WSWTJ.js} +3 -3
  393. package/dist/{separator-GNfPG-90.js.map → separator-Ct_WSWTJ.js.map} +1 -1
  394. package/dist/services/actions.js +1 -1
  395. package/dist/{settings-BA2iboic.js → settings-Bar5wiSo.js} +31 -38
  396. package/dist/settings-Bar5wiSo.js.map +1 -0
  397. package/dist/sheet-BGPERY55.js +250 -0
  398. package/dist/sheet-BGPERY55.js.map +1 -0
  399. package/dist/sidebar-D-JYMMbY.js +686 -0
  400. package/dist/sidebar-D-JYMMbY.js.map +1 -0
  401. package/dist/sidebar-f9gRWXIR.js +1001 -0
  402. package/dist/sidebar-f9gRWXIR.js.map +1 -0
  403. package/dist/skeleton-BapcJd9C.js +265 -0
  404. package/dist/skeleton-BapcJd9C.js.map +1 -0
  405. package/dist/smart-card-CW0hjetE.js +617 -0
  406. package/dist/smart-card-CW0hjetE.js.map +1 -0
  407. package/dist/{structure-C0V0_Fyf.js → structure-DuxKl954.js} +2 -2
  408. package/dist/{structure-C0V0_Fyf.js.map → structure-DuxKl954.js.map} +1 -1
  409. package/dist/style.css +1 -1
  410. package/dist/{table-CpvnzJn9.js → table-B4TE7iOV.js} +3 -3
  411. package/dist/{table-CpvnzJn9.js.map → table-B4TE7iOV.js.map} +1 -1
  412. package/dist/{table-DH7rozUv.js → table-CFOWY9pQ.js} +394 -388
  413. package/dist/table-CFOWY9pQ.js.map +1 -0
  414. package/dist/{tabs-eqVsJZWO.js → tabs-e7ko9S2o.js} +11 -11
  415. package/dist/tabs-e7ko9S2o.js.map +1 -0
  416. package/dist/{text-inputs-DXItiR0O.js → text-inputs-B1culiSK.js} +17 -17
  417. package/dist/text-inputs-B1culiSK.js.map +1 -0
  418. package/dist/theme.css +40 -37
  419. package/dist/{timelines-DmtztAY_.js → timelines-D3Sl9ueq.js} +13 -12
  420. package/dist/timelines-D3Sl9ueq.js.map +1 -0
  421. package/dist/tooltip-8wz5S_Zr.js +113 -0
  422. package/dist/tooltip-8wz5S_Zr.js.map +1 -0
  423. package/dist/{tree-CV11PURP.js → tree-CzUJHnFs.js} +8 -8
  424. package/dist/{tree-CV11PURP.js.map → tree-CzUJHnFs.js.map} +1 -1
  425. package/dist/typography/rich-text.js +1 -1
  426. package/dist/{typography-CSyJrh28.js → typography-BQnine1k.js} +12 -12
  427. package/dist/{typography-CSyJrh28.js.map → typography-BQnine1k.js.map} +1 -1
  428. package/dist/typography.js +1 -1
  429. package/dist/ui-provider-C-74NVLc.js +178 -0
  430. package/dist/ui-provider-C-74NVLc.js.map +1 -0
  431. package/dist/ui-provider.js +2 -3
  432. package/dist/{upload-C9SA0X-8.js → upload-BOW6U2tI.js} +25 -24
  433. package/dist/upload-BOW6U2tI.js.map +1 -0
  434. package/dist/{upload-queue-DhQJiSRc.js → upload-queue-qUXn1ykN.js} +16 -14
  435. package/dist/upload-queue-qUXn1ykN.js.map +1 -0
  436. package/dist/{usage-card-DVTRDmGz.js → usage-card-BeSLY0i0.js} +24 -17
  437. package/dist/usage-card-BeSLY0i0.js.map +1 -0
  438. package/dist/{utils-CF3c95Io.js → utils-B6kKb8jB.js} +237 -141
  439. package/dist/utils-B6kKb8jB.js.map +1 -0
  440. package/dist/value-inputs-skdVB2zh.js +980 -0
  441. package/dist/value-inputs-skdVB2zh.js.map +1 -0
  442. package/dist/{value-typography-ClupF0Gz.js → value-typography-uAmWUAL1.js} +2 -2
  443. package/dist/{value-typography-ClupF0Gz.js.map → value-typography-uAmWUAL1.js.map} +1 -1
  444. package/dist/{workspace-9EFVXUyk.js → workspace-DHeHv0qw.js} +50 -49
  445. package/dist/workspace-DHeHv0qw.js.map +1 -0
  446. package/docs/consumer-skill/SKILL.md +4 -3
  447. package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
  448. package/docs/consumer-skill/examples/app-layout.tsx +52 -1
  449. package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
  450. package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
  451. package/docs/consumer-skill/examples/detail.tsx +5 -4
  452. package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
  453. package/docs/consumer-skill/examples/index-table.tsx +4 -4
  454. package/docs/consumer-skill/examples/manifest.json +38 -1
  455. package/docs/consumer-skill/examples/product-media.tsx +41 -0
  456. package/docs/consumer-skill/examples/product-parts.tsx +81 -0
  457. package/docs/consumer-skill/examples/rhf-edit-page.tsx +1 -1
  458. package/docs/consumer-skill/examples/rhf-overlay-form.tsx +24 -11
  459. package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
  460. package/docs/consumer-skill/references/agents-md.md +19 -17
  461. package/docs/consumer-skill/references/analytics.md +18 -1
  462. package/docs/consumer-skill/references/commerce-composition.md +97 -0
  463. package/docs/consumer-skill/references/component-contracts.json +7131 -1754
  464. package/docs/consumer-skill/references/composition-mapping.md +17 -3
  465. package/docs/consumer-skill/references/composition.md +159 -31
  466. package/docs/consumer-skill/references/critique-rubric.md +98 -0
  467. package/docs/consumer-skill/references/custom-composition.md +261 -0
  468. package/docs/consumer-skill/references/data-reading.md +79 -0
  469. package/docs/consumer-skill/references/design-contract.md +11 -9
  470. package/docs/consumer-skill/references/discovery.md +27 -3
  471. package/docs/consumer-skill/references/domain-structures.md +124 -0
  472. package/docs/consumer-skill/references/installation.md +15 -4
  473. package/docs/consumer-skill/references/integration.md +35 -0
  474. package/docs/consumer-skill/references/product-composition.md +94 -0
  475. package/docs/consumer-skill/references/public-api.json +2881 -420
  476. package/docs/consumer-skill/references/review.md +39 -2
  477. package/docs/consumer-skill/references/rhf-workflows.md +7 -0
  478. package/docs/consumer-skill/references/screen-archetypes.md +19 -7
  479. package/docs/consumer-skill/references/screen-decisions.md +126 -0
  480. package/docs/consumer-skill/references/theming.md +17 -18
  481. package/docs/consumer-skill/references/tokens.json +9 -9
  482. package/docs/consumer-skill/references/view-craft.md +153 -0
  483. package/docs/consumer-skill/references/view-spec.md +73 -0
  484. package/docs/consumer-skill/references/workflows.md +7 -1
  485. package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
  486. package/docs/consumer-skill/scripts/composition-schema.mjs +1 -1
  487. package/docs/consumer-skill/scripts/composition.mjs +61 -5
  488. package/docs/consumer-skill/scripts/discovery.mjs +54 -0
  489. package/docs/consumer-skill/scripts/inspect-component.mjs +1 -1
  490. package/docs/consumer-skill/scripts/inspection.mjs +73 -18
  491. package/docs/consumer-skill/scripts/setup-skills.mjs +41 -6
  492. package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
  493. package/docs/consumer-skills/themelia-components/SKILL.md +14 -13
  494. package/docs/consumer-skills/themelia-composition/SKILL.md +16 -17
  495. package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
  496. package/docs/consumer-skills/themelia-foundation/SKILL.md +2 -1
  497. package/docs/consumer-skills/themelia-tokenization/SKILL.md +24 -17
  498. package/package.json +1 -1
  499. package/dist/accordion-96o0pN62.js.map +0 -1
  500. package/dist/action-menu-CHgs8vmj.js.map +0 -1
  501. package/dist/affordance-geometry.generated-B8yGOr8-.js.map +0 -1
  502. package/dist/ai-artifact-BZUGwBq6.js.map +0 -1
  503. package/dist/app-shell-D63ATkIK.js +0 -237
  504. package/dist/app-shell-D63ATkIK.js.map +0 -1
  505. package/dist/auth-D2FVZ1MH.js.map +0 -1
  506. package/dist/avatar-DWO_HHhB.js.map +0 -1
  507. package/dist/base/cascader.js.map +0 -1
  508. package/dist/batch-action-bar-CdfIkCsV.js.map +0 -1
  509. package/dist/button-DkmK-z8E.js.map +0 -1
  510. package/dist/buttons-BbfzgczK.js.map +0 -1
  511. package/dist/cards-4JTWqvVe.js +0 -68
  512. package/dist/cards-4JTWqvVe.js.map +0 -1
  513. package/dist/chart-C19flDQb.js +0 -155
  514. package/dist/chart-C19flDQb.js.map +0 -1
  515. package/dist/choice-inputs-JLtij2y4.js.map +0 -1
  516. package/dist/code-block-CGNaUtAE.js.map +0 -1
  517. package/dist/combobox-CBJDs6w_.js.map +0 -1
  518. package/dist/combobox-hbhSS18O.js +0 -355
  519. package/dist/combobox-hbhSS18O.js.map +0 -1
  520. package/dist/command-D8NrBj-b.js.map +0 -1
  521. package/dist/containers-CRmHf7GP.js.map +0 -1
  522. package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
  523. package/dist/data-display-D4oujtx0.js.map +0 -1
  524. package/dist/date-picker-zOt1oNss.js.map +0 -1
  525. package/dist/dropdown-menu-CjY8Vt7W.js +0 -193
  526. package/dist/dropdown-menu-CjY8Vt7W.js.map +0 -1
  527. package/dist/feedback-DZNL5Lg1.js.map +0 -1
  528. package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
  529. package/dist/filters-BcT-uoFy.js.map +0 -1
  530. package/dist/form-sizing-NXgjkmBG.js.map +0 -1
  531. package/dist/forms-BV5m5aQF.js.map +0 -1
  532. package/dist/forms-numeric-Cd33AKbD.js.map +0 -1
  533. package/dist/header-BA697l4a.js.map +0 -1
  534. package/dist/hooks-BQ-L7Uu2.js.map +0 -1
  535. package/dist/input-DOPL5_QE.js +0 -21
  536. package/dist/input-DOPL5_QE.js.map +0 -1
  537. package/dist/item-BvZ2DR_x.js.map +0 -1
  538. package/dist/message-INU2xsxu.js.map +0 -1
  539. package/dist/metadata-list-qVV7AVxa.js.map +0 -1
  540. package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
  541. package/dist/navigation-BQNcg1jT.js.map +0 -1
  542. package/dist/navigation-DLF3E1IC.js +0 -145
  543. package/dist/navigation-DLF3E1IC.js.map +0 -1
  544. package/dist/navigation-row-recipes-WZEs-hYo.js.map +0 -1
  545. package/dist/overflow-tab-bar-CrbqMteP.js +0 -284
  546. package/dist/overflow-tab-bar-CrbqMteP.js.map +0 -1
  547. package/dist/overlays-BlKynmde.js +0 -1004
  548. package/dist/overlays-BlKynmde.js.map +0 -1
  549. package/dist/page-CIwNUtGr.js +0 -227
  550. package/dist/page-CIwNUtGr.js.map +0 -1
  551. package/dist/page-header-commands-DFMlNYzN.js +0 -128
  552. package/dist/page-header-commands-DFMlNYzN.js.map +0 -1
  553. package/dist/popover-uwzX2vo7.js +0 -198
  554. package/dist/popover-uwzX2vo7.js.map +0 -1
  555. package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
  556. package/dist/receipt-D789Jwyy.js.map +0 -1
  557. package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
  558. package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
  559. package/dist/settings-BA2iboic.js.map +0 -1
  560. package/dist/sheet-DoAxTb2J.js +0 -213
  561. package/dist/sheet-DoAxTb2J.js.map +0 -1
  562. package/dist/sidebar-ByqKR_W5.js +0 -512
  563. package/dist/sidebar-ByqKR_W5.js.map +0 -1
  564. package/dist/sidebar-D2iSnGJ7.js +0 -619
  565. package/dist/sidebar-D2iSnGJ7.js.map +0 -1
  566. package/dist/skeleton-CUj8O5Bd.js +0 -264
  567. package/dist/skeleton-CUj8O5Bd.js.map +0 -1
  568. package/dist/smart-card-CqkzQsK-.js +0 -614
  569. package/dist/smart-card-CqkzQsK-.js.map +0 -1
  570. package/dist/table-DH7rozUv.js.map +0 -1
  571. package/dist/tabs-eqVsJZWO.js.map +0 -1
  572. package/dist/text-inputs-DXItiR0O.js.map +0 -1
  573. package/dist/theme-scope-BJ6eE2xt.js +0 -50
  574. package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
  575. package/dist/timelines-DmtztAY_.js.map +0 -1
  576. package/dist/tooltip-B4hjKtoV.js +0 -111
  577. package/dist/tooltip-B4hjKtoV.js.map +0 -1
  578. package/dist/ui-provider-CQCuCBcy.js +0 -136
  579. package/dist/ui-provider-CQCuCBcy.js.map +0 -1
  580. package/dist/upload-C9SA0X-8.js.map +0 -1
  581. package/dist/upload-queue-DhQJiSRc.js.map +0 -1
  582. package/dist/usage-card-DVTRDmGz.js.map +0 -1
  583. package/dist/use-mobile-vaLKwgyf.js +0 -15
  584. package/dist/use-mobile-vaLKwgyf.js.map +0 -1
  585. package/dist/utils-CF3c95Io.js.map +0 -1
  586. package/dist/value-inputs-C0o70p-U.js +0 -980
  587. package/dist/value-inputs-C0o70p-U.js.map +0 -1
  588. package/dist/workspace-9EFVXUyk.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker-RlIzKom_.js","names":["Calendar","React","Button","React","_Fragment","React","ToggleGroup","ToggleGroupPrimitive","TogglePrimitive","React","ToggleGroup","React","CalendarIcon","Calendar","_Fragment","React","CalendarIcon","Calendar","_Fragment","React","CalendarIcon","Calendar","_Fragment","React","useDensityConfig","useDatesConfig","cn","affordanceGeometry","Button","Label","Text","Heading","focusRecipes","buttonVariants","Button$1","Grid","Stack","formatDateRange","Separator","fieldStateRecipes","selectToggleRecipes","formControlSizeClasses","formFieldTriggerClasses","formControlIconClasses","resolveFormControlSize","Input","PopoverTrigger","Popover","PopoverContent","FormField","React$1","Fragment$1","padTimeSegment","value","clamp","min","max","alignSecondsToStep","step","totalSeconds","lastOfDay","aligned","parseTimeString","timeString","parts","hRaw","mRaw","sRaw","hours","minutes","seconds","normalizedTimeToString","secondsPart","includeSeconds","time","createDefaultNormalizedTime","source","date","alignedSeconds","alignedHours","alignedMinutes","alignedSecondsRemainder","normalizedTimeToDisplaySegments","format","period","displayHour","displaySegmentsToNormalizedTime","parseSegment","numeric","segments","isPM","alignNormalizedTimeToStep","formatNormalizedTimeForDisplay","periodLabel","labels","QUOTED_TEXT_REGEX","TIME_TOKEN_REGEX","readableFormatIncludesTime","sanitized","getDayPickerYearBounds","yearSelection","createDateOutput","options","locale","dateFormat","readableFormat","createMultipleDatesOutput","dates","d","createDateRangeOutput","range","applyTimeToDate","normalized","newDate","calculateDaysDifference","to","from","validateDateRange","daysDiff","getRangeValidationMessage","translations","getMultipleDatesValidationMessage","required","formatDateButtonText","text","placeholder","defaultPlaceholder","formatMultipleDatesButtonText","formatRangeButtonText","resolvePickerButtonProps","tone","buttonStyle","isSingleMode","props","isMultipleMode","isRangeMode","getDefaultPresets","t","startOfWeek","endOfWeek","startOfMonth","endOfMonth","addDays","Calendar$1","defaultClassNames","getDefaultClassNames","DayPicker","className","formatters","buttonVariant","captionLayout","classNames","rootRef","orientation","ChevronLeftIcon","ChevronRightIcon","ChevronDownIcon","CalendarDayButton","components","ref","modifiers","day","DatePickerField","hasError","error","showHint","hint","label","triggerId","children","describedById","DatePickerFooter","config","visibleActions","actions","action","customText","output","displayText","showSummary","autoSummary","showOnlyWhenSelected","hasSelection","isDisabled","DatePickerHeader","Icon","align","title","description","usePickerTriggerSize","sizeProp","defaultScale","iconOnlyWidth","pickerTriggerClasses","size","iconOnly","defaultDatePickerStrings","days","count","toggleVariants","cva","ToggleGroupContext","ToggleGroup$1","ToggleGroup","variant","spacing","ToggleGroupItem","context","Toggle","defaultTimePickerStrings","SEGMENT_ORDER","DEFAULT_24H","DEFAULT_12H","BLANK","periodItemClasses","segmentWidthClasses","sanitizeNumeric","ensureTwoDigits","getNextKey","activeOrder","idx","key","getPreviousKey","hoursToDisplay","determinePeriodFromHours","segmentsWithDefaults","blankSegments","fillBlanks","fallbackHours","segmentsFromValue","parsed","TimePicker","stringsProp","useStrings","precision","open","setOpen","setSegments","segmentsRef","isLocalEditRef","digitEntryRef","updateSegments","next","inputRefs","toTimeString","emitAligned","segs","onValueChange","commitSegments","focusSegment","applyDigitInput","current","inProgress","typed","segmentKey","digit","candidate","nextPeriod","updated","handleNumericChange","rawValue","v","handlePeriodChange","handleBlur","handleFocus","event","handleKeyDown","target","periodToggleValue","segmentLabels","editor","mode","node","id","index","values","isBlank","triggerText","invalid","Clock","SingleDatePicker","baseProps","generatedTriggerId","describedBy","isInvalid","ariaDescribedBy","timeFormat","withTime","timeStep","readableHasTime","showTimeInButton","setDate","defaultValue","setTime","initial","previousValueRef","defaultInitializedRef","lastValueDefinedRef","createOutput","finalDate","selectedDate","effectiveTime","overrideTime","applied","dateFnsLocale","isTimeEnabled","wasValueDefined","isValueDefined","applyState","baseDate","emitChange","prevTime","valueTime","handleSelect","seededTime","closeOnSelect","handleTimeChange","nextTime","timeDisplay","buttonText","footerSummary","resolved","triggerProps","Calendar","disabledDates","yearBounds","calendarProps","MultipleDatePicker","setDates","selectedDates","newDates","validationMessage","useIsMobile","isMobile","setIsMobile","useState","useEffect","mql","onChange","RangeDatePicker","presetsProp","resolvedNumberOfMonths","presets","weekStartsOn","showTimeInSummary","initialRange","setRange","startTime","setStartTime","endTime","setEndTime","hasValidationMessage","validationText","prev","nextFrom","nextTo","alignOrKeep","finalRange","currentRange","handleStartTimeChange","handleEndTimeChange","resolveNextRange","triggerDate","dayPickerRange","nextRange","withConfirm","isComplete","isValid","handlePresetSelect","preset","handleConfirm","startTimeDisplay","endTimeDisplay","fromBase","fromText","toBase","showTime","showConfirm","DatePicker","enUS","componentClassName"],"sources":["../src/components/base/date-pickers/date-picker-helpers.ts","../src/components/base/date-pickers/date-picker-internals.ts","../src/components/ui/calendar.tsx","../src/components/base/date-pickers/date-picker-field.tsx","../src/components/base/date-pickers/date-picker-footer.tsx","../src/components/base/date-pickers/date-picker-header.tsx","../src/components/base/date-pickers/date-picker.recipes.ts","../src/components/base/date-pickers/date-pickers.strings.ts","../src/components/ui/toggle.tsx","../src/components/ui/toggle-group.tsx","../src/components/base/date-pickers/time-picker.tsx","../src/components/base/date-pickers/date-picker-single.tsx","../src/components/base/date-pickers/date-picker-multiple.tsx","../src/hooks/use-mobile.tsx","../src/components/base/date-pickers/date-picker-range.tsx","../src/components/base/date-pickers/date-picker.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport type { Locale as DateFnsLocale } from 'date-fns/locale';\nimport type { DateRange } from 'react-day-picker';\nimport { formatDateRange } from '../../primitives/date';\nimport type {\n\tDateOutput,\n\tMultipleDatesOutput,\n\tDateRangeOutput,\n\tDatePickerStrings,\n\tYearSelectionConfig\n} from './datepicker.types';\n\nexport type TimePeriod = 'AM' | 'PM';\n\nexport interface NormalizedTime {\n\thours: number;\n\tminutes: number;\n\tseconds: number;\n}\n\nexport interface DisplayTimeSegments {\n\thours: string;\n\tminutes: string;\n\tseconds?: string;\n\tperiod?: TimePeriod;\n}\n\nexport interface TimeDisplayLabels {\n\tam?: string;\n\tpm?: string;\n}\n\nexport const HOURS_24_MAX = 23;\nexport const HOURS_12_MAX = 12;\nexport const MINUTES_MAX = 59;\nexport const SECONDS_MAX = 59;\n\nexport function padTimeSegment(value: number): string {\n\treturn value.toString().padStart(2, '0');\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.min(Math.max(value, min), max);\n}\n\n/**\n * Snaps a time to the nearest legal `step`, rather than the one below it:\n * with a 15-minute step, 10:38 belongs at 10:45 and 10:37 at 10:30. Ties\n * round up. The result is always itself a legal step, so the last one\n * before midnight is used instead of overflowing into the next day.\n */\nfunction alignSecondsToStep(totalSeconds: number, step: number): number {\n\tif (step <= 0) {\n\t\treturn totalSeconds;\n\t}\n\tconst lastOfDay = Math.floor((24 * 60 * 60 - 1) / step) * step;\n\tconst aligned = Math.round(totalSeconds / step) * step;\n\treturn Math.max(0, Math.min(aligned, lastOfDay));\n}\n\nexport function parseTimeString(timeString: string | undefined): NormalizedTime | null {\n\tif (!timeString) {\n\t\treturn null;\n\t}\n\tconst parts = timeString.split(':');\n\tif (parts.length < 2 || parts.length > 3) {\n\t\treturn null;\n\t}\n\tconst [hRaw, mRaw, sRaw] = parts;\n\tconst hours = clamp(Number.parseInt(hRaw, 10), 0, HOURS_24_MAX);\n\tconst minutes = clamp(Number.parseInt(mRaw, 10), 0, MINUTES_MAX);\n\tconst seconds = clamp(Number.parseInt(sRaw ?? '0', 10), 0, SECONDS_MAX);\n\tif (Number.isNaN(hours) || Number.isNaN(minutes) || Number.isNaN(seconds)) {\n\t\treturn null;\n\t}\n\treturn { hours, minutes, seconds };\n}\n\nexport function normalizedTimeToString(time: NormalizedTime, includeSeconds: boolean): string {\n\tconst secondsPart = includeSeconds ? `:${padTimeSegment(time.seconds)}` : '';\n\treturn `${padTimeSegment(time.hours)}:${padTimeSegment(time.minutes)}${secondsPart}`;\n}\n\nexport function createDefaultNormalizedTime(\n\tdate: Date | undefined,\n\tincludeSeconds: boolean,\n\tstep: number\n): NormalizedTime {\n\tconst source = Number.isFinite(date?.getTime?.()) ? (date as Date) : new Date();\n\tconst hours = source.getHours();\n\tconst minutes = source.getMinutes();\n\tconst seconds = includeSeconds ? source.getSeconds() : 0;\n\tconst totalSeconds = hours * 3600 + minutes * 60 + seconds;\n\tconst alignedSeconds = alignSecondsToStep(totalSeconds, step);\n\tconst alignedHours = Math.floor(alignedSeconds / 3600);\n\tconst alignedMinutes = Math.floor((alignedSeconds % 3600) / 60);\n\tconst alignedSecondsRemainder = alignedSeconds % 60;\n\treturn {\n\t\thours: alignedHours,\n\t\tminutes: alignedMinutes,\n\t\tseconds: includeSeconds ? alignedSecondsRemainder : 0,\n\t};\n}\n\nexport function normalizedTimeToDisplaySegments(\n\ttime: NormalizedTime,\n\tformat: '12' | '24',\n\tincludeSeconds: boolean\n): DisplayTimeSegments {\n\tif (format === '12') {\n\t\tconst period: TimePeriod = time.hours >= 12 ? 'PM' : 'AM';\n\t\tlet displayHour = time.hours % 12;\n\t\tif (displayHour === 0) {\n\t\t\tdisplayHour = 12;\n\t\t}\n\t\treturn {\n\t\t\thours: padTimeSegment(displayHour),\n\t\t\tminutes: padTimeSegment(time.minutes),\n\t\t\tseconds: includeSeconds ? padTimeSegment(time.seconds) : undefined,\n\t\t\tperiod,\n\t\t};\n\t}\n\treturn {\n\t\thours: padTimeSegment(time.hours),\n\t\tminutes: padTimeSegment(time.minutes),\n\t\tseconds: includeSeconds ? padTimeSegment(time.seconds) : undefined,\n\t};\n}\n\nexport function displaySegmentsToNormalizedTime(\n\tsegments: DisplayTimeSegments,\n\tformat: '12' | '24',\n\tincludeSeconds: boolean\n): NormalizedTime {\n\tconst parseSegment = (value: string | undefined): number => {\n\t\tconst numeric = Number.parseInt(value ?? '0', 10);\n\t\treturn Number.isNaN(numeric) ? 0 : numeric;\n\t};\n\tlet hours = parseSegment(segments.hours);\n\tconst minutes = clamp(parseSegment(segments.minutes), 0, MINUTES_MAX);\n\tconst seconds = includeSeconds ? clamp(parseSegment(segments.seconds), 0, SECONDS_MAX) : 0;\n\tif (format === '12') {\n\t\thours = clamp(hours, 1, HOURS_12_MAX);\n\t\tconst period = segments.period ?? 'AM';\n\t\tconst isPM = period === 'PM';\n\t\thours = hours % 12;\n\t\tif (isPM) {\n\t\t\thours += 12;\n\t\t}\n\t} else {\n\t\thours = clamp(hours, 0, HOURS_24_MAX);\n\t}\n\treturn { hours, minutes, seconds };\n}\n\nexport function alignNormalizedTimeToStep(\n\ttime: NormalizedTime,\n\tstep: number,\n\tincludeSeconds: boolean\n): NormalizedTime {\n\tconst totalSeconds = time.hours * 3600 + time.minutes * 60 + time.seconds;\n\tconst alignedSeconds = alignSecondsToStep(totalSeconds, step);\n\tconst hours = Math.floor(alignedSeconds / 3600);\n\tconst minutes = Math.floor((alignedSeconds % 3600) / 60);\n\tconst seconds = includeSeconds ? alignedSeconds % 60 : 0;\n\treturn { hours, minutes, seconds };\n}\n\nexport function formatNormalizedTimeForDisplay(\n\ttime: NormalizedTime,\n\tincludeSeconds: boolean,\n\tformat: '12' | '24',\n\tlabels?: TimeDisplayLabels\n): string {\n\tconst minutes = padTimeSegment(time.minutes);\n\tconst secondsPart = includeSeconds ? `:${padTimeSegment(time.seconds)}` : '';\n\tif (format === '24') {\n\t\treturn `${padTimeSegment(time.hours)}:${minutes}${secondsPart}`;\n\t}\n\tconst period: TimePeriod = time.hours >= 12 ? 'PM' : 'AM';\n\tlet displayHour = time.hours % 12;\n\tif (displayHour === 0) {\n\t\tdisplayHour = 12;\n\t}\n\tconst periodLabel = period === 'AM' ? labels?.am ?? 'AM' : labels?.pm ?? 'PM';\n\treturn `${padTimeSegment(displayHour)}:${minutes}${secondsPart} ${periodLabel}`;\n}\n\nconst QUOTED_TEXT_REGEX = /'[^']*'/g;\nconst TIME_TOKEN_REGEX = /[HKhk]|\\bp\\b|\\bt\\b|\\ba\\b/;\n\nexport function readableFormatIncludesTime(format: string | undefined): boolean {\n\tif (!format) {\n\t\treturn false;\n\t}\n\tconst sanitized = format.replace(QUOTED_TEXT_REGEX, '');\n\treturn TIME_TOKEN_REGEX.test(sanitized);\n}\n\nexport function getDayPickerYearBounds(\n\tyearSelection: YearSelectionConfig | undefined\n): { startMonth?: Date; endMonth?: Date } {\n\treturn {\n\t\tstartMonth: typeof yearSelection?.fromYear === 'number' ? new Date(yearSelection.fromYear, 0) : undefined,\n\t\tendMonth: typeof yearSelection?.toYear === 'number' ? new Date(yearSelection.toYear, 11) : undefined,\n\t};\n}\n\n/**\n * Create date output object with formatted strings\n */\nexport function createDateOutput(\n\tdate: Date | undefined,\n\tdateFormat: string,\n\treadableFormat: string,\n\tlocale?: DateFnsLocale\n): DateOutput {\n\tconst options = locale ? { locale } : undefined;\n\treturn {\n\t\tdate,\n\t\tformatted: date ? format(date, dateFormat, options) : undefined,\n\t\treadable: date ? format(date, readableFormat, options) : undefined,\n\t};\n}\n\n/**\n * Create multiple dates output object with formatted strings\n */\nexport function createMultipleDatesOutput(\n\tdates: Date[],\n\tdateFormat: string,\n\treadableFormat: string,\n\tlocale?: DateFnsLocale\n): MultipleDatesOutput {\n\tconst options = locale ? { locale } : undefined;\n\treturn {\n\t\tdates,\n\t\tformatted: dates.map(d => format(d, dateFormat, options)),\n\t\treadable: dates.map(d => format(d, readableFormat, options)),\n\t};\n}\n\n/**\n * Create date range output object with formatted strings\n */\nexport function createDateRangeOutput(\n\trange: DateRange | undefined,\n\tdateFormat: string,\n\treadableFormat: string,\n\tlocale?: DateFnsLocale\n): DateRangeOutput {\n\tconst options = locale ? { locale } : undefined;\n\treturn {\n\t\trange,\n\t\tformatted: {\n\t\t\tfrom: range?.from ? format(range.from, dateFormat, options) : undefined,\n\t\t\tto: range?.to ? format(range.to, dateFormat, options) : undefined,\n\t\t},\n\t\treadable: {\n\t\t\tfrom: range?.from ? format(range.from, readableFormat, options) : undefined,\n\t\t\tto: range?.to ? format(range.to, readableFormat, options) : undefined,\n\t\t},\n\t};\n}\n\n/**\n * Apply time to a date\n */\nexport function applyTimeToDate(date: Date, time: string | NormalizedTime): Date {\n\tconst normalized = typeof time === 'string' ? parseTimeString(time) : time;\n\tconst newDate = new Date(date);\n\tif (!Number.isFinite(newDate.getTime()) || !normalized) {\n\t\treturn new Date(NaN);\n\t}\n\tnewDate.setHours(normalized.hours, normalized.minutes, normalized.seconds, 0);\n\treturn newDate;\n}\n\n/**\n * Apply time to date range\n */\nexport function applyTimeToRange(\n\trange: DateRange,\n\tstartTime: string | NormalizedTime,\n\tendTime: string | NormalizedTime\n): DateRange {\n\tlet finalRange = range;\n\n\tif (range.from) {\n\t\tfinalRange = { ...finalRange, from: applyTimeToDate(range.from, startTime) };\n\t}\n\n\tif (range.to && finalRange) {\n\t\tfinalRange = { ...finalRange, to: applyTimeToDate(range.to, endTime) };\n\t}\n\n\treturn finalRange;\n}\n\n/**\n * Calculate days difference between two dates\n */\nexport function calculateDaysDifference(from: Date, to: Date): number {\n\treturn Math.ceil((to.getTime() - from.getTime()) / (1000 * 60 * 60 * 24)) + 1;\n}\n\n/**\n * Validate date range constraints\n */\nexport function validateDateRange(\n\trange: DateRange | undefined,\n\tmin?: number,\n\tmax?: number\n): { isValid: boolean; daysDiff?: number } {\n\tif (!range?.from || !range?.to) {\n\t\treturn { isValid: true };\n\t}\n\n\tconst daysDiff = calculateDaysDifference(range.from, range.to);\n\n\tif (min && daysDiff < min) {\n\t\treturn { isValid: false, daysDiff };\n\t}\n\n\tif (max && daysDiff > max) {\n\t\treturn { isValid: false, daysDiff };\n\t}\n\n\treturn { isValid: true, daysDiff };\n}\n\n/**\n * Get validation message for date range\n */\nexport function getRangeValidationMessage(\n\trange: DateRange | undefined,\n\tmin: number | undefined,\n\tmax: number | undefined,\n\ttranslations: DatePickerStrings\n): string | null {\n\tif (!range?.from || !range?.to) return null;\n\n\tconst daysDiff = calculateDaysDifference(range.from, range.to);\n\n\tif (min && daysDiff < min) {\n\t\treturn translations.minimumDays(min);\n\t}\n\n\tif (max && daysDiff > max) {\n\t\treturn translations.maximumDays(max);\n\t}\n\n\treturn null;\n}\n\n/**\n * Get validation message for multiple dates\n */\nexport function getMultipleDatesValidationMessage(\n\tdates: Date[],\n\tmin: number | undefined,\n\tmax: number | undefined,\n\trequired: boolean | undefined,\n\ttranslations: DatePickerStrings\n): string | null {\n\tif (required && dates.length === 0) {\n\t\treturn translations.datesRequired;\n\t}\n\n\tif (min && dates.length < min) {\n\t\treturn translations.minimumDates(min);\n\t}\n\n\t// The maximum reads as a warning, so it waits until there is a\n\t// selection to warn about instead of greeting an empty calendar.\n\tif (max && dates.length > 0) {\n\t\treturn translations.maximumDates(max);\n\t}\n\n\treturn null;\n}\n\n/**\n * Format button text for single date\n */\nexport function formatDateButtonText(\n\tdate: Date | undefined,\n\treadableFormat: string,\n\tplaceholder: string | undefined,\n\tdefaultPlaceholder: string,\n\ttime?: string,\n\tlocale?: DateFnsLocale\n): string {\n\tif (date) {\n\t\tconst options = locale ? { locale } : undefined;\n\t\tlet text = format(date, readableFormat, options);\n\t\tif (time) {\n\t\t\ttext += ` ${time}`;\n\t\t}\n\t\treturn text;\n\t}\n\treturn placeholder ?? defaultPlaceholder;\n}\n\n/**\n * Format button text for multiple dates\n */\nexport function formatMultipleDatesButtonText(\n\tdates: Date[],\n\treadableFormat: string,\n\tplaceholder: string | undefined,\n\tdefaultPlaceholder: string,\n\ttranslations: DatePickerStrings,\n\tlocale?: DateFnsLocale\n): string {\n\tif (dates.length > 0) {\n\t\tif (dates.length === 1) {\n\t\t\tconst options = locale ? { locale } : undefined;\n\t\t\treturn format(dates[0], readableFormat, options);\n\t\t}\n\t\treturn translations.datesSelected(dates.length);\n\t}\n\treturn placeholder ?? defaultPlaceholder;\n}\n\n/**\n * Format button text for date range\n */\nexport function formatRangeButtonText(\n\trange: DateRange | undefined,\n\treadableFormat: string,\n\tplaceholder: string | undefined,\n\tdefaultPlaceholder: string,\n\tlocale?: DateFnsLocale\n): string {\n\tif (range?.from) {\n\t\treturn formatDateRange(range, {\n\t\t\tformat: readableFormat,\n\t\t\tlocale,\n\t\t}) ?? placeholder ?? defaultPlaceholder;\n\t}\n\treturn placeholder ?? defaultPlaceholder;\n}\n","/**\n * Internal wiring shared by the three <DatePicker> mode components.\n *\n * Split out of date-picker.tsx unchanged: the props-union type guards the\n * dispatcher narrows with, the trigger presentation mapping, and the default\n * range presets. Nothing here is part of the package's\n * public API — date-pickers/index.ts does not re-export it.\n */\nimport { addDays, startOfWeek, endOfWeek, startOfMonth, endOfMonth } from 'date-fns';\n\nimport { type ButtonTone, type ButtonStyle } from '../buttons';\n\nimport type {\n\tDatePickerProps,\n\tSingleDatePickerProps,\n\tMultipleDatePickerProps,\n\tRangeDatePickerProps,\n\tDatePickerStrings,\n\tPresetDateRange\n} from './datepicker.types';\n\nexport function resolvePickerButtonProps(\n\ttone?: ButtonTone,\n\tbuttonStyle?: ButtonStyle,\n): { tone: ButtonTone; buttonStyle: ButtonStyle } {\n\treturn {\n\t\ttone: tone ?? 'secondary',\n\t\tbuttonStyle: buttonStyle ?? 'outline',\n\t};\n}\n\n// Type guards\nexport function isSingleMode(props: DatePickerProps): props is SingleDatePickerProps {\n\treturn !props.mode || props.mode === 'single';\n}\n\nexport function isMultipleMode(props: DatePickerProps): props is MultipleDatePickerProps {\n\treturn props.mode === 'multiple';\n}\n\nexport function isRangeMode(props: DatePickerProps): props is RangeDatePickerProps {\n\treturn props.mode === 'range';\n}\n\n// Default preset ranges — labels resolved from DatePickerStrings.\n// `weekStartsOn` is the resolved value from the resolution chain\n// (`prop ?? useDatesConfig().weekStartsOn ?? 1`); passed in by the\n// caller so this stays a pure function.\nexport function getDefaultPresets(\n\tt: DatePickerStrings,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6,\n): PresetDateRange[] {\n\treturn [\n\t\t{\n\t\t\tlabel: t.today,\n\t\t\tgetValue: () => ({ from: new Date(), to: new Date() }),\n\t\t},\n\t\t{\n\t\t\tlabel: t.thisWeek,\n\t\t\tgetValue: () => ({\n\t\t\t\tfrom: startOfWeek(new Date(), { weekStartsOn }),\n\t\t\t\tto: endOfWeek(new Date(), { weekStartsOn })\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tlabel: t.thisMonth,\n\t\t\tgetValue: () => ({\n\t\t\t\tfrom: startOfMonth(new Date()),\n\t\t\t\tto: endOfMonth(new Date())\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tlabel: t.last30Days,\n\t\t\tgetValue: () => ({\n\t\t\t\tfrom: addDays(new Date(), -30),\n\t\t\t\tto: new Date()\n\t\t\t}),\n\t\t},\n\t];\n}\n","\"use client\"\n\nimport { ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon } from \"lucide-react\"\nimport * as React from \"react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n type Locale,\n} from \"react-day-picker\"\n\nimport { Button, buttonVariants } from \"./button\"\nimport { affordanceGeometry } from \"../../lib/affordance-geometry.generated\"\nimport { cn } from \"../../lib/utils\"\nimport { selectToggleRecipes } from \"../../lib/field-affordance-recipes\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n locale,\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n // Day cells are controls: the small action height and the bounded inner\n // radius, generated from the root tokens so a scoped density applies.\n \"p-space-lg bg-background group/calendar [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent\",\n affordanceGeometry.calendarCell,\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n locale={locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(locale?.code, { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"flex gap-space-xl flex-col md:flex-row relative\",\n defaultClassNames.months\n ),\n month: cn(\"flex flex-col w-full gap-space-xl\", defaultClassNames.month),\n nav: cn(\n \"flex items-center gap-space-xs w-full absolute top-0 inset-x-0 justify-between\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) aria-disabled:opacity-50 p-0 select-none\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-space-sm\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative rounded-(--cell-radius)\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute bg-popover inset-0 opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"select-none font-medium\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"rounded-(--cell-radius) flex items-center gap-space-xs text-sm [&>svg]:text-muted-foreground [&>svg]:size-icon-md\",\n defaultClassNames.caption_label\n ),\n month_grid: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"text-muted-foreground rounded-(--cell-radius) flex-1 font-normal text-xs select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"flex w-full mt-space-md\", defaultClassNames.week),\n week_number_header: cn(\n \"select-none w-(--cell-size)\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-xs select-none text-muted-foreground\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"relative w-full rounded-(--cell-radius) h-full p-0 text-center [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius) group/day aspect-square select-none\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-(--cell-radius)\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"rounded-l-(--cell-radius) bg-muted relative after:bg-muted after:absolute after:inset-y-0 after:w-4 after:right-0 z-0 isolate\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\n \"rounded-r-(--cell-radius) bg-muted relative after:bg-muted after:absolute after:inset-y-0 after:w-4 after:left-0 z-0 isolate\",\n defaultClassNames.range_end\n ),\n today: cn(\n \"bg-muted text-foreground rounded-(--cell-radius) data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-icon\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon className={cn(\"size-icon\", className)} {...props} />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(selectToggleRecipes.icon.md, className)} {...props} />\n )\n },\n DayButton: ({ ...props }) => (\n <CalendarDayButton locale={locale} {...props} />\n ),\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n locale,\n ...props\n}: React.ComponentProps<typeof DayButton> & { locale?: Partial<Locale> }) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString(locale?.code)}\n data-selected-single={\n !!modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n \"data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:inset-ring group-data-[focused=true]/day:inset-ring-ring group-data-[focused=true]/day:ring-ring/50 relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-space-xs border-0 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-3 data-[range-end=true]:rounded-(--cell-radius) data-[range-end=true]:rounded-r-(--cell-radius) data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-(--cell-radius) data-[range-start=true]:rounded-l-(--cell-radius) [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","/**\n * Private label / hint / error chrome shared by the DatePicker modes and\n * MonthYearPicker. It keeps FormField's rhythm and roles: the same label recipe,\n * the same gap to the trigger and to the supporting line, and a polite alert for\n * the validation message. Validation marks the trigger, not the label.\n *\n * The hint keeps its documented place beside the label and is suppressed while\n * an error shows. Not part of the public API.\n */\nimport type { ReactNode, Ref } from 'react';\n\nimport { Stack } from '../structure';\nimport { Label, Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { formLabelLineClass } from '../forms/form-sizing';\n\nexport interface DatePickerFieldProps {\n\trootRef?: Ref<HTMLDivElement>;\n\tclassName?: string;\n\tlabel?: string;\n\thint?: string;\n\terror?: string;\n\t/** Id of the trigger the label names. */\n\ttriggerId: string;\n\t/** Id of the validation message the trigger references. */\n\tdescribedById: string;\n\tchildren: ReactNode;\n}\n\nexport function DatePickerField({\n\trootRef,\n\tclassName,\n\tlabel,\n\thint,\n\terror,\n\ttriggerId,\n\tdescribedById,\n\tchildren,\n}: DatePickerFieldProps) {\n\tconst hasError = typeof error === 'string' && error !== '';\n\tconst showHint = !hasError && typeof hint === 'string' && hint !== '';\n\n\treturn (\n\t\t<Stack ref={rootRef} gap=\"xs\" className={className}>\n\t\t\t{!!(label || showHint) && (\n\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"xs\">\n\t\t\t\t\t{!!label && (\n\t\t\t\t\t\t<Label htmlFor={triggerId} className={cn('date-picker--label text-inherit', formLabelLineClass)}>\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t)}\n\t\t\t\t\t{showHint && (\n\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"date-picker--hint\">\n\t\t\t\t\t\t\t{hint}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t)}\n\n\t\t\t{children}\n\n\t\t\t{hasError && (\n\t\t\t\t<Text\n\t\t\t\t\tid={describedById}\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\ttype=\"error\"\n\t\t\t\t\trole=\"alert\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\tclassName=\"date-picker--error\"\n\t\t\t\t\tcontent={error}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Stack>\n\t);\n}\n","import * as React from 'react';\nimport { Button } from '../buttons';\nimport { Separator } from '../display/separator';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport type {\n\tDatePickerFooterConfig,\n\tDateOutput,\n\tDateRangeOutput,\n\tMultipleDatesOutput\n} from './datepicker.types';\n\nexport interface DatePickerFooterProps {\n\t/** Configuration for this surface. */\n\tconfig: DatePickerFooterConfig;\n\toutput: DateOutput | DateRangeOutput | MultipleDatesOutput;\n\thasSelection: boolean;\n\tautoSummary?: string;\n\tclassName?: string;\n}\n\nexport function DatePickerFooter({\n\tconfig,\n\toutput,\n\thasSelection,\n\tautoSummary,\n\tclassName\n}: DatePickerFooterProps) {\n\tconst { text, actions, showOnlyWhenSelected = false, showSummary = false } = config;\n\tconst visibleActions = actions?.filter((action) => action.visible !== false) ?? [];\n\n\t// Resolve custom text\n\tconst customText = React.useMemo(() => {\n\t\tif (!text) return undefined;\n\t\treturn typeof text === 'function' ? text(output) : text;\n\t}, [text, output]);\n\n\t// Determine what text to show\n\tconst displayText = customText || (showSummary ? autoSummary : undefined);\n\n\t// Don't render if showOnlyWhenSelected is true and no selection\n\tif (showOnlyWhenSelected && !hasSelection) {\n\t\treturn null;\n\t}\n\n\t// Don't render if no text and no actions\n\tif (!displayText && visibleActions.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<Separator />\n\t\t\t<div className={cn('date-picker-footer--component p-surface', className)}>\n\t\t\t<Stack gap=\"lg\">\n\t\t\t\t{!!displayText && (\n\t\t\t\t\t<Stack gap=\"xs\" className=\"date-picker-footer--summary\">\n\t\t\t\t\t\t{!!showSummary && !!customText && !!autoSummary && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<Text type=\"secondary\">{autoSummary}</Text>\n\t\t\t\t\t\t\t\t<Text weight=\"medium\">{customText}</Text>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!showSummary && !!customText && <Text weight=\"medium\">{customText}</Text>}\n\t\t\t\t\t\t{!!showSummary && !customText && !!autoSummary && <Text type=\"secondary\">{autoSummary}</Text>}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\n\t\t\t\t{visibleActions.length > 0 && (\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\t\tgap=\"md\"\n\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\tclassName=\"date-picker-footer--actions\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{visibleActions.map((action) => {\n\t\t\t\t\t\t\tconst isDisabled =\n\t\t\t\t\t\t\t\ttypeof action.disabled === 'function'\n\t\t\t\t\t\t\t\t\t? action.disabled(output)\n\t\t\t\t\t\t\t\t\t: action.disabled;\n\t\t\t\t\t\t\tconst buttonStyle = action.buttonStyle === 'link'\n\t\t\t\t\t\t\t\t? 'ghost'\n\t\t\t\t\t\t\t\t: action.buttonStyle ?? 'solid';\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tkey={action.label}\n\t\t\t\t\t\t\t\t\ttone={action.tone ?? 'primary'}\n\t\t\t\t\t\t\t\t\tbuttonStyle={buttonStyle}\n\t\t\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\t\t\tloading={action.loading}\n\t\t\t\t\t\t\t\t\tonClick={() => action.onClick(output)}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'flex-1',\n\t\t\t\t\t\t\t\t\t\taction.buttonStyle === 'link' && 'underline underline-offset-[0.2em]',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nDatePickerFooter.displayName = 'DatePickerFooter';\n","import { Heading, Text } from '../../typography';\nimport { Stack } from '../structure';\nimport { cn } from '../../../lib/utils';\nimport type { DatePickerHeaderConfig } from './datepicker.types';\n\nexport interface DatePickerHeaderProps {\n\t/** Configuration for this surface. */\n\tconfig: DatePickerHeaderConfig;\n\tclassName?: string;\n}\n\nexport function DatePickerHeader({ config, className }: DatePickerHeaderProps) {\n\tconst { title, description, icon: Icon, align = 'left' } = config;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn('date-picker-header--component', \n\t\t\t\t'border-b border-border p-surface',\n\t\t\t\talign === 'center' ? 'text-center' : 'text-left',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" gap=\"md\" wrap={false}>\n\t\t\t\t{/* Optional and neutral: colour stays for meaning. */}\n\t\t\t\t{!!Icon && (\n\t\t\t\t\t<div className=\"shrink-0\">\n\t\t\t\t\t\t<Icon aria-hidden=\"true\" className=\"size-icon text-muted-foreground\" />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<Stack gap=\"dense\" className={cn('flex-1', align === 'center' && !Icon && 'text-center')}>\n\t\t\t\t\t<Heading\n\t\t\t\t\t\ttag=\"h3\"\n\t\t\t\t\t\talign={align === 'center' ? 'center' : 'left'}\n\t\t\t\t\t\tcontainerClassName=\"space-y-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</Heading>\n\t\t\t\t\t{!!description && <Text type=\"secondary\">{description}</Text>}\n\t\t\t\t</Stack>\n\t\t\t</Stack>\n\t\t</div>\n\t);\n}\n\nDatePickerHeader.displayName = 'DatePickerHeader';\n","import { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formFieldTriggerClasses, resolveFormControlSize } from '../forms/form-sizing';\n\n/** Picker triggers resolve the same explicit/provider/default scale as fields. */\nexport function usePickerTriggerSize(sizeProp: FormControlSize | undefined): FormControlSize {\n const { defaultScale } = useDensityConfig();\n return resolveFormControlSize(sizeProp, defaultScale);\n}\n\nconst iconOnlyWidth: Record<FormControlSize, string> = {\n sm: 'w-control-sm', md: 'w-control', lg: 'w-control-lg',\n};\n\n/** Button composition contributes behavior; the shared field owner supplies chrome. */\nexport function pickerTriggerClasses(size: FormControlSize, iconOnly = false): string {\n return cn(formFieldTriggerClasses(size), 'justify-start', iconOnly && [iconOnlyWidth[size], 'shrink-0 justify-center px-0']);\n}\n","/**\n * Default user-facing strings for the date-picker family\n * (`<DatePicker>`, `<DateRangePicker>`, `<MonthYearPicker>`).\n *\n * Library is locale-agnostic — consumers wire backend i18n via the\n * `strings` prop and pass a `Locale` object from `date-fns/locale` (or\n * any equivalent) via the `locale` prop:\n *\n * import { bg } from 'date-fns/locale';\n * <DatePicker locale={bg} strings={{ today: t('date.today') }} />\n */\nimport type { DatePickerStrings } from './datepicker.types';\n\nexport const defaultDatePickerStrings: DatePickerStrings = {\n\tselectDate: 'Select a date',\n\tselectDates: 'Select dates',\n\tselectDateRange: 'Select date range',\n\tfrom: 'From',\n\tto: 'To',\n\tconfirm: 'Confirm',\n\tclear: 'Clear',\n\ttoday: 'Today',\n\tstartDate: 'Start date',\n\tendDate: 'End date',\n\tstartTime: 'Start time',\n\tendTime: 'End time',\n\thours: 'Hours',\n\tminutes: 'Minutes',\n\tseconds: 'Seconds',\n\tam: 'AM',\n\tpm: 'PM',\n\tminimumDays: (days: number) => `A minimum of ${days} days is required`,\n\tmaximumDays: (days: number) => `A maximum of ${days} days is allowed`,\n\tminimumDates: (min: number) => `Select at least ${min} dates`,\n\tmaximumDates: (max: number) => `Select up to ${max} dates`,\n\tdatesRequired: 'At least one date must be selected',\n\tdatesSelected: (count: number) => `${count} dates selected`,\n\tlastWeek: 'Last week',\n\tlastMonth: 'Last month',\n\tlastYear: 'Last year',\n\tnextWeek: 'Next week',\n\tnextMonth: 'Next month',\n\tnextYear: 'Next year',\n\tthisWeek: 'This Week',\n\tthisMonth: 'This Month',\n\tlast30Days: 'Last 30 Days',\n\tselectMonthYear: 'Select month and year',\n\tmonth: 'Month',\n\tyear: 'Year',\n};\n\nexport type { DatePickerStrings };\n","import { Toggle as TogglePrimitive } from \"@base-ui/react/toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { focusRecipes } from \"../../lib/focus-recipes\"\nimport { fieldStateRecipes } from \"../../lib/field-state-recipes\"\n\nconst toggleVariants = cva(\n `box-border border border-transparent py-0 font-sans text-foreground hover:text-foreground aria-pressed:bg-accent aria-pressed:text-accent-foreground ${focusRecipes.frame} ${fieldStateRecipes.invalid} gap-space-xs rounded-radius text-sm font-medium transition-[color,background-color,box-shadow] [&_svg:not([class*='size-'])]:size-icon group/toggle hover:bg-muted inline-flex items-center justify-center whitespace-nowrap outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0`,\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline: \"border-input hover:bg-muted border bg-transparent shadow-none\",\n },\n size: {\n default: \"h-control min-w-9 px-control\",\n sm: \"h-control-sm min-w-8 px-control-sm\",\n lg: \"h-control-lg min-w-10 px-control\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","\"use client\"\n\nimport { Toggle as TogglePrimitive } from \"@base-ui/react/toggle\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"@base-ui/react/toggle-group\"\nimport { type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\n\nimport { toggleVariants } from \"./toggle\"\nimport { cn } from \"../../lib/utils\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 0,\n orientation: \"horizontal\",\n})\n\nexport type ToggleGroupProps = ToggleGroupPrimitive.Props &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 0,\n orientation = \"horizontal\",\n children,\n ...props\n}: ToggleGroupProps) {\n return (\n <ToggleGroupPrimitive\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n data-orientation={orientation}\n style={{ \"--gap\": spacing } as React.CSSProperties}\n className={cn(\n \"rounded-radius group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider\n value={{ variant, size, spacing, orientation }}\n >\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant = \"default\",\n size = \"default\",\n ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <TogglePrimitive\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n \"border-border group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-control-sm group-data-[spacing=0]/toggle-group:shadow-none group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:first:rounded-l-radius group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:first:rounded-t-radius group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:last:rounded-r-radius group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:last:rounded-b-radius shrink-0 focus:z-10 focus-visible:z-10 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t\",\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </TogglePrimitive>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n","/**\n * TimePicker — the package's one time-of-day control.\n *\n * Merged from the former `base/forms/fields/time-picker.tsx` (a trigger\n * over a now/done confirm dialog) and `base/date-pickers/segmented-time-input.tsx`\n * (an inline hh:mm:ss segment editor). The segment editor is the engine;\n * `mode=\"popover\"` wraps it in an anchored surface behind a field-shaped\n * trigger. `SegmentedTimeInput` no longer exists as a public symbol.\n *\n * Import discipline: this module deep-imports\n * `@/components/base/forms/fields/input` rather than the `fields` barrel.\n * The barrel re-exports `DateTimeInput`, which imports `DatePicker` from\n * this very family — going through the barrel closed a genuine cycle\n * across two separately-bundled entrypoints. `input.tsx` reaches only\n * typography, `lib/`, `../form-sizing` and its own `./hooks`, so it cannot\n * loop back.\n */\nimport { Clock } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Input } from '../text-inputs';\nimport {\n\tformControlSizeClasses,\n\tformFieldTriggerClasses,\n\tresolveFormControlSize,\n} from '../forms/form-sizing';\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover';\nimport { Text } from '../../typography';\nimport { ToggleGroup, ToggleGroupItem } from '../../ui/toggle-group';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nimport type { DisplayTimeSegments, NormalizedTime, TimePeriod } from './date-picker-helpers';\nimport {\n\talignNormalizedTimeToStep,\n\tdisplaySegmentsToNormalizedTime,\n\tformatNormalizedTimeForDisplay,\n\tHOURS_12_MAX,\n\tHOURS_24_MAX,\n\tMINUTES_MAX,\n\tnormalizedTimeToDisplaySegments,\n\tnormalizedTimeToString,\n\tparseTimeString,\n\tSECONDS_MAX,\n} from './date-picker-helpers';\n\nexport interface TimePickerStrings {\n\t/** Trigger text in `mode=\"popover\"` when there is no value. */\n\tplaceholder: string;\n\t/** Accessible name for the hours segment. */\n\thours: string;\n\t/** Accessible name for the minutes segment. */\n\tminutes: string;\n\t/** Accessible name for the seconds segment. Only rendered when `precision` is `'seconds'`. */\n\tseconds: string;\n\t/** Copy for the ante-meridiem half of the day. Only rendered when `format` is `'12'`. */\n\tam: string;\n\t/** Copy for the post-meridiem half of the day. Only rendered when `format` is `'12'`. */\n\tpm: string;\n}\n\nexport const defaultTimePickerStrings: TimePickerStrings = {\n\tplaceholder: 'Select time',\n\thours: 'Hours',\n\tminutes: 'Minutes',\n\tseconds: 'Seconds',\n\tam: 'AM',\n\tpm: 'PM',\n};\n\nexport interface TimePickerProps {\n\t/**\n\t * Selected time as `'HH:mm'` or `'HH:mm:ss'`, always on a 24-hour clock\n\t * regardless of `format`. Controlled. `null` or omitted leaves every\n\t * segment blank.\n\t */\n\tvalue?: string | null;\n\t/**\n\t * Fired with the next time in the same shape as `value` — `'HH:mm'` when\n\t * `precision` is `'minutes'`, `'HH:mm:ss'` when it is `'seconds'`. Fires\n\t * while typing and again on blur, always with a time aligned to `step`,\n\t * so a listener never sees a value `step` forbids. The segments keep\n\t * showing exactly what was typed until blur snaps them to that value.\n\t */\n\tonValueChange?: (value: string | null) => void;\n\n\t/**\n\t * `'inline'` renders the segments directly; `'popover'` puts them behind a\n\t * field-shaped trigger showing the formatted time. Default: `'inline'`.\n\t */\n\tmode?: 'inline' | 'popover';\n\t/** Clock convention. `'12'` adds the AM/PM segment. Default: `'24'`. */\n\tformat?: '12' | '24';\n\t/** Finest segment offered. Default: `'minutes'`. */\n\tprecision?: 'minutes' | 'seconds';\n\t/**\n\t * Alignment granularity, **in seconds**. Emitted times are snapped to the\n\t * nearest legal step; the display snaps on blur. Default: `60`.\n\t */\n\tstep?: number;\n\n\t/** Control-height preset. Falls back to `UIProvider.density.defaultScale`. */\n\tsize?: FormControlSize;\n\t/** Disables every segment, and the trigger in `mode=\"popover\"`. */\n\tdisabled?: boolean;\n\t/** Applies invalid control styling. Validation copy remains owned by `FormField`. */\n\tinvalid?: boolean;\n\t/** Trigger text in `mode=\"popover\"` when there is no value. Wins over `strings.placeholder`. */\n\tplaceholder?: string;\n\t/** String overrides merged over defaults. */\n\tstrings?: StringsProp<TimePickerStrings>;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/**\n\t * Lands on the popover trigger, or on the hours segment when inline, so\n\t * `<FormField label>` — which clones its child with a generated `id` —\n\t * gets a real `htmlFor` target.\n\t */\n\tid?: string;\n}\n\ntype TimeSegmentKey = 'hours' | 'minutes' | 'seconds';\n\nconst SEGMENT_ORDER: TimeSegmentKey[] = ['hours', 'minutes', 'seconds'];\nconst DEFAULT_24H = '00';\nconst DEFAULT_12H = '12';\n/** Shown for a segment with no value yet. Parsed back to the segment default. */\nconst BLANK = '--';\n\n/** Selected period: the same primary fill as a selected PillRadioGroup pill. */\nconst periodItemClasses = 'aria-pressed:bg-primary aria-pressed:text-primary-foreground';\n\nconst segmentWidthClasses: Record<FormControlSize, string> = {\n\tsm: 'w-12',\n\tmd: 'w-14',\n\tlg: 'w-16',\n};\n\nfunction sanitizeNumeric(value: string): string {\n\treturn value.replace(/\\D/g, '').slice(-2);\n}\n\nfunction ensureTwoDigits(value: string): string {\n\tif (value.length === 0) return '00';\n\tif (value.length === 1) return `0${value}`;\n\treturn value;\n}\n\nfunction getNextKey(key: TimeSegmentKey, includeSeconds: boolean): TimeSegmentKey | null {\n\tconst activeOrder = includeSeconds ? SEGMENT_ORDER : SEGMENT_ORDER.slice(0, 2);\n\tconst idx = activeOrder.indexOf(key);\n\treturn idx > -1 && idx < activeOrder.length - 1 ? activeOrder[idx + 1] : null;\n}\n\nfunction getPreviousKey(key: TimeSegmentKey, includeSeconds: boolean): TimeSegmentKey | null {\n\tconst activeOrder = includeSeconds ? SEGMENT_ORDER : SEGMENT_ORDER.slice(0, 2);\n\tconst idx = activeOrder.indexOf(key);\n\treturn idx > 0 ? activeOrder[idx - 1] : null;\n}\n\nfunction hoursToDisplay(hours: number, format: '12' | '24'): number {\n\tif (format === '24') {\n\t\treturn hours;\n\t}\n\treturn hours % 12 || 12;\n}\n\nfunction determinePeriodFromHours(hours: number): TimePeriod {\n\treturn hours >= 12 ? 'PM' : 'AM';\n}\n\nfunction segmentsWithDefaults(\n\tsegments: DisplayTimeSegments,\n\tformat: '12' | '24'\n): DisplayTimeSegments {\n\tif (format === '12') {\n\t\treturn { ...segments, period: segments.period ?? 'AM' };\n\t}\n\treturn { ...segments, period: undefined };\n}\n\n/** Blank segments for a `null` value — nothing selected, nothing implied. */\nfunction blankSegments(includeSeconds: boolean): DisplayTimeSegments {\n\treturn {\n\t\thours: BLANK,\n\t\tminutes: BLANK,\n\t\tseconds: includeSeconds ? BLANK : undefined,\n\t};\n}\n\n/**\n * Substitutes the segment defaults for anything still blank, so a partially\n * typed time converts to a real `NormalizedTime` instead of parsing `'--'`\n * as NaN.\n */\nfunction fillBlanks(segments: DisplayTimeSegments, format: '12' | '24'): DisplayTimeSegments {\n\tconst fallbackHours = format === '12' ? DEFAULT_12H : DEFAULT_24H;\n\treturn {\n\t\thours: segments.hours === BLANK ? fallbackHours : segments.hours,\n\t\tminutes: segments.minutes === BLANK ? DEFAULT_24H : segments.minutes,\n\t\tseconds: segments.seconds === BLANK ? DEFAULT_24H : segments.seconds,\n\t\tperiod: segments.period,\n\t};\n}\n\nfunction segmentsFromValue(\n\tvalue: string | null | undefined,\n\tformat: '12' | '24',\n\tincludeSeconds: boolean\n): DisplayTimeSegments {\n\tconst parsed = parseTimeString(value ?? undefined);\n\tif (!parsed) {\n\t\treturn blankSegments(includeSeconds);\n\t}\n\treturn segmentsWithDefaults(\n\t\tnormalizedTimeToDisplaySegments(parsed, format, includeSeconds),\n\t\tformat\n\t);\n}\n\n/**\n * TimePicker — segmented time-of-day input, inline or behind a popover trigger.\n */\nexport const TimePicker = React.forwardRef<HTMLElement, TimePickerProps>(function TimePicker({\n\tvalue,\n\tonValueChange,\n\tmode = 'inline',\n\tformat = '24',\n\tprecision = 'minutes',\n\tstep = 60,\n\tsize: sizeProp,\n\tdisabled,\n\tinvalid,\n\tplaceholder,\n\tstrings: stringsProp,\n\tclassName,\n\tid,\n}: TimePickerProps, ref) {\n\tconst t = useStrings(defaultTimePickerStrings, stringsProp);\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\tconst includeSeconds = precision === 'seconds';\n\n\tconst [open, setOpen] = React.useState(false);\n\n\tconst activeOrder = React.useMemo(\n\t\t() => (includeSeconds ? SEGMENT_ORDER : SEGMENT_ORDER.slice(0, 2)),\n\t\t[includeSeconds]\n\t);\n\n\tconst [segments, setSegments] = React.useState<DisplayTimeSegments>(() =>\n\t\tsegmentsFromValue(value, format, includeSeconds)\n\t);\n\n\t// Ref always holds the latest segments so rapid keystrokes read fresh values.\n\tconst segmentsRef = React.useRef(segments);\n\t// Flag to skip the value-sync useEffect when we emit the value ourselves.\n\tconst isLocalEditRef = React.useRef(false);\n\t// Two-digit entry in progress: which segment, and what has been typed\n\t// into it so far. Cleared whenever focus moves or the value is replaced.\n\tconst digitEntryRef = React.useRef<{ key: TimeSegmentKey; typed: string } | null>(null);\n\tconst updateSegments = React.useCallback((next: DisplayTimeSegments) => {\n\t\tsegmentsRef.current = next;\n\t\tsetSegments(next);\n\t}, []);\n\n\tconst inputRefs = React.useRef<Record<TimeSegmentKey, HTMLInputElement | null>>({\n\t\thours: null,\n\t\tminutes: null,\n\t\tseconds: null,\n\t});\n\n\t// Sync from the `value` prop (e.g. external reset or date selection).\n\t// Skip when the change originated from our own emitAligned call, to avoid\n\t// snapping the display to the aligned value mid-typing.\n\tReact.useEffect(() => {\n\t\tif (isLocalEditRef.current) {\n\t\t\tisLocalEditRef.current = false;\n\t\t\treturn;\n\t\t}\n\t\tdigitEntryRef.current = null;\n\t\tupdateSegments(segmentsFromValue(value, format, includeSeconds));\n\t}, [value, format, includeSeconds, updateSegments]);\n\n\tconst toTimeString = React.useCallback(\n\t\t(time: NormalizedTime) => normalizedTimeToString(time, includeSeconds),\n\t\t[includeSeconds]\n\t);\n\n\t// Emit to the parent while typing so the form value stays current before\n\t// blur — but always step-aligned, so a listener never sees a time `step`\n\t// forbids. The display keeps the raw keystrokes (\"03\" on the way to\n\t// \"30\"); only blur snaps it to what was emitted.\n\tconst emitAligned = React.useCallback(\n\t\t(segs: DisplayTimeSegments) => {\n\t\t\tisLocalEditRef.current = true;\n\t\t\tconst normalized = displaySegmentsToNormalizedTime(\n\t\t\t\tfillBlanks(segs, format),\n\t\t\t\tformat,\n\t\t\t\tincludeSeconds\n\t\t\t);\n\t\t\tonValueChange?.(toTimeString(alignNormalizedTimeToStep(normalized, step, includeSeconds)));\n\t\t},\n\t\t[format, includeSeconds, onValueChange, step, toTimeString]\n\t);\n\n\t// Commit: align to step, notify parent, and snap the display.\n\t// Called on blur so the user sees the rounded value when done typing.\n\tconst commitSegments = React.useCallback(\n\t\t(segs: DisplayTimeSegments) => {\n\t\t\tconst normalized = displaySegmentsToNormalizedTime(\n\t\t\t\tfillBlanks(segs, format),\n\t\t\t\tformat,\n\t\t\t\tincludeSeconds\n\t\t\t);\n\t\t\tconst aligned = alignNormalizedTimeToStep(normalized, step, includeSeconds);\n\t\t\tonValueChange?.(toTimeString(aligned));\n\t\t\tupdateSegments(\n\t\t\t\tsegmentsWithDefaults(\n\t\t\t\t\tnormalizedTimeToDisplaySegments(aligned, format, includeSeconds),\n\t\t\t\t\tformat\n\t\t\t\t)\n\t\t\t);\n\t\t},\n\t\t[format, includeSeconds, onValueChange, step, toTimeString, updateSegments]\n\t);\n\n\tconst focusSegment = React.useCallback((key: TimeSegmentKey | null) => {\n\t\tif (!key) return;\n\t\tconst ref = inputRefs.current[key];\n\t\tif (ref) {\n\t\t\tref.focus();\n\t\t\tref.select();\n\t\t}\n\t}, []);\n\n\t// Conventional two-digit entry: the first keystroke in a segment starts a\n\t// fresh value, the second appends to it, and a third starts over. (It\n\t// used to compute `ones digit of the display * 10 + digit`, so the\n\t// second digit of an entry usually saturated the segment instead of\n\t// completing it.)\n\tconst applyDigitInput = React.useCallback(\n\t\t(segmentKey: TimeSegmentKey, digit: number) => {\n\t\t\tconst current = fillBlanks(segmentsRef.current, format);\n\t\t\tconst inProgress = digitEntryRef.current;\n\t\t\tconst typed =\n\t\t\t\tinProgress && inProgress.key === segmentKey && inProgress.typed.length === 1\n\t\t\t\t\t? `${inProgress.typed}${digit}`\n\t\t\t\t\t: String(digit);\n\t\t\tdigitEntryRef.current = { key: segmentKey, typed };\n\t\t\tconst candidate = Number.parseInt(typed, 10);\n\t\t\tconst next: DisplayTimeSegments = { ...current };\n\t\t\tlet nextPeriod = next.period ?? 'AM';\n\n\t\t\tif (segmentKey === 'hours') {\n\t\t\t\tif (format === '24') {\n\t\t\t\t\tconst clamped = Math.min(Math.max(candidate, 0), HOURS_24_MAX);\n\t\t\t\t\tnext.hours = ensureTwoDigits(clamped.toString());\n\t\t\t\t} else {\n\t\t\t\t\tif (candidate === 0) {\n\t\t\t\t\t\tnextPeriod = 'AM';\n\t\t\t\t\t\tnext.hours = DEFAULT_12H;\n\t\t\t\t\t} else if (candidate > 12) {\n\t\t\t\t\t\tnextPeriod = determinePeriodFromHours(candidate);\n\t\t\t\t\t\tnext.hours = ensureTwoDigits(hoursToDisplay(candidate, '12').toString());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst clamped = Math.min(Math.max(candidate, 1), HOURS_12_MAX);\n\t\t\t\t\t\tnext.hours = ensureTwoDigits(clamped.toString());\n\t\t\t\t\t\tnextPeriod = current.period ?? determinePeriodFromHours(candidate);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (segmentKey === 'minutes') {\n\t\t\t\tnext.minutes = ensureTwoDigits(Math.min(Math.max(candidate, 0), MINUTES_MAX).toString());\n\t\t\t} else if (segmentKey === 'seconds') {\n\t\t\t\tnext.seconds = ensureTwoDigits(Math.min(Math.max(candidate, 0), SECONDS_MAX).toString());\n\t\t\t}\n\n\t\t\tconst updated = { ...next, period: format === '12' ? nextPeriod : undefined };\n\t\t\tupdateSegments(updated);\n\t\t\temitAligned(updated);\n\t\t},\n\t\t[format, updateSegments, emitAligned]\n\t);\n\n\t// Fallback for paste / IME: parses the raw input string.\n\tconst handleNumericChange = React.useCallback(\n\t\t(key: TimeSegmentKey, rawValue: string) => {\n\t\t\tdigitEntryRef.current = null;\n\t\t\tconst sanitized = sanitizeNumeric(rawValue);\n\t\t\tconst next: DisplayTimeSegments = { ...fillBlanks(segmentsRef.current, format) };\n\t\t\tlet nextPeriod = next.period ?? 'AM';\n\n\t\t\tif (key === 'hours') {\n\t\t\t\tif (format === '24') {\n\t\t\t\t\tconst v = Number.parseInt(sanitized || '0', 10);\n\t\t\t\t\tconst clamped = Number.isNaN(v) ? 0 : Math.min(Math.max(v, 0), HOURS_24_MAX);\n\t\t\t\t\tnext.hours = ensureTwoDigits(clamped.toString());\n\t\t\t\t} else {\n\t\t\t\t\tconst v = Number.parseInt(sanitized || '0', 10);\n\t\t\t\t\tif (Number.isNaN(v)) {\n\t\t\t\t\t\tnext.hours = DEFAULT_12H;\n\t\t\t\t\t\tnextPeriod = next.period ?? 'AM';\n\t\t\t\t\t} else if (sanitized.length === 2 && v > 12) {\n\t\t\t\t\t\tnextPeriod = determinePeriodFromHours(v);\n\t\t\t\t\t\tnext.hours = ensureTwoDigits(hoursToDisplay(v, '12').toString());\n\t\t\t\t\t} else if (v === 0) {\n\t\t\t\t\t\tnextPeriod = 'AM';\n\t\t\t\t\t\tnext.hours = DEFAULT_12H;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst clamped = Math.min(Math.max(v, 1), HOURS_12_MAX);\n\t\t\t\t\t\tnext.hours = ensureTwoDigits(clamped.toString());\n\t\t\t\t\t\tif (sanitized.length === 2) {\n\t\t\t\t\t\t\tnextPeriod = next.period ?? determinePeriodFromHours(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (key === 'minutes') {\n\t\t\t\tconst v = Number.parseInt(sanitized || '0', 10);\n\t\t\t\tconst clamped = Number.isNaN(v) ? 0 : Math.min(Math.max(v, 0), MINUTES_MAX);\n\t\t\t\tnext.minutes = ensureTwoDigits(clamped.toString());\n\t\t\t} else if (key === 'seconds') {\n\t\t\t\tconst v = Number.parseInt(sanitized || '0', 10);\n\t\t\t\tconst clamped = Number.isNaN(v) ? 0 : Math.min(Math.max(v, 0), SECONDS_MAX);\n\t\t\t\tnext.seconds = ensureTwoDigits(clamped.toString());\n\t\t\t}\n\n\t\t\tconst updated = { ...next, period: format === '12' ? nextPeriod : undefined };\n\t\t\tupdateSegments(updated);\n\t\t\temitAligned(updated);\n\t\t},\n\t\t[format, updateSegments, emitAligned]\n\t);\n\n\tconst handlePeriodChange = React.useCallback(\n\t\t(period: TimePeriod) => {\n\t\t\tif (format !== '12') return;\n\t\t\tdigitEntryRef.current = null;\n\t\t\tcommitSegments({ ...fillBlanks(segmentsRef.current, format), period });\n\t\t},\n\t\t[commitSegments, format]\n\t);\n\n\t// On blur: commit the current segments (align to step + notify parent),\n\t// and end any two-digit entry that was in progress.\n\tconst handleBlur = React.useCallback(() => {\n\t\tdigitEntryRef.current = null;\n\t\tcommitSegments(segmentsRef.current);\n\t}, [commitSegments]);\n\n\t// Entering a segment starts a new two-digit entry.\n\tconst handleFocus = React.useCallback((event: React.FocusEvent<HTMLInputElement>) => {\n\t\tdigitEntryRef.current = null;\n\t\tevent.target.select();\n\t}, []);\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(event: React.KeyboardEvent<HTMLInputElement>, key: TimeSegmentKey) => {\n\t\t\tconst isDigitKey = event.key.length === 1 && /\\d/.test(event.key);\n\t\t\tif (isDigitKey && !event.metaKey && !event.ctrlKey && !event.altKey) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tapplyDigitInput(key, Number.parseInt(event.key, 10));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.key === 'ArrowRight') {\n\t\t\t\tfocusSegment(getNextKey(key, includeSeconds));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.key === 'ArrowLeft') {\n\t\t\t\tfocusSegment(getPreviousKey(key, includeSeconds));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.key === 'Backspace') {\n\t\t\t\tconst target = event.currentTarget;\n\t\t\t\tif (target.selectionStart === 0 && target.selectionEnd === 0) {\n\t\t\t\t\tfocusSegment(getPreviousKey(key, includeSeconds));\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[applyDigitInput, focusSegment, includeSeconds]\n\t);\n\n\tconst periodToggleValue = React.useMemo<TimePeriod[] | undefined>(() => {\n\t\tif (format !== '12') return undefined;\n\t\treturn segments.period ? [segments.period] : undefined;\n\t}, [format, segments.period]);\n\n\tconst segmentLabels: Record<TimeSegmentKey, string> = {\n\t\thours: t.hours,\n\t\tminutes: t.minutes,\n\t\tseconds: t.seconds,\n\t};\n\n\tconst editor = (\n\t\t<div\n\t\t\tref={mode === 'inline' ? (ref as React.Ref<HTMLDivElement>) : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t'flex items-center gap-space-md [&>.input--component]:w-auto [&>.input--component]:shrink-0',\n\t\t\t\tmode === 'inline' && ['time-picker--component', className]\n\t\t\t)}\n\t\t>\n\t\t\t{activeOrder.map((segmentKey, index) => (\n\t\t\t\t<React.Fragment key={segmentKey}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\tinputRefs.current[segmentKey] = node;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tid={segmentKey === 'hours' && mode === 'inline' ? id : undefined}\n\t\t\t\t\t\tvalue={segments[segmentKey] ?? BLANK}\n\t\t\t\t\t\tonChange={(event) => handleNumericChange(segmentKey, event.target.value)}\n\t\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\tonKeyDown={(event) => handleKeyDown(event, segmentKey)}\n\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\tpattern=\"\\d*\"\n\t\t\t\t\t\tmaxLength={2}\n\t\t\t\t\t\tshowCharacterCount={false}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\taria-label={segmentLabels[segmentKey]}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tclassName={cn('time-picker--segment text-center', segmentWidthClasses[size])}\n\t\t\t\t\t/>\n\t\t\t\t\t{index < activeOrder.length - 1 && (\n\t\t\t\t\t\t<Text tag=\"span\" type=\"secondary\">:</Text>\n\t\t\t\t\t)}\n\t\t\t\t</React.Fragment>\n\t\t\t))}\n\n\t\t\t{format === '12' && (\n\t\t\t\t// A joined outline group with the same frame as the segments beside it;\n\t\t\t\t// the chosen half of the day reads like a selected PillRadioGroup pill.\n\t\t\t\t<ToggleGroup\n\t\t\t\t\tvalue={periodToggleValue}\n\t\t\t\t\tonValueChange={(values) => {\n\t\t\t\t\t\tconst period = values[0];\n\t\t\t\t\t\tif (!period) return;\n\t\t\t\t\t\thandlePeriodChange(period as TimePeriod);\n\t\t\t\t\t}}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize={size === 'sm' ? 'sm' : 'default'}\n\t\t\t\t\tclassName=\"time-picker--period\"\n\t\t\t\t>\n\t\t\t\t\t<ToggleGroupItem value=\"AM\" aria-label={t.am} className={cn(formControlSizeClasses[size], periodItemClasses)}>\n\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t{t.am}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t<ToggleGroupItem value=\"PM\" aria-label={t.pm} className={cn(formControlSizeClasses[size], periodItemClasses)}>\n\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t{t.pm}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t</ToggleGroup>\n\t\t\t)}\n\t\t</div>\n\t);\n\n\tif (mode === 'inline') {\n\t\treturn editor;\n\t}\n\n\t// Read the trigger off the local segments rather than `value`, so an\n\t// uncontrolled call site still sees what it typed.\n\tconst isBlank = segments.hours === BLANK && segments.minutes === BLANK;\n\tconst triggerText = isBlank\n\t\t? (placeholder ?? t.placeholder)\n\t\t: formatNormalizedTimeForDisplay(\n\t\t\tdisplaySegmentsToNormalizedTime(fillBlanks(segments, format), format, includeSeconds),\n\t\t\tincludeSeconds,\n\t\t\tformat,\n\t\t\t{ am: t.am, pm: t.pm }\n\t\t);\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t<PopoverTrigger\n\t\t\t\tref={ref as React.Ref<HTMLButtonElement>}\n\t\t\t\tid={id}\n\t\t\t\taria-expanded={open}\n\t\t\t\taria-invalid={invalid}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'time-picker--component',\n\t\t\t\t\tformFieldTriggerClasses(size),\n\t\t\t\t\t'justify-start',\n\t\t\t\t\tisBlank && 'text-muted-foreground',\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Clock className=\"size-icon shrink-0\" />\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"min-w-0 truncate text-inherit\">\n\t\t\t\t\t{triggerText}\n\t\t\t\t</Text>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent className=\"time-picker--panel w-auto\" align=\"start\">\n\t\t\t\t{editor}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n});\n\nTimePicker.displayName = 'TimePicker';\n","/**\n * Single-date variant of <DatePicker>, moved out of date-picker.tsx\n * unchanged. Internal: date-picker.tsx is the only importer, and\n * date-pickers/index.ts does not re-export it.\n */\nimport { format } from 'date-fns';\nimport type { Locale as DateFnsLocale } from 'date-fns/locale';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '../buttons';\nimport { Calendar } from '../../ui/calendar';\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger\n} from '../popover';\nimport { Separator } from '../display/separator';\nimport { FormField } from '../forms/form-field';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\n\nimport { DatePickerField } from './date-picker-field';\nimport { DatePickerFooter } from './date-picker-footer';\nimport { DatePickerHeader } from './date-picker-header';\nimport {\n\tcreateDateOutput,\n\tapplyTimeToDate,\n\tformatDateButtonText,\n\tcreateDefaultNormalizedTime,\n\tformatNormalizedTimeForDisplay,\n\tnormalizedTimeToString,\n\tparseTimeString,\n\treadableFormatIncludesTime,\n\talignNormalizedTimeToStep,\n\tgetDayPickerYearBounds\n} from './date-picker-helpers';\nimport type { NormalizedTime } from './date-picker-helpers';\nimport { pickerTriggerClasses, usePickerTriggerSize } from './date-picker.recipes';\nimport { formControlIconClasses } from '../forms/form-sizing';\nimport { resolvePickerButtonProps } from './date-picker-internals';\nimport { defaultDatePickerStrings } from './date-pickers.strings';\nimport type {\n\tSingleDatePickerProps,\n\tDateOutput\n} from './datepicker.types';\nimport { TimePicker } from './time-picker';\n\n// Single Date Picker Component\nexport function SingleDatePicker({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tformat: dateFormat = 'yyyy-MM-dd',\n\treadableFormat = 'PPP',\n\tplaceholder,\n\tcloseOnSelect = true,\n\twithTime,\n\tdisabledDates,\n\tcalendarProps,\n\topen,\n\tsetOpen,\n\tt,\n\tdateFnsLocale,\n\tcaptionLayout,\n\tyearBounds,\n\trootRef,\n\t...baseProps\n}: SingleDatePickerProps & {\n\topen: boolean;\n\tsetOpen: (open: boolean) => void;\n\tt: typeof defaultDatePickerStrings;\n\tdateFnsLocale: DateFnsLocale;\n\tcaptionLayout: 'label' | 'dropdown';\n\tyearBounds: ReturnType<typeof getDayPickerYearBounds>;\n\t/** Forwarded from `DatePicker`, landing on this mode's root element. */\n\trootRef?: React.Ref<HTMLDivElement>;\n}) {\n\tconst size = usePickerTriggerSize(baseProps.size);\n\tconst generatedTriggerId = React.useId();\n\tconst triggerId = baseProps.id ?? generatedTriggerId;\n\tconst describedBy = `${triggerId}-description`;\n\tconst hasError = baseProps.error !== undefined && baseProps.error !== null && baseProps.error !== '';\n\tconst isInvalid = hasError || Boolean(baseProps.invalid || (baseProps['aria-invalid'] && baseProps['aria-invalid'] !== 'false'));\n\tconst ariaDescribedBy = [baseProps['aria-describedby'], hasError ? describedBy : undefined].filter(Boolean).join(' ') || undefined;\n\tconst timeFormat = withTime?.format ?? '24';\n\tconst timeStep = withTime?.step ?? 60;\n\tconst includeSeconds = withTime?.showSeconds ?? false;\n\tconst readableHasTime = readableFormatIncludesTime(readableFormat);\n\tconst showTimeInButton = withTime?.showTimeInButton ?? !readableHasTime;\n\tconst [date, setDate] = React.useState<Date | undefined>(() => {\n\t\treturn value ?? defaultValue;\n\t});\n\n\t// `null` until a date exists to take a time from. A control with nothing\n\t// selected must not display a time, and seeding from the wall clock made\n\t// the popover open on \"now\" as though it had been chosen.\n\tconst [time, setTime] = React.useState<NormalizedTime | null>(() => {\n\t\tconst initial = value ?? defaultValue;\n\t\treturn initial ? createDefaultNormalizedTime(initial, includeSeconds, timeStep) : null;\n\t});\n\tconst previousValueRef = React.useRef<Date | undefined>(value ?? defaultValue ?? undefined);\n\tconst defaultInitializedRef = React.useRef(false);\n\tconst lastValueDefinedRef = React.useRef(value !== undefined);\n\n\t// Create output helper\n\tconst createOutput = React.useCallback(\n\t\t(selectedDate: Date | undefined, overrideTime?: NormalizedTime): DateOutput => {\n\t\t\tlet finalDate = selectedDate;\n\t\t\tconst effectiveTime = overrideTime ?? time;\n\t\t\tif (selectedDate && withTime?.enabled && effectiveTime) {\n\t\t\t\tconst applied = applyTimeToDate(selectedDate, effectiveTime);\n\t\t\t\tfinalDate = Number.isFinite(applied.getTime()) ? applied : undefined;\n\t\t\t}\n\t\t\treturn createDateOutput(finalDate, dateFormat, readableFormat, dateFnsLocale);\n\t\t},\n\t\t[dateFormat, readableFormat, dateFnsLocale, withTime, time]\n\t);\n\n\tReact.useEffect(() => {\n\t\tconst isTimeEnabled = Boolean(withTime?.enabled);\n\t\tconst wasValueDefined = lastValueDefinedRef.current;\n\t\tconst isValueDefined = value !== undefined;\n\n\t\tconst applyState = (baseDate: Date, emitChange: boolean) => {\n\t\t\tconst normalized = alignNormalizedTimeToStep(\n\t\t\t\tcreateDefaultNormalizedTime(baseDate, includeSeconds, timeStep),\n\t\t\t\ttimeStep,\n\t\t\t\tincludeSeconds\n\t\t\t);\n\t\t\tsetDate((current) => {\n\t\t\t\tconst currentTime = current?.getTime?.();\n\t\t\t\tconst nextTime = baseDate.getTime();\n\t\t\t\treturn currentTime !== nextTime ? baseDate : current;\n\t\t\t});\n\t\t\tsetTime((current) => {\n\t\t\t\tif (\n\t\t\t\t\tcurrent\n\t\t\t\t\t&& current.hours === normalized.hours\n\t\t\t\t\t&& current.minutes === normalized.minutes\n\t\t\t\t\t&& current.seconds === normalized.seconds\n\t\t\t\t) {\n\t\t\t\t\treturn current;\n\t\t\t\t}\n\t\t\t\treturn normalized;\n\t\t\t});\n\t\t\tpreviousValueRef.current = baseDate;\n\t\t\tdefaultInitializedRef.current = true;\n\t\t\tif (emitChange && isTimeEnabled) {\n\t\t\t\tconst applied = applyTimeToDate(baseDate, normalized);\n\t\t\t\tonValueChange?.(createDateOutput(applied, dateFormat, readableFormat, dateFnsLocale));\n\t\t\t}\n\t\t};\n\n\t\tif (!isTimeEnabled) {\n\t\t\tdefaultInitializedRef.current = false;\n\t\t\tpreviousValueRef.current = value ?? defaultValue ?? undefined;\n\t\t\tsetDate(value ?? defaultValue);\n\t\t\tlastValueDefinedRef.current = isValueDefined;\n\t\t\treturn;\n\t\t}\n\n\t\tconst prev = previousValueRef.current;\n\t\tconst prevTime = prev?.getTime?.();\n\t\tconst valueTime = value?.getTime?.();\n\n\t\tif (!isValueDefined && wasValueDefined && defaultValue === undefined) {\n\t\t\tdefaultInitializedRef.current = false;\n\t\t\tpreviousValueRef.current = undefined;\n\t\t}\n\n\t\tif (value !== undefined && valueTime !== prevTime) {\n\t\t\tapplyState(value, false);\n\t\t\tlastValueDefinedRef.current = isValueDefined;\n\t\t\treturn;\n\t\t}\n\n\t\tif (value === undefined && defaultValue !== undefined) {\n\t\t\tconst defaultMillis = defaultValue.getTime();\n\t\t\tif (prevTime !== defaultMillis || !defaultInitializedRef.current) {\n\t\t\t\tapplyState(defaultValue, false);\n\t\t\t}\n\t\t\tlastValueDefinedRef.current = isValueDefined;\n\t\t\treturn;\n\t\t}\n\n\t\tif (value === undefined && defaultValue === undefined && !defaultInitializedRef.current) {\n\t\t\tdefaultInitializedRef.current = true;\n\t\t\tlastValueDefinedRef.current = isValueDefined;\n\t\t\treturn;\n\t\t}\n\n\t\tlastValueDefinedRef.current = isValueDefined;\n\t}, [\n\t\twithTime?.enabled,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tincludeSeconds,\n\t\ttimeStep,\n\t\tonValueChange,\n\t\tdateFormat,\n\t\treadableFormat,\n\t\tdateFnsLocale,\n\t]);\n\n\tReact.useEffect(() => {\n\t\tif (!withTime?.enabled) {\n\t\t\treturn;\n\t\t}\n\t\tsetTime((current) => {\n\t\t\tif (!current) {\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\tconst aligned = alignNormalizedTimeToStep(current, timeStep, includeSeconds);\n\t\t\tif (\n\t\t\t\tcurrent.hours === aligned.hours &&\n\t\t\t\tcurrent.minutes === aligned.minutes &&\n\t\t\t\tcurrent.seconds === aligned.seconds\n\t\t\t) {\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\treturn aligned;\n\t\t});\n\t}, [withTime?.enabled, timeStep, includeSeconds]);\n\n\t// Handle selection\n\tconst handleSelect = React.useCallback(\n\t\t(newDate: Date | undefined) => {\n\t\t\tsetDate(newDate);\n\t\t\tlet seededTime: NormalizedTime | undefined;\n\t\t\tif (withTime?.enabled && newDate) {\n\t\t\t\tdefaultInitializedRef.current = true;\n\t\t\t\tpreviousValueRef.current = newDate;\n\t\t\t\t// First date of an empty control: the time starts from that\n\t\t\t\t// date's own midnight rather than staying blank.\n\t\t\t\tif (!time) {\n\t\t\t\t\tseededTime = createDefaultNormalizedTime(newDate, includeSeconds, timeStep);\n\t\t\t\t\tsetTime(seededTime);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tonValueChange?.(createOutput(newDate, seededTime));\n\t\t\tif (closeOnSelect && newDate) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[onValueChange, createOutput, closeOnSelect, setOpen, withTime, time, includeSeconds, timeStep]\n\t);\n\n\t// Handle time change. <TimePicker> speaks 'HH:mm[:ss]' strings; this\n\t// variant keeps a NormalizedTime, so the two convert at the seam.\n\tconst handleTimeChange = React.useCallback(\n\t\t(next: string | null) => {\n\t\t\tconst nextTime = parseTimeString(next ?? undefined);\n\t\t\tif (!nextTime) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTime(nextTime);\n\t\t\tif (date) {\n\t\t\t\tonValueChange?.(createOutput(date, nextTime));\n\t\t\t}\n\t\t},\n\t\t[date, onValueChange, createOutput]\n\t);\n\n\tconst timeDisplay = React.useMemo(() => {\n\t\tif (!withTime?.enabled || !time) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn formatNormalizedTimeForDisplay(time, includeSeconds, timeFormat, {\n\t\t\tam: t.am,\n\t\t\tpm: t.pm,\n\t\t});\n\t}, [withTime?.enabled, time, includeSeconds, timeFormat, t]);\n\n\t// Button text\n\tconst buttonText = React.useMemo(\n\t\t() => formatDateButtonText(\n\t\t\tdate,\n\t\t\treadableFormat,\n\t\t\tplaceholder,\n\t\t\tt.selectDate,\n\t\t\tshowTimeInButton ? timeDisplay : undefined,\n\t\t\tdateFnsLocale\n\t\t),\n\t\t[date, readableFormat, placeholder, t, timeDisplay, showTimeInButton, dateFnsLocale]\n\t);\n\n\tconst footerSummary = React.useMemo(\n\t\t() => (date ? format(date, readableFormat, { locale: dateFnsLocale }) : undefined),\n\t\t[date, readableFormat, dateFnsLocale]\n\t);\n\n\treturn (\n\t\t<DatePickerField\n\t\t\trootRef={rootRef}\n\t\t\tclassName={baseProps.className}\n\t\t\tlabel={baseProps.label}\n\t\t\thint={baseProps.hint}\n\t\t\terror={baseProps.error}\n\t\t\ttriggerId={triggerId}\n\t\t\tdescribedById={describedBy}\n\t\t>\n\t\t\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t\t\t<PopoverTrigger\n\t\t\t\t\t\tref={baseProps.triggerRef}\n\t\t\t\t\t\tonBlur={baseProps.onBlur}\n\t\t\t\t\t\trender={(triggerProps) => {\n\t\t\t\t\t\t\tconst resolved = resolvePickerButtonProps(baseProps.buttonTone, baseProps.buttonStyle);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\t\t\tid={triggerId}\n\t\t\t\t\t\t\t\t\ttone={resolved.tone}\n\t\t\t\t\t\t\t\t\tbuttonStyle={resolved.buttonStyle}\n\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\taria-invalid={isInvalid}\n\t\t\t\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\tpickerTriggerClasses(size),\n\t\t\t\t\t\t\t\t\t\t!date && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t(triggerProps as { className?: string }).className,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdisabled={baseProps.disabled}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CalendarIcon className={formControlIconClasses[size]} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"min-w-0 truncate text-inherit\">\n\t\t\t\t\t\t\t\t\t\t{buttonText}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t<PopoverContent\n\t\t\t\t\tinset=\"flush\"\n\t\t\t\t\tclassName=\"w-auto gap-0\"\n\t\t\t\t\talign=\"start\"\n\t\t\t\t>\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t{!!baseProps.header && <DatePickerHeader config={baseProps.header} />}\n\n\t\t\t\t\t{/* Calendar */}\n\t\t\t\t\t<Calendar\n\t\t\t\t\t\tmode=\"single\"\n\t\t\t\t\t\tselected={date}\n\t\t\t\t\t\tonSelect={handleSelect}\n\t\t\t\t\t\tdefaultMonth={date}\n\t\t\t\t\t\tnumberOfMonths={baseProps.numberOfMonths}\n\t\t\t\t\t\tshowOutsideDays={baseProps.showOutsideDays}\n\t\t\t\t\t\tdisabled={disabledDates ?? baseProps.disabled}\n\t\t\t\t\t\tlocale={dateFnsLocale}\n\t\t\t\t\t\tcaptionLayout={captionLayout}\n\t\t\t\t\t\tstartMonth={yearBounds.startMonth}\n\t\t\t\t\t\tendMonth={yearBounds.endMonth}\n\t\t\t\t\t\t{...calendarProps}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* Time Selection: an ordinary labelled field row, no decorative glyph. */}\n\t\t\t\t\t{!!withTime?.enabled && <>\n\t\t\t\t\t\t\t<Separator />\n\t\t\t\t\t\t\t<div className=\"date-picker--time p-surface\">\n\t\t\t\t\t\t\t\t<FormField label={t.startTime}>\n\t\t\t\t\t\t\t\t\t<TimePicker\n\t\t\t\t\t\t\t\t\t\tvalue={time ? normalizedTimeToString(time, includeSeconds) : null}\n\t\t\t\t\t\t\t\t\t\tonValueChange={handleTimeChange}\n\t\t\t\t\t\t\t\t\t\tformat={timeFormat}\n\t\t\t\t\t\t\t\t\t\tprecision={includeSeconds ? 'seconds' : 'minutes'}\n\t\t\t\t\t\t\t\t\t\tstep={timeStep}\n\t\t\t\t\t\t\t\t\t\tdisabled={baseProps.disabled}\n\t\t\t\t\t\t\t\t\t\t// Pinned: the popover's time row is deliberately\n\t\t\t\t\t\t\t\t\t\t// compact and must not grow with a consumer's\n\t\t\t\t\t\t\t\t\t\t// default control size.\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tstrings={{\n\t\t\t\t\t\t\t\t\t\t\thours: t.hours,\n\t\t\t\t\t\t\t\t\t\t\tminutes: t.minutes,\n\t\t\t\t\t\t\t\t\t\t\tseconds: t.seconds,\n\t\t\t\t\t\t\t\t\t\t\tam: t.am,\n\t\t\t\t\t\t\t\t\t\t\tpm: t.pm,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormField>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</>}\n\n\t\t\t\t\t{/* Footer */}\n\t\t\t\t\t{!!baseProps.footer && (\n\t\t\t<DatePickerFooter\n\t\t\t\t\t\t\tconfig={baseProps.footer}\n\t\t\t\t\t\t\toutput={createOutput(date)}\n\t\t\t\t\t\t\thasSelection={!!date}\n\t\t\t\t\t\t\tautoSummary={footerSummary}\n\t\t\t\t\t\t/>\n\t\t)}\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\t\t</DatePickerField>\n\t);\n}\n","/**\n * Multiple-dates variant of <DatePicker>, moved out of date-picker.tsx\n * unchanged. Internal: date-picker.tsx is the only importer, and\n * date-pickers/index.ts does not re-export it.\n */\nimport type { Locale as DateFnsLocale } from 'date-fns/locale';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '../buttons';\nimport { Calendar } from '../../ui/calendar';\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger\n} from '../popover';\nimport { Separator } from '../display/separator';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\n\nimport { DatePickerField } from './date-picker-field';\nimport { DatePickerFooter } from './date-picker-footer';\nimport { DatePickerHeader } from './date-picker-header';\nimport {\n\tcreateMultipleDatesOutput,\n\tgetMultipleDatesValidationMessage,\n\tformatMultipleDatesButtonText,\n\tgetDayPickerYearBounds\n} from './date-picker-helpers';\nimport { pickerTriggerClasses, usePickerTriggerSize } from './date-picker.recipes';\nimport { formControlIconClasses } from '../forms/form-sizing';\nimport { resolvePickerButtonProps } from './date-picker-internals';\nimport { defaultDatePickerStrings } from './date-pickers.strings';\nimport type {\n\tMultipleDatePickerProps,\n\tMultipleDatesOutput\n} from './datepicker.types';\n\n// Multiple Date Picker Component\nexport function MultipleDatePicker({\n\tvalue,\n\tdefaultValue,\n\t\tonValueChange,\n\t\tformat: dateFormat = 'yyyy-MM-dd',\n\t\treadableFormat = 'PPP',\n\t\tplaceholder,\n\t\tmin,\n\tmax,\n\trequired,\n\tcloseOnSelect = false,\n\tdisabledDates,\n\tcalendarProps,\n\topen,\n\tsetOpen,\n\tt,\n\tdateFnsLocale,\n\tcaptionLayout,\n\tyearBounds,\n\trootRef,\n\t...baseProps\n}: MultipleDatePickerProps & {\n\topen: boolean;\n\tsetOpen: (open: boolean) => void;\n\tt: typeof defaultDatePickerStrings;\n\tdateFnsLocale: DateFnsLocale;\n\tcaptionLayout: 'label' | 'dropdown';\n\tyearBounds: ReturnType<typeof getDayPickerYearBounds>;\n\t/** Forwarded from `DatePicker`, landing on this mode's root element. */\n\trootRef?: React.Ref<HTMLDivElement>;\n}) {\n\tconst size = usePickerTriggerSize(baseProps.size);\n\tconst generatedTriggerId = React.useId();\n\tconst triggerId = baseProps.id ?? generatedTriggerId;\n\tconst describedBy = `${triggerId}-description`;\n\tconst hasError = baseProps.error !== undefined && baseProps.error !== null && baseProps.error !== '';\n\tconst isInvalid = hasError || Boolean(baseProps.invalid || (baseProps['aria-invalid'] && baseProps['aria-invalid'] !== 'false'));\n\tconst ariaDescribedBy = [baseProps['aria-describedby'], hasError ? describedBy : undefined].filter(Boolean).join(' ') || undefined;\n\tconst [dates, setDates] = React.useState<Date[]>(value ?? defaultValue ?? []);\n\n\t// Sync with controlled value\n\tReact.useEffect(() => {\n\t\tif (value !== undefined) {\n\t\t\tsetDates(value);\n\t\t}\n\t}, [value]);\n\n\t// Create output helper\n\tconst createOutput = React.useCallback(\n\t\t(dates: Date[]): MultipleDatesOutput =>\n\t\t\tcreateMultipleDatesOutput(dates, dateFormat, readableFormat, dateFnsLocale),\n\t\t[dateFormat, readableFormat, dateFnsLocale]\n\t);\n\n\t// Handle selection. `max` is enforced by the calendar, which is handed\n\t// the same `max` prop — the component is never given more dates than it\n\t// allows, so a guard here would be dead code.\n\tconst handleSelect = React.useCallback(\n\t\t(newDates?: Date[] | Date) => {\n\t\t\tconst selectedDates = Array.isArray(newDates) ? newDates : newDates ? [newDates] : [];\n\n\t\t\tsetDates(selectedDates);\n\t\t\tonValueChange?.(createOutput(selectedDates));\n\n\t\t\tif (closeOnSelect && selectedDates.length > 0) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[onValueChange, createOutput, closeOnSelect, setOpen]\n\t);\n\n\t// Button text\n\tconst buttonText = React.useMemo(() =>\n\t\tformatMultipleDatesButtonText(dates, readableFormat, placeholder, t.selectDates, t, dateFnsLocale),\n\t\t[dates, readableFormat, placeholder, t, dateFnsLocale]\n\t);\n\n\t// Validation message\n\tconst validationMessage = React.useMemo(() =>\n\t\tgetMultipleDatesValidationMessage(dates, min, max, required, t),\n\t\t[dates, min, max, required, t]\n\t);\n\n\tconst footerSummary = React.useMemo(\n\t\t() => (dates.length > 0 ? t.datesSelected(dates.length) : undefined),\n\t\t[dates.length, t]\n\t);\n\n\treturn (\n\t\t<DatePickerField\n\t\t\trootRef={rootRef}\n\t\t\tclassName={baseProps.className}\n\t\t\tlabel={baseProps.label}\n\t\t\thint={baseProps.hint}\n\t\t\terror={baseProps.error}\n\t\t\ttriggerId={triggerId}\n\t\t\tdescribedById={describedBy}\n\t\t>\n\t\t\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t\t\t<PopoverTrigger\n\t\t\t\t\t\tref={baseProps.triggerRef}\n\t\t\t\t\t\tonBlur={baseProps.onBlur}\n\t\t\t\t\t\trender={(triggerProps) => {\n\t\t\t\t\t\t\tconst resolved = resolvePickerButtonProps(baseProps.buttonTone, baseProps.buttonStyle);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\t\t\tid={triggerId}\n\t\t\t\t\t\t\t\t\ttone={resolved.tone}\n\t\t\t\t\t\t\t\t\tbuttonStyle={resolved.buttonStyle}\n\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\taria-invalid={isInvalid}\n\t\t\t\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\tpickerTriggerClasses(size),\n\t\t\t\t\t\t\t\t\t\tdates.length === 0 && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t(triggerProps as { className?: string }).className,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdisabled={baseProps.disabled}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CalendarIcon className={formControlIconClasses[size]} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"min-w-0 truncate text-inherit\">\n\t\t\t\t\t\t\t\t\t\t{buttonText}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t<PopoverContent\n\t\t\t\t\tinset=\"flush\"\n\t\t\t\t\tclassName=\"w-auto gap-0\"\n\t\t\t\t\talign=\"start\"\n\t\t\t\t>\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t{!!baseProps.header && <DatePickerHeader config={baseProps.header} />}\n\n\t\t\t\t\t{/* Calendar */}\n\t\t\t\t\t<Calendar\n\t\t\t\t\t\tmode=\"multiple\"\n\t\t\t\t\t\tselected={dates}\n\t\t\t\t\t\tonSelect={handleSelect}\n\t\t\t\t\t\tdefaultMonth={dates[0]}\n\t\t\t\t\t\tnumberOfMonths={baseProps.numberOfMonths}\n\t\t\t\t\t\tshowOutsideDays={baseProps.showOutsideDays}\n\t\t\t\t\t\tdisabled={disabledDates ?? baseProps.disabled}\n\t\t\t\t\t\tlocale={dateFnsLocale}\n\t\t\t\t\t\tcaptionLayout={captionLayout}\n\t\t\t\t\t\tstartMonth={yearBounds.startMonth}\n\t\t\t\t\t\tendMonth={yearBounds.endMonth}\n\t\t\t\t\t\trequired={required}\n\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\t{...calendarProps}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* Validation Message */}\n\t\t\t\t\t{!!validationMessage && <>\n\t\t\t\t\t\t\t<Separator />\n\t\t\t\t\t\t\t<div className=\"p-surface\">\n\t\t\t\t\t\t\t\t<Text type=\"secondary\">{validationMessage}</Text>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</>}\n\n\t\t\t\t\t{/* Footer */}\n\t\t\t\t\t{!!baseProps.footer && (\n\t\t\t<DatePickerFooter\n\t\t\t\t\t\t\tconfig={baseProps.footer}\n\t\t\t\t\t\t\toutput={createOutput(dates)}\n\t\t\t\t\t\t\thasSelection={dates.length > 0}\n\t\t\t\t\t\t\tautoSummary={footerSummary}\n\t\t\t\t\t\t/>\n\t\t)}\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\n\t\t</DatePickerField>\n\t);\n}\n","import { useEffect, useState } from 'react';\n\nexport const MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n\tconst [isMobile, setIsMobile] = useState<boolean>();\n\n\tuseEffect(() => {\n\t\tconst mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n\n\t\tconst onChange = () => {\n\t\t\tsetIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n\t\t};\n\n\t\tmql.addEventListener('change', onChange);\n\t\tsetIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n\n\t\treturn () => mql.removeEventListener('change', onChange);\n\t}, []);\n\n\treturn !!isMobile;\n}\n","/**\n * Date-range variant of <DatePicker>, moved out of date-picker.tsx\n * unchanged. Internal: date-picker.tsx is the only importer, and\n * date-pickers/index.ts does not re-export it.\n */\nimport { format } from 'date-fns';\nimport type { Locale as DateFnsLocale } from 'date-fns/locale';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport * as React from 'react';\nimport type { DateRange } from 'react-day-picker';\n\nimport { Button } from '../buttons';\nimport { Calendar } from '../../ui/calendar';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { useIsMobile } from '../../../hooks/use-mobile';\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger\n} from '../popover';\nimport { Separator } from '../display/separator';\nimport { FormField } from '../forms/form-field';\nimport { Grid, Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { affordanceGeometry } from '../../../lib/affordance-geometry.generated';\nimport { cn } from '../../../lib/utils';\n\nimport { DatePickerField } from './date-picker-field';\nimport { DatePickerFooter } from './date-picker-footer';\nimport { DatePickerHeader } from './date-picker-header';\nimport {\n\tcreateDateRangeOutput,\n\tapplyTimeToDate,\n\tvalidateDateRange,\n\tgetRangeValidationMessage,\n\tformatRangeButtonText,\n\tcreateDefaultNormalizedTime,\n\tformatNormalizedTimeForDisplay,\n\tnormalizedTimeToString,\n\tparseTimeString,\n\treadableFormatIncludesTime,\n\talignNormalizedTimeToStep,\n\tgetDayPickerYearBounds\n} from './date-picker-helpers';\nimport type { NormalizedTime } from './date-picker-helpers';\nimport { pickerTriggerClasses, usePickerTriggerSize } from './date-picker.recipes';\nimport { formControlIconClasses } from '../forms/form-sizing';\nimport {\n\tresolvePickerButtonProps,\n\tgetDefaultPresets\n} from './date-picker-internals';\nimport { defaultDatePickerStrings } from './date-pickers.strings';\nimport type {\n\tRangeDatePickerProps,\n\tDateRangeOutput,\n\tPresetDateRange\n} from './datepicker.types';\nimport { TimePicker } from './time-picker';\n\n// Range Date Picker Component\nexport function RangeDatePicker({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tformat: dateFormat = 'yyyy-MM-dd',\n\treadableFormat = 'PPP',\n\tplaceholder,\n\twithConfirm = false,\n\tmin,\n\tmax,\n\tcloseOnSelect = true,\n\twithTime,\n\tpresets: presetsProp,\n\tdisabledDates,\n\tcalendarProps,\n\topen,\n\tsetOpen,\n\tt,\n\tdateFnsLocale,\n\tcaptionLayout,\n\tyearBounds,\n\trootRef,\n\t...baseProps\n}: RangeDatePickerProps & {\n\topen: boolean;\n\tsetOpen: (open: boolean) => void;\n\tt: typeof defaultDatePickerStrings;\n\tdateFnsLocale: DateFnsLocale;\n\tcaptionLayout: 'label' | 'dropdown';\n\tyearBounds: ReturnType<typeof getDayPickerYearBounds>;\n\t/** Forwarded from `DatePicker`, landing on this mode's root element. */\n\trootRef?: React.Ref<HTMLDivElement>;\n}) {\n\tconst isMobile = useIsMobile();\n\tconst resolvedNumberOfMonths = baseProps.numberOfMonths ?? (isMobile ? 1 : 2);\n\t// Resolve the start-of-week so the \"This week\" preset honors the\n\t// consumer's <UIProvider config={{ dates: { weekStartsOn: 0 } }}> setting.\n\t// Library default is 1 (Monday).\n\tconst { weekStartsOn = 1 } = useDatesConfig();\n\tconst presets = presetsProp ?? getDefaultPresets(t, weekStartsOn);\n\tconst size = usePickerTriggerSize(baseProps.size);\n\tconst generatedTriggerId = React.useId();\n\tconst triggerId = baseProps.id ?? generatedTriggerId;\n\tconst describedBy = `${triggerId}-description`;\n\tconst hasError = baseProps.error !== undefined && baseProps.error !== null && baseProps.error !== '';\n\tconst isInvalid = hasError || Boolean(baseProps.invalid || (baseProps['aria-invalid'] && baseProps['aria-invalid'] !== 'false'));\n\tconst ariaDescribedBy = [baseProps['aria-describedby'], hasError ? describedBy : undefined].filter(Boolean).join(' ') || undefined;\n\tconst timeFormat = withTime?.format ?? '24';\n\tconst timeStep = withTime?.step ?? 60;\n\tconst includeSeconds = withTime?.showSeconds ?? false;\n\tconst readableHasTime = readableFormatIncludesTime(readableFormat);\n\tconst showTimeInButton = withTime?.showTimeInButton ?? !readableHasTime;\n\tconst showTimeInSummary = withTime?.showTimeInSummary ?? !readableHasTime;\n\tconst initialRange = value ?? defaultValue;\n\tconst [range, setRange] = React.useState<DateRange | undefined>(initialRange);\n\t// `null` until each end has a date to take a time from — an end with\n\t// nothing selected must not show the wall clock as though it had been\n\t// chosen. See the matching note in date-picker-single.tsx.\n\tconst [startTime, setStartTime] = React.useState<NormalizedTime | null>(() =>\n\t\tinitialRange?.from\n\t\t\t? createDefaultNormalizedTime(initialRange.from, includeSeconds, timeStep)\n\t\t\t: null\n\t);\n\tconst [endTime, setEndTime] = React.useState<NormalizedTime | null>(() =>\n\t\tinitialRange?.to\n\t\t\t? createDefaultNormalizedTime(initialRange.to, includeSeconds, timeStep)\n\t\t\t: null\n\t);\n\tconst previousValueRef = React.useRef<DateRange | undefined>(value);\n\n\t// Validation message\n\tconst validationMessage = React.useMemo(() =>\n\t\tgetRangeValidationMessage(range, min, max, t),\n\t\t[range, min, max, t]\n\t);\n\n\tconst hasValidationMessage = validationMessage !== undefined && validationMessage !== null && validationMessage !== '';\n\tconst validationText = typeof validationMessage === 'string' ? validationMessage : '';\n\n\t// Sync with controlled value\n\tReact.useEffect(() => {\n\t\tif (value !== undefined) {\n\t\t\tsetRange(value);\n\t\t}\n\t}, [value]);\n\n\t// Sync time segments when external range changes\n\tReact.useEffect(() => {\n\t\tif (!withTime?.enabled) {\n\t\t\tpreviousValueRef.current = value;\n\t\t\treturn;\n\t\t}\n\n\t\tconst prev = previousValueRef.current;\n\t\tconst nextFrom = value?.from;\n\t\tconst nextTo = value?.to;\n\n\t\tif (nextFrom) {\n\t\t\tsetStartTime(createDefaultNormalizedTime(nextFrom, includeSeconds, timeStep));\n\t\t} else if (prev?.from) {\n\t\t\tsetStartTime(null);\n\t\t}\n\n\t\tif (nextTo) {\n\t\t\tsetEndTime(createDefaultNormalizedTime(nextTo, includeSeconds, timeStep));\n\t\t} else if (prev?.to) {\n\t\t\tsetEndTime(null);\n\t\t}\n\n\t\tpreviousValueRef.current = value;\n\t}, [value, withTime?.enabled, includeSeconds, timeStep]);\n\n\tReact.useEffect(() => {\n\t\tif (!withTime?.enabled) {\n\t\t\treturn;\n\t\t}\n\t\tconst alignOrKeep = (current: NormalizedTime | null): NormalizedTime | null => {\n\t\t\tif (!current) {\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\tconst aligned = alignNormalizedTimeToStep(current, timeStep, includeSeconds);\n\t\t\tif (\n\t\t\t\tcurrent.hours === aligned.hours &&\n\t\t\t\tcurrent.minutes === aligned.minutes &&\n\t\t\t\tcurrent.seconds === aligned.seconds\n\t\t\t) {\n\t\t\t\treturn current;\n\t\t\t}\n\t\t\treturn aligned;\n\t\t};\n\t\tsetStartTime(alignOrKeep);\n\t\tsetEndTime(alignOrKeep);\n\t}, [withTime?.enabled, timeStep, includeSeconds]);\n\n\t// Create output helper\n\tconst createOutput = React.useCallback(\n\t\t(currentRange: DateRange | undefined): DateRangeOutput => {\n\t\t\tlet finalRange = currentRange;\n\t\t\tif (currentRange && withTime?.enabled) {\n\t\t\t\t// An end with no time of its own keeps the time the date\n\t\t\t\t// already carries, rather than borrowing the wall clock.\n\t\t\t\tfinalRange = {\n\t\t\t\t\t...currentRange,\n\t\t\t\t\tfrom: currentRange.from && startTime\n\t\t\t\t\t\t? applyTimeToDate(currentRange.from, startTime)\n\t\t\t\t\t\t: currentRange.from,\n\t\t\t\t\tto: currentRange.to && endTime\n\t\t\t\t\t\t? applyTimeToDate(currentRange.to, endTime)\n\t\t\t\t\t\t: currentRange.to,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn createDateRangeOutput(finalRange, dateFormat, readableFormat, dateFnsLocale);\n\t\t},\n\t\t[dateFormat, readableFormat, dateFnsLocale, withTime, startTime, endTime]\n\t);\n\n\t// <TimePicker> speaks 'HH:mm[:ss]' strings; this variant keeps a\n\t// NormalizedTime for each end, so the two convert at the seam.\n\tconst handleStartTimeChange = React.useCallback((next: string | null) => {\n\t\tconst parsed = parseTimeString(next ?? undefined);\n\t\tif (parsed) {\n\t\t\tsetStartTime(parsed);\n\t\t}\n\t}, []);\n\n\tconst handleEndTimeChange = React.useCallback((next: string | null) => {\n\t\tconst parsed = parseTimeString(next ?? undefined);\n\t\tif (parsed) {\n\t\t\tsetEndTime(parsed);\n\t\t}\n\t}, []);\n\n\t/**\n\t * react-day-picker completes a range on the *first* click, handing back\n\t * `{ from, to }` with both ends on the day just clicked. Taken at face\n\t * value that is a finished one-day range, which used to close the\n\t * popover before an end date could be chosen.\n\t *\n\t * So the two-click selection is driven from the clicked day instead:\n\t * the first click opens an incomplete range, the second closes it, and\n\t * a click on a finished range starts a new one. `triggerDate` is\n\t * undefined when a preset supplies a whole range, which is taken as-is.\n\t */\n\tconst resolveNextRange = React.useCallback(\n\t\t(\n\t\t\tdayPickerRange: DateRange | undefined,\n\t\t\ttriggerDate: Date | undefined,\n\t\t\tcurrent: DateRange | undefined\n\t\t): DateRange | undefined => {\n\t\t\tif (!triggerDate) {\n\t\t\t\treturn dayPickerRange;\n\t\t\t}\n\t\t\tif (!current?.from || current.to) {\n\t\t\t\treturn { from: triggerDate, to: undefined };\n\t\t\t}\n\t\t\treturn triggerDate < current.from\n\t\t\t\t? { from: triggerDate, to: current.from }\n\t\t\t\t: { from: current.from, to: triggerDate };\n\t\t},\n\t\t[]\n\t);\n\n\t// Handle selection\n\tconst handleSelect = React.useCallback(\n\t\t(dayPickerRange: DateRange | undefined, triggerDate?: Date) => {\n\t\t\tconst nextRange = resolveNextRange(dayPickerRange, triggerDate, range);\n\n\t\t\tsetRange(nextRange);\n\n\t\t\tif (withConfirm || withTime?.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// A range that breaks `min`/`max` is still reported and still\n\t\t\t// shown — with its validation message — rather than silently\n\t\t\t// discarded. Only a valid, complete range closes the popover.\n\t\t\tonValueChange?.(createOutput(nextRange));\n\n\t\t\tconst isComplete = Boolean(nextRange?.from && nextRange?.to);\n\t\t\tconst isValid = validateDateRange(nextRange, min, max).isValid;\n\t\t\tif (closeOnSelect && isComplete && isValid) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[range, resolveNextRange, withConfirm, withTime, onValueChange, createOutput, min, max, closeOnSelect, setOpen]\n\t);\n\n\t// Handle preset selection\n\tconst handlePresetSelect = React.useCallback(\n\t\t(preset: PresetDateRange) => {\n\t\t\tconst range = preset.getValue();\n\t\t\thandleSelect(range);\n\t\t},\n\t\t[handleSelect]\n\t);\n\n\t// Handle confirm\n\tconst handleConfirm = React.useCallback(() => {\n\t\tonValueChange?.(createOutput(range));\n\t\tsetOpen(false);\n\t}, [range, onValueChange, createOutput, setOpen]);\n\n\tconst startTimeDisplay = React.useMemo(() => {\n\t\tif (!withTime?.enabled || !startTime) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn formatNormalizedTimeForDisplay(startTime, includeSeconds, timeFormat, {\n\t\t\tam: t.am,\n\t\t\tpm: t.pm,\n\t\t});\n\t}, [withTime?.enabled, startTime, includeSeconds, timeFormat, t]);\n\n\tconst endTimeDisplay = React.useMemo(() => {\n\t\tif (!withTime?.enabled || !endTime) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn formatNormalizedTimeForDisplay(endTime, includeSeconds, timeFormat, {\n\t\t\tam: t.am,\n\t\t\tpm: t.pm,\n\t\t});\n\t}, [withTime?.enabled, endTime, includeSeconds, timeFormat, t]);\n\n\t// Button text\n\tconst buttonText = React.useMemo(() => {\n\t\tif (withTime?.enabled && range?.from) {\n\t\t\tconst fromBase = format(range.from, readableFormat, { locale: dateFnsLocale });\n\t\t\tconst fromText = showTimeInButton && startTimeDisplay ? `${fromBase} ${startTimeDisplay}` : fromBase;\n\t\t\tif (range.to) {\n\t\t\t\tconst toBase = format(range.to, readableFormat, { locale: dateFnsLocale });\n\t\t\t\tconst toText = showTimeInButton && endTimeDisplay ? `${toBase} ${endTimeDisplay}` : toBase;\n\t\t\t\treturn `${fromText} - ${toText}`;\n\t\t\t}\n\t\t\treturn fromText;\n\t\t}\n\t\treturn formatRangeButtonText(range, readableFormat, placeholder, t.selectDateRange, dateFnsLocale);\n\t}, [withTime?.enabled, range, readableFormat, showTimeInButton, startTimeDisplay, endTimeDisplay, placeholder, t, dateFnsLocale]);\n\n\tconst footerSummary = React.useMemo(() => {\n\t\tif (!range?.from || !range?.to) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst fromBase = format(range.from, readableFormat, { locale: dateFnsLocale });\n\t\tconst toBase = format(range.to, readableFormat, { locale: dateFnsLocale });\n\t\tconst fromText = showTimeInSummary && startTimeDisplay ? `${fromBase} ${startTimeDisplay}` : fromBase;\n\t\tconst toText = showTimeInSummary && endTimeDisplay ? `${toBase} ${endTimeDisplay}` : toBase;\n\n\t\treturn `${fromText} - ${toText}`;\n\t}, [range, readableFormat, dateFnsLocale, showTimeInSummary, startTimeDisplay, endTimeDisplay]);\n\n\treturn (\n\t\t<DatePickerField\n\t\t\trootRef={rootRef}\n\t\t\tclassName={baseProps.className}\n\t\t\tlabel={baseProps.label}\n\t\t\thint={baseProps.hint}\n\t\t\terror={baseProps.error}\n\t\t\ttriggerId={triggerId}\n\t\t\tdescribedById={describedBy}\n\t\t>\n\t\t\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t\t\t<PopoverTrigger\n\t\t\t\t\t\tref={baseProps.triggerRef}\n\t\t\t\t\t\tonBlur={baseProps.onBlur}\n\t\t\t\t\t\trender={(triggerProps) => {\n\t\t\t\t\t\t\tconst resolved = resolvePickerButtonProps(baseProps.buttonTone, baseProps.buttonStyle);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\t\t\tid={triggerId}\n\t\t\t\t\t\t\t\t\ttone={resolved.tone}\n\t\t\t\t\t\t\t\t\tbuttonStyle={resolved.buttonStyle}\n\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\taria-invalid={isInvalid}\n\t\t\t\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\tpickerTriggerClasses(size),\n\t\t\t\t\t\t\t\t\t\t!range && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t(triggerProps as { className?: string }).className,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdisabled={baseProps.disabled}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CalendarIcon className={cn(formControlIconClasses[size], 'shrink-0')} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"min-w-0 truncate text-inherit\">\n\t\t\t\t\t\t\t\t\t\t{buttonText}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t<PopoverContent\n\t\t\t\t\tinset=\"flush\"\n\t\t\t\t\tclassName=\"w-auto gap-0\"\n\t\t\t\t\talign=\"start\"\n\t\t\t\t>\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t{!!baseProps.header && <DatePickerHeader config={baseProps.header} />}\n\n\t\t\t\t\t<div className=\"flex flex-col sm:flex-row\">\n\t\t\t\t\t\t{/* Preset grid on narrow surfaces; sidebar once horizontal space is available. */}\n\t\t\t\t\t\t{presets.length > 0 && (\n\t\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-space-2xs border-b border-border p-surface-xs sm:flex sm:min-w-30 sm:flex-col sm:border-r sm:border-b-0\">\n\t\t\t\t\t\t\t\t{presets.map((preset) => (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tkey={preset.label}\n\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => handlePresetSelect(preset)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"justify-start text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{preset.label}\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Calendar */}\n\t\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t\t<Calendar\n\t\t\t\t\t\t\t\tmode=\"range\"\n\t\t\t\t\t\t\t\tselected={range}\n\t\t\t\t\t\t\t\tonSelect={handleSelect}\n\t\t\t\t\t\t\t\tdefaultMonth={range?.from}\n\t\t\t\t\t\t\t\tnumberOfMonths={resolvedNumberOfMonths}\n\t\t\t\t\t\t\t\tshowOutsideDays={baseProps.showOutsideDays}\n\t\t\t\t\t\t\t\tdisabled={disabledDates ?? baseProps.disabled}\n\t\t\t\t\t\t\t\tlocale={dateFnsLocale}\n\t\t\t\t\t\t\t\tcaptionLayout={captionLayout}\n\t\t\t\t\t\t\t\tstartMonth={yearBounds.startMonth}\n\t\t\t\t\t\t\t\tendMonth={yearBounds.endMonth}\n\t\t\t\t\t\t\t\t{...calendarProps}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\taffordanceGeometry.calendarCompactCell,\n\t\t\t\t\t\t\t\t\tcalendarProps?.className,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{/* Summary, time and confirmation. Rendered only when one of them has\n\t\t\t\t\t\t\t something to show, so a footer-only picker gets no empty padded band. */}\n\t\t\t\t\t\t\t{(() => {\n\t\t\t\t\t\t\t\tconst showSummary = !!range?.from && !baseProps.footer;\n\t\t\t\t\t\t\t\tconst showTime = !!withTime?.enabled && !!range?.from;\n\t\t\t\t\t\t\t\tconst showConfirm = !!(withConfirm || withTime?.enabled) && !baseProps.footer;\n\t\t\t\t\t\t\t\tif (!showSummary && !showTime && !hasValidationMessage && !showConfirm) return null;\n\t\t\t\t\t\t\t\treturn <>\n\t\t\t\t\t\t\t\t\t<Separator />\n\t\t\t\t\t\t\t\t\t<div className=\"date-picker--range-footer p-surface\">\n\t\t\t\t\t\t\t\t\t<Stack gap=\"lg\">\n\t\t\t\t\t\t\t\t\t\t{showSummary && !!range?.from && (\n\t\t\t\t\t <Stack direction=\"horizontal\" align=\"center\" justify=\"between\" gap=\"xl\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"secondary\">{t.from}:</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{format(range.from, readableFormat, { locale: dateFnsLocale })}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{showTimeInSummary && startTimeDisplay ? ` ${startTimeDisplay}` : ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t\t\t\t\t{!!range.to && (\n\t\t\t\t\t\t <Stack direction=\"horizontal\" align=\"center\" gap=\"md\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"secondary\">{t.to}:</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{format(range.to, readableFormat, { locale: dateFnsLocale })}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{showTimeInSummary && endTimeDisplay ? ` ${endTimeDisplay}` : ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t )}\n\t\t\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t )}\n\n\t\t\t\t\t\t\t\t\t\t{/* Time inputs: ordinary labelled field rows, no decorative glyph. */}\n\t\t\t\t\t\t\t\t\t\t{showTime && !!range?.from && (\n\t\t\t\t\t\t\t\t\t\t\t<Grid columns={{ base: 1, sm: 2 }} gap=\"lg\">\n\t\t\t\t\t\t\t\t\t\t\t\t<FormField label={t.startTime}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TimePicker\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={startTime ? normalizedTimeToString(startTime, includeSeconds) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonValueChange={handleStartTimeChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tformat={timeFormat}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprecision={includeSeconds ? 'seconds' : 'minutes'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstep={timeStep}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={baseProps.disabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Pinned: the time row is deliberately compact and\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// must not grow with a consumer's control size.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrings={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thours: t.hours,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tminutes: t.minutes,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tseconds: t.seconds,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tam: t.am,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpm: t.pm,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</FormField>\n\t\t\t\t\t\t\t\t\t\t\t\t{!!range.to && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FormField label={t.endTime}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<TimePicker\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={endTime ? normalizedTimeToString(endTime, includeSeconds) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonValueChange={handleEndTimeChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tformat={timeFormat}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprecision={includeSeconds ? 'seconds' : 'minutes'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstep={timeStep}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={baseProps.disabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Pinned: the time row is deliberately compact and\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// must not grow with a consumer's control size.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrings={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thours: t.hours,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tminutes: t.minutes,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tseconds: t.seconds,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tam: t.am,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpm: t.pm,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FormField>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</Grid>\n\t\t\t\t )}\n\n\t\t\t\t\t\t\t\t\t\t{/* Validation */}\n\t\t\t\t\t\t\t\t\t\t<Text type=\"error\" content={validationText} hidden={!hasValidationMessage} />\n\n\t\t\t\t\t\t\t\t\t\t{/* Confirm button (only if no custom footer) */}\n\t\t\t\t\t\t\t\t\t\t{showConfirm && (\n\t\t\t\t\t <Button tone=\"primary\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleConfirm}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!range?.from || !range?.to || !!validationMessage}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{t.confirm}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t )}\n\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</>;\n\t\t\t\t\t\t\t})()}\n\n\t\t\t\t\t\t\t{/* Custom footer: it brings its own divider and surface inset, so it\n\t\t\t\t\t\t\t sits directly in the popover column like the other modes' footers. */}\n\t\t\t\t\t\t\t{!!baseProps.footer && (\n\t\t\t\t\t\t\t\t<DatePickerFooter\n\t\t\t\t\t\t\t\t\tconfig={baseProps.footer}\n\t\t\t\t\t\t\t\t\toutput={createOutput(range)}\n\t\t\t\t\t\t\t\t\thasSelection={!!(range?.from && range?.to)}\n\t\t\t\t\t\t\t\t\tautoSummary={footerSummary}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\n\t\t</DatePickerField>\n\t);\n}\n","import * as React from 'react';\n\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nimport { getDayPickerYearBounds } from './date-picker-helpers';\nimport {\n\tisSingleMode,\n\tisMultipleMode,\n\tisRangeMode\n} from './date-picker-internals';\n// Ordered single → multiple → range, matching the dispatcher's branches.\nimport { SingleDatePicker } from './date-picker-single';\nimport { MultipleDatePicker } from './date-picker-multiple';\nimport { RangeDatePicker } from './date-picker-range';\nimport { useStrings } from '../../../lib/strings';\nimport { defaultDatePickerStrings } from './date-pickers.strings';\nimport { enUS } from 'date-fns/locale';\nimport type { DatePickerProps } from './datepicker.types';\n\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(function DatePicker(props, ref) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst dates = useDatesConfig();\n\n\t// Resolve locale (date-fns Locale object). Defaults to enUS when the\n\t// consumer doesn't pass one.\n\tconst dateFnsLocale = props.locale ?? dates.locale ?? enUS;\n\n\tconst t = useStrings(defaultDatePickerStrings, props.strings);\n\n\t// Resolve year selection config\n\tconst captionLayout = React.useMemo(() => {\n\t\tif (props.enableYearDropdown || props.yearSelection?.enabled) {\n\t\t\treturn 'dropdown' as const;\n\t\t}\n\t\treturn 'label' as const;\n\t}, [props.enableYearDropdown, props.yearSelection]);\n\tconst yearBounds = React.useMemo(\n\t\t() => getDayPickerYearBounds(props.yearSelection),\n\t\t[props.yearSelection]\n\t);\n\n\t// Rule 24: the family's BEM hook is merged with the consumer's own\n\t// `className` and applied *after* the props spread, so a call-site\n\t// class composes with the hook instead of replacing it — and every\n\t// mode carries it, not just single.\n\tconst componentClassName = cn('date-picker--component', props.className);\n\n\t// Render based on mode\n\tif (isSingleMode(props)) {\n\t\treturn (\n\t\t\t<SingleDatePicker\n\t\t\t\t{...props}\n\t\t\t\trootRef={ref}\n\t\t\t\tclassName={componentClassName}\n\t\t\t\topen={open}\n\t\t\t\tsetOpen={setOpen}\n\t\t\t\tt={t}\n\t\t\t\tdateFnsLocale={dateFnsLocale}\n\t\t\t\tcaptionLayout={captionLayout}\n\t\t\t\tyearBounds={yearBounds}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (isMultipleMode(props)) {\n\t\treturn (\n\t\t\t<MultipleDatePicker\n\t\t\t\t{...props}\n\t\t\t\trootRef={ref}\n\t\t\t\tclassName={componentClassName}\n\t\t\t\topen={open}\n\t\t\t\tsetOpen={setOpen}\n\t\t\t\tt={t}\n\t\t\t\tdateFnsLocale={dateFnsLocale}\n\t\t\t\tcaptionLayout={captionLayout}\n\t\t\t\tyearBounds={yearBounds}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (isRangeMode(props)) {\n\t\treturn (\n\t\t\t<RangeDatePicker\n\t\t\t\t{...props}\n\t\t\t\trootRef={ref}\n\t\t\t\tclassName={componentClassName}\n\t\t\t\topen={open}\n\t\t\t\tsetOpen={setOpen}\n\t\t\t\tt={t}\n\t\t\t\tdateFnsLocale={dateFnsLocale}\n\t\t\t\tcaptionLayout={captionLayout}\n\t\t\t\tyearBounds={yearBounds}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn null;\n});\n\nDatePicker.displayName = 'DatePicker';\n"],"mappings":"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"}
@@ -1,16 +1,16 @@
1
1
  "use client";
2
- import { o as e } from "./ui-provider-CQCuCBcy.js";
2
+ import { u as e } from "./ui-provider-C-74NVLc.js";
3
3
  import { useStrings as t } from "./lib/strings.js";
4
- import { t as n } from "./utils-CF3c95Io.js";
5
- import { n as r } from "./buttons-BbfzgczK.js";
6
- import { c as i } from "./typography-CSyJrh28.js";
7
- import { t as a } from "./structure-C0V0_Fyf.js";
8
- import { i as o } from "./popover.recipes-D3j8R8Yp.js";
9
- import { s } from "./form-sizing-NXgjkmBG.js";
10
- import { a as c, c as l, i as ee, l as te, o as ne, s as re, u as ie } from "./date-picker-zOt1oNss.js";
11
- import { c as ae, o as oe, t as u } from "./popover-uwzX2vo7.js";
12
- import { t as d } from "./form-field-CsgRmdit.js";
13
- import { l as f } from "./choice-inputs-JLtij2y4.js";
4
+ import { t as n } from "./utils-B6kKb8jB.js";
5
+ import { n as r } from "./buttons-BedGfygC.js";
6
+ import { c as i } from "./typography-BQnine1k.js";
7
+ import { t as a } from "./structure-DuxKl954.js";
8
+ import { i as o } from "./popover.recipes-DdiEp0rd.js";
9
+ import { s } from "./form-sizing-Bs2qFUeE.js";
10
+ import { a as c, c as l, i as ee, l as te, o as ne, s as re, u as ie } from "./date-picker-RlIzKom_.js";
11
+ import { c as ae, o as oe, t as u } from "./popover-B85RenIl.js";
12
+ import { t as d } from "./form-field-BriWAXyg.js";
13
+ import { l as f } from "./choice-inputs-zUgBZfE4.js";
14
14
  import * as p from "react";
15
15
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
16
16
  import { Calendar as g } from "lucide-react";
@@ -176,4 +176,4 @@ b.displayName = "MonthYearPicker";
176
176
  //#endregion
177
177
  export { b as t };
178
178
 
179
- //# sourceMappingURL=date-pickers-cj8IXbDC.js.map
179
+ //# sourceMappingURL=date-pickers-DY-CpXS1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-pickers-cj8IXbDC.js","names":["React","CalendarIcon","useDatesConfig","cn","Button","Text","Stack","popoverWidthRecipes","pickerTriggerClasses","DatePickerFooter","defaultDatePickerStrings","DatePickerField","usePickerTriggerSize","DatePickerHeader","resolvePickerButtonProps","PopoverTrigger","Popover","PopoverContent","FormField","Select","React$1","DEFAULT_YEAR_SPAN","MonthYearPicker","dateFormat","externalDescription","ariaInvalid","sizeProp","size","presentation","buttonTone","buttonStyle","currentYear","open","setOpen","selection","setSelection","value","defaultValue","dates","dateFnsLocale","locale","enUS","t","useStrings","strings","generatedTriggerId","triggerId","id","describedBy","ariaDescribedBy","error","isInvalid","invalid","monthSelectId","yearSelectId","yearRange","start","fromYear","end","toYear","i","monthNames","format","createOutput","date","year","month","readableFormat","handleMonthChange","monthValue","handleYearChange","yearValue","handleConfirm","onValueChange","closeOnSelect","buttonText","placeholder","ref","className","triggerRef","triggerProps","iconOnly","Calendar","formControlIconClasses","header","index","disabled","footer"],"sources":["../src/components/base/date-pickers/month-year-picker.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '../buttons';\nimport { FormField } from '../forms/form-field';\nimport { Stack } from '../structure';\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger\n} from '../popover';\nimport { Select } from '../choice-inputs';\nimport { Text } from '../../typography';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nimport { useStrings } from '../../../lib/strings';\n\nimport { DatePickerField } from './date-picker-field';\nimport { DatePickerFooter } from './date-picker-footer';\nimport { DatePickerHeader } from './date-picker-header';\nimport { pickerTriggerClasses, usePickerTriggerSize } from './date-picker.recipes';\nimport { resolvePickerButtonProps } from './date-picker-internals';\nimport { formControlIconClasses } from '../forms/form-sizing';\nimport { defaultDatePickerStrings } from './date-pickers.strings';\nimport type { MonthYearPickerProps, MonthYearOutput } from './datepicker.types';\nimport { enUS } from 'date-fns/locale';\nimport { popoverWidthRecipes } from '../popover/popover.recipes';\n\n/** Years offered on either side of the current year when no range is given. */\nconst DEFAULT_YEAR_SPAN = 10;\n\nexport const MonthYearPicker = React.forwardRef<HTMLDivElement, MonthYearPickerProps>(function MonthYearPicker({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tformat: dateFormat = 'yyyy-MM',\n\treadableFormat = 'MMMM yyyy',\n\tplaceholder,\n\tlabel,\n\thint,\n\terror,\n\tinvalid,\n\tid,\n\ttriggerRef,\n\tonBlur,\n\t'aria-describedby': externalDescription,\n\t'aria-invalid': ariaInvalid,\n\tdisabled = false,\n\tsize: sizeProp,\n\tbuttonTone,\n\tbuttonStyle,\n\tclassName,\n\tcloseOnSelect = true,\n\tstrings,\n\tlocale,\n\theader,\n\tfooter,\n\tfromYear,\n\ttoYear,\n\ticonOnly = false\n}: MonthYearPickerProps, ref) {\n\tconst size = usePickerTriggerSize(sizeProp);\n\tconst presentation = resolvePickerButtonProps(buttonTone, buttonStyle);\n\tconst currentYear = new Date().getFullYear();\n\tconst [open, setOpen] = React.useState(false);\n\tconst [selection, setSelection] = React.useState<{\n\t\tmonth: number;\n\t\tyear: number;\n\t} | undefined>(value ?? defaultValue);\n\n\tconst dates = useDatesConfig();\n\tconst dateFnsLocale = locale ?? dates.locale ?? enUS;\n\tconst t = useStrings(defaultDatePickerStrings, strings);\n\tconst generatedTriggerId = React.useId();\n\tconst triggerId = id ?? generatedTriggerId;\n\t// Mirrors the DatePicker variants: the error line is the trigger's\n\t// description, so screen readers announce it with the control.\n\tconst describedBy = `${triggerId}-description`;\n\tconst ariaDescribedBy = [externalDescription, error ? describedBy : undefined].filter(Boolean).join(' ') || undefined;\n\tconst isInvalid = Boolean(error) || Boolean(invalid || (ariaInvalid && ariaInvalid !== 'false'));\n\t// Derived from useId so several pickers can coexist on one page; these were\n\t// previously the fixed literals \"month-select\" / \"year-select\".\n\tconst monthSelectId = `${triggerId}-month`;\n\tconst yearSelectId = `${triggerId}-year`;\n\n\t// Year range. Anchored to the current year rather than fixed literals: the\n\t// previous 2017–2035 defaults would have stopped offering any future year\n\t// once 2035 arrived.\n\tconst yearRange = React.useMemo(() => {\n\t\tconst start = fromYear ?? currentYear - DEFAULT_YEAR_SPAN;\n\t\tconst end = toYear ?? currentYear + DEFAULT_YEAR_SPAN;\n\t\treturn Array.from({ length: Math.max(end - start + 1, 1) }, (_, i) => start + i);\n\t}, [fromYear, toYear, currentYear]);\n\n\t// Month names (localized)\n\tconst monthNames = React.useMemo(() => {\n\t\treturn Array.from({ length: 12 }, (_, i) => {\n\t\t\tconst date = new Date(2000, i, 1);\n\t\t\treturn format(date, 'MMMM', { locale: dateFnsLocale });\n\t\t});\n\t}, [dateFnsLocale]);\n\n\t// Sync internal state with controlled value\n\tReact.useEffect(() => {\n\t\tif (value !== undefined) {\n\t\t\tsetSelection(value);\n\t\t}\n\t}, [value]);\n\n\t// Helper to create the output object\n\tconst createOutput = React.useCallback(\n\t\t(month: number, year: number): MonthYearOutput => {\n\t\t\tconst date = new Date(year, month, 1);\n\t\t\treturn {\n\t\t\t\tmonth,\n\t\t\t\tyear,\n\t\t\t\tformatted: format(date, dateFormat, { locale: dateFnsLocale }),\n\t\t\t\treadable: format(date, readableFormat, { locale: dateFnsLocale }),\n\t\t\t\tdate\n\t\t\t};\n\t\t},\n\t\t[dateFormat, readableFormat, dateFnsLocale]\n\t);\n\n\t// Handle selection change\n\tconst handleMonthChange = React.useCallback(\n\t\t(monthValue: unknown) => {\n\t\t\tconst monthStr = String(monthValue);\n\t\t\tconst month = parseInt(monthStr, 10);\n\t\t\tconst year = selection?.year ?? currentYear;\n\t\t\tsetSelection({ month, year });\n\t\t},\n\t\t[selection?.year, currentYear]\n\t);\n\n\tconst handleYearChange = React.useCallback(\n\t\t(yearValue: unknown) => {\n\t\t\tconst yearStr = String(yearValue);\n\t\t\tconst year = parseInt(yearStr, 10);\n\t\t\tconst month = selection?.month ?? 0;\n\t\t\tsetSelection({ month, year });\n\t\t},\n\t\t[selection?.month]\n\t);\n\n\t// Handle confirm button click\n\tconst handleConfirm = React.useCallback(() => {\n\t\tif (selection) {\n\t\t\tonValueChange?.(createOutput(selection.month, selection.year));\n\t\t\tif (closeOnSelect) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t}\n\t}, [selection, onValueChange, createOutput, closeOnSelect]);\n\n\t// Button display text\n\tconst buttonText = React.useMemo(() => {\n\t\tif (selection) {\n\t\t\tconst date = new Date(selection.year, selection.month, 1);\n\t\t\treturn format(date, readableFormat, { locale: dateFnsLocale });\n\t\t}\n\t\treturn placeholder ?? t.selectMonthYear;\n\t}, [selection, readableFormat, dateFnsLocale, placeholder, t.selectMonthYear]);\n\n\treturn (\n\t\t<DatePickerField\n\t\t\trootRef={ref}\n\t\t\tclassName={cn('month-year-picker--component', className)}\n\t\t\tlabel={label}\n\t\t\thint={hint}\n\t\t\terror={error}\n\t\t\ttriggerId={triggerId}\n\t\t\tdescribedById={describedBy}\n\t\t>\n\t\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t\t<PopoverTrigger\n\t\t\t\t\tref={triggerRef}\n\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\trender={(triggerProps) => (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\tid={triggerId}\n\t\t\t\t\t\t\ttone={presentation.tone}\n\t\t\t\t\t\t\tbuttonStyle={presentation.buttonStyle}\n\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\taria-invalid={isInvalid}\n\t\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\t\t// Icon-only drops the visible value, so the action name has to\n\t\t\t\t\t\t\t// carry the button on its own.\n\t\t\t\t\t\t\taria-label={iconOnly ? t.selectMonthYear : undefined}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tpickerTriggerClasses(size, iconOnly),\n\t\t\t\t\t\t\t\t!selection && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t(triggerProps as { className?: string }).className,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<CalendarIcon className={formControlIconClasses[size]} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t{!iconOnly && (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"min-w-0 truncate text-inherit\">\n\t\t\t\t\t\t\t\t\t{buttonText}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t<PopoverContent\n\t\t\t\t\tinset=\"flush\"\n\t\t\t\t\tclassName={cn(popoverWidthRecipes.lg, 'gap-0')}\n\t\t\t\t\talign=\"start\"\n\t\t\t\t>\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t{!!header && <DatePickerHeader config={header} />}\n\n\t\t\t\t\t{/* Month and Year Selectors: ordinary FormField rows, so the label\n\t\t\t\t\t rhythm matches every other field. */}\n\t\t\t\t\t<div className=\"p-surface\">\n\t\t\t\t\t<Stack gap=\"xl\">\n\t\t\t\t\t\t<FormField label={t.month} htmlFor={monthSelectId}>\n\t\t\t\t\t\t\t<Select id={monthSelectId}\n\t\t\t\t\t\t\t\toptions={monthNames.map((label,index)=>({label,value:index.toString()}))}\n\t\t\t\t\t\t\t\tvalue={selection?.month?.toString()} onValueChange={handleMonthChange}\n\t\t\t\t\t\t\t\tplaceholder={t.month} disabled={disabled}/>\n\t\t\t\t\t\t</FormField>\n\n\t\t\t\t\t\t<FormField label={t.year} htmlFor={yearSelectId}>\n\t\t\t\t\t\t\t<Select id={yearSelectId}\n\t\t\t\t\t\t\t\toptions={yearRange.map(year=>({label:year.toString(),value:year.toString()}))}\n\t\t\t\t\t\t\t\tvalue={selection?.year?.toString()} onValueChange={handleYearChange}\n\t\t\t\t\t\t\t\tplaceholder={t.year} disabled={disabled}/>\n\t\t\t\t\t\t</FormField>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Confirm Button */}\n\t\t\t\t\t<div className=\"px-surface pb-surface\">\n\t\t\t\t\t\t<Button tone=\"primary\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\tonClick={handleConfirm}\n\t\t\t\t\t\t\tdisabled={disabled || !selection}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t.confirm}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Footer */}\n\t\t\t\t\t{!!footer && !!selection && (\n\t\t\t<DatePickerFooter\n\t\t\t\t\t\t\tconfig={footer}\n\t\t\t\t\t\t\toutput={createOutput(selection.month, selection.year)}\n\t\t\t\t\t\t\thasSelection={!!selection}\n\t\t\t\t\t\t\tautoSummary={buttonText}\n\t\t\t\t\t\t/>\n\t\t)}\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\n\t\t</DatePickerField>\n\t);\n});\n\n// Convenience export for type\nexport type { MonthYearPickerProps, MonthYearOutput };\n\nMonthYearPicker.displayName = 'MonthYearPicker';\n"],"mappings":"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"}
1
+ {"version":3,"file":"date-pickers-DY-CpXS1.js","names":["React","CalendarIcon","useDatesConfig","cn","Button","Text","Stack","popoverWidthRecipes","pickerTriggerClasses","DatePickerFooter","defaultDatePickerStrings","DatePickerField","usePickerTriggerSize","DatePickerHeader","resolvePickerButtonProps","PopoverTrigger","Popover","PopoverContent","FormField","Select","React$1","DEFAULT_YEAR_SPAN","MonthYearPicker","dateFormat","externalDescription","ariaInvalid","sizeProp","size","presentation","buttonTone","buttonStyle","currentYear","open","setOpen","selection","setSelection","value","defaultValue","dates","dateFnsLocale","locale","enUS","t","useStrings","strings","generatedTriggerId","triggerId","id","describedBy","ariaDescribedBy","error","isInvalid","invalid","monthSelectId","yearSelectId","yearRange","start","fromYear","end","toYear","i","monthNames","format","createOutput","date","year","month","readableFormat","handleMonthChange","monthValue","handleYearChange","yearValue","handleConfirm","onValueChange","closeOnSelect","buttonText","placeholder","ref","className","triggerRef","triggerProps","iconOnly","Calendar","formControlIconClasses","header","index","disabled","footer"],"sources":["../src/components/base/date-pickers/month-year-picker.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '../buttons';\nimport { FormField } from '../forms/form-field';\nimport { Stack } from '../structure';\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger\n} from '../popover';\nimport { Select } from '../choice-inputs';\nimport { Text } from '../../typography';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nimport { useStrings } from '../../../lib/strings';\n\nimport { DatePickerField } from './date-picker-field';\nimport { DatePickerFooter } from './date-picker-footer';\nimport { DatePickerHeader } from './date-picker-header';\nimport { pickerTriggerClasses, usePickerTriggerSize } from './date-picker.recipes';\nimport { resolvePickerButtonProps } from './date-picker-internals';\nimport { formControlIconClasses } from '../forms/form-sizing';\nimport { defaultDatePickerStrings } from './date-pickers.strings';\nimport type { MonthYearPickerProps, MonthYearOutput } from './datepicker.types';\nimport { enUS } from 'date-fns/locale';\nimport { popoverWidthRecipes } from '../popover/popover.recipes';\n\n/** Years offered on either side of the current year when no range is given. */\nconst DEFAULT_YEAR_SPAN = 10;\n\nexport const MonthYearPicker = React.forwardRef<HTMLDivElement, MonthYearPickerProps>(function MonthYearPicker({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\tformat: dateFormat = 'yyyy-MM',\n\treadableFormat = 'MMMM yyyy',\n\tplaceholder,\n\tlabel,\n\thint,\n\terror,\n\tinvalid,\n\tid,\n\ttriggerRef,\n\tonBlur,\n\t'aria-describedby': externalDescription,\n\t'aria-invalid': ariaInvalid,\n\tdisabled = false,\n\tsize: sizeProp,\n\tbuttonTone,\n\tbuttonStyle,\n\tclassName,\n\tcloseOnSelect = true,\n\tstrings,\n\tlocale,\n\theader,\n\tfooter,\n\tfromYear,\n\ttoYear,\n\ticonOnly = false\n}: MonthYearPickerProps, ref) {\n\tconst size = usePickerTriggerSize(sizeProp);\n\tconst presentation = resolvePickerButtonProps(buttonTone, buttonStyle);\n\tconst currentYear = new Date().getFullYear();\n\tconst [open, setOpen] = React.useState(false);\n\tconst [selection, setSelection] = React.useState<{\n\t\tmonth: number;\n\t\tyear: number;\n\t} | undefined>(value ?? defaultValue);\n\n\tconst dates = useDatesConfig();\n\tconst dateFnsLocale = locale ?? dates.locale ?? enUS;\n\tconst t = useStrings(defaultDatePickerStrings, strings);\n\tconst generatedTriggerId = React.useId();\n\tconst triggerId = id ?? generatedTriggerId;\n\t// Mirrors the DatePicker variants: the error line is the trigger's\n\t// description, so screen readers announce it with the control.\n\tconst describedBy = `${triggerId}-description`;\n\tconst ariaDescribedBy = [externalDescription, error ? describedBy : undefined].filter(Boolean).join(' ') || undefined;\n\tconst isInvalid = Boolean(error) || Boolean(invalid || (ariaInvalid && ariaInvalid !== 'false'));\n\t// Derived from useId so several pickers can coexist on one page; these were\n\t// previously the fixed literals \"month-select\" / \"year-select\".\n\tconst monthSelectId = `${triggerId}-month`;\n\tconst yearSelectId = `${triggerId}-year`;\n\n\t// Year range. Anchored to the current year rather than fixed literals: the\n\t// previous 2017–2035 defaults would have stopped offering any future year\n\t// once 2035 arrived.\n\tconst yearRange = React.useMemo(() => {\n\t\tconst start = fromYear ?? currentYear - DEFAULT_YEAR_SPAN;\n\t\tconst end = toYear ?? currentYear + DEFAULT_YEAR_SPAN;\n\t\treturn Array.from({ length: Math.max(end - start + 1, 1) }, (_, i) => start + i);\n\t}, [fromYear, toYear, currentYear]);\n\n\t// Month names (localized)\n\tconst monthNames = React.useMemo(() => {\n\t\treturn Array.from({ length: 12 }, (_, i) => {\n\t\t\tconst date = new Date(2000, i, 1);\n\t\t\treturn format(date, 'MMMM', { locale: dateFnsLocale });\n\t\t});\n\t}, [dateFnsLocale]);\n\n\t// Sync internal state with controlled value\n\tReact.useEffect(() => {\n\t\tif (value !== undefined) {\n\t\t\tsetSelection(value);\n\t\t}\n\t}, [value]);\n\n\t// Helper to create the output object\n\tconst createOutput = React.useCallback(\n\t\t(month: number, year: number): MonthYearOutput => {\n\t\t\tconst date = new Date(year, month, 1);\n\t\t\treturn {\n\t\t\t\tmonth,\n\t\t\t\tyear,\n\t\t\t\tformatted: format(date, dateFormat, { locale: dateFnsLocale }),\n\t\t\t\treadable: format(date, readableFormat, { locale: dateFnsLocale }),\n\t\t\t\tdate\n\t\t\t};\n\t\t},\n\t\t[dateFormat, readableFormat, dateFnsLocale]\n\t);\n\n\t// Handle selection change\n\tconst handleMonthChange = React.useCallback(\n\t\t(monthValue: unknown) => {\n\t\t\tconst monthStr = String(monthValue);\n\t\t\tconst month = parseInt(monthStr, 10);\n\t\t\tconst year = selection?.year ?? currentYear;\n\t\t\tsetSelection({ month, year });\n\t\t},\n\t\t[selection?.year, currentYear]\n\t);\n\n\tconst handleYearChange = React.useCallback(\n\t\t(yearValue: unknown) => {\n\t\t\tconst yearStr = String(yearValue);\n\t\t\tconst year = parseInt(yearStr, 10);\n\t\t\tconst month = selection?.month ?? 0;\n\t\t\tsetSelection({ month, year });\n\t\t},\n\t\t[selection?.month]\n\t);\n\n\t// Handle confirm button click\n\tconst handleConfirm = React.useCallback(() => {\n\t\tif (selection) {\n\t\t\tonValueChange?.(createOutput(selection.month, selection.year));\n\t\t\tif (closeOnSelect) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t}\n\t}, [selection, onValueChange, createOutput, closeOnSelect]);\n\n\t// Button display text\n\tconst buttonText = React.useMemo(() => {\n\t\tif (selection) {\n\t\t\tconst date = new Date(selection.year, selection.month, 1);\n\t\t\treturn format(date, readableFormat, { locale: dateFnsLocale });\n\t\t}\n\t\treturn placeholder ?? t.selectMonthYear;\n\t}, [selection, readableFormat, dateFnsLocale, placeholder, t.selectMonthYear]);\n\n\treturn (\n\t\t<DatePickerField\n\t\t\trootRef={ref}\n\t\t\tclassName={cn('month-year-picker--component', className)}\n\t\t\tlabel={label}\n\t\t\thint={hint}\n\t\t\terror={error}\n\t\t\ttriggerId={triggerId}\n\t\t\tdescribedById={describedBy}\n\t\t>\n\t\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t\t<PopoverTrigger\n\t\t\t\t\tref={triggerRef}\n\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\trender={(triggerProps) => (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t{...triggerProps}\n\t\t\t\t\t\t\tid={triggerId}\n\t\t\t\t\t\t\ttone={presentation.tone}\n\t\t\t\t\t\t\tbuttonStyle={presentation.buttonStyle}\n\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\taria-invalid={isInvalid}\n\t\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\t\t// Icon-only drops the visible value, so the action name has to\n\t\t\t\t\t\t\t// carry the button on its own.\n\t\t\t\t\t\t\taria-label={iconOnly ? t.selectMonthYear : undefined}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tpickerTriggerClasses(size, iconOnly),\n\t\t\t\t\t\t\t\t!selection && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t(triggerProps as { className?: string }).className,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<CalendarIcon className={formControlIconClasses[size]} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t{!iconOnly && (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"min-w-0 truncate text-inherit\">\n\t\t\t\t\t\t\t\t\t{buttonText}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t<PopoverContent\n\t\t\t\t\tinset=\"flush\"\n\t\t\t\t\tclassName={cn(popoverWidthRecipes.lg, 'gap-0')}\n\t\t\t\t\talign=\"start\"\n\t\t\t\t>\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t{!!header && <DatePickerHeader config={header} />}\n\n\t\t\t\t\t{/* Month and Year Selectors: ordinary FormField rows, so the label\n\t\t\t\t\t rhythm matches every other field. */}\n\t\t\t\t\t<div className=\"p-surface\">\n\t\t\t\t\t<Stack gap=\"xl\">\n\t\t\t\t\t\t<FormField label={t.month} htmlFor={monthSelectId}>\n\t\t\t\t\t\t\t<Select id={monthSelectId}\n\t\t\t\t\t\t\t\toptions={monthNames.map((label,index)=>({label,value:index.toString()}))}\n\t\t\t\t\t\t\t\tvalue={selection?.month?.toString()} onValueChange={handleMonthChange}\n\t\t\t\t\t\t\t\tplaceholder={t.month} disabled={disabled}/>\n\t\t\t\t\t\t</FormField>\n\n\t\t\t\t\t\t<FormField label={t.year} htmlFor={yearSelectId}>\n\t\t\t\t\t\t\t<Select id={yearSelectId}\n\t\t\t\t\t\t\t\toptions={yearRange.map(year=>({label:year.toString(),value:year.toString()}))}\n\t\t\t\t\t\t\t\tvalue={selection?.year?.toString()} onValueChange={handleYearChange}\n\t\t\t\t\t\t\t\tplaceholder={t.year} disabled={disabled}/>\n\t\t\t\t\t\t</FormField>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Confirm Button */}\n\t\t\t\t\t<div className=\"px-surface pb-surface\">\n\t\t\t\t\t\t<Button tone=\"primary\"\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\tonClick={handleConfirm}\n\t\t\t\t\t\t\tdisabled={disabled || !selection}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t.confirm}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Footer */}\n\t\t\t\t\t{!!footer && !!selection && (\n\t\t\t<DatePickerFooter\n\t\t\t\t\t\t\tconfig={footer}\n\t\t\t\t\t\t\toutput={createOutput(selection.month, selection.year)}\n\t\t\t\t\t\t\thasSelection={!!selection}\n\t\t\t\t\t\t\tautoSummary={buttonText}\n\t\t\t\t\t\t/>\n\t\t)}\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\n\t\t</DatePickerField>\n\t);\n});\n\n// Convenience export for type\nexport type { MonthYearPickerProps, MonthYearOutput };\n\nMonthYearPicker.displayName = 'MonthYearPicker';\n"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  "use client";
2
- import { o as e, s as t, v as n } from "./ui-provider-CQCuCBcy.js";
2
+ import { S as e, d as t, u as n } from "./ui-provider-C-74NVLc.js";
3
3
  import { useStrings as r } from "./lib/strings.js";
4
- import { t as i } from "./utils-CF3c95Io.js";
5
- import { c as a, o } from "./typography-CSyJrh28.js";
6
- import { t as s } from "./structure-C0V0_Fyf.js";
4
+ import { t as i } from "./utils-B6kKb8jB.js";
5
+ import { c as a, o } from "./typography-BQnine1k.js";
6
+ import { t as s } from "./structure-DuxKl954.js";
7
7
  import { i as c } from "./tone-recipes-BPsRAvhu.js";
8
- import { t as l } from "./smart-card-CqkzQsK-.js";
9
- import { s as u } from "./date-Q7jnXxpk.js";
10
- import { t as d } from "./badge-DErMA7ul.js";
8
+ import { t as l } from "./smart-card-CW0hjetE.js";
9
+ import { s as u } from "./date-Cq8ioE4o.js";
10
+ import { t as d } from "./badge-xIiV_E7f.js";
11
11
  import { forwardRef as f, useId as p } from "react";
12
12
  import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
13
13
  import { CheckCircle2 as _, XCircle as v } from "lucide-react";
@@ -163,7 +163,7 @@ function D(e) {
163
163
  return typeof e == "string" || typeof e == "number" || typeof e == "bigint";
164
164
  }
165
165
  function O({ date: o, time: s, dateTime: c, locale: l, layout: d = "stacked", timePlacement: f, tone: p = "neutral", variant: _ = "default", size: v, boxed: b, showWeekday: x = !0, showMonth: O = !0, showYear: k = !1, emptyLabel: A = "—", dayFormat: j = "d", weekdayFormat: M = "EEE", monthFormat: N = "MMM", yearFormat: te = "yyyy", className: P, strings: ne, "aria-label": re, ...F }) {
166
- let I = e(), { defaultScale: ie } = t(), L = n(v, ie), R = l ?? I.locale, z = r(S, ne), B = u(o), V = C[p], H = w[_], U = b ?? d === "stacked", W = i(V.primary, H.primary, !U && p === "neutral" && _ === "default" && "text-foreground"), G = f ?? (d === "inline" ? "inline" : "below"), K = ee(s) && G !== "hidden", q = R ? { locale: R } : void 0, J = B ? y(B, M, q) : null, Y = B ? y(B, j, q) : null, X = B ? y(B, N, q) : null, Z = B ? y(B, te, q) : null, Q = c ?? (B ? y(B, "yyyy-MM-dd") : void 0), $ = re ?? (B ? void 0 : z.unavailableLabel);
166
+ let I = n(), { defaultScale: ie } = t(), L = e(v, ie), R = l ?? I.locale, z = r(S, ne), B = u(o), V = C[p], H = w[_], U = b ?? d === "stacked", W = i(V.primary, H.primary, !U && p === "neutral" && _ === "default" && "text-foreground"), G = f ?? (d === "inline" ? "inline" : "below"), K = ee(s) && G !== "hidden", q = R ? { locale: R } : void 0, J = B ? y(B, M, q) : null, Y = B ? y(B, j, q) : null, X = B ? y(B, N, q) : null, Z = B ? y(B, te, q) : null, Q = c ?? (B ? y(B, "yyyy-MM-dd") : void 0), $ = re ?? (B ? void 0 : z.unavailableLabel);
167
167
  if (d === "inline") {
168
168
  let e = /* @__PURE__ */ h("span", {
169
169
  className: i("date-block--frame box-border inline-flex min-w-0 items-center rounded-radius tabular-nums", E[L].gap, U && i("border", E[L].padding, V.frame, H.frame)),
@@ -341,4 +341,4 @@ N.displayName = "BooleanIndicator";
341
341
  //#endregion
342
342
  export { S as a, O as i, A as n, x as o, k as r, b as s, N as t };
343
343
 
344
- //# sourceMappingURL=display-BB4BL_-K.js.map
344
+ //# sourceMappingURL=display-KsZLw9Ov.js.map