themelia-react-ui 2.0.6 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. package/CHANGELOG.md +250 -0
  2. package/MIGRATION.md +746 -7
  3. package/README.md +27 -23
  4. package/dist/{accordion-0tQUZ20r.js → accordion-DNVqwEIC.js} +36 -36
  5. package/dist/accordion-DNVqwEIC.js.map +1 -0
  6. package/dist/action-menu-D5343RwT.js +286 -0
  7. package/dist/action-menu-D5343RwT.js.map +1 -0
  8. package/dist/ai-artifact-otrz9ZwS.js +1214 -0
  9. package/dist/ai-artifact-otrz9ZwS.js.map +1 -0
  10. package/dist/anchored-positioning-1U_eBFNx.js +9 -0
  11. package/dist/anchored-positioning-1U_eBFNx.js.map +1 -0
  12. package/dist/app-shell-CPN30Nb1.js +372 -0
  13. package/dist/app-shell-CPN30Nb1.js.map +1 -0
  14. package/dist/{attachment-BCpA4e7i.js → attachment-D2-fpfmv.js} +15 -15
  15. package/dist/{attachment-BCpA4e7i.js.map → attachment-D2-fpfmv.js.map} +1 -1
  16. package/dist/{auth-B0girIk_.js → auth-g_oUTDDC.js} +234 -241
  17. package/dist/auth-g_oUTDDC.js.map +1 -0
  18. package/dist/{avatar-B9Jnp-T-.js → avatar-Ca3Ihrq4.js} +4 -4
  19. package/dist/{avatar-B9Jnp-T-.js.map → avatar-Ca3Ihrq4.js.map} +1 -1
  20. package/dist/{badge-wWauMgAt.js → badge-oGiXblW7.js} +8 -9
  21. package/dist/badge-oGiXblW7.js.map +1 -0
  22. package/dist/base/accordion.js +1 -1
  23. package/dist/base/action-menu.js +1 -1
  24. package/dist/base/attachment.js +1 -1
  25. package/dist/base/avatar.js +1 -1
  26. package/dist/base/badge.js +1 -1
  27. package/dist/base/batch-action-bar.js +1 -1
  28. package/dist/base/buttons.js +2 -2
  29. package/dist/base/cards.js +3 -3
  30. package/dist/base/carousel.js +11 -11
  31. package/dist/base/carousel.js.map +1 -1
  32. package/dist/base/cascader.js +1 -1
  33. package/dist/base/chart.js +1 -1
  34. package/dist/base/choice-inputs.js +2 -2
  35. package/dist/base/code-block.js +1 -1
  36. package/dist/base/combobox.js +1 -1
  37. package/dist/base/command.js +1 -1
  38. package/dist/base/copyable.js +1 -1
  39. package/dist/base/date-pickers.js +2 -2
  40. package/dist/base/display.js +7 -7
  41. package/dist/base/feedback.js +4 -4
  42. package/dist/base/forms-numeric.js +2 -2
  43. package/dist/base/forms.js +2 -2
  44. package/dist/base/inline-edit.js +13 -13
  45. package/dist/base/inline-edit.js.map +1 -1
  46. package/dist/base/item.js +1 -1
  47. package/dist/base/media-gallery.js +203 -2
  48. package/dist/base/media-gallery.js.map +1 -0
  49. package/dist/base/metadata-list.js +1 -1
  50. package/dist/base/navigation.js +7 -7
  51. package/dist/base/popover-menu.js +1 -1
  52. package/dist/base/popover.js +1 -1
  53. package/dist/base/qr-code.js +32 -22
  54. package/dist/base/qr-code.js.map +1 -1
  55. package/dist/base/repeaters.js +91 -88
  56. package/dist/base/repeaters.js.map +1 -1
  57. package/dist/base/sidebar.js +2 -2
  58. package/dist/base/signature-pad.js +14 -14
  59. package/dist/base/signature-pad.js.map +1 -1
  60. package/dist/base/skeleton.js +1 -1
  61. package/dist/base/spinner.js +6 -12
  62. package/dist/base/spinner.js.map +1 -1
  63. package/dist/base/structure.js +1 -1
  64. package/dist/base/table.js +1 -1
  65. package/dist/base/text-inputs.js +3 -3
  66. package/dist/base/toaster.js +2 -2
  67. package/dist/base/tree.js +2 -2
  68. package/dist/base/upload-queue.js +303 -2
  69. package/dist/base/upload-queue.js.map +1 -0
  70. package/dist/base/upload.js +3 -4
  71. package/dist/base/value-inputs.js +1 -1
  72. package/dist/{batch-action-bar-BoqWIIpV.js → batch-action-bar-D6MZQNnC.js} +10 -10
  73. package/dist/{batch-action-bar-BoqWIIpV.js.map → batch-action-bar-D6MZQNnC.js.map} +1 -1
  74. package/dist/blocks/admin.js +242 -228
  75. package/dist/blocks/admin.js.map +1 -1
  76. package/dist/blocks/ai.js +395 -357
  77. package/dist/blocks/ai.js.map +1 -1
  78. package/dist/blocks/analytics/charts.js +1022 -0
  79. package/dist/blocks/analytics/charts.js.map +1 -0
  80. package/dist/blocks/analytics/usage-card.js +1 -1
  81. package/dist/blocks/analytics.js +171 -1365
  82. package/dist/blocks/analytics.js.map +1 -1
  83. package/dist/blocks/collaboration.js +1 -1
  84. package/dist/blocks/commerce/receipt.js +1 -1
  85. package/dist/blocks/commerce.js +1487 -1358
  86. package/dist/blocks/commerce.js.map +1 -1
  87. package/dist/blocks/data-display.js +2 -3
  88. package/dist/blocks/onboarding.js +91 -82
  89. package/dist/blocks/onboarding.js.map +1 -1
  90. package/dist/blocks/planning.js +25 -25
  91. package/dist/blocks/planning.js.map +1 -1
  92. package/dist/blocks/timelines.js +2 -2
  93. package/dist/{breadcrumbs-Bp9Ke7kd.js → breadcrumbs-CQ9JSlez.js} +52 -45
  94. package/dist/breadcrumbs-CQ9JSlez.js.map +1 -0
  95. package/dist/{button-ChBovTx0.js → button-rd6FiHfQ.js} +12 -8
  96. package/dist/button-rd6FiHfQ.js.map +1 -0
  97. package/dist/{buttons-DeW0bQeK.js → buttons-pZVgPTZn.js} +230 -246
  98. package/dist/buttons-pZVgPTZn.js.map +1 -0
  99. package/dist/{cards-CNXnmvV5.js → cards-CgWyqvgZ.js} +25 -22
  100. package/dist/{cards-CNXnmvV5.js.map → cards-CgWyqvgZ.js.map} +1 -1
  101. package/dist/cascader-Cf05pwaq.js +444 -0
  102. package/dist/cascader-Cf05pwaq.js.map +1 -0
  103. package/dist/{chart-I7ROnsl8.js → chart-CygRCyIZ.js} +5 -5
  104. package/dist/{chart-I7ROnsl8.js.map → chart-CygRCyIZ.js.map} +1 -1
  105. package/dist/{checkbox-MoyHIAPs.js → checkbox-Dy5_XBMZ.js} +4 -4
  106. package/dist/{checkbox-MoyHIAPs.js.map → checkbox-Dy5_XBMZ.js.map} +1 -1
  107. package/dist/{choice-inputs-DHGtx0QV.js → choice-inputs-oJEsrb5Y.js} +113 -114
  108. package/dist/choice-inputs-oJEsrb5Y.js.map +1 -0
  109. package/dist/{code-block-BSJyq9e-.js → code-block-BrLD7mCi.js} +44 -60
  110. package/dist/code-block-BrLD7mCi.js.map +1 -0
  111. package/dist/collapsible-CRCCg_bO.js +80 -0
  112. package/dist/collapsible-CRCCg_bO.js.map +1 -0
  113. package/dist/{collection-content-CSnwtOTH.js → collection-content-D7SoDlYd.js} +3 -3
  114. package/dist/{collection-content-CSnwtOTH.js.map → collection-content-D7SoDlYd.js.map} +1 -1
  115. package/dist/combobox-Dl6f6kHz.js +362 -0
  116. package/dist/combobox-Dl6f6kHz.js.map +1 -0
  117. package/dist/combobox-DrDXtSSt.js +929 -0
  118. package/dist/combobox-DrDXtSSt.js.map +1 -0
  119. package/dist/command-CjZ2VzKC.js +432 -0
  120. package/dist/command-CjZ2VzKC.js.map +1 -0
  121. package/dist/comments-C2MZyRmh.js +1214 -0
  122. package/dist/comments-C2MZyRmh.js.map +1 -0
  123. package/dist/components/base/accordion/accordion.d.ts +11 -3
  124. package/dist/components/base/action-menu/action-menu.d.ts +11 -3
  125. package/dist/components/base/buttons/button.d.ts +2 -2
  126. package/dist/components/base/buttons/index.d.ts +1 -1
  127. package/dist/components/base/buttons/loader-button.d.ts +6 -15
  128. package/dist/components/base/cards/index.d.ts +1 -1
  129. package/dist/components/base/cards/partials/card-body-context.d.ts +6 -0
  130. package/dist/components/base/cards/smart-card.d.ts +0 -2
  131. package/dist/components/base/cards/smart-card.types.d.ts +12 -10
  132. package/dist/components/base/cascader/cascader.d.ts +8 -2
  133. package/dist/components/base/cascader/cascader.types.d.ts +24 -2
  134. package/dist/components/base/cascader/index.d.ts +1 -1
  135. package/dist/components/base/choice-inputs/switch.d.ts +1 -1
  136. package/dist/components/base/code-block/use-code-copy.d.ts +2 -6
  137. package/dist/components/base/command/command.d.ts +1 -1
  138. package/dist/components/base/date-pickers/datepicker.types.d.ts +1 -3
  139. package/dist/components/base/display/dialog.d.ts +3 -9
  140. package/dist/components/base/display/index.d.ts +2 -3
  141. package/dist/components/base/display/separator.d.ts +1 -1
  142. package/dist/components/base/feedback/alert.d.ts +2 -1
  143. package/dist/components/base/feedback/empty.d.ts +10 -2
  144. package/dist/components/base/forms/workflow.d.ts +2 -2
  145. package/dist/components/base/forms-numeric/dimensions-input.d.ts +9 -17
  146. package/dist/components/base/forms-numeric/index.d.ts +3 -3
  147. package/dist/components/base/item/item.types.d.ts +6 -2
  148. package/dist/components/base/metadata-list/index.d.ts +1 -3
  149. package/dist/components/base/metadata-list/metadata-list.d.ts +4 -1
  150. package/dist/components/base/navigation/index.d.ts +2 -2
  151. package/dist/components/base/navigation/language-switcher.d.ts +7 -6
  152. package/dist/components/base/navigation/navigation-tabs.d.ts +8 -1
  153. package/dist/components/base/navigation/page-header/index.d.ts +1 -1
  154. package/dist/components/base/navigation/page-header/page-header.d.ts +13 -17
  155. package/dist/components/base/navigation/pagination.d.ts +5 -5
  156. package/dist/components/base/popover/popover.recipes.d.ts +0 -1
  157. package/dist/components/base/qr-code/qr-code.d.ts +4 -0
  158. package/dist/components/base/repeaters/index.d.ts +1 -1
  159. package/dist/components/base/repeaters/key-value-editor.d.ts +4 -0
  160. package/dist/components/base/sheet/sheet.d.ts +6 -15
  161. package/dist/components/base/sidebar/index.d.ts +1 -6
  162. package/dist/components/base/sidebar/sidebar.d.ts +38 -10
  163. package/dist/components/base/skeleton/skeleton.d.ts +1 -1
  164. package/dist/components/base/structure/structure.types.d.ts +11 -2
  165. package/dist/components/base/text-inputs/index.d.ts +1 -1
  166. package/dist/components/base/tree/index.d.ts +1 -0
  167. package/dist/components/base/tree/tree.d.ts +2 -2
  168. package/dist/components/base/tree/tree.types.d.ts +7 -1
  169. package/dist/components/base/upload/file-upload.validation.d.ts +37 -1
  170. package/dist/components/base/upload/image-upload.d.ts +2 -0
  171. package/dist/components/base/upload/index.d.ts +3 -9
  172. package/dist/components/base/value-inputs/date-time-input.d.ts +4 -0
  173. package/dist/components/base/value-inputs/slider.d.ts +5 -2
  174. package/dist/components/blocks/admin/action-surfaces/index.d.ts +17 -4
  175. package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +9 -3
  176. package/dist/components/blocks/admin/index.d.ts +1 -1
  177. package/dist/components/blocks/ai/ai-artifact/ai-artifact.d.ts +1 -1
  178. package/dist/components/blocks/ai/ai-artifact/types.d.ts +9 -4
  179. package/dist/components/blocks/ai/ai-chain-of-thought/ai-chain-of-thought.d.ts +1 -1
  180. package/dist/components/blocks/ai/ai-chain-of-thought/types.d.ts +11 -1
  181. package/dist/components/blocks/ai/ai-citation/ai-citation.d.ts +1 -1
  182. package/dist/components/blocks/ai/ai-citation/types.d.ts +6 -0
  183. package/dist/components/blocks/ai/ai-confirmation/ai-confirmation.d.ts +1 -1
  184. package/dist/components/blocks/ai/ai-confirmation/types.d.ts +21 -5
  185. package/dist/components/blocks/ai/ai-feedback/types.d.ts +7 -2
  186. package/dist/components/blocks/ai/ai-inline-citation/types.d.ts +9 -3
  187. package/dist/components/blocks/ai/ai-package-info/ai-package-info.d.ts +1 -1
  188. package/dist/components/blocks/ai/ai-package-info/types.d.ts +6 -0
  189. package/dist/components/blocks/ai/ai-sources/ai-sources.d.ts +1 -1
  190. package/dist/components/blocks/ai/ai-sources/types.d.ts +8 -2
  191. package/dist/components/blocks/ai/ai-task/ai-task.d.ts +1 -1
  192. package/dist/components/blocks/ai/ai-task/types.d.ts +10 -1
  193. package/dist/components/blocks/ai/ai-tool-call/ai-tool-call.d.ts +1 -1
  194. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +6 -0
  195. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  196. package/dist/components/blocks/analytics/activity-heatmap/types.d.ts +1 -1
  197. package/dist/components/blocks/analytics/analytics.strings.d.ts +2 -0
  198. package/dist/components/blocks/analytics/atoms/metric-trend-chip.d.ts +11 -1
  199. package/dist/components/blocks/analytics/chart-card/chart-card.d.ts +7 -5
  200. package/dist/components/blocks/analytics/charts/index.d.ts +27 -0
  201. package/dist/components/blocks/analytics/index.d.ts +17 -24
  202. package/dist/components/blocks/analytics/metric/metric.d.ts +5 -5
  203. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +2 -2
  204. package/dist/components/blocks/analytics/types.d.ts +12 -3
  205. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  206. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  207. package/dist/components/blocks/commerce/address-card/types.d.ts +5 -16
  208. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +2 -2
  209. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +6 -4
  210. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +0 -2
  211. package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
  212. package/dist/components/blocks/commerce/cart-summary/types.d.ts +9 -11
  213. package/dist/components/blocks/commerce/coupon-input/coupon-input.d.ts +1 -1
  214. package/dist/components/blocks/commerce/coupon-input/types.d.ts +7 -3
  215. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +0 -2
  216. package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
  217. package/dist/components/blocks/commerce/discount-stack/types.d.ts +4 -6
  218. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  219. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +2 -0
  220. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-balance.d.ts +18 -0
  221. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-compact.d.ts +1 -1
  222. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-copy-button.d.ts +0 -1
  223. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-dark.d.ts +1 -1
  224. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-full.d.ts +1 -1
  225. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-illustrated.d.ts +1 -1
  226. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-minimal.d.ts +1 -1
  227. package/dist/components/blocks/commerce/giftcard-card/types.d.ts +16 -5
  228. package/dist/components/blocks/commerce/index.d.ts +8 -8
  229. package/dist/components/blocks/commerce/inventory-level/inventory-level.strings.d.ts +2 -0
  230. package/dist/components/blocks/commerce/inventory-level/types.d.ts +1 -1
  231. package/dist/components/blocks/commerce/inventory-section/types.d.ts +0 -5
  232. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +6 -3
  233. package/dist/components/blocks/commerce/loyalty-points/loyalty-points.d.ts +1 -1
  234. package/dist/components/blocks/commerce/loyalty-points/types.d.ts +11 -5
  235. package/dist/components/blocks/commerce/order-status/order-status.d.ts +1 -1
  236. package/dist/components/blocks/commerce/order-status/types.d.ts +8 -8
  237. package/dist/components/blocks/commerce/order-timeline/order-timeline.d.ts +1 -1
  238. package/dist/components/blocks/commerce/order-timeline/types.d.ts +3 -1
  239. package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
  240. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +0 -8
  241. package/dist/components/blocks/commerce/payment-method/types.d.ts +0 -2
  242. package/dist/components/blocks/commerce/receipt/index.d.ts +1 -1
  243. package/dist/components/blocks/commerce/receipt/receipt-items.d.ts +1 -1
  244. package/dist/components/blocks/commerce/receipt/types.d.ts +10 -0
  245. package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
  246. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +0 -2
  247. package/dist/components/blocks/commerce/refund-status/types.d.ts +0 -2
  248. package/dist/components/blocks/commerce/seo-listing/types.d.ts +7 -0
  249. package/dist/components/blocks/commerce/shared/code-entry.d.ts +39 -0
  250. package/dist/components/blocks/commerce/shared/order-status.d.ts +1 -1
  251. package/dist/components/blocks/commerce/subscription-summary/subscription-summary.d.ts +1 -1
  252. package/dist/components/blocks/commerce/subscription-summary/types.d.ts +10 -1
  253. package/dist/components/blocks/commerce/upcoming-booking/index.d.ts +2 -1
  254. package/dist/components/blocks/commerce/upcoming-booking/types.d.ts +8 -0
  255. package/dist/components/blocks/commerce/upcoming-booking/upcoming-booking.d.ts +2 -2
  256. package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -5
  257. package/dist/components/blocks/commerce/voucher-entry/types.d.ts +6 -3
  258. package/dist/components/blocks/commerce/voucher-entry/voucher-entry.d.ts +1 -1
  259. package/dist/components/blocks/content-block-hooks.d.ts +22 -0
  260. package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +5 -1
  261. package/dist/components/blocks/data-display/dense-info-card/helpers.d.ts +3 -1
  262. package/dist/components/blocks/data-display/dense-info-card/index.d.ts +1 -1
  263. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-classification.d.ts +1 -1
  264. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-dashboard.d.ts +1 -1
  265. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-financial.d.ts +1 -1
  266. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-project.d.ts +1 -1
  267. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-score.d.ts +1 -1
  268. package/dist/components/blocks/data-display/dense-info-card/types.d.ts +12 -5
  269. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +6 -0
  270. package/dist/components/blocks/data-display/index.d.ts +0 -1
  271. package/dist/components/blocks/data-display/relationship-card-frame.d.ts +1 -1
  272. package/dist/components/blocks/onboarding/checklist/checklist.types.d.ts +5 -3
  273. package/dist/components/blocks/planning/task-card.types.d.ts +7 -3
  274. package/dist/components/blocks/timelines/changelog/types.d.ts +2 -2
  275. package/dist/components/blocks/timelines/index.d.ts +2 -2
  276. package/dist/components/blocks/timelines/milestones/types.d.ts +2 -2
  277. package/dist/components/blocks/timelines/shared/timeline.d.ts +6 -0
  278. package/dist/components/blocks/timelines/steps-card/index.d.ts +2 -1
  279. package/dist/components/blocks/timelines/steps-card/steps-card.d.ts +2 -2
  280. package/dist/components/blocks/timelines/steps-card/types.d.ts +13 -1
  281. package/dist/components/features/activities/activities.strings.d.ts +5 -3
  282. package/dist/components/features/activities/activities.types.d.ts +28 -11
  283. package/dist/components/features/activities/hooks/use-activity-feed.d.ts +6 -0
  284. package/dist/components/features/activities/index.d.ts +1 -1
  285. package/dist/components/features/activities/partials/activity-headline.d.ts +5 -0
  286. package/dist/components/features/activities/partials/activity-row.d.ts +12 -13
  287. package/dist/components/features/activities/partials/row-layers.d.ts +7 -0
  288. package/dist/components/features/activities/relative-time.d.ts +18 -0
  289. package/dist/components/features/ai-chat/ai-chat.d.ts +6 -2
  290. package/dist/components/features/ai-chat/ai-chat.strings.d.ts +41 -2
  291. package/dist/components/features/ai-chat/ai-chat.types.d.ts +6 -0
  292. package/dist/components/features/ai-chat/partials/ai-chat-attachments-strip.d.ts +5 -1
  293. package/dist/components/features/ai-chat/partials/ai-chat-prompt-input.d.ts +2 -2
  294. package/dist/components/features/ai-chat/partials/ai-chat-queue.d.ts +3 -1
  295. package/dist/components/features/ai-chat/partials/ai-chat-suggestions-row.d.ts +6 -1
  296. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  297. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +19 -5
  298. package/dist/components/features/appointment-calendar/index.d.ts +1 -1
  299. package/dist/components/features/appointment-calendar/partials/appointment-agenda.d.ts +18 -10
  300. package/dist/components/features/async-preview/async-preview.d.ts +2 -2
  301. package/dist/components/features/async-preview/async-preview.types.d.ts +30 -1
  302. package/dist/components/features/async-preview/preview-trigger-cell.d.ts +7 -2
  303. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  304. package/dist/components/features/combobox/combobox.d.ts +12 -3
  305. package/dist/components/features/combobox/components/error-message.d.ts +3 -1
  306. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -2
  307. package/dist/components/features/combobox/index.d.ts +1 -1
  308. package/dist/components/features/combobox/types.d.ts +47 -45
  309. package/dist/components/features/comments/comments.strings.d.ts +6 -5
  310. package/dist/components/features/comments/comments.types.d.ts +40 -26
  311. package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -1
  312. package/dist/components/features/comments/hooks/use-comments.d.ts +8 -1
  313. package/dist/components/features/data-view/data-view.strings.d.ts +9 -2
  314. package/dist/components/features/data-view/data-view.types.d.ts +15 -2
  315. package/dist/components/features/email-composer/email-html.d.ts +5 -0
  316. package/dist/components/features/email-composer/http.d.ts +2 -0
  317. package/dist/components/features/email-composer/strings.d.ts +17 -2
  318. package/dist/components/features/email-composer/types.d.ts +17 -2
  319. package/dist/components/features/email-composer/use-composer.d.ts +2 -78
  320. package/dist/components/features/event-calendar/event-calendar-day-cell.d.ts +1 -1
  321. package/dist/components/features/event-calendar/event-calendar-event-badge.d.ts +1 -1
  322. package/dist/components/features/event-calendar/event-calendar-header.d.ts +1 -1
  323. package/dist/components/features/event-calendar/event-calendar-legend.d.ts +2 -2
  324. package/dist/components/features/event-calendar/event-calendar.d.ts +1 -1
  325. package/dist/components/features/event-calendar/event-calendar.types.d.ts +126 -21
  326. package/dist/components/features/filters/facets/range-facet.d.ts +13 -8
  327. package/dist/components/features/filters/filter-context.d.ts +9 -0
  328. package/dist/components/features/filters/filters.strings.d.ts +36 -3
  329. package/dist/components/features/filters/filters.types.d.ts +72 -5
  330. package/dist/components/features/filters/hooks/use-filter-draft.d.ts +1 -0
  331. package/dist/components/features/filters/index.d.ts +2 -2
  332. package/dist/components/features/filters/operator-options.d.ts +25 -2
  333. package/dist/components/features/filters/partials/active-filter-item.d.ts +0 -13
  334. package/dist/components/features/filters/partials/async-options-status.d.ts +32 -0
  335. package/dist/components/features/filters/partials/filter-draft-footer.d.ts +11 -0
  336. package/dist/components/features/filters/partials/filter-operator-select.d.ts +4 -2
  337. package/dist/components/features/filters/partials/filter-pill.d.ts +5 -1
  338. package/dist/components/features/filters/partials/filter-tabs.d.ts +2 -1
  339. package/dist/components/features/filters/partials/regular-filter-content.d.ts +1 -1
  340. package/dist/components/features/filters/utils/filter-utils.d.ts +29 -4
  341. package/dist/components/features/global-search/global-search-dialog.d.ts +7 -1
  342. package/dist/components/features/global-search/global-search.d.ts +7 -1
  343. package/dist/components/features/global-search/global-search.strings.d.ts +19 -3
  344. package/dist/components/features/global-search/global-search.types.d.ts +30 -6
  345. package/dist/components/features/global-search/index.d.ts +1 -1
  346. package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +6 -1
  347. package/dist/components/features/global-search/partials/global-search-input.d.ts +2 -0
  348. package/dist/components/features/kanban/index.d.ts +2 -2
  349. package/dist/components/features/kanban/kanban-context.d.ts +4 -0
  350. package/dist/components/features/kanban/kanban-keyboard.d.ts +7 -2
  351. package/dist/components/features/kanban/kanban.d.ts +10 -1
  352. package/dist/components/features/kanban/kanban.strings.d.ts +11 -2
  353. package/dist/components/features/kanban/kanban.types.d.ts +26 -0
  354. package/dist/components/features/map/map.d.ts +4 -0
  355. package/dist/components/features/map/place-autocomplete.d.ts +10 -1
  356. package/dist/components/features/media-library/hooks/use-media-library.d.ts +3 -1
  357. package/dist/components/features/media-library/media-library.d.ts +1 -1
  358. package/dist/components/features/media-library/media-library.strings.d.ts +33 -3
  359. package/dist/components/features/media-library/media-library.types.d.ts +47 -2
  360. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  361. package/dist/components/features/mentions/hooks/use-mentions-search.d.ts +7 -0
  362. package/dist/components/features/mentions/index.d.ts +1 -1
  363. package/dist/components/features/mentions/mentions.strings.d.ts +10 -2
  364. package/dist/components/features/mentions/partials/mention-chip.d.ts +1 -0
  365. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +8 -1
  366. package/dist/components/features/mentions/partials/mention-picker.d.ts +8 -1
  367. package/dist/components/features/mentions/partials/mention-search-error.d.ts +6 -0
  368. package/dist/components/features/mentions/utils/index.d.ts +0 -1
  369. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  370. package/dist/components/features/overlays/dialog.d.ts +1 -1
  371. package/dist/components/features/overlays/drawer.d.ts +1 -1
  372. package/dist/components/features/overlays/index.d.ts +2 -2
  373. package/dist/components/features/overlays/overlays.strings.d.ts +2 -1
  374. package/dist/components/features/overlays/overlays.types.d.ts +27 -10
  375. package/dist/components/features/products/components/index.d.ts +0 -10
  376. package/dist/components/features/products/components/product-contract-overview.d.ts +1 -1
  377. package/dist/components/features/products/components/product-details-card.d.ts +1 -1
  378. package/dist/components/features/products/components/product-operations-card.d.ts +1 -1
  379. package/dist/components/features/products/components/product-option-action-menu.d.ts +1 -1
  380. package/dist/components/features/products/components/product-options-summary.d.ts +1 -1
  381. package/dist/components/features/products/components/product-policies-card.d.ts +1 -1
  382. package/dist/components/features/products/components/product-quote-preview-card.d.ts +1 -1
  383. package/dist/components/features/products/components/product-readiness-card.d.ts +1 -1
  384. package/dist/components/features/products/components/product-structure-card.d.ts +1 -1
  385. package/dist/components/features/products/components/product-variant-action-menu.d.ts +1 -1
  386. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  387. package/dist/components/features/products/components/product-variants-table.d.ts +1 -1
  388. package/dist/components/features/products/partials/product-surface.d.ts +15 -0
  389. package/dist/components/features/products/products.strings.d.ts +8 -0
  390. package/dist/components/features/products/products.types.d.ts +25 -7
  391. package/dist/components/features/questionnaire/questionnaire.types.d.ts +6 -4
  392. package/dist/components/features/resource/index.d.ts +2 -3
  393. package/dist/components/features/resource/resource.d.ts +2 -10
  394. package/dist/components/features/resource/resource.types.d.ts +7 -149
  395. package/dist/components/features/resource-assignment/partials/assignment-surface.d.ts +15 -0
  396. package/dist/components/features/resource-assignment/resource-assignment.strings.d.ts +6 -1
  397. package/dist/components/features/resource-assignment/resource-assignment.types.d.ts +6 -0
  398. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +5 -7
  399. package/dist/components/features/rich-text-editor/partials/html-helpers.d.ts +2 -3
  400. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +6 -2
  401. package/dist/components/features/rich-text-editor/partials/index.d.ts +2 -3
  402. package/dist/components/features/rich-text-editor/partials/rich-text-editor-tiptap.d.ts +0 -1
  403. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +2 -3
  404. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +13 -1
  405. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -0
  406. package/dist/components/features/schema-form/schema-form.d.ts +1 -1
  407. package/dist/components/features/schema-form/schema-form.types.d.ts +13 -5
  408. package/dist/components/features/suggestions/suggestions.strings.d.ts +14 -0
  409. package/dist/components/features/suggestions/suggestions.types.d.ts +12 -4
  410. package/dist/components/features/table/data-table.d.ts +1 -1
  411. package/dist/components/features/table/filter-bar.d.ts +1 -1
  412. package/dist/components/features/table/pagination.d.ts +1 -1
  413. package/dist/components/features/table/partials/cell-value.d.ts +1 -1
  414. package/dist/components/features/table/table-body.d.ts +1 -1
  415. package/dist/components/features/table/table-header.d.ts +1 -1
  416. package/dist/components/features/table/table-helpers.d.ts +31 -9
  417. package/dist/components/features/table/table-region.recipes.d.ts +11 -0
  418. package/dist/components/features/table/table-toolbar.d.ts +1 -1
  419. package/dist/components/features/table/table.strings.d.ts +1 -0
  420. package/dist/components/features/table/table.types.d.ts +74 -48
  421. package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +4 -0
  422. package/dist/components/features/theme-tweaker/theme-tweaker.strings.d.ts +10 -7
  423. package/dist/components/features/theme-tweaker/theme-tweaker.utils.d.ts +17 -0
  424. package/dist/components/layout/app-shell/app-shell.types.d.ts +46 -49
  425. package/dist/components/layout/app-shell/index.d.ts +2 -2
  426. package/dist/components/layout/app-shell/shell-regions.d.ts +9 -0
  427. package/dist/components/layout/app-shell/shell-skip-link.d.ts +9 -0
  428. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  429. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  430. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  431. package/dist/components/layout/auth/auth-shell.d.ts +1 -1
  432. package/dist/components/layout/auth/auth.types.d.ts +0 -5
  433. package/dist/components/layout/containers/inline-gutter-context.d.ts +7 -0
  434. package/dist/components/layout/containers/main-landmark-context.d.ts +6 -0
  435. package/dist/components/layout/header/header.types.d.ts +16 -6
  436. package/dist/components/layout/header/partials/header-global-search-trigger.d.ts +1 -1
  437. package/dist/components/layout/header/partials/header-notifications.d.ts +1 -1
  438. package/dist/components/layout/header/partials/header-search.d.ts +1 -1
  439. package/dist/components/layout/hooks/use-command-shortcut.d.ts +10 -1
  440. package/dist/components/layout/layout.types.d.ts +2 -2
  441. package/dist/components/layout/navigation/breadcrumb-progress/breadcrumb-progress.d.ts +1 -1
  442. package/dist/components/layout/navigation/breadcrumb-progress/types.d.ts +9 -0
  443. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +8 -1
  444. package/dist/components/layout/page/index.d.ts +2 -3
  445. package/dist/components/layout/page/page.strings.d.ts +12 -0
  446. package/dist/components/layout/page/page.types.d.ts +7 -110
  447. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  448. package/dist/components/layout/settings/index.d.ts +1 -1
  449. package/dist/components/layout/settings/settings.d.ts +3 -5
  450. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  451. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  452. package/dist/components/layout/sidebar/components/sidebar-navigation-footer.d.ts +1 -1
  453. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  454. package/dist/components/layout/sidebar/index.d.ts +1 -1
  455. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +15 -7
  456. package/dist/components/layout/sidebar/sidebar.types.d.ts +10 -12
  457. package/dist/components/layout/sidebar/sidebar.utils.d.ts +4 -0
  458. package/dist/components/layout/workspace/workspace.strings.d.ts +2 -2
  459. package/dist/components/layout/workspace/workspace.types.d.ts +13 -7
  460. package/dist/components/primitives/date.d.ts +22 -3
  461. package/dist/components/primitives/file-size.d.ts +8 -2
  462. package/dist/components/primitives/index.d.ts +1 -1
  463. package/dist/components/primitives/initials.d.ts +3 -1
  464. package/dist/components/primitives/link.d.ts +8 -1
  465. package/dist/components/primitives/money.d.ts +1 -1
  466. package/dist/components/primitives/number.d.ts +2 -1
  467. package/dist/components/typography/heading.d.ts +9 -3
  468. package/dist/components/typography/index.d.ts +1 -1
  469. package/dist/components/typography/text-link.d.ts +10 -3
  470. package/dist/components/ui/badge.d.ts +2 -4
  471. package/dist/components/ui/breadcrumb.d.ts +2 -3
  472. package/dist/components/ui/button.d.ts +8 -2
  473. package/dist/components/ui/collapsible.d.ts +1 -4
  474. package/dist/components/ui/command.d.ts +20 -18
  475. package/dist/components/ui/dialog.d.ts +3 -9
  476. package/dist/components/ui/empty.d.ts +2 -2
  477. package/dist/components/ui/input-group.d.ts +3 -3
  478. package/dist/components/ui/item.d.ts +3 -3
  479. package/dist/components/ui/popover.d.ts +3 -7
  480. package/dist/components/ui/sheet.d.ts +4 -12
  481. package/dist/components/ui/sidebar-state.d.ts +6 -1
  482. package/dist/components/ui/sidebar.d.ts +7 -4
  483. package/dist/components/ui/tabs.d.ts +2 -2
  484. package/dist/components/ui/toggle-group.d.ts +3 -3
  485. package/dist/components/ui/toggle.d.ts +2 -2
  486. package/dist/components/ui/tooltip.d.ts +1 -3
  487. package/dist/{containers-CSdc32h9.js → containers-BdfLTP4w.js} +37 -32
  488. package/dist/containers-BdfLTP4w.js.map +1 -0
  489. package/dist/content-block-hooks-Z3iKjqd1.js +17 -0
  490. package/dist/content-block-hooks-Z3iKjqd1.js.map +1 -0
  491. package/dist/{copyable-3fdHfMR3.js → copyable-Bmr14W0d.js} +6 -6
  492. package/dist/{copyable-3fdHfMR3.js.map → copyable-Bmr14W0d.js.map} +1 -1
  493. package/dist/{data-display-Cmj-xZYl.js → data-display-CWe9SOYh.js} +264 -251
  494. package/dist/data-display-CWe9SOYh.js.map +1 -0
  495. package/dist/date-3qsCE1ID.js +209 -0
  496. package/dist/date-3qsCE1ID.js.map +1 -0
  497. package/dist/{date-picker-CyQlFYsP.js → date-picker-D1keJQIG.js} +129 -129
  498. package/dist/date-picker-D1keJQIG.js.map +1 -0
  499. package/dist/date-pickers-D8aJoeHc.js +185 -0
  500. package/dist/date-pickers-D8aJoeHc.js.map +1 -0
  501. package/dist/disclosure-panel-B0HFNZ9x.js.map +1 -1
  502. package/dist/{display-CT_N2a3w.js → display-VlmP1I0i.js} +23 -46
  503. package/dist/display-VlmP1I0i.js.map +1 -0
  504. package/dist/{dropdown-menu-C08iIugv.js → dropdown-menu-B8hjvbkS.js} +9 -9
  505. package/dist/{dropdown-menu-C08iIugv.js.map → dropdown-menu-B8hjvbkS.js.map} +1 -1
  506. package/dist/dropzone-CHBNK3de.js +116 -0
  507. package/dist/dropzone-CHBNK3de.js.map +1 -0
  508. package/dist/features/activities.js +682 -628
  509. package/dist/features/activities.js.map +1 -1
  510. package/dist/features/ai-chat.js +258 -226
  511. package/dist/features/ai-chat.js.map +1 -1
  512. package/dist/features/appointment-calendar.js +436 -340
  513. package/dist/features/appointment-calendar.js.map +1 -1
  514. package/dist/features/async-preview.js +351 -265
  515. package/dist/features/async-preview.js.map +1 -1
  516. package/dist/features/combobox.js +2 -2
  517. package/dist/features/comments.js +1 -1
  518. package/dist/features/data-view.js +212 -151
  519. package/dist/features/data-view.js.map +1 -1
  520. package/dist/features/email-composer/engine.js +1 -1
  521. package/dist/features/email-composer.js +344 -315
  522. package/dist/features/email-composer.js.map +1 -1
  523. package/dist/features/event-calendar.js +504 -355
  524. package/dist/features/event-calendar.js.map +1 -1
  525. package/dist/features/filters.js +2 -2
  526. package/dist/features/global-search.js +250 -206
  527. package/dist/features/global-search.js.map +1 -1
  528. package/dist/features/kanban.js +269 -189
  529. package/dist/features/kanban.js.map +1 -1
  530. package/dist/features/map.js +385 -371
  531. package/dist/features/map.js.map +1 -1
  532. package/dist/features/media-library.js +1571 -1199
  533. package/dist/features/media-library.js.map +1 -1
  534. package/dist/features/mentions.js +2 -2
  535. package/dist/features/overlays.js +2 -2
  536. package/dist/features/products.js +1780 -1691
  537. package/dist/features/products.js.map +1 -1
  538. package/dist/features/questionnaire.js +165 -152
  539. package/dist/features/questionnaire.js.map +1 -1
  540. package/dist/features/resource-assignment.js +223 -191
  541. package/dist/features/resource-assignment.js.map +1 -1
  542. package/dist/features/resource.js +55 -220
  543. package/dist/features/resource.js.map +1 -1
  544. package/dist/features/rich-text-editor.js +3 -3
  545. package/dist/features/schema-form.js +280 -228
  546. package/dist/features/schema-form.js.map +1 -1
  547. package/dist/features/suggestions.js +48 -39
  548. package/dist/features/suggestions.js.map +1 -1
  549. package/dist/features/table.js +2 -2
  550. package/dist/features/theme-tweaker.js +723 -633
  551. package/dist/features/theme-tweaker.js.map +1 -1
  552. package/dist/feedback-DmqmXKLn.js +254 -0
  553. package/dist/feedback-DmqmXKLn.js.map +1 -0
  554. package/dist/{field-affordance-recipes-D6H7tVJi.js → field-affordance-recipes-DfbMadot.js} +13 -9
  555. package/dist/field-affordance-recipes-DfbMadot.js.map +1 -0
  556. package/dist/{field-state-recipes-7sza8QbC.js → field-state-recipes-EtCxpEy3.js} +6 -2
  557. package/dist/field-state-recipes-EtCxpEy3.js.map +1 -0
  558. package/dist/filters-BviMRMLS.js +2692 -0
  559. package/dist/filters-BviMRMLS.js.map +1 -0
  560. package/dist/{focus-recipes-B653VaLq.js → focus-recipes-DSkiUvUp.js} +3 -3
  561. package/dist/focus-recipes-DSkiUvUp.js.map +1 -0
  562. package/dist/{form-field-CAPdwdnZ.js → form-field-BdfCwSoQ.js} +5 -5
  563. package/dist/{form-field-CAPdwdnZ.js.map → form-field-BdfCwSoQ.js.map} +1 -1
  564. package/dist/{form-sizing-CgcrUbLU.js → form-sizing-DE_dZw32.js} +3 -3
  565. package/dist/{form-sizing-CgcrUbLU.js.map → form-sizing-DE_dZw32.js.map} +1 -1
  566. package/dist/{forms-B3W8CH7-.js → forms-B8DzJnBN.js} +35 -35
  567. package/dist/forms-B8DzJnBN.js.map +1 -0
  568. package/dist/forms-numeric-DOBswjKj.js +992 -0
  569. package/dist/forms-numeric-DOBswjKj.js.map +1 -0
  570. package/dist/{header-ZIIsRKxP.js → header-Cq3G0ZRP.js} +100 -95
  571. package/dist/header-Cq3G0ZRP.js.map +1 -0
  572. package/dist/{hooks-BitHSh-Y.js → hooks-DHfeSMAO.js} +34 -14
  573. package/dist/hooks-DHfeSMAO.js.map +1 -0
  574. package/dist/{http-D_6rOnzU.js → http-Cu-GPpss.js} +61 -35
  575. package/dist/http-Cu-GPpss.js.map +1 -0
  576. package/dist/{icon-badge-npxF1SLX.js → icon-badge-B0Kq7wom.js} +3 -3
  577. package/dist/{icon-badge-npxF1SLX.js.map → icon-badge-B0Kq7wom.js.map} +1 -1
  578. package/dist/index.js +6 -6
  579. package/dist/inline-gutter-context-CSqmrMFZ.js +11 -0
  580. package/dist/inline-gutter-context-CSqmrMFZ.js.map +1 -0
  581. package/dist/{input-DIREVYHs.js → input-2YrgTUrz.js} +3 -3
  582. package/dist/{input-DIREVYHs.js.map → input-2YrgTUrz.js.map} +1 -1
  583. package/dist/{input-7KAc7XQL.js → input-DfJyrjoR.js} +6 -6
  584. package/dist/{input-7KAc7XQL.js.map → input-DfJyrjoR.js.map} +1 -1
  585. package/dist/{interaction-recipes-4wZ2tvfb.js → interaction-recipes-DmuS1ase.js} +2 -2
  586. package/dist/{interaction-recipes-4wZ2tvfb.js.map → interaction-recipes-DmuS1ase.js.map} +1 -1
  587. package/dist/item-GJ9mvCcg.js +279 -0
  588. package/dist/item-GJ9mvCcg.js.map +1 -0
  589. package/dist/layout/app-shell.js +1 -1
  590. package/dist/layout/auth.js +1 -1
  591. package/dist/layout/containers.js +1 -1
  592. package/dist/layout/header.js +1 -1
  593. package/dist/layout/hooks.js +1 -1
  594. package/dist/layout/navigation.js +1 -1
  595. package/dist/layout/page.js +2 -2
  596. package/dist/layout/settings.js +2 -2
  597. package/dist/layout/sidebar.js +3 -3
  598. package/dist/layout/workspace.js +1 -1
  599. package/dist/layout.js +12 -12
  600. package/dist/{layout.types-E_GAApzO.js → layout.types-DbtnyAtd.js} +11 -8
  601. package/dist/layout.types-DbtnyAtd.js.map +1 -0
  602. package/dist/lib/anchored-positioning.d.ts +11 -0
  603. package/dist/lib/field-affordance-recipes.d.ts +10 -0
  604. package/dist/lib/field-state-recipes.d.ts +6 -0
  605. package/dist/lib/focus-recipes.d.ts +7 -0
  606. package/dist/lib/format.d.ts +25 -0
  607. package/dist/lib/money-format.d.ts +6 -0
  608. package/dist/lib/motion-recipes.d.ts +6 -0
  609. package/dist/lib/surface-recipes.d.ts +32 -2
  610. package/dist/lib/theme-scope.d.ts +17 -1
  611. package/dist/lib/token-merge.generated.d.ts +13 -19
  612. package/dist/lib/ui-provider/index.d.ts +1 -1
  613. package/dist/lib/ui-provider/types.d.ts +5 -0
  614. package/dist/lib/use-controllable-state.d.ts +16 -0
  615. package/dist/lib/use-copy-feedback.d.ts +15 -0
  616. package/dist/lib/utils.js +1 -1
  617. package/dist/lib/variant-props.d.ts +9 -0
  618. package/dist/main-landmark-context-BAsyqp2I.js +11 -0
  619. package/dist/main-landmark-context-BAsyqp2I.js.map +1 -0
  620. package/dist/mentions-zz0ewNIq.js +670 -0
  621. package/dist/mentions-zz0ewNIq.js.map +1 -0
  622. package/dist/{message-BJHnn43M.js → message-BiiVrRrm.js} +10 -7
  623. package/dist/{message-BJHnn43M.js.map → message-BiiVrRrm.js.map} +1 -1
  624. package/dist/{metadata-list-XkqZ_UXH.js → metadata-list-G85roWjS.js} +13 -12
  625. package/dist/metadata-list-G85roWjS.js.map +1 -0
  626. package/dist/{motion-recipes-DitYv6P2.js → motion-recipes-CUc_aHuG.js} +7 -4
  627. package/dist/motion-recipes-CUc_aHuG.js.map +1 -0
  628. package/dist/navigation-C0Be5C3i.js +304 -0
  629. package/dist/navigation-C0Be5C3i.js.map +1 -0
  630. package/dist/{navigation-Bt-v7rWP.js → navigation-CmqaQR_G.js} +99 -103
  631. package/dist/navigation-CmqaQR_G.js.map +1 -0
  632. package/dist/number-NFWKIoiK.js +340 -0
  633. package/dist/number-NFWKIoiK.js.map +1 -0
  634. package/dist/{overflow-tab-bar-BQCA2Zn2.js → overflow-tab-bar-DV7HE_3t.js} +8 -8
  635. package/dist/{overflow-tab-bar-BQCA2Zn2.js.map → overflow-tab-bar-DV7HE_3t.js.map} +1 -1
  636. package/dist/overlays-D-gAIfPF.js +1018 -0
  637. package/dist/overlays-D-gAIfPF.js.map +1 -0
  638. package/dist/page-D4pQhgSq.js +216 -0
  639. package/dist/page-D4pQhgSq.js.map +1 -0
  640. package/dist/{page-header-commands-DIKspJfx.js → page-header-commands-elelNOfd.js} +29 -29
  641. package/dist/{page-header-commands-DIKspJfx.js.map → page-header-commands-elelNOfd.js.map} +1 -1
  642. package/dist/{pagination-Br8TdV9A.js → pagination-BuSWw1US.js} +22 -23
  643. package/dist/pagination-BuSWw1US.js.map +1 -0
  644. package/dist/{popover-k8TdUcAt.js → popover-BpMxbqEK.js} +73 -69
  645. package/dist/popover-BpMxbqEK.js.map +1 -0
  646. package/dist/{popover-menu-yn-o0kyA.js → popover-menu-CO-_iiuz.js} +7 -7
  647. package/dist/{popover-menu-yn-o0kyA.js.map → popover-menu-CO-_iiuz.js.map} +1 -1
  648. package/dist/{popover.recipes-DJ0AkUan.js → popover.recipes-BqkdvlZn.js} +3 -4
  649. package/dist/{popover.recipes-DJ0AkUan.js.map → popover.recipes-BqkdvlZn.js.map} +1 -1
  650. package/dist/{portal-recipes-DyUXqUtD.js → portal-recipes-BPeS4rGB.js} +2 -2
  651. package/dist/{portal-recipes-DyUXqUtD.js.map → portal-recipes-BPeS4rGB.js.map} +1 -1
  652. package/dist/primitives-BlC1lXBr.js +447 -0
  653. package/dist/primitives-BlC1lXBr.js.map +1 -0
  654. package/dist/primitives.js +4 -4
  655. package/dist/{progress-DZFXXzPs.js → progress-RARK8AjB.js} +5 -5
  656. package/dist/{progress-DZFXXzPs.js.map → progress-RARK8AjB.js.map} +1 -1
  657. package/dist/receipt-CUf2Vegp.js +114 -0
  658. package/dist/receipt-CUf2Vegp.js.map +1 -0
  659. package/dist/{rich-text-BnTzZjIo.js → rich-text-Cypm9__d.js} +7 -8
  660. package/dist/{rich-text-BnTzZjIo.js.map → rich-text-Cypm9__d.js.map} +1 -1
  661. package/dist/rich-text-editor-Z6cQepsA.js +919 -0
  662. package/dist/rich-text-editor-Z6cQepsA.js.map +1 -0
  663. package/dist/rich-text-editor-toolbar-DYbRJARB.js +100 -0
  664. package/dist/rich-text-editor-toolbar-DYbRJARB.js.map +1 -0
  665. package/dist/rich-text-tree-DdKHIJx4.js +154 -0
  666. package/dist/rich-text-tree-DdKHIJx4.js.map +1 -0
  667. package/dist/safe-image-src-C6kQSMBZ.js +17 -0
  668. package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
  669. package/dist/{scroll-area-Bj6CRUif.js → scroll-area-B9HKbji0.js} +3 -3
  670. package/dist/{scroll-area-Bj6CRUif.js.map → scroll-area-B9HKbji0.js.map} +1 -1
  671. package/dist/{separator-DM6gs2vu.js → separator-DaDe26sf.js} +3 -3
  672. package/dist/separator-DaDe26sf.js.map +1 -0
  673. package/dist/{separator-B9ewiCGO.js → separator-KGsNXt2J.js} +2 -2
  674. package/dist/{separator-B9ewiCGO.js.map → separator-KGsNXt2J.js.map} +1 -1
  675. package/dist/services/actions/action-adapters.d.ts +5 -2
  676. package/dist/services/actions/index.d.ts +1 -1
  677. package/dist/services/actions.js +2 -2
  678. package/dist/services/actions.js.map +1 -1
  679. package/dist/settings-D5j_RJvT.js +160 -0
  680. package/dist/settings-D5j_RJvT.js.map +1 -0
  681. package/dist/sheet-B6j_BE9O.js +241 -0
  682. package/dist/sheet-B6j_BE9O.js.map +1 -0
  683. package/dist/{sidebar-CmD6a-HK.js → sidebar-C-iQ_TJP.js} +377 -351
  684. package/dist/sidebar-C-iQ_TJP.js.map +1 -0
  685. package/dist/sidebar-D5VO2W8S.js +715 -0
  686. package/dist/sidebar-D5VO2W8S.js.map +1 -0
  687. package/dist/{skeleton-DDgdhmu9.js → skeleton-Cab_KgVo.js} +12 -12
  688. package/dist/skeleton-Cab_KgVo.js.map +1 -0
  689. package/dist/{smart-card-B6vLxqa_.js → smart-card-C59z6KFO.js} +217 -210
  690. package/dist/smart-card-C59z6KFO.js.map +1 -0
  691. package/dist/{structure-DZJ2wbAU.js → structure-DElaQwwN.js} +2 -2
  692. package/dist/{structure-DZJ2wbAU.js.map → structure-DElaQwwN.js.map} +1 -1
  693. package/dist/style.css +1 -1
  694. package/dist/{surface-recipes-C8mNycaY.js → surface-recipes-DV6rrOFq.js} +10 -2
  695. package/dist/surface-recipes-DV6rrOFq.js.map +1 -0
  696. package/dist/{table-CXSPHH25.js → table-CSRUgpdK.js} +62 -61
  697. package/dist/table-CSRUgpdK.js.map +1 -0
  698. package/dist/table-DdXDBsR_.js +1657 -0
  699. package/dist/table-DdXDBsR_.js.map +1 -0
  700. package/dist/{tabs-C4Kr_hCr.js → tabs-WnHfV2pM.js} +27 -27
  701. package/dist/tabs-WnHfV2pM.js.map +1 -0
  702. package/dist/{text-inputs-jdkS3ReG.js → text-inputs-ljyBYaCd.js} +112 -112
  703. package/dist/text-inputs-ljyBYaCd.js.map +1 -0
  704. package/dist/theme.css +21 -5
  705. package/dist/timelines-mOmS9Eh3.js +479 -0
  706. package/dist/timelines-mOmS9Eh3.js.map +1 -0
  707. package/dist/tooltip-yjX-Uv-p.js +112 -0
  708. package/dist/tooltip-yjX-Uv-p.js.map +1 -0
  709. package/dist/{tree-CeYVzdFE.js → tree-YpkxUG2Z.js} +80 -72
  710. package/dist/tree-YpkxUG2Z.js.map +1 -0
  711. package/dist/typography/rich-text.js +1 -1
  712. package/dist/{typography-C7-YMW1S.js → typography-C0dELqYV.js} +46 -40
  713. package/dist/typography-C0dELqYV.js.map +1 -0
  714. package/dist/typography.js +1 -1
  715. package/dist/{ui-provider-C-74NVLc.js → ui-provider-Bu1S-o96.js} +4 -3
  716. package/dist/ui-provider-Bu1S-o96.js.map +1 -0
  717. package/dist/ui-provider.js +2 -2
  718. package/dist/{upload-Hdm5gObf.js → upload-DMuMYJFT.js} +276 -268
  719. package/dist/upload-DMuMYJFT.js.map +1 -0
  720. package/dist/{usage-card-9s8hLDfn.js → usage-card-DDPki5P1.js} +57 -54
  721. package/dist/usage-card-DDPki5P1.js.map +1 -0
  722. package/dist/use-controllable-state-BlP8SyBI.js +13 -0
  723. package/dist/use-controllable-state-BlP8SyBI.js.map +1 -0
  724. package/dist/use-copy-feedback-CzcaqlLf.js +28 -0
  725. package/dist/use-copy-feedback-CzcaqlLf.js.map +1 -0
  726. package/dist/use-metric-format-options-Dk4rC1NO.js +251 -0
  727. package/dist/use-metric-format-options-Dk4rC1NO.js.map +1 -0
  728. package/dist/{utils-DhuoqFy4.js → utils-BVbAG2J6.js} +98 -76
  729. package/dist/utils-BVbAG2J6.js.map +1 -0
  730. package/dist/value-inputs-h5MwjGCo.js +982 -0
  731. package/dist/value-inputs-h5MwjGCo.js.map +1 -0
  732. package/dist/value-typography-D15uwfj-.js +154 -0
  733. package/dist/value-typography-D15uwfj-.js.map +1 -0
  734. package/dist/workspace-DIryPqBt.js +400 -0
  735. package/dist/workspace-DIryPqBt.js.map +1 -0
  736. package/docs/consumer-skill/SKILL.md +7 -0
  737. package/docs/consumer-skill/agents/themelia-ui-designer.md +11 -2
  738. package/docs/consumer-skill/examples/analytics.tsx +1 -1
  739. package/docs/consumer-skill/examples/app-layout.tsx +3 -3
  740. package/docs/consumer-skill/examples/commerce-lines.tsx +7 -5
  741. package/docs/consumer-skill/examples/detail.tsx +3 -2
  742. package/docs/consumer-skill/examples/email-composer.tsx +1 -1
  743. package/docs/consumer-skill/examples/index-table.tsx +2 -2
  744. package/docs/consumer-skill/examples/scoped-directory.tsx +7 -6
  745. package/docs/consumer-skill/references/agents-md.md +20 -16
  746. package/docs/consumer-skill/references/analytics.md +20 -6
  747. package/docs/consumer-skill/references/building-views.md +213 -0
  748. package/docs/consumer-skill/references/catalogue.md +617 -0
  749. package/docs/consumer-skill/references/component-contracts.json +10202 -18084
  750. package/docs/consumer-skill/references/composition.md +21 -17
  751. package/docs/consumer-skill/references/discovery.md +8 -5
  752. package/docs/consumer-skill/references/installation.md +10 -4
  753. package/docs/consumer-skill/references/integration.md +5 -5
  754. package/docs/consumer-skill/references/product-composition.md +2 -2
  755. package/docs/consumer-skill/references/public-api.json +580 -633
  756. package/docs/consumer-skill/references/review.md +6 -4
  757. package/docs/consumer-skill/references/screen-archetypes.md +2 -2
  758. package/docs/consumer-skill/references/theming.md +1 -1
  759. package/docs/consumer-skill/references/tokens.json +4 -4
  760. package/docs/consumer-skill/references/workflows.md +7 -7
  761. package/docs/consumer-skill/scripts/composition-policy.mjs +40 -20
  762. package/docs/consumer-skill/scripts/composition.mjs +4 -1
  763. package/docs/consumer-skill/scripts/discovery.mjs +3 -1
  764. package/docs/consumer-skill/scripts/setup-skills.mjs +31 -4
  765. package/docs/consumer-skills/themelia-components/SKILL.md +8 -4
  766. package/docs/consumer-skills/themelia-composition/SKILL.md +7 -3
  767. package/docs/consumer-skills/themelia-design/SKILL.md +7 -1
  768. package/docs/consumer-skills/themelia-tokenization/SKILL.md +1 -1
  769. package/package.json +9 -12
  770. package/templates/README.md +3 -2
  771. package/templates/admin-shell-template.tsx +49 -9
  772. package/templates/analytics-operations-template.tsx +20 -24
  773. package/templates/customers-template.tsx +12 -9
  774. package/templates/index.ts +2 -8
  775. package/templates/orders-template.tsx +28 -24
  776. package/templates/products-template.tsx +14 -4
  777. package/templates/user-permissions-template.tsx +11 -14
  778. package/dist/accordion-0tQUZ20r.js.map +0 -1
  779. package/dist/action-menu-C0gjzLyE.js +0 -284
  780. package/dist/action-menu-C0gjzLyE.js.map +0 -1
  781. package/dist/ai-artifact-CGGpQryR.js +0 -1200
  782. package/dist/ai-artifact-CGGpQryR.js.map +0 -1
  783. package/dist/anchored-positioning-DPnKTvNs.js +0 -6
  784. package/dist/anchored-positioning-DPnKTvNs.js.map +0 -1
  785. package/dist/app-shell-EHuuRDGy.js +0 -321
  786. package/dist/app-shell-EHuuRDGy.js.map +0 -1
  787. package/dist/auth-B0girIk_.js.map +0 -1
  788. package/dist/badge-wWauMgAt.js.map +0 -1
  789. package/dist/base/sheet.js +0 -3
  790. package/dist/breadcrumbs-Bp9Ke7kd.js.map +0 -1
  791. package/dist/button-ChBovTx0.js.map +0 -1
  792. package/dist/buttons-DeW0bQeK.js.map +0 -1
  793. package/dist/cascader-CrAl9zD5.js +0 -439
  794. package/dist/cascader-CrAl9zD5.js.map +0 -1
  795. package/dist/choice-inputs-DHGtx0QV.js.map +0 -1
  796. package/dist/code-block-BSJyq9e-.js.map +0 -1
  797. package/dist/collapsible-BzJ91LUG.js +0 -81
  798. package/dist/collapsible-BzJ91LUG.js.map +0 -1
  799. package/dist/combobox-Bcvu5J8O.js +0 -363
  800. package/dist/combobox-Bcvu5J8O.js.map +0 -1
  801. package/dist/combobox-C2JiSQPc.js +0 -915
  802. package/dist/combobox-C2JiSQPc.js.map +0 -1
  803. package/dist/command-9e52NPgK.js +0 -425
  804. package/dist/command-9e52NPgK.js.map +0 -1
  805. package/dist/comments-BsgErEqd.js +0 -1174
  806. package/dist/comments-BsgErEqd.js.map +0 -1
  807. package/dist/components/base/buttons/tooltip-button.d.ts +0 -7
  808. package/dist/components/base/display/content-block.d.ts +0 -75
  809. package/dist/components/base/display/content-block.strings.d.ts +0 -5
  810. package/dist/components/base/sheet/index.d.ts +0 -29
  811. package/dist/components/blocks/ai/use-copy-feedback.d.ts +0 -6
  812. package/dist/components/blocks/data-display/metadata/index.d.ts +0 -30
  813. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +0 -10
  814. package/dist/components/features/resource/resource.strings.d.ts +0 -12
  815. package/dist/components/features/rich-text-editor/partials/rich-text-editor-fallback.d.ts +0 -8
  816. package/dist/components/features/sync/index.d.ts +0 -26
  817. package/dist/components/features/sync/sync-range-dialog-form.d.ts +0 -5
  818. package/dist/components/features/sync/sync.strings.d.ts +0 -18
  819. package/dist/components/features/sync/sync.types.d.ts +0 -44
  820. package/dist/components/layout/page/partials/page-actions.d.ts +0 -3
  821. package/dist/components/ui/slot.d.ts +0 -6
  822. package/dist/containers-CSdc32h9.js.map +0 -1
  823. package/dist/data-display-Cmj-xZYl.js.map +0 -1
  824. package/dist/date-Br0FicVv.js +0 -144
  825. package/dist/date-Br0FicVv.js.map +0 -1
  826. package/dist/date-picker-CyQlFYsP.js.map +0 -1
  827. package/dist/date-pickers-tj2MXmXd.js +0 -185
  828. package/dist/date-pickers-tj2MXmXd.js.map +0 -1
  829. package/dist/display-CT_N2a3w.js.map +0 -1
  830. package/dist/features/sync.js +0 -142
  831. package/dist/features/sync.js.map +0 -1
  832. package/dist/feedback-Dzo1xtAU.js +0 -246
  833. package/dist/feedback-Dzo1xtAU.js.map +0 -1
  834. package/dist/field-affordance-recipes-D6H7tVJi.js.map +0 -1
  835. package/dist/field-state-recipes-7sza8QbC.js.map +0 -1
  836. package/dist/filters-Dl80yYtN.js +0 -2415
  837. package/dist/filters-Dl80yYtN.js.map +0 -1
  838. package/dist/focus-recipes-B653VaLq.js.map +0 -1
  839. package/dist/forms-B3W8CH7-.js.map +0 -1
  840. package/dist/forms-numeric-CwjQJe-O.js +0 -991
  841. package/dist/forms-numeric-CwjQJe-O.js.map +0 -1
  842. package/dist/header-ZIIsRKxP.js.map +0 -1
  843. package/dist/hooks-BitHSh-Y.js.map +0 -1
  844. package/dist/http-D_6rOnzU.js.map +0 -1
  845. package/dist/item-FfWnaYST.js +0 -278
  846. package/dist/item-FfWnaYST.js.map +0 -1
  847. package/dist/layout.types-E_GAApzO.js.map +0 -1
  848. package/dist/media-gallery-C81DAnKI.js +0 -203
  849. package/dist/media-gallery-C81DAnKI.js.map +0 -1
  850. package/dist/mentions-qOnedSt4.js +0 -639
  851. package/dist/mentions-qOnedSt4.js.map +0 -1
  852. package/dist/metadata-list-XkqZ_UXH.js.map +0 -1
  853. package/dist/motion-recipes-DitYv6P2.js.map +0 -1
  854. package/dist/navigation-BgtPJAhi.js +0 -288
  855. package/dist/navigation-BgtPJAhi.js.map +0 -1
  856. package/dist/navigation-Bt-v7rWP.js.map +0 -1
  857. package/dist/number-CYqBcrSj.js +0 -346
  858. package/dist/number-CYqBcrSj.js.map +0 -1
  859. package/dist/overlays-CC8zI3Du.js +0 -1017
  860. package/dist/overlays-CC8zI3Du.js.map +0 -1
  861. package/dist/page-BoQ1VaFJ.js +0 -331
  862. package/dist/page-BoQ1VaFJ.js.map +0 -1
  863. package/dist/pagination-Br8TdV9A.js.map +0 -1
  864. package/dist/popover-k8TdUcAt.js.map +0 -1
  865. package/dist/primitives-BkkQjYl7.js +0 -385
  866. package/dist/primitives-BkkQjYl7.js.map +0 -1
  867. package/dist/receipt-C7LhOg7Q.js +0 -116
  868. package/dist/receipt-C7LhOg7Q.js.map +0 -1
  869. package/dist/rich-text-editor-CAurDwT5.js +0 -1273
  870. package/dist/rich-text-editor-CAurDwT5.js.map +0 -1
  871. package/dist/rich-text-editor-toolbar-DbXig7Jk.js +0 -99
  872. package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +0 -1
  873. package/dist/rich-text-tree-BqyQ_7-R.js +0 -66
  874. package/dist/rich-text-tree-BqyQ_7-R.js.map +0 -1
  875. package/dist/sanitize-html-BWkH4dLM.js +0 -105
  876. package/dist/sanitize-html-BWkH4dLM.js.map +0 -1
  877. package/dist/separator-DM6gs2vu.js.map +0 -1
  878. package/dist/settings-DZPHgpx4.js +0 -155
  879. package/dist/settings-DZPHgpx4.js.map +0 -1
  880. package/dist/sheet-C4DHsgLk.js +0 -250
  881. package/dist/sheet-C4DHsgLk.js.map +0 -1
  882. package/dist/sidebar-C8BnDwTH.js +0 -709
  883. package/dist/sidebar-C8BnDwTH.js.map +0 -1
  884. package/dist/sidebar-CmD6a-HK.js.map +0 -1
  885. package/dist/skeleton-DDgdhmu9.js.map +0 -1
  886. package/dist/slot-CLF9kLrS.js +0 -16
  887. package/dist/slot-CLF9kLrS.js.map +0 -1
  888. package/dist/smart-card-B6vLxqa_.js.map +0 -1
  889. package/dist/surface-recipes-C8mNycaY.js.map +0 -1
  890. package/dist/table-CBonSdTp.js +0 -1584
  891. package/dist/table-CBonSdTp.js.map +0 -1
  892. package/dist/table-CXSPHH25.js.map +0 -1
  893. package/dist/tabs-C4Kr_hCr.js.map +0 -1
  894. package/dist/text-inputs-jdkS3ReG.js.map +0 -1
  895. package/dist/timelines-CoPwdJP0.js +0 -458
  896. package/dist/timelines-CoPwdJP0.js.map +0 -1
  897. package/dist/tooltip-31NwIpTo.js +0 -113
  898. package/dist/tooltip-31NwIpTo.js.map +0 -1
  899. package/dist/tree-CeYVzdFE.js.map +0 -1
  900. package/dist/typography-C7-YMW1S.js.map +0 -1
  901. package/dist/ui-provider-C-74NVLc.js.map +0 -1
  902. package/dist/upload-Hdm5gObf.js.map +0 -1
  903. package/dist/upload-queue-D0sYPuqo.js +0 -409
  904. package/dist/upload-queue-D0sYPuqo.js.map +0 -1
  905. package/dist/usage-card-9s8hLDfn.js.map +0 -1
  906. package/dist/utils-DhuoqFy4.js.map +0 -1
  907. package/dist/value-inputs-D3aPgq9H.js +0 -980
  908. package/dist/value-inputs-D3aPgq9H.js.map +0 -1
  909. package/dist/value-typography-uSzzG9Gf.js +0 -122
  910. package/dist/value-typography-uSzzG9Gf.js.map +0 -1
  911. package/dist/workspace-CC8Vchiu.js +0 -411
  912. package/dist/workspace-CC8Vchiu.js.map +0 -1
@@ -1 +1 @@
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","calendarDayKey","formatISO","date","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","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","addWeeks","addMonths","subWeeks","subMonths","weekStart","weekEnd","locale","isDateMatched","rule","d","datesMatch","predicateMatch","EventCalendar","controlledViewMode","weekStartsOnProp","controlledVisibleCategories","internalVisibleCategories","setInternalVisibleCategories","configWeekStartsOn","configLocale","resolvedLocale","handleToggleCategory","newCategories","id","onVisibleCategoriesChange","calendar","weekdayOrder","gridColumns","handleDayClick","disabledDates","dayData","onDayClick","filteredCalendarDays","filterEvent","hasDisplayedEvents","isDayDisabled","navDisabled","first","last","loading","className","viewModeChangeHandler","toggleCategoryHandler","enableCategoryFilter","showHeader","showLegend","emptyStateMessage","dayHeadingVariant","weekday","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\tformatISO,\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\nfunction calendarDayKey(date: Date): string {\n\treturn formatISO(date, { representation: 'date' });\n}\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 = calendarDayKey(day);\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 = calendarDayKey(day);\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 ?? 'outline';\n\n\treturn (\n\t\t<Button\n\t\t\tkey={key}\n\t\t\ttone={action.tone ?? 'secondary'}\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 === 'week'\n\t\t\t? addWeeks(currentDate, 1)\n\t\t\t: addMonths(currentDate, 1);\n\t\tcommitDate(newDate);\n\t}, [commitDate, currentDate, viewMode]);\n\n\tconst goToPreviousPeriod = useCallback(() => {\n\t\tconst newDate = viewMode === 'week'\n\t\t\t? subWeeks(currentDate, 1)\n\t\t\t: subMonths(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\t// Headings and day placement share one ordered set, including when the\n\t// month-only agenda range starts partway through a week or weekends are hidden.\n\tconst weekdayOrder = useMemo(() => Array.from({ length: 7 }, (_, index) => (weekStartsOn + index) % 7)\n\t\t.filter((day) => showWeekends || (day !== 0 && day !== 6)), [weekStartsOn, showWeekends]);\n\tconst gridColumns = showWeekends ? 'grid-cols-7' : 'grid-cols-5';\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\tconst hasDisplayedEvents = filteredCalendarDays.some((day) => day.events.length > 0);\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{(!hasDisplayedEvents && 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', gridColumns,\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{weekdayOrder.map((weekday, index) => {\n\t\t\t\t\t\t\tconst day = strings.weekdaysShort[weekday];\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={cn('grid', gridColumns)}>\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\tstyle={{ gridColumnStart: weekdayOrder.indexOf(dayData.date.getDay()) + 1 }}\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
+ {"version":3,"file":"event-calendar.js","names":["_Fragment","_Fragment","DateValue","resolveComponentScale","useDatesConfig","useDensityConfig","cn","Text","Heading","focusRecipes","Button","Stack","toneRecipes","dotRecipes","neutralFillRecipes","regionRecipes","LoadingState","ErrorState","compositionClasses","interactionRecipes","DateTime","DatePrimitive","fieldAffordanceRecipes","Select","MonthYearPicker","segmentedControlRecipes","controlGroupHeightClasses","EmptyState","Fragment$1","calendarTokenDot","resolveCategoryColorToken","category","defaultEventCalendarStrings","title","time","EventCalendarEventBadge","dotColor","formatTime","strings","locale","format","date","formatEventLabel","timeDisplay","event","cellTitleRaw","displayTitle","accessibleLabel","disabled","onClick","compact","calendarDayKey","formatISO","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","isSameDay","getCategoryById","categories","cat","categoryId","EventCalendarDayCell","stringsProp","tabIndex","tabStop","data","visibleEvents","maxEvents","hiddenEvents","remainingCount","eventCount","hiddenCategoryIds","countLabel","count","dateLabel","dayLabel","overflowLabel","activate","isCurrentMonth","renderEvent","onEventClick","renderAction","action","index","IconComponent","key","handleClick","buttonStyle","EventCalendarHeader","_rangeMode","size","defaultScale","useStrings","visibleActions","actions","viewModeOptions","displayLabel","output","onDateChange","minDate","maxDate","onToday","todayDisabled","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","addWeeks","addMonths","subWeeks","subMonths","weekStart","weekEnd","dayKey","findDayButton","region","isDateMatched","rule","d","datesMatch","predicateMatch","EventCalendar","controlledViewMode","weekStartsOnProp","controlledVisibleCategories","internalVisibleCategories","setInternalVisibleCategories","configWeekStartsOn","configLocale","resolvedLocale","handleToggleCategory","allIds","shown","next","id","newCategories","onVisibleCategoriesChange","calendar","weekdayOrder","gridColumns","weekdayLabels","weekday","minDay","maxDay","endOfDay","today","isDayDisabled","disabledDates","handleDayClick","dayData","onDayClick","filteredCalendarDays","filterEvent","hasDisplayedEvents","isGrid","gridRef","useRef","stateRef","pendingFocus","ownsFocus","focusedKey","setFocusedKey","visibleKeys","activeKey","candidates","firstEnabled","weeks","rows","handleRegionFocus","handleRegionBlur","handleGridKeyDown","originKey","origin","hidden","step","addDays","direction","week","page","paged","settled","move","target","targetKey","navDisabled","first","last","viewModeChangeHandler","showViewSwitcher","toggleCategoryHandler","enableCategoryFilter","cellStrings","stateRegion","loading","error","isValidElement","replacement","replaced","dropped","pending","button","renderDay","defaultRender","maxEventsPerDay","renderDayCell","frameClassName","weekdayHeadings","dayHeadingVariant","renderDayHeading","dayHeadingClassName","className","showHeader","showLegend","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';\nimport { neutralFillRecipes } from '../../../lib/surface-recipes';\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 * Category colour names. Each name draws the categorical series of its own\n * hue (`--chart-1…8`), so a name looks like what it says in any theme:\n *\n * | Name | Swatch |\n * | --- | --- |\n * | `red` | series 6 |\n * | `orange`, `amber` | series 5: **these two share a swatch** |\n * | `yellow` | series 7 |\n * | `green` | series 8 |\n * | `blue` | series 2 |\n * | `purple` | series 3 |\n * | `gray` | neutral ink |\n *\n * Eight names draw seven swatches. The theme has one series between red and\n * yellow, so use `orange` or `amber` in a legend, not both. Series 1 (which\n * follows the brand colour in derived themes) and series 4 (magenta) have no\n * name here.\n *\n * A colour is a marker: the dot on an event chip, the overflow dot and the\n * legend swatch. It is never a text colour or a chip fill, so event labels\n * keep the chip's readable ink whichever name is used; the light yellow\n * series in particular is too pale to carry text.\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 colour name. Used by day-cell dots and\n * event-badge dots so we never string-parse `category.color`. The mapping and\n * the one shared swatch are documented on `CalendarColorToken`.\n */\nexport const calendarTokenDot: Record<CalendarColorToken, string> = {\n\tgray: neutralFillRecipes.marker,\n\tred: 'bg-chart-6',\n\torange: 'bg-chart-5',\n\tamber: 'bg-chart-5',\n\tyellow: 'bg-chart-7',\n\tgreen: 'bg-chart-8',\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\t/**\n\t * Weekday headings, Sunday first. Without an override the calendar derives\n\t * them from its `locale`; the English defaults apply when there is none.\n\t */\n\tweekdaysShort: [string, string, string, string, string, string, string]; // Sun..Sat\n\t/** Accessible name of the legend's filter group. */\n\tcategoryFilterLabel?: string;\n\t/**\n\t * Accessible name of a day. Receives the date already formatted for the\n\t * locale and the number of events on it. Defaults to the date, followed by\n\t * the count with `booking`/`bookings` when the day has events.\n\t */\n\tformatDayLabel?: (date: string, count: number) => string;\n\t/** Accessible name and tooltip of a timed event: \"Massage at 14:00\". Receives the formatted time. */\n\tformatEventLabel?: (title: string, time: string) => string;\n\t/** Hint under a day's visible events. Defaults to the count with `booking`/`bookings`. */\n\tformatOverflow?: (count: number) => string;\n\t/**\n\t * Start time shown on an event. Defaults to the locale's short time, or a\n\t * 24-hour `HH:mm` when the calendar has no locale.\n\t */\n\tformatTime?: (date: Date) => string;\n\t/**\n\t * Shown in place of the day grid when the visible period has no events\n\t * after the category and runtime filters. Unset by default, so empty days\n\t * stay selectable for creating events; header navigation stays available.\n\t */\n\temptyState?: string;\n\t/** Title of the default error state. */\n\terrorTitle?: string;\n\t/** Description of the default error state, when `error` carries no message. */\n\terrorDescription?: string;\n\t/** Retry command in the default error state. */\n\tretry?: string;\n}\n\n/** The copy that always has an English default, including the keys added after the first release. */\ntype EventCalendarDefaultStrings = EventCalendarStrings\n\t& Required<Pick<EventCalendarStrings, 'categoryFilterLabel' | 'formatEventLabel' | 'errorTitle' | 'errorDescription' | 'retry'>>;\n\nexport const defaultEventCalendarStrings: EventCalendarDefaultStrings = {\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\tcategoryFilterLabel: 'Filter event categories',\n\tformatEventLabel: (title, time) => `${title} at ${time}`,\n\terrorTitle: 'Events unavailable',\n\terrorDescription: 'The events could not be loaded.',\n\tretry: 'Retry',\n};\n\n/** Copy the day cell and its event chips read; every key is optional there. */\nexport type EventCalendarCellStrings = Partial<Pick<EventCalendarStrings, 'booking' | 'bookings' | 'formatDayLabel' | 'formatEventLabel' | 'formatOverflow' | 'formatTime'>>;\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/**\n\t * Shows the Month/Week/Agenda switcher in the header. Defaults to on. A\n\t * controlled `viewMode` without `onViewModeChange` is read-only, so it never\n\t * shows one.\n\t */\n\tshowViewSwitcher?: boolean;\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. Each chip shows or hides its own category. */\n\tenableCategoryFilter?: boolean;\n\t/**\n\t * Category ids currently shown. An empty list shows every category.\n\t * Controlled when paired with the change handler.\n\t */\n\tvisibleCategories?: string[];\n\t/**\n\t * Fired when the legend toggles a category, with the ids left on screen. It\n\t * receives an empty list once every category is shown again, and when the\n\t * last visible category is hidden, since an empty calendar filters nothing.\n\t */\n\tonVisibleCategoriesChange?: (categories: string[]) => void;\n\t/** Replaces the grid with the loading state. The header and legend stay in place. */\n\tloading?: boolean;\n\t/**\n\t * Replaces the grid with the error state. A string or Error becomes its\n\t * description; any other element replaces the default state.\n\t */\n\terror?: ReactNode | Error;\n\t/** Adds Retry to the default error state. */\n\tonRetry?: () => void;\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 day the user can reach, inclusive whatever time it carries. Earlier navigation is disabled. */\n\tminDate?: Date;\n\t/** Latest day the user can reach, inclusive whatever time it carries. Later navigation 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/**\n\t * Per-day-cell renderer override. The month and week grids keep one day in\n\t * the tab order and move between days with the arrow keys; that model lives\n\t * on the built-in cell, so a renderer that drops `defaultRender()` (and its\n\t * date button) takes its days out of it. The output is used as written.\n\t */\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?: EventCalendarCellStrings;\n\t/** Per-event renderer override. */\n\trenderEvent?: RenderEventFn;\n\t/**\n\t * Marks the day and its events as unavailable: they stay focusable and are\n\t * announced as disabled, and activating them does nothing.\n\t */\n\tdisabled?: boolean;\n\t/** date-fns locale for the day's accessible name and its event times. */\n\tlocale?: import('date-fns').Locale;\n\t/**\n\t * Roving focus, set by `EventCalendar` in its month and week grids. `true`\n\t * keeps this day's date button and built-in event chips in the tab order;\n\t * `false` takes them out, though they stay focusable from script and by\n\t * pointer. Omit it and every control is a tab stop. Chips from `renderEvent`\n\t * are left as written.\n\t */\n\ttabStop?: boolean;\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\t/** Announces the chip as unavailable and ignores its activation. It stays focusable. */\n\tdisabled?: boolean;\n\t/** date-fns locale for the start time. */\n\tlocale?: import('date-fns').Locale;\n\t/** Tab order of the chip; `-1` keeps it focusable from script and by pointer only. */\n\ttabIndex?: number;\n\t/** Overrides the chip's accessible name and time format. */\n\tstrings?: Pick<EventCalendarCellStrings, 'formatEventLabel' | 'formatTime'>;\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. An empty list shows every category. */\n\tvisibleCategories?: string[];\n\t/** Fired with the id of the chip that was pressed; the owner works out the next visible set. */\n\tonToggleCategory?: (categoryId: string) => void;\n\t/** Lets the legend toggle category visibility. */\n\tenableFiltering?: boolean;\n\t/** Overrides the legend's own copy. */\n\tstrings?: Pick<EventCalendarStrings, 'categoryFilterLabel'>;\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\t/** Forces the Today control off, for a today outside the navigable range. */\n\ttodayDisabled?: 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\tdefaultEventCalendarStrings,\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\tdisabled = false,\n\tlocale,\n\ttabIndex,\n\tstrings,\n}: EventCalendarEventBadgeProps) {\n\tconst dotColor = calendarTokenDot[resolveCategoryColorToken(category)];\n\n\t// The locale's own clock (12 or 24 hour) when there is one; without a locale\n\t// the calendar has always shown 24-hour times, so that stays the fallback.\n\tconst formatTime = strings?.formatTime ?? ((date: Date) => (locale ? format(date, 'p', { locale }) : format(date, 'HH:mm')));\n\tconst formatEventLabel = strings?.formatEventLabel ?? defaultEventCalendarStrings.formatEventLabel;\n\tconst timeDisplay = !event.allDay ? formatTime(event.startDate) : 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 ? formatEventLabel(displayTitle, 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\tif (!disabled) onClick?.();\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 text-left text-card-foreground',\n\t\t\t\tdisabled ? 'cursor-not-allowed' : 'cursor-pointer',\n\t\t\t)}\n\t\t\ttabIndex={tabIndex}\n\t\t\taria-label={accessibleLabel}\n\t\t\t// Stays focusable so the event is still announced; activation is ignored.\n\t\t\taria-disabled={disabled || undefined}\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\tformatISO,\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\nfunction calendarDayKey(date: Date): string {\n\treturn formatISO(date, { representation: 'date' });\n}\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 = calendarDayKey(day);\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 = calendarDayKey(day);\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 { format } from 'date-fns';\nimport { Text } from '../../typography/text';\nimport { cn } from '../../../lib/utils';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { dotRecipes } from '../../../lib/tone-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\tdisabled = false,\n\tlocale,\n\ttabStop,\n}: EventCalendarDayCellProps) {\n\t// Out of the roving tab order, still focusable from script and by pointer.\n\tconst tabIndex = tabStop === undefined ? undefined : tabStop ? 0 : -1;\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 hiddenEvents = events.slice(maxEvents);\n\tconst remainingCount = Math.max(0, eventCount - maxEvents);\n\t// Colour stands for category, so the overflow dots show what is hidden.\n\tconst hiddenCategoryIds = [...new Set(hiddenEvents.map((event) => event.category))].slice(0, 3);\n\n\tconst countLabel = (count: number) => `${count} ${count === 1 ? strings.booking : strings.bookings}`;\n\tconst dateLabel = format(date, 'PPPP', { locale });\n\tconst dayLabel = stringsProp?.formatDayLabel\n\t\t? stringsProp.formatDayLabel(dateLabel, eventCount)\n\t\t: eventCount === 0 ? dateLabel : `${dateLabel}, ${countLabel(eventCount)}`;\n\tconst overflowLabel = stringsProp?.formatOverflow ? stringsProp.formatOverflow(remainingCount) : countLabel(remainingCount);\n\tconst activate = () => {\n\t\tif (!disabled) onClick();\n\t};\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{/* oxlint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- Pointer-only widening; the day number is the keyboard control. */}\n\t\t\t<div\n\t\t\t\tonClick={activate}\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\tactivate();\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\tdisabled && 'cursor-not-allowed',\n\t\t\t\t\t)}\n\t\t\t\t\ttabIndex={tabIndex}\n\t\t\t\t\taria-label={dayLabel}\n\t\t\t\t\taria-current={isToday ? 'date' : undefined}\n\t\t\t\t\t// Stays focusable so the day is still announced; activation is ignored.\n\t\t\t\t\taria-disabled={disabled || undefined}\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\tdisabled={disabled}\n\t\t\t\t\t\t\t\tlocale={locale}\n\t\t\t\t\t\t\t\ttabIndex={tabStop === false ? -1 : undefined}\n\t\t\t\t\t\t\t\tstrings={stringsProp}\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{hiddenCategoryIds.map((categoryId) => (\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tkey={categoryId}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'event-calendar-day-cell--overflow-dot',\n\t\t\t\t\t\t\t\t\t\t\tdotRecipes.inline,\n\t\t\t\t\t\t\t\t\t\t\t'border border-background',\n\t\t\t\t\t\t\t\t\t\t\tcalendarTokenDot[resolveCategoryColorToken(getCategoryById(categories, categoryId))],\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{overflowLabel}\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 ?? 'outline';\n\n\treturn (\n\t\t<Button\n\t\t\tkey={key}\n\t\t\ttone={action.tone ?? 'secondary'}\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\ttodayDisabled = 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\tdisabled={todayDisabled}\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 *\n * An empty `visibleCategories` means every category is shown, so each chip is\n * pressed. The legend reports the clicked id; the owner works out the next\n * visible set (see `EventCalendar`).\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 { defaultEventCalendarStrings, type EventCalendarLegendProps } from './event-calendar.types';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { dotRecipes } from '../../../lib/tone-recipes';\nimport { neutralFillRecipes } from '../../../lib/surface-recipes';\n\nexport function EventCalendarLegend({\n\tcategories,\n\tvisibleCategories,\n\tonToggleCategory,\n\tenableFiltering = false,\n\tstrings,\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 ? strings?.categoryFilterLabel ?? defaultEventCalendarStrings.categoryFilterLabel : 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\tdotRecipes.marker,\n\t\t\t\t\t\t\t\tisVisible ? colors.swatch : neutralFillRecipes.markerIdle,\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,\n\tviewMode: viewModeProp,\n\tdefaultViewMode = 'month',\n\tonDateChange,\n\tonViewModeChange,\n\tdataOptions = {}\n}: UseEventCalendarProps): UseEventCalendarReturn {\n\tconst [internalDate, setInternalDate] = useState<Date>(() => defaultDate ?? new Date());\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 === 'week'\n\t\t\t? addWeeks(currentDate, 1)\n\t\t\t: addMonths(currentDate, 1);\n\t\tcommitDate(newDate);\n\t}, [commitDate, currentDate, viewMode]);\n\n\tconst goToPreviousPeriod = useCallback(() => {\n\t\tconst newDate = viewMode === 'week'\n\t\t\t? subWeeks(currentDate, 1)\n\t\t\t: subMonths(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 *\n * The header and legend stay mounted while a period loads or after it failed,\n * so navigation keeps keyboard focus; only the grid region changes state.\n *\n * Month and week are an ARIA grid named by the visible period: weekday column\n * headers, one row per week, one cell per day. The grid is one tab stop — the\n * focused day, else the current date, else today, else the first enabled day —\n * followed by that day's event chips. Arrow keys move by a day or a week,\n * Home/End to the week's edges, PageUp/PageDown by a month (a week in week\n * view). Moving past the days on screen asks for that date the way the header\n * does, so a controlled calendar follows only if its parent accepts, and focus\n * lands on the day once it renders. Days outside `minDate`/`maxDate` are never\n * moved onto, hidden weekends are skipped, and disabled days take focus but\n * stay announced as disabled. The agenda is a list of days with no arrow model.\n */\nimport { addDays, addMonths, endOfDay, format, isSameMonth, isWeekend, startOfDay, startOfWeek } from 'date-fns';\nimport { isValidElement, useLayoutEffect, useRef, useState, useMemo, type FocusEvent, type KeyboardEvent, type ReactNode } from 'react';\nimport { ErrorState, LoadingState } from '../../base/feedback';\nimport { EmptyState } from '../../blocks/data-display';\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';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { regionRecipes } from '../../../lib/surface-recipes';\n\n/** A local calendar day, as the grid's `data-day` and the roving focus know it. */\nfunction dayKey(date: Date): string {\n\treturn format(date, 'yyyy-MM-dd');\n}\n\n/** The built-in date button of one day, when that day's cell still draws it. */\nfunction findDayButton(region: HTMLElement | null, key: string): HTMLElement | null {\n\treturn region?.querySelector<HTMLElement>(`[data-day=\"${key}\"] .event-calendar-day-cell--date`) ?? null;\n}\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\terror,\n\tonRetry,\n\tshowViewSwitcher = true,\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\t// An empty list means every category is shown, so a click resolves against\n\t// the categories actually on screen: a pressed chip hides its own category\n\t// and leaves the rest. Showing them all again (or hiding the last one, which\n\t// would leave nothing to look at) returns to the empty \"everything\" list.\n\tconst handleToggleCategory = (categoryId: string) => {\n\t\tconst allIds = categories.map((category) => category.id);\n\t\tconst shown = visibleCategories.length > 0 ? visibleCategories : allIds;\n\t\tconst next = shown.includes(categoryId)\n\t\t\t? shown.filter((id) => id !== categoryId)\n\t\t\t: [...shown, categoryId];\n\t\tconst coversAll = allIds.every((id) => next.includes(id));\n\t\tconst newCategories = coversAll || next.length === 0 ? [] : next;\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\t// Headings and day placement share one ordered set, including when the\n\t// month-only agenda range starts partway through a week or weekends are hidden.\n\tconst weekdayOrder = useMemo(() => Array.from({ length: 7 }, (_, index) => (weekStartsOn + index) % 7)\n\t\t.filter((day) => showWeekends || (day !== 0 && day !== 6)), [weekStartsOn, showWeekends]);\n\tconst gridColumns = showWeekends ? 'grid-cols-7' : 'grid-cols-5';\n\n\t// Headings follow the locale unless the consumer supplied their own. With\n\t// no locale date-fns formats in English, which matches the default strings.\n\tconst weekdayLabels = useMemo(\n\t\t() => stringsProp?.weekdaysShort\n\t\t\t?? (resolvedLocale\n\t\t\t\t// 4 January 1970 was a Sunday, so index 0 is Sunday in every locale.\n\t\t\t\t? Array.from({ length: 7 }, (_, weekday) => format(new Date(1970, 0, 4 + weekday), 'EEE', { locale: resolvedLocale }))\n\t\t\t\t: strings.weekdaysShort),\n\t\t[stringsProp?.weekdaysShort, resolvedLocale, strings.weekdaysShort],\n\t);\n\n\t// The bounds are whole days: a `minDate` at 10:00 still includes its own day.\n\tconst minDay = useMemo(() => (minDate ? startOfDay(minDate) : undefined), [minDate]);\n\tconst maxDay = useMemo(() => (maxDate ? endOfDay(maxDate) : undefined), [maxDate]);\n\tconst [today] = useState(() => startOfDay(new Date()));\n\tconst todayDisabled = (!!minDay && today < minDay) || (!!maxDay && today > maxDay);\n\n\tfunction isDayDisabled(day: Date): boolean {\n\t\tif (isDateMatched(disabledDates, day)) return true;\n\t\tif (minDay && day < minDay) return true;\n\t\tif (maxDay && day > maxDay) return true;\n\t\treturn false;\n\t}\n\n\tconst handleDayClick = (dayData: typeof calendar.calendarDays[0]) => {\n\t\t// Block clicks on disabled or out-of-range dates.\n\t\tif (isDayDisabled(dayData.date)) 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\tconst hasDisplayedEvents = filteredCalendarDays.some((day) => day.events.length > 0);\n\n\t// ── Roving focus (month and week grids) ──────────────────────────────\n\tconst isGrid = calendar.viewMode !== 'agenda';\n\tconst gridRef = useRef<HTMLDivElement>(null);\n\tconst stateRef = useRef<HTMLDivElement>(null);\n\t// The day a keyboard move is heading for while its period is not on screen yet.\n\tconst pendingFocus = useRef<string | null>(null);\n\t// Whether focus was last seen inside the day region; an unmounted control fires no blur.\n\tconst ownsFocus = useRef(false);\n\tconst [focusedKey, setFocusedKey] = useState<string | null>(null);\n\tconst visibleKeys = useMemo(() => new Set(filteredCalendarDays.map((day) => dayKey(day.date))), [filteredCalendarDays]);\n\n\t// The one day in the tab order: where focus last was, else the current\n\t// date, else today, else the first day that can be chosen.\n\tlet activeKey: string | null = null;\n\tif (isGrid) {\n\t\tconst candidates = [focusedKey, dayKey(calendar.currentDate), dayKey(today)];\n\t\tconst firstEnabled = filteredCalendarDays.find((day) => !isDayDisabled(day.date)) ?? filteredCalendarDays[0];\n\t\tactiveKey = candidates.find((key) => !!key && visibleKeys.has(key)) ?? (firstEnabled ? dayKey(firstEnabled.date) : null);\n\t}\n\n\t// One row per week, so each week is a real `row` of the grid.\n\tconst weeks = useMemo(() => {\n\t\tconst rows: Array<typeof filteredCalendarDays> = [];\n\t\tfor (const day of filteredCalendarDays) {\n\t\t\tif (rows.length === 0 || weekdayOrder.indexOf(day.date.getDay()) === 0) rows.push([]);\n\t\t\trows[rows.length - 1].push(day);\n\t\t}\n\t\treturn rows;\n\t}, [filteredCalendarDays, weekdayOrder]);\n\n\tconst handleRegionFocus = (event: FocusEvent<HTMLDivElement>) => {\n\t\townsFocus.current = true;\n\t\t// The day that holds focus — its date or one of its events — is the active day.\n\t\tconst key = (event.target as HTMLElement).closest<HTMLElement>('[data-day]')?.dataset.day;\n\t\tif (key && isGrid) setFocusedKey(key);\n\t};\n\tconst handleRegionBlur = (event: FocusEvent<HTMLDivElement>) => {\n\t\tif (event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget)) return;\n\t\townsFocus.current = false;\n\t\tpendingFocus.current = null;\n\t};\n\n\tconst handleGridKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (!isGrid || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n\t\tconst originKey = (event.target as HTMLElement).closest('.event-calendar-day-cell--date')?.closest<HTMLElement>('[data-day]')?.dataset.day;\n\t\tconst origin = filteredCalendarDays.find((day) => dayKey(day.date) === originKey)?.date;\n\t\tif (!origin) return;\n\n\t\tconst hidden = (day: Date) => !showWeekends && isWeekend(day);\n\t\tconst step = (direction: 1 | -1) => {\n\t\t\tlet next = addDays(origin, direction);\n\t\t\twhile (hidden(next)) next = addDays(next, direction);\n\t\t\treturn next;\n\t\t};\n\t\tconst week = () => Array.from({ length: 7 }, (_, index) => addDays(startOfWeek(origin, { weekStartsOn }), index)).filter((day) => !hidden(day));\n\t\tconst page = (direction: 1 | -1) => {\n\t\t\tif (calendar.viewMode === 'week') return addDays(origin, direction * 7);\n\t\t\tconst paged = addMonths(origin, direction);\n\t\t\tif (!hidden(paged)) return paged;\n\t\t\t// A hidden weekend settles on the Friday before it, or the Monday after when that Friday is another month.\n\t\t\tlet settled = paged;\n\t\t\twhile (hidden(settled)) settled = addDays(settled, -1);\n\t\t\tif (isSameMonth(settled, paged)) return settled;\n\t\t\tsettled = paged;\n\t\t\twhile (hidden(settled)) settled = addDays(settled, 1);\n\t\t\treturn settled;\n\t\t};\n\t\tconst moves: Record<string, () => Date | undefined> = {\n\t\t\tArrowLeft: () => step(-1),\n\t\t\tArrowRight: () => step(1),\n\t\t\tArrowUp: () => addDays(origin, -7),\n\t\t\tArrowDown: () => addDays(origin, 7),\n\t\t\tHome: () => week()[0],\n\t\t\tEnd: () => week().at(-1),\n\t\t\tPageUp: () => page(-1),\n\t\t\tPageDown: () => page(1),\n\t\t};\n\t\tconst move = moves[event.key];\n\t\tif (!move) return;\n\t\tevent.preventDefault();\n\t\tpendingFocus.current = null;\n\t\tconst target = move();\n\t\tif (!target) return;\n\t\tif ((minDay && target < minDay) || (maxDay && target > maxDay)) return;\n\n\t\tconst targetKey = dayKey(target);\n\t\tif (visibleKeys.has(targetKey)) {\n\t\t\tfindDayButton(gridRef.current, targetKey)?.focus();\n\t\t\treturn;\n\t\t}\n\t\t// Past the days on screen: ask for the date as the header does. Focus\n\t\t// follows once the day renders; a parent that refuses leaves it where it is.\n\t\tpendingFocus.current = targetKey;\n\t\tcalendar.setDate(target);\n\t};\n\n\t// Pre-compute prev/next disabled state for the header navigation: a period\n\t// that already shows the bound's own day has nothing further to reach.\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: !!minDay && first <= minDay,\n\t\t\tnext: !!maxDay && endOfDay(last) >= maxDay,\n\t\t};\n\t}, [calendar.calendarDays, minDay, maxDay]);\n\n\t// A controlled view without a change handler is read-only, so a switcher\n\t// there could not switch anything.\n\tconst viewModeChangeHandler = showViewSwitcher && (controlledViewMode === undefined || !!onViewModeChange)\n\t\t? calendar.setViewMode\n\t\t: undefined;\n\tconst toggleCategoryHandler = enableCategoryFilter ? handleToggleCategory : undefined;\n\tconst cellStrings = {\n\t\tbooking: strings.booking,\n\t\tbookings: strings.bookings,\n\t\tformatDayLabel: strings.formatDayLabel,\n\t\tformatEventLabel: strings.formatEventLabel,\n\t\tformatOverflow: strings.formatOverflow,\n\t\tformatTime: strings.formatTime,\n\t};\n\n\tlet stateRegion: ReactNode = null;\n\tif (loading) {\n\t\tstateRegion = (\n\t\t\t<div className=\"event-calendar--loading\" aria-busy=\"true\">\n\t\t\t\t<LoadingState label={strings.loading} />\n\t\t\t</div>\n\t\t);\n\t} else if (error) {\n\t\t// An app's own element replaces the default; a message becomes its description.\n\t\tstateRegion = isValidElement(error) ? error : (\n\t\t\t<ErrorState\n\t\t\t\ttitle={strings.errorTitle}\n\t\t\t\tdescription={error instanceof Error ? error.message : typeof error === 'string' || typeof error === 'number' ? String(error) : strings.errorDescription}\n\t\t\t\tonRetry={onRetry}\n\t\t\t\tretryLabel={strings.retry}\n\t\t\t\tclassName=\"event-calendar--error\"\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst replacement = stateRegion ?? ((!hasDisplayedEvents && strings.emptyState) ? (\n\t\t<EmptyState\n\t\t\ttitle={strings.emptyState}\n\t\t\tdescription={false}\n\t\t\tariaLabel={strings.emptyState}\n\t\t\tborder\n\t\t\tpadding=\"md\"\n\t\t\tclassName=\"event-calendar--empty\"\n\t\t/>\n\t) : null);\n\tconst replaced = replacement !== null;\n\n\t// Keeps keyboard focus inside the calendar when the control that held it\n\t// goes away: a pending day takes it once it is on screen, the loading,\n\t// error or empty region holds it while the days are replaced, and the tab\n\t// stop takes it back otherwise. Focus that left the days is never taken.\n\tuseLayoutEffect(() => {\n\t\tif (!ownsFocus.current) return;\n\t\tconst dropped = !document.activeElement || document.activeElement === document.body;\n\t\tif (replaced) {\n\t\t\tif (dropped) stateRef.current?.focus();\n\t\t\treturn;\n\t\t}\n\t\tconst region = gridRef.current;\n\t\tconst pending = pendingFocus.current;\n\t\tif (pending && visibleKeys.has(pending)) {\n\t\t\tpendingFocus.current = null;\n\t\t\tconst button = findDayButton(region, pending);\n\t\t\tif (button) {\n\t\t\t\tbutton.focus();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (dropped) {\n\t\t\t(region?.querySelector<HTMLElement>('.event-calendar-day-cell--date[tabindex=\"0\"]')\n\t\t\t\t?? region?.querySelector<HTMLElement>('.event-calendar-day-cell--date'))?.focus();\n\t\t}\n\t});\n\n\tconst renderDay = (dayData: (typeof filteredCalendarDays)[number]) => {\n\t\tconst disabled = isDayDisabled(dayData.date);\n\t\tconst key = dayKey(dayData.date);\n\t\tconst defaultRender = () => (\n\t\t\t<EventCalendarDayCell\n\t\t\t\tdata={dayData}\n\t\t\t\tcategories={categories}\n\t\t\t\tmaxEvents={maxEventsPerDay}\n\t\t\t\tonClick={() => handleDayClick(dayData)}\n\t\t\t\tonEventClick={onEventClick ? (event) => { if (!isDayDisabled(dayData.date)) onEventClick(event); } : undefined}\n\t\t\t\tcompact={compact}\n\t\t\t\tstrings={cellStrings}\n\t\t\t\trenderEvent={renderEvent}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tlocale={resolvedLocale}\n\t\t\t\ttabStop={isGrid ? key === activeKey : undefined}\n\t\t\t/>\n\t\t);\n\t\treturn (\n\t\t\t<div\n\t\t\t\tkey={dayData.date.toISOString()}\n\t\t\t\trole={isGrid ? 'gridcell' : 'listitem'}\n\t\t\t\tdata-day={key}\n\t\t\t\tstyle={{ gridColumnStart: weekdayOrder.indexOf(dayData.date.getDay()) + 1 }}\n\t\t\t\tclassName={cn(disabled && 'pointer-events-none opacity-50')}\n\t\t\t\taria-disabled={(isGrid && disabled) || undefined}\n\t\t\t>\n\t\t\t\t{renderDayCell ? renderDayCell(dayData, defaultRender) : defaultRender()}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst frameClassName = 'box-border bg-background text-foreground rounded-surface border border-border';\n\t// Column headers of the grid in month and week; plain labels above the agenda list.\n\tconst weekdayHeadings = (\n\t\t<div\n\t\t\trole={isGrid ? 'row' : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t'grid', gridColumns,\n\t\t\t\tdayHeadingVariant === 'bordered' && 'border-b border-border mb-0',\n\t\t\t\tdayHeadingVariant === 'tinted' && cn(regionRecipes.band, 'rounded-t-surface mb-0 overflow-hidden'),\n\t\t\t\tdayHeadingVariant === 'accent' && cn(toneRecipes.primary.wash, 'rounded-t-surface mb-0 overflow-hidden'),\n\t\t\t\t(dayHeadingVariant === 'default') && 'mb-space-md',\n\t\t\t)}\n\t\t>\n\t\t\t{weekdayOrder.map((weekday, index) => {\n\t\t\t\tconst day = weekdayLabels[weekday];\n\t\t\t\t// Keyed by weekday: narrow labels repeat (\"T\", \"S\").\n\t\t\t\tif (renderDayHeading) {\n\t\t\t\t\treturn <div key={weekday} role={isGrid ? 'columnheader' : undefined}>{renderDayHeading(day, index)}</div>;\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={weekday}\n\t\t\t\t\t\trole={isGrid ? 'columnheader' : undefined}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'text-center h-8 flex items-center justify-center',\n\t\t\t\t\t\t\tdayHeadingClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\tweight={dayHeadingVariant === 'accent' ? 'medium' : 'regular'}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tdayHeadingVariant === 'default' && 'text-muted-foreground',\n\t\t\t\t\t\t\t\tdayHeadingVariant === 'tinted' && 'text-muted-foreground',\n\t\t\t\t\t\t\t\tdayHeadingVariant === 'bordered' && 'text-foreground',\n\t\t\t\t\t\t\t\tdayHeadingVariant === 'accent' && 'text-primary-accent',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\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\ttodayDisabled={todayDisabled}\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\tstrings={{ categoryFilterLabel: strings.categoryFilterLabel }}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{replaced ? (\n\t\t\t\t<div\n\t\t\t\t\tref={stateRef}\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\tonFocus={handleRegionFocus}\n\t\t\t\t\tonBlur={handleRegionBlur}\n\t\t\t\t\tclassName={cn('event-calendar--state rounded-surface outline-none', focusRecipes.edge)}\n\t\t\t\t>\n\t\t\t\t\t{replacement}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\tisGrid ? (\n\t\t\t\t\t// oxlint-disable-next-line jsx-a11y/interactive-supports-focus -- Roving tabindex: focus stays on the day buttons and the grid handles their keys.\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={gridRef}\n\t\t\t\t\t\trole=\"grid\"\n\t\t\t\t\t\taria-label={calendar.displayLabel}\n\t\t\t\t\t\tonKeyDown={handleGridKeyDown}\n\t\t\t\t\t\tonFocus={handleRegionFocus}\n\t\t\t\t\t\tonBlur={handleRegionBlur}\n\t\t\t\t\t\tclassName={frameClassName}\n\t\t\t\t\t>\n\t\t\t\t\t\t{weekdayHeadings}\n\t\t\t\t\t\t{/* Each week is its own grid with the same columns, so it is a real\n\t\t\t\t\t\t `row` element and the days line up exactly as in one grid. */}\n\t\t\t\t\t\t<div className=\"event-calendar--weeks\">\n\t\t\t\t\t\t\t{weeks.map((week) => (\n\t\t\t\t\t\t\t\t<div key={week[0].date.toISOString()} role=\"row\" className={cn('event-calendar--week grid', gridColumns)}>\n\t\t\t\t\t\t\t\t\t{week.map(renderDay)}\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</div>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div ref={gridRef} onFocus={handleRegionFocus} onBlur={handleRegionBlur} className={frameClassName}>\n\t\t\t\t\t\t{weekdayHeadings}\n\t\t\t\t\t\t<div role=\"list\" aria-label={calendar.displayLabel} className={cn('grid', gridColumns)}>\n\t\t\t\t\t\t\t{filteredCalendarDays.map(renderDay)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)\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-Dl80yYtN.js";
3
- export { g as ActiveFilterItem, A as AsyncSelectFacet, P as DateFacet, m as FilterErrorBoundary, _ as FilterLayout, c as FilterOperatorEnum, f as FilterOperatorSelect, k as FilterPill, E as FilterPopoverContent, F as FilterProvider, v as FilterTabs, u as FilterType, I as FilterValueDisplay, y as FiltersButton, b as RangeFacet, N as SearchFacet, T as SearchFiltersList, S as SelectFacet, x 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, h as mergeFilterQuery, O as parseFiltersFromQuery, M as predicateValidator, j as serializeFiltersToQuery, L as useAsyncOptions, t as useFilterGroups, p as useFilters, D as zodValidator };
2
+ import { A as e, B as t, C as n, D as r, E as i, F as a, H as o, I as s, L as c, M as l, N as u, O as d, P as f, R as p, S as m, T as h, V as g, _, a as v, b as y, c as b, d as x, f as S, g as C, h as w, i as T, j as E, k as D, l as O, m as k, n as A, o as j, p as M, r as N, s as P, t as F, u as I, v as L, w as R, x as z, y as B, z as V } from "../filters-BviMRMLS.js";
3
+ export { y as ActiveFilterItem, N as AsyncSelectFacet, L as DateFacet, _ as FilterErrorBoundary, b as FilterLayout, c as FilterOperatorEnum, m as FilterOperatorSelect, M as FilterPill, k as FilterPopoverContent, R as FilterProvider, x as FilterTabs, p as FilterType, z as FilterValueDisplay, S as FiltersButton, C as RangeFacet, I as SearchFacet, O as SearchFiltersList, T as SelectFacet, w as TagsFacet, t as defaultFilterStrings, V as defineAsyncSelectConfig, i as getBooleanOperators, r as getDateOperators, d as getDefaultOperatorForType, g as getFilterString, D as getMultiSelectOperators, e as getNumberOperators, E as getOperatorLabel, l as getOperatorsForFilter, u as getOperatorsForType, f as getSelectOperators, a as getTextOperators, o as interpolateFilterString, v as mergeFilterQuery, j as parseFiltersFromQuery, F as predicateValidator, s as resolveDefaultOperator, P as serializeFiltersToQuery, B as useAsyncOptions, n as useFilterGroups, h as useFilters, A as zodValidator };