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
@@ -1 +1 @@
1
- {"version":3,"file":"event-calendar.js","names":["_Fragment","_Fragment","DateValue","useDatesConfig","useDensityConfig","resolveComponentScale","cn","Button","Text","focusRecipes","Stack","toneRecipes","dotRecipes","compositionClasses","interactionRecipes","DateTime","DatePrimitive","fieldAffordanceRecipes","Select","MonthYearPicker","segmentedControlRecipes","controlGroupHeightClasses","Fragment$1","calendarTokenDot","resolveCategoryColorToken","category","defaultEventCalendarStrings","EventCalendarEventBadge","dotColor","timeDisplay","event","format","cellTitleRaw","displayTitle","accessibleLabel","onClick","compact","useEventCalendarData","options","useMemo","monthStart","startOfMonth","currentDate","monthEnd","endOfMonth","rangeStart","rangeEnd","viewMode","startOfWeek","endOfWeek","days","eachDayOfInterval","filteredEvents","visibleCategories","events","eventsByDate","eventStart","startOfDay","eventEnd","normalizedEnd","dateKey","day","showWeekends","isWeekend","sortedEvents","a","b","isSameMonth","isToday","weekStartsOn","getEventsForDay","targetDay","date","isSameDay","getCategoryById","categories","cat","categoryId","EventCalendarDayCell","stringsProp","strings","data","visibleEvents","maxEvents","remainingCount","eventCount","isCurrentMonth","renderEvent","onEventClick","idx","renderAction","action","index","IconComponent","key","handleClick","buttonStyle","EventCalendarHeader","_rangeMode","size","defaultScale","useStrings","visibleActions","actions","viewModeOptions","Heading","displayLabel","output","onDateChange","minDate","maxDate","onToday","onPrevious","prevDisabled","ChevronLeft","onNext","nextDisabled","ChevronRight","onViewModeChange","value","TOKEN_EXTRAS","getCalendarColorClasses","token","getCalendarDotClass","EventCalendarLegend","isAllVisible","isCategoryVisible","enableFiltering","handleToggle","onToggleCategory","isVisible","colors","Icon","chipBase","inner","useEventCalendar","dateProp","viewModeProp","internalDate","setInternalDate","useState","defaultDate","internalViewMode","setInternalViewMode","defaultViewMode","commitDate","useCallback","commitViewMode","mode","calendarDays","dataOptions","newDate","addMonths","addWeeks","subMonths","subWeeks","weekStart","weekEnd","locale","isDateMatched","rule","d","datesMatch","predicateMatch","EventCalendar","controlledViewMode","weekStartsOnProp","controlledVisibleCategories","internalVisibleCategories","setInternalVisibleCategories","configWeekStartsOn","configLocale","resolvedLocale","handleToggleCategory","newCategories","id","onVisibleCategoriesChange","calendar","weekdays","handleDayClick","disabledDates","dayData","onDayClick","filteredCalendarDays","filterEvent","isDayDisabled","navDisabled","first","last","loading","className","viewModeChangeHandler","toggleCategoryHandler","enableCategoryFilter","showHeader","showLegend","emptyStateMessage","dayHeadingVariant","renderDayHeading","dayHeadingClassName","disabled","defaultRender","maxEventsPerDay","renderDayCell","defaultEventCalendarEventCardStrings","EventCalendarEventCard","isClickable","metadata","customerName","guestCount","serviceName","categoryDotClass","facts","cardContent","ExternalLink","commonClassName"],"sources":["../../src/components/features/event-calendar/event-calendar.types.ts","../../src/components/features/event-calendar/event-calendar-event-badge.tsx","../../src/components/features/event-calendar/use-event-calendar-data.tsx","../../src/components/features/event-calendar/event-calendar-day-cell.tsx","../../src/components/features/event-calendar/event-calendar-header.tsx","../../src/components/features/event-calendar/colors.ts","../../src/components/features/event-calendar/event-calendar-legend.tsx","../../src/components/features/event-calendar/use-event-calendar.tsx","../../src/components/features/event-calendar/event-calendar.tsx","../../src/components/features/event-calendar/event-calendar-event-card.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport type { DatePickerStrings } from '../../base/date-pickers';\nimport type { StringsProp } from '../../../lib/strings';\nimport type { ActionPresentation } from '../../../lib/action-presentation';\n\n/**\n * Calendar action item.\n *\n * The library never navigates on its own — there is no `href` shortcut.\n * The consumer wires routing into `onClick` (e.g. a Tanstack Router\n * `navigate(...)` or Inertia `router.visit(...)`), or supplies a fully\n * pre-rendered element via `element`.\n */\nexport interface CalendarActionItem extends ActionPresentation {\n\t/** Stable identity for this entry. */\n\tid?: string;\n\t/** Display label. */\n\tlabel: string;\n\tonClick?: () => void;\n\telement?: ReactNode;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n}\n\n/**\n * Base event data structure\n */\nexport interface CalendarEvent {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Surface title. */\n\ttitle: string;\n\t/** Supporting copy under the title. */\n\tdescription?: string;\n\tstartDate: Date;\n\tendDate?: Date;\n\tallDay?: boolean;\n\t/** Category supplying the chip's colour. */\n\tcategory: string;\n\tmetadata?: Record<string, unknown>;\n\turl?: string;\n}\n\n/**\n * Canonical category palette tokens. Map to a small fixed set of colours so\n * the calendar can render dots/strokes without parsing arbitrary class names.\n * Add new tokens here when the design palette grows.\n */\nexport type CalendarColorToken =\n\t| 'gray'\n\t| 'red'\n\t| 'orange'\n\t| 'amber'\n\t| 'yellow'\n\t| 'green'\n\t| 'blue'\n\t| 'purple';\n\n/**\n * Tailwind class lookups for each canonical token. Used by day-cell dots and\n * event-badge dots so we never string-parse `category.color`.\n */\nexport const calendarTokenDot: Record<CalendarColorToken, string> = {\n\tgray: 'bg-muted-foreground',\n\tred: 'bg-destructive',\n\torange: 'bg-warning',\n\tamber: 'bg-warning',\n\tyellow: 'bg-warning',\n\tgreen: 'bg-success',\n\tblue: 'bg-info',\n\tpurple: 'bg-primary',\n};\n\n/**\n * Event category configuration. `colorToken` is the single theme-safe color\n * channel used by dots, badges, borders, and legend swatches.\n */\nexport interface EventCategory {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Display label. */\n\tlabel: string;\n\tcolorToken: CalendarColorToken;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n\t/** Supporting copy under the title. */\n\tdescription?: string;\n}\n\n/**\n * Resolve a category to the canonical palette, falling back only when the\n * category itself is absent.\n */\nexport function resolveCategoryColorToken(category?: EventCategory | null): CalendarColorToken {\n\treturn category?.colorToken ?? 'gray';\n}\n\n/**\n * Calendar view mode\n */\nexport type CalendarViewMode = 'month' | 'week' | 'agenda';\n\n/**\n * Day cell data (processed)\n */\nexport interface CalendarDayData {\n\tdate: Date;\n\tisCurrentMonth: boolean;\n\tisToday: boolean;\n\tisWeekend: boolean;\n\tevents: CalendarEvent[];\n\teventCount: number;\n\thasMultipleEvents: boolean;\n}\n\n/**\n * Localizable strings — pass partial overrides via `strings`.\n */\nexport interface EventCalendarStrings {\n\t/** Copy owned by the nested month/year jumper. */\n\tmonthYearPicker?: StringsProp<DatePickerStrings>;\n\ttoday: string;\n\tprevious: string;\n\tnext: string;\n\t/** Shows the pending state. */\n\tloading: string;\n\tbooking: string;\n\tbookings: string;\n\t/**\n\t * Which view the switcher shows as active. `label` is the accessible name\n\t * of the switcher itself: its trigger is a combobox, and a combobox is not\n\t * named by the option it currently shows.\n\t */\n\tviewMode: {\n\t\tlabel: string;\n\t\tmonth: string;\n\t\tweek: string;\n\t\tagenda: string;\n\t};\n\tweekdaysShort: [string, string, string, string, string, string, string]; // Sun..Sat\n}\n\nexport const defaultEventCalendarStrings: EventCalendarStrings = {\n\ttoday: 'Today',\n\tprevious: 'Previous',\n\tnext: 'Next',\n\tloading: 'Loading…',\n\tbooking: 'booking',\n\tbookings: 'bookings',\n\tviewMode: {\n\t\tlabel: 'Calendar view',\n\t\tmonth: 'Month',\n\t\tweek: 'Week',\n\t\tagenda: 'Agenda',\n\t},\n\tweekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n};\n\n/**\n * Visual variant for the weekday-header strip (\"Sun Mon Tue …\").\n * - `default` — muted text on transparent (matches body)\n * - `accent` — primary-tinted background, primary text\n * - `tinted` — muted background, foreground text (subtle separation)\n * - `bordered` — bottom-bordered row, foreground text\n *\n * Consumers can also pass a fully custom `dayHeadingClassName` to override\n * any preset.\n */\nexport type EventCalendarDayHeadingVariant = 'default' | 'accent' | 'tinted' | 'bordered';\n\n/**\n * Predicate-or-list shape for date rules. Either explicit dates,\n * a predicate callback, or both (combined with OR semantics).\n */\nexport type DateRule = Date[] | ((date: Date) => boolean) | { dates?: Date[]; predicate?: (date: Date) => boolean };\n\n/**\n * Hook for filtering events at render time without mutating the source list.\n */\nexport type EventFilter = (event: CalendarEvent) => boolean;\n\n/**\n * Render hook for individual event chips in the day cell.\n */\nexport type RenderEventFn = (event: CalendarEvent, category: EventCategory | undefined) => ReactNode;\n\n/**\n * Render hook for the day cell body (after the date number is drawn).\n */\nexport type RenderDayCellFn = (day: CalendarDayData, defaultRender: () => ReactNode) => ReactNode;\n\n/**\n * Range mode for navigation. `month-year` exposes a Month/Year picker\n * trigger in the header that jumps the calendar to that month.\n */\nexport type EventCalendarRangeMode = 'date' | 'month-year';\n\n/**\n * Event calendar props\n */\nexport interface EventCalendarProps {\n\t/** Events to place on the grid. The calendar does no fetching of its own. */\n\tevents: CalendarEvent[];\n\t/** Category definitions supplying each event's colour and legend entry. */\n\tcategories: EventCategory[];\n\t/** Current view. Controlled when paired with `onViewModeChange`. */\n\tviewMode?: CalendarViewMode;\n\t/** View shown on first render for uncontrolled use. */\n\tdefaultViewMode?: CalendarViewMode;\n\t/** Fired when the user switches view from the header. */\n\tonViewModeChange?: (mode: CalendarViewMode) => void;\n\t/** Visible date. Controlled when paired with `onDateChange`. */\n\tdate?: Date;\n\t/** Month shown on first render. Defaults to today. */\n\tdefaultDate?: Date;\n\t/** Fired when the visible period changes through navigation or the picker. */\n\tonDateChange?: (date: Date) => void;\n\t/** Fired when an event is activated. */\n\tonEventClick?: (event: CalendarEvent) => void;\n\t/** Fired when a day cell is activated, with that day's events. */\n\tonDayClick?: (date: Date, events: CalendarEvent[]) => void;\n\t/** Events rendered per day before collapsing into an overflow indicator. */\n\tmaxEventsPerDay?: number;\n\t/** Shows the category legend beneath the grid. */\n\tshowLegend?: boolean;\n\t/** Shows the navigation header above the grid. */\n\tshowHeader?: boolean;\n\t/** Includes Saturday and Sunday columns. */\n\tshowWeekends?: boolean;\n\t/** First column of the week, `0` = Sunday. */\n\tweekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\t/** Optional date-fns Locale object passed to inner date pickers. */\n\tlocale?: import('date-fns').Locale;\n\t/** Lets the legend filter which categories are drawn. */\n\tenableCategoryFilter?: boolean;\n\t/** Category ids currently shown. Controlled when paired with the change handler. */\n\tvisibleCategories?: string[];\n\t/** Fired when the legend toggles a category. */\n\tonVisibleCategoriesChange?: (categories: string[]) => void;\n\t/** Replaces the grid with the loading state. */\n\tloading?: boolean;\n\t/** Copy shown when no events fall in the visible period. */\n\temptyStateMessage?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Tightens row heights and event chips for dense dashboards. */\n\tcompact?: boolean;\n\t/** Buttons rendered in the header, before the today/navigation controls. */\n\tactions?: CalendarActionItem[];\n\t/** Overrides the calendar's own copy (view names, today, empty state). */\n\tstrings?: StringsProp<EventCalendarStrings>;\n\t/** Visual variant for the weekday header strip. Default `default`. */\n\tdayHeadingVariant?: EventCalendarDayHeadingVariant;\n\t/** Custom class names appended to each weekday-heading cell — wins over variant presets. */\n\tdayHeadingClassName?: string;\n\t/** Optional renderer to fully control a single weekday cell. */\n\trenderDayHeading?: (day: string, index: number) => ReactNode;\n\n\t/**\n\t * Header navigation range mode.\n\t * - `date` — DatePicker (default; jump to a specific date)\n\t * - `month-year` — MonthYearPicker (compact month/year jump)\n\t */\n\trangeMode?: EventCalendarRangeMode;\n\n\t/** Earliest date the user can navigate to. Earlier nav is disabled. */\n\tminDate?: Date;\n\t/** Latest date the user can navigate to. Later nav is disabled. */\n\tmaxDate?: Date;\n\t/**\n\t * Dates that should render in the calendar but be marked as disabled\n\t * (greyed out, not clickable). Pass dates, a predicate, or both.\n\t */\n\tdisabledDates?: DateRule;\n\t/**\n\t * Hide events from rendering at runtime without mutating `events`.\n\t * Returns `true` to KEEP an event, `false` to hide it.\n\t */\n\tfilterEvent?: EventFilter;\n\t/** Per-event renderer override. */\n\trenderEvent?: RenderEventFn;\n\t/** Per-day-cell renderer override. */\n\trenderDayCell?: RenderDayCellFn;\n}\n\n/**\n * Day cell props\n */\nexport interface EventCalendarDayCellProps {\n\t/** The record this surface renders. */\n\tdata: CalendarDayData;\n\t/** Category definitions supplying each entry's colour. */\n\tcategories: EventCategory[];\n\t/** Events shown before collapsing into an overflow indicator. */\n\tmaxEvents?: number;\n\tonClick: () => void;\n\t/** Selects an individual event, independently of its day. */\n\tonEventClick?: (event: CalendarEvent) => void;\n\t/** Tightens spacing for dense surfaces. */\n\tcompact?: boolean;\n\t/** Overrides this surface's own copy. */\n\tstrings?: Pick<EventCalendarStrings, 'booking' | 'bookings'>;\n\t/** Per-event renderer override. */\n\trenderEvent?: RenderEventFn;\n}\n\n/**\n * Event badge props\n */\nexport interface EventCalendarEventBadgeProps {\n\t/** The event this chip represents. */\n\tevent: CalendarEvent;\n\t/** Category supplying the chip's colour. */\n\tcategory: EventCategory | undefined;\n\t/** Tightens spacing for dense surfaces. */\n\tcompact?: boolean;\n\tonClick?: () => void;\n}\n\n/**\n * Event card props\n */\nexport interface EventCalendarEventCardProps {\n\t/** The event this chip represents. */\n\tevent: CalendarEvent;\n\t/** Category supplying the chip's colour. */\n\tcategory: EventCategory | undefined;\n\tonClick?: () => void;\n}\n\n/**\n * Legend props\n */\nexport interface EventCalendarLegendProps {\n\t/** Category definitions supplying each entry's colour. */\n\tcategories: EventCategory[];\n\t/** Ids of the categories currently shown. */\n\tvisibleCategories?: string[];\n\tonToggleCategory?: (categoryId: string) => void;\n\t/** Lets the legend toggle category visibility. */\n\tenableFiltering?: boolean;\n}\n\n/**\n * Header props\n */\nexport interface EventCalendarHeaderProps {\n\t/** Date the header is describing. */\n\tcurrentDate: Date;\n\t/** Which view the switcher shows as active. */\n\tviewMode: CalendarViewMode;\n\t/** Formatted period label, e.g. \"March 2026\". */\n\tdisplayLabel: string;\n\tonPrevious: () => void;\n\tonNext: () => void;\n\tonToday: () => void;\n\tonViewModeChange?: (mode: CalendarViewMode) => void;\n\tonDateChange?: (date: Date) => void;\n\t/** Optional date-fns Locale object passed to inner date pickers. */\n\tlocale?: import('date-fns').Locale;\n\t/** Controls offered on the surface. */\n\tactions?: CalendarActionItem[];\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<Pick<EventCalendarStrings, 'today' | 'previous' | 'next' | 'viewMode' | 'monthYearPicker'>>;\n\t/** Range mode for the date trigger inside the header. */\n\trangeMode?: EventCalendarRangeMode;\n\t/** Earliest navigable date; the previous control disables at it. */\n\tminDate?: Date;\n\t/** Latest navigable date; the next control disables at it. */\n\tmaxDate?: Date;\n\t/** Forces the previous control off. */\n\tprevDisabled?: boolean;\n\t/** Forces the next control off. */\n\tnextDisabled?: boolean;\n}\n\n/**\n * Hook return type\n */\nexport interface UseEventCalendarReturn {\n\t/** Date the header is describing. */\n\tcurrentDate: Date;\n\t/** Which view the switcher shows as active. */\n\tviewMode: CalendarViewMode;\n\tcalendarDays: CalendarDayData[];\n\tvisibleEvents: CalendarEvent[];\n\tgoToToday: () => void;\n\tgoToNextPeriod: () => void;\n\tgoToPreviousPeriod: () => void;\n\tsetDate: (date: Date) => void;\n\tsetViewMode: (mode: CalendarViewMode) => void;\n\t/** Formatted period label, e.g. \"March 2026\". */\n\tdisplayLabel: string;\n\thasEvents: boolean;\n}\n\n/**\n * Data transformation hook options\n */\nexport interface UseEventCalendarDataOptions {\n\tweekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\tshowWeekends?: boolean;\n\t/** Ids of the categories currently shown. */\n\tvisibleCategories?: string[];\n}\n","/**\n * EventCalendarEventBadge — compact badge representing a single event inside\n * a day cell. Renders a category-coloured dot, the event title (or a custom\n * `metadata.calendar_cell_title` override), and the start time when not an\n * all-day event. Click is captured locally and propagated via `onClick`.\n */\nimport { format } from 'date-fns';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport {\n\tcalendarTokenDot,\n\tresolveCategoryColorToken,\n\ttype EventCalendarEventBadgeProps,\n} from './event-calendar.types';\nimport { dotRecipes } from '../../../lib/tone-recipes';\n\nexport function EventCalendarEventBadge({\n\tevent,\n\tcategory,\n\tcompact = false,\n\tonClick,\n}: EventCalendarEventBadgeProps) {\n\tconst dotColor = calendarTokenDot[resolveCategoryColorToken(category)];\n\n\tconst timeDisplay = !event.allDay ? format(event.startDate, 'HH:mm') : null;\n\tconst cellTitleRaw = event.metadata?.calendar_cell_title;\n\tconst displayTitle =\n\t\ttypeof cellTitleRaw === 'string' && cellTitleRaw.trim() !== ''\n\t\t\t? cellTitleRaw\n\t\t\t: event.title;\n\tconst accessibleLabel = timeDisplay ? `${displayTitle} at ${timeDisplay}` : displayTitle;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={(e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tonClick?.();\n\t\t\t}}\n\t\t\tclassName={cn('event-calendar-event-badge--component',\n\t\t\t\tfieldAffordanceRecipes.inline,\n\t\t\t\tfieldAffordanceRecipes.focus,\n\t\t\t\t'@container/calendar-event group/calendar-event w-full min-w-0 cursor-pointer text-left text-card-foreground',\n\t\t\t)}\n\t\t\taria-label={accessibleLabel}\n\t\t\ttitle={accessibleLabel}\n\t\t>\n\t\t\t<span className={cn(\n\t\t\t\t'box-border flex w-full min-w-0 items-center gap-space-xs overflow-hidden rounded-radius border border-border bg-card px-space-xs group-hover/calendar-event:bg-accent group-hover/calendar-event:text-accent-foreground',\n\t\t\t\tcompact ? 'py-space-2xs' : 'py-space-xs',\n\t\t\t\t// A narrow cell shows only the marker; the shared compact action height keeps\n\t\t\t\t// it a 24px+ target (WCAG 2.2 target size) rather than a 12px sliver.\n\t\t\t\t'@max-[4rem]/calendar-event:min-h-action-xs @max-[4rem]/calendar-event:justify-center @max-[4rem]/calendar-event:border-transparent @max-[4rem]/calendar-event:bg-transparent @max-[4rem]/calendar-event:px-0 @max-[4rem]/calendar-event:py-space-2xs',\n\t\t\t)}>\n\t\t\t<span\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(dotRecipes.inline, dotColor)}\n\t\t\t/>\n\t\t\t<Text\n\t\t\t\ttag=\"span\"\n\t\t\t\ttype=\"inherit\"\n\t\t\t\tsize=\"xs\"\n\t\t\t\tweight=\"medium\"\n\t\t\t\tclassName=\"hidden min-w-0 flex-1 truncate @min-[4rem]/calendar-event:block\"\n\t\t\t>\n\t\t\t\t{displayTitle}\n\t\t\t</Text>\n\t\t\t{!!timeDisplay && (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tclassName=\"hidden shrink-0 whitespace-nowrap tabular-nums @min-[4rem]/calendar-event:inline\"\n\t\t\t\t>\n\t\t\t\t\t{timeDisplay}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n\nEventCalendarEventBadge.displayName = 'EventCalendarEventBadge';\n","import {\n\tstartOfMonth,\n\tendOfMonth,\n\tstartOfWeek,\n\tendOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisToday,\n\tisSameDay,\n\tisWeekend,\n\tstartOfDay\n} from 'date-fns';\nimport { useMemo } from 'react';\nimport type {\n\tCalendarEvent,\n\tCalendarDayData,\n\tCalendarViewMode,\n\tUseEventCalendarDataOptions\n} from './event-calendar.types';\n\n/**\n * Transforms raw events into calendar grid data\n */\nexport function useEventCalendarData(\n\tevents: CalendarEvent[],\n\tcurrentDate: Date,\n\tviewMode: CalendarViewMode,\n\toptions: UseEventCalendarDataOptions = {}\n): CalendarDayData[] {\n\tconst {\n\t\tweekStartsOn = 1,\n\t\tshowWeekends = true,\n\t\tvisibleCategories\n\t} = options;\n\n\treturn useMemo(() => {\n\t\tconst monthStart = startOfMonth(currentDate);\n\t\tconst monthEnd = endOfMonth(currentDate);\n\n\t\tlet rangeStart: Date;\n\t\tlet rangeEnd: Date;\n\n\t\tif (viewMode === 'month') {\n\t\t\trangeStart = startOfWeek(monthStart, { weekStartsOn });\n\t\t\trangeEnd = endOfWeek(monthEnd, { weekStartsOn });\n\t\t} else if (viewMode === 'week') {\n\t\t\trangeStart = startOfWeek(currentDate, { weekStartsOn });\n\t\t\trangeEnd = endOfWeek(currentDate, { weekStartsOn });\n\t\t} else {\n\t\t\trangeStart = monthStart;\n\t\t\trangeEnd = monthEnd;\n\t\t}\n\n\t\tconst days = eachDayOfInterval({ start: rangeStart, end: rangeEnd });\n\n\t\tconst filteredEvents = visibleCategories && visibleCategories.length > 0\n\t\t\t? events.filter(event => visibleCategories.includes(event.category))\n\t\t\t: events;\n\n\t\tconst eventsByDate = new Map<string, CalendarEvent[]>();\n\n\t\tfilteredEvents.forEach(event => {\n\t\t\tconst eventStart = startOfDay(event.startDate);\n\t\t\tif (Number.isNaN(eventStart.getTime())) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet eventEnd = eventStart;\n\t\t\tif (event.endDate && !Number.isNaN(event.endDate.getTime())) {\n\t\t\t\tconst normalizedEnd = startOfDay(event.endDate);\n\t\t\t\tif (!Number.isNaN(normalizedEnd.getTime()) && normalizedEnd.getTime() >= eventStart.getTime()) {\n\t\t\t\t\teventEnd = normalizedEnd;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst eventDays = eachDayOfInterval({ start: eventStart, end: eventEnd });\n\n\t\t\teventDays.forEach(day => {\n\t\t\t\tconst dateKey = day.toISOString().split('T')[0];\n\t\t\t\tif (!eventsByDate.has(dateKey)) {\n\t\t\t\t\teventsByDate.set(dateKey, []);\n\t\t\t\t}\n\t\t\t\teventsByDate.get(dateKey)!.push(event);\n\t\t\t});\n\t\t});\n\n\t\tconst calendarDays: CalendarDayData[] = days\n\t\t\t.filter(day => showWeekends || !isWeekend(day))\n\t\t\t.map(day => {\n\t\t\t\tconst dateKey = day.toISOString().split('T')[0];\n\t\t\t\tconst dayEvents = eventsByDate.get(dateKey) || [];\n\n\t\t\t\tconst sortedEvents = [...dayEvents].sort((a, b) => {\n\t\t\t\t\tif (a.allDay && !b.allDay) return -1;\n\t\t\t\t\tif (!a.allDay && b.allDay) return 1;\n\t\t\t\t\treturn a.startDate.getTime() - b.startDate.getTime();\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tdate: day,\n\t\t\t\t\tisCurrentMonth: isSameMonth(day, currentDate),\n\t\t\t\t\tisToday: isToday(day),\n\t\t\t\t\tisWeekend: isWeekend(day),\n\t\t\t\t\tevents: sortedEvents,\n\t\t\t\t\teventCount: sortedEvents.length,\n\t\t\t\t\thasMultipleEvents: sortedEvents.length > 1\n\t\t\t\t};\n\t\t\t});\n\n\t\treturn calendarDays;\n\t}, [events, currentDate, viewMode, weekStartsOn, showWeekends, visibleCategories]);\n}\n\n/**\n * Gets events for a specific day\n */\nexport function getEventsForDay(\n\tevents: CalendarEvent[],\n\tdate: Date\n): CalendarEvent[] {\n\treturn events\n\t\t.filter(event => {\n\t\t\tconst eventStart = startOfDay(event.startDate);\n\t\t\tconst eventEnd = event.endDate ? startOfDay(event.endDate) : eventStart;\n\t\t\tconst targetDay = startOfDay(date);\n\n\t\t\treturn isSameDay(targetDay, eventStart) ||\n\t\t\t\tisSameDay(targetDay, eventEnd) ||\n\t\t\t\t(targetDay > eventStart && targetDay < eventEnd);\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\tif (a.allDay && !b.allDay) return -1;\n\t\t\tif (!a.allDay && b.allDay) return 1;\n\t\t\treturn a.startDate.getTime() - b.startDate.getTime();\n\t\t});\n}\n\n/**\n * Gets the category object by ID\n */\nexport function getCategoryById<T extends { id: string }>(\n\tcategories: T[],\n\tcategoryId: string\n): T | undefined {\n\treturn categories.find(cat => cat.id === categoryId);\n}\n","/**\n * EventCalendarDayCell — single day square in the month grid. Shows the day\n * number, up to `maxEvents` event badges, and an overflow row with category\n * dots + a pluralised \"+N bookings\" hint when more events exist than fit.\n * The day number is the cell's focusable control; clicking anywhere in the\n * square selects the day too.\n */\nimport { Text } from '../../typography/text';\nimport { cn } from '../../../lib/utils';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { EventCalendarEventBadge } from './event-calendar-event-badge';\nimport {\n\tcalendarTokenDot,\n\tdefaultEventCalendarStrings,\n\tresolveCategoryColorToken,\n\ttype EventCalendarDayCellProps,\n} from './event-calendar.types';\nimport { getCategoryById } from './use-event-calendar-data';\n\nexport function EventCalendarDayCell({\n\tdata,\n\tcategories,\n\tmaxEvents = 3,\n\tonClick,\n\tonEventClick,\n\tcompact = false,\n\tstrings: stringsProp,\n\trenderEvent,\n}: EventCalendarDayCellProps) {\n\tconst strings = {\n\t\tbooking: stringsProp?.booking ?? defaultEventCalendarStrings.booking,\n\t\tbookings: stringsProp?.bookings ?? defaultEventCalendarStrings.bookings,\n\t};\n\tconst { date, isCurrentMonth, isToday, isWeekend, events, eventCount } = data;\n\n\tconst visibleEvents = events.slice(0, maxEvents);\n\tconst remainingCount = Math.max(0, eventCount - maxEvents);\n\n\treturn (\n\t\t<div className={cn('event-calendar-day-cell--component', 'box-border h-full p-0 relative w-full border-r border-b border-border last:border-r-0 [&:nth-child(7n)]:border-r-0')}>\n\t\t\t{/*\n\t\t\t * Not `role=\"button\"`: the cell contains the event badges, which are\n\t\t\t * real buttons, and a button may not hold focusable descendants.\n\t\t\t * The day number below is the cell's keyboard affordance; the click\n\t\t\t * handler here only widens the pointer target to the whole square.\n\t\t\t */}\n\t\t\t<div\n\t\t\t\tonClick={onClick}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'event-calendar-day-cell--surface',\n\t\t\t\t\t'box-border relative h-full w-full min-h-24 p-space-md transition-colors',\n\t\t\t\t\t'hover:bg-accent',\n\t\t\t\t\t'flex flex-col items-start gap-space-xs',\n\t\t\t\t\t// No opacity wash: halving the whole subtree dragged the day\n\t\t\t\t\t// number to 2.14 and the event badges to 3.03. The muted day\n\t\t\t\t\t// number below is the out-of-month cue, and it costs no\n\t\t\t\t\t// contrast. A background tint is not an option either — it\n\t\t\t\t\t// would read as the `bg-accent` \"today\" cell.\n\t\t\t\t\tisToday && 'h-full bg-accent text-accent-foreground',\n\t\t\t\t\tcompact && 'min-h-20 p-space-xs'\n\t\t\t\t)}\n\t\t\t\tdata-date={date.toISOString()}\n\t\t\t\tdata-today={isToday}\n\t\t\t\tdata-weekend={isWeekend}\n\t\t\t\tdata-current-month={isCurrentMonth}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tonClick();\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'event-calendar-day-cell--date',\n\t\t\t\t\t\tfieldAffordanceRecipes.target,\n\t\t\t\t\t\tfieldAffordanceRecipes.focus,\n\t\t\t\t\t\t'text-inherit',\n\t\t\t\t\t)}\n\t\t\t\t\taria-label={date.toDateString()}\n\t\t\t\t>\n\t\t\t\t\t<Text\n\t\t\t\t\t\tsize={compact ? 'xs' : undefined}\n\t\t\t\t\t\tweight={isToday ? 'semibold' : 'regular'}\n\t\t\t\t\t\ttype={isCurrentMonth ? 'main' : 'secondary'}\n\t\t\t\t\t\tlineHeight=\"none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{date.getDate()}\n\t\t\t\t\t</Text>\n\t\t\t\t</button>\n\n\t\t\t\t<div className=\"w-full space-y-space-2xs\">\n\t\t\t\t\t{visibleEvents.map((event) => {\n\t\t\t\t\t\tconst category = getCategoryById(categories, event.category);\n\t\t\t\t\t\tif (renderEvent) {\n\t\t\t\t\t\t\treturn <div key={event.id}>{renderEvent(event, category)}</div>;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<EventCalendarEventBadge\n\t\t\t\t\t\t\t\tkey={event.id}\n\t\t\t\t\t\t\t\tevent={event}\n\t\t\t\t\t\t\t\tcategory={category}\n\t\t\t\t\t\t\t\tcompact={compact || data.hasMultipleEvents}\n\t\t\t\t\t\t\t\tonClick={() => { if (onEventClick) onEventClick(event); else onClick(); }}\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\t{remainingCount > 0 && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-space-xs py-space-2xs px-space-md\">\n\t\t\t\t\t\t\t<div className=\"flex items-center -space-x-1\">\n\t\t\t\t\t\t\t\t{categories.slice(0, 3).map((category, idx) => (\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tkey={category.id || idx}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'h-1.5 w-1.5 rounded-full border border-background',\n\t\t\t\t\t\t\t\t\t\t\tcalendarTokenDot[resolveCategoryColorToken(category)],\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))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{remainingCount} {remainingCount === 1 ? strings.booking : strings.bookings}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nEventCalendarDayCell.displayName = 'EventCalendarDayCell';\n","import {compositionClasses} from '../../base/structure/composition.recipes';\n/**\n * EventCalendarHeader — title, month/year picker, optional action buttons,\n * Today button, prev/next stepper, and a view-mode select. Designed to sit\n * above `EventCalendar`'s grid; can be reused independently for custom\n * layouts.\n */\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { Button } from '../../base/buttons';\nimport { MonthYearPicker } from '../../base/date-pickers';\nimport { Select, type SelectOption } from '../../base/choice-inputs';\nimport { Heading } from '../../typography/heading';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { controlGroupHeightClasses, segmentedControlRecipes } from '../../../lib/control-group-recipes';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { defaultEventCalendarStrings, type EventCalendarHeaderProps, type CalendarActionItem, type CalendarViewMode } from './event-calendar.types';\n\n/**\n * Render a single action item\n */\nconst renderAction = (action: CalendarActionItem, index: number) => {\n\tif (!action) return null;\n\n\tif (action.element) {\n\t\treturn <div className=\"event-calendar-header--action-slot\" key={action.id || index}>{action.element}</div>;\n\t}\n\n\tconst IconComponent = action.icon;\n\tconst key = action.id || `action-${index}`;\n\n\tconst handleClick = () => {\n\t\taction.onClick?.();\n\t};\n\n\tconst buttonStyle = action.buttonStyle === 'link' ? 'ghost' : action.buttonStyle ?? 'solid';\n\n\treturn (\n\t\t<Button\n\t\t\tkey={key}\n\t\t\ttone={action.tone ?? 'primary'}\n\t\t\tbuttonStyle={buttonStyle}\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t'gap-space-md',\n\t\t\t\taction.buttonStyle === 'link' && 'underline underline-offset-[0.2em]',\n\t\t\t)}\n\t\t\tdisabled={!!action.disabled}\n\t\t>\n\t\t\t{!!IconComponent && <IconComponent className=\"size-icon\" />}\n\t\t\t{action.label}\n\t\t</Button>\n\t);\n};\n\n/**\n * Calendar header component\n */\nexport function EventCalendarHeader({\n\tcurrentDate,\n\tviewMode,\n\tdisplayLabel,\n\tonPrevious,\n\tonNext,\n\tonToday,\n\tonViewModeChange,\n\tonDateChange,\n\tlocale,\n\tactions,\n\tstrings: stringsProp,\n\trangeMode: _rangeMode = 'date',\n\tminDate,\n\tmaxDate,\n\tprevDisabled = false,\n\tnextDisabled = false,\n}: EventCalendarHeaderProps) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(undefined, defaultScale);\n\tconst strings = useStrings(defaultEventCalendarStrings, stringsProp);\n\tconst visibleActions = useMemo(() => {\n\t\treturn (actions || []).filter(a => a.visible !== false);\n\t}, [actions]);\n\tconst viewModeOptions = useMemo<SelectOption[]>(\n\t\t() => [\n\t\t\t{ value: 'month', label: strings.viewMode.month },\n\t\t\t{ value: 'week', label: strings.viewMode.week },\n\t\t\t{ value: 'agenda', label: strings.viewMode.agenda },\n\t\t],\n\t\t[strings.viewMode.month, strings.viewMode.week, strings.viewMode.agenda],\n\t);\n\n\treturn (\n\t\t<div className=\"event-calendar-header--component @container/event-calendar-header mb-space-xl min-w-0\">\n\t\t\t<div className=\"event-calendar-header--layout flex min-w-0 flex-col items-stretch gap-space-lg @2xl/event-calendar-header:flex-row @2xl/event-calendar-header:items-center @2xl/event-calendar-header:justify-between @2xl/event-calendar-header:gap-space-xl\">\n\t\t\t\t<div className=\"event-calendar-header--title flex min-w-0 flex-wrap items-center gap-space-lg @2xl/event-calendar-header:flex-none\">\n\t\t\t\t\t<Heading tag=\"h3\" className=\"min-w-0 break-words text-inherit\">\n\t\t\t\t\t\t{displayLabel}\n\t\t\t\t\t</Heading>\n\n\t\t\t\t\t{/*\n\t\t\t\t\t * Icon-only on purpose. The heading beside it already states the\n\t\t\t\t\t * period, so a labelled trigger printed \"August 2026\" twice in a\n\t\t\t\t\t * row in month view — and in week view printed a second, different\n\t\t\t\t\t * date (\"Aug 24 – 30\" next to \"August 2026\"), which read worse\n\t\t\t\t\t * still. The heading labels; this jumps.\n\t\t\t\t\t */}\n\t\t\t\t\t<MonthYearPicker\n\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\tclassName=\"min-w-0 max-w-full\"\n\t\t\t\t\t\tvalue={{ month: currentDate.getMonth(), year: currentDate.getFullYear() }}\n\t\t\t\t\t\tonValueChange={(output) => {\n\t\t\t\t\t\t\tif (output.date) {\n\t\t\t\t\t\t\t\tonDateChange?.(output.date);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tfromYear={minDate?.getFullYear()}\n\t\t\t\t\t\ttoYear={maxDate?.getFullYear()}\n\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\tstrings={strings.monthYearPicker}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"event-calendar-header--controls flex w-full min-w-0 flex-wrap items-center gap-space-md @2xl/event-calendar-header:w-auto @2xl/event-calendar-header:flex-1 @2xl/event-calendar-header:justify-end\">\n\t\t\t\t\t{visibleActions.length > 0 && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className={cn('event-calendar-header--actions flex min-w-0 flex-wrap items-center', compositionClasses.commands)}>\n\t\t\t\t\t\t\t\t{visibleActions.map((action, index) => renderAction(action, index))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"event-calendar-header--separator mx-space-sm hidden h-6 w-px bg-border @sm/event-calendar-header:block\" />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\tonClick={onToday}\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.today}\n\t\t\t\t\t</Button>\n\n\t\t\t\t\t<div className={cn('event-calendar-header--navigation', segmentedControlRecipes.joinedFrame, controlGroupHeightClasses[size])}>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize={size} iconOnly\n\t\t\t\t\t\t\tonClick={onPrevious}\n\t\t\t\t\t\t\tdisabled={prevDisabled}\n\t\t\t\t\t\t\tclassName={cn(segmentedControlRecipes.joinedItem, segmentedControlRecipes.firstItem, 'border-border border-e')}\n\t\t\t\t\t\t\taria-label={strings.previous}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronLeft className=\"size-icon rtl:rotate-180\" />\n\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize={size} iconOnly\n\t\t\t\t\t\t\tonClick={onNext}\n\t\t\t\t\t\t\tdisabled={nextDisabled}\n\t\t\t\t\t\t\tclassName={cn(segmentedControlRecipes.joinedItem, segmentedControlRecipes.lastItem)}\n\t\t\t\t\t\t\taria-label={strings.next}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronRight className=\"size-icon rtl:rotate-180\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{!!onViewModeChange && (\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\taria-label={strings.viewMode.label}\n\t\t\t\t\t\t\tvalue={viewMode}\n\t\t\t\t\t\t\toptions={viewModeOptions}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tonViewModeChange(value as CalendarViewMode);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"w-full max-w-full @sm/event-calendar-header:w-28\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nEventCalendarHeader.displayName = 'EventCalendarHeader';\n","/**\n * Event-calendar colour resolution helpers.\n *\n * The canonical token enum (`CalendarColorToken`) and a basic dot-class lookup\n * live in `event-calendar.types.ts`. This module extends that with the richer\n * class sets used by the day cell, event badge, and legend (badge surface,\n * border, filled swatch). Centralising the map here means new tokens (or theme\n * changes) are a one-line update.\n *\n * Every category supplies one canonical `colorToken`; arbitrary Tailwind\n * color strings are intentionally not part of the public contract.\n */\nimport {\n\tcalendarTokenDot,\n\tresolveCategoryColorToken,\n\ttype CalendarColorToken,\n\ttype EventCategory,\n} from './event-calendar.types';\nimport { toneRecipes } from '../../../lib/tone-recipes';\n\nexport interface CalendarColorClasses {\n\t/** Solid dot fill (used as the leading bullet on event chips). */\n\tdot: string;\n\t/** Soft tinted surface for the event badge background. */\n\tbadgeBg: string;\n\t/** Border-tone for the event badge / legend swatch. */\n\tborder: string;\n\t/** Filled legend swatch (square chip in the legend row). */\n\tswatch: string;\n}\n\nconst TOKEN_EXTRAS: Record<CalendarColorToken, Omit<CalendarColorClasses, 'dot'>> = {\n\tgray: { badgeBg: 'bg-muted', border: 'border-border', swatch: 'bg-muted-foreground' },\n\tred: { badgeBg: toneRecipes.destructive.tint, border: toneRecipes.destructive.edge, swatch: toneRecipes.destructive.solid },\n\torange: { badgeBg: toneRecipes.warning.tint, border: toneRecipes.warning.edge, swatch: toneRecipes.warning.solid },\n\tamber: { badgeBg: toneRecipes.warning.tint, border: toneRecipes.warning.edge, swatch: toneRecipes.warning.solid },\n\tyellow: { badgeBg: toneRecipes.warning.tint, border: toneRecipes.warning.edge, swatch: toneRecipes.warning.solid },\n\tgreen: { badgeBg: toneRecipes.success.tint, border: toneRecipes.success.edge, swatch: toneRecipes.success.solid },\n\tblue: { badgeBg: toneRecipes.info.tint, border: toneRecipes.info.edge, swatch: toneRecipes.info.solid },\n\tpurple: { badgeBg: toneRecipes.primary.tint, border: toneRecipes.primary.edge, swatch: toneRecipes.primary.solid },\n};\n\n/**\n * Resolve a category to its full set of Tailwind colour classes.\n */\nexport function getCalendarColorClasses(\n\tcategory: Pick<EventCategory, 'colorToken'> | null | undefined,\n): CalendarColorClasses {\n\tconst token = resolveCategoryColorToken(category as EventCategory | null | undefined);\n\treturn {\n\t\tdot: calendarTokenDot[token],\n\t\t...TOKEN_EXTRAS[token],\n\t};\n}\n\n/** Convenience: just the dot class (most common lookup). */\nexport function getCalendarDotClass(\n\tcategory: Pick<EventCategory, 'colorToken'> | null | undefined,\n): string {\n\tconst token = resolveCategoryColorToken(category as EventCategory | null | undefined);\n\treturn calendarTokenDot[token];\n}\n","/**\n * EventCalendarLegend — category chips with optional click-to-filter. When\n * `enableFiltering` is true the whole chip toggles the category's visibility\n * (instead of a free-floating checkbox alongside a swatch — that pattern was\n * cluttered). Inactive categories desaturate to muted; active categories use\n * the colour-token swatch + body text.\n */\nimport { type LucideIcon } from 'lucide-react';\n\nimport { Button } from '../../base/buttons';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { getCalendarColorClasses } from './colors';\nimport type { EventCalendarLegendProps } from './event-calendar.types';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\n\nexport function EventCalendarLegend({\n\tcategories,\n\tvisibleCategories,\n\tonToggleCategory,\n\tenableFiltering = false,\n}: EventCalendarLegendProps) {\n\tconst isAllVisible = !visibleCategories || visibleCategories.length === 0;\n\n\tconst isCategoryVisible = (categoryId: string) => {\n\t\tif (!enableFiltering) return true;\n\t\treturn isAllVisible || visibleCategories?.includes(categoryId);\n\t};\n\n\tconst handleToggle = (categoryId: string) => {\n\t\tif (!enableFiltering || !onToggleCategory) return;\n\t\tonToggleCategory(categoryId);\n\t};\n\n\tif (categories.length === 0) return null;\n\n\treturn (\n\t\t<div\n\t\t\trole={enableFiltering ? 'group' : undefined}\n\t\t\taria-label={enableFiltering ? 'Filter event categories' : undefined}\n\t\t\tclassName={cn('event-calendar-legend--component', 'flex flex-wrap items-center gap-space-sm py-space-xs')}\n\t\t>\n\t\t\t{categories.map((category) => {\n\t\t\t\tconst isVisible = isCategoryVisible(category.id);\n\t\t\t\tconst colors = getCalendarColorClasses(category);\n\t\t\t\tconst Icon = category.icon as LucideIcon | undefined;\n\n\t\t\t\tconst chipBase =\n\t\t\t\t\t'group inline-flex items-center gap-space-sm rounded-inner border px-space-sm py-space-xs transition-colors';\n\n\t\t\t\tconst inner = (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'inline-block size-2 rounded-radius',\n\t\t\t\t\t\t\t\tisVisible ? colors.swatch : 'bg-muted-foreground/40',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'size-icon-sm',\n\t\t\t\t\t\t\t\t\tisVisible ? 'text-inherit' : 'text-muted-foreground',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" type={isVisible ? 'inherit' : 'secondary'}>\n\t\t\t\t\t\t\t{category.label}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</>\n\t\t\t\t);\n\n\t\t\t\tif (!enableFiltering) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey={category.id}\n\t\t\t\t\t\t\tclassName={cn(chipBase, 'border-border bg-card text-card-foreground cursor-default')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{inner}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={category.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\taria-pressed={isVisible}\n\t\t\t\t\t\tonClick={() => handleToggle(category.id)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tchipBase,\n\t\t\t\t\t\t\t'h-auto min-h-0 cursor-pointer shadow-none',\n\t\t\t\t\t\t\tisVisible\n\t\t\t\t\t\t\t\t? `border-border bg-card text-card-foreground ${interactionRecipes.toggleHover}`\n\t\t\t\t\t\t\t\t: `border-dashed border-border/60 bg-transparent text-muted-foreground ${interactionRecipes.toggleHover}`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{inner}\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nEventCalendarLegend.displayName = 'EventCalendarLegend';\n","import { addMonths, subMonths, addWeeks, subWeeks, format, type Locale } from 'date-fns';\nimport { useState, useCallback, useMemo } from 'react';\nimport type {\n\tCalendarEvent,\n\tCalendarViewMode,\n\tUseEventCalendarReturn,\n\tUseEventCalendarDataOptions\n} from './event-calendar.types';\nimport { useEventCalendarData } from './use-event-calendar-data';\n\nexport interface UseEventCalendarProps {\n\t/** Events to place on the grid. */\n\tevents: CalendarEvent[];\n\t/** Locale used for visible period labels. */\n\tlocale?: Locale;\n\t/** Visible date, for controlled use. */\n\tdate?: Date;\n\t/** Month shown on first render. */\n\tdefaultDate?: Date;\n\t/** Current view, for controlled use. */\n\tviewMode?: CalendarViewMode;\n\t/** View shown on first render. */\n\tdefaultViewMode?: CalendarViewMode;\n\tonDateChange?: (date: Date) => void;\n\tonViewModeChange?: (mode: CalendarViewMode) => void;\n\t/** Filtering and grouping options applied to the events. */\n\tdataOptions?: UseEventCalendarDataOptions;\n}\n\n/**\n * Core calendar logic hook\n */\nexport function useEventCalendar({\n\tevents,\n\tlocale,\n\tdate: dateProp,\n\tdefaultDate = new Date(),\n\tviewMode: viewModeProp,\n\tdefaultViewMode = 'month',\n\tonDateChange,\n\tonViewModeChange,\n\tdataOptions = {}\n}: UseEventCalendarProps): UseEventCalendarReturn {\n\tconst [internalDate, setInternalDate] = useState<Date>(defaultDate);\n\tconst [internalViewMode, setInternalViewMode] = useState<CalendarViewMode>(defaultViewMode);\n\tconst currentDate = dateProp ?? internalDate;\n\tconst viewMode = viewModeProp ?? internalViewMode;\n\tconst commitDate = useCallback((date: Date) => {\n\t\tif (dateProp === undefined) setInternalDate(date);\n\t\tonDateChange?.(date);\n\t}, [dateProp, onDateChange]);\n\tconst commitViewMode = useCallback((mode: CalendarViewMode) => {\n\t\tif (viewModeProp === undefined) setInternalViewMode(mode);\n\t\tonViewModeChange?.(mode);\n\t}, [onViewModeChange, viewModeProp]);\n\n\tconst calendarDays = useEventCalendarData(\n\t\tevents,\n\t\tcurrentDate,\n\t\tviewMode,\n\t\tdataOptions\n\t);\n\n\tconst visibleEvents = useMemo(() => {\n\t\tif (dataOptions.visibleCategories && dataOptions.visibleCategories.length > 0) {\n\t\t\treturn events.filter(event =>\n\t\t\t\tdataOptions.visibleCategories!.includes(event.category)\n\t\t\t);\n\t\t}\n\t\treturn events;\n\t}, [events, dataOptions.visibleCategories]);\n\n\tconst goToToday = useCallback(() => {\n\t\tconst today = new Date();\n\t\tcommitDate(today);\n\t}, [commitDate]);\n\n\tconst goToNextPeriod = useCallback(() => {\n\t\tconst newDate = viewMode === 'month'\n\t\t\t? addMonths(currentDate, 1)\n\t\t\t: addWeeks(currentDate, 1);\n\t\tcommitDate(newDate);\n\t}, [commitDate, currentDate, viewMode]);\n\n\tconst goToPreviousPeriod = useCallback(() => {\n\t\tconst newDate = viewMode === 'month'\n\t\t\t? subMonths(currentDate, 1)\n\t\t\t: subWeeks(currentDate, 1);\n\t\tcommitDate(newDate);\n\t}, [commitDate, currentDate, viewMode]);\n\n\tconst handleSetDate = useCallback((date: Date) => {\n\t\tcommitDate(date);\n\t}, [commitDate]);\n\n\tconst handleSetViewMode = useCallback((mode: CalendarViewMode) => {\n\t\tcommitViewMode(mode);\n\t}, [commitViewMode]);\n\n\tconst displayLabel = useMemo(() => {\n\t\tif (viewMode === 'month') {\n\t\t\treturn format(currentDate, 'MMMM yyyy', { locale });\n\t\t} else if (viewMode === 'week') {\n\t\t\tconst weekStart = calendarDays[0]?.date;\n\t\t\tconst weekEnd = calendarDays[calendarDays.length - 1]?.date;\n\t\t\tif (weekStart && weekEnd) {\n\t\t\t\treturn `${format(weekStart, 'MMM d', { locale })} - ${format(weekEnd, 'MMM d, yyyy', { locale })}`;\n\t\t\t}\n\t\t\treturn format(currentDate, 'MMMM yyyy', { locale });\n\t\t}\n\t\treturn format(currentDate, 'MMMM yyyy', { locale });\n\t}, [currentDate, viewMode, calendarDays, locale]);\n\n\tconst hasEvents = useMemo(() => {\n\t\treturn visibleEvents.length > 0;\n\t}, [visibleEvents]);\n\n\treturn {\n\t\tcurrentDate,\n\t\tviewMode,\n\t\tcalendarDays,\n\t\tvisibleEvents,\n\t\tgoToToday,\n\t\tgoToNextPeriod,\n\t\tgoToPreviousPeriod,\n\t\tsetDate: handleSetDate,\n\t\tsetViewMode: handleSetViewMode,\n\t\tdisplayLabel,\n\t\thasEvents\n\t};\n}\n","/**\n * EventCalendar — month-grid event calendar with category legend, header\n * navigation (prev/next/today + view-mode select), keyboard-accessible day\n * cells, and per-category filtering. Strings are fully overridable; category\n * colours come from a small canonical token set (`calendarTokenDot`).\n */\nimport { useState, useMemo } from 'react';\nimport { Text } from '../../typography/text';\nimport { useStrings } from '../../../lib/strings';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { EventCalendarDayCell } from './event-calendar-day-cell';\nimport { EventCalendarHeader } from './event-calendar-header';\nimport { EventCalendarLegend } from './event-calendar-legend';\nimport { defaultEventCalendarStrings, type EventCalendarProps } from './event-calendar.types';\nimport { useEventCalendar } from './use-event-calendar';\nimport { toneRecipes } from '../../../lib/tone-recipes';\n\nfunction isDateMatched(rule: EventCalendarProps['disabledDates'], date: Date): boolean {\n\tif (!rule) return false;\n\tif (Array.isArray(rule)) {\n\t\treturn rule.some((d) => d.toDateString() === date.toDateString());\n\t}\n\tif (typeof rule === 'function') {\n\t\treturn rule(date);\n\t}\n\tconst datesMatch = rule.dates?.some((d) => d.toDateString() === date.toDateString()) ?? false;\n\tconst predicateMatch = rule.predicate?.(date) ?? false;\n\treturn datesMatch || predicateMatch;\n}\n\nexport function EventCalendar({\n\tevents,\n\tcategories,\n\tviewMode: controlledViewMode,\n\tdefaultViewMode,\n\tonViewModeChange,\n\tdate,\n\tdefaultDate,\n\tonDateChange,\n\tonEventClick,\n\tonDayClick,\n\tmaxEventsPerDay = 3,\n\tshowLegend = true,\n\tshowHeader = true,\n\tshowWeekends = true,\n\tweekStartsOn: weekStartsOnProp,\n\tlocale,\n\tenableCategoryFilter = false,\n\tvisibleCategories: controlledVisibleCategories,\n\tonVisibleCategoriesChange,\n\tloading = false,\n\temptyStateMessage,\n\tclassName,\n\tcompact = false,\n\tactions,\n\tstrings: stringsProp,\n\tdayHeadingVariant = 'default',\n\tdayHeadingClassName,\n\trenderDayHeading,\n\trangeMode = 'date',\n\tminDate,\n\tmaxDate,\n\tdisabledDates,\n\tfilterEvent,\n\trenderEvent,\n\trenderDayCell,\n}: EventCalendarProps) {\n\tconst strings = useStrings(defaultEventCalendarStrings, stringsProp);\n\n\tconst [internalVisibleCategories, setInternalVisibleCategories] = useState<string[]>([]);\n\n\tconst visibleCategories = controlledVisibleCategories ?? internalVisibleCategories;\n\n\t// Resolve start-of-week against the consumer's <UIProvider> dates\n\t// slice. Library default is 1 (Monday) when no consumer override is set.\n\tconst {\n\t\tweekStartsOn: configWeekStartsOn,\n\t\tlocale: configLocale,\n\t} = useDatesConfig();\n\tconst weekStartsOn = (weekStartsOnProp ?? configWeekStartsOn ?? 1) as 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\tconst resolvedLocale = locale ?? configLocale;\n\n\tconst handleToggleCategory = (categoryId: string) => {\n\t\tconst newCategories = visibleCategories.includes(categoryId)\n\t\t\t? visibleCategories.filter(id => id !== categoryId)\n\t\t\t: [...visibleCategories, categoryId];\n\n\t\tif (onVisibleCategoriesChange) {\n\t\t\tonVisibleCategoriesChange(newCategories);\n\t\t} else {\n\t\t\tsetInternalVisibleCategories(newCategories);\n\t\t}\n\t};\n\n\tconst calendar = useEventCalendar({\n\t\tevents,\n\t\tlocale: resolvedLocale,\n\t\tdate,\n\t\tdefaultDate,\n\t\tviewMode: controlledViewMode,\n\t\tdefaultViewMode,\n\t\tonDateChange,\n\t\tonViewModeChange,\n\t\tdataOptions: {\n\t\t\tweekStartsOn,\n\t\t\tshowWeekends,\n\t\t\tvisibleCategories: visibleCategories.length > 0 ? visibleCategories : undefined\n\t\t}\n\t});\n\n\tconst weekdays = useMemo(() => {\n\t\tconst days = strings.weekdaysShort;\n\t\tif (weekStartsOn === 1) {\n\t\t\treturn [...days.slice(1), days[0]];\n\t\t}\n\t\treturn days as readonly string[];\n\t}, [strings.weekdaysShort, weekStartsOn]);\n\n\tconst handleDayClick = (dayData: typeof calendar.calendarDays[0]) => {\n\t\t// Block clicks on disabled or out-of-range dates.\n\t\tif (isDateMatched(disabledDates, dayData.date)) return;\n\t\tif (minDate && dayData.date < minDate) return;\n\t\tif (maxDate && dayData.date > maxDate) return;\n\t\tonDayClick?.(dayData.date, dayData.events);\n\t};\n\n\t// Apply runtime event filtering + min/max disabled rules to each day's\n\t// event list before passing to the cell. Doesn't mutate the source.\n\tconst filteredCalendarDays = useMemo(() => {\n\t\tif (!filterEvent) return calendar.calendarDays;\n\t\treturn calendar.calendarDays.map((day) => ({\n\t\t\t...day,\n\t\t\tevents: day.events.filter(filterEvent),\n\t\t\teventCount: day.events.filter(filterEvent).length,\n\t\t\thasMultipleEvents: day.events.filter(filterEvent).length > 1,\n\t\t}));\n\t}, [calendar.calendarDays, filterEvent]);\n\n\tfunction isDayDisabled(date: Date): boolean {\n\t\tif (isDateMatched(disabledDates, date)) return true;\n\t\tif (minDate && date < minDate) return true;\n\t\tif (maxDate && date > maxDate) return true;\n\t\treturn false;\n\t}\n\n\t// Pre-compute prev/next disabled state for the header navigation.\n\tconst navDisabled = useMemo(() => {\n\t\tconst days = calendar.calendarDays;\n\t\tif (days.length === 0) return { prev: false, next: false };\n\t\tconst first = days[0].date;\n\t\tconst last = days[days.length - 1].date;\n\t\treturn {\n\t\t\tprev: !!minDate && first <= minDate,\n\t\t\tnext: !!maxDate && last >= maxDate,\n\t\t};\n\t}, [calendar.calendarDays, minDate, maxDate]);\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div className={cn('event-calendar--component', 'flex items-center justify-center p-surface-lg', className)} role=\"status\">\n\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t{strings.loading}\n\t\t\t\t</Text>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst viewModeChangeHandler = controlledViewMode ? onViewModeChange : undefined;\n\tconst toggleCategoryHandler = enableCategoryFilter ? handleToggleCategory : undefined;\n\n\treturn (\n\t\t<div className={cn('event-calendar--component w-full space-y-space-xl', className)}>\n\t\t\t{!!showHeader && (\n\t\t\t\t<EventCalendarHeader\n\t\t\t\t\tcurrentDate={calendar.currentDate}\n\t\t\t\t\tviewMode={calendar.viewMode}\n\t\t\t\t\tdisplayLabel={calendar.displayLabel}\n\t\t\t\t\tonPrevious={calendar.goToPreviousPeriod}\n\t\t\t\t\tonNext={calendar.goToNextPeriod}\n\t\t\t\t\tonToday={calendar.goToToday}\n\t\t\t\t\tonViewModeChange={viewModeChangeHandler}\n\t\t\t\t\tonDateChange={calendar.setDate}\n\t\t\t\t\tlocale={resolvedLocale}\n\t\t\t\t\tactions={actions}\n\t\t\t\t\trangeMode={rangeMode}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\tprevDisabled={navDisabled.prev}\n\t\t\t\t\tnextDisabled={navDisabled.next}\n\t\t\t\t\tstrings={{ today: strings.today, previous: strings.previous, next: strings.next, viewMode: strings.viewMode, monthYearPicker: strings.monthYearPicker }}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!!showLegend && categories.length > 0 && (\n\t\t\t\t<EventCalendarLegend\n\t\t\t\t\tcategories={categories}\n\t\t\t\t\tvisibleCategories={visibleCategories}\n\t\t\t\t\tonToggleCategory={toggleCategoryHandler}\n\t\t\t\t\tenableFiltering={enableCategoryFilter}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{(!calendar.hasEvents && emptyStateMessage) ? (\n\t\t\t\t<div className=\"flex items-center justify-center rounded-radius border border-dashed border-border p-surface\">\n\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t{emptyStateMessage}\n\t\t\t\t\t</Text>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"box-border bg-background text-foreground rounded-radius border border-border\">\n\t\t\t\t\t{/* Weekday headers */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'grid grid-cols-7',\n\t\t\t\t\t\t\tdayHeadingVariant === 'bordered' && 'border-b border-border mb-0',\n\t\t\t\t\t\t\tdayHeadingVariant === 'tinted' && 'bg-muted/50 rounded-t-radius mb-0 overflow-hidden',\n\t\t\t\t\t\t\tdayHeadingVariant === 'accent' && cn(toneRecipes.primary.wash, 'rounded-t-radius mb-0 overflow-hidden'),\n\t\t\t\t\t\t\t(dayHeadingVariant === 'default') && 'mb-space-md',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{weekdays.map((day, index) => {\n\t\t\t\t\t\t\tif (renderDayHeading) {\n\t\t\t\t\t\t\t\treturn <div key={day}>{renderDayHeading(day, index)}</div>;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={day}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'text-center h-8 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\tdayHeadingClassName,\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<Text\n\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\tweight={dayHeadingVariant === 'accent' ? 'medium' : 'regular'}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\tdayHeadingVariant === 'default' && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t\tdayHeadingVariant === 'tinted' && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t\tdayHeadingVariant === 'bordered' && 'text-foreground',\n\t\t\t\t\t\t\t\t\t\t\tdayHeadingVariant === 'accent' && 'text-primary-accent',\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\t\t{day}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Calendar grid */}\n\t\t\t\t\t<div className=\"grid grid-cols-7\">\n\t\t\t\t\t\t{filteredCalendarDays.map((dayData) => {\n\t\t\t\t\t\t\tconst disabled = isDayDisabled(dayData.date);\n\t\t\t\t\t\t\tconst defaultRender = () => (\n\t\t\t\t\t\t\t\t<EventCalendarDayCell\n\t\t\t\t\t\t\t\t\tdata={dayData}\n\t\t\t\t\t\t\t\t\tcategories={categories}\n\t\t\t\t\t\t\t\t\tmaxEvents={maxEventsPerDay}\n\t\t\t\t\t\t\t\t\tonClick={() => handleDayClick(dayData)}\n\t\t\t\t\t\t\t\t\tonEventClick={onEventClick ? (event) => { if (!isDayDisabled(dayData.date)) onEventClick(event); } : undefined}\n\t\t\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\t\t\tstrings={{ booking: strings.booking, bookings: strings.bookings }}\n\t\t\t\t\t\t\t\t\trenderEvent={renderEvent}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={dayData.date.toISOString()}\n\t\t\t\t\t\t\t\t\tclassName={cn(disabled && 'pointer-events-none opacity-50')}\n\t\t\t\t\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{renderDayCell ? renderDayCell(dayData, defaultRender) : defaultRender()}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nEventCalendar.displayName = 'EventCalendar';\n","/**\n * EventCalendarEventCard — detailed event view rendered in popovers and\n * agenda lists. Reads optional `metadata.customer_name`, `guest_count`, and\n * `service_name` to render a richer summary; falls back gracefully when any\n * of those are absent. Strings (guest / guests pluralization) overridable.\n */\nimport { ExternalLink } from 'lucide-react';\nimport { Stack } from '../../base/structure';\nimport { Date as DateValue, DateTime } from '../../primitives';\nimport { Heading } from '../../typography/heading';\nimport { Text } from '../../typography/text';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { getCalendarDotClass } from './colors';\nimport type { EventCalendarEventCardProps } from './event-calendar.types';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { dotRecipes } from '../../../lib/tone-recipes';\n\nexport interface EventCalendarEventCardStrings {\n\tguest: string;\n\tguests: string;\n}\n\nexport const defaultEventCalendarEventCardStrings: EventCalendarEventCardStrings = {\n\tguest: 'guest',\n\tguests: 'guests',\n};\n\ninterface EventCalendarEventCardPropsWithStrings extends EventCalendarEventCardProps {\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<EventCalendarEventCardStrings>;\n}\n\nexport function EventCalendarEventCard({\n\tevent,\n\tcategory,\n\tonClick,\n\tstrings: stringsProp,\n}: EventCalendarEventCardPropsWithStrings) {\n\tconst strings = useStrings(defaultEventCalendarEventCardStrings, stringsProp);\n\tconst isClickable = !!onClick;\n\n\tconst handleClick = () => {\n\t\tif (onClick) {\n\t\t\tonClick();\n\t\t}\n\t};\n\n\tconst metadata = event.metadata || {};\n\tconst customerName = metadata.customer_name as string | undefined;\n\tconst guestCount = metadata.guest_count as number | undefined;\n\tconst serviceName = metadata.service_name as string | undefined;\n\tconst categoryDotClass = getCalendarDotClass(category);\n\tconst guestLabel = guestCount !== undefined && guestCount > 0\n\t\t? `${guestCount} ${guestCount === 1 ? strings.guest : strings.guests}`\n\t\t: undefined;\n\tconst facts = [customerName, guestLabel].filter(Boolean).join(' · ');\n\n\tconst cardContent = (\n\t\t<Stack gap=\"lg\">\n\t\t\t<div className=\"event-calendar-event-card--header flex min-w-0 items-start justify-between gap-space-lg\">\n\t\t\t\t<div className=\"flex min-w-0 flex-1 flex-col items-start gap-space-xs sm:flex-row sm:flex-wrap sm:items-center sm:gap-x-space-md\">\n\t\t\t\t\t<Heading\n\t\t\t\t\t\ttag=\"h5\"\n\t\t\t\t\t\tcontainerClassName=\"event-calendar-event-card--heading min-w-0 max-w-full sm:w-auto\"\n\t\t\t\t\t\tclassName=\"break-words text-inherit\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{event.title}\n\t\t\t\t\t</Heading>\n\t\t\t\t\t{!!category && (\n\t\t\t\t\t\t<div className=\"event-calendar-event-card--category inline-flex min-w-0 max-w-full items-center gap-space-xs\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'event-calendar-event-card--category-dot',\n\t\t\t\t\t\t\tdotRecipes.inline,\n\t\t\t\t\t\t\t\t\tcategoryDotClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" size=\"xs\" weight=\"medium\" className=\"min-w-0 break-words\">\n\t\t\t\t\t\t\t\t{category.label}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{!!isClickable && !!event.url && <ExternalLink className=\"size-icon-md text-muted-foreground flex-shrink-0\" />}\n\t\t\t</div>\n\n\t\t\t{!!(facts || serviceName) && (\n\t\t\t\t<Stack gap=\"xs\" className=\"event-calendar-event-card--details min-w-0\">\n\t\t\t\t\t{!!facts && (\n\t\t\t\t\t\t<Text type=\"inherit\" className=\"event-calendar-event-card--facts break-words\">\n\t\t\t\t\t\t\t{facts}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!serviceName && (\n\t\t\t\t\t\t<Text type=\"secondary\" className=\"line-clamp-1\">\n\t\t\t\t\t\t\t{serviceName}\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<div className=\"event-calendar-event-card--date\">\n\t\t\t\t{event.allDay ? (\n\t\t\t\t\t<DateValue value={event.startDate} preset=\"long\" size=\"xs\" type=\"secondary\" />\n\t\t\t\t) : (\n\t\t\t\t\t<DateTime value={event.startDate} preset=\"long\" size=\"xs\" type=\"secondary\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Stack>\n\t);\n\n\tconst commonClassName = cn(\n\t\t'box-border w-full min-w-0 text-left p-surface border border-border rounded-radius bg-card text-card-foreground transition-none',\n\t\tisClickable ? `cursor-pointer focus-visible:outline-none ${focusRecipes.frame}` : ''\n\t);\n\n\tif (isClickable) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleClick}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'event-calendar-event-card--component',\n\t\t\t\t\t`m-0 flex h-auto flex-col items-stretch justify-start whitespace-normal font-sans shadow-none ${interactionRecipes.rowHover}`,\n\t\t\t\t\tcommonClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{cardContent}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn <div className={cn('event-calendar-event-card--component', commonClassName)}>{cardContent}</div>;\n}\n\nEventCalendarEventCard.displayName = 'EventCalendarEventCard';\n"],"mappings":"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"}
1
+ {"version":3,"file":"event-calendar.js","names":["_Fragment","_Fragment","DateValue","resolveComponentScale","useDensityConfig","useDatesConfig","cn","Button","Text","focusRecipes","Stack","toneRecipes","dotRecipes","compositionClasses","interactionRecipes","DateTime","DatePrimitive","fieldAffordanceRecipes","Select","MonthYearPicker","segmentedControlRecipes","controlGroupHeightClasses","Fragment$1","calendarTokenDot","resolveCategoryColorToken","category","defaultEventCalendarStrings","EventCalendarEventBadge","dotColor","timeDisplay","event","format","cellTitleRaw","displayTitle","accessibleLabel","onClick","compact","useEventCalendarData","options","useMemo","monthStart","startOfMonth","currentDate","monthEnd","endOfMonth","rangeStart","rangeEnd","viewMode","startOfWeek","endOfWeek","days","eachDayOfInterval","filteredEvents","visibleCategories","events","eventsByDate","eventStart","startOfDay","eventEnd","normalizedEnd","dateKey","day","showWeekends","isWeekend","sortedEvents","a","b","isSameMonth","isToday","weekStartsOn","getEventsForDay","targetDay","date","isSameDay","getCategoryById","categories","cat","categoryId","EventCalendarDayCell","stringsProp","strings","data","visibleEvents","maxEvents","remainingCount","eventCount","isCurrentMonth","renderEvent","onEventClick","idx","renderAction","action","index","IconComponent","key","handleClick","buttonStyle","EventCalendarHeader","_rangeMode","size","defaultScale","useStrings","visibleActions","actions","viewModeOptions","Heading","displayLabel","output","onDateChange","minDate","maxDate","onToday","onPrevious","prevDisabled","ChevronLeft","onNext","nextDisabled","ChevronRight","onViewModeChange","value","neutralChip","TOKEN_EXTRAS","getCalendarColorClasses","token","getCalendarDotClass","EventCalendarLegend","isAllVisible","isCategoryVisible","enableFiltering","handleToggle","onToggleCategory","isVisible","colors","Icon","chipBase","inner","useEventCalendar","dateProp","viewModeProp","internalDate","setInternalDate","useState","defaultDate","internalViewMode","setInternalViewMode","defaultViewMode","commitDate","useCallback","commitViewMode","mode","calendarDays","dataOptions","newDate","addMonths","addWeeks","subMonths","subWeeks","weekStart","weekEnd","locale","isDateMatched","rule","d","datesMatch","predicateMatch","EventCalendar","controlledViewMode","weekStartsOnProp","controlledVisibleCategories","internalVisibleCategories","setInternalVisibleCategories","configWeekStartsOn","configLocale","resolvedLocale","handleToggleCategory","newCategories","id","onVisibleCategoriesChange","calendar","weekdays","handleDayClick","disabledDates","dayData","onDayClick","filteredCalendarDays","filterEvent","isDayDisabled","navDisabled","first","last","loading","className","viewModeChangeHandler","toggleCategoryHandler","enableCategoryFilter","showHeader","showLegend","emptyStateMessage","dayHeadingVariant","renderDayHeading","dayHeadingClassName","disabled","defaultRender","maxEventsPerDay","renderDayCell","defaultEventCalendarEventCardStrings","EventCalendarEventCard","isClickable","metadata","customerName","guestCount","serviceName","categoryDotClass","facts","cardContent","ExternalLink","commonClassName"],"sources":["../../src/components/features/event-calendar/event-calendar.types.ts","../../src/components/features/event-calendar/event-calendar-event-badge.tsx","../../src/components/features/event-calendar/use-event-calendar-data.tsx","../../src/components/features/event-calendar/event-calendar-day-cell.tsx","../../src/components/features/event-calendar/event-calendar-header.tsx","../../src/components/features/event-calendar/colors.ts","../../src/components/features/event-calendar/event-calendar-legend.tsx","../../src/components/features/event-calendar/use-event-calendar.tsx","../../src/components/features/event-calendar/event-calendar.tsx","../../src/components/features/event-calendar/event-calendar-event-card.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport type { DatePickerStrings } from '../../base/date-pickers';\nimport type { StringsProp } from '../../../lib/strings';\nimport type { ActionPresentation } from '../../../lib/action-presentation';\n\n/**\n * Calendar action item.\n *\n * The library never navigates on its own — there is no `href` shortcut.\n * The consumer wires routing into `onClick` (e.g. a Tanstack Router\n * `navigate(...)` or Inertia `router.visit(...)`), or supplies a fully\n * pre-rendered element via `element`.\n */\nexport interface CalendarActionItem extends ActionPresentation {\n\t/** Stable identity for this entry. */\n\tid?: string;\n\t/** Display label. */\n\tlabel: string;\n\tonClick?: () => void;\n\telement?: ReactNode;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n}\n\n/**\n * Base event data structure\n */\nexport interface CalendarEvent {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Surface title. */\n\ttitle: string;\n\t/** Supporting copy under the title. */\n\tdescription?: string;\n\tstartDate: Date;\n\tendDate?: Date;\n\tallDay?: boolean;\n\t/** Category supplying the chip's colour. */\n\tcategory: string;\n\tmetadata?: Record<string, unknown>;\n\turl?: string;\n}\n\n/**\n * Canonical category palette tokens. Map to a small fixed set of colours so\n * the calendar can render dots/strokes without parsing arbitrary class names.\n * Add new tokens here when the design palette grows.\n */\nexport type CalendarColorToken =\n\t| 'gray'\n\t| 'red'\n\t| 'orange'\n\t| 'amber'\n\t| 'yellow'\n\t| 'green'\n\t| 'blue'\n\t| 'purple';\n\n/**\n * Tailwind class lookups for each canonical token. Used by day-cell dots and\n * event-badge dots so we never string-parse `category.color`.\n *\n * A category is a kind, not a status, so each hue family takes the nearest\n * categorical chart series (`--chart-1…5`) rather than a success, warning,\n * destructive or info tone; `gray` stays the neutral marker.\n */\nexport const calendarTokenDot: Record<CalendarColorToken, string> = {\n\tgray: 'bg-muted-foreground',\n\tred: 'bg-chart-4',\n\torange: 'bg-chart-5',\n\tamber: 'bg-chart-5',\n\tyellow: 'bg-chart-5',\n\tgreen: 'bg-chart-1',\n\tblue: 'bg-chart-2',\n\tpurple: 'bg-chart-3',\n};\n\n/**\n * Event category configuration. `colorToken` is the single theme-safe color\n * channel used by dots, badges, borders, and legend swatches.\n */\nexport interface EventCategory {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Display label. */\n\tlabel: string;\n\tcolorToken: CalendarColorToken;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n\t/** Supporting copy under the title. */\n\tdescription?: string;\n}\n\n/**\n * Resolve a category to the canonical palette, falling back only when the\n * category itself is absent.\n */\nexport function resolveCategoryColorToken(category?: EventCategory | null): CalendarColorToken {\n\treturn category?.colorToken ?? 'gray';\n}\n\n/**\n * Calendar view mode\n */\nexport type CalendarViewMode = 'month' | 'week' | 'agenda';\n\n/**\n * Day cell data (processed)\n */\nexport interface CalendarDayData {\n\tdate: Date;\n\tisCurrentMonth: boolean;\n\tisToday: boolean;\n\tisWeekend: boolean;\n\tevents: CalendarEvent[];\n\teventCount: number;\n\thasMultipleEvents: boolean;\n}\n\n/**\n * Localizable strings — pass partial overrides via `strings`.\n */\nexport interface EventCalendarStrings {\n\t/** Copy owned by the nested month/year jumper. */\n\tmonthYearPicker?: StringsProp<DatePickerStrings>;\n\ttoday: string;\n\tprevious: string;\n\tnext: string;\n\t/** Shows the pending state. */\n\tloading: string;\n\tbooking: string;\n\tbookings: string;\n\t/**\n\t * Which view the switcher shows as active. `label` is the accessible name\n\t * of the switcher itself: its trigger is a combobox, and a combobox is not\n\t * named by the option it currently shows.\n\t */\n\tviewMode: {\n\t\tlabel: string;\n\t\tmonth: string;\n\t\tweek: string;\n\t\tagenda: string;\n\t};\n\tweekdaysShort: [string, string, string, string, string, string, string]; // Sun..Sat\n}\n\nexport const defaultEventCalendarStrings: EventCalendarStrings = {\n\ttoday: 'Today',\n\tprevious: 'Previous',\n\tnext: 'Next',\n\tloading: 'Loading…',\n\tbooking: 'booking',\n\tbookings: 'bookings',\n\tviewMode: {\n\t\tlabel: 'Calendar view',\n\t\tmonth: 'Month',\n\t\tweek: 'Week',\n\t\tagenda: 'Agenda',\n\t},\n\tweekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n};\n\n/**\n * Visual variant for the weekday-header strip (\"Sun Mon Tue …\").\n * - `default` — muted text on transparent (matches body)\n * - `accent` — primary-tinted background, primary text\n * - `tinted` — muted background, foreground text (subtle separation)\n * - `bordered` — bottom-bordered row, foreground text\n *\n * Consumers can also pass a fully custom `dayHeadingClassName` to override\n * any preset.\n */\nexport type EventCalendarDayHeadingVariant = 'default' | 'accent' | 'tinted' | 'bordered';\n\n/**\n * Predicate-or-list shape for date rules. Either explicit dates,\n * a predicate callback, or both (combined with OR semantics).\n */\nexport type DateRule = Date[] | ((date: Date) => boolean) | { dates?: Date[]; predicate?: (date: Date) => boolean };\n\n/**\n * Hook for filtering events at render time without mutating the source list.\n */\nexport type EventFilter = (event: CalendarEvent) => boolean;\n\n/**\n * Render hook for individual event chips in the day cell.\n */\nexport type RenderEventFn = (event: CalendarEvent, category: EventCategory | undefined) => ReactNode;\n\n/**\n * Render hook for the day cell body (after the date number is drawn).\n */\nexport type RenderDayCellFn = (day: CalendarDayData, defaultRender: () => ReactNode) => ReactNode;\n\n/**\n * Range mode for navigation. `month-year` exposes a Month/Year picker\n * trigger in the header that jumps the calendar to that month.\n */\nexport type EventCalendarRangeMode = 'date' | 'month-year';\n\n/**\n * Event calendar props\n */\nexport interface EventCalendarProps {\n\t/** Events to place on the grid. The calendar does no fetching of its own. */\n\tevents: CalendarEvent[];\n\t/** Category definitions supplying each event's colour and legend entry. */\n\tcategories: EventCategory[];\n\t/** Current view. Controlled when paired with `onViewModeChange`. */\n\tviewMode?: CalendarViewMode;\n\t/** View shown on first render for uncontrolled use. */\n\tdefaultViewMode?: CalendarViewMode;\n\t/** Fired when the user switches view from the header. */\n\tonViewModeChange?: (mode: CalendarViewMode) => void;\n\t/** Visible date. Controlled when paired with `onDateChange`. */\n\tdate?: Date;\n\t/** Month shown on first render. Defaults to today. */\n\tdefaultDate?: Date;\n\t/** Fired when the visible period changes through navigation or the picker. */\n\tonDateChange?: (date: Date) => void;\n\t/** Fired when an event is activated. */\n\tonEventClick?: (event: CalendarEvent) => void;\n\t/** Fired when a day cell is activated, with that day's events. */\n\tonDayClick?: (date: Date, events: CalendarEvent[]) => void;\n\t/** Events rendered per day before collapsing into an overflow indicator. */\n\tmaxEventsPerDay?: number;\n\t/** Shows the category legend beneath the grid. */\n\tshowLegend?: boolean;\n\t/** Shows the navigation header above the grid. */\n\tshowHeader?: boolean;\n\t/** Includes Saturday and Sunday columns. */\n\tshowWeekends?: boolean;\n\t/** First column of the week, `0` = Sunday. */\n\tweekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\t/** Optional date-fns Locale object passed to inner date pickers. */\n\tlocale?: import('date-fns').Locale;\n\t/** Lets the legend filter which categories are drawn. */\n\tenableCategoryFilter?: boolean;\n\t/** Category ids currently shown. Controlled when paired with the change handler. */\n\tvisibleCategories?: string[];\n\t/** Fired when the legend toggles a category. */\n\tonVisibleCategoriesChange?: (categories: string[]) => void;\n\t/** Replaces the grid with the loading state. */\n\tloading?: boolean;\n\t/** Copy shown when no events fall in the visible period. */\n\temptyStateMessage?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Tightens row heights and event chips for dense dashboards. */\n\tcompact?: boolean;\n\t/** Buttons rendered in the header, before the today/navigation controls. */\n\tactions?: CalendarActionItem[];\n\t/** Overrides the calendar's own copy (view names, today, empty state). */\n\tstrings?: StringsProp<EventCalendarStrings>;\n\t/** Visual variant for the weekday header strip. Default `default`. */\n\tdayHeadingVariant?: EventCalendarDayHeadingVariant;\n\t/** Custom class names appended to each weekday-heading cell — wins over variant presets. */\n\tdayHeadingClassName?: string;\n\t/** Optional renderer to fully control a single weekday cell. */\n\trenderDayHeading?: (day: string, index: number) => ReactNode;\n\n\t/**\n\t * Header navigation range mode.\n\t * - `date` — DatePicker (default; jump to a specific date)\n\t * - `month-year` — MonthYearPicker (compact month/year jump)\n\t */\n\trangeMode?: EventCalendarRangeMode;\n\n\t/** Earliest date the user can navigate to. Earlier nav is disabled. */\n\tminDate?: Date;\n\t/** Latest date the user can navigate to. Later nav is disabled. */\n\tmaxDate?: Date;\n\t/**\n\t * Dates that should render in the calendar but be marked as disabled\n\t * (greyed out, not clickable). Pass dates, a predicate, or both.\n\t */\n\tdisabledDates?: DateRule;\n\t/**\n\t * Hide events from rendering at runtime without mutating `events`.\n\t * Returns `true` to KEEP an event, `false` to hide it.\n\t */\n\tfilterEvent?: EventFilter;\n\t/** Per-event renderer override. */\n\trenderEvent?: RenderEventFn;\n\t/** Per-day-cell renderer override. */\n\trenderDayCell?: RenderDayCellFn;\n}\n\n/**\n * Day cell props\n */\nexport interface EventCalendarDayCellProps {\n\t/** The record this surface renders. */\n\tdata: CalendarDayData;\n\t/** Category definitions supplying each entry's colour. */\n\tcategories: EventCategory[];\n\t/** Events shown before collapsing into an overflow indicator. */\n\tmaxEvents?: number;\n\tonClick: () => void;\n\t/** Selects an individual event, independently of its day. */\n\tonEventClick?: (event: CalendarEvent) => void;\n\t/** Tightens spacing for dense surfaces. */\n\tcompact?: boolean;\n\t/** Overrides this surface's own copy. */\n\tstrings?: Pick<EventCalendarStrings, 'booking' | 'bookings'>;\n\t/** Per-event renderer override. */\n\trenderEvent?: RenderEventFn;\n}\n\n/**\n * Event badge props\n */\nexport interface EventCalendarEventBadgeProps {\n\t/** The event this chip represents. */\n\tevent: CalendarEvent;\n\t/** Category supplying the chip's colour. */\n\tcategory: EventCategory | undefined;\n\t/** Tightens spacing for dense surfaces. */\n\tcompact?: boolean;\n\tonClick?: () => void;\n}\n\n/**\n * Event card props\n */\nexport interface EventCalendarEventCardProps {\n\t/** The event this chip represents. */\n\tevent: CalendarEvent;\n\t/** Category supplying the chip's colour. */\n\tcategory: EventCategory | undefined;\n\tonClick?: () => void;\n}\n\n/**\n * Legend props\n */\nexport interface EventCalendarLegendProps {\n\t/** Category definitions supplying each entry's colour. */\n\tcategories: EventCategory[];\n\t/** Ids of the categories currently shown. */\n\tvisibleCategories?: string[];\n\tonToggleCategory?: (categoryId: string) => void;\n\t/** Lets the legend toggle category visibility. */\n\tenableFiltering?: boolean;\n}\n\n/**\n * Header props\n */\nexport interface EventCalendarHeaderProps {\n\t/** Date the header is describing. */\n\tcurrentDate: Date;\n\t/** Which view the switcher shows as active. */\n\tviewMode: CalendarViewMode;\n\t/** Formatted period label, e.g. \"March 2026\". */\n\tdisplayLabel: string;\n\tonPrevious: () => void;\n\tonNext: () => void;\n\tonToday: () => void;\n\tonViewModeChange?: (mode: CalendarViewMode) => void;\n\tonDateChange?: (date: Date) => void;\n\t/** Optional date-fns Locale object passed to inner date pickers. */\n\tlocale?: import('date-fns').Locale;\n\t/** Controls offered on the surface. */\n\tactions?: CalendarActionItem[];\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<Pick<EventCalendarStrings, 'today' | 'previous' | 'next' | 'viewMode' | 'monthYearPicker'>>;\n\t/** Range mode for the date trigger inside the header. */\n\trangeMode?: EventCalendarRangeMode;\n\t/** Earliest navigable date; the previous control disables at it. */\n\tminDate?: Date;\n\t/** Latest navigable date; the next control disables at it. */\n\tmaxDate?: Date;\n\t/** Forces the previous control off. */\n\tprevDisabled?: boolean;\n\t/** Forces the next control off. */\n\tnextDisabled?: boolean;\n}\n\n/**\n * Hook return type\n */\nexport interface UseEventCalendarReturn {\n\t/** Date the header is describing. */\n\tcurrentDate: Date;\n\t/** Which view the switcher shows as active. */\n\tviewMode: CalendarViewMode;\n\tcalendarDays: CalendarDayData[];\n\tvisibleEvents: CalendarEvent[];\n\tgoToToday: () => void;\n\tgoToNextPeriod: () => void;\n\tgoToPreviousPeriod: () => void;\n\tsetDate: (date: Date) => void;\n\tsetViewMode: (mode: CalendarViewMode) => void;\n\t/** Formatted period label, e.g. \"March 2026\". */\n\tdisplayLabel: string;\n\thasEvents: boolean;\n}\n\n/**\n * Data transformation hook options\n */\nexport interface UseEventCalendarDataOptions {\n\tweekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\tshowWeekends?: boolean;\n\t/** Ids of the categories currently shown. */\n\tvisibleCategories?: string[];\n}\n","/**\n * EventCalendarEventBadge — compact badge representing a single event inside\n * a day cell. Renders a category-coloured dot, the event title (or a custom\n * `metadata.calendar_cell_title` override), and the start time when not an\n * all-day event. Click is captured locally and propagated via `onClick`.\n */\nimport { format } from 'date-fns';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport {\n\tcalendarTokenDot,\n\tresolveCategoryColorToken,\n\ttype EventCalendarEventBadgeProps,\n} from './event-calendar.types';\nimport { dotRecipes } from '../../../lib/tone-recipes';\n\nexport function EventCalendarEventBadge({\n\tevent,\n\tcategory,\n\tcompact = false,\n\tonClick,\n}: EventCalendarEventBadgeProps) {\n\tconst dotColor = calendarTokenDot[resolveCategoryColorToken(category)];\n\n\tconst timeDisplay = !event.allDay ? format(event.startDate, 'HH:mm') : null;\n\tconst cellTitleRaw = event.metadata?.calendar_cell_title;\n\tconst displayTitle =\n\t\ttypeof cellTitleRaw === 'string' && cellTitleRaw.trim() !== ''\n\t\t\t? cellTitleRaw\n\t\t\t: event.title;\n\tconst accessibleLabel = timeDisplay ? `${displayTitle} at ${timeDisplay}` : displayTitle;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={(e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tonClick?.();\n\t\t\t}}\n\t\t\tclassName={cn('event-calendar-event-badge--component',\n\t\t\t\tfieldAffordanceRecipes.inline,\n\t\t\t\tfieldAffordanceRecipes.focus,\n\t\t\t\t'@container/calendar-event group/calendar-event w-full min-w-0 cursor-pointer text-left text-card-foreground',\n\t\t\t)}\n\t\t\taria-label={accessibleLabel}\n\t\t\ttitle={accessibleLabel}\n\t\t>\n\t\t\t<span className={cn(\n\t\t\t\t// The title keeps priority: when it and the time do not fit on one line,\n\t\t\t\t// the time wraps below instead of cutting the title to a few letters.\n\t\t\t\t'box-border flex w-full min-w-0 flex-wrap items-center gap-x-space-xs overflow-hidden rounded-radius border border-border bg-card px-space-xs group-hover/calendar-event:bg-accent group-hover/calendar-event:text-accent-foreground',\n\t\t\t\tcompact ? 'py-space-2xs' : 'py-space-xs',\n\t\t\t\t// A narrow cell shows only the marker; the shared compact action height keeps\n\t\t\t\t// it a 24px+ target (WCAG 2.2 target size) rather than a 12px sliver.\n\t\t\t\t'@max-[4rem]/calendar-event:min-h-action-xs @max-[4rem]/calendar-event:justify-center @max-[4rem]/calendar-event:border-transparent @max-[4rem]/calendar-event:bg-transparent @max-[4rem]/calendar-event:px-0 @max-[4rem]/calendar-event:py-space-2xs',\n\t\t\t)}>\n\t\t\t<span className=\"event-calendar-event-badge--title flex min-w-0 flex-auto items-center gap-space-xs @max-[4rem]/calendar-event:flex-none\">\n\t\t\t\t<span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName={cn(dotRecipes.inline, dotColor)}\n\t\t\t\t/>\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\tclassName=\"hidden min-w-0 flex-1 truncate @min-[4rem]/calendar-event:block\"\n\t\t\t\t>\n\t\t\t\t\t{displayTitle}\n\t\t\t\t</Text>\n\t\t\t</span>\n\t\t\t{!!timeDisplay && (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tclassName=\"hidden shrink-0 whitespace-nowrap tabular-nums @min-[4rem]/calendar-event:inline\"\n\t\t\t\t>\n\t\t\t\t\t{timeDisplay}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n\nEventCalendarEventBadge.displayName = 'EventCalendarEventBadge';\n","import {\n\tstartOfMonth,\n\tendOfMonth,\n\tstartOfWeek,\n\tendOfWeek,\n\teachDayOfInterval,\n\tisSameMonth,\n\tisToday,\n\tisSameDay,\n\tisWeekend,\n\tstartOfDay\n} from 'date-fns';\nimport { useMemo } from 'react';\nimport type {\n\tCalendarEvent,\n\tCalendarDayData,\n\tCalendarViewMode,\n\tUseEventCalendarDataOptions\n} from './event-calendar.types';\n\n/**\n * Transforms raw events into calendar grid data\n */\nexport function useEventCalendarData(\n\tevents: CalendarEvent[],\n\tcurrentDate: Date,\n\tviewMode: CalendarViewMode,\n\toptions: UseEventCalendarDataOptions = {}\n): CalendarDayData[] {\n\tconst {\n\t\tweekStartsOn = 1,\n\t\tshowWeekends = true,\n\t\tvisibleCategories\n\t} = options;\n\n\treturn useMemo(() => {\n\t\tconst monthStart = startOfMonth(currentDate);\n\t\tconst monthEnd = endOfMonth(currentDate);\n\n\t\tlet rangeStart: Date;\n\t\tlet rangeEnd: Date;\n\n\t\tif (viewMode === 'month') {\n\t\t\trangeStart = startOfWeek(monthStart, { weekStartsOn });\n\t\t\trangeEnd = endOfWeek(monthEnd, { weekStartsOn });\n\t\t} else if (viewMode === 'week') {\n\t\t\trangeStart = startOfWeek(currentDate, { weekStartsOn });\n\t\t\trangeEnd = endOfWeek(currentDate, { weekStartsOn });\n\t\t} else {\n\t\t\trangeStart = monthStart;\n\t\t\trangeEnd = monthEnd;\n\t\t}\n\n\t\tconst days = eachDayOfInterval({ start: rangeStart, end: rangeEnd });\n\n\t\tconst filteredEvents = visibleCategories && visibleCategories.length > 0\n\t\t\t? events.filter(event => visibleCategories.includes(event.category))\n\t\t\t: events;\n\n\t\tconst eventsByDate = new Map<string, CalendarEvent[]>();\n\n\t\tfilteredEvents.forEach(event => {\n\t\t\tconst eventStart = startOfDay(event.startDate);\n\t\t\tif (Number.isNaN(eventStart.getTime())) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet eventEnd = eventStart;\n\t\t\tif (event.endDate && !Number.isNaN(event.endDate.getTime())) {\n\t\t\t\tconst normalizedEnd = startOfDay(event.endDate);\n\t\t\t\tif (!Number.isNaN(normalizedEnd.getTime()) && normalizedEnd.getTime() >= eventStart.getTime()) {\n\t\t\t\t\teventEnd = normalizedEnd;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst eventDays = eachDayOfInterval({ start: eventStart, end: eventEnd });\n\n\t\t\teventDays.forEach(day => {\n\t\t\t\tconst dateKey = day.toISOString().split('T')[0];\n\t\t\t\tif (!eventsByDate.has(dateKey)) {\n\t\t\t\t\teventsByDate.set(dateKey, []);\n\t\t\t\t}\n\t\t\t\teventsByDate.get(dateKey)!.push(event);\n\t\t\t});\n\t\t});\n\n\t\tconst calendarDays: CalendarDayData[] = days\n\t\t\t.filter(day => showWeekends || !isWeekend(day))\n\t\t\t.map(day => {\n\t\t\t\tconst dateKey = day.toISOString().split('T')[0];\n\t\t\t\tconst dayEvents = eventsByDate.get(dateKey) || [];\n\n\t\t\t\tconst sortedEvents = [...dayEvents].sort((a, b) => {\n\t\t\t\t\tif (a.allDay && !b.allDay) return -1;\n\t\t\t\t\tif (!a.allDay && b.allDay) return 1;\n\t\t\t\t\treturn a.startDate.getTime() - b.startDate.getTime();\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tdate: day,\n\t\t\t\t\tisCurrentMonth: isSameMonth(day, currentDate),\n\t\t\t\t\tisToday: isToday(day),\n\t\t\t\t\tisWeekend: isWeekend(day),\n\t\t\t\t\tevents: sortedEvents,\n\t\t\t\t\teventCount: sortedEvents.length,\n\t\t\t\t\thasMultipleEvents: sortedEvents.length > 1\n\t\t\t\t};\n\t\t\t});\n\n\t\treturn calendarDays;\n\t}, [events, currentDate, viewMode, weekStartsOn, showWeekends, visibleCategories]);\n}\n\n/**\n * Gets events for a specific day\n */\nexport function getEventsForDay(\n\tevents: CalendarEvent[],\n\tdate: Date\n): CalendarEvent[] {\n\treturn events\n\t\t.filter(event => {\n\t\t\tconst eventStart = startOfDay(event.startDate);\n\t\t\tconst eventEnd = event.endDate ? startOfDay(event.endDate) : eventStart;\n\t\t\tconst targetDay = startOfDay(date);\n\n\t\t\treturn isSameDay(targetDay, eventStart) ||\n\t\t\t\tisSameDay(targetDay, eventEnd) ||\n\t\t\t\t(targetDay > eventStart && targetDay < eventEnd);\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\tif (a.allDay && !b.allDay) return -1;\n\t\t\tif (!a.allDay && b.allDay) return 1;\n\t\t\treturn a.startDate.getTime() - b.startDate.getTime();\n\t\t});\n}\n\n/**\n * Gets the category object by ID\n */\nexport function getCategoryById<T extends { id: string }>(\n\tcategories: T[],\n\tcategoryId: string\n): T | undefined {\n\treturn categories.find(cat => cat.id === categoryId);\n}\n","/**\n * EventCalendarDayCell — single day square in the month grid. Shows the day\n * number, up to `maxEvents` event badges, and an overflow row with category\n * dots + a pluralised \"+N bookings\" hint when more events exist than fit.\n * The day number is the cell's focusable control; clicking anywhere in the\n * square selects the day too.\n */\nimport { Text } from '../../typography/text';\nimport { cn } from '../../../lib/utils';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { EventCalendarEventBadge } from './event-calendar-event-badge';\nimport {\n\tcalendarTokenDot,\n\tdefaultEventCalendarStrings,\n\tresolveCategoryColorToken,\n\ttype EventCalendarDayCellProps,\n} from './event-calendar.types';\nimport { getCategoryById } from './use-event-calendar-data';\n\nexport function EventCalendarDayCell({\n\tdata,\n\tcategories,\n\tmaxEvents = 3,\n\tonClick,\n\tonEventClick,\n\tcompact = false,\n\tstrings: stringsProp,\n\trenderEvent,\n}: EventCalendarDayCellProps) {\n\tconst strings = {\n\t\tbooking: stringsProp?.booking ?? defaultEventCalendarStrings.booking,\n\t\tbookings: stringsProp?.bookings ?? defaultEventCalendarStrings.bookings,\n\t};\n\tconst { date, isCurrentMonth, isToday, isWeekend, events, eventCount } = data;\n\n\tconst visibleEvents = events.slice(0, maxEvents);\n\tconst remainingCount = Math.max(0, eventCount - maxEvents);\n\n\treturn (\n\t\t<div className={cn('event-calendar-day-cell--component', 'box-border h-full p-0 relative w-full border-r border-b border-border last:border-r-0 [&:nth-child(7n)]:border-r-0')}>\n\t\t\t{/*\n\t\t\t * Not `role=\"button\"`: the cell contains the event badges, which are\n\t\t\t * real buttons, and a button may not hold focusable descendants.\n\t\t\t * The day number below is the cell's keyboard affordance; the click\n\t\t\t * handler here only widens the pointer target to the whole square.\n\t\t\t */}\n\t\t\t<div\n\t\t\t\tonClick={onClick}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'event-calendar-day-cell--surface',\n\t\t\t\t\t'box-border relative h-full w-full min-h-24 p-space-md transition-colors',\n\t\t\t\t\t'hover:bg-accent',\n\t\t\t\t\t'flex flex-col items-start gap-space-xs',\n\t\t\t\t\t// No opacity wash: halving the whole subtree dragged the day\n\t\t\t\t\t// number to 2.14 and the event badges to 3.03. The muted day\n\t\t\t\t\t// number below is the out-of-month cue, and it costs no\n\t\t\t\t\t// contrast. A background tint is not an option either — it\n\t\t\t\t\t// would read as the `bg-accent` \"today\" cell.\n\t\t\t\t\tisToday && 'h-full bg-accent text-accent-foreground',\n\t\t\t\t\tcompact && 'min-h-20 p-space-xs'\n\t\t\t\t)}\n\t\t\t\tdata-date={date.toISOString()}\n\t\t\t\tdata-today={isToday}\n\t\t\t\tdata-weekend={isWeekend}\n\t\t\t\tdata-current-month={isCurrentMonth}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tonClick();\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'event-calendar-day-cell--date',\n\t\t\t\t\t\tfieldAffordanceRecipes.target,\n\t\t\t\t\t\tfieldAffordanceRecipes.focus,\n\t\t\t\t\t\t'text-inherit',\n\t\t\t\t\t)}\n\t\t\t\t\taria-label={date.toDateString()}\n\t\t\t\t>\n\t\t\t\t\t<Text\n\t\t\t\t\t\tsize={compact ? 'xs' : undefined}\n\t\t\t\t\t\tweight={isToday ? 'semibold' : 'regular'}\n\t\t\t\t\t\ttype={isCurrentMonth ? 'main' : 'secondary'}\n\t\t\t\t\t\tlineHeight=\"none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{date.getDate()}\n\t\t\t\t\t</Text>\n\t\t\t\t</button>\n\n\t\t\t\t<div className=\"w-full space-y-space-2xs\">\n\t\t\t\t\t{visibleEvents.map((event) => {\n\t\t\t\t\t\tconst category = getCategoryById(categories, event.category);\n\t\t\t\t\t\tif (renderEvent) {\n\t\t\t\t\t\t\treturn <div key={event.id}>{renderEvent(event, category)}</div>;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<EventCalendarEventBadge\n\t\t\t\t\t\t\t\tkey={event.id}\n\t\t\t\t\t\t\t\tevent={event}\n\t\t\t\t\t\t\t\tcategory={category}\n\t\t\t\t\t\t\t\tcompact={compact || data.hasMultipleEvents}\n\t\t\t\t\t\t\t\tonClick={() => { if (onEventClick) onEventClick(event); else onClick(); }}\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\t{remainingCount > 0 && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-space-xs py-space-2xs px-space-md\">\n\t\t\t\t\t\t\t<div className=\"flex items-center -space-x-1\">\n\t\t\t\t\t\t\t\t{categories.slice(0, 3).map((category, idx) => (\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tkey={category.id || idx}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'h-1.5 w-1.5 rounded-full border border-background',\n\t\t\t\t\t\t\t\t\t\t\tcalendarTokenDot[resolveCategoryColorToken(category)],\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))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{remainingCount} {remainingCount === 1 ? strings.booking : strings.bookings}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nEventCalendarDayCell.displayName = 'EventCalendarDayCell';\n","import {compositionClasses} from '../../base/structure/composition.recipes';\n/**\n * EventCalendarHeader — title, month/year picker, optional action buttons,\n * Today button, prev/next stepper, and a view-mode select. Designed to sit\n * above `EventCalendar`'s grid; can be reused independently for custom\n * layouts.\n */\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { Button } from '../../base/buttons';\nimport { MonthYearPicker } from '../../base/date-pickers';\nimport { Select, type SelectOption } from '../../base/choice-inputs';\nimport { Heading } from '../../typography/heading';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { controlGroupHeightClasses, segmentedControlRecipes } from '../../../lib/control-group-recipes';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { defaultEventCalendarStrings, type EventCalendarHeaderProps, type CalendarActionItem, type CalendarViewMode } from './event-calendar.types';\n\n/**\n * Render a single action item\n */\nconst renderAction = (action: CalendarActionItem, index: number) => {\n\tif (!action) return null;\n\n\tif (action.element) {\n\t\treturn <div className=\"event-calendar-header--action-slot\" key={action.id || index}>{action.element}</div>;\n\t}\n\n\tconst IconComponent = action.icon;\n\tconst key = action.id || `action-${index}`;\n\n\tconst handleClick = () => {\n\t\taction.onClick?.();\n\t};\n\n\tconst buttonStyle = action.buttonStyle === 'link' ? 'ghost' : action.buttonStyle ?? 'solid';\n\n\treturn (\n\t\t<Button\n\t\t\tkey={key}\n\t\t\ttone={action.tone ?? 'primary'}\n\t\t\tbuttonStyle={buttonStyle}\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\n\t\t\t\t'gap-space-md',\n\t\t\t\taction.buttonStyle === 'link' && 'underline underline-offset-[0.2em]',\n\t\t\t)}\n\t\t\tdisabled={!!action.disabled}\n\t\t>\n\t\t\t{!!IconComponent && <IconComponent className=\"size-icon\" />}\n\t\t\t{action.label}\n\t\t</Button>\n\t);\n};\n\n/**\n * Calendar header component\n */\nexport function EventCalendarHeader({\n\tcurrentDate,\n\tviewMode,\n\tdisplayLabel,\n\tonPrevious,\n\tonNext,\n\tonToday,\n\tonViewModeChange,\n\tonDateChange,\n\tlocale,\n\tactions,\n\tstrings: stringsProp,\n\trangeMode: _rangeMode = 'date',\n\tminDate,\n\tmaxDate,\n\tprevDisabled = false,\n\tnextDisabled = false,\n}: EventCalendarHeaderProps) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(undefined, defaultScale);\n\tconst strings = useStrings(defaultEventCalendarStrings, stringsProp);\n\tconst visibleActions = useMemo(() => {\n\t\treturn (actions || []).filter(a => a.visible !== false);\n\t}, [actions]);\n\tconst viewModeOptions = useMemo<SelectOption[]>(\n\t\t() => [\n\t\t\t{ value: 'month', label: strings.viewMode.month },\n\t\t\t{ value: 'week', label: strings.viewMode.week },\n\t\t\t{ value: 'agenda', label: strings.viewMode.agenda },\n\t\t],\n\t\t[strings.viewMode.month, strings.viewMode.week, strings.viewMode.agenda],\n\t);\n\n\treturn (\n\t\t<div className=\"event-calendar-header--component @container/event-calendar-header mb-space-xl min-w-0\">\n\t\t\t<div className=\"event-calendar-header--layout flex min-w-0 flex-col items-stretch gap-space-lg @2xl/event-calendar-header:flex-row @2xl/event-calendar-header:items-center @2xl/event-calendar-header:justify-between @2xl/event-calendar-header:gap-space-xl\">\n\t\t\t\t<div className=\"event-calendar-header--title flex min-w-0 flex-wrap items-center gap-space-lg @2xl/event-calendar-header:flex-none\">\n\t\t\t\t\t<Heading tag=\"h3\" className=\"min-w-0 break-words text-inherit\">\n\t\t\t\t\t\t{displayLabel}\n\t\t\t\t\t</Heading>\n\n\t\t\t\t\t{/*\n\t\t\t\t\t * Icon-only on purpose. The heading beside it already states the\n\t\t\t\t\t * period, so a labelled trigger printed \"August 2026\" twice in a\n\t\t\t\t\t * row in month view — and in week view printed a second, different\n\t\t\t\t\t * date (\"Aug 24 – 30\" next to \"August 2026\"), which read worse\n\t\t\t\t\t * still. The heading labels; this jumps.\n\t\t\t\t\t */}\n\t\t\t\t\t<MonthYearPicker\n\t\t\t\t\t\ticonOnly\n\t\t\t\t\t\tclassName=\"min-w-0 max-w-full\"\n\t\t\t\t\t\tvalue={{ month: currentDate.getMonth(), year: currentDate.getFullYear() }}\n\t\t\t\t\t\tonValueChange={(output) => {\n\t\t\t\t\t\t\tif (output.date) {\n\t\t\t\t\t\t\t\tonDateChange?.(output.date);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tfromYear={minDate?.getFullYear()}\n\t\t\t\t\t\ttoYear={maxDate?.getFullYear()}\n\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\tstrings={strings.monthYearPicker}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"event-calendar-header--controls flex w-full min-w-0 flex-wrap items-center gap-space-md @2xl/event-calendar-header:w-auto @2xl/event-calendar-header:flex-1 @2xl/event-calendar-header:justify-end\">\n\t\t\t\t\t{visibleActions.length > 0 && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className={cn('event-calendar-header--actions flex min-w-0 flex-wrap items-center', compositionClasses.commands)}>\n\t\t\t\t\t\t\t\t{visibleActions.map((action, index) => renderAction(action, index))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"event-calendar-header--separator mx-space-sm hidden h-6 w-px bg-border @sm/event-calendar-header:block\" />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"outline\"\n\t\t\t\t\t\tonClick={onToday}\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.today}\n\t\t\t\t\t</Button>\n\n\t\t\t\t\t<div className={cn('event-calendar-header--navigation', segmentedControlRecipes.joinedFrame, controlGroupHeightClasses[size])}>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize={size} iconOnly\n\t\t\t\t\t\t\tonClick={onPrevious}\n\t\t\t\t\t\t\tdisabled={prevDisabled}\n\t\t\t\t\t\t\tclassName={cn(segmentedControlRecipes.joinedItem, segmentedControlRecipes.firstItem, 'border-border border-e')}\n\t\t\t\t\t\t\taria-label={strings.previous}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronLeft className=\"size-icon rtl:rotate-180\" />\n\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize={size} iconOnly\n\t\t\t\t\t\t\tonClick={onNext}\n\t\t\t\t\t\t\tdisabled={nextDisabled}\n\t\t\t\t\t\t\tclassName={cn(segmentedControlRecipes.joinedItem, segmentedControlRecipes.lastItem)}\n\t\t\t\t\t\t\taria-label={strings.next}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronRight className=\"size-icon rtl:rotate-180\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{!!onViewModeChange && (\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\taria-label={strings.viewMode.label}\n\t\t\t\t\t\t\tvalue={viewMode}\n\t\t\t\t\t\t\toptions={viewModeOptions}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tonViewModeChange(value as CalendarViewMode);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"w-full max-w-full @sm/event-calendar-header:w-28\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nEventCalendarHeader.displayName = 'EventCalendarHeader';\n","/**\n * Event-calendar colour resolution helpers.\n *\n * The canonical token enum (`CalendarColorToken`) and a basic dot-class lookup\n * live in `event-calendar.types.ts`. This module extends that with the richer\n * class sets used by the day cell, event badge, and legend (badge surface,\n * border, filled swatch). Centralising the map here means new tokens (or theme\n * changes) are a one-line update.\n *\n * Every category supplies one canonical `colorToken`; arbitrary Tailwind\n * color strings are intentionally not part of the public contract.\n */\nimport {\n\tcalendarTokenDot,\n\tresolveCategoryColorToken,\n\ttype CalendarColorToken,\n\ttype EventCategory,\n} from './event-calendar.types';\n\nexport interface CalendarColorClasses {\n\t/** Solid dot fill (used as the leading bullet on event chips). */\n\tdot: string;\n\t/** Neutral surface for the event badge background. */\n\tbadgeBg: string;\n\t/** Neutral edge for the event badge. */\n\tborder: string;\n\t/** Filled legend swatch (square chip in the legend row). */\n\tswatch: string;\n}\n\n// Categories carry their hue on the marker alone (the dot and legend swatch);\n// the chip surface and edge stay neutral so a category never reads as a status.\nconst neutralChip = { badgeBg: 'bg-muted', border: 'border-border' } as const;\n\nconst TOKEN_EXTRAS: Record<CalendarColorToken, Omit<CalendarColorClasses, 'dot'>> = {\n\tgray: { ...neutralChip, swatch: calendarTokenDot.gray },\n\tred: { ...neutralChip, swatch: calendarTokenDot.red },\n\torange: { ...neutralChip, swatch: calendarTokenDot.orange },\n\tamber: { ...neutralChip, swatch: calendarTokenDot.amber },\n\tyellow: { ...neutralChip, swatch: calendarTokenDot.yellow },\n\tgreen: { ...neutralChip, swatch: calendarTokenDot.green },\n\tblue: { ...neutralChip, swatch: calendarTokenDot.blue },\n\tpurple: { ...neutralChip, swatch: calendarTokenDot.purple },\n};\n\n/**\n * Resolve a category to its full set of Tailwind colour classes.\n */\nexport function getCalendarColorClasses(\n\tcategory: Pick<EventCategory, 'colorToken'> | null | undefined,\n): CalendarColorClasses {\n\tconst token = resolveCategoryColorToken(category as EventCategory | null | undefined);\n\treturn {\n\t\tdot: calendarTokenDot[token],\n\t\t...TOKEN_EXTRAS[token],\n\t};\n}\n\n/** Convenience: just the dot class (most common lookup). */\nexport function getCalendarDotClass(\n\tcategory: Pick<EventCategory, 'colorToken'> | null | undefined,\n): string {\n\tconst token = resolveCategoryColorToken(category as EventCategory | null | undefined);\n\treturn calendarTokenDot[token];\n}\n","/**\n * EventCalendarLegend — category chips with optional click-to-filter. When\n * `enableFiltering` is true the whole chip toggles the category's visibility\n * (instead of a free-floating checkbox alongside a swatch — that pattern was\n * cluttered). Inactive categories desaturate to muted; active categories use\n * the colour-token swatch + body text.\n */\nimport { type LucideIcon } from 'lucide-react';\n\nimport { Button } from '../../base/buttons';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { getCalendarColorClasses } from './colors';\nimport type { EventCalendarLegendProps } from './event-calendar.types';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\n\nexport function EventCalendarLegend({\n\tcategories,\n\tvisibleCategories,\n\tonToggleCategory,\n\tenableFiltering = false,\n}: EventCalendarLegendProps) {\n\tconst isAllVisible = !visibleCategories || visibleCategories.length === 0;\n\n\tconst isCategoryVisible = (categoryId: string) => {\n\t\tif (!enableFiltering) return true;\n\t\treturn isAllVisible || visibleCategories?.includes(categoryId);\n\t};\n\n\tconst handleToggle = (categoryId: string) => {\n\t\tif (!enableFiltering || !onToggleCategory) return;\n\t\tonToggleCategory(categoryId);\n\t};\n\n\tif (categories.length === 0) return null;\n\n\treturn (\n\t\t<div\n\t\t\trole={enableFiltering ? 'group' : undefined}\n\t\t\taria-label={enableFiltering ? 'Filter event categories' : undefined}\n\t\t\tclassName={cn('event-calendar-legend--component', 'flex flex-wrap items-center gap-space-sm py-space-xs')}\n\t\t>\n\t\t\t{categories.map((category) => {\n\t\t\t\tconst isVisible = isCategoryVisible(category.id);\n\t\t\t\tconst colors = getCalendarColorClasses(category);\n\t\t\t\tconst Icon = category.icon as LucideIcon | undefined;\n\n\t\t\t\tconst chipBase =\n\t\t\t\t\t'group inline-flex items-center gap-space-sm rounded-radius border px-space-sm py-space-xs transition-colors';\n\n\t\t\t\tconst inner = (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'inline-block size-2 rounded-radius',\n\t\t\t\t\t\t\t\tisVisible ? colors.swatch : 'bg-muted-foreground/40',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{!!Icon && (\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'size-icon-sm',\n\t\t\t\t\t\t\t\t\tisVisible ? 'text-inherit' : 'text-muted-foreground',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" type={isVisible ? 'inherit' : 'secondary'}>\n\t\t\t\t\t\t\t{category.label}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</>\n\t\t\t\t);\n\n\t\t\t\tif (!enableFiltering) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey={category.id}\n\t\t\t\t\t\t\tclassName={cn(chipBase, 'border-border bg-card text-card-foreground cursor-default')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{inner}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={category.id}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\taria-pressed={isVisible}\n\t\t\t\t\t\tonClick={() => handleToggle(category.id)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tchipBase,\n\t\t\t\t\t\t\t'h-auto min-h-0 cursor-pointer shadow-none',\n\t\t\t\t\t\t\tisVisible\n\t\t\t\t\t\t\t\t? `border-border bg-card text-card-foreground ${interactionRecipes.toggleHover}`\n\t\t\t\t\t\t\t\t: `border-dashed border-border/60 bg-transparent text-muted-foreground ${interactionRecipes.toggleHover}`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{inner}\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nEventCalendarLegend.displayName = 'EventCalendarLegend';\n","import { addMonths, subMonths, addWeeks, subWeeks, format, type Locale } from 'date-fns';\nimport { useState, useCallback, useMemo } from 'react';\nimport type {\n\tCalendarEvent,\n\tCalendarViewMode,\n\tUseEventCalendarReturn,\n\tUseEventCalendarDataOptions\n} from './event-calendar.types';\nimport { useEventCalendarData } from './use-event-calendar-data';\n\nexport interface UseEventCalendarProps {\n\t/** Events to place on the grid. */\n\tevents: CalendarEvent[];\n\t/** Locale used for visible period labels. */\n\tlocale?: Locale;\n\t/** Visible date, for controlled use. */\n\tdate?: Date;\n\t/** Month shown on first render. */\n\tdefaultDate?: Date;\n\t/** Current view, for controlled use. */\n\tviewMode?: CalendarViewMode;\n\t/** View shown on first render. */\n\tdefaultViewMode?: CalendarViewMode;\n\tonDateChange?: (date: Date) => void;\n\tonViewModeChange?: (mode: CalendarViewMode) => void;\n\t/** Filtering and grouping options applied to the events. */\n\tdataOptions?: UseEventCalendarDataOptions;\n}\n\n/**\n * Core calendar logic hook\n */\nexport function useEventCalendar({\n\tevents,\n\tlocale,\n\tdate: dateProp,\n\tdefaultDate = new Date(),\n\tviewMode: viewModeProp,\n\tdefaultViewMode = 'month',\n\tonDateChange,\n\tonViewModeChange,\n\tdataOptions = {}\n}: UseEventCalendarProps): UseEventCalendarReturn {\n\tconst [internalDate, setInternalDate] = useState<Date>(defaultDate);\n\tconst [internalViewMode, setInternalViewMode] = useState<CalendarViewMode>(defaultViewMode);\n\tconst currentDate = dateProp ?? internalDate;\n\tconst viewMode = viewModeProp ?? internalViewMode;\n\tconst commitDate = useCallback((date: Date) => {\n\t\tif (dateProp === undefined) setInternalDate(date);\n\t\tonDateChange?.(date);\n\t}, [dateProp, onDateChange]);\n\tconst commitViewMode = useCallback((mode: CalendarViewMode) => {\n\t\tif (viewModeProp === undefined) setInternalViewMode(mode);\n\t\tonViewModeChange?.(mode);\n\t}, [onViewModeChange, viewModeProp]);\n\n\tconst calendarDays = useEventCalendarData(\n\t\tevents,\n\t\tcurrentDate,\n\t\tviewMode,\n\t\tdataOptions\n\t);\n\n\tconst visibleEvents = useMemo(() => {\n\t\tif (dataOptions.visibleCategories && dataOptions.visibleCategories.length > 0) {\n\t\t\treturn events.filter(event =>\n\t\t\t\tdataOptions.visibleCategories!.includes(event.category)\n\t\t\t);\n\t\t}\n\t\treturn events;\n\t}, [events, dataOptions.visibleCategories]);\n\n\tconst goToToday = useCallback(() => {\n\t\tconst today = new Date();\n\t\tcommitDate(today);\n\t}, [commitDate]);\n\n\tconst goToNextPeriod = useCallback(() => {\n\t\tconst newDate = viewMode === 'month'\n\t\t\t? addMonths(currentDate, 1)\n\t\t\t: addWeeks(currentDate, 1);\n\t\tcommitDate(newDate);\n\t}, [commitDate, currentDate, viewMode]);\n\n\tconst goToPreviousPeriod = useCallback(() => {\n\t\tconst newDate = viewMode === 'month'\n\t\t\t? subMonths(currentDate, 1)\n\t\t\t: subWeeks(currentDate, 1);\n\t\tcommitDate(newDate);\n\t}, [commitDate, currentDate, viewMode]);\n\n\tconst handleSetDate = useCallback((date: Date) => {\n\t\tcommitDate(date);\n\t}, [commitDate]);\n\n\tconst handleSetViewMode = useCallback((mode: CalendarViewMode) => {\n\t\tcommitViewMode(mode);\n\t}, [commitViewMode]);\n\n\tconst displayLabel = useMemo(() => {\n\t\tif (viewMode === 'month') {\n\t\t\treturn format(currentDate, 'MMMM yyyy', { locale });\n\t\t} else if (viewMode === 'week') {\n\t\t\tconst weekStart = calendarDays[0]?.date;\n\t\t\tconst weekEnd = calendarDays[calendarDays.length - 1]?.date;\n\t\t\tif (weekStart && weekEnd) {\n\t\t\t\treturn `${format(weekStart, 'MMM d', { locale })} - ${format(weekEnd, 'MMM d, yyyy', { locale })}`;\n\t\t\t}\n\t\t\treturn format(currentDate, 'MMMM yyyy', { locale });\n\t\t}\n\t\treturn format(currentDate, 'MMMM yyyy', { locale });\n\t}, [currentDate, viewMode, calendarDays, locale]);\n\n\tconst hasEvents = useMemo(() => {\n\t\treturn visibleEvents.length > 0;\n\t}, [visibleEvents]);\n\n\treturn {\n\t\tcurrentDate,\n\t\tviewMode,\n\t\tcalendarDays,\n\t\tvisibleEvents,\n\t\tgoToToday,\n\t\tgoToNextPeriod,\n\t\tgoToPreviousPeriod,\n\t\tsetDate: handleSetDate,\n\t\tsetViewMode: handleSetViewMode,\n\t\tdisplayLabel,\n\t\thasEvents\n\t};\n}\n","/**\n * EventCalendar — month-grid event calendar with category legend, header\n * navigation (prev/next/today + view-mode select), keyboard-accessible day\n * cells, and per-category filtering. Strings are fully overridable; category\n * colours come from a small canonical token set (`calendarTokenDot`).\n */\nimport { useState, useMemo } from 'react';\nimport { Text } from '../../typography/text';\nimport { useStrings } from '../../../lib/strings';\nimport { useDatesConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { EventCalendarDayCell } from './event-calendar-day-cell';\nimport { EventCalendarHeader } from './event-calendar-header';\nimport { EventCalendarLegend } from './event-calendar-legend';\nimport { defaultEventCalendarStrings, type EventCalendarProps } from './event-calendar.types';\nimport { useEventCalendar } from './use-event-calendar';\nimport { toneRecipes } from '../../../lib/tone-recipes';\n\nfunction isDateMatched(rule: EventCalendarProps['disabledDates'], date: Date): boolean {\n\tif (!rule) return false;\n\tif (Array.isArray(rule)) {\n\t\treturn rule.some((d) => d.toDateString() === date.toDateString());\n\t}\n\tif (typeof rule === 'function') {\n\t\treturn rule(date);\n\t}\n\tconst datesMatch = rule.dates?.some((d) => d.toDateString() === date.toDateString()) ?? false;\n\tconst predicateMatch = rule.predicate?.(date) ?? false;\n\treturn datesMatch || predicateMatch;\n}\n\nexport function EventCalendar({\n\tevents,\n\tcategories,\n\tviewMode: controlledViewMode,\n\tdefaultViewMode,\n\tonViewModeChange,\n\tdate,\n\tdefaultDate,\n\tonDateChange,\n\tonEventClick,\n\tonDayClick,\n\tmaxEventsPerDay = 3,\n\tshowLegend = true,\n\tshowHeader = true,\n\tshowWeekends = true,\n\tweekStartsOn: weekStartsOnProp,\n\tlocale,\n\tenableCategoryFilter = false,\n\tvisibleCategories: controlledVisibleCategories,\n\tonVisibleCategoriesChange,\n\tloading = false,\n\temptyStateMessage,\n\tclassName,\n\tcompact = false,\n\tactions,\n\tstrings: stringsProp,\n\tdayHeadingVariant = 'default',\n\tdayHeadingClassName,\n\trenderDayHeading,\n\trangeMode = 'date',\n\tminDate,\n\tmaxDate,\n\tdisabledDates,\n\tfilterEvent,\n\trenderEvent,\n\trenderDayCell,\n}: EventCalendarProps) {\n\tconst strings = useStrings(defaultEventCalendarStrings, stringsProp);\n\n\tconst [internalVisibleCategories, setInternalVisibleCategories] = useState<string[]>([]);\n\n\tconst visibleCategories = controlledVisibleCategories ?? internalVisibleCategories;\n\n\t// Resolve start-of-week against the consumer's <UIProvider> dates\n\t// slice. Library default is 1 (Monday) when no consumer override is set.\n\tconst {\n\t\tweekStartsOn: configWeekStartsOn,\n\t\tlocale: configLocale,\n\t} = useDatesConfig();\n\tconst weekStartsOn = (weekStartsOnProp ?? configWeekStartsOn ?? 1) as 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\tconst resolvedLocale = locale ?? configLocale;\n\n\tconst handleToggleCategory = (categoryId: string) => {\n\t\tconst newCategories = visibleCategories.includes(categoryId)\n\t\t\t? visibleCategories.filter(id => id !== categoryId)\n\t\t\t: [...visibleCategories, categoryId];\n\n\t\tif (onVisibleCategoriesChange) {\n\t\t\tonVisibleCategoriesChange(newCategories);\n\t\t} else {\n\t\t\tsetInternalVisibleCategories(newCategories);\n\t\t}\n\t};\n\n\tconst calendar = useEventCalendar({\n\t\tevents,\n\t\tlocale: resolvedLocale,\n\t\tdate,\n\t\tdefaultDate,\n\t\tviewMode: controlledViewMode,\n\t\tdefaultViewMode,\n\t\tonDateChange,\n\t\tonViewModeChange,\n\t\tdataOptions: {\n\t\t\tweekStartsOn,\n\t\t\tshowWeekends,\n\t\t\tvisibleCategories: visibleCategories.length > 0 ? visibleCategories : undefined\n\t\t}\n\t});\n\n\tconst weekdays = useMemo(() => {\n\t\tconst days = strings.weekdaysShort;\n\t\tif (weekStartsOn === 1) {\n\t\t\treturn [...days.slice(1), days[0]];\n\t\t}\n\t\treturn days as readonly string[];\n\t}, [strings.weekdaysShort, weekStartsOn]);\n\n\tconst handleDayClick = (dayData: typeof calendar.calendarDays[0]) => {\n\t\t// Block clicks on disabled or out-of-range dates.\n\t\tif (isDateMatched(disabledDates, dayData.date)) return;\n\t\tif (minDate && dayData.date < minDate) return;\n\t\tif (maxDate && dayData.date > maxDate) return;\n\t\tonDayClick?.(dayData.date, dayData.events);\n\t};\n\n\t// Apply runtime event filtering + min/max disabled rules to each day's\n\t// event list before passing to the cell. Doesn't mutate the source.\n\tconst filteredCalendarDays = useMemo(() => {\n\t\tif (!filterEvent) return calendar.calendarDays;\n\t\treturn calendar.calendarDays.map((day) => ({\n\t\t\t...day,\n\t\t\tevents: day.events.filter(filterEvent),\n\t\t\teventCount: day.events.filter(filterEvent).length,\n\t\t\thasMultipleEvents: day.events.filter(filterEvent).length > 1,\n\t\t}));\n\t}, [calendar.calendarDays, filterEvent]);\n\n\tfunction isDayDisabled(date: Date): boolean {\n\t\tif (isDateMatched(disabledDates, date)) return true;\n\t\tif (minDate && date < minDate) return true;\n\t\tif (maxDate && date > maxDate) return true;\n\t\treturn false;\n\t}\n\n\t// Pre-compute prev/next disabled state for the header navigation.\n\tconst navDisabled = useMemo(() => {\n\t\tconst days = calendar.calendarDays;\n\t\tif (days.length === 0) return { prev: false, next: false };\n\t\tconst first = days[0].date;\n\t\tconst last = days[days.length - 1].date;\n\t\treturn {\n\t\t\tprev: !!minDate && first <= minDate,\n\t\t\tnext: !!maxDate && last >= maxDate,\n\t\t};\n\t}, [calendar.calendarDays, minDate, maxDate]);\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div className={cn('event-calendar--component', 'flex items-center justify-center p-surface-lg', className)} role=\"status\">\n\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t{strings.loading}\n\t\t\t\t</Text>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst viewModeChangeHandler = controlledViewMode ? onViewModeChange : undefined;\n\tconst toggleCategoryHandler = enableCategoryFilter ? handleToggleCategory : undefined;\n\n\treturn (\n\t\t<div className={cn('event-calendar--component w-full space-y-space-xl', className)}>\n\t\t\t{!!showHeader && (\n\t\t\t\t<EventCalendarHeader\n\t\t\t\t\tcurrentDate={calendar.currentDate}\n\t\t\t\t\tviewMode={calendar.viewMode}\n\t\t\t\t\tdisplayLabel={calendar.displayLabel}\n\t\t\t\t\tonPrevious={calendar.goToPreviousPeriod}\n\t\t\t\t\tonNext={calendar.goToNextPeriod}\n\t\t\t\t\tonToday={calendar.goToToday}\n\t\t\t\t\tonViewModeChange={viewModeChangeHandler}\n\t\t\t\t\tonDateChange={calendar.setDate}\n\t\t\t\t\tlocale={resolvedLocale}\n\t\t\t\t\tactions={actions}\n\t\t\t\t\trangeMode={rangeMode}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\tprevDisabled={navDisabled.prev}\n\t\t\t\t\tnextDisabled={navDisabled.next}\n\t\t\t\t\tstrings={{ today: strings.today, previous: strings.previous, next: strings.next, viewMode: strings.viewMode, monthYearPicker: strings.monthYearPicker }}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!!showLegend && categories.length > 0 && (\n\t\t\t\t<EventCalendarLegend\n\t\t\t\t\tcategories={categories}\n\t\t\t\t\tvisibleCategories={visibleCategories}\n\t\t\t\t\tonToggleCategory={toggleCategoryHandler}\n\t\t\t\t\tenableFiltering={enableCategoryFilter}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{(!calendar.hasEvents && emptyStateMessage) ? (\n\t\t\t\t<div className=\"flex items-center justify-center rounded-radius border border-dashed border-border p-surface\">\n\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t{emptyStateMessage}\n\t\t\t\t\t</Text>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"box-border bg-background text-foreground rounded-surface border border-border\">\n\t\t\t\t\t{/* Weekday headers */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'grid grid-cols-7',\n\t\t\t\t\t\t\tdayHeadingVariant === 'bordered' && 'border-b border-border mb-0',\n\t\t\t\t\t\t\tdayHeadingVariant === 'tinted' && 'bg-muted/50 rounded-t-surface mb-0 overflow-hidden',\n\t\t\t\t\t\t\tdayHeadingVariant === 'accent' && cn(toneRecipes.primary.wash, 'rounded-t-surface mb-0 overflow-hidden'),\n\t\t\t\t\t\t\t(dayHeadingVariant === 'default') && 'mb-space-md',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{weekdays.map((day, index) => {\n\t\t\t\t\t\t\tif (renderDayHeading) {\n\t\t\t\t\t\t\t\treturn <div key={day}>{renderDayHeading(day, index)}</div>;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={day}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'text-center h-8 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\tdayHeadingClassName,\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<Text\n\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\tweight={dayHeadingVariant === 'accent' ? 'medium' : 'regular'}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\tdayHeadingVariant === 'default' && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t\tdayHeadingVariant === 'tinted' && 'text-muted-foreground',\n\t\t\t\t\t\t\t\t\t\t\tdayHeadingVariant === 'bordered' && 'text-foreground',\n\t\t\t\t\t\t\t\t\t\t\tdayHeadingVariant === 'accent' && 'text-primary-accent',\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\t\t{day}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Calendar grid */}\n\t\t\t\t\t<div className=\"grid grid-cols-7\">\n\t\t\t\t\t\t{filteredCalendarDays.map((dayData) => {\n\t\t\t\t\t\t\tconst disabled = isDayDisabled(dayData.date);\n\t\t\t\t\t\t\tconst defaultRender = () => (\n\t\t\t\t\t\t\t\t<EventCalendarDayCell\n\t\t\t\t\t\t\t\t\tdata={dayData}\n\t\t\t\t\t\t\t\t\tcategories={categories}\n\t\t\t\t\t\t\t\t\tmaxEvents={maxEventsPerDay}\n\t\t\t\t\t\t\t\t\tonClick={() => handleDayClick(dayData)}\n\t\t\t\t\t\t\t\t\tonEventClick={onEventClick ? (event) => { if (!isDayDisabled(dayData.date)) onEventClick(event); } : undefined}\n\t\t\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\t\t\tstrings={{ booking: strings.booking, bookings: strings.bookings }}\n\t\t\t\t\t\t\t\t\trenderEvent={renderEvent}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={dayData.date.toISOString()}\n\t\t\t\t\t\t\t\t\tclassName={cn(disabled && 'pointer-events-none opacity-50')}\n\t\t\t\t\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{renderDayCell ? renderDayCell(dayData, defaultRender) : defaultRender()}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nEventCalendar.displayName = 'EventCalendar';\n","/**\n * EventCalendarEventCard — detailed event view rendered in popovers and\n * agenda lists. Reads optional `metadata.customer_name`, `guest_count`, and\n * `service_name` to render a richer summary; falls back gracefully when any\n * of those are absent. Strings (guest / guests pluralization) overridable.\n */\nimport { ExternalLink } from 'lucide-react';\nimport { Stack } from '../../base/structure';\nimport { Date as DateValue, DateTime } from '../../primitives';\nimport { Heading } from '../../typography/heading';\nimport { Text } from '../../typography/text';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { getCalendarDotClass } from './colors';\nimport type { EventCalendarEventCardProps } from './event-calendar.types';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { dotRecipes } from '../../../lib/tone-recipes';\n\nexport interface EventCalendarEventCardStrings {\n\tguest: string;\n\tguests: string;\n}\n\nexport const defaultEventCalendarEventCardStrings: EventCalendarEventCardStrings = {\n\tguest: 'guest',\n\tguests: 'guests',\n};\n\ninterface EventCalendarEventCardPropsWithStrings extends EventCalendarEventCardProps {\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<EventCalendarEventCardStrings>;\n}\n\nexport function EventCalendarEventCard({\n\tevent,\n\tcategory,\n\tonClick,\n\tstrings: stringsProp,\n}: EventCalendarEventCardPropsWithStrings) {\n\tconst strings = useStrings(defaultEventCalendarEventCardStrings, stringsProp);\n\tconst isClickable = !!onClick;\n\n\tconst handleClick = () => {\n\t\tif (onClick) {\n\t\t\tonClick();\n\t\t}\n\t};\n\n\tconst metadata = event.metadata || {};\n\tconst customerName = metadata.customer_name as string | undefined;\n\tconst guestCount = metadata.guest_count as number | undefined;\n\tconst serviceName = metadata.service_name as string | undefined;\n\tconst categoryDotClass = getCalendarDotClass(category);\n\tconst guestLabel = guestCount !== undefined && guestCount > 0\n\t\t? `${guestCount} ${guestCount === 1 ? strings.guest : strings.guests}`\n\t\t: undefined;\n\tconst facts = [customerName, guestLabel].filter(Boolean).join(' · ');\n\n\tconst cardContent = (\n\t\t<Stack gap=\"lg\">\n\t\t\t<div className=\"event-calendar-event-card--header flex min-w-0 items-start justify-between gap-space-lg\">\n\t\t\t\t<div className=\"flex min-w-0 flex-1 flex-col items-start gap-space-xs sm:flex-row sm:flex-wrap sm:items-center sm:gap-x-space-md\">\n\t\t\t\t\t<Heading\n\t\t\t\t\t\ttag=\"h5\"\n\t\t\t\t\t\tcontainerClassName=\"event-calendar-event-card--heading min-w-0 max-w-full sm:w-auto\"\n\t\t\t\t\t\tclassName=\"break-words text-inherit\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{event.title}\n\t\t\t\t\t</Heading>\n\t\t\t\t\t{!!category && (\n\t\t\t\t\t\t<div className=\"event-calendar-event-card--category inline-flex min-w-0 max-w-full items-center gap-space-xs\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'event-calendar-event-card--category-dot',\n\t\t\t\t\t\t\tdotRecipes.inline,\n\t\t\t\t\t\t\t\t\tcategoryDotClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" size=\"xs\" weight=\"medium\" className=\"min-w-0 break-words\">\n\t\t\t\t\t\t\t\t{category.label}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{!!isClickable && !!event.url && <ExternalLink className=\"size-icon-md text-muted-foreground flex-shrink-0\" />}\n\t\t\t</div>\n\n\t\t\t{!!(facts || serviceName) && (\n\t\t\t\t<Stack gap=\"xs\" className=\"event-calendar-event-card--details min-w-0\">\n\t\t\t\t\t{!!facts && (\n\t\t\t\t\t\t<Text type=\"inherit\" className=\"event-calendar-event-card--facts break-words\">\n\t\t\t\t\t\t\t{facts}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!serviceName && (\n\t\t\t\t\t\t<Text type=\"secondary\" className=\"line-clamp-1\">\n\t\t\t\t\t\t\t{serviceName}\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<div className=\"event-calendar-event-card--date\">\n\t\t\t\t{event.allDay ? (\n\t\t\t\t\t<DateValue value={event.startDate} preset=\"long\" size=\"xs\" type=\"secondary\" />\n\t\t\t\t) : (\n\t\t\t\t\t<DateTime value={event.startDate} preset=\"long\" size=\"xs\" type=\"secondary\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Stack>\n\t);\n\n\tconst commonClassName = cn(\n\t\t'box-border w-full min-w-0 text-left p-surface border border-border rounded-surface bg-card text-card-foreground transition-none',\n\t\tisClickable ? `cursor-pointer focus-visible:outline-none ${focusRecipes.frame}` : ''\n\t);\n\n\tif (isClickable) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleClick}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'event-calendar-event-card--component',\n\t\t\t\t\t`m-0 flex h-auto flex-col items-stretch justify-start whitespace-normal font-sans shadow-none ${interactionRecipes.rowHover}`,\n\t\t\t\t\tcommonClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{cardContent}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn <div className={cn('event-calendar-event-card--component', commonClassName)}>{cardContent}</div>;\n}\n\nEventCalendarEventCard.displayName = 'EventCalendarEventCard';\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, R as d, S as f, T as p, _ as m, a as h, b as g, c as _, d as v, f as y, g as b, h as x, i as S, j as C, k as w, l as T, m as E, n as D, o as O, p as k, r as A, s as j, t as M, u as N, v as P, w as F, x as I, y as L } from "../filters-BcT-uoFy.js";
2
+ import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, R as d, S as f, T as p, _ as m, a as h, b as g, c as _, d as v, f as y, g as b, h as x, i as S, j as C, k as w, l as T, m as E, n as D, o as O, p as k, r as A, s as j, t as M, u as N, v as P, w as F, x as I, y as L } from "../filters-DzgSJpMK.js";
3
3
  export { g as ActiveFilterItem, S as AsyncSelectFacet, P as DateFacet, m as FilterErrorBoundary, T as FilterLayout, c as FilterOperatorEnum, f as FilterOperatorSelect, E as FilterPill, x as FilterPopoverContent, F as FilterProvider, y as FilterTabs, u as FilterType, I as FilterValueDisplay, k as FiltersButton, A as RangeFacet, v as SearchFacet, N as SearchFiltersList, h as SelectFacet, b as TagsFacet, a as defaultFilterStrings, i as defineAsyncSelectConfig, r as getBooleanOperators, n as getDateOperators, l as getDefaultOperatorForType, o as getFilterString, w as getNumberOperators, e as getOperatorsForType, C as getSelectOperators, s as getTextOperators, d as interpolateFilterString, O as mergeFilterQuery, j as parseFiltersFromQuery, M as predicateValidator, _ as serializeFiltersToQuery, L as useAsyncOptions, t as useFilterGroups, p as useFilters, D as zodValidator };