@signalflare-ai/ui 1.0.0 → 1.2.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 (300) hide show
  1. package/CHANGELOG.md +37 -4
  2. package/README.md +1 -1
  3. package/ai/component-registry.json +1047 -183
  4. package/ai/component-registry.md +4241 -50
  5. package/ai/schemas.ts +99 -502
  6. package/dist/.build-complete +1 -1
  7. package/dist/ai/schemas.d.ts +76 -58
  8. package/dist/ai/schemas.d.ts.map +1 -1
  9. package/dist/{ai-actions-DSVeQn4e.js → ai-actions-BdUZI3Gk.js} +3 -3
  10. package/dist/{ai-actions-DSVeQn4e.js.map → ai-actions-BdUZI3Gk.js.map} +1 -1
  11. package/dist/{ai-agent-card-BXHwhWAU.js → ai-agent-card-BR2NIYhi.js} +1 -1
  12. package/dist/{ai-agent-card-BXHwhWAU.js.map → ai-agent-card-BR2NIYhi.js.map} +1 -1
  13. package/dist/{ai-approval-aa0qvjFN.js → ai-approval-Ba7mrKba.js} +2 -2
  14. package/dist/{ai-approval-aa0qvjFN.js.map → ai-approval-Ba7mrKba.js.map} +1 -1
  15. package/dist/{ai-code-block-BgtIxtZZ.js → ai-code-block-CZtoL73R.js} +3 -3
  16. package/dist/{ai-code-block-BgtIxtZZ.js.map → ai-code-block-CZtoL73R.js.map} +1 -1
  17. package/dist/ai-conversation-Cc7WlaBg.js +242 -0
  18. package/dist/ai-conversation-Cc7WlaBg.js.map +1 -0
  19. package/dist/{ai-info-banner-uFxHHwBA.js → ai-info-banner-C7EWPBj7.js} +7 -3
  20. package/dist/ai-info-banner-C7EWPBj7.js.map +1 -0
  21. package/dist/{ai-message-BjnFznXy.js → ai-message-Bp7L68U_.js} +27 -8
  22. package/dist/ai-message-Bp7L68U_.js.map +1 -0
  23. package/dist/{ai-mission-header-08__gULL.js → ai-mission-header-TiCJfTNt.js} +1 -1
  24. package/dist/{ai-mission-header-08__gULL.js.map → ai-mission-header-TiCJfTNt.js.map} +1 -1
  25. package/dist/{ai-part-group-DBtgTgAn.js → ai-part-group-DNb9I446.js} +3 -3
  26. package/dist/{ai-part-group-DBtgTgAn.js.map → ai-part-group-DNb9I446.js.map} +1 -1
  27. package/dist/{ai-prompt-input-Dy1LfxPk.js → ai-prompt-input-BVvov_KF.js} +467 -25
  28. package/dist/ai-prompt-input-BVvov_KF.js.map +1 -0
  29. package/dist/{ai-question-CHHoDJMg.js → ai-question-GPPMk7YM.js} +2 -2
  30. package/dist/{ai-question-CHHoDJMg.js.map → ai-question-GPPMk7YM.js.map} +1 -1
  31. package/dist/{ai-reasoning-CnL6ZSr5.js → ai-reasoning-_feFjk56.js} +2 -2
  32. package/dist/{ai-reasoning-CnL6ZSr5.js.map → ai-reasoning-_feFjk56.js.map} +1 -1
  33. package/dist/{ai-response-BEUg3xvd.js → ai-response-CvjV3WhV.js} +8 -3
  34. package/dist/ai-response-CvjV3WhV.js.map +1 -0
  35. package/dist/{ai-shimmer-By5_L05p.js → ai-shimmer-j6lKIrjj.js} +1 -1
  36. package/dist/{ai-shimmer-By5_L05p.js.map → ai-shimmer-j6lKIrjj.js.map} +1 -1
  37. package/dist/{ai-status-badge-BGYGWYF6.js → ai-status-badge-CSU_QOdz.js} +1 -1
  38. package/dist/{ai-status-badge-BGYGWYF6.js.map → ai-status-badge-CSU_QOdz.js.map} +1 -1
  39. package/dist/{ai-streaming-text-CMfoThV0.js → ai-streaming-text-IWW1BhvZ.js} +44 -16
  40. package/dist/ai-streaming-text-IWW1BhvZ.js.map +1 -0
  41. package/dist/{ai-subagent-DcPRqkAA.js → ai-subagent-JA4iIMW3.js} +13 -5
  42. package/dist/ai-subagent-JA4iIMW3.js.map +1 -0
  43. package/dist/{ai-suggestion-MgeCg5Ar.js → ai-suggestion-BdO6MBuH.js} +2 -2
  44. package/dist/{ai-suggestion-MgeCg5Ar.js.map → ai-suggestion-BdO6MBuH.js.map} +1 -1
  45. package/dist/{ai-task-list-Da9zIm00.js → ai-task-list-DYw4R1FA.js} +12 -5
  46. package/dist/ai-task-list-DYw4R1FA.js.map +1 -0
  47. package/dist/{ai-timeline-Cwu045IR.js → ai-timeline-C42tOUT8.js} +1 -1
  48. package/dist/{ai-timeline-Cwu045IR.js.map → ai-timeline-C42tOUT8.js.map} +1 -1
  49. package/dist/{ai-tool-Cn1O4xjP.js → ai-tool-03jOTwUI.js} +23 -10
  50. package/dist/ai-tool-03jOTwUI.js.map +1 -0
  51. package/dist/{ai-usage-bar-DjS12DMp.js → ai-usage-bar-BRf5LC_b.js} +1 -1
  52. package/dist/{ai-usage-bar-DjS12DMp.js.map → ai-usage-bar-BRf5LC_b.js.map} +1 -1
  53. package/dist/{badge-D_eaA6wv.js → badge-BheXjMc8.js} +2 -2
  54. package/dist/{badge-D_eaA6wv.js.map → badge-BheXjMc8.js.map} +1 -1
  55. package/dist/{banner-B_6oBrsu.js → banner-CcsjunJg.js} +7 -2
  56. package/dist/banner-CcsjunJg.js.map +1 -0
  57. package/dist/{breadcrumbs-BlmeYfgq.js → breadcrumbs-CouSyy3H.js} +3 -3
  58. package/dist/{breadcrumbs-BlmeYfgq.js.map → breadcrumbs-CouSyy3H.js.map} +1 -1
  59. package/dist/{button-De0267YU.js → button-CO6-qPax.js} +1 -1
  60. package/dist/{button-De0267YU.js.map → button-CO6-qPax.js.map} +1 -1
  61. package/dist/catalog.js +1 -1
  62. package/dist/{chart-BK3sVPnD.js → chart-Dg0qUeSc.js} +2 -2
  63. package/dist/{chart-BK3sVPnD.js.map → chart-Dg0qUeSc.js.map} +1 -1
  64. package/dist/{checkbox-DYhUmZNw.js → checkbox-D7p4QKsC.js} +2 -2
  65. package/dist/{checkbox-DYhUmZNw.js.map → checkbox-D7p4QKsC.js.map} +1 -1
  66. package/dist/{clipboard-text-ssybngLw.js → clipboard-text-kLaMogs3.js} +3 -3
  67. package/dist/{clipboard-text-ssybngLw.js.map → clipboard-text-kLaMogs3.js.map} +1 -1
  68. package/dist/{code-Cx-QSoOT.js → code-BN8InC0G.js} +2 -2
  69. package/dist/{code-Cx-QSoOT.js.map → code-BN8InC0G.js.map} +1 -1
  70. package/dist/{collapsible-DWsXeXmS.js → collapsible-D_ueZ0jz.js} +1 -1
  71. package/dist/{collapsible-DWsXeXmS.js.map → collapsible-D_ueZ0jz.js.map} +1 -1
  72. package/dist/{combobox-C0iW6a0r.js → combobox-B7TOK0U2.js} +3 -3
  73. package/dist/{combobox-C0iW6a0r.js.map → combobox-B7TOK0U2.js.map} +1 -1
  74. package/dist/{command-palette-DGzioeki.js → command-palette-CuNUyJca.js} +2 -2
  75. package/dist/{command-palette-DGzioeki.js.map → command-palette-CuNUyJca.js.map} +1 -1
  76. package/dist/components/ai-actions.js +1 -1
  77. package/dist/components/ai-agent-card.js +1 -1
  78. package/dist/components/ai-approval.js +1 -1
  79. package/dist/components/ai-code-block.js +1 -1
  80. package/dist/components/ai-conversation.js +2 -2
  81. package/dist/components/ai-info-banner.js +1 -1
  82. package/dist/components/ai-message.js +1 -1
  83. package/dist/components/ai-mission-header.js +1 -1
  84. package/dist/components/ai-part-group.js +1 -1
  85. package/dist/components/ai-prompt-input.js +2 -2
  86. package/dist/components/ai-question.js +1 -1
  87. package/dist/components/ai-reasoning.js +1 -1
  88. package/dist/components/ai-response.js +1 -1
  89. package/dist/components/ai-shimmer.js +1 -1
  90. package/dist/components/ai-status-badge.js +1 -1
  91. package/dist/components/ai-streaming-text.js +2 -2
  92. package/dist/components/ai-subagent.js +1 -1
  93. package/dist/components/ai-suggestion.js +1 -1
  94. package/dist/components/ai-task-list.js +1 -1
  95. package/dist/components/ai-timeline.js +1 -1
  96. package/dist/components/ai-tool.js +1 -1
  97. package/dist/components/ai-usage-bar.js +1 -1
  98. package/dist/components/badge.js +1 -1
  99. package/dist/components/banner.js +1 -1
  100. package/dist/components/breadcrumbs.js +1 -1
  101. package/dist/components/button.js +1 -1
  102. package/dist/components/chart.js +2 -2
  103. package/dist/components/checkbox.js +1 -1
  104. package/dist/components/clipboard-text.js +1 -1
  105. package/dist/components/code.js +1 -1
  106. package/dist/components/collapsible.js +1 -1
  107. package/dist/components/combobox.js +1 -1
  108. package/dist/components/command-palette.js +1 -1
  109. package/dist/components/data-grid.js +1 -1
  110. package/dist/components/date-picker.js +1 -1
  111. package/dist/components/date-range-picker.js +1 -1
  112. package/dist/components/dialog.js +1 -1
  113. package/dist/components/dropdown.js +1 -1
  114. package/dist/components/empty.js +1 -1
  115. package/dist/components/field.js +1 -1
  116. package/dist/components/filters.js +1 -1
  117. package/dist/components/flow.js +1 -1
  118. package/dist/components/grid.js +1 -1
  119. package/dist/components/input.js +2 -2
  120. package/dist/components/label.js +1 -1
  121. package/dist/components/layer-card.js +1 -1
  122. package/dist/components/loader.js +1 -1
  123. package/dist/components/menubar.js +1 -1
  124. package/dist/components/meter.js +1 -1
  125. package/dist/components/pagination.js +1 -1
  126. package/dist/components/popover.js +1 -1
  127. package/dist/components/radio.js +1 -1
  128. package/dist/components/select.js +1 -1
  129. package/dist/components/sensitive-input.js +1 -1
  130. package/dist/components/sidebar.js +1 -1
  131. package/dist/components/signalflare-ai-logo.js +1 -1
  132. package/dist/components/sparkline.js +1 -1
  133. package/dist/components/stat-card.js +1 -1
  134. package/dist/components/surface.js +1 -1
  135. package/dist/components/switch.js +1 -1
  136. package/dist/components/table.js +1 -1
  137. package/dist/components/tabs.js +1 -1
  138. package/dist/components/text-roll.js +1 -1
  139. package/dist/components/text.js +1 -1
  140. package/dist/components/theme-toggle.js +1 -1
  141. package/dist/components/toast.js +1 -1
  142. package/dist/components/tooltip.js +1 -1
  143. package/dist/components/use-agent-harness.js +1 -1
  144. package/dist/{data-grid-CG76N_hK.js → data-grid-DGHmU0w3.js} +8 -8
  145. package/dist/{data-grid-CG76N_hK.js.map → data-grid-DGHmU0w3.js.map} +1 -1
  146. package/dist/{date-picker-Dqg9L4xu.js → date-picker--ox89RBy.js} +1 -1
  147. package/dist/{date-picker-Dqg9L4xu.js.map → date-picker--ox89RBy.js.map} +1 -1
  148. package/dist/{date-range-picker-D75LLINc.js → date-range-picker-DVa7QBqE.js} +1 -1
  149. package/dist/{date-range-picker-D75LLINc.js.map → date-range-picker-DVa7QBqE.js.map} +1 -1
  150. package/dist/{dialog-CyHEQXEY.js → dialog-Bv1oSFOd.js} +2 -2
  151. package/dist/{dialog-CyHEQXEY.js.map → dialog-Bv1oSFOd.js.map} +1 -1
  152. package/dist/{dist-1-gcEL2L.js → dist-B6iWiWwp.js} +25 -25
  153. package/dist/{dist-1-gcEL2L.js.map → dist-B6iWiWwp.js.map} +1 -1
  154. package/dist/{dropdown-qnEYRFXZ.js → dropdown-B_nrGXjV.js} +2 -2
  155. package/dist/{dropdown-qnEYRFXZ.js.map → dropdown-B_nrGXjV.js.map} +1 -1
  156. package/dist/{echart-DURZEyai.js → echart-CdOUaT-r.js} +1 -1
  157. package/dist/{echart-DURZEyai.js.map → echart-CdOUaT-r.js.map} +1 -1
  158. package/dist/{empty-D2TypIId.js → empty-DZnN0zKX.js} +11 -6
  159. package/dist/empty-DZnN0zKX.js.map +1 -0
  160. package/dist/{field-Y_UK1_Cg.js → field-B_yVof52.js} +2 -2
  161. package/dist/{field-Y_UK1_Cg.js.map → field-B_yVof52.js.map} +1 -1
  162. package/dist/{filters-Bw_U6ZTx.js → filters-cpJCY21R.js} +7 -7
  163. package/dist/{filters-Bw_U6ZTx.js.map → filters-cpJCY21R.js.map} +1 -1
  164. package/dist/{flow-BRsYUCJa.js → flow-B4v198ot.js} +1 -1
  165. package/dist/{flow-BRsYUCJa.js.map → flow-B4v198ot.js.map} +1 -1
  166. package/dist/genui.js +1 -1
  167. package/dist/{grid-qUAN9hFx.js → grid-CEd64Lnh.js} +1 -1
  168. package/dist/{grid-qUAN9hFx.js.map → grid-CEd64Lnh.js.map} +1 -1
  169. package/dist/{highlight-to-react-ClEfL81q.js → highlight-to-react-D0Yav4jk.js} +1 -1
  170. package/dist/{highlight-to-react-ClEfL81q.js.map → highlight-to-react-D0Yav4jk.js.map} +1 -1
  171. package/dist/index.js +69 -69
  172. package/dist/{input-DXYUjGgD.js → input-B2bbijRh.js} +2 -2
  173. package/dist/{input-DXYUjGgD.js.map → input-B2bbijRh.js.map} +1 -1
  174. package/dist/{input-DddtBN-g.js → input-ClB_E4Lb.js} +4 -4
  175. package/dist/{input-DddtBN-g.js.map → input-ClB_E4Lb.js.map} +1 -1
  176. package/dist/{label-QtJxtJ4u.js → label-DUv_urO1.js} +2 -2
  177. package/dist/{label-QtJxtJ4u.js.map → label-DUv_urO1.js.map} +1 -1
  178. package/dist/{layer-card-BME0eljh.js → layer-card-BK7eYfwn.js} +1 -1
  179. package/dist/{layer-card-BME0eljh.js.map → layer-card-BK7eYfwn.js.map} +1 -1
  180. package/dist/layout-DJHMMap2.js +6103 -0
  181. package/dist/layout-DJHMMap2.js.map +1 -0
  182. package/dist/measured-text-BI3dTJmH.js +290 -0
  183. package/dist/measured-text-BI3dTJmH.js.map +1 -0
  184. package/dist/{menubar-C8NzAjfd.js → menubar-Cxf3xeAt.js} +2 -2
  185. package/dist/{menubar-C8NzAjfd.js.map → menubar-Cxf3xeAt.js.map} +1 -1
  186. package/dist/{meter-CpmTenEr.js → meter-BFFe9l5b.js} +1 -1
  187. package/dist/{meter-CpmTenEr.js.map → meter-BFFe9l5b.js.map} +1 -1
  188. package/dist/{pagination-BVqdlONY.js → pagination-yS372Tr4.js} +2 -2
  189. package/dist/{pagination-BVqdlONY.js.map → pagination-yS372Tr4.js.map} +1 -1
  190. package/dist/{popover-BRQZ2b6z.js → popover-SRoJaCZr.js} +1 -1
  191. package/dist/{popover-BRQZ2b6z.js.map → popover-SRoJaCZr.js.map} +1 -1
  192. package/dist/{radio-BNSwOt3B.js → radio-BcwhwYNB.js} +1 -1
  193. package/dist/{radio-BNSwOt3B.js.map → radio-BcwhwYNB.js.map} +1 -1
  194. package/dist/{select-1w2aebGQ.js → select-DMhdoHMa.js} +4 -4
  195. package/dist/{select-1w2aebGQ.js.map → select-DMhdoHMa.js.map} +1 -1
  196. package/dist/{sensitive-input-82Cez3vj.js → sensitive-input-CJUpIRal.js} +3 -3
  197. package/dist/{sensitive-input-82Cez3vj.js.map → sensitive-input-CJUpIRal.js.map} +1 -1
  198. package/dist/{sidebar-CAsCmSpM.js → sidebar-D4zrlYpn.js} +2 -2
  199. package/dist/{sidebar-CAsCmSpM.js.map → sidebar-D4zrlYpn.js.map} +1 -1
  200. package/dist/{signalflare-ai-logo-DDhxMJD6.js → signalflare-ai-logo-Bipogceq.js} +1 -1
  201. package/dist/{signalflare-ai-logo-DDhxMJD6.js.map → signalflare-ai-logo-Bipogceq.js.map} +1 -1
  202. package/dist/{skeleton-line-Do3UmGk9.js → skeleton-line-CH1-h6e2.js} +1 -1
  203. package/dist/{skeleton-line-Do3UmGk9.js.map → skeleton-line-CH1-h6e2.js.map} +1 -1
  204. package/dist/{sparkline-DdbeM4Ai.js → sparkline-DHmgj1d0.js} +2 -2
  205. package/dist/{sparkline-DdbeM4Ai.js.map → sparkline-DHmgj1d0.js.map} +1 -1
  206. package/dist/src/blocks/agent-harness/agent-harness.d.ts.map +1 -1
  207. package/dist/src/blocks/agent-harness/agent-harness.tsx +29 -5
  208. package/dist/src/components/ai-conversation/ai-conversation.d.ts +69 -37
  209. package/dist/src/components/ai-conversation/ai-conversation.d.ts.map +1 -1
  210. package/dist/src/components/ai-conversation/index.d.ts +2 -1
  211. package/dist/src/components/ai-conversation/index.d.ts.map +1 -1
  212. package/dist/src/components/ai-conversation/measurement-constants.d.ts +30 -0
  213. package/dist/src/components/ai-conversation/measurement-constants.d.ts.map +1 -0
  214. package/dist/src/components/ai-info-banner/ai-info-banner.d.ts.map +1 -1
  215. package/dist/src/components/ai-message/ai-message.d.ts +3 -0
  216. package/dist/src/components/ai-message/ai-message.d.ts.map +1 -1
  217. package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts +58 -4
  218. package/dist/src/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  219. package/dist/src/components/ai-prompt-input/controller.d.ts +10 -2
  220. package/dist/src/components/ai-prompt-input/controller.d.ts.map +1 -1
  221. package/dist/src/components/ai-prompt-input/index.d.ts +2 -2
  222. package/dist/src/components/ai-prompt-input/index.d.ts.map +1 -1
  223. package/dist/src/components/ai-prompt-input/types.d.ts +16 -0
  224. package/dist/src/components/ai-prompt-input/types.d.ts.map +1 -1
  225. package/dist/src/components/ai-response/ai-response.d.ts +12 -1
  226. package/dist/src/components/ai-response/ai-response.d.ts.map +1 -1
  227. package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts +27 -0
  228. package/dist/src/components/ai-streaming-text/ai-streaming-text.d.ts.map +1 -1
  229. package/dist/src/components/ai-streaming-text/index.d.ts +1 -1
  230. package/dist/src/components/ai-streaming-text/index.d.ts.map +1 -1
  231. package/dist/src/components/ai-subagent/ai-subagent.d.ts.map +1 -1
  232. package/dist/src/components/ai-task-list/ai-task-list.d.ts.map +1 -1
  233. package/dist/src/components/ai-tool/ai-tool.d.ts.map +1 -1
  234. package/dist/src/components/banner/banner.d.ts.map +1 -1
  235. package/dist/src/components/empty/empty.d.ts.map +1 -1
  236. package/dist/src/components/stat-card/stat-card.d.ts +5 -0
  237. package/dist/src/components/stat-card/stat-card.d.ts.map +1 -1
  238. package/dist/src/components/text/text.d.ts +35 -1
  239. package/dist/src/components/text/text.d.ts.map +1 -1
  240. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  241. package/dist/src/index.d.ts +3 -3
  242. package/dist/src/index.d.ts.map +1 -1
  243. package/dist/src/utils/index.d.ts +2 -0
  244. package/dist/src/utils/index.d.ts.map +1 -1
  245. package/dist/src/utils/measured-text.d.ts +40 -0
  246. package/dist/src/utils/measured-text.d.ts.map +1 -0
  247. package/dist/src/utils/use-measured-text.d.ts +59 -0
  248. package/dist/src/utils/use-measured-text.d.ts.map +1 -0
  249. package/dist/{stat-card-CEZscNh8.js → stat-card-Ew-ofzEm.js} +28 -10
  250. package/dist/stat-card-Ew-ofzEm.js.map +1 -0
  251. package/dist/styles/sf-binding.css +9 -1
  252. package/dist/styles/sf-standalone.css +2 -2
  253. package/dist/styles/shadcn.css +1 -1
  254. package/dist/styles/theme-fedramp.css +12 -3
  255. package/dist/styles/theme-minimal.css +104 -26
  256. package/dist/styles/theme-sf.css +138 -39
  257. package/dist/styles/theme-vesper.css +91 -0
  258. package/dist/{surface-BduI7Ehl.js → surface-DGwRlC0o.js} +1 -1
  259. package/dist/{surface-BduI7Ehl.js.map → surface-DGwRlC0o.js.map} +1 -1
  260. package/dist/{switch-CzZBRBL7.js → switch-BxAMfHdt.js} +2 -2
  261. package/dist/{switch-CzZBRBL7.js.map → switch-BxAMfHdt.js.map} +1 -1
  262. package/dist/{table-Rv4JMy0B.js → table-BBeAtYVZ.js} +2 -2
  263. package/dist/{table-Rv4JMy0B.js.map → table-BBeAtYVZ.js.map} +1 -1
  264. package/dist/{tabs-1cHrYoel.js → tabs-CeHu7Scn.js} +1 -1
  265. package/dist/{tabs-1cHrYoel.js.map → tabs-CeHu7Scn.js.map} +1 -1
  266. package/dist/{text-KJmGkwnf.js → text-Cqryz7rk.js} +27 -5
  267. package/dist/text-Cqryz7rk.js.map +1 -0
  268. package/dist/{text-roll-BZ3I1umc.js → text-roll-Ch52hcQj.js} +1 -1
  269. package/dist/{text-roll-BZ3I1umc.js.map → text-roll-Ch52hcQj.js.map} +1 -1
  270. package/dist/{theme-toggle-Bhu681D7.js → theme-toggle-LDfIKEqx.js} +3 -3
  271. package/dist/{theme-toggle-Bhu681D7.js.map → theme-toggle-LDfIKEqx.js.map} +1 -1
  272. package/dist/{toast-Nw28a5Cx.js → toast-CaFQNYng.js} +2 -2
  273. package/dist/{toast-Nw28a5Cx.js.map → toast-CaFQNYng.js.map} +1 -1
  274. package/dist/{tooltip-Cb7QW-7H.js → tooltip-g9lFsvcT.js} +8 -2
  275. package/dist/tooltip-g9lFsvcT.js.map +1 -0
  276. package/dist/{use-agent-harness-BMyF8pTq.js → use-agent-harness-BTcNJdw4.js} +1 -1
  277. package/dist/{use-agent-harness-BMyF8pTq.js.map → use-agent-harness-BTcNJdw4.js.map} +1 -1
  278. package/dist/utils.js +2 -1
  279. package/package.json +2 -1
  280. package/scripts/component-registry/index.ts +2 -2
  281. package/scripts/css-build.ts +1 -1
  282. package/scripts/theme-generator/config.ts +27 -141
  283. package/scripts/theme-generator/generate-css.ts +0 -1
  284. package/scripts/theme-generator/index.ts +0 -1
  285. package/dist/ai-conversation-CArP7C8K.js +0 -184
  286. package/dist/ai-conversation-CArP7C8K.js.map +0 -1
  287. package/dist/ai-info-banner-uFxHHwBA.js.map +0 -1
  288. package/dist/ai-message-BjnFznXy.js.map +0 -1
  289. package/dist/ai-prompt-input-Dy1LfxPk.js.map +0 -1
  290. package/dist/ai-response-BEUg3xvd.js.map +0 -1
  291. package/dist/ai-streaming-text-CMfoThV0.js.map +0 -1
  292. package/dist/ai-subagent-DcPRqkAA.js.map +0 -1
  293. package/dist/ai-task-list-Da9zIm00.js.map +0 -1
  294. package/dist/ai-tool-Cn1O4xjP.js.map +0 -1
  295. package/dist/banner-B_6oBrsu.js.map +0 -1
  296. package/dist/empty-D2TypIId.js.map +0 -1
  297. package/dist/stat-card-CEZscNh8.js.map +0 -1
  298. package/dist/styles/theme-blue-tint.css +0 -98
  299. package/dist/text-KJmGkwnf.js.map +0 -1
  300. package/dist/tooltip-Cb7QW-7H.js.map +0 -1
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { n as useMenuNavigation, t as MenuBar } from "../menubar-C8NzAjfd.js";
2
+ import { n as useMenuNavigation, t as MenuBar } from "../menubar-Cxf3xeAt.js";
3
3
  export { MenuBar, useMenuNavigation };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { t as Meter } from "../meter-CpmTenEr.js";
2
+ import { t as Meter } from "../meter-BFFe9l5b.js";
3
3
  export { Meter };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { t as Pagination } from "../pagination-BVqdlONY.js";
2
+ import { t as Pagination } from "../pagination-yS372Tr4.js";
3
3
  export { Pagination };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { a as PopoverRoot, c as SF_POPOVER_DEFAULT_VARIANTS, i as PopoverDescription, l as SF_POPOVER_VARIANTS, n as PopoverClose, o as PopoverTitle, r as PopoverContent, s as PopoverTrigger, t as Popover } from "../popover-BRQZ2b6z.js";
2
+ import { a as PopoverRoot, c as SF_POPOVER_DEFAULT_VARIANTS, i as PopoverDescription, l as SF_POPOVER_VARIANTS, n as PopoverClose, o as PopoverTitle, r as PopoverContent, s as PopoverTrigger, t as Popover } from "../popover-SRoJaCZr.js";
3
3
  export { Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverRoot, PopoverTitle, PopoverTrigger, SF_POPOVER_DEFAULT_VARIANTS, SF_POPOVER_VARIANTS };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { a as radioVariants, i as SF_RADIO_VARIANTS, n as RadioGroup, r as SF_RADIO_DEFAULT_VARIANTS, t as Radio } from "../radio-BNSwOt3B.js";
2
+ import { a as radioVariants, i as SF_RADIO_VARIANTS, n as RadioGroup, r as SF_RADIO_DEFAULT_VARIANTS, t as Radio } from "../radio-BcwhwYNB.js";
3
3
  export { Radio, RadioGroup, SF_RADIO_DEFAULT_VARIANTS, SF_RADIO_VARIANTS, radioVariants };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { t as Select } from "../select-1w2aebGQ.js";
2
+ import { t as Select } from "../select-DMhdoHMa.js";
3
3
  export { Select };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { n as SF_SENSITIVE_INPUT_VARIANTS, r as SensitiveInput, t as SF_SENSITIVE_INPUT_DEFAULT_VARIANTS } from "../sensitive-input-82Cez3vj.js";
2
+ import { n as SF_SENSITIVE_INPUT_VARIANTS, r as SensitiveInput, t as SF_SENSITIVE_INPUT_DEFAULT_VARIANTS } from "../sensitive-input-CJUpIRal.js";
3
3
  export { SF_SENSITIVE_INPUT_DEFAULT_VARIANTS, SF_SENSITIVE_INPUT_VARIANTS, SensitiveInput };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { A as useSidebar, C as SidebarMenuSubItem, D as SidebarRoot, E as SidebarResizeHandle, O as SidebarSeparator, S as SidebarMenuSubButton, T as SidebarRail, _ as SidebarMenuBadge, a as SidebarCollapsible, b as SidebarMenuItem, c as SidebarContent, d as SidebarGroupContent, f as SidebarGroupLabel, g as SidebarMenuAction, h as SidebarMenu, i as Sidebar, k as SidebarTrigger, l as SidebarFooter, m as SidebarInput, n as SF_SIDEBAR_STYLING, o as SidebarCollapsibleContent, p as SidebarHeader, r as SF_SIDEBAR_VARIANTS, s as SidebarCollapsibleTrigger, t as SF_SIDEBAR_DEFAULT_VARIANTS, u as SidebarGroup, v as SidebarMenuButton, w as SidebarProvider, x as SidebarMenuSub, y as SidebarMenuChevron } from "../sidebar-CAsCmSpM.js";
2
+ import { A as useSidebar, C as SidebarMenuSubItem, D as SidebarRoot, E as SidebarResizeHandle, O as SidebarSeparator, S as SidebarMenuSubButton, T as SidebarRail, _ as SidebarMenuBadge, a as SidebarCollapsible, b as SidebarMenuItem, c as SidebarContent, d as SidebarGroupContent, f as SidebarGroupLabel, g as SidebarMenuAction, h as SidebarMenu, i as Sidebar, k as SidebarTrigger, l as SidebarFooter, m as SidebarInput, n as SF_SIDEBAR_STYLING, o as SidebarCollapsibleContent, p as SidebarHeader, r as SF_SIDEBAR_VARIANTS, s as SidebarCollapsibleTrigger, t as SF_SIDEBAR_DEFAULT_VARIANTS, u as SidebarGroup, v as SidebarMenuButton, w as SidebarProvider, x as SidebarMenuSub, y as SidebarMenuChevron } from "../sidebar-D4zrlYpn.js";
3
3
  export { SF_SIDEBAR_DEFAULT_VARIANTS, SF_SIDEBAR_STYLING, SF_SIDEBAR_VARIANTS, Sidebar, SidebarCollapsible, SidebarCollapsibleContent, SidebarCollapsibleTrigger, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuChevron, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarResizeHandle, SidebarRoot, SidebarSeparator, SidebarTrigger, useSidebar };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { a as SignalFlareAILogo, i as SF_SIGNALFLARE_AI_LOGO_VARIANTS, n as PoweredBySignalFlareAI, o as SignalflareAiLogo, r as SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS, s as generateSignalFlareAILogoSvg, t as PoweredByNavigator } from "../signalflare-ai-logo-DDhxMJD6.js";
2
+ import { a as SignalFlareAILogo, i as SF_SIGNALFLARE_AI_LOGO_VARIANTS, n as PoweredBySignalFlareAI, o as SignalflareAiLogo, r as SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS, s as generateSignalFlareAILogoSvg, t as PoweredByNavigator } from "../signalflare-ai-logo-Bipogceq.js";
3
3
  export { PoweredByNavigator, PoweredBySignalFlareAI, SF_SIGNALFLARE_AI_LOGO_DEFAULT_VARIANTS, SF_SIGNALFLARE_AI_LOGO_VARIANTS, SignalFlareAILogo, SignalflareAiLogo, generateSignalFlareAILogoSvg };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { n as SF_SPARKLINE_VARIANTS, r as Sparkline, t as SF_SPARKLINE_DEFAULT_VARIANTS } from "../sparkline-DdbeM4Ai.js";
2
+ import { n as SF_SPARKLINE_VARIANTS, r as Sparkline, t as SF_SPARKLINE_DEFAULT_VARIANTS } from "../sparkline-DHmgj1d0.js";
3
3
  export { SF_SPARKLINE_DEFAULT_VARIANTS, SF_SPARKLINE_VARIANTS, Sparkline };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { n as SF_STAT_CARD_VARIANTS, r as StatCard, t as SF_STAT_CARD_DEFAULT_VARIANTS } from "../stat-card-CEZscNh8.js";
2
+ import { n as SF_STAT_CARD_VARIANTS, r as StatCard, t as SF_STAT_CARD_DEFAULT_VARIANTS } from "../stat-card-Ew-ofzEm.js";
3
3
  export { SF_STAT_CARD_DEFAULT_VARIANTS, SF_STAT_CARD_VARIANTS, StatCard };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { t as Surface } from "../surface-BduI7Ehl.js";
2
+ import { t as Surface } from "../surface-DGwRlC0o.js";
3
3
  export { Surface };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { n as SF_SWITCH_VARIANTS, r as Switch, t as SF_SWITCH_DEFAULT_VARIANTS } from "../switch-CzZBRBL7.js";
2
+ import { n as SF_SWITCH_VARIANTS, r as Switch, t as SF_SWITCH_DEFAULT_VARIANTS } from "../switch-BxAMfHdt.js";
3
3
  export { SF_SWITCH_DEFAULT_VARIANTS, SF_SWITCH_VARIANTS, Switch };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { n as SF_TABLE_VARIANTS, r as Table, t as SF_TABLE_DEFAULT_VARIANTS } from "../table-Rv4JMy0B.js";
2
+ import { n as SF_TABLE_VARIANTS, r as Table, t as SF_TABLE_DEFAULT_VARIANTS } from "../table-BBeAtYVZ.js";
3
3
  export { SF_TABLE_DEFAULT_VARIANTS, SF_TABLE_VARIANTS, Table };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { t as Tabs } from "../tabs-1cHrYoel.js";
2
+ import { t as Tabs } from "../tabs-CeHu7Scn.js";
3
3
  export { Tabs };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { t as TextRoll } from "../text-roll-BZ3I1umc.js";
2
+ import { t as TextRoll } from "../text-roll-Ch52hcQj.js";
3
3
  export { TextRoll };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { t as Text } from "../text-KJmGkwnf.js";
2
+ import { t as Text } from "../text-Cqryz7rk.js";
3
3
  export { Text };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { i as getStoredThemeMode, n as SF_THEME_TOGGLE_VARIANTS, r as ThemeToggle, t as SF_THEME_TOGGLE_DEFAULT_VARIANTS } from "../theme-toggle-Bhu681D7.js";
2
+ import { i as getStoredThemeMode, n as SF_THEME_TOGGLE_VARIANTS, r as ThemeToggle, t as SF_THEME_TOGGLE_DEFAULT_VARIANTS } from "../theme-toggle-LDfIKEqx.js";
3
3
  export { SF_THEME_TOGGLE_DEFAULT_VARIANTS, SF_THEME_TOGGLE_VARIANTS, ThemeToggle, getStoredThemeMode };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { a as useSFToastManager, i as createSFToastManager, n as ToastProvider, r as Toasty, t as Toast } from "../toast-Nw28a5Cx.js";
2
+ import { a as useSFToastManager, i as createSFToastManager, n as ToastProvider, r as Toasty, t as Toast } from "../toast-CaFQNYng.js";
3
3
  export { Toast, ToastProvider, Toasty, createSFToastManager, useSFToastManager };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { n as TooltipProvider, t as Tooltip } from "../tooltip-Cb7QW-7H.js";
2
+ import { n as TooltipProvider, t as Tooltip } from "../tooltip-g9lFsvcT.js";
3
3
  export { Tooltip, TooltipProvider };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import { a as useAgentHarness, i as fromMastraHarness, n as SF_USE_AGENT_HARNESS_VARIANTS, r as createAgentHarnessState, t as SF_USE_AGENT_HARNESS_DEFAULT_VARIANTS } from "../use-agent-harness-BMyF8pTq.js";
2
+ import { a as useAgentHarness, i as fromMastraHarness, n as SF_USE_AGENT_HARNESS_VARIANTS, r as createAgentHarnessState, t as SF_USE_AGENT_HARNESS_DEFAULT_VARIANTS } from "../use-agent-harness-BTcNJdw4.js";
3
3
  export { SF_USE_AGENT_HARNESS_DEFAULT_VARIANTS, SF_USE_AGENT_HARNESS_VARIANTS, createAgentHarnessState, fromMastraHarness, useAgentHarness };
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { t as cn } from "./cn-YROP2_ox.js";
3
3
  import { t as Loader } from "./loader-DAcc-Uag.js";
4
- import { t as Button } from "./button-De0267YU.js";
5
- import { t as Checkbox } from "./checkbox-DYhUmZNw.js";
6
- import { t as DropdownMenu } from "./dropdown-qnEYRFXZ.js";
7
- import { t as Pagination } from "./pagination-BVqdlONY.js";
8
- import { r as Table } from "./table-Rv4JMy0B.js";
9
- import { t as Filters } from "./filters-Bw_U6ZTx.js";
10
- import { t as Empty } from "./empty-D2TypIId.js";
4
+ import { t as Button } from "./button-CO6-qPax.js";
5
+ import { t as Checkbox } from "./checkbox-D7p4QKsC.js";
6
+ import { t as DropdownMenu } from "./dropdown-B_nrGXjV.js";
7
+ import { t as Pagination } from "./pagination-yS372Tr4.js";
8
+ import { r as Table } from "./table-BBeAtYVZ.js";
9
+ import { t as Filters } from "./filters-cpJCY21R.js";
10
+ import { t as Empty } from "./empty-DZnN0zKX.js";
11
11
  import { createContext, useContext, useMemo, useState } from "react";
12
12
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
13
13
  import { CaretDownIcon, CaretUpDownIcon, CaretUpIcon, ColumnsIcon, FadersHorizontalIcon } from "@phosphor-icons/react";
@@ -302,4 +302,4 @@ var DataGrid = Object.assign(DataGridRoot, {
302
302
  //#endregion
303
303
  export { SF_DATA_GRID_DEFAULT_VARIANTS as n, SF_DATA_GRID_VARIANTS as r, DataGrid as t };
304
304
 
305
- //# sourceMappingURL=data-grid-CG76N_hK.js.map
305
+ //# sourceMappingURL=data-grid-DGHmU0w3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid-CG76N_hK.js","names":[],"sources":["../src/components/data-grid/data-grid.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n CaretDownIcon,\n CaretUpIcon,\n CaretUpDownIcon,\n ColumnsIcon,\n FadersHorizontalIcon,\n} from \"@phosphor-icons/react\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getPaginationRowModel,\n getFilteredRowModel,\n flexRender,\n type SortingState,\n type VisibilityState,\n type RowSelectionState,\n type PaginationState,\n} from \"@tanstack/react-table\";\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport { DropdownMenu } from \"../dropdown\";\nimport { Empty } from \"../empty\";\nimport { Filters } from \"../filters\";\nimport { Loader } from \"../loader\";\nimport { Pagination } from \"../pagination\";\nimport { Table } from \"../table\";\nimport type {\n DataGridProps,\n DataGridColumn,\n DataGridContextValue,\n DataGridToolbarProps,\n DataGridContentProps,\n DataGridPaginationProps,\n DataGridColumnToggleProps,\n DataGridEmptyProps,\n} from \"./types\";\n\n// ============================================================================\n// Variants\n// ============================================================================\n\n/** DataGrid layout variant definitions */\nexport const SF_DATA_GRID_VARIANTS = {\n layout: {\n auto: {\n classes: \"\",\n description: \"Auto column sizing - columns resize based on content\",\n },\n fixed: {\n classes: \"table-fixed\",\n description: \"Fixed column sizing - columns have equal width\",\n },\n },\n} as const;\n\n/** Default variants for DataGrid */\nexport const SF_DATA_GRID_DEFAULT_VARIANTS = {\n layout: \"auto\",\n} as const;\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst DataGridContext = createContext<DataGridContextValue | null>(null);\n\nfunction useDataGridContext<TData>() {\n const context = useContext(DataGridContext);\n if (!context) {\n throw new Error(\n \"DataGrid compound components must be used within a DataGrid\"\n );\n }\n return context as DataGridContextValue<TData>;\n}\n\n// ============================================================================\n// Sort Icon Component\n// ============================================================================\n\nfunction SortIcon({ sorted }: { sorted: false | \"asc\" | \"desc\" }) {\n if (sorted === \"asc\") {\n return <CaretUpIcon className=\"size-3.5 text-sf-brand\" />;\n }\n if (sorted === \"desc\") {\n return <CaretDownIcon className=\"size-3.5 text-sf-brand\" />;\n }\n return <CaretUpDownIcon className=\"size-3.5 text-sf-subtle\" />;\n}\n\n// ============================================================================\n// DataGrid Toolbar\n// ============================================================================\n\n/**\n * Toolbar component for DataGrid.\n * Shows filters, column visibility toggle, and custom actions.\n */\nfunction DataGridToolbar({ className, children }: DataGridToolbarProps) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2 border-b border-sf-line p-3\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nDataGridToolbar.displayName = \"DataGrid.Toolbar\";\n\n// ============================================================================\n// DataGrid Column Toggle\n// ============================================================================\n\n/**\n * Column visibility toggle dropdown.\n * Shows checkboxes for each hideable column.\n */\nfunction DataGridColumnToggle({\n className,\n trigger,\n label = \"Columns\",\n}: DataGridColumnToggleProps) {\n const { table } = useDataGridContext();\n\n const hideableColumns = useMemo(() => {\n return table\n .getAllColumns()\n .filter(\n (col) =>\n col.getCanHide() &&\n (col.columnDef.enableHiding !== false || col.getCanHide())\n );\n }, [table]);\n\n if (hideableColumns.length === 0) return null;\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger>\n {trigger ?? (\n <Button variant=\"secondary\" size=\"sm\" className={className}>\n <ColumnsIcon className=\"mr-1.5 size-4\" />\n {label}\n </Button>\n )}\n </DropdownMenu.Trigger>\n <DropdownMenu.Content className=\"w-48\">\n <div className=\"flex flex-col gap-1 p-1\">\n {hideableColumns.map((column) => (\n <label\n key={column.id}\n className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-sf-tint\"\n >\n <Checkbox\n checked={column.getIsVisible()}\n onCheckedChange={(checked) =>\n column.toggleVisibility(!!checked)\n }\n />\n <span className=\"flex-1\">\n {typeof column.columnDef.header === \"string\"\n ? column.columnDef.header\n : column.id}\n </span>\n </label>\n ))}\n {hideableColumns.length > 0 && (\n <>\n <div className=\"my-1 h-px bg-sf-line\" />\n <DropdownMenu.Item\n onClick={() =>\n hideableColumns.forEach((col) => col.toggleVisibility(true))\n }\n >\n Show all\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() =>\n hideableColumns.forEach((col) => col.toggleVisibility(false))\n }\n >\n Hide all\n </DropdownMenu.Item>\n </>\n )}\n </div>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n\nDataGridColumnToggle.displayName = \"DataGrid.ColumnToggle\";\n\n// ============================================================================\n// DataGrid Content\n// ============================================================================\n\n/**\n * Main table content component.\n * Renders the table with headers, rows, and cells.\n */\nfunction DataGridContent({ className }: DataGridContentProps) {\n const { table, loading, loadingRows, enableColumnResizing } =\n useDataGridContext();\n\n if (loading) {\n return (\n <div className=\"p-4\">\n <div className=\"space-y-2\">\n {Array.from({ length: loadingRows ?? 5 }).map((_, i) => (\n <Loader key={i} className=\"h-10 w-full\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <Table className={className}>\n <Table.Header>\n {table.getHeaderGroups().map((headerGroup) => (\n <Table.Row key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const canSort = header.column.getCanSort();\n const sorted = header.column.getIsSorted();\n const canResize =\n enableColumnResizing && header.column.getCanResize();\n const isResizing = header.column.getIsResizing();\n\n return (\n <Table.Head\n key={header.id}\n className={cn(\n \"bg-sf-base relative group\",\n canSort && \"cursor-pointer select-none hover:bg-sf-overlay\",\n (\n header.column.columnDef as unknown as Record<\n string,\n unknown\n >\n ).headerClassName as string\n )}\n style={canResize ? { width: header.getSize() } : undefined}\n onClick={\n canSort ? () => header.column.toggleSorting() : undefined\n }\n >\n <div className=\"flex items-center gap-1.5\">\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {canSort && <SortIcon sorted={sorted} />}\n </div>\n {canResize && (\n <Table.ResizeHandle\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onDoubleClick={() => header.column.resetSize()}\n className={cn(isResizing && \"visible bg-sf-brand/20\")}\n />\n )}\n </Table.Head>\n );\n })}\n </Table.Row>\n ))}\n </Table.Header>\n <Table.Body>\n {table.getRowModel().rows.map((row) => (\n <Table.Row\n key={row.id}\n variant={row.getIsSelected() ? \"selected\" : \"default\"}\n className={cn(\n row.getIsSelected() && \"bg-sf-tint\",\n \"hover:bg-sf-overlay\"\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <Table.Cell\n key={cell.id}\n className={\n (cell.column.columnDef as unknown as Record<string, unknown>)\n .cellClassName as string\n }\n style={\n enableColumnResizing\n ? { width: cell.column.getSize() }\n : undefined\n }\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Cell>\n ))}\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n );\n}\n\nDataGridContent.displayName = \"DataGrid.Content\";\n\n// ============================================================================\n// DataGrid Pagination\n// ============================================================================\n\n/**\n * Pagination controls for DataGrid.\n * Wraps the Pagination component with table state.\n */\nfunction DataGridPagination({ className }: DataGridPaginationProps) {\n const {\n table,\n pageSize: _pageSize,\n pageIndex: _pageIndex,\n totalCount,\n manualPagination,\n } = useDataGridContext();\n\n // Get pagination state\n const paginationState = table.getState().pagination;\n const currentPageIndex = paginationState.pageIndex;\n const currentPageSize = paginationState.pageSize;\n\n // Calculate row range\n const startRow = currentPageIndex * currentPageSize + 1;\n const endRow = Math.min(\n (currentPageIndex + 1) * currentPageSize,\n manualPagination ? totalCount : table.getCoreRowModel().rows.length\n );\n\n if (table.getPageCount() <= 1 && !manualPagination) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center justify-between border-t border-sf-line p-3\",\n className\n )}\n >\n <div className=\"text-sm text-sf-subtle\">\n Showing {startRow}–{endRow} of{\" \"}\n {manualPagination ? totalCount : table.getCoreRowModel().rows.length}\n </div>\n <Pagination\n page={currentPageIndex + 1}\n setPage={(page) => table.setPageIndex(page - 1)}\n perPage={currentPageSize}\n totalCount={\n manualPagination ? totalCount : table.getCoreRowModel().rows.length\n }\n text={({ pageShowingRange, totalCount: total }) =>\n `Showing ${pageShowingRange} of ${total}`\n }\n />\n </div>\n );\n}\n\nDataGridPagination.displayName = \"DataGrid.Pagination\";\n\n// ============================================================================\n// DataGrid Empty\n// ============================================================================\n\n/**\n * Empty state component for DataGrid.\n * Shown when there are no rows to display.\n */\nfunction DataGridEmpty({\n className,\n children,\n title = \"No results\",\n description = \"No data to display.\",\n}: DataGridEmptyProps) {\n const { table } = useDataGridContext();\n\n // Only show if there are no rows\n if (table.getCoreRowModel().rows.length > 0) return null;\n\n return (\n <div className={cn(\"p-8\", className)}>\n {children ?? (\n <Empty\n icon={<FadersHorizontalIcon className=\"size-10 text-sf-subtle\" />}\n title={title}\n description={description}\n />\n )}\n </div>\n );\n}\n\nDataGridEmpty.displayName = \"DataGrid.Empty\";\n\n// ============================================================================\n// DataGrid Root\n// ============================================================================\n\n/**\n * DataGrid root component.\n * Sets up the react-table instance and provides context to child components.\n */\nfunction DataGridRoot<TData>({\n data,\n columns,\n sorting: controlledSorting,\n onSortingChange,\n enableSorting = true,\n columnVisibility: controlledColumnVisibility,\n onColumnVisibilityChange,\n enableColumnVisibility = true,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n enableRowSelection,\n pageSize = 10,\n pageIndex = 0,\n onPaginationChange,\n totalCount,\n manualPagination = false,\n pageSizeOptions: _pageSizeOptions = [10, 25, 50, 100],\n filters,\n onFiltersChange,\n filterFields,\n enableFiltering,\n layout: _layout = SF_DATA_GRID_DEFAULT_VARIANTS.layout,\n className,\n tableClassName,\n emptyState,\n loading,\n loadingRows,\n toolbar,\n showToolbar = true,\n showPagination = true,\n pagination: customPagination,\n enableColumnResizing,\n columnResizeMode = \"onEnd\",\n children,\n}: DataGridProps<TData> & { children?: ReactNode }) {\n // Internal state for uncontrolled mode\n const [internalSorting, setInternalSorting] = useState<SortingState>([]);\n const [internalColumnVisibility, setInternalColumnVisibility] =\n useState<VisibilityState>({});\n const [internalRowSelection, setInternalRowSelection] =\n useState<RowSelectionState>({});\n const [internalPagination, setInternalPagination] = useState<PaginationState>(\n {\n pageIndex,\n pageSize,\n }\n );\n\n // Determine controlled vs uncontrolled\n const sorting = controlledSorting ?? internalSorting;\n const columnVisibility =\n controlledColumnVisibility ?? internalColumnVisibility;\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const pagination = internalPagination;\n\n // Handle sorting change\n const handleSortingChange = (\n updater: SortingState | ((old: SortingState) => SortingState)\n ) => {\n const newSorting =\n typeof updater === \"function\" ? updater(sorting) : updater;\n if (onSortingChange) {\n onSortingChange(newSorting);\n } else {\n setInternalSorting(newSorting);\n }\n };\n\n // Handle column visibility change\n const handleColumnVisibilityChange = (\n updater: VisibilityState | ((old: VisibilityState) => VisibilityState)\n ) => {\n const newVisibility =\n typeof updater === \"function\" ? updater(columnVisibility) : updater;\n if (onColumnVisibilityChange) {\n onColumnVisibilityChange(newVisibility);\n } else {\n setInternalColumnVisibility(newVisibility);\n }\n };\n\n // Handle row selection change\n const handleRowSelectionChange = (\n updater: RowSelectionState | ((old: RowSelectionState) => RowSelectionState)\n ) => {\n const newSelection =\n typeof updater === \"function\" ? updater(rowSelection) : updater;\n if (onRowSelectionChange) {\n onRowSelectionChange(newSelection);\n } else {\n setInternalRowSelection(newSelection);\n }\n };\n\n // Handle pagination change\n const handlePaginationChange = (\n updater: PaginationState | ((old: PaginationState) => PaginationState)\n ) => {\n const newPagination =\n typeof updater === \"function\" ? updater(pagination) : updater;\n setInternalPagination(newPagination);\n if (onPaginationChange) {\n onPaginationChange({\n pageIndex: newPagination.pageIndex,\n pageSize: newPagination.pageSize,\n });\n }\n };\n\n // Create table instance\n const table = useReactTable({\n data,\n columns: columns as import(\"@tanstack/react-table\").ColumnDef<\n TData,\n unknown\n >[],\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n pagination,\n },\n onSortingChange: handleSortingChange,\n onColumnVisibilityChange: handleColumnVisibilityChange,\n onRowSelectionChange: handleRowSelectionChange,\n onPaginationChange: handlePaginationChange,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n enableSorting,\n enableRowSelection: enableRowSelection !== false,\n enableColumnResizing,\n columnResizeMode,\n manualPagination,\n pageCount: manualPagination\n ? Math.ceil((totalCount ?? data.length) / pageSize)\n : undefined,\n enableMultiRowSelection: true,\n });\n\n // Provide context to children\n const contextValue: DataGridContextValue<TData> = {\n table,\n pageSize,\n pageIndex,\n totalCount: totalCount ?? data.length,\n manualPagination,\n loading,\n loadingRows,\n enableColumnResizing,\n columnResizeMode,\n };\n\n return (\n <DataGridContext.Provider value={contextValue as DataGridContextValue}>\n <div\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border border-sf-line bg-sf-base\",\n className\n )}\n >\n {children || (\n // Auto mode - DataGrid renders everything based on props\n <>\n {/* Toolbar */}\n {showToolbar && (\n <DataGridToolbar>\n {toolbar ?? (\n <>\n {enableFiltering && filterFields && (\n <Filters\n filters={filters ?? []}\n fields={filterFields}\n onChange={onFiltersChange ?? (() => {})}\n size=\"sm\"\n />\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {enableColumnVisibility && <DataGridColumnToggle />}\n </div>\n </>\n )}\n </DataGridToolbar>\n )}\n\n {/* Table content */}\n <div className=\"flex-1 overflow-auto\">\n <DataGridContent className={tableClassName} />\n <DataGridEmpty>{emptyState}</DataGridEmpty>\n </div>\n\n {/* Pagination */}\n {showPagination && (customPagination ?? <DataGridPagination />)}\n </>\n )}\n </div>\n </DataGridContext.Provider>\n );\n}\n\nDataGridRoot.displayName = \"DataGrid\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport const DataGrid = Object.assign(DataGridRoot, {\n Toolbar: DataGridToolbar,\n Content: DataGridContent,\n Pagination: DataGridPagination,\n ColumnToggle: DataGridColumnToggle,\n Empty: DataGridEmpty,\n});\n\nexport type {\n DataGridProps,\n DataGridColumn,\n DataGridToolbarProps,\n DataGridContentProps,\n DataGridPaginationProps,\n DataGridColumnToggleProps,\n DataGridEmptyProps,\n} from \"./types\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"data-grid-DGHmU0w3.js","names":[],"sources":["../src/components/data-grid/data-grid.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n CaretDownIcon,\n CaretUpIcon,\n CaretUpDownIcon,\n ColumnsIcon,\n FadersHorizontalIcon,\n} from \"@phosphor-icons/react\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getPaginationRowModel,\n getFilteredRowModel,\n flexRender,\n type SortingState,\n type VisibilityState,\n type RowSelectionState,\n type PaginationState,\n} from \"@tanstack/react-table\";\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport { DropdownMenu } from \"../dropdown\";\nimport { Empty } from \"../empty\";\nimport { Filters } from \"../filters\";\nimport { Loader } from \"../loader\";\nimport { Pagination } from \"../pagination\";\nimport { Table } from \"../table\";\nimport type {\n DataGridProps,\n DataGridColumn,\n DataGridContextValue,\n DataGridToolbarProps,\n DataGridContentProps,\n DataGridPaginationProps,\n DataGridColumnToggleProps,\n DataGridEmptyProps,\n} from \"./types\";\n\n// ============================================================================\n// Variants\n// ============================================================================\n\n/** DataGrid layout variant definitions */\nexport const SF_DATA_GRID_VARIANTS = {\n layout: {\n auto: {\n classes: \"\",\n description: \"Auto column sizing - columns resize based on content\",\n },\n fixed: {\n classes: \"table-fixed\",\n description: \"Fixed column sizing - columns have equal width\",\n },\n },\n} as const;\n\n/** Default variants for DataGrid */\nexport const SF_DATA_GRID_DEFAULT_VARIANTS = {\n layout: \"auto\",\n} as const;\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst DataGridContext = createContext<DataGridContextValue | null>(null);\n\nfunction useDataGridContext<TData>() {\n const context = useContext(DataGridContext);\n if (!context) {\n throw new Error(\n \"DataGrid compound components must be used within a DataGrid\"\n );\n }\n return context as DataGridContextValue<TData>;\n}\n\n// ============================================================================\n// Sort Icon Component\n// ============================================================================\n\nfunction SortIcon({ sorted }: { sorted: false | \"asc\" | \"desc\" }) {\n if (sorted === \"asc\") {\n return <CaretUpIcon className=\"size-3.5 text-sf-brand\" />;\n }\n if (sorted === \"desc\") {\n return <CaretDownIcon className=\"size-3.5 text-sf-brand\" />;\n }\n return <CaretUpDownIcon className=\"size-3.5 text-sf-subtle\" />;\n}\n\n// ============================================================================\n// DataGrid Toolbar\n// ============================================================================\n\n/**\n * Toolbar component for DataGrid.\n * Shows filters, column visibility toggle, and custom actions.\n */\nfunction DataGridToolbar({ className, children }: DataGridToolbarProps) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2 border-b border-sf-line p-3\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nDataGridToolbar.displayName = \"DataGrid.Toolbar\";\n\n// ============================================================================\n// DataGrid Column Toggle\n// ============================================================================\n\n/**\n * Column visibility toggle dropdown.\n * Shows checkboxes for each hideable column.\n */\nfunction DataGridColumnToggle({\n className,\n trigger,\n label = \"Columns\",\n}: DataGridColumnToggleProps) {\n const { table } = useDataGridContext();\n\n const hideableColumns = useMemo(() => {\n return table\n .getAllColumns()\n .filter(\n (col) =>\n col.getCanHide() &&\n (col.columnDef.enableHiding !== false || col.getCanHide())\n );\n }, [table]);\n\n if (hideableColumns.length === 0) return null;\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger>\n {trigger ?? (\n <Button variant=\"secondary\" size=\"sm\" className={className}>\n <ColumnsIcon className=\"mr-1.5 size-4\" />\n {label}\n </Button>\n )}\n </DropdownMenu.Trigger>\n <DropdownMenu.Content className=\"w-48\">\n <div className=\"flex flex-col gap-1 p-1\">\n {hideableColumns.map((column) => (\n <label\n key={column.id}\n className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-sf-tint\"\n >\n <Checkbox\n checked={column.getIsVisible()}\n onCheckedChange={(checked) =>\n column.toggleVisibility(!!checked)\n }\n />\n <span className=\"flex-1\">\n {typeof column.columnDef.header === \"string\"\n ? column.columnDef.header\n : column.id}\n </span>\n </label>\n ))}\n {hideableColumns.length > 0 && (\n <>\n <div className=\"my-1 h-px bg-sf-line\" />\n <DropdownMenu.Item\n onClick={() =>\n hideableColumns.forEach((col) => col.toggleVisibility(true))\n }\n >\n Show all\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() =>\n hideableColumns.forEach((col) => col.toggleVisibility(false))\n }\n >\n Hide all\n </DropdownMenu.Item>\n </>\n )}\n </div>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n\nDataGridColumnToggle.displayName = \"DataGrid.ColumnToggle\";\n\n// ============================================================================\n// DataGrid Content\n// ============================================================================\n\n/**\n * Main table content component.\n * Renders the table with headers, rows, and cells.\n */\nfunction DataGridContent({ className }: DataGridContentProps) {\n const { table, loading, loadingRows, enableColumnResizing } =\n useDataGridContext();\n\n if (loading) {\n return (\n <div className=\"p-4\">\n <div className=\"space-y-2\">\n {Array.from({ length: loadingRows ?? 5 }).map((_, i) => (\n <Loader key={i} className=\"h-10 w-full\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <Table className={className}>\n <Table.Header>\n {table.getHeaderGroups().map((headerGroup) => (\n <Table.Row key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const canSort = header.column.getCanSort();\n const sorted = header.column.getIsSorted();\n const canResize =\n enableColumnResizing && header.column.getCanResize();\n const isResizing = header.column.getIsResizing();\n\n return (\n <Table.Head\n key={header.id}\n className={cn(\n \"bg-sf-base relative group\",\n canSort && \"cursor-pointer select-none hover:bg-sf-overlay\",\n (\n header.column.columnDef as unknown as Record<\n string,\n unknown\n >\n ).headerClassName as string\n )}\n style={canResize ? { width: header.getSize() } : undefined}\n onClick={\n canSort ? () => header.column.toggleSorting() : undefined\n }\n >\n <div className=\"flex items-center gap-1.5\">\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {canSort && <SortIcon sorted={sorted} />}\n </div>\n {canResize && (\n <Table.ResizeHandle\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onDoubleClick={() => header.column.resetSize()}\n className={cn(isResizing && \"visible bg-sf-brand/20\")}\n />\n )}\n </Table.Head>\n );\n })}\n </Table.Row>\n ))}\n </Table.Header>\n <Table.Body>\n {table.getRowModel().rows.map((row) => (\n <Table.Row\n key={row.id}\n variant={row.getIsSelected() ? \"selected\" : \"default\"}\n className={cn(\n row.getIsSelected() && \"bg-sf-tint\",\n \"hover:bg-sf-overlay\"\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <Table.Cell\n key={cell.id}\n className={\n (cell.column.columnDef as unknown as Record<string, unknown>)\n .cellClassName as string\n }\n style={\n enableColumnResizing\n ? { width: cell.column.getSize() }\n : undefined\n }\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Cell>\n ))}\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n );\n}\n\nDataGridContent.displayName = \"DataGrid.Content\";\n\n// ============================================================================\n// DataGrid Pagination\n// ============================================================================\n\n/**\n * Pagination controls for DataGrid.\n * Wraps the Pagination component with table state.\n */\nfunction DataGridPagination({ className }: DataGridPaginationProps) {\n const {\n table,\n pageSize: _pageSize,\n pageIndex: _pageIndex,\n totalCount,\n manualPagination,\n } = useDataGridContext();\n\n // Get pagination state\n const paginationState = table.getState().pagination;\n const currentPageIndex = paginationState.pageIndex;\n const currentPageSize = paginationState.pageSize;\n\n // Calculate row range\n const startRow = currentPageIndex * currentPageSize + 1;\n const endRow = Math.min(\n (currentPageIndex + 1) * currentPageSize,\n manualPagination ? totalCount : table.getCoreRowModel().rows.length\n );\n\n if (table.getPageCount() <= 1 && !manualPagination) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center justify-between border-t border-sf-line p-3\",\n className\n )}\n >\n <div className=\"text-sm text-sf-subtle\">\n Showing {startRow}–{endRow} of{\" \"}\n {manualPagination ? totalCount : table.getCoreRowModel().rows.length}\n </div>\n <Pagination\n page={currentPageIndex + 1}\n setPage={(page) => table.setPageIndex(page - 1)}\n perPage={currentPageSize}\n totalCount={\n manualPagination ? totalCount : table.getCoreRowModel().rows.length\n }\n text={({ pageShowingRange, totalCount: total }) =>\n `Showing ${pageShowingRange} of ${total}`\n }\n />\n </div>\n );\n}\n\nDataGridPagination.displayName = \"DataGrid.Pagination\";\n\n// ============================================================================\n// DataGrid Empty\n// ============================================================================\n\n/**\n * Empty state component for DataGrid.\n * Shown when there are no rows to display.\n */\nfunction DataGridEmpty({\n className,\n children,\n title = \"No results\",\n description = \"No data to display.\",\n}: DataGridEmptyProps) {\n const { table } = useDataGridContext();\n\n // Only show if there are no rows\n if (table.getCoreRowModel().rows.length > 0) return null;\n\n return (\n <div className={cn(\"p-8\", className)}>\n {children ?? (\n <Empty\n icon={<FadersHorizontalIcon className=\"size-10 text-sf-subtle\" />}\n title={title}\n description={description}\n />\n )}\n </div>\n );\n}\n\nDataGridEmpty.displayName = \"DataGrid.Empty\";\n\n// ============================================================================\n// DataGrid Root\n// ============================================================================\n\n/**\n * DataGrid root component.\n * Sets up the react-table instance and provides context to child components.\n */\nfunction DataGridRoot<TData>({\n data,\n columns,\n sorting: controlledSorting,\n onSortingChange,\n enableSorting = true,\n columnVisibility: controlledColumnVisibility,\n onColumnVisibilityChange,\n enableColumnVisibility = true,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n enableRowSelection,\n pageSize = 10,\n pageIndex = 0,\n onPaginationChange,\n totalCount,\n manualPagination = false,\n pageSizeOptions: _pageSizeOptions = [10, 25, 50, 100],\n filters,\n onFiltersChange,\n filterFields,\n enableFiltering,\n layout: _layout = SF_DATA_GRID_DEFAULT_VARIANTS.layout,\n className,\n tableClassName,\n emptyState,\n loading,\n loadingRows,\n toolbar,\n showToolbar = true,\n showPagination = true,\n pagination: customPagination,\n enableColumnResizing,\n columnResizeMode = \"onEnd\",\n children,\n}: DataGridProps<TData> & { children?: ReactNode }) {\n // Internal state for uncontrolled mode\n const [internalSorting, setInternalSorting] = useState<SortingState>([]);\n const [internalColumnVisibility, setInternalColumnVisibility] =\n useState<VisibilityState>({});\n const [internalRowSelection, setInternalRowSelection] =\n useState<RowSelectionState>({});\n const [internalPagination, setInternalPagination] = useState<PaginationState>(\n {\n pageIndex,\n pageSize,\n }\n );\n\n // Determine controlled vs uncontrolled\n const sorting = controlledSorting ?? internalSorting;\n const columnVisibility =\n controlledColumnVisibility ?? internalColumnVisibility;\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const pagination = internalPagination;\n\n // Handle sorting change\n const handleSortingChange = (\n updater: SortingState | ((old: SortingState) => SortingState)\n ) => {\n const newSorting =\n typeof updater === \"function\" ? updater(sorting) : updater;\n if (onSortingChange) {\n onSortingChange(newSorting);\n } else {\n setInternalSorting(newSorting);\n }\n };\n\n // Handle column visibility change\n const handleColumnVisibilityChange = (\n updater: VisibilityState | ((old: VisibilityState) => VisibilityState)\n ) => {\n const newVisibility =\n typeof updater === \"function\" ? updater(columnVisibility) : updater;\n if (onColumnVisibilityChange) {\n onColumnVisibilityChange(newVisibility);\n } else {\n setInternalColumnVisibility(newVisibility);\n }\n };\n\n // Handle row selection change\n const handleRowSelectionChange = (\n updater: RowSelectionState | ((old: RowSelectionState) => RowSelectionState)\n ) => {\n const newSelection =\n typeof updater === \"function\" ? updater(rowSelection) : updater;\n if (onRowSelectionChange) {\n onRowSelectionChange(newSelection);\n } else {\n setInternalRowSelection(newSelection);\n }\n };\n\n // Handle pagination change\n const handlePaginationChange = (\n updater: PaginationState | ((old: PaginationState) => PaginationState)\n ) => {\n const newPagination =\n typeof updater === \"function\" ? updater(pagination) : updater;\n setInternalPagination(newPagination);\n if (onPaginationChange) {\n onPaginationChange({\n pageIndex: newPagination.pageIndex,\n pageSize: newPagination.pageSize,\n });\n }\n };\n\n // Create table instance\n const table = useReactTable({\n data,\n columns: columns as import(\"@tanstack/react-table\").ColumnDef<\n TData,\n unknown\n >[],\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n pagination,\n },\n onSortingChange: handleSortingChange,\n onColumnVisibilityChange: handleColumnVisibilityChange,\n onRowSelectionChange: handleRowSelectionChange,\n onPaginationChange: handlePaginationChange,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n enableSorting,\n enableRowSelection: enableRowSelection !== false,\n enableColumnResizing,\n columnResizeMode,\n manualPagination,\n pageCount: manualPagination\n ? Math.ceil((totalCount ?? data.length) / pageSize)\n : undefined,\n enableMultiRowSelection: true,\n });\n\n // Provide context to children\n const contextValue: DataGridContextValue<TData> = {\n table,\n pageSize,\n pageIndex,\n totalCount: totalCount ?? data.length,\n manualPagination,\n loading,\n loadingRows,\n enableColumnResizing,\n columnResizeMode,\n };\n\n return (\n <DataGridContext.Provider value={contextValue as DataGridContextValue}>\n <div\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border border-sf-line bg-sf-base\",\n className\n )}\n >\n {children || (\n // Auto mode - DataGrid renders everything based on props\n <>\n {/* Toolbar */}\n {showToolbar && (\n <DataGridToolbar>\n {toolbar ?? (\n <>\n {enableFiltering && filterFields && (\n <Filters\n filters={filters ?? []}\n fields={filterFields}\n onChange={onFiltersChange ?? (() => {})}\n size=\"sm\"\n />\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {enableColumnVisibility && <DataGridColumnToggle />}\n </div>\n </>\n )}\n </DataGridToolbar>\n )}\n\n {/* Table content */}\n <div className=\"flex-1 overflow-auto\">\n <DataGridContent className={tableClassName} />\n <DataGridEmpty>{emptyState}</DataGridEmpty>\n </div>\n\n {/* Pagination */}\n {showPagination && (customPagination ?? <DataGridPagination />)}\n </>\n )}\n </div>\n </DataGridContext.Provider>\n );\n}\n\nDataGridRoot.displayName = \"DataGrid\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport const DataGrid = Object.assign(DataGridRoot, {\n Toolbar: DataGridToolbar,\n Content: DataGridContent,\n Pagination: DataGridPagination,\n ColumnToggle: DataGridColumnToggle,\n Empty: DataGridEmpty,\n});\n\nexport type {\n DataGridProps,\n DataGridColumn,\n DataGridToolbarProps,\n DataGridContentProps,\n DataGridPaginationProps,\n DataGridColumnToggleProps,\n DataGridEmptyProps,\n} from \"./types\";\n"],"mappings":"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"}
@@ -54,4 +54,4 @@ DatePicker.displayName = "DatePicker";
54
54
  //#endregion
55
55
  export { DatePicker as t };
56
56
 
57
- //# sourceMappingURL=date-picker-Dqg9L4xu.js.map
57
+ //# sourceMappingURL=date-picker--ox89RBy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker-Dqg9L4xu.js","names":[],"sources":["../src/components/date-picker/date-picker.tsx"],"sourcesContent":["import { CaretLeftIcon, CaretRightIcon } from \"@phosphor-icons/react\";\nimport {\n DayPicker,\n type CustomComponents,\n type PropsBase,\n type PropsSingle,\n type PropsSingleRequired,\n type PropsMulti,\n type PropsMultiRequired,\n type PropsRange,\n type PropsRangeRequired,\n} from \"react-day-picker\";\n\nimport { cn } from \"../../utils/cn\";\n\n/**\n * Custom Chevron component using Phosphor icons\n */\nconst Chevron: CustomComponents[\"Chevron\"] = ({ orientation, ...props }) => {\n const Icon = orientation === \"left\" ? CaretLeftIcon : CaretRightIcon;\n return <Icon size={16} {...props} />;\n};\n\n/** Base props shared across all DatePicker modes */\ntype BaseProps = Omit<PropsBase, \"classNames\"> & {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Custom class names for internal elements */\n classNames?: PropsBase[\"classNames\"];\n};\n\n/** Single date selection (optional) */\ntype SingleProps = BaseProps &\n Omit<PropsSingle, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsSingle[\"onSelect\"];\n };\n\n/** Single date selection (required) */\ntype SingleRequiredProps = BaseProps &\n Omit<PropsSingleRequired, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsSingleRequired[\"onSelect\"];\n };\n\n/** Multiple date selection (optional) */\ntype MultipleProps = BaseProps &\n Omit<PropsMulti, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsMulti[\"onSelect\"];\n };\n\n/** Multiple date selection (required) */\ntype MultipleRequiredProps = BaseProps &\n Omit<PropsMultiRequired, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsMultiRequired[\"onSelect\"];\n };\n\n/** Date range selection (optional) */\ntype RangeProps = BaseProps &\n Omit<PropsRange, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsRange[\"onSelect\"];\n };\n\n/** Date range selection (required) */\ntype RangeRequiredProps = BaseProps &\n Omit<PropsRangeRequired, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsRangeRequired[\"onSelect\"];\n };\n\n/**\n * DatePicker props - discriminated union based on `mode`.\n * Uses `onChange` instead of `onSelect` for SignalFlare consistency.\n * Full type inference is preserved via the discriminated union.\n */\nexport type DatePickerProps =\n | SingleProps\n | SingleRequiredProps\n | MultipleProps\n | MultipleRequiredProps\n | RangeProps\n | RangeRequiredProps;\n\n/**\n * DatePicker — a date selection calendar.\n *\n * Built on [react-day-picker](https://daypicker.dev) with SignalFlare styling.\n * Supports three selection modes: single, multiple, and range.\n *\n * @example\n * ```tsx\n * // Single date selection\n * const [date, setDate] = useState<Date>();\n * <DatePicker mode=\"single\" selected={date} onChange={setDate} />\n *\n * // Multiple date selection\n * const [dates, setDates] = useState<Date[]>([]);\n * <DatePicker mode=\"multiple\" selected={dates} onChange={setDates} max={5} />\n *\n * // Date range selection\n * const [range, setRange] = useState<DateRange>();\n * <DatePicker mode=\"range\" selected={range} onChange={setRange} numberOfMonths={2} />\n * ```\n */\nexport function DatePicker({\n className,\n classNames,\n onChange,\n ...props\n}: DatePickerProps) {\n return (\n <DayPicker\n showOutsideDays\n animate\n {...props}\n onSelect={onChange as never}\n classNames={{\n ...classNames,\n root: cn(\n \"rdp-root select-none rounded-xl bg-sf-base p-3\",\n classNames?.root,\n className\n ),\n }}\n components={{\n Chevron,\n ...props.components,\n }}\n />\n );\n}\n\nDatePicker.displayName = \"DatePicker\";\n"],"mappings":";;;;;;;;;AAkBA,IAAM,WAAwC,EAAE,aAAa,GAAG,YAAY;AAE1E,QAAO,oBADM,gBAAgB,SAAS,gBAAgB,gBAC/C;EAAM,MAAM;EAAI,GAAI;EAAS,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAiFtC,SAAgB,WAAW,EACzB,WACA,YACA,UACA,GAAG,SACe;AAClB,QACE,oBAAC,WAAD;EACE,iBAAA;EACA,SAAA;EACA,GAAI;EACJ,UAAU;EACV,YAAY;GACV,GAAG;GACH,MAAM,GACJ,kDACA,YAAY,MACZ,UACD;GACF;EACD,YAAY;GACV;GACA,GAAG,MAAM;GACV;EACD,CAAA;;AAIN,WAAW,cAAc"}
1
+ {"version":3,"file":"date-picker--ox89RBy.js","names":[],"sources":["../src/components/date-picker/date-picker.tsx"],"sourcesContent":["import { CaretLeftIcon, CaretRightIcon } from \"@phosphor-icons/react\";\nimport {\n DayPicker,\n type CustomComponents,\n type PropsBase,\n type PropsSingle,\n type PropsSingleRequired,\n type PropsMulti,\n type PropsMultiRequired,\n type PropsRange,\n type PropsRangeRequired,\n} from \"react-day-picker\";\n\nimport { cn } from \"../../utils/cn\";\n\n/**\n * Custom Chevron component using Phosphor icons\n */\nconst Chevron: CustomComponents[\"Chevron\"] = ({ orientation, ...props }) => {\n const Icon = orientation === \"left\" ? CaretLeftIcon : CaretRightIcon;\n return <Icon size={16} {...props} />;\n};\n\n/** Base props shared across all DatePicker modes */\ntype BaseProps = Omit<PropsBase, \"classNames\"> & {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Custom class names for internal elements */\n classNames?: PropsBase[\"classNames\"];\n};\n\n/** Single date selection (optional) */\ntype SingleProps = BaseProps &\n Omit<PropsSingle, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsSingle[\"onSelect\"];\n };\n\n/** Single date selection (required) */\ntype SingleRequiredProps = BaseProps &\n Omit<PropsSingleRequired, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsSingleRequired[\"onSelect\"];\n };\n\n/** Multiple date selection (optional) */\ntype MultipleProps = BaseProps &\n Omit<PropsMulti, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsMulti[\"onSelect\"];\n };\n\n/** Multiple date selection (required) */\ntype MultipleRequiredProps = BaseProps &\n Omit<PropsMultiRequired, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsMultiRequired[\"onSelect\"];\n };\n\n/** Date range selection (optional) */\ntype RangeProps = BaseProps &\n Omit<PropsRange, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsRange[\"onSelect\"];\n };\n\n/** Date range selection (required) */\ntype RangeRequiredProps = BaseProps &\n Omit<PropsRangeRequired, \"onSelect\" | \"classNames\"> & {\n onChange?: PropsRangeRequired[\"onSelect\"];\n };\n\n/**\n * DatePicker props - discriminated union based on `mode`.\n * Uses `onChange` instead of `onSelect` for SignalFlare consistency.\n * Full type inference is preserved via the discriminated union.\n */\nexport type DatePickerProps =\n | SingleProps\n | SingleRequiredProps\n | MultipleProps\n | MultipleRequiredProps\n | RangeProps\n | RangeRequiredProps;\n\n/**\n * DatePicker — a date selection calendar.\n *\n * Built on [react-day-picker](https://daypicker.dev) with SignalFlare styling.\n * Supports three selection modes: single, multiple, and range.\n *\n * @example\n * ```tsx\n * // Single date selection\n * const [date, setDate] = useState<Date>();\n * <DatePicker mode=\"single\" selected={date} onChange={setDate} />\n *\n * // Multiple date selection\n * const [dates, setDates] = useState<Date[]>([]);\n * <DatePicker mode=\"multiple\" selected={dates} onChange={setDates} max={5} />\n *\n * // Date range selection\n * const [range, setRange] = useState<DateRange>();\n * <DatePicker mode=\"range\" selected={range} onChange={setRange} numberOfMonths={2} />\n * ```\n */\nexport function DatePicker({\n className,\n classNames,\n onChange,\n ...props\n}: DatePickerProps) {\n return (\n <DayPicker\n showOutsideDays\n animate\n {...props}\n onSelect={onChange as never}\n classNames={{\n ...classNames,\n root: cn(\n \"rdp-root select-none rounded-xl bg-sf-base p-3\",\n classNames?.root,\n className\n ),\n }}\n components={{\n Chevron,\n ...props.components,\n }}\n />\n );\n}\n\nDatePicker.displayName = \"DatePicker\";\n"],"mappings":";;;;;;;;;AAkBA,IAAM,WAAwC,EAAE,aAAa,GAAG,YAAY;AAE1E,QAAO,oBADM,gBAAgB,SAAS,gBAAgB,gBAC/C;EAAM,MAAM;EAAI,GAAI;EAAS,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAiFtC,SAAgB,WAAW,EACzB,WACA,YACA,UACA,GAAG,SACe;AAClB,QACE,oBAAC,WAAD;EACE,iBAAA;EACA,SAAA;EACA,GAAI;EACJ,UAAU;EACV,YAAY;GACV,GAAG;GACH,MAAM,GACJ,kDACA,YAAY,MACZ,UACD;GACF;EACD,YAAY;GACV;GACA,GAAG,MAAM;GACV;EACD,CAAA;;AAIN,WAAW,cAAc"}
@@ -344,4 +344,4 @@ function DateRangeFooter({ timezone, size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANT
344
344
  //#endregion
345
345
  export { DateRangePicker as t };
346
346
 
347
- //# sourceMappingURL=date-range-picker-D75LLINc.js.map
347
+ //# sourceMappingURL=date-range-picker-DVa7QBqE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-range-picker-D75LLINc.js","names":[],"sources":["../src/components/date-range-picker/date-range-picker.tsx"],"sourcesContent":["import {\n CaretLeftIcon,\n CaretRightIcon,\n GlobeHemisphereWestIcon,\n} from \"@phosphor-icons/react\";\nimport { useCallback, useState } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n/** DateRangePicker size and variant definitions mapping names to their Tailwind classes. */\nexport const SF_DATE_RANGE_PICKER_VARIANTS = {\n size: {\n sm: {\n classes: \"p-3 gap-2\",\n cellHeight: \"h-[22px]\",\n cellWidth: \"w-6\",\n calendarWidth: \"w-[168px]\",\n textSize: \"text-xs\",\n iconSize: 14,\n description: \"Compact calendar for tight spaces\",\n },\n base: {\n classes: \"p-4 gap-2.5\",\n cellHeight: \"h-[26px]\",\n cellWidth: \"w-7\",\n calendarWidth: \"w-[196px]\",\n textSize: \"text-sm\",\n iconSize: 16,\n description: \"Default calendar size\",\n },\n lg: {\n classes: \"p-5 gap-3\",\n cellHeight: \"h-[32px]\",\n cellWidth: \"w-9\",\n calendarWidth: \"w-[252px]\",\n textSize: \"text-base\",\n iconSize: 18,\n description: \"Large calendar for prominent date selection\",\n },\n },\n variant: {\n default: {\n classes: \"bg-sf-overlay\",\n description: \"Default calendar appearance\",\n },\n subtle: {\n classes: \"bg-sf-base\",\n description: \"Subtle calendar with minimal background\",\n },\n },\n} as const;\n\nexport const SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS = {\n size: \"base\",\n variant: \"default\",\n} as const;\n\n// Derived types from SF_DATE_RANGE_PICKER_VARIANTS\nexport type SFDateRangePickerSize =\n keyof typeof SF_DATE_RANGE_PICKER_VARIANTS.size;\nexport type SFDateRangePickerVariant =\n keyof typeof SF_DATE_RANGE_PICKER_VARIANTS.variant;\n\nexport interface SFDateRangePickerVariantsProps {\n /**\n * Calendar size.\n * - `\"sm\"` — Compact calendar for tight spaces\n * - `\"base\"` — Default calendar size\n * - `\"lg\"` — Large calendar for prominent date selection\n * @default \"base\"\n */\n size?: SFDateRangePickerSize;\n /**\n * Visual variant.\n * - `\"default\"` — Standard appearance with overlay background\n * - `\"subtle\"` — Minimal background\n * @default \"default\"\n */\n variant?: SFDateRangePickerVariant;\n}\n\nexport function dateRangePickerVariants({\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n variant = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.variant,\n}: SFDateRangePickerVariantsProps = {}) {\n return cn(\n // Base styles\n \"flex w-fit flex-col rounded-xl select-none\",\n // Apply variant and size styles\n SF_DATE_RANGE_PICKER_VARIANTS.variant[variant].classes,\n SF_DATE_RANGE_PICKER_VARIANTS.size[size].classes\n );\n}\n\n// Helper to get size config\nfunction getSizeConfig(size: SFDateRangePickerSize) {\n return SF_DATE_RANGE_PICKER_VARIANTS.size[size];\n}\n\nenum DateRangeCellMode {\n OUT_OF_RANGE,\n ENABLED,\n SELECTED_START_NODE,\n SELECTED_END_NODE,\n SELECTED,\n SELECTED_OUT_OF_RANGE,\n}\n\nconst DAYS_OF_WEEK = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"] as const;\n\n/**\n * DateRangePicker component props.\n *\n * Dual-calendar date range selector with hover preview, timezone display, and reset support.\n *\n * @example\n * ```tsx\n * <DateRangePicker\n * onStartDateChange={(d) => setStart(d)}\n * onEndDateChange={(d) => setEnd(d)}\n * timezone=\"New York, NY, USA (GMT-4)\"\n * />\n *\n * // Compact variant\n * <DateRangePicker\n * size=\"sm\"\n * variant=\"subtle\"\n * onStartDateChange={setStart}\n * onEndDateChange={setEnd}\n * />\n * ```\n *\n * @deprecated Use {@link DatePicker} with `mode=\"range\"` instead.\n */\nexport interface DateRangePickerProps extends SFDateRangePickerVariantsProps {\n /** Callback fired when start date changes. Receives `null` on reset. */\n onStartDateChange: (date: Date | null) => void;\n /** Callback fired when end date changes. Receives `null` on reset. */\n onEndDateChange: (date: Date | null) => void;\n /**\n * Display timezone string shown in the footer.\n * @default \"New York, NY, USA (GMT-4)\"\n */\n timezone?: string;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n}\n\n/**\n * DateRangePicker — dual-calendar date range selector.\n *\n * Renders two side-by-side month calendars with click-to-select start/end dates,\n * hover preview of the range, a timezone footer, and a reset button.\n *\n * @example\n * ```tsx\n * <DateRangePicker\n * onStartDateChange={setStart}\n * onEndDateChange={setEnd}\n * />\n * ```\n *\n * @deprecated Use {@link DatePicker} with `mode=\"range\"` instead.\n */\nexport function DateRangePicker({\n onStartDateChange,\n onEndDateChange,\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n variant = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.variant,\n timezone = \"New York, NY, USA (GMT-4)\",\n className,\n}: DateRangePickerProps) {\n const [startDate, setStartDate] = useState<Date | null>(null);\n const [endDate, setEndDate] = useState<Date | null>(null);\n const [viewingMonth, setViewingMonth] = useState<Date>(new Date());\n const [hoveringDate, setHoveringDate] = useState<Date | null>(null);\n\n const sizeConfig = getSizeConfig(size);\n\n const handleStartDateChange = (date: Date | null) => {\n setStartDate(date);\n onStartDateChange(date); // Pass the updated startDate to the parent component\n };\n\n const handleEndDateChange = (date: Date | null) => {\n setEndDate(date);\n onEndDateChange(date); // Pass the updated endDate to the parent component\n };\n\n const getMonthName = useCallback((date: Date, monthOffset?: number) => {\n const copyDate = new Date(date);\n copyDate.setMonth(copyDate.getMonth() + (monthOffset || 0));\n return copyDate.toLocaleString(\"default\", { month: \"long\" });\n }, []);\n\n const getDateYear = useCallback((date: Date, monthOffset?: number) => {\n const copyDate = new Date(date);\n copyDate.setMonth(copyDate.getMonth() + (monthOffset || 0));\n return copyDate.getFullYear();\n }, []);\n\n const getMonthsStartingDay = useCallback(\n (date: Date, monthOffset?: number) => {\n const copyDate = new Date(date);\n copyDate.setDate(1);\n copyDate.setMonth(copyDate.getMonth() + (monthOffset || 0));\n return copyDate.getDay();\n },\n []\n );\n\n const getNumberOfDaysInMonth = useCallback(\n (date: Date, monthOffset?: number) => {\n const copyDate = new Date(date);\n copyDate.setDate(1);\n copyDate.setMonth(copyDate.getMonth() + (monthOffset || 0));\n copyDate.setMonth(copyDate.getMonth() + 1);\n copyDate.setDate(0);\n return copyDate.getDate();\n },\n []\n );\n\n const adjustMonth = useCallback((monthOffset: number) => {\n setViewingMonth((prev) => {\n const newDate = new Date(prev);\n newDate.setMonth(newDate.getMonth() + monthOffset);\n return newDate;\n });\n }, []);\n\n const getDateFromIndex = useCallback(\n (date: Date, monthOffset: number, index: number) => {\n const startingDay = getMonthsStartingDay(date, monthOffset);\n\n if (index < startingDay) {\n // Get the last day of the previous month\n const previousMonth = new Date(date);\n previousMonth.setMonth(previousMonth.getMonth() + monthOffset);\n previousMonth.setDate(1);\n previousMonth.setDate(previousMonth.getDate() - (startingDay - index));\n return previousMonth;\n } else if (\n index >\n getNumberOfDaysInMonth(date, monthOffset) + startingDay - 1\n ) {\n // Get the first day of the next month\n const nextMonth = new Date(date);\n nextMonth.setMonth(nextMonth.getMonth() + monthOffset);\n nextMonth.setMonth(nextMonth.getMonth() + 1);\n nextMonth.setDate(\n index - getNumberOfDaysInMonth(date, monthOffset) - startingDay + 1\n );\n return nextMonth;\n } else {\n // Get the current month's date\n const newDate = new Date(date);\n newDate.setMonth(newDate.getMonth() + monthOffset);\n newDate.setDate(index - startingDay + 1);\n return newDate;\n }\n },\n [getMonthsStartingDay, getNumberOfDaysInMonth]\n );\n\n const isDateEqual = useCallback((date1: Date | null, date2: Date | null) => {\n if (!date1 || !date2) return false;\n return date1.toDateString() === date2.toDateString();\n }, []);\n\n return (\n <div className={cn(dateRangePickerVariants({ size, variant }), className)}>\n <div className=\"flex gap-4\">\n <div className={cn(\"relative\", sizeConfig.calendarWidth)}>\n <button\n type=\"button\"\n aria-label=\"Previous month\"\n className=\"absolute top-0 left-0 cursor-pointer rounded bg-sf-interact/85 p-1.5 hover:bg-sf-interact\"\n onClick={() => adjustMonth(-1)}\n >\n <CaretLeftIcon size={sizeConfig.iconSize} />\n </button>\n\n <DateRangeMonthHeader\n month={getMonthName(viewingMonth)}\n year={getDateYear(viewingMonth)}\n size={size}\n updateCurrentMonth={(dateString) => {\n setViewingMonth(new Date(dateString));\n }}\n />\n\n <div className=\"grid grid-cols-7 gap-0 gap-y-0.5\">\n {Array.from({ length: 42 }).map((_, index) => (\n <DateRangeDayCell\n key={index}\n date={getDateFromIndex(viewingMonth, 0, index)}\n size={size}\n mode={\n // After current month range\n (startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 0, index) >= startDate &&\n getDateFromIndex(viewingMonth, 0, index) <= endDate &&\n index >\n getNumberOfDaysInMonth(viewingMonth, 0) +\n getMonthsStartingDay(viewingMonth, 0) -\n 1) ||\n // Before current month range\n (startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 0, index) >= startDate &&\n getDateFromIndex(viewingMonth, 0, index) <= endDate &&\n index < getMonthsStartingDay(viewingMonth, 0))\n ? DateRangeCellMode.SELECTED_OUT_OF_RANGE\n : // Before current month range\n index < getMonthsStartingDay(viewingMonth, 0)\n ? DateRangeCellMode.OUT_OF_RANGE\n : // After current month range\n index >\n getNumberOfDaysInMonth(viewingMonth, 0) +\n getMonthsStartingDay(viewingMonth, 0) -\n 1\n ? DateRangeCellMode.OUT_OF_RANGE\n : // Selected start date\n isDateEqual(\n getDateFromIndex(viewingMonth, 0, index),\n startDate\n )\n ? DateRangeCellMode.SELECTED_START_NODE\n : // Selected end date\n isDateEqual(\n getDateFromIndex(viewingMonth, 0, index),\n endDate\n )\n ? DateRangeCellMode.SELECTED_END_NODE\n : // Selected date range\n startDate &&\n getDateFromIndex(viewingMonth, 0, index) >=\n startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 0, index) <=\n endDate\n ? DateRangeCellMode.SELECTED\n : // Hovering past a starting date and no end date selected\n startDate &&\n !endDate &&\n hoveringDate &&\n hoveringDate > startDate &&\n getDateFromIndex(viewingMonth, 0, index) <=\n hoveringDate &&\n getDateFromIndex(viewingMonth, 0, index) >\n startDate\n ? DateRangeCellMode.SELECTED\n : // Default to enabled date\n DateRangeCellMode.ENABLED\n }\n onClick={(date) => {\n if (!startDate || date < startDate) {\n handleStartDateChange(date);\n setHoveringDate(date);\n } else {\n handleEndDateChange(date);\n }\n }}\n isHoveringDate={(date) => {\n if (startDate && !endDate && date > startDate) {\n setHoveringDate(date);\n }\n }}\n />\n ))}\n </div>\n </div>\n <div className={cn(\"relative\", sizeConfig.calendarWidth)}>\n <button\n type=\"button\"\n aria-label=\"Next month\"\n className=\"absolute top-0 right-0 cursor-pointer rounded bg-sf-interact/85 p-1.5 hover:bg-sf-interact\"\n onClick={() => adjustMonth(1)}\n >\n <CaretRightIcon size={sizeConfig.iconSize} />\n </button>\n\n <DateRangeMonthHeader\n month={getMonthName(viewingMonth, 1)}\n year={getDateYear(viewingMonth, 1)}\n size={size}\n updateCurrentMonth={(dateString) => {\n const date = new Date(dateString);\n date.setMonth(date.getMonth() - 1);\n setViewingMonth(date);\n }}\n />\n\n <div className=\"grid grid-cols-7 gap-0 gap-y-0.5\">\n {Array.from({ length: 42 }).map((_, index) => (\n <DateRangeDayCell\n key={index}\n date={getDateFromIndex(viewingMonth, 1, index)}\n size={size}\n mode={\n // After current month range\n (startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 1, index) >= startDate &&\n getDateFromIndex(viewingMonth, 1, index) <= endDate &&\n index >\n getNumberOfDaysInMonth(viewingMonth, 1) +\n getMonthsStartingDay(viewingMonth, 1) -\n 1) ||\n // Before current month range\n (startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 1, index) >= startDate &&\n getDateFromIndex(viewingMonth, 1, index) <= endDate &&\n index < getMonthsStartingDay(viewingMonth, 1))\n ? DateRangeCellMode.SELECTED_OUT_OF_RANGE\n : // Before current month range\n index < getMonthsStartingDay(viewingMonth, 1)\n ? DateRangeCellMode.OUT_OF_RANGE\n : // After current month range\n index >\n getNumberOfDaysInMonth(viewingMonth, 1) +\n getMonthsStartingDay(viewingMonth, 1) -\n 1\n ? DateRangeCellMode.OUT_OF_RANGE\n : // Selected start date\n isDateEqual(\n getDateFromIndex(viewingMonth, 1, index),\n startDate\n )\n ? DateRangeCellMode.SELECTED_START_NODE\n : // Selected end date\n isDateEqual(\n getDateFromIndex(viewingMonth, 1, index),\n endDate\n )\n ? DateRangeCellMode.SELECTED_END_NODE\n : // Selected date range\n startDate &&\n getDateFromIndex(viewingMonth, 1, index) >=\n startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 1, index) <=\n endDate\n ? DateRangeCellMode.SELECTED\n : // Hovering past a starting date and no end date selected\n startDate &&\n !endDate &&\n hoveringDate &&\n hoveringDate > startDate &&\n getDateFromIndex(viewingMonth, 1, index) <=\n hoveringDate &&\n getDateFromIndex(viewingMonth, 1, index) >\n startDate\n ? DateRangeCellMode.SELECTED\n : // Default to enabled date\n DateRangeCellMode.ENABLED\n }\n onClick={(date) => {\n if (!startDate || date < startDate) {\n handleStartDateChange(date);\n setHoveringDate(date);\n } else {\n handleEndDateChange(date);\n }\n }}\n isHoveringDate={(date) => {\n if (startDate && !endDate && date > startDate) {\n setHoveringDate(date);\n }\n }}\n />\n ))}\n </div>\n </div>\n </div>\n\n <DateRangeFooter\n timezone={timezone}\n size={size}\n reset={() => {\n handleStartDateChange(null);\n handleEndDateChange(null);\n }}\n />\n </div>\n );\n}\n\nfunction DateRangeDayCell({\n date,\n mode,\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n onClick,\n isHoveringDate,\n}: {\n date: Date;\n mode?: DateRangeCellMode;\n size?: SFDateRangePickerSize;\n onClick?: (date: Date) => void;\n isHoveringDate?: (date: Date) => void;\n}) {\n const sizeConfig = getSizeConfig(size);\n\n const getDateNumberFromDate = useCallback((date: Date) => {\n return date.getDate();\n }, []);\n\n const getBackgroundColor = useCallback(() => {\n switch (mode) {\n case DateRangeCellMode.OUT_OF_RANGE:\n return \"bg-transparent\";\n case DateRangeCellMode.ENABLED:\n return \"bg-transparent\";\n case DateRangeCellMode.SELECTED_START_NODE:\n return \"!bg-sf-contrast rounded-tl-[5px] rounded-bl-[5px]\";\n case DateRangeCellMode.SELECTED_END_NODE:\n return \"!bg-sf-contrast rounded-tr-[5px] rounded-br-[5px]\";\n case DateRangeCellMode.SELECTED:\n return \"bg-sf-interact\";\n case DateRangeCellMode.SELECTED_OUT_OF_RANGE:\n return \"bg-sf-fill\";\n }\n }, [mode]);\n\n const getTextColor = useCallback(() => {\n switch (mode) {\n case DateRangeCellMode.OUT_OF_RANGE:\n case DateRangeCellMode.SELECTED_OUT_OF_RANGE:\n return \"!text-sf-strong\";\n case DateRangeCellMode.SELECTED_START_NODE:\n case DateRangeCellMode.SELECTED_END_NODE:\n return \"!text-sf-inverse\";\n default:\n return \"text-sf-default\";\n }\n }, [mode]);\n\n const getAriaLabel = useCallback(() => {\n const dateStr = date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n switch (mode) {\n case DateRangeCellMode.SELECTED_START_NODE:\n return `${dateStr}, selected as start date`;\n case DateRangeCellMode.SELECTED_END_NODE:\n return `${dateStr}, selected as end date`;\n case DateRangeCellMode.SELECTED:\n return `${dateStr}, within selected range`;\n default:\n return dateStr;\n }\n }, [date, mode]);\n\n return (\n <button\n type=\"button\"\n aria-label={getAriaLabel()}\n id={date.toDateString()}\n className={cn(\n sizeConfig.cellHeight,\n sizeConfig.cellWidth,\n sizeConfig.textSize,\n \"cursor-pointer text-center text-sf-default transition-all duration-[50]\",\n `leading-[${sizeConfig.cellHeight.replace(\"h-[\", \"\").replace(\"]\", \"\")}]`,\n mode !== DateRangeCellMode.OUT_OF_RANGE &&\n mode !== DateRangeCellMode.SELECTED_OUT_OF_RANGE\n ? \"hover:bg-sf-interact\"\n : \"\",\n getBackgroundColor(),\n getTextColor()\n )}\n onClick={() => onClick?.(date)}\n onMouseOver={() => isHoveringDate?.(date)}\n onFocus={() => isHoveringDate?.(date)}\n >\n {getDateNumberFromDate(date)}\n </button>\n );\n}\n\nfunction DateRangeMonthHeader({\n month,\n year,\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n updateCurrentMonth,\n}: {\n month?: string;\n year?: number;\n size?: SFDateRangePickerSize;\n updateCurrentMonth?: (dateString: string) => void;\n}) {\n const sizeConfig = getSizeConfig(size);\n\n return (\n <div>\n <div className=\"mb-3 text-center\">\n <input\n key={`${month}-${year}`}\n aria-label=\"Edit month and year\"\n defaultValue={`${month} ${year}`}\n className={cn(\n \"w-full rounded-md border-none bg-transparent py-1.5 text-center font-semibold text-sf-default transition-all duration-200 focus:outline-none\",\n sizeConfig.textSize\n )}\n onBlur={(e) => {\n if (e.currentTarget.value.length === 0) return;\n updateCurrentMonth?.(e.currentTarget.value);\n }}\n />\n </div>\n\n <div className=\"mt-2 grid grid-cols-7 gap-1\">\n {DAYS_OF_WEEK.map((day) => (\n <div\n key={day}\n className={cn(\n \"h-[22px] text-center text-sf-subtle\",\n sizeConfig.cellWidth,\n sizeConfig.textSize\n )}\n >\n {day}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction DateRangeFooter({\n timezone,\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n reset,\n}: {\n timezone?: string;\n size?: SFDateRangePickerSize;\n reset?: () => void;\n}) {\n const sizeConfig = getSizeConfig(size);\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 text-sf-strong\",\n sizeConfig.textSize\n )}\n >\n <GlobeHemisphereWestIcon size={sizeConfig.iconSize} />\n <span className=\"flex-1\">Timezone: {timezone}</span>\n <button\n type=\"button\"\n onClick={reset}\n className=\"cursor-pointer font-semibold text-sf-default underline underline-offset-2\"\n >\n Reset Dates\n </button>\n </div>\n );\n}\n\n// Default export for backwards compatibility\n/**\n * @deprecated Use {@link DatePicker} with `mode=\"range\"` instead.\n */\nexport default DateRangePicker;\n"],"mappings":"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"}
1
+ {"version":3,"file":"date-range-picker-DVa7QBqE.js","names":[],"sources":["../src/components/date-range-picker/date-range-picker.tsx"],"sourcesContent":["import {\n CaretLeftIcon,\n CaretRightIcon,\n GlobeHemisphereWestIcon,\n} from \"@phosphor-icons/react\";\nimport { useCallback, useState } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\n\n/** DateRangePicker size and variant definitions mapping names to their Tailwind classes. */\nexport const SF_DATE_RANGE_PICKER_VARIANTS = {\n size: {\n sm: {\n classes: \"p-3 gap-2\",\n cellHeight: \"h-[22px]\",\n cellWidth: \"w-6\",\n calendarWidth: \"w-[168px]\",\n textSize: \"text-xs\",\n iconSize: 14,\n description: \"Compact calendar for tight spaces\",\n },\n base: {\n classes: \"p-4 gap-2.5\",\n cellHeight: \"h-[26px]\",\n cellWidth: \"w-7\",\n calendarWidth: \"w-[196px]\",\n textSize: \"text-sm\",\n iconSize: 16,\n description: \"Default calendar size\",\n },\n lg: {\n classes: \"p-5 gap-3\",\n cellHeight: \"h-[32px]\",\n cellWidth: \"w-9\",\n calendarWidth: \"w-[252px]\",\n textSize: \"text-base\",\n iconSize: 18,\n description: \"Large calendar for prominent date selection\",\n },\n },\n variant: {\n default: {\n classes: \"bg-sf-overlay\",\n description: \"Default calendar appearance\",\n },\n subtle: {\n classes: \"bg-sf-base\",\n description: \"Subtle calendar with minimal background\",\n },\n },\n} as const;\n\nexport const SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS = {\n size: \"base\",\n variant: \"default\",\n} as const;\n\n// Derived types from SF_DATE_RANGE_PICKER_VARIANTS\nexport type SFDateRangePickerSize =\n keyof typeof SF_DATE_RANGE_PICKER_VARIANTS.size;\nexport type SFDateRangePickerVariant =\n keyof typeof SF_DATE_RANGE_PICKER_VARIANTS.variant;\n\nexport interface SFDateRangePickerVariantsProps {\n /**\n * Calendar size.\n * - `\"sm\"` — Compact calendar for tight spaces\n * - `\"base\"` — Default calendar size\n * - `\"lg\"` — Large calendar for prominent date selection\n * @default \"base\"\n */\n size?: SFDateRangePickerSize;\n /**\n * Visual variant.\n * - `\"default\"` — Standard appearance with overlay background\n * - `\"subtle\"` — Minimal background\n * @default \"default\"\n */\n variant?: SFDateRangePickerVariant;\n}\n\nexport function dateRangePickerVariants({\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n variant = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.variant,\n}: SFDateRangePickerVariantsProps = {}) {\n return cn(\n // Base styles\n \"flex w-fit flex-col rounded-xl select-none\",\n // Apply variant and size styles\n SF_DATE_RANGE_PICKER_VARIANTS.variant[variant].classes,\n SF_DATE_RANGE_PICKER_VARIANTS.size[size].classes\n );\n}\n\n// Helper to get size config\nfunction getSizeConfig(size: SFDateRangePickerSize) {\n return SF_DATE_RANGE_PICKER_VARIANTS.size[size];\n}\n\nenum DateRangeCellMode {\n OUT_OF_RANGE,\n ENABLED,\n SELECTED_START_NODE,\n SELECTED_END_NODE,\n SELECTED,\n SELECTED_OUT_OF_RANGE,\n}\n\nconst DAYS_OF_WEEK = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"] as const;\n\n/**\n * DateRangePicker component props.\n *\n * Dual-calendar date range selector with hover preview, timezone display, and reset support.\n *\n * @example\n * ```tsx\n * <DateRangePicker\n * onStartDateChange={(d) => setStart(d)}\n * onEndDateChange={(d) => setEnd(d)}\n * timezone=\"New York, NY, USA (GMT-4)\"\n * />\n *\n * // Compact variant\n * <DateRangePicker\n * size=\"sm\"\n * variant=\"subtle\"\n * onStartDateChange={setStart}\n * onEndDateChange={setEnd}\n * />\n * ```\n *\n * @deprecated Use {@link DatePicker} with `mode=\"range\"` instead.\n */\nexport interface DateRangePickerProps extends SFDateRangePickerVariantsProps {\n /** Callback fired when start date changes. Receives `null` on reset. */\n onStartDateChange: (date: Date | null) => void;\n /** Callback fired when end date changes. Receives `null` on reset. */\n onEndDateChange: (date: Date | null) => void;\n /**\n * Display timezone string shown in the footer.\n * @default \"New York, NY, USA (GMT-4)\"\n */\n timezone?: string;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n}\n\n/**\n * DateRangePicker — dual-calendar date range selector.\n *\n * Renders two side-by-side month calendars with click-to-select start/end dates,\n * hover preview of the range, a timezone footer, and a reset button.\n *\n * @example\n * ```tsx\n * <DateRangePicker\n * onStartDateChange={setStart}\n * onEndDateChange={setEnd}\n * />\n * ```\n *\n * @deprecated Use {@link DatePicker} with `mode=\"range\"` instead.\n */\nexport function DateRangePicker({\n onStartDateChange,\n onEndDateChange,\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n variant = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.variant,\n timezone = \"New York, NY, USA (GMT-4)\",\n className,\n}: DateRangePickerProps) {\n const [startDate, setStartDate] = useState<Date | null>(null);\n const [endDate, setEndDate] = useState<Date | null>(null);\n const [viewingMonth, setViewingMonth] = useState<Date>(new Date());\n const [hoveringDate, setHoveringDate] = useState<Date | null>(null);\n\n const sizeConfig = getSizeConfig(size);\n\n const handleStartDateChange = (date: Date | null) => {\n setStartDate(date);\n onStartDateChange(date); // Pass the updated startDate to the parent component\n };\n\n const handleEndDateChange = (date: Date | null) => {\n setEndDate(date);\n onEndDateChange(date); // Pass the updated endDate to the parent component\n };\n\n const getMonthName = useCallback((date: Date, monthOffset?: number) => {\n const copyDate = new Date(date);\n copyDate.setMonth(copyDate.getMonth() + (monthOffset || 0));\n return copyDate.toLocaleString(\"default\", { month: \"long\" });\n }, []);\n\n const getDateYear = useCallback((date: Date, monthOffset?: number) => {\n const copyDate = new Date(date);\n copyDate.setMonth(copyDate.getMonth() + (monthOffset || 0));\n return copyDate.getFullYear();\n }, []);\n\n const getMonthsStartingDay = useCallback(\n (date: Date, monthOffset?: number) => {\n const copyDate = new Date(date);\n copyDate.setDate(1);\n copyDate.setMonth(copyDate.getMonth() + (monthOffset || 0));\n return copyDate.getDay();\n },\n []\n );\n\n const getNumberOfDaysInMonth = useCallback(\n (date: Date, monthOffset?: number) => {\n const copyDate = new Date(date);\n copyDate.setDate(1);\n copyDate.setMonth(copyDate.getMonth() + (monthOffset || 0));\n copyDate.setMonth(copyDate.getMonth() + 1);\n copyDate.setDate(0);\n return copyDate.getDate();\n },\n []\n );\n\n const adjustMonth = useCallback((monthOffset: number) => {\n setViewingMonth((prev) => {\n const newDate = new Date(prev);\n newDate.setMonth(newDate.getMonth() + monthOffset);\n return newDate;\n });\n }, []);\n\n const getDateFromIndex = useCallback(\n (date: Date, monthOffset: number, index: number) => {\n const startingDay = getMonthsStartingDay(date, monthOffset);\n\n if (index < startingDay) {\n // Get the last day of the previous month\n const previousMonth = new Date(date);\n previousMonth.setMonth(previousMonth.getMonth() + monthOffset);\n previousMonth.setDate(1);\n previousMonth.setDate(previousMonth.getDate() - (startingDay - index));\n return previousMonth;\n } else if (\n index >\n getNumberOfDaysInMonth(date, monthOffset) + startingDay - 1\n ) {\n // Get the first day of the next month\n const nextMonth = new Date(date);\n nextMonth.setMonth(nextMonth.getMonth() + monthOffset);\n nextMonth.setMonth(nextMonth.getMonth() + 1);\n nextMonth.setDate(\n index - getNumberOfDaysInMonth(date, monthOffset) - startingDay + 1\n );\n return nextMonth;\n } else {\n // Get the current month's date\n const newDate = new Date(date);\n newDate.setMonth(newDate.getMonth() + monthOffset);\n newDate.setDate(index - startingDay + 1);\n return newDate;\n }\n },\n [getMonthsStartingDay, getNumberOfDaysInMonth]\n );\n\n const isDateEqual = useCallback((date1: Date | null, date2: Date | null) => {\n if (!date1 || !date2) return false;\n return date1.toDateString() === date2.toDateString();\n }, []);\n\n return (\n <div className={cn(dateRangePickerVariants({ size, variant }), className)}>\n <div className=\"flex gap-4\">\n <div className={cn(\"relative\", sizeConfig.calendarWidth)}>\n <button\n type=\"button\"\n aria-label=\"Previous month\"\n className=\"absolute top-0 left-0 cursor-pointer rounded bg-sf-interact/85 p-1.5 hover:bg-sf-interact\"\n onClick={() => adjustMonth(-1)}\n >\n <CaretLeftIcon size={sizeConfig.iconSize} />\n </button>\n\n <DateRangeMonthHeader\n month={getMonthName(viewingMonth)}\n year={getDateYear(viewingMonth)}\n size={size}\n updateCurrentMonth={(dateString) => {\n setViewingMonth(new Date(dateString));\n }}\n />\n\n <div className=\"grid grid-cols-7 gap-0 gap-y-0.5\">\n {Array.from({ length: 42 }).map((_, index) => (\n <DateRangeDayCell\n key={index}\n date={getDateFromIndex(viewingMonth, 0, index)}\n size={size}\n mode={\n // After current month range\n (startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 0, index) >= startDate &&\n getDateFromIndex(viewingMonth, 0, index) <= endDate &&\n index >\n getNumberOfDaysInMonth(viewingMonth, 0) +\n getMonthsStartingDay(viewingMonth, 0) -\n 1) ||\n // Before current month range\n (startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 0, index) >= startDate &&\n getDateFromIndex(viewingMonth, 0, index) <= endDate &&\n index < getMonthsStartingDay(viewingMonth, 0))\n ? DateRangeCellMode.SELECTED_OUT_OF_RANGE\n : // Before current month range\n index < getMonthsStartingDay(viewingMonth, 0)\n ? DateRangeCellMode.OUT_OF_RANGE\n : // After current month range\n index >\n getNumberOfDaysInMonth(viewingMonth, 0) +\n getMonthsStartingDay(viewingMonth, 0) -\n 1\n ? DateRangeCellMode.OUT_OF_RANGE\n : // Selected start date\n isDateEqual(\n getDateFromIndex(viewingMonth, 0, index),\n startDate\n )\n ? DateRangeCellMode.SELECTED_START_NODE\n : // Selected end date\n isDateEqual(\n getDateFromIndex(viewingMonth, 0, index),\n endDate\n )\n ? DateRangeCellMode.SELECTED_END_NODE\n : // Selected date range\n startDate &&\n getDateFromIndex(viewingMonth, 0, index) >=\n startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 0, index) <=\n endDate\n ? DateRangeCellMode.SELECTED\n : // Hovering past a starting date and no end date selected\n startDate &&\n !endDate &&\n hoveringDate &&\n hoveringDate > startDate &&\n getDateFromIndex(viewingMonth, 0, index) <=\n hoveringDate &&\n getDateFromIndex(viewingMonth, 0, index) >\n startDate\n ? DateRangeCellMode.SELECTED\n : // Default to enabled date\n DateRangeCellMode.ENABLED\n }\n onClick={(date) => {\n if (!startDate || date < startDate) {\n handleStartDateChange(date);\n setHoveringDate(date);\n } else {\n handleEndDateChange(date);\n }\n }}\n isHoveringDate={(date) => {\n if (startDate && !endDate && date > startDate) {\n setHoveringDate(date);\n }\n }}\n />\n ))}\n </div>\n </div>\n <div className={cn(\"relative\", sizeConfig.calendarWidth)}>\n <button\n type=\"button\"\n aria-label=\"Next month\"\n className=\"absolute top-0 right-0 cursor-pointer rounded bg-sf-interact/85 p-1.5 hover:bg-sf-interact\"\n onClick={() => adjustMonth(1)}\n >\n <CaretRightIcon size={sizeConfig.iconSize} />\n </button>\n\n <DateRangeMonthHeader\n month={getMonthName(viewingMonth, 1)}\n year={getDateYear(viewingMonth, 1)}\n size={size}\n updateCurrentMonth={(dateString) => {\n const date = new Date(dateString);\n date.setMonth(date.getMonth() - 1);\n setViewingMonth(date);\n }}\n />\n\n <div className=\"grid grid-cols-7 gap-0 gap-y-0.5\">\n {Array.from({ length: 42 }).map((_, index) => (\n <DateRangeDayCell\n key={index}\n date={getDateFromIndex(viewingMonth, 1, index)}\n size={size}\n mode={\n // After current month range\n (startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 1, index) >= startDate &&\n getDateFromIndex(viewingMonth, 1, index) <= endDate &&\n index >\n getNumberOfDaysInMonth(viewingMonth, 1) +\n getMonthsStartingDay(viewingMonth, 1) -\n 1) ||\n // Before current month range\n (startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 1, index) >= startDate &&\n getDateFromIndex(viewingMonth, 1, index) <= endDate &&\n index < getMonthsStartingDay(viewingMonth, 1))\n ? DateRangeCellMode.SELECTED_OUT_OF_RANGE\n : // Before current month range\n index < getMonthsStartingDay(viewingMonth, 1)\n ? DateRangeCellMode.OUT_OF_RANGE\n : // After current month range\n index >\n getNumberOfDaysInMonth(viewingMonth, 1) +\n getMonthsStartingDay(viewingMonth, 1) -\n 1\n ? DateRangeCellMode.OUT_OF_RANGE\n : // Selected start date\n isDateEqual(\n getDateFromIndex(viewingMonth, 1, index),\n startDate\n )\n ? DateRangeCellMode.SELECTED_START_NODE\n : // Selected end date\n isDateEqual(\n getDateFromIndex(viewingMonth, 1, index),\n endDate\n )\n ? DateRangeCellMode.SELECTED_END_NODE\n : // Selected date range\n startDate &&\n getDateFromIndex(viewingMonth, 1, index) >=\n startDate &&\n endDate &&\n getDateFromIndex(viewingMonth, 1, index) <=\n endDate\n ? DateRangeCellMode.SELECTED\n : // Hovering past a starting date and no end date selected\n startDate &&\n !endDate &&\n hoveringDate &&\n hoveringDate > startDate &&\n getDateFromIndex(viewingMonth, 1, index) <=\n hoveringDate &&\n getDateFromIndex(viewingMonth, 1, index) >\n startDate\n ? DateRangeCellMode.SELECTED\n : // Default to enabled date\n DateRangeCellMode.ENABLED\n }\n onClick={(date) => {\n if (!startDate || date < startDate) {\n handleStartDateChange(date);\n setHoveringDate(date);\n } else {\n handleEndDateChange(date);\n }\n }}\n isHoveringDate={(date) => {\n if (startDate && !endDate && date > startDate) {\n setHoveringDate(date);\n }\n }}\n />\n ))}\n </div>\n </div>\n </div>\n\n <DateRangeFooter\n timezone={timezone}\n size={size}\n reset={() => {\n handleStartDateChange(null);\n handleEndDateChange(null);\n }}\n />\n </div>\n );\n}\n\nfunction DateRangeDayCell({\n date,\n mode,\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n onClick,\n isHoveringDate,\n}: {\n date: Date;\n mode?: DateRangeCellMode;\n size?: SFDateRangePickerSize;\n onClick?: (date: Date) => void;\n isHoveringDate?: (date: Date) => void;\n}) {\n const sizeConfig = getSizeConfig(size);\n\n const getDateNumberFromDate = useCallback((date: Date) => {\n return date.getDate();\n }, []);\n\n const getBackgroundColor = useCallback(() => {\n switch (mode) {\n case DateRangeCellMode.OUT_OF_RANGE:\n return \"bg-transparent\";\n case DateRangeCellMode.ENABLED:\n return \"bg-transparent\";\n case DateRangeCellMode.SELECTED_START_NODE:\n return \"!bg-sf-contrast rounded-tl-[5px] rounded-bl-[5px]\";\n case DateRangeCellMode.SELECTED_END_NODE:\n return \"!bg-sf-contrast rounded-tr-[5px] rounded-br-[5px]\";\n case DateRangeCellMode.SELECTED:\n return \"bg-sf-interact\";\n case DateRangeCellMode.SELECTED_OUT_OF_RANGE:\n return \"bg-sf-fill\";\n }\n }, [mode]);\n\n const getTextColor = useCallback(() => {\n switch (mode) {\n case DateRangeCellMode.OUT_OF_RANGE:\n case DateRangeCellMode.SELECTED_OUT_OF_RANGE:\n return \"!text-sf-strong\";\n case DateRangeCellMode.SELECTED_START_NODE:\n case DateRangeCellMode.SELECTED_END_NODE:\n return \"!text-sf-inverse\";\n default:\n return \"text-sf-default\";\n }\n }, [mode]);\n\n const getAriaLabel = useCallback(() => {\n const dateStr = date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n switch (mode) {\n case DateRangeCellMode.SELECTED_START_NODE:\n return `${dateStr}, selected as start date`;\n case DateRangeCellMode.SELECTED_END_NODE:\n return `${dateStr}, selected as end date`;\n case DateRangeCellMode.SELECTED:\n return `${dateStr}, within selected range`;\n default:\n return dateStr;\n }\n }, [date, mode]);\n\n return (\n <button\n type=\"button\"\n aria-label={getAriaLabel()}\n id={date.toDateString()}\n className={cn(\n sizeConfig.cellHeight,\n sizeConfig.cellWidth,\n sizeConfig.textSize,\n \"cursor-pointer text-center text-sf-default transition-all duration-[50]\",\n `leading-[${sizeConfig.cellHeight.replace(\"h-[\", \"\").replace(\"]\", \"\")}]`,\n mode !== DateRangeCellMode.OUT_OF_RANGE &&\n mode !== DateRangeCellMode.SELECTED_OUT_OF_RANGE\n ? \"hover:bg-sf-interact\"\n : \"\",\n getBackgroundColor(),\n getTextColor()\n )}\n onClick={() => onClick?.(date)}\n onMouseOver={() => isHoveringDate?.(date)}\n onFocus={() => isHoveringDate?.(date)}\n >\n {getDateNumberFromDate(date)}\n </button>\n );\n}\n\nfunction DateRangeMonthHeader({\n month,\n year,\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n updateCurrentMonth,\n}: {\n month?: string;\n year?: number;\n size?: SFDateRangePickerSize;\n updateCurrentMonth?: (dateString: string) => void;\n}) {\n const sizeConfig = getSizeConfig(size);\n\n return (\n <div>\n <div className=\"mb-3 text-center\">\n <input\n key={`${month}-${year}`}\n aria-label=\"Edit month and year\"\n defaultValue={`${month} ${year}`}\n className={cn(\n \"w-full rounded-md border-none bg-transparent py-1.5 text-center font-semibold text-sf-default transition-all duration-200 focus:outline-none\",\n sizeConfig.textSize\n )}\n onBlur={(e) => {\n if (e.currentTarget.value.length === 0) return;\n updateCurrentMonth?.(e.currentTarget.value);\n }}\n />\n </div>\n\n <div className=\"mt-2 grid grid-cols-7 gap-1\">\n {DAYS_OF_WEEK.map((day) => (\n <div\n key={day}\n className={cn(\n \"h-[22px] text-center text-sf-subtle\",\n sizeConfig.cellWidth,\n sizeConfig.textSize\n )}\n >\n {day}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction DateRangeFooter({\n timezone,\n size = SF_DATE_RANGE_PICKER_DEFAULT_VARIANTS.size,\n reset,\n}: {\n timezone?: string;\n size?: SFDateRangePickerSize;\n reset?: () => void;\n}) {\n const sizeConfig = getSizeConfig(size);\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 text-sf-strong\",\n sizeConfig.textSize\n )}\n >\n <GlobeHemisphereWestIcon size={sizeConfig.iconSize} />\n <span className=\"flex-1\">Timezone: {timezone}</span>\n <button\n type=\"button\"\n onClick={reset}\n className=\"cursor-pointer font-semibold text-sf-default underline underline-offset-2\"\n >\n Reset Dates\n </button>\n </div>\n );\n}\n\n// Default export for backwards compatibility\n/**\n * @deprecated Use {@link DatePicker} with `mode=\"range\"` instead.\n */\nexport default DateRangePicker;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as cn } from "./cn-YROP2_ox.js";
3
- import { t as Surface } from "./surface-BduI7Ehl.js";
3
+ import { t as Surface } from "./surface-DGwRlC0o.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { Dialog } from "@base-ui/react/dialog";
6
6
  //#region src/components/dialog/dialog.tsx
@@ -101,4 +101,4 @@ var Dialog$1 = Object.assign(DialogContent, {
101
101
  //#endregion
102
102
  export { DialogTitle as a, DialogRoot as i, DialogClose as n, DialogTrigger as o, DialogDescription as r, Dialog$1 as t };
103
103
 
104
- //# sourceMappingURL=dialog-CyHEQXEY.js.map
104
+ //# sourceMappingURL=dialog-Bv1oSFOd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialog-CyHEQXEY.js","names":[],"sources":["../src/components/dialog/dialog.tsx"],"sourcesContent":["import { Dialog as DialogBase } from \"@base-ui/react/dialog\";\nimport type { ComponentPropsWithoutRef, CSSProperties, ReactNode } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Surface } from \"../surface\";\n\n/** Dialog size variant definitions mapping sizes to their minimum widths. */\nexport const SF_DIALOG_VARIANTS = {\n size: {\n base: {\n classes: \"sm:min-w-96\",\n description: \"Default dialog width\",\n },\n sm: {\n classes: \"min-w-72\",\n description: \"Small dialog for simple confirmations\",\n },\n lg: {\n classes: \"min-w-[32rem]\",\n description: \"Large dialog for complex content\",\n },\n xl: {\n classes: \"min-w-[48rem]\",\n description: \"Extra large dialog for detailed views\",\n },\n },\n} as const;\n\nexport const SF_DIALOG_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\nexport const SF_DIALOG_STYLING = {\n dimensions: {\n sm: {\n width: 350,\n titleSize: 20,\n descSize: 16,\n padding: 16,\n gap: 8,\n buttonSize: \"sm\",\n },\n base: {\n width: 384,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n lg: {\n width: 512,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n xl: {\n width: 768,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n },\n baseTokens: {\n background: \"color-surface\",\n text: \"text-color-surface\",\n borderRadius: 12,\n shadow: \"shadow-m\",\n },\n backdrop: {\n background: \"color-surface-secondary\",\n opacity: 0.8,\n },\n header: {\n title: { fontWeight: 600, color: \"text-color-surface\" },\n closeIcon: { name: \"ph-x\", size: 20, color: \"text-color-muted\" },\n },\n description: {\n fontWeight: 400,\n color: \"text-color-muted\",\n },\n buttons: {\n primary: { background: \"color-primary\", text: \"white\" },\n secondary: { ring: \"color-border\", text: \"text-color-surface\" },\n },\n} as const;\n\n// Derived types from SF_DIALOG_VARIANTS\nexport type SFDialogSize = keyof typeof SF_DIALOG_VARIANTS.size;\n\nexport interface SFDialogVariantsProps {\n /**\n * Dialog width.\n * - `\"sm\"` — Small (min 288px) for simple confirmations\n * - `\"base\"` — Default (min 384px)\n * - `\"lg\"` — Large (min 512px) for complex content\n * - `\"xl\"` — Extra large (min 768px) for detailed views\n * @default \"base\"\n */\n size?: SFDialogSize;\n}\n\nexport function dialogVariants({\n size = SF_DIALOG_DEFAULT_VARIANTS.size,\n}: SFDialogVariantsProps = {}) {\n return cn(\n // Base styles (includes default padding)\n \"shadow-m fixed top-1/2 left-1/2 w-full sm:w-auto max-w-[calc(100vw-2rem)] sm:max-w-[calc(100vw-3rem)] -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-xl bg-sf-elevated text-sf-default p-6 duration-150 data-ending-style:scale-90 data-ending-style:opacity-0 data-starting-style:scale-90 data-starting-style:opacity-0\",\n // Apply size from SF_DIALOG_VARIANTS\n SF_DIALOG_VARIANTS.size[size].classes\n );\n}\n\n/**\n * Dialog component props — the modal content panel.\n *\n * @example\n * ```tsx\n * <Dialog.Root>\n * <Dialog.Trigger render={(p) => <Button {...p}>Open</Button>} />\n * <Dialog>\n * <Dialog.Title>Confirm Action</Dialog.Title>\n * <Dialog.Description>Are you sure?</Dialog.Description>\n * <Dialog.Close render={(p) => <Button {...p}>Cancel</Button>} />\n * </Dialog>\n * </Dialog.Root>\n * ```\n */\nexport type DialogProps = SFDialogVariantsProps & {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Dialog content (typically Title, Description, Close, and action buttons). */\n children: ReactNode;\n /** Inline styles. */\n style?: CSSProperties;\n};\n\n/**\n * Modal dialog overlay with backdrop. Compound component with `Dialog.Root`,\n * `Dialog.Trigger`, `Dialog.Title`, `Dialog.Description`, and `Dialog.Close`.\n *\n * @example\n * ```tsx\n * <Dialog.Root>\n * <Dialog.Trigger render={(p) => <Button {...p}>Delete</Button>} />\n * <Dialog>\n * <Dialog.Title>Delete Item</Dialog.Title>\n * <Dialog.Description>This action cannot be undone.</Dialog.Description>\n * <Dialog.Close render={(p) => <Button variant=\"destructive\" {...p}>Delete</Button>} />\n * </Dialog>\n * </Dialog.Root>\n * ```\n */\nfunction DialogContent({\n className,\n children,\n style,\n size = SF_DIALOG_DEFAULT_VARIANTS.size,\n}: DialogProps) {\n return (\n <DialogBase.Portal>\n <DialogBase.Backdrop className=\"fixed inset-0 bg-sf-overlay opacity-80 transition-all duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0\" />\n <Surface\n as={DialogBase.Popup}\n className={cn(dialogVariants({ size }), className)}\n style={\n {\n transitionProperty: \"scale, opacity\",\n transitionTimingFunction:\n \"var(--default-transition-timing-function)\",\n \"--tw-shadow\":\n \"0 20px 25px -5px rgb(0 0 0 / 0.03), 0 8px 10px -6px rgb(0 0 0 / 0.03)\",\n ...style,\n } as CSSProperties\n }\n >\n {children}\n </Surface>\n </DialogBase.Portal>\n );\n}\n\n// ============================================================================\n// Dialog Root\n// ============================================================================\n\ntype BaseDialogRootProps = ComponentPropsWithoutRef<typeof DialogBase.Root>;\n\nexport type DialogRootProps = BaseDialogRootProps;\n\nfunction DialogRoot({ children, ...props }: DialogRootProps) {\n return <DialogBase.Root {...props}>{children}</DialogBase.Root>;\n}\n\nDialogRoot.displayName = \"Dialog.Root\";\n\n// ============================================================================\n// Dialog Trigger\n// ============================================================================\n\ntype BaseDialogTriggerProps = ComponentPropsWithoutRef<\n typeof DialogBase.Trigger\n>;\n\nexport type DialogTriggerProps = BaseDialogTriggerProps;\n\nfunction DialogTrigger({ children, ...props }: DialogTriggerProps) {\n return <DialogBase.Trigger {...props}>{children}</DialogBase.Trigger>;\n}\n\nDialogTrigger.displayName = \"Dialog.Trigger\";\n\n// ============================================================================\n// Dialog Title\n// ============================================================================\n\ntype BaseDialogTitleProps = ComponentPropsWithoutRef<typeof DialogBase.Title>;\n\nexport type DialogTitleProps = BaseDialogTitleProps;\n\nfunction DialogTitle({ className, ...props }: DialogTitleProps) {\n return (\n <DialogBase.Title\n className={cn(\"text-xl font-semibold text-sf-default\", className)}\n {...props}\n />\n );\n}\n\nDialogTitle.displayName = \"Dialog.Title\";\n\n// ============================================================================\n// Dialog Description\n// ============================================================================\n\ntype BaseDialogDescriptionProps = ComponentPropsWithoutRef<\n typeof DialogBase.Description\n>;\n\nexport type DialogDescriptionProps = BaseDialogDescriptionProps;\n\nfunction DialogDescription({ className, ...props }: DialogDescriptionProps) {\n return (\n <DialogBase.Description\n className={cn(\"text-sm text-sf-subtle\", className)}\n {...props}\n />\n );\n}\n\nDialogDescription.displayName = \"Dialog.Description\";\n\n// ============================================================================\n// Dialog Close\n// ============================================================================\n\ntype BaseDialogCloseProps = ComponentPropsWithoutRef<typeof DialogBase.Close>;\n\nexport type DialogCloseProps = BaseDialogCloseProps;\n\nfunction DialogClose({ children, ...props }: DialogCloseProps) {\n return <DialogBase.Close {...props}>{children}</DialogBase.Close>;\n}\n\nDialogClose.displayName = \"Dialog.Close\";\n\n// ============================================================================\n// Compound Component Export\n// ============================================================================\n\nconst Dialog = Object.assign(DialogContent, {\n Root: DialogRoot,\n Trigger: DialogTrigger,\n Title: DialogTitle,\n Description: DialogDescription,\n Close: DialogClose,\n});\n\nexport {\n Dialog,\n DialogRoot,\n DialogTrigger,\n DialogTitle,\n DialogDescription,\n DialogClose,\n};\n"],"mappings":";;;;;;;AAOA,IAAa,qBAAqB,EAChC,MAAM;CACJ,MAAM;EACJ,SAAS;EACT,aAAa;EACd;CACD,IAAI;EACF,SAAS;EACT,aAAa;EACd;CACD,IAAI;EACF,SAAS;EACT,aAAa;EACd;CACD,IAAI;EACF,SAAS;EACT,aAAa;EACd;CACF,EACF;AAED,IAAa,6BAA6B,EACxC,MAAM,QACP;AA4ED,SAAgB,eAAe,EAC7B,OAAO,2BAA2B,SACT,EAAE,EAAE;AAC7B,QAAO,GAEL,wUAEA,mBAAmB,KAAK,MAAM,QAC/B;;;;;;;;;;;;;;;;;;AA2CH,SAAS,cAAc,EACrB,WACA,UACA,OACA,OAAO,2BAA2B,QACpB;AACd,QACE,qBAAC,OAAW,QAAZ,EAAA,UAAA,CACE,oBAAC,OAAW,UAAZ,EAAqB,WAAU,gIAAiI,CAAA,EAChK,oBAAC,SAAD;EACE,IAAI,OAAW;EACf,WAAW,GAAG,eAAe,EAAE,MAAM,CAAC,EAAE,UAAU;EAClD,OACE;GACE,oBAAoB;GACpB,0BACE;GACF,eACE;GACF,GAAG;GACJ;EAGF;EACO,CAAA,CACQ,EAAA,CAAA;;AAYxB,SAAS,WAAW,EAAE,UAAU,GAAG,SAA0B;AAC3D,QAAO,oBAAC,OAAW,MAAZ;EAAiB,GAAI;EAAQ;EAA2B,CAAA;;AAGjE,WAAW,cAAc;AAYzB,SAAS,cAAc,EAAE,UAAU,GAAG,SAA6B;AACjE,QAAO,oBAAC,OAAW,SAAZ;EAAoB,GAAI;EAAQ;EAA8B,CAAA;;AAGvE,cAAc,cAAc;AAU5B,SAAS,YAAY,EAAE,WAAW,GAAG,SAA2B;AAC9D,QACE,oBAAC,OAAW,OAAZ;EACE,WAAW,GAAG,yCAAyC,UAAU;EACjE,GAAI;EACJ,CAAA;;AAIN,YAAY,cAAc;AAY1B,SAAS,kBAAkB,EAAE,WAAW,GAAG,SAAiC;AAC1E,QACE,oBAAC,OAAW,aAAZ;EACE,WAAW,GAAG,0BAA0B,UAAU;EAClD,GAAI;EACJ,CAAA;;AAIN,kBAAkB,cAAc;AAUhC,SAAS,YAAY,EAAE,UAAU,GAAG,SAA2B;AAC7D,QAAO,oBAAC,OAAW,OAAZ;EAAkB,GAAI;EAAQ;EAA4B,CAAA;;AAGnE,YAAY,cAAc;AAM1B,IAAM,WAAS,OAAO,OAAO,eAAe;CAC1C,MAAM;CACN,SAAS;CACT,OAAO;CACP,aAAa;CACb,OAAO;CACR,CAAC"}
1
+ {"version":3,"file":"dialog-Bv1oSFOd.js","names":[],"sources":["../src/components/dialog/dialog.tsx"],"sourcesContent":["import { Dialog as DialogBase } from \"@base-ui/react/dialog\";\nimport type { ComponentPropsWithoutRef, CSSProperties, ReactNode } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Surface } from \"../surface\";\n\n/** Dialog size variant definitions mapping sizes to their minimum widths. */\nexport const SF_DIALOG_VARIANTS = {\n size: {\n base: {\n classes: \"sm:min-w-96\",\n description: \"Default dialog width\",\n },\n sm: {\n classes: \"min-w-72\",\n description: \"Small dialog for simple confirmations\",\n },\n lg: {\n classes: \"min-w-[32rem]\",\n description: \"Large dialog for complex content\",\n },\n xl: {\n classes: \"min-w-[48rem]\",\n description: \"Extra large dialog for detailed views\",\n },\n },\n} as const;\n\nexport const SF_DIALOG_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\nexport const SF_DIALOG_STYLING = {\n dimensions: {\n sm: {\n width: 350,\n titleSize: 20,\n descSize: 16,\n padding: 16,\n gap: 8,\n buttonSize: \"sm\",\n },\n base: {\n width: 384,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n lg: {\n width: 512,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n xl: {\n width: 768,\n titleSize: 20,\n descSize: 16,\n padding: 24,\n gap: 16,\n buttonSize: \"base\",\n },\n },\n baseTokens: {\n background: \"color-surface\",\n text: \"text-color-surface\",\n borderRadius: 12,\n shadow: \"shadow-m\",\n },\n backdrop: {\n background: \"color-surface-secondary\",\n opacity: 0.8,\n },\n header: {\n title: { fontWeight: 600, color: \"text-color-surface\" },\n closeIcon: { name: \"ph-x\", size: 20, color: \"text-color-muted\" },\n },\n description: {\n fontWeight: 400,\n color: \"text-color-muted\",\n },\n buttons: {\n primary: { background: \"color-primary\", text: \"white\" },\n secondary: { ring: \"color-border\", text: \"text-color-surface\" },\n },\n} as const;\n\n// Derived types from SF_DIALOG_VARIANTS\nexport type SFDialogSize = keyof typeof SF_DIALOG_VARIANTS.size;\n\nexport interface SFDialogVariantsProps {\n /**\n * Dialog width.\n * - `\"sm\"` — Small (min 288px) for simple confirmations\n * - `\"base\"` — Default (min 384px)\n * - `\"lg\"` — Large (min 512px) for complex content\n * - `\"xl\"` — Extra large (min 768px) for detailed views\n * @default \"base\"\n */\n size?: SFDialogSize;\n}\n\nexport function dialogVariants({\n size = SF_DIALOG_DEFAULT_VARIANTS.size,\n}: SFDialogVariantsProps = {}) {\n return cn(\n // Base styles (includes default padding)\n \"shadow-m fixed top-1/2 left-1/2 w-full sm:w-auto max-w-[calc(100vw-2rem)] sm:max-w-[calc(100vw-3rem)] -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-xl bg-sf-elevated text-sf-default p-6 duration-150 data-ending-style:scale-90 data-ending-style:opacity-0 data-starting-style:scale-90 data-starting-style:opacity-0\",\n // Apply size from SF_DIALOG_VARIANTS\n SF_DIALOG_VARIANTS.size[size].classes\n );\n}\n\n/**\n * Dialog component props — the modal content panel.\n *\n * @example\n * ```tsx\n * <Dialog.Root>\n * <Dialog.Trigger render={(p) => <Button {...p}>Open</Button>} />\n * <Dialog>\n * <Dialog.Title>Confirm Action</Dialog.Title>\n * <Dialog.Description>Are you sure?</Dialog.Description>\n * <Dialog.Close render={(p) => <Button {...p}>Cancel</Button>} />\n * </Dialog>\n * </Dialog.Root>\n * ```\n */\nexport type DialogProps = SFDialogVariantsProps & {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Dialog content (typically Title, Description, Close, and action buttons). */\n children: ReactNode;\n /** Inline styles. */\n style?: CSSProperties;\n};\n\n/**\n * Modal dialog overlay with backdrop. Compound component with `Dialog.Root`,\n * `Dialog.Trigger`, `Dialog.Title`, `Dialog.Description`, and `Dialog.Close`.\n *\n * @example\n * ```tsx\n * <Dialog.Root>\n * <Dialog.Trigger render={(p) => <Button {...p}>Delete</Button>} />\n * <Dialog>\n * <Dialog.Title>Delete Item</Dialog.Title>\n * <Dialog.Description>This action cannot be undone.</Dialog.Description>\n * <Dialog.Close render={(p) => <Button variant=\"destructive\" {...p}>Delete</Button>} />\n * </Dialog>\n * </Dialog.Root>\n * ```\n */\nfunction DialogContent({\n className,\n children,\n style,\n size = SF_DIALOG_DEFAULT_VARIANTS.size,\n}: DialogProps) {\n return (\n <DialogBase.Portal>\n <DialogBase.Backdrop className=\"fixed inset-0 bg-sf-overlay opacity-80 transition-all duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0\" />\n <Surface\n as={DialogBase.Popup}\n className={cn(dialogVariants({ size }), className)}\n style={\n {\n transitionProperty: \"scale, opacity\",\n transitionTimingFunction:\n \"var(--default-transition-timing-function)\",\n \"--tw-shadow\":\n \"0 20px 25px -5px rgb(0 0 0 / 0.03), 0 8px 10px -6px rgb(0 0 0 / 0.03)\",\n ...style,\n } as CSSProperties\n }\n >\n {children}\n </Surface>\n </DialogBase.Portal>\n );\n}\n\n// ============================================================================\n// Dialog Root\n// ============================================================================\n\ntype BaseDialogRootProps = ComponentPropsWithoutRef<typeof DialogBase.Root>;\n\nexport type DialogRootProps = BaseDialogRootProps;\n\nfunction DialogRoot({ children, ...props }: DialogRootProps) {\n return <DialogBase.Root {...props}>{children}</DialogBase.Root>;\n}\n\nDialogRoot.displayName = \"Dialog.Root\";\n\n// ============================================================================\n// Dialog Trigger\n// ============================================================================\n\ntype BaseDialogTriggerProps = ComponentPropsWithoutRef<\n typeof DialogBase.Trigger\n>;\n\nexport type DialogTriggerProps = BaseDialogTriggerProps;\n\nfunction DialogTrigger({ children, ...props }: DialogTriggerProps) {\n return <DialogBase.Trigger {...props}>{children}</DialogBase.Trigger>;\n}\n\nDialogTrigger.displayName = \"Dialog.Trigger\";\n\n// ============================================================================\n// Dialog Title\n// ============================================================================\n\ntype BaseDialogTitleProps = ComponentPropsWithoutRef<typeof DialogBase.Title>;\n\nexport type DialogTitleProps = BaseDialogTitleProps;\n\nfunction DialogTitle({ className, ...props }: DialogTitleProps) {\n return (\n <DialogBase.Title\n className={cn(\"text-xl font-semibold text-sf-default\", className)}\n {...props}\n />\n );\n}\n\nDialogTitle.displayName = \"Dialog.Title\";\n\n// ============================================================================\n// Dialog Description\n// ============================================================================\n\ntype BaseDialogDescriptionProps = ComponentPropsWithoutRef<\n typeof DialogBase.Description\n>;\n\nexport type DialogDescriptionProps = BaseDialogDescriptionProps;\n\nfunction DialogDescription({ className, ...props }: DialogDescriptionProps) {\n return (\n <DialogBase.Description\n className={cn(\"text-sm text-sf-subtle\", className)}\n {...props}\n />\n );\n}\n\nDialogDescription.displayName = \"Dialog.Description\";\n\n// ============================================================================\n// Dialog Close\n// ============================================================================\n\ntype BaseDialogCloseProps = ComponentPropsWithoutRef<typeof DialogBase.Close>;\n\nexport type DialogCloseProps = BaseDialogCloseProps;\n\nfunction DialogClose({ children, ...props }: DialogCloseProps) {\n return <DialogBase.Close {...props}>{children}</DialogBase.Close>;\n}\n\nDialogClose.displayName = \"Dialog.Close\";\n\n// ============================================================================\n// Compound Component Export\n// ============================================================================\n\nconst Dialog = Object.assign(DialogContent, {\n Root: DialogRoot,\n Trigger: DialogTrigger,\n Title: DialogTitle,\n Description: DialogDescription,\n Close: DialogClose,\n});\n\nexport {\n Dialog,\n DialogRoot,\n DialogTrigger,\n DialogTitle,\n DialogDescription,\n DialogClose,\n};\n"],"mappings":";;;;;;;AAOA,IAAa,qBAAqB,EAChC,MAAM;CACJ,MAAM;EACJ,SAAS;EACT,aAAa;EACd;CACD,IAAI;EACF,SAAS;EACT,aAAa;EACd;CACD,IAAI;EACF,SAAS;EACT,aAAa;EACd;CACD,IAAI;EACF,SAAS;EACT,aAAa;EACd;CACF,EACF;AAED,IAAa,6BAA6B,EACxC,MAAM,QACP;AA4ED,SAAgB,eAAe,EAC7B,OAAO,2BAA2B,SACT,EAAE,EAAE;AAC7B,QAAO,GAEL,wUAEA,mBAAmB,KAAK,MAAM,QAC/B;;;;;;;;;;;;;;;;;;AA2CH,SAAS,cAAc,EACrB,WACA,UACA,OACA,OAAO,2BAA2B,QACpB;AACd,QACE,qBAAC,OAAW,QAAZ,EAAA,UAAA,CACE,oBAAC,OAAW,UAAZ,EAAqB,WAAU,gIAAiI,CAAA,EAChK,oBAAC,SAAD;EACE,IAAI,OAAW;EACf,WAAW,GAAG,eAAe,EAAE,MAAM,CAAC,EAAE,UAAU;EAClD,OACE;GACE,oBAAoB;GACpB,0BACE;GACF,eACE;GACF,GAAG;GACJ;EAGF;EACO,CAAA,CACQ,EAAA,CAAA;;AAYxB,SAAS,WAAW,EAAE,UAAU,GAAG,SAA0B;AAC3D,QAAO,oBAAC,OAAW,MAAZ;EAAiB,GAAI;EAAQ;EAA2B,CAAA;;AAGjE,WAAW,cAAc;AAYzB,SAAS,cAAc,EAAE,UAAU,GAAG,SAA6B;AACjE,QAAO,oBAAC,OAAW,SAAZ;EAAoB,GAAI;EAAQ;EAA8B,CAAA;;AAGvE,cAAc,cAAc;AAU5B,SAAS,YAAY,EAAE,WAAW,GAAG,SAA2B;AAC9D,QACE,oBAAC,OAAW,OAAZ;EACE,WAAW,GAAG,yCAAyC,UAAU;EACjE,GAAI;EACJ,CAAA;;AAIN,YAAY,cAAc;AAY1B,SAAS,kBAAkB,EAAE,WAAW,GAAG,SAAiC;AAC1E,QACE,oBAAC,OAAW,aAAZ;EACE,WAAW,GAAG,0BAA0B,UAAU;EAClD,GAAI;EACJ,CAAA;;AAIN,kBAAkB,cAAc;AAUhC,SAAS,YAAY,EAAE,UAAU,GAAG,SAA2B;AAC7D,QAAO,oBAAC,OAAW,OAAZ;EAAkB,GAAI;EAAQ;EAA4B,CAAA;;AAGnE,YAAY,cAAc;AAM1B,IAAM,WAAS,OAAO,OAAO,eAAe;CAC1C,MAAM;CACN,SAAS;CACT,OAAO;CACP,aAAa;CACb,OAAO;CACR,CAAC"}