@techzyapp/ui-library 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (943) hide show
  1. package/dist/Accordion-CAxa1I-m.js +112 -0
  2. package/dist/Accordion-CAxa1I-m.js.map +1 -0
  3. package/dist/Accordion-Dy_dM79Y.cjs +2 -0
  4. package/dist/Accordion-Dy_dM79Y.cjs.map +1 -0
  5. package/dist/Alert-BQpA48PY.js +71 -0
  6. package/dist/Alert-BQpA48PY.js.map +1 -0
  7. package/dist/Alert-DKIjM-9x.cjs +2 -0
  8. package/dist/Alert-DKIjM-9x.cjs.map +1 -0
  9. package/dist/Avatar-BJVCdo-K.js +60 -0
  10. package/dist/Avatar-BJVCdo-K.js.map +1 -0
  11. package/dist/Avatar-_ufXh3AY.cjs +2 -0
  12. package/dist/Avatar-_ufXh3AY.cjs.map +1 -0
  13. package/dist/AvatarGroup-DdJf4aT7.js +33 -0
  14. package/dist/AvatarGroup-DdJf4aT7.js.map +1 -0
  15. package/dist/AvatarGroup-TW1pt4tj.cjs +2 -0
  16. package/dist/AvatarGroup-TW1pt4tj.cjs.map +1 -0
  17. package/dist/Badge-BQpr2Jee.cjs +2 -0
  18. package/dist/Badge-BQpr2Jee.cjs.map +1 -0
  19. package/dist/Badge-DSWigoGC.js +50 -0
  20. package/dist/Badge-DSWigoGC.js.map +1 -0
  21. package/dist/Breadcrumbs-Bx5UgwDy.js +35 -0
  22. package/dist/Breadcrumbs-Bx5UgwDy.js.map +1 -0
  23. package/dist/Breadcrumbs-CHONper7.cjs +2 -0
  24. package/dist/Breadcrumbs-CHONper7.cjs.map +1 -0
  25. package/dist/Button-D4bfVNNa.cjs +2 -0
  26. package/dist/Button-D4bfVNNa.cjs.map +1 -0
  27. package/dist/Button-DhEv0YFk.js +72 -0
  28. package/dist/Button-DhEv0YFk.js.map +1 -0
  29. package/dist/Calendar-Bh317SaV.js +267 -0
  30. package/dist/Calendar-Bh317SaV.js.map +1 -0
  31. package/dist/Calendar-C8uNezI-.cjs +2 -0
  32. package/dist/Calendar-C8uNezI-.cjs.map +1 -0
  33. package/dist/Card-CfyaerZZ.cjs +2 -0
  34. package/dist/Card-CfyaerZZ.cjs.map +1 -0
  35. package/dist/Card-DzClqJuu.js +118 -0
  36. package/dist/Card-DzClqJuu.js.map +1 -0
  37. package/dist/Checkbox-DXOzYIAz.cjs +2 -0
  38. package/dist/Checkbox-DXOzYIAz.cjs.map +1 -0
  39. package/dist/Checkbox-XKL_Q5qj.js +84 -0
  40. package/dist/Checkbox-XKL_Q5qj.js.map +1 -0
  41. package/dist/Chip-Cfo0v3Z8.js +92 -0
  42. package/dist/Chip-Cfo0v3Z8.js.map +1 -0
  43. package/dist/Chip-DSrdXLBU.cjs +2 -0
  44. package/dist/Chip-DSrdXLBU.cjs.map +1 -0
  45. package/dist/ChoiceCardGroup-6eFM1eL0.cjs +2 -0
  46. package/dist/ChoiceCardGroup-6eFM1eL0.cjs.map +1 -0
  47. package/dist/ChoiceCardGroup-CvFzZlgI.js +181 -0
  48. package/dist/ChoiceCardGroup-CvFzZlgI.js.map +1 -0
  49. package/dist/CodeBlock-DOk5wekc.cjs +2 -0
  50. package/dist/CodeBlock-DOk5wekc.cjs.map +1 -0
  51. package/dist/CodeBlock-n3KExtTO.js +104 -0
  52. package/dist/CodeBlock-n3KExtTO.js.map +1 -0
  53. package/dist/Col-D2TfZKiM.js +13 -0
  54. package/dist/Col-D2TfZKiM.js.map +1 -0
  55. package/dist/Col-R5mAy8T9.cjs +2 -0
  56. package/dist/Col-R5mAy8T9.cjs.map +1 -0
  57. package/dist/ColorPicker-2udt1ORM.js +119 -0
  58. package/dist/ColorPicker-2udt1ORM.js.map +1 -0
  59. package/dist/ColorPicker-BwmaXCOy.cjs +2 -0
  60. package/dist/ColorPicker-BwmaXCOy.cjs.map +1 -0
  61. package/dist/ColorPickerPanel-BM9OwDDE.js +336 -0
  62. package/dist/ColorPickerPanel-BM9OwDDE.js.map +1 -0
  63. package/dist/ColorPickerPanel-ByB1mLSi.cjs +2 -0
  64. package/dist/ColorPickerPanel-ByB1mLSi.cjs.map +1 -0
  65. package/dist/ConfigProvider-2c94kUOk.js +291 -0
  66. package/dist/ConfigProvider-2c94kUOk.js.map +1 -0
  67. package/dist/ConfigProvider-ByOFXVyP.cjs +2 -0
  68. package/dist/ConfigProvider-ByOFXVyP.cjs.map +1 -0
  69. package/dist/DatePicker-DF4Epkn8.cjs +2 -0
  70. package/dist/DatePicker-DF4Epkn8.cjs.map +1 -0
  71. package/dist/DatePicker-WM9TC6L_.js +191 -0
  72. package/dist/DatePicker-WM9TC6L_.js.map +1 -0
  73. package/dist/DatePicker.module-BZDftL4g.js +138 -0
  74. package/dist/DatePicker.module-BZDftL4g.js.map +1 -0
  75. package/dist/DatePicker.module-tE-tGNBd.cjs +2 -0
  76. package/dist/DatePicker.module-tE-tGNBd.cjs.map +1 -0
  77. package/dist/DateTimePicker-C557OjBU.cjs +2 -0
  78. package/dist/DateTimePicker-C557OjBU.cjs.map +1 -0
  79. package/dist/DateTimePicker-DBtcWK0F.js +245 -0
  80. package/dist/DateTimePicker-DBtcWK0F.js.map +1 -0
  81. package/dist/Divider-CzbhdCiD.cjs +2 -0
  82. package/dist/Divider-CzbhdCiD.cjs.map +1 -0
  83. package/dist/Divider-LtH3dLgw.js +36 -0
  84. package/dist/Divider-LtH3dLgw.js.map +1 -0
  85. package/dist/Dropdown-DKAXue5_.js +146 -0
  86. package/dist/Dropdown-DKAXue5_.js.map +1 -0
  87. package/dist/Dropdown-DygP50OB.cjs +2 -0
  88. package/dist/Dropdown-DygP50OB.cjs.map +1 -0
  89. package/dist/EmptyState-CCCpZ-ZA.cjs +2 -0
  90. package/dist/EmptyState-CCCpZ-ZA.cjs.map +1 -0
  91. package/dist/EmptyState-CetM49vk.js +38 -0
  92. package/dist/EmptyState-CetM49vk.js.map +1 -0
  93. package/dist/FileUploader-B4TJHyoi.cjs +2 -0
  94. package/dist/FileUploader-B4TJHyoi.cjs.map +1 -0
  95. package/dist/FileUploader-VtmmwUFE.js +684 -0
  96. package/dist/FileUploader-VtmmwUFE.js.map +1 -0
  97. package/dist/Flag-BWCX6oSR.js +24 -0
  98. package/dist/Flag-BWCX6oSR.js.map +1 -0
  99. package/dist/Flag-EPZOrH-U.cjs +2 -0
  100. package/dist/Flag-EPZOrH-U.cjs.map +1 -0
  101. package/dist/Flex-Bj3mMF5A.js +50 -0
  102. package/dist/Flex-Bj3mMF5A.js.map +1 -0
  103. package/dist/Flex-CqL3Ghda.cjs +2 -0
  104. package/dist/Flex-CqL3Ghda.cjs.map +1 -0
  105. package/dist/FloatingPanel-BG9Uag__.js +131 -0
  106. package/dist/FloatingPanel-BG9Uag__.js.map +1 -0
  107. package/dist/FloatingPanel-U6sGYiSK.cjs +2 -0
  108. package/dist/FloatingPanel-U6sGYiSK.cjs.map +1 -0
  109. package/dist/Form-Bz2xgkEm.cjs +2 -0
  110. package/dist/Form-Bz2xgkEm.cjs.map +1 -0
  111. package/dist/Form-kglaJYr5.js +9 -0
  112. package/dist/Form-kglaJYr5.js.map +1 -0
  113. package/dist/FullscreenToggle-DDKN5n8B.cjs +2 -0
  114. package/dist/FullscreenToggle-DDKN5n8B.cjs.map +1 -0
  115. package/dist/FullscreenToggle-oWzYqUPH.js +42 -0
  116. package/dist/FullscreenToggle-oWzYqUPH.js.map +1 -0
  117. package/dist/Grid-Bw95bKkJ.cjs +2 -0
  118. package/dist/Grid-Bw95bKkJ.cjs.map +1 -0
  119. package/dist/Grid-CY-syhTX.js +24 -0
  120. package/dist/Grid-CY-syhTX.js.map +1 -0
  121. package/dist/Icon-CXTl_QAP.cjs +2 -0
  122. package/dist/Icon-CXTl_QAP.cjs.map +1 -0
  123. package/dist/Icon-CophpkHo.js +1228 -0
  124. package/dist/Icon-CophpkHo.js.map +1 -0
  125. package/dist/IconButton-CBusrDa9.js +68 -0
  126. package/dist/IconButton-CBusrDa9.js.map +1 -0
  127. package/dist/IconButton-D6TenQZ_.cjs +2 -0
  128. package/dist/IconButton-D6TenQZ_.cjs.map +1 -0
  129. package/dist/List-BHgFI9Ll.js +26 -0
  130. package/dist/List-BHgFI9Ll.js.map +1 -0
  131. package/dist/List-CNz2M3-q.cjs +2 -0
  132. package/dist/List-CNz2M3-q.cjs.map +1 -0
  133. package/dist/ListItem-B4yqZR-Z.js +74 -0
  134. package/dist/ListItem-B4yqZR-Z.js.map +1 -0
  135. package/dist/ListItem-RH-D-Wey.cjs +2 -0
  136. package/dist/ListItem-RH-D-Wey.cjs.map +1 -0
  137. package/dist/Loader-C4JoXOyA.js +28 -0
  138. package/dist/Loader-C4JoXOyA.js.map +1 -0
  139. package/dist/Loader-D1MtlQOH.cjs +2 -0
  140. package/dist/Loader-D1MtlQOH.cjs.map +1 -0
  141. package/dist/Modal-B2YSCVVt.cjs +2 -0
  142. package/dist/Modal-B2YSCVVt.cjs.map +1 -0
  143. package/dist/Modal-BuaPDlKV.js +195 -0
  144. package/dist/Modal-BuaPDlKV.js.map +1 -0
  145. package/dist/MultiSelect-BGRT_B60.js +350 -0
  146. package/dist/MultiSelect-BGRT_B60.js.map +1 -0
  147. package/dist/MultiSelect-CSJKSWpA.cjs +2 -0
  148. package/dist/MultiSelect-CSJKSWpA.cjs.map +1 -0
  149. package/dist/MultilineTextField-CwNCJ9lZ.js +123 -0
  150. package/dist/MultilineTextField-CwNCJ9lZ.js.map +1 -0
  151. package/dist/MultilineTextField-Dz6Fg8RJ.cjs +2 -0
  152. package/dist/MultilineTextField-Dz6Fg8RJ.cjs.map +1 -0
  153. package/dist/NumberField-DBpO-Z_7.cjs +2 -0
  154. package/dist/NumberField-DBpO-Z_7.cjs.map +1 -0
  155. package/dist/NumberField-DBvhSQCw.js +183 -0
  156. package/dist/NumberField-DBvhSQCw.js.map +1 -0
  157. package/dist/OtpField-BUBYyorC.cjs +2 -0
  158. package/dist/OtpField-BUBYyorC.cjs.map +1 -0
  159. package/dist/OtpField-CTq-CUbF.js +171 -0
  160. package/dist/OtpField-CTq-CUbF.js.map +1 -0
  161. package/dist/PageLayout-DddzYw2B.js +12 -0
  162. package/dist/PageLayout-DddzYw2B.js.map +1 -0
  163. package/dist/PageLayout-Dfbjw6jD.cjs +2 -0
  164. package/dist/PageLayout-Dfbjw6jD.cjs.map +1 -0
  165. package/dist/Pagination-CN9V8M5C.js +139 -0
  166. package/dist/Pagination-CN9V8M5C.js.map +1 -0
  167. package/dist/Pagination-DRwTLPh8.cjs +2 -0
  168. package/dist/Pagination-DRwTLPh8.cjs.map +1 -0
  169. package/dist/Popover-CBI1icIM.cjs +2 -0
  170. package/dist/Popover-CBI1icIM.cjs.map +1 -0
  171. package/dist/Popover-CgIU4Rhg.js +65 -0
  172. package/dist/Popover-CgIU4Rhg.js.map +1 -0
  173. package/dist/RadioGroup-C8u7eNBS.cjs +2 -0
  174. package/dist/RadioGroup-C8u7eNBS.cjs.map +1 -0
  175. package/dist/RadioGroup-DbodUJW8.js +141 -0
  176. package/dist/RadioGroup-DbodUJW8.js.map +1 -0
  177. package/dist/RemoveDialog-Bvt6sH79.js +47 -0
  178. package/dist/RemoveDialog-Bvt6sH79.js.map +1 -0
  179. package/dist/RemoveDialog-ClyZKyUG.cjs +2 -0
  180. package/dist/RemoveDialog-ClyZKyUG.cjs.map +1 -0
  181. package/dist/RichTextEditor-BTx8Py3I.js +806 -0
  182. package/dist/RichTextEditor-BTx8Py3I.js.map +1 -0
  183. package/dist/RichTextEditor-CAYt1Zm1.cjs +2 -0
  184. package/dist/RichTextEditor-CAYt1Zm1.cjs.map +1 -0
  185. package/dist/RootLayout-Cp-9CVjP.cjs +2 -0
  186. package/dist/RootLayout-Cp-9CVjP.cjs.map +1 -0
  187. package/dist/RootLayout-DCpfuFWF.js +405 -0
  188. package/dist/RootLayout-DCpfuFWF.js.map +1 -0
  189. package/dist/Select-PbTyxB1Q.js +338 -0
  190. package/dist/Select-PbTyxB1Q.js.map +1 -0
  191. package/dist/Select-_6WogC0u.cjs +2 -0
  192. package/dist/Select-_6WogC0u.cjs.map +1 -0
  193. package/dist/Sidebar-AaIlRzgk.cjs +2 -0
  194. package/dist/Sidebar-AaIlRzgk.cjs.map +1 -0
  195. package/dist/Sidebar-DRCs2ygZ.js +422 -0
  196. package/dist/Sidebar-DRCs2ygZ.js.map +1 -0
  197. package/dist/Slider-dxYVXRev.cjs +2 -0
  198. package/dist/Slider-dxYVXRev.cjs.map +1 -0
  199. package/dist/Slider-oGXd5e9X.js +184 -0
  200. package/dist/Slider-oGXd5e9X.js.map +1 -0
  201. package/dist/SpeedDial-C4jxIXTr.cjs +2 -0
  202. package/dist/SpeedDial-C4jxIXTr.cjs.map +1 -0
  203. package/dist/SpeedDial-DgFj16BQ.js +165 -0
  204. package/dist/SpeedDial-DgFj16BQ.js.map +1 -0
  205. package/dist/Stepper-7pPEBRLI.cjs +2 -0
  206. package/dist/Stepper-7pPEBRLI.cjs.map +1 -0
  207. package/dist/Stepper-COKAyN1L.js +165 -0
  208. package/dist/Stepper-COKAyN1L.js.map +1 -0
  209. package/dist/SwatchPicker-D30aSrbY.js +129 -0
  210. package/dist/SwatchPicker-D30aSrbY.js.map +1 -0
  211. package/dist/SwatchPicker-DbAU9-ux.cjs +2 -0
  212. package/dist/SwatchPicker-DbAU9-ux.cjs.map +1 -0
  213. package/dist/Switch-DMPJ0fhB.js +85 -0
  214. package/dist/Switch-DMPJ0fhB.js.map +1 -0
  215. package/dist/Switch-DRkZ6kHJ.cjs +2 -0
  216. package/dist/Switch-DRkZ6kHJ.cjs.map +1 -0
  217. package/dist/Table-BeOumGng.cjs +2 -0
  218. package/dist/Table-BeOumGng.cjs.map +1 -0
  219. package/dist/Table-BjPLvMbf.js +1090 -0
  220. package/dist/Table-BjPLvMbf.js.map +1 -0
  221. package/dist/Tabs--DDM-zKe.js +190 -0
  222. package/dist/Tabs--DDM-zKe.js.map +1 -0
  223. package/dist/Tabs-BZcMnjdC.cjs +2 -0
  224. package/dist/Tabs-BZcMnjdC.cjs.map +1 -0
  225. package/dist/TagsField-BTJcZS9P.js +186 -0
  226. package/dist/TagsField-BTJcZS9P.js.map +1 -0
  227. package/dist/TagsField-kknWiJZZ.cjs +2 -0
  228. package/dist/TagsField-kknWiJZZ.cjs.map +1 -0
  229. package/dist/TextField-BPefnD5M.cjs +2 -0
  230. package/dist/TextField-BPefnD5M.cjs.map +1 -0
  231. package/dist/TextField-DMI1X09n.js +266 -0
  232. package/dist/TextField-DMI1X09n.js.map +1 -0
  233. package/dist/TextField.module-QePvGeJ3.js +27 -0
  234. package/dist/TextField.module-QePvGeJ3.js.map +1 -0
  235. package/dist/TextField.module-m-UllwzG.cjs +2 -0
  236. package/dist/TextField.module-m-UllwzG.cjs.map +1 -0
  237. package/dist/ThemeToggle-DTal3RX5.cjs +2 -0
  238. package/dist/ThemeToggle-DTal3RX5.cjs.map +1 -0
  239. package/dist/ThemeToggle-Deh9j8pm.js +28 -0
  240. package/dist/ThemeToggle-Deh9j8pm.js.map +1 -0
  241. package/dist/TimeColumns-BCNmu4b_.js +147 -0
  242. package/dist/TimeColumns-BCNmu4b_.js.map +1 -0
  243. package/dist/TimeColumns-Duh4DcYJ.cjs +2 -0
  244. package/dist/TimeColumns-Duh4DcYJ.cjs.map +1 -0
  245. package/dist/TimePicker-3JgvK2on.js +194 -0
  246. package/dist/TimePicker-3JgvK2on.js.map +1 -0
  247. package/dist/TimePicker-CfGrCH9T.cjs +2 -0
  248. package/dist/TimePicker-CfGrCH9T.cjs.map +1 -0
  249. package/dist/Timeline-CoxW0Ia_.cjs +2 -0
  250. package/dist/Timeline-CoxW0Ia_.cjs.map +1 -0
  251. package/dist/Timeline-WkV4k_we.js +71 -0
  252. package/dist/Timeline-WkV4k_we.js.map +1 -0
  253. package/dist/Toaster-Bk5GtPjX.cjs +2 -0
  254. package/dist/Toaster-Bk5GtPjX.cjs.map +1 -0
  255. package/dist/Toaster-D-eG1xv7.js +63 -0
  256. package/dist/Toaster-D-eG1xv7.js.map +1 -0
  257. package/dist/ToggleButtonGroup-BWd7MOcc.js +123 -0
  258. package/dist/ToggleButtonGroup-BWd7MOcc.js.map +1 -0
  259. package/dist/ToggleButtonGroup-DYRLwKKh.cjs +2 -0
  260. package/dist/ToggleButtonGroup-DYRLwKKh.cjs.map +1 -0
  261. package/dist/Tooltip-Ao7az09p.cjs +2 -0
  262. package/dist/Tooltip-Ao7az09p.cjs.map +1 -0
  263. package/dist/Tooltip-Cb_FKxT9.js +65 -0
  264. package/dist/Tooltip-Cb_FKxT9.js.map +1 -0
  265. package/dist/TranslatedFields-CI0F9bHw.js +82 -0
  266. package/dist/TranslatedFields-CI0F9bHw.js.map +1 -0
  267. package/dist/TranslatedFields-DT3bYse6.cjs +2 -0
  268. package/dist/TranslatedFields-DT3bYse6.cjs.map +1 -0
  269. package/dist/Typography-BFatE1_A.cjs +2 -0
  270. package/dist/Typography-BFatE1_A.cjs.map +1 -0
  271. package/dist/Typography-Cta6Rg4L.js +51 -0
  272. package/dist/Typography-Cta6Rg4L.js.map +1 -0
  273. package/dist/UserCard-BhqtX1vU.js +74 -0
  274. package/dist/UserCard-BhqtX1vU.js.map +1 -0
  275. package/dist/UserCard-OlLeyyS0.cjs +2 -0
  276. package/dist/UserCard-OlLeyyS0.cjs.map +1 -0
  277. package/dist/access-DPUHbE-S.cjs +2 -0
  278. package/dist/access-DPUHbE-S.cjs.map +1 -0
  279. package/dist/access-Db4knwyR.js +25 -0
  280. package/dist/access-Db4knwyR.js.map +1 -0
  281. package/dist/components/Accordion/Accordion.d.cts +43 -0
  282. package/dist/components/Accordion/Accordion.d.ts +43 -0
  283. package/dist/components/Accordion/AccordionItem.d.cts +20 -0
  284. package/dist/components/Accordion/AccordionItem.d.ts +20 -0
  285. package/dist/components/Accordion/accordionContext.d.cts +13 -0
  286. package/dist/components/Accordion/accordionContext.d.ts +13 -0
  287. package/dist/components/Accordion/index.cjs +2 -0
  288. package/dist/components/Accordion/index.cjs.map +1 -0
  289. package/dist/components/Accordion/index.d.cts +4 -0
  290. package/dist/components/Accordion/index.d.ts +4 -0
  291. package/dist/components/Accordion/index.js +7 -0
  292. package/dist/components/Accordion/index.js.map +1 -0
  293. package/dist/components/Alert/Alert.d.cts +30 -0
  294. package/dist/components/Alert/Alert.d.ts +30 -0
  295. package/dist/components/Alert/index.cjs +2 -0
  296. package/dist/components/Alert/index.cjs.map +1 -0
  297. package/dist/components/Alert/index.d.cts +2 -0
  298. package/dist/components/Alert/index.d.ts +2 -0
  299. package/dist/components/Alert/index.js +6 -0
  300. package/dist/components/Alert/index.js.map +1 -0
  301. package/dist/components/Avatar/Avatar.d.cts +28 -0
  302. package/dist/components/Avatar/Avatar.d.ts +28 -0
  303. package/dist/components/Avatar/AvatarGroup.d.cts +19 -0
  304. package/dist/components/Avatar/AvatarGroup.d.ts +19 -0
  305. package/dist/components/Avatar/index.cjs +2 -0
  306. package/dist/components/Avatar/index.cjs.map +1 -0
  307. package/dist/components/Avatar/index.d.cts +4 -0
  308. package/dist/components/Avatar/index.d.ts +4 -0
  309. package/dist/components/Avatar/index.js +8 -0
  310. package/dist/components/Avatar/index.js.map +1 -0
  311. package/dist/components/Badge/Badge.d.cts +26 -0
  312. package/dist/components/Badge/Badge.d.ts +26 -0
  313. package/dist/components/Badge/index.cjs +2 -0
  314. package/dist/components/Badge/index.cjs.map +1 -0
  315. package/dist/components/Badge/index.d.cts +2 -0
  316. package/dist/components/Badge/index.d.ts +2 -0
  317. package/dist/components/Badge/index.js +6 -0
  318. package/dist/components/Badge/index.js.map +1 -0
  319. package/dist/components/Breadcrumbs/Breadcrumbs.d.cts +17 -0
  320. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +17 -0
  321. package/dist/components/Breadcrumbs/index.cjs +2 -0
  322. package/dist/components/Breadcrumbs/index.cjs.map +1 -0
  323. package/dist/components/Breadcrumbs/index.d.cts +2 -0
  324. package/dist/components/Breadcrumbs/index.d.ts +2 -0
  325. package/dist/components/Breadcrumbs/index.js +6 -0
  326. package/dist/components/Breadcrumbs/index.js.map +1 -0
  327. package/dist/components/Button/Button.d.cts +23 -0
  328. package/dist/components/Button/Button.d.ts +23 -0
  329. package/dist/components/Button/index.cjs +2 -0
  330. package/dist/components/Button/index.cjs.map +1 -0
  331. package/dist/components/Button/index.d.cts +2 -0
  332. package/dist/components/Button/index.d.ts +2 -0
  333. package/dist/components/Button/index.js +6 -0
  334. package/dist/components/Button/index.js.map +1 -0
  335. package/dist/components/Card/Card.d.cts +37 -0
  336. package/dist/components/Card/Card.d.ts +37 -0
  337. package/dist/components/Card/index.cjs +2 -0
  338. package/dist/components/Card/index.cjs.map +1 -0
  339. package/dist/components/Card/index.d.cts +2 -0
  340. package/dist/components/Card/index.d.ts +2 -0
  341. package/dist/components/Card/index.js +6 -0
  342. package/dist/components/Card/index.js.map +1 -0
  343. package/dist/components/Checkbox/Checkbox.d.cts +29 -0
  344. package/dist/components/Checkbox/Checkbox.d.ts +29 -0
  345. package/dist/components/Checkbox/index.cjs +2 -0
  346. package/dist/components/Checkbox/index.cjs.map +1 -0
  347. package/dist/components/Checkbox/index.d.cts +2 -0
  348. package/dist/components/Checkbox/index.d.ts +2 -0
  349. package/dist/components/Checkbox/index.js +6 -0
  350. package/dist/components/Checkbox/index.js.map +1 -0
  351. package/dist/components/Chip/Chip.d.cts +37 -0
  352. package/dist/components/Chip/Chip.d.ts +37 -0
  353. package/dist/components/Chip/index.cjs +2 -0
  354. package/dist/components/Chip/index.cjs.map +1 -0
  355. package/dist/components/Chip/index.d.cts +2 -0
  356. package/dist/components/Chip/index.d.ts +2 -0
  357. package/dist/components/Chip/index.js +6 -0
  358. package/dist/components/Chip/index.js.map +1 -0
  359. package/dist/components/ChoiceCard/ChoiceCard.d.cts +41 -0
  360. package/dist/components/ChoiceCard/ChoiceCard.d.ts +41 -0
  361. package/dist/components/ChoiceCard/ChoiceCardGroup.d.cts +72 -0
  362. package/dist/components/ChoiceCard/ChoiceCardGroup.d.ts +72 -0
  363. package/dist/components/ChoiceCard/choiceCardContext.d.cts +21 -0
  364. package/dist/components/ChoiceCard/choiceCardContext.d.ts +21 -0
  365. package/dist/components/ChoiceCard/index.cjs +2 -0
  366. package/dist/components/ChoiceCard/index.cjs.map +1 -0
  367. package/dist/components/ChoiceCard/index.d.cts +4 -0
  368. package/dist/components/ChoiceCard/index.d.ts +4 -0
  369. package/dist/components/ChoiceCard/index.js +7 -0
  370. package/dist/components/ChoiceCard/index.js.map +1 -0
  371. package/dist/components/CodeBlock/CodeBlock.d.cts +30 -0
  372. package/dist/components/CodeBlock/CodeBlock.d.ts +30 -0
  373. package/dist/components/CodeBlock/index.cjs +2 -0
  374. package/dist/components/CodeBlock/index.cjs.map +1 -0
  375. package/dist/components/CodeBlock/index.d.cts +2 -0
  376. package/dist/components/CodeBlock/index.d.ts +2 -0
  377. package/dist/components/CodeBlock/index.js +6 -0
  378. package/dist/components/CodeBlock/index.js.map +1 -0
  379. package/dist/components/ColorPicker/ColorPicker.d.cts +47 -0
  380. package/dist/components/ColorPicker/ColorPicker.d.ts +47 -0
  381. package/dist/components/ColorPicker/ColorPickerPanel.d.cts +20 -0
  382. package/dist/components/ColorPicker/ColorPickerPanel.d.ts +20 -0
  383. package/dist/components/ColorPicker/colorUtils.d.cts +44 -0
  384. package/dist/components/ColorPicker/colorUtils.d.ts +44 -0
  385. package/dist/components/ColorPicker/index.cjs +2 -0
  386. package/dist/components/ColorPicker/index.cjs.map +1 -0
  387. package/dist/components/ColorPicker/index.d.cts +2 -0
  388. package/dist/components/ColorPicker/index.d.ts +2 -0
  389. package/dist/components/ColorPicker/index.js +6 -0
  390. package/dist/components/ColorPicker/index.js.map +1 -0
  391. package/dist/components/DatePicker/Calendar.d.cts +29 -0
  392. package/dist/components/DatePicker/Calendar.d.ts +29 -0
  393. package/dist/components/DatePicker/DatePicker.d.cts +66 -0
  394. package/dist/components/DatePicker/DatePicker.d.ts +66 -0
  395. package/dist/components/DatePicker/dateUtils.d.cts +86 -0
  396. package/dist/components/DatePicker/dateUtils.d.ts +86 -0
  397. package/dist/components/DatePicker/index.cjs +2 -0
  398. package/dist/components/DatePicker/index.cjs.map +1 -0
  399. package/dist/components/DatePicker/index.d.cts +2 -0
  400. package/dist/components/DatePicker/index.d.ts +2 -0
  401. package/dist/components/DatePicker/index.js +6 -0
  402. package/dist/components/DatePicker/index.js.map +1 -0
  403. package/dist/components/DateTimePicker/DateTimePicker.d.cts +79 -0
  404. package/dist/components/DateTimePicker/DateTimePicker.d.ts +79 -0
  405. package/dist/components/DateTimePicker/TimeColumns.d.cts +22 -0
  406. package/dist/components/DateTimePicker/TimeColumns.d.ts +22 -0
  407. package/dist/components/DateTimePicker/index.cjs +2 -0
  408. package/dist/components/DateTimePicker/index.cjs.map +1 -0
  409. package/dist/components/DateTimePicker/index.d.cts +2 -0
  410. package/dist/components/DateTimePicker/index.d.ts +2 -0
  411. package/dist/components/DateTimePicker/index.js +6 -0
  412. package/dist/components/DateTimePicker/index.js.map +1 -0
  413. package/dist/components/Divider/Divider.d.cts +17 -0
  414. package/dist/components/Divider/Divider.d.ts +17 -0
  415. package/dist/components/Divider/index.cjs +2 -0
  416. package/dist/components/Divider/index.cjs.map +1 -0
  417. package/dist/components/Divider/index.d.cts +2 -0
  418. package/dist/components/Divider/index.d.ts +2 -0
  419. package/dist/components/Divider/index.js +6 -0
  420. package/dist/components/Divider/index.js.map +1 -0
  421. package/dist/components/Dropdown/Dropdown.d.cts +44 -0
  422. package/dist/components/Dropdown/Dropdown.d.ts +44 -0
  423. package/dist/components/Dropdown/index.cjs +2 -0
  424. package/dist/components/Dropdown/index.cjs.map +1 -0
  425. package/dist/components/Dropdown/index.d.cts +2 -0
  426. package/dist/components/Dropdown/index.d.ts +2 -0
  427. package/dist/components/Dropdown/index.js +6 -0
  428. package/dist/components/Dropdown/index.js.map +1 -0
  429. package/dist/components/EmptyState/EmptyState.d.cts +29 -0
  430. package/dist/components/EmptyState/EmptyState.d.ts +29 -0
  431. package/dist/components/EmptyState/index.cjs +2 -0
  432. package/dist/components/EmptyState/index.cjs.map +1 -0
  433. package/dist/components/EmptyState/index.d.cts +2 -0
  434. package/dist/components/EmptyState/index.d.ts +2 -0
  435. package/dist/components/EmptyState/index.js +6 -0
  436. package/dist/components/EmptyState/index.js.map +1 -0
  437. package/dist/components/FileUploader/FileUploader.d.cts +144 -0
  438. package/dist/components/FileUploader/FileUploader.d.ts +144 -0
  439. package/dist/components/FileUploader/FileUploaderEditDialog.d.cts +34 -0
  440. package/dist/components/FileUploader/FileUploaderEditDialog.d.ts +34 -0
  441. package/dist/components/FileUploader/FileUploaderPreview.d.cts +23 -0
  442. package/dist/components/FileUploader/FileUploaderPreview.d.ts +23 -0
  443. package/dist/components/FileUploader/index.cjs +2 -0
  444. package/dist/components/FileUploader/index.cjs.map +1 -0
  445. package/dist/components/FileUploader/index.d.cts +2 -0
  446. package/dist/components/FileUploader/index.d.ts +2 -0
  447. package/dist/components/FileUploader/index.js +6 -0
  448. package/dist/components/FileUploader/index.js.map +1 -0
  449. package/dist/components/Flag/Flag.d.cts +14 -0
  450. package/dist/components/Flag/Flag.d.ts +14 -0
  451. package/dist/components/Flag/index.cjs +2 -0
  452. package/dist/components/Flag/index.cjs.map +1 -0
  453. package/dist/components/Flag/index.d.cts +2 -0
  454. package/dist/components/Flag/index.d.ts +2 -0
  455. package/dist/components/Flag/index.js +6 -0
  456. package/dist/components/Flag/index.js.map +1 -0
  457. package/dist/components/Flex/Col.d.cts +8 -0
  458. package/dist/components/Flex/Col.d.ts +8 -0
  459. package/dist/components/Flex/Flex.d.cts +32 -0
  460. package/dist/components/Flex/Flex.d.ts +32 -0
  461. package/dist/components/Flex/Grid.d.cts +28 -0
  462. package/dist/components/Flex/Grid.d.ts +28 -0
  463. package/dist/components/Flex/Row.d.cts +8 -0
  464. package/dist/components/Flex/Row.d.ts +8 -0
  465. package/dist/components/Flex/index.cjs +2 -0
  466. package/dist/components/Flex/index.cjs.map +1 -0
  467. package/dist/components/Flex/index.d.cts +8 -0
  468. package/dist/components/Flex/index.d.ts +8 -0
  469. package/dist/components/Flex/index.js +11 -0
  470. package/dist/components/Flex/index.js.map +1 -0
  471. package/dist/components/FloatingPanel/FloatingPanel.d.cts +39 -0
  472. package/dist/components/FloatingPanel/FloatingPanel.d.ts +39 -0
  473. package/dist/components/FullscreenToggle/FullscreenToggle.d.cts +12 -0
  474. package/dist/components/FullscreenToggle/FullscreenToggle.d.ts +12 -0
  475. package/dist/components/FullscreenToggle/index.cjs +2 -0
  476. package/dist/components/FullscreenToggle/index.cjs.map +1 -0
  477. package/dist/components/FullscreenToggle/index.d.cts +2 -0
  478. package/dist/components/FullscreenToggle/index.d.ts +2 -0
  479. package/dist/components/FullscreenToggle/index.js +6 -0
  480. package/dist/components/FullscreenToggle/index.js.map +1 -0
  481. package/dist/components/Icon/Icon.d.cts +19 -0
  482. package/dist/components/Icon/Icon.d.ts +19 -0
  483. package/dist/components/Icon/index.cjs +2 -0
  484. package/dist/components/Icon/index.cjs.map +1 -0
  485. package/dist/components/Icon/index.d.cts +4 -0
  486. package/dist/components/Icon/index.d.ts +4 -0
  487. package/dist/components/Icon/index.js +9 -0
  488. package/dist/components/Icon/index.js.map +1 -0
  489. package/dist/components/IconButton/IconButton.d.cts +28 -0
  490. package/dist/components/IconButton/IconButton.d.ts +28 -0
  491. package/dist/components/IconButton/index.cjs +2 -0
  492. package/dist/components/IconButton/index.cjs.map +1 -0
  493. package/dist/components/IconButton/index.d.cts +2 -0
  494. package/dist/components/IconButton/index.d.ts +2 -0
  495. package/dist/components/IconButton/index.js +6 -0
  496. package/dist/components/IconButton/index.js.map +1 -0
  497. package/dist/components/List/List.d.cts +20 -0
  498. package/dist/components/List/List.d.ts +20 -0
  499. package/dist/components/List/ListItem.d.cts +33 -0
  500. package/dist/components/List/ListItem.d.ts +33 -0
  501. package/dist/components/List/index.cjs +2 -0
  502. package/dist/components/List/index.cjs.map +1 -0
  503. package/dist/components/List/index.d.cts +4 -0
  504. package/dist/components/List/index.d.ts +4 -0
  505. package/dist/components/List/index.js +8 -0
  506. package/dist/components/List/index.js.map +1 -0
  507. package/dist/components/List/listContext.d.cts +5 -0
  508. package/dist/components/List/listContext.d.ts +5 -0
  509. package/dist/components/Loader/Loader.d.cts +15 -0
  510. package/dist/components/Loader/Loader.d.ts +15 -0
  511. package/dist/components/Loader/index.cjs +2 -0
  512. package/dist/components/Loader/index.cjs.map +1 -0
  513. package/dist/components/Loader/index.d.cts +2 -0
  514. package/dist/components/Loader/index.d.ts +2 -0
  515. package/dist/components/Loader/index.js +6 -0
  516. package/dist/components/Loader/index.js.map +1 -0
  517. package/dist/components/Modal/Modal.d.cts +63 -0
  518. package/dist/components/Modal/Modal.d.ts +63 -0
  519. package/dist/components/Modal/index.cjs +2 -0
  520. package/dist/components/Modal/index.cjs.map +1 -0
  521. package/dist/components/Modal/index.d.cts +2 -0
  522. package/dist/components/Modal/index.d.ts +2 -0
  523. package/dist/components/Modal/index.js +6 -0
  524. package/dist/components/Modal/index.js.map +1 -0
  525. package/dist/components/MultiSelect/MultiSelect.d.cts +72 -0
  526. package/dist/components/MultiSelect/MultiSelect.d.ts +72 -0
  527. package/dist/components/MultiSelect/index.cjs +2 -0
  528. package/dist/components/MultiSelect/index.cjs.map +1 -0
  529. package/dist/components/MultiSelect/index.d.cts +2 -0
  530. package/dist/components/MultiSelect/index.d.ts +2 -0
  531. package/dist/components/MultiSelect/index.js +6 -0
  532. package/dist/components/MultiSelect/index.js.map +1 -0
  533. package/dist/components/MultilineTextField/MultilineTextField.d.cts +28 -0
  534. package/dist/components/MultilineTextField/MultilineTextField.d.ts +28 -0
  535. package/dist/components/MultilineTextField/index.cjs +2 -0
  536. package/dist/components/MultilineTextField/index.cjs.map +1 -0
  537. package/dist/components/MultilineTextField/index.d.cts +2 -0
  538. package/dist/components/MultilineTextField/index.d.ts +2 -0
  539. package/dist/components/MultilineTextField/index.js +6 -0
  540. package/dist/components/MultilineTextField/index.js.map +1 -0
  541. package/dist/components/NumberField/NumberField.d.cts +45 -0
  542. package/dist/components/NumberField/NumberField.d.ts +45 -0
  543. package/dist/components/NumberField/index.cjs +2 -0
  544. package/dist/components/NumberField/index.cjs.map +1 -0
  545. package/dist/components/NumberField/index.d.cts +2 -0
  546. package/dist/components/NumberField/index.d.ts +2 -0
  547. package/dist/components/NumberField/index.js +6 -0
  548. package/dist/components/NumberField/index.js.map +1 -0
  549. package/dist/components/OtpField/OtpField.d.cts +55 -0
  550. package/dist/components/OtpField/OtpField.d.ts +55 -0
  551. package/dist/components/OtpField/index.cjs +2 -0
  552. package/dist/components/OtpField/index.cjs.map +1 -0
  553. package/dist/components/OtpField/index.d.cts +2 -0
  554. package/dist/components/OtpField/index.d.ts +2 -0
  555. package/dist/components/OtpField/index.js +6 -0
  556. package/dist/components/OtpField/index.js.map +1 -0
  557. package/dist/components/Overlay/Overlay.d.cts +29 -0
  558. package/dist/components/Overlay/Overlay.d.ts +29 -0
  559. package/dist/components/PageLayout/PageLayout.d.cts +13 -0
  560. package/dist/components/PageLayout/PageLayout.d.ts +13 -0
  561. package/dist/components/PageLayout/index.cjs +2 -0
  562. package/dist/components/PageLayout/index.cjs.map +1 -0
  563. package/dist/components/PageLayout/index.d.cts +2 -0
  564. package/dist/components/PageLayout/index.d.ts +2 -0
  565. package/dist/components/PageLayout/index.js +6 -0
  566. package/dist/components/PageLayout/index.js.map +1 -0
  567. package/dist/components/Pagination/Pagination.d.cts +44 -0
  568. package/dist/components/Pagination/Pagination.d.ts +44 -0
  569. package/dist/components/Pagination/index.cjs +2 -0
  570. package/dist/components/Pagination/index.cjs.map +1 -0
  571. package/dist/components/Pagination/index.d.cts +2 -0
  572. package/dist/components/Pagination/index.d.ts +2 -0
  573. package/dist/components/Pagination/index.js +6 -0
  574. package/dist/components/Pagination/index.js.map +1 -0
  575. package/dist/components/Pagination/paginationRange.d.cts +21 -0
  576. package/dist/components/Pagination/paginationRange.d.ts +21 -0
  577. package/dist/components/Popover/Popover.d.cts +43 -0
  578. package/dist/components/Popover/Popover.d.ts +43 -0
  579. package/dist/components/Popover/index.cjs +2 -0
  580. package/dist/components/Popover/index.cjs.map +1 -0
  581. package/dist/components/Popover/index.d.cts +2 -0
  582. package/dist/components/Popover/index.d.ts +2 -0
  583. package/dist/components/Popover/index.js +6 -0
  584. package/dist/components/Popover/index.js.map +1 -0
  585. package/dist/components/Radio/Radio.d.cts +27 -0
  586. package/dist/components/Radio/Radio.d.ts +27 -0
  587. package/dist/components/Radio/RadioGroup.d.cts +47 -0
  588. package/dist/components/Radio/RadioGroup.d.ts +47 -0
  589. package/dist/components/Radio/index.cjs +2 -0
  590. package/dist/components/Radio/index.cjs.map +1 -0
  591. package/dist/components/Radio/index.d.cts +4 -0
  592. package/dist/components/Radio/index.d.ts +4 -0
  593. package/dist/components/Radio/index.js +7 -0
  594. package/dist/components/Radio/index.js.map +1 -0
  595. package/dist/components/Radio/radioContext.d.cts +18 -0
  596. package/dist/components/Radio/radioContext.d.ts +18 -0
  597. package/dist/components/RemoveDialog/RemoveDialog.d.cts +35 -0
  598. package/dist/components/RemoveDialog/RemoveDialog.d.ts +35 -0
  599. package/dist/components/RemoveDialog/index.cjs +2 -0
  600. package/dist/components/RemoveDialog/index.cjs.map +1 -0
  601. package/dist/components/RemoveDialog/index.d.cts +2 -0
  602. package/dist/components/RemoveDialog/index.d.ts +2 -0
  603. package/dist/components/RemoveDialog/index.js +6 -0
  604. package/dist/components/RemoveDialog/index.js.map +1 -0
  605. package/dist/components/RichTextEditor/RichTextEditor.d.cts +48 -0
  606. package/dist/components/RichTextEditor/RichTextEditor.d.ts +48 -0
  607. package/dist/components/RichTextEditor/Toolbar.d.cts +10 -0
  608. package/dist/components/RichTextEditor/Toolbar.d.ts +10 -0
  609. package/dist/components/RichTextEditor/index.cjs +2 -0
  610. package/dist/components/RichTextEditor/index.cjs.map +1 -0
  611. package/dist/components/RichTextEditor/index.d.cts +2 -0
  612. package/dist/components/RichTextEditor/index.d.ts +2 -0
  613. package/dist/components/RichTextEditor/index.js +6 -0
  614. package/dist/components/RichTextEditor/index.js.map +1 -0
  615. package/dist/components/RichTextEditor/nodes/ImageNode.d.cts +33 -0
  616. package/dist/components/RichTextEditor/nodes/ImageNode.d.ts +33 -0
  617. package/dist/components/RichTextEditor/nodes/VideoNode.d.cts +36 -0
  618. package/dist/components/RichTextEditor/nodes/VideoNode.d.ts +36 -0
  619. package/dist/components/RichTextEditor/urlSafety.d.cts +16 -0
  620. package/dist/components/RichTextEditor/urlSafety.d.ts +16 -0
  621. package/dist/components/RootLayout/RootLayout.d.cts +46 -0
  622. package/dist/components/RootLayout/RootLayout.d.ts +46 -0
  623. package/dist/components/RootLayout/SettingsDrawer.d.cts +23 -0
  624. package/dist/components/RootLayout/SettingsDrawer.d.ts +23 -0
  625. package/dist/components/RootLayout/index.cjs +2 -0
  626. package/dist/components/RootLayout/index.cjs.map +1 -0
  627. package/dist/components/RootLayout/index.d.cts +2 -0
  628. package/dist/components/RootLayout/index.d.ts +2 -0
  629. package/dist/components/RootLayout/index.js +6 -0
  630. package/dist/components/RootLayout/index.js.map +1 -0
  631. package/dist/components/Select/Select.d.cts +85 -0
  632. package/dist/components/Select/Select.d.ts +85 -0
  633. package/dist/components/Select/index.cjs +2 -0
  634. package/dist/components/Select/index.cjs.map +1 -0
  635. package/dist/components/Select/index.d.cts +2 -0
  636. package/dist/components/Select/index.d.ts +2 -0
  637. package/dist/components/Select/index.js +6 -0
  638. package/dist/components/Select/index.js.map +1 -0
  639. package/dist/components/Sidebar/Sidebar.d.cts +90 -0
  640. package/dist/components/Sidebar/Sidebar.d.ts +90 -0
  641. package/dist/components/Sidebar/index.cjs +2 -0
  642. package/dist/components/Sidebar/index.cjs.map +1 -0
  643. package/dist/components/Sidebar/index.d.cts +1 -0
  644. package/dist/components/Sidebar/index.d.ts +1 -0
  645. package/dist/components/Sidebar/index.js +7 -0
  646. package/dist/components/Sidebar/index.js.map +1 -0
  647. package/dist/components/Slider/Slider.d.cts +58 -0
  648. package/dist/components/Slider/Slider.d.ts +58 -0
  649. package/dist/components/Slider/index.cjs +2 -0
  650. package/dist/components/Slider/index.cjs.map +1 -0
  651. package/dist/components/Slider/index.d.cts +2 -0
  652. package/dist/components/Slider/index.d.ts +2 -0
  653. package/dist/components/Slider/index.js +6 -0
  654. package/dist/components/Slider/index.js.map +1 -0
  655. package/dist/components/SpeedDial/SpeedDial.d.cts +56 -0
  656. package/dist/components/SpeedDial/SpeedDial.d.ts +56 -0
  657. package/dist/components/SpeedDial/SpeedDialAction.d.cts +18 -0
  658. package/dist/components/SpeedDial/SpeedDialAction.d.ts +18 -0
  659. package/dist/components/SpeedDial/index.cjs +2 -0
  660. package/dist/components/SpeedDial/index.cjs.map +1 -0
  661. package/dist/components/SpeedDial/index.d.cts +4 -0
  662. package/dist/components/SpeedDial/index.d.ts +4 -0
  663. package/dist/components/SpeedDial/index.js +7 -0
  664. package/dist/components/SpeedDial/index.js.map +1 -0
  665. package/dist/components/SpeedDial/speedDialContext.d.cts +19 -0
  666. package/dist/components/SpeedDial/speedDialContext.d.ts +19 -0
  667. package/dist/components/Stepper/Stepper.d.cts +94 -0
  668. package/dist/components/Stepper/Stepper.d.ts +94 -0
  669. package/dist/components/Stepper/index.cjs +2 -0
  670. package/dist/components/Stepper/index.cjs.map +1 -0
  671. package/dist/components/Stepper/index.d.cts +2 -0
  672. package/dist/components/Stepper/index.d.ts +2 -0
  673. package/dist/components/Stepper/index.js +6 -0
  674. package/dist/components/Stepper/index.js.map +1 -0
  675. package/dist/components/SwatchPicker/SwatchPicker.d.cts +43 -0
  676. package/dist/components/SwatchPicker/SwatchPicker.d.ts +43 -0
  677. package/dist/components/SwatchPicker/index.cjs +2 -0
  678. package/dist/components/SwatchPicker/index.cjs.map +1 -0
  679. package/dist/components/SwatchPicker/index.d.cts +2 -0
  680. package/dist/components/SwatchPicker/index.d.ts +2 -0
  681. package/dist/components/SwatchPicker/index.js +6 -0
  682. package/dist/components/SwatchPicker/index.js.map +1 -0
  683. package/dist/components/Switch/Switch.d.cts +29 -0
  684. package/dist/components/Switch/Switch.d.ts +29 -0
  685. package/dist/components/Switch/index.cjs +2 -0
  686. package/dist/components/Switch/index.cjs.map +1 -0
  687. package/dist/components/Switch/index.d.cts +2 -0
  688. package/dist/components/Switch/index.d.ts +2 -0
  689. package/dist/components/Switch/index.js +6 -0
  690. package/dist/components/Switch/index.js.map +1 -0
  691. package/dist/components/Table/Table.d.cts +248 -0
  692. package/dist/components/Table/Table.d.ts +248 -0
  693. package/dist/components/Table/TableFilters.d.cts +16 -0
  694. package/dist/components/Table/TableFilters.d.ts +16 -0
  695. package/dist/components/Table/index.cjs +2 -0
  696. package/dist/components/Table/index.cjs.map +1 -0
  697. package/dist/components/Table/index.d.cts +3 -0
  698. package/dist/components/Table/index.d.ts +3 -0
  699. package/dist/components/Table/index.js +6 -0
  700. package/dist/components/Table/index.js.map +1 -0
  701. package/dist/components/Table/tableFilter.d.cts +65 -0
  702. package/dist/components/Table/tableFilter.d.ts +65 -0
  703. package/dist/components/Tabs/Tabs.d.cts +80 -0
  704. package/dist/components/Tabs/Tabs.d.ts +80 -0
  705. package/dist/components/Tabs/index.cjs +2 -0
  706. package/dist/components/Tabs/index.cjs.map +1 -0
  707. package/dist/components/Tabs/index.d.cts +2 -0
  708. package/dist/components/Tabs/index.d.ts +2 -0
  709. package/dist/components/Tabs/index.js +6 -0
  710. package/dist/components/Tabs/index.js.map +1 -0
  711. package/dist/components/TagsField/TagsField.d.cts +47 -0
  712. package/dist/components/TagsField/TagsField.d.ts +47 -0
  713. package/dist/components/TagsField/index.cjs +2 -0
  714. package/dist/components/TagsField/index.cjs.map +1 -0
  715. package/dist/components/TagsField/index.d.cts +2 -0
  716. package/dist/components/TagsField/index.d.ts +2 -0
  717. package/dist/components/TagsField/index.js +6 -0
  718. package/dist/components/TagsField/index.js.map +1 -0
  719. package/dist/components/TextField/TextField.d.cts +62 -0
  720. package/dist/components/TextField/TextField.d.ts +62 -0
  721. package/dist/components/TextField/index.cjs +2 -0
  722. package/dist/components/TextField/index.cjs.map +1 -0
  723. package/dist/components/TextField/index.d.cts +2 -0
  724. package/dist/components/TextField/index.d.ts +2 -0
  725. package/dist/components/TextField/index.js +6 -0
  726. package/dist/components/TextField/index.js.map +1 -0
  727. package/dist/components/ThemeToggle/ThemeToggle.d.cts +9 -0
  728. package/dist/components/ThemeToggle/ThemeToggle.d.ts +9 -0
  729. package/dist/components/ThemeToggle/index.cjs +2 -0
  730. package/dist/components/ThemeToggle/index.cjs.map +1 -0
  731. package/dist/components/ThemeToggle/index.d.cts +2 -0
  732. package/dist/components/ThemeToggle/index.d.ts +2 -0
  733. package/dist/components/ThemeToggle/index.js +6 -0
  734. package/dist/components/ThemeToggle/index.js.map +1 -0
  735. package/dist/components/TimePicker/TimePicker.d.cts +68 -0
  736. package/dist/components/TimePicker/TimePicker.d.ts +68 -0
  737. package/dist/components/TimePicker/index.cjs +2 -0
  738. package/dist/components/TimePicker/index.cjs.map +1 -0
  739. package/dist/components/TimePicker/index.d.cts +2 -0
  740. package/dist/components/TimePicker/index.d.ts +2 -0
  741. package/dist/components/TimePicker/index.js +6 -0
  742. package/dist/components/TimePicker/index.js.map +1 -0
  743. package/dist/components/Timeline/Timeline.d.cts +37 -0
  744. package/dist/components/Timeline/Timeline.d.ts +37 -0
  745. package/dist/components/Timeline/TimelineItem.d.cts +26 -0
  746. package/dist/components/Timeline/TimelineItem.d.ts +26 -0
  747. package/dist/components/Timeline/index.cjs +2 -0
  748. package/dist/components/Timeline/index.cjs.map +1 -0
  749. package/dist/components/Timeline/index.d.cts +4 -0
  750. package/dist/components/Timeline/index.d.ts +4 -0
  751. package/dist/components/Timeline/index.js +7 -0
  752. package/dist/components/Timeline/index.js.map +1 -0
  753. package/dist/components/Timeline/timelineContext.d.cts +10 -0
  754. package/dist/components/Timeline/timelineContext.d.ts +10 -0
  755. package/dist/components/Toast/ToastItem.d.cts +12 -0
  756. package/dist/components/Toast/ToastItem.d.ts +12 -0
  757. package/dist/components/Toast/Toaster.d.cts +18 -0
  758. package/dist/components/Toast/Toaster.d.ts +18 -0
  759. package/dist/components/Toast/index.cjs +2 -0
  760. package/dist/components/Toast/index.cjs.map +1 -0
  761. package/dist/components/Toast/index.d.cts +4 -0
  762. package/dist/components/Toast/index.d.ts +4 -0
  763. package/dist/components/Toast/index.js +8 -0
  764. package/dist/components/Toast/index.js.map +1 -0
  765. package/dist/components/Toast/toastStore.d.cts +45 -0
  766. package/dist/components/Toast/toastStore.d.ts +45 -0
  767. package/dist/components/ToggleButton/ToggleButton.d.cts +26 -0
  768. package/dist/components/ToggleButton/ToggleButton.d.ts +26 -0
  769. package/dist/components/ToggleButton/ToggleButtonGroup.d.cts +52 -0
  770. package/dist/components/ToggleButton/ToggleButtonGroup.d.ts +52 -0
  771. package/dist/components/ToggleButton/index.cjs +2 -0
  772. package/dist/components/ToggleButton/index.cjs.map +1 -0
  773. package/dist/components/ToggleButton/index.d.cts +4 -0
  774. package/dist/components/ToggleButton/index.d.ts +4 -0
  775. package/dist/components/ToggleButton/index.js +7 -0
  776. package/dist/components/ToggleButton/index.js.map +1 -0
  777. package/dist/components/ToggleButton/toggleButtonGroupContext.d.cts +15 -0
  778. package/dist/components/ToggleButton/toggleButtonGroupContext.d.ts +15 -0
  779. package/dist/components/Tooltip/Tooltip.d.cts +21 -0
  780. package/dist/components/Tooltip/Tooltip.d.ts +21 -0
  781. package/dist/components/Tooltip/index.cjs +2 -0
  782. package/dist/components/Tooltip/index.cjs.map +1 -0
  783. package/dist/components/Tooltip/index.d.cts +2 -0
  784. package/dist/components/Tooltip/index.d.ts +2 -0
  785. package/dist/components/Tooltip/index.js +6 -0
  786. package/dist/components/Tooltip/index.js.map +1 -0
  787. package/dist/components/TranslatedFields/TranslatedFields.d.cts +56 -0
  788. package/dist/components/TranslatedFields/TranslatedFields.d.ts +56 -0
  789. package/dist/components/TranslatedFields/index.cjs +2 -0
  790. package/dist/components/TranslatedFields/index.cjs.map +1 -0
  791. package/dist/components/TranslatedFields/index.d.cts +2 -0
  792. package/dist/components/TranslatedFields/index.d.ts +2 -0
  793. package/dist/components/TranslatedFields/index.js +6 -0
  794. package/dist/components/TranslatedFields/index.js.map +1 -0
  795. package/dist/components/Typography/Typography.d.cts +30 -0
  796. package/dist/components/Typography/Typography.d.ts +30 -0
  797. package/dist/components/Typography/index.cjs +2 -0
  798. package/dist/components/Typography/index.cjs.map +1 -0
  799. package/dist/components/Typography/index.d.cts +2 -0
  800. package/dist/components/Typography/index.d.ts +2 -0
  801. package/dist/components/Typography/index.js +6 -0
  802. package/dist/components/Typography/index.js.map +1 -0
  803. package/dist/components/UserCard/UserCard.d.cts +33 -0
  804. package/dist/components/UserCard/UserCard.d.ts +33 -0
  805. package/dist/components/UserCard/index.cjs +2 -0
  806. package/dist/components/UserCard/index.cjs.map +1 -0
  807. package/dist/components/UserCard/index.d.cts +2 -0
  808. package/dist/components/UserCard/index.d.ts +2 -0
  809. package/dist/components/UserCard/index.js +6 -0
  810. package/dist/components/UserCard/index.js.map +1 -0
  811. package/dist/components/index.d.cts +57 -0
  812. package/dist/components/index.d.ts +57 -0
  813. package/dist/entries/components.cjs +2 -0
  814. package/dist/entries/components.cjs.map +1 -0
  815. package/dist/entries/components.d.cts +3 -0
  816. package/dist/entries/components.d.ts +3 -0
  817. package/dist/entries/components.js +140 -0
  818. package/dist/entries/components.js.map +1 -0
  819. package/dist/entries/helpers.cjs +2 -0
  820. package/dist/entries/helpers.cjs.map +1 -0
  821. package/dist/entries/helpers.d.cts +4 -0
  822. package/dist/entries/helpers.d.ts +4 -0
  823. package/dist/entries/helpers.js +17 -0
  824. package/dist/entries/helpers.js.map +1 -0
  825. package/dist/entries/hooks.cjs +2 -0
  826. package/dist/entries/hooks.cjs.map +1 -0
  827. package/dist/entries/hooks.d.cts +7 -0
  828. package/dist/entries/hooks.d.ts +7 -0
  829. package/dist/entries/hooks.js +12 -0
  830. package/dist/entries/hooks.js.map +1 -0
  831. package/dist/entries/i18n.cjs +2 -0
  832. package/dist/entries/i18n.cjs.map +1 -0
  833. package/dist/entries/i18n.d.cts +3 -0
  834. package/dist/entries/i18n.d.ts +3 -0
  835. package/dist/entries/i18n.js +11 -0
  836. package/dist/entries/i18n.js.map +1 -0
  837. package/dist/entries/icons.cjs +2 -0
  838. package/dist/entries/icons.cjs.map +1 -0
  839. package/dist/entries/icons.d.cts +2 -0
  840. package/dist/entries/icons.d.ts +2 -0
  841. package/dist/entries/icons.js +9 -0
  842. package/dist/entries/icons.js.map +1 -0
  843. package/dist/entries/theme.cjs +2 -0
  844. package/dist/entries/theme.cjs.map +1 -0
  845. package/dist/entries/theme.d.cts +2 -0
  846. package/dist/entries/theme.d.ts +2 -0
  847. package/dist/entries/theme.js +18 -0
  848. package/dist/entries/theme.js.map +1 -0
  849. package/dist/form/Form.d.cts +14 -0
  850. package/dist/form/Form.d.ts +14 -0
  851. package/dist/form/formContext.d.cts +8 -0
  852. package/dist/form/formContext.d.ts +8 -0
  853. package/dist/form/index.d.cts +5 -0
  854. package/dist/form/index.d.ts +5 -0
  855. package/dist/form/useForm.d.cts +81 -0
  856. package/dist/form/useForm.d.ts +81 -0
  857. package/dist/formContext-B7ln1Miy.js +10 -0
  858. package/dist/formContext-B7ln1Miy.js.map +1 -0
  859. package/dist/formContext-bTWrqdEV.cjs +2 -0
  860. package/dist/formContext-bTWrqdEV.cjs.map +1 -0
  861. package/dist/helpers/access.d.cts +11 -0
  862. package/dist/helpers/access.d.ts +11 -0
  863. package/dist/helpers/table.d.cts +41 -0
  864. package/dist/helpers/table.d.ts +41 -0
  865. package/dist/helpers/translations.d.cts +63 -0
  866. package/dist/helpers/translations.d.ts +63 -0
  867. package/dist/hooks/index.d.cts +4 -0
  868. package/dist/hooks/index.d.ts +4 -0
  869. package/dist/hooks/useDisclosure.d.cts +7 -0
  870. package/dist/hooks/useDisclosure.d.ts +7 -0
  871. package/dist/hooks/useFloatingPanel.d.cts +45 -0
  872. package/dist/hooks/useFloatingPanel.d.ts +45 -0
  873. package/dist/hooks/useLockBodyScroll.d.cts +7 -0
  874. package/dist/hooks/useLockBodyScroll.d.ts +7 -0
  875. package/dist/hooks/useMediaQuery.d.cts +13 -0
  876. package/dist/hooks/useMediaQuery.d.ts +13 -0
  877. package/dist/i18n/locales/de.d.cts +5 -0
  878. package/dist/i18n/locales/de.d.ts +5 -0
  879. package/dist/i18n/locales/en.d.cts +9 -0
  880. package/dist/i18n/locales/en.d.ts +9 -0
  881. package/dist/i18n/locales/es.d.cts +5 -0
  882. package/dist/i18n/locales/es.d.ts +5 -0
  883. package/dist/i18n/locales/fr.d.cts +5 -0
  884. package/dist/i18n/locales/fr.d.ts +5 -0
  885. package/dist/i18n/locales/it.d.cts +5 -0
  886. package/dist/i18n/locales/it.d.ts +5 -0
  887. package/dist/i18n/locales/ka.d.cts +8 -0
  888. package/dist/i18n/locales/ka.d.ts +8 -0
  889. package/dist/i18n/locales/ru.d.cts +5 -0
  890. package/dist/i18n/locales/ru.d.ts +5 -0
  891. package/dist/i18n/messages.d.cts +241 -0
  892. package/dist/i18n/messages.d.ts +241 -0
  893. package/dist/icons/icons.d.cts +2 -0
  894. package/dist/icons/icons.d.ts +2 -0
  895. package/dist/icons/names.d.cts +3 -0
  896. package/dist/icons/names.d.ts +3 -0
  897. package/dist/index.cjs +2 -0
  898. package/dist/index.cjs.map +1 -0
  899. package/dist/index.css +203 -0
  900. package/dist/index.d.cts +6 -0
  901. package/dist/index.d.ts +6 -0
  902. package/dist/index.js +185 -0
  903. package/dist/index.js.map +1 -0
  904. package/dist/messages-C-zecFBE.js +1363 -0
  905. package/dist/messages-C-zecFBE.js.map +1 -0
  906. package/dist/messages-Cy-qK5xU.cjs +36 -0
  907. package/dist/messages-Cy-qK5xU.cjs.map +1 -0
  908. package/dist/names-C2Yj1p3u.cjs +2 -0
  909. package/dist/names-C2Yj1p3u.cjs.map +1 -0
  910. package/dist/names-D8ABK2Wk.js +1205 -0
  911. package/dist/names-D8ABK2Wk.js.map +1 -0
  912. package/dist/reset.css +78 -0
  913. package/dist/table-CZRQGNdk.cjs +2 -0
  914. package/dist/table-CZRQGNdk.cjs.map +1 -0
  915. package/dist/table-DF3zTrC3.js +49 -0
  916. package/dist/table-DF3zTrC3.js.map +1 -0
  917. package/dist/theme/ConfigProvider.d.cts +362 -0
  918. package/dist/theme/ConfigProvider.d.ts +362 -0
  919. package/dist/theme/applyTheme.d.cts +28 -0
  920. package/dist/theme/applyTheme.d.ts +28 -0
  921. package/dist/theme/index.d.cts +5 -0
  922. package/dist/theme/index.d.ts +5 -0
  923. package/dist/toastStore-B4Tk2Xk7.cjs +2 -0
  924. package/dist/toastStore-B4Tk2Xk7.cjs.map +1 -0
  925. package/dist/toastStore-Cx_JOKwS.js +32 -0
  926. package/dist/toastStore-Cx_JOKwS.js.map +1 -0
  927. package/dist/translations-CXEeeUDL.cjs +2 -0
  928. package/dist/translations-CXEeeUDL.cjs.map +1 -0
  929. package/dist/translations-D15tFHM1.js +74 -0
  930. package/dist/translations-D15tFHM1.js.map +1 -0
  931. package/dist/useForm-B_5wDIER.js +126 -0
  932. package/dist/useForm-B_5wDIER.js.map +1 -0
  933. package/dist/useForm-C7erBHt0.cjs +2 -0
  934. package/dist/useForm-C7erBHt0.cjs.map +1 -0
  935. package/dist/useLockBodyScroll-CIXHZo-Q.cjs +2 -0
  936. package/dist/useLockBodyScroll-CIXHZo-Q.cjs.map +1 -0
  937. package/dist/useLockBodyScroll-DwBILLPK.js +35 -0
  938. package/dist/useLockBodyScroll-DwBILLPK.js.map +1 -0
  939. package/dist/useMediaQuery-BCsNfMA1.cjs +2 -0
  940. package/dist/useMediaQuery-BCsNfMA1.cjs.map +1 -0
  941. package/dist/useMediaQuery-_1EcFoC5.js +17 -0
  942. package/dist/useMediaQuery-_1EcFoC5.js.map +1 -0
  943. package/package.json +244 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table-BjPLvMbf.js","sources":["../src/components/Table/tableFilter.ts","../src/components/Table/TableFilters.tsx","../src/components/Table/Table.tsx"],"sourcesContent":["// Table filters — the declarative filter model + the pure local matcher. `applyFilters` is used by the\n// Table in local mode (client-side) and is pure/testable; server mode just emits the filter state in\n// `onChange`. Core filter types only (text / number / range / select / multi / boolean / date / dateRange).\nimport type { TableQueryConfig } from '../../theme'\nimport type { SelectOption } from '../Select'\n\n/** Which control + matching logic a filter uses. */\nexport type TableFilterType =\n | 'text'\n | 'number'\n | 'numberRange'\n | 'numberRangeSlider'\n | 'select'\n | 'multiSelect'\n | 'boolean'\n | 'date'\n | 'dateRange'\n | 'time'\n | 'timeRange'\n | 'dateTime'\n | 'dateTimeRange'\n\n/** The value a single filter holds — shape depends on its `type` (see each control). `null` / empty = off. */\nexport type TableFilterValue =\n | string // text · select · date · time · dateTime\n | number // number\n | boolean // boolean\n | string[] // multiSelect\n | [number | null, number | null] // numberRange · numberRangeSlider [min, max]\n | [string, string] // dateRange · timeRange · dateTimeRange [from, to]\n | null\n\n/** A declarative filter definition — like a column, but for the filter panel. */\nexport interface TableFilter {\n /** Field key on the row — the local accessor + the key in the emitted filter state. */\n key: string\n /** Label shown in the filter panel. */\n label: string\n /** The filter's control + matching logic. */\n type: TableFilterType\n /** Options for `select` / `multiSelect`. */\n options?: SelectOption[]\n /** Placeholder for the input(s). */\n placeholder?: string\n /**\n * Param name this filter serializes to in the **server-request** query (`state.query`). Defaults to\n * `key`. Set it to rename or bake in an operator — e.g. `'name_like'`, `'q'`, `'status'`. Range filters\n * append the `rangeMin/MaxSuffix` to this.\n */\n queryKey?: string\n /** `numberRange` slider bounds + step (defaults `0` / `100` / `1`) — set to match the column's data range. */\n min?: number\n max?: number\n step?: number\n /**\n * Labels for a `boolean` filter's three radios (defaults `Any` / `Yes` / `No`) — e.g.\n * `{ any: 'All', yes: 'In stock', no: 'Sold out' }`.\n */\n booleanLabels?: { any?: string; yes?: string; no?: string }\n}\n\n/** The active filter values, keyed by filter `key`. */\nexport type TableFilterState = Record<string, TableFilterValue>\n\n/** Whether a filter value is \"set\" (should actually filter) — an empty string / array / all-null range is off. */\nexport function isFilterActive(\n type: TableFilterType,\n value: TableFilterValue | undefined,\n): boolean {\n if (value == null) return false\n switch (type) {\n case 'number':\n return typeof value === 'number' && !Number.isNaN(value)\n case 'boolean':\n return typeof value === 'boolean'\n case 'multiSelect':\n return Array.isArray(value) && value.length > 0\n case 'numberRange':\n case 'numberRangeSlider':\n return Array.isArray(value) && (value[0] != null || value[1] != null)\n case 'dateRange':\n case 'timeRange':\n case 'dateTimeRange':\n return Array.isArray(value) && Boolean(value[0] || value[1])\n default: // text · select · date · time · dateTime\n return typeof value === 'string' && value.trim() !== ''\n }\n}\n\n/** Number of filters currently set — drives the count badge on the Filters button. */\nexport function activeFilterCount(filters: TableFilter[], state: TableFilterState): number {\n return filters.reduce((n, f) => (isFilterActive(f.type, state[f.key]) ? n + 1 : n), 0)\n}\n\n// Comparable substrings of an ISO-ish value, normalized to the viewer's LOCAL calendar so both the\n// row and the filter are reduced the same way (lexical compare then works). Without this, a UTC\n// timestamp near midnight (`…T23:30:00Z`) slices to a different day than the local day the user picked\n// and silently drops out. A full timestamp (with `Z`/offset) converts to local; a bare date/time is\n// read as local wall-clock (so it stays on the day/minute picked); anything unparseable falls back to\n// the raw slice. `date` → day, `dateTime` → to the minute, `time` → HH:mm.\nconst pad = (n: number) => String(n).padStart(2, '0')\nconst localDay = (d: Date) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`\nconst localMinute = (d: Date) => `${localDay(d)}T${pad(d.getHours())}:${pad(d.getMinutes())}`\nconst localTime = (d: Date) => `${pad(d.getHours())}:${pad(d.getMinutes())}`\n\n/** Parse an ISO-ish value to a Date; a bare `YYYY-MM-DD` is read as LOCAL midnight (not UTC). */\nconst toLocalDate = (s: string): Date | null => {\n if (!s) return null\n const iso = /^\\d{4}-\\d{2}-\\d{2}$/.test(s) ? `${s}T00:00:00` : s\n const d = new Date(iso)\n return Number.isNaN(d.getTime()) ? null : d\n}\n\nconst datePart = (s: string) => {\n const d = toLocalDate(s)\n return d ? localDay(d) : s.slice(0, 10)\n}\nconst dateTimePart = (s: string) => {\n const d = toLocalDate(s)\n return d ? localMinute(d) : s.slice(0, 16)\n}\nconst timePart = (s: string) => {\n // a full timestamp → its local HH:mm; a bare `HH:mm[:ss]` → its own HH:mm\n if (/\\d{4}-\\d{2}-\\d{2}/.test(s)) {\n const d = toLocalDate(s)\n if (d) return localTime(d)\n }\n return (s.includes('T') ? s.slice(s.indexOf('T') + 1) : s).slice(0, 5)\n}\n\n/** Does one row's cell value match one active filter? */\nfunction matchOne(type: TableFilterType, cell: unknown, value: TableFilterValue): boolean {\n const s = String(cell ?? '')\n switch (type) {\n case 'text':\n return s.toLowerCase().includes(String(value).toLowerCase())\n case 'number':\n return Number(cell) === value\n case 'numberRange':\n case 'numberRangeSlider': {\n const [min, max] = value as [number | null, number | null]\n const n = Number(cell)\n return (min == null || n >= min) && (max == null || n <= max)\n }\n case 'select':\n return s === value\n case 'multiSelect':\n return (value as string[]).includes(s)\n case 'boolean':\n return Boolean(cell) === value\n case 'date':\n return datePart(s) === datePart(String(value))\n case 'dateTime':\n return dateTimePart(s) === dateTimePart(String(value))\n case 'time':\n return timePart(s) === timePart(String(value))\n case 'dateRange':\n case 'dateTimeRange': {\n const part = type === 'dateRange' ? datePart : dateTimePart\n const [from, to] = value as [string, string]\n const d = part(s) // ISO strings compare lexicographically at the same precision\n return (!from || d >= part(from)) && (!to || d <= part(to))\n }\n case 'timeRange': {\n const [from, to] = value as [string, string]\n const t = timePart(s)\n return (!from || t >= timePart(from)) && (!to || t <= timePart(to))\n }\n default:\n return true\n }\n}\n\n/**\n * Filter rows client-side against the active filter values (local mode). A row is kept only when it matches\n * **every** active filter (AND). Filters that aren't set are skipped, so an empty state returns all rows.\n * Pure — no React, no mutation.\n */\nexport function applyFilters<T>(rows: T[], filters: TableFilter[], state: TableFilterState): T[] {\n const active = filters.filter((f) => isFilterActive(f.type, state[f.key]))\n if (active.length === 0) return rows\n return rows.filter((row) =>\n active.every((f) => matchOne(f.type, (row as Record<string, unknown>)[f.key], state[f.key]!)),\n )\n}\n\n// ── server-request query (⇄ URL) ───────────────────────────────────────────────────\n/**\n * Serialize the active filters into **server-request** params (folded into `state.query` alongside\n * page/size/search/sort). Each filter uses its `queryKey ?? key`; scalars emit `param=value`, a\n * `multiSelect` emits repeated / CSV / indexed params (`multiSelectFormat`), and ranges emit two params\n * `<param><rangeMinSuffix>` / `<param><rangeMaxSuffix>` (defaults `Min`/`Max`) — only for the set bound.\n * Config-driven via the shared `TableQueryConfig`; inactive filters are skipped.\n */\nexport function buildFilterQuery(\n filters: TableFilter[],\n state: TableFilterState,\n mapping: TableQueryConfig = {},\n): URLSearchParams {\n const params = new URLSearchParams()\n const minSuffix = mapping.rangeMinSuffix ?? 'Min'\n const maxSuffix = mapping.rangeMaxSuffix ?? 'Max'\n const multiFormat = mapping.multiSelectFormat ?? 'repeat'\n\n for (const f of filters) {\n const value = state[f.key]\n if (!isFilterActive(f.type, value)) continue\n const param = f.queryKey ?? f.key\n switch (f.type) {\n case 'multiSelect': {\n const arr = value as string[]\n if (multiFormat === 'csv')\n params.set(param, arr.join(',')) // cat=a,b\n else if (multiFormat === 'indexed')\n arr.forEach((v, i) => params.set(`${param}[${i}]`, v)) // cat[0]=a&cat[1]=b\n else arr.forEach((v) => params.append(param, v)) // repeat → cat=a&cat=b\n break\n }\n case 'numberRange':\n case 'numberRangeSlider': {\n const [min, max] = value as [number | null, number | null]\n if (min != null) params.set(param + minSuffix, String(min))\n if (max != null) params.set(param + maxSuffix, String(max))\n break\n }\n case 'dateRange':\n case 'timeRange':\n case 'dateTimeRange': {\n const [from, to] = value as [string, string]\n if (from) params.set(param + minSuffix, from)\n if (to) params.set(param + maxSuffix, to)\n break\n }\n default: // text · number · select · boolean · date · time · dateTime\n params.set(param, String(value))\n }\n }\n return params\n}\n\n/**\n * Read the active filter values back out of URL / request params — the **inverse of `buildFilterQuery`** for\n * the same `mapping` + filter defs (each filter's `queryKey ?? key`, the `multiSelectFormat`, the range\n * suffixes). Used by `<Table>` to restore URL-synced filters on mount / Back-Forward. Only present params\n * produce a value; the rest stay unset.\n */\nexport function parseFilterQuery(\n filters: TableFilter[],\n params: URLSearchParams,\n mapping: TableQueryConfig = {},\n): TableFilterState {\n const minSuffix = mapping.rangeMinSuffix ?? 'Min'\n const maxSuffix = mapping.rangeMaxSuffix ?? 'Max'\n const multiFormat = mapping.multiSelectFormat ?? 'repeat'\n const state: TableFilterState = {}\n\n for (const f of filters) {\n const param = f.queryKey ?? f.key\n switch (f.type) {\n case 'multiSelect': {\n let arr: string[] = []\n if (multiFormat === 'csv') {\n const v = params.get(param)\n if (v) arr = v.split(',').filter(Boolean)\n } else if (multiFormat === 'indexed') {\n for (let i = 0; params.has(`${param}[${i}]`); i++) arr.push(params.get(`${param}[${i}]`)!)\n } else {\n arr = params.getAll(param)\n }\n if (arr.length) state[f.key] = arr\n break\n }\n case 'numberRange':\n case 'numberRangeSlider': {\n const lo = params.get(param + minSuffix)\n const hi = params.get(param + maxSuffix)\n if (lo != null || hi != null) {\n state[f.key] = [lo != null ? Number(lo) : null, hi != null ? Number(hi) : null]\n }\n break\n }\n case 'dateRange':\n case 'timeRange':\n case 'dateTimeRange': {\n const from = params.get(param + minSuffix)\n const to = params.get(param + maxSuffix)\n if (from != null || to != null) state[f.key] = [from ?? '', to ?? '']\n break\n }\n case 'number': {\n const v = params.get(param)\n if (v != null) {\n const n = Number(v)\n if (!Number.isNaN(n)) state[f.key] = n\n }\n break\n }\n case 'boolean': {\n const v = params.get(param)\n if (v === 'true') state[f.key] = true\n else if (v === 'false') state[f.key] = false\n break\n }\n default: {\n // text · select · date · time · dateTime\n const v = params.get(param)\n if (v) state[f.key] = v\n }\n }\n }\n return state\n}\n","import { useId, useState, type ReactNode } from 'react'\nimport { useT, type Translator } from '../../theme'\nimport { Badge } from '../Badge'\nimport { Button } from '../Button'\nimport { DatePicker } from '../DatePicker'\nimport { DateTimePicker } from '../DateTimePicker'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Modal } from '../Modal'\nimport { MultiSelect } from '../MultiSelect'\nimport { NumberField } from '../NumberField'\nimport { RadioGroup } from '../Radio'\nimport { Select } from '../Select'\nimport { Slider } from '../Slider'\nimport { TextField } from '../TextField'\nimport { TimePicker } from '../TimePicker'\nimport { Typography } from '../Typography'\nimport {\n activeFilterCount,\n type TableFilter,\n type TableFilterState,\n type TableFilterValue,\n} from './tableFilter'\nimport styles from './TableFilters.module.css'\n\n/** The three boolean-filter radios, mapped to off / `true` / `false` — labels overridable per filter. */\nconst boolOptions = (labels: TableFilter['booleanLabels'], t: Translator) => [\n { value: '', label: labels?.any ?? t('common.any') },\n { value: 'true', label: labels?.yes ?? t('common.yes') },\n { value: 'false', label: labels?.no ?? t('common.no') },\n]\nconst boolToStr = (v: TableFilterValue | undefined): string =>\n v === true ? 'true' : v === false ? 'false' : ''\nconst strToBool = (s: string): boolean | null =>\n s === 'true' ? true : s === 'false' ? false : null\n\n/**\n * A range field — a label over two inputs (From/To, Min/Max). Side by side split by a `–` separator, or\n * **`stacked`** (each on its own line, no separator) for wide inputs that don't fit two-up (dateTimeRange).\n */\nfunction RangeField({\n label,\n from,\n to,\n stacked,\n}: {\n label: ReactNode\n from: ReactNode\n to: ReactNode\n stacked?: boolean\n}) {\n return (\n <div className={styles.field}>\n <Typography variant=\"bodySmall\" className={styles.rangeLabel}>\n {label}\n </Typography>\n {stacked ? (\n <div className={styles.stack}>\n {from}\n {to}\n </div>\n ) : (\n <div className={styles.row}>\n {from}\n <span className={styles.rangeSep} aria-hidden>\n –\n </span>\n {to}\n </div>\n )}\n </div>\n )\n}\n\n/** One field in the filter panel — the control matches the filter's `type`. */\nfunction FilterField({\n filter,\n value,\n onChange,\n}: {\n filter: TableFilter\n value: TableFilterValue | undefined\n onChange: (value: TableFilterValue) => void\n}) {\n const t = useT()\n const { type, label, options = [], placeholder } = filter\n\n switch (type) {\n case 'text':\n return (\n <TextField\n label={label}\n placeholder={placeholder}\n value={(value as string) ?? ''}\n onChange={(e) => onChange(e.target.value)}\n />\n )\n case 'number':\n return (\n <NumberField\n label={label}\n placeholder={placeholder}\n value={(value as number) ?? null}\n onChange={(v) => onChange(v)}\n />\n )\n case 'numberRange': {\n // two open-bounded inputs (Min / Max — either can be left empty)\n const [min, max] = (value as [number | null, number | null] | undefined) ?? [null, null]\n return (\n <RangeField\n label={label}\n from={\n <NumberField\n placeholder={t('common.min')}\n value={min}\n onChange={(v) => onChange([v, max])}\n />\n }\n to={\n <NumberField\n placeholder={t('common.max')}\n value={max}\n onChange={(v) => onChange([min, v])}\n />\n }\n />\n )\n }\n case 'numberRangeSlider': {\n // two-thumb range slider. Bounds come from the filter def (`min`/`max`/`step`); a thumb at an extent\n // maps back to `null` (open bound) so a full-range slider reads as \"not filtering\" (no count, no-op).\n const lo = filter.min ?? 0\n const hi = filter.max ?? 100\n const [low, high] = (value as [number | null, number | null] | undefined) ?? [null, null]\n return (\n <Slider\n range\n label={label}\n min={lo}\n max={hi}\n step={filter.step ?? 1}\n value={[low ?? lo, high ?? hi]}\n valueLabel={(v) => {\n const [a, b] = v as [number, number]\n return `${a} – ${b}`\n }}\n onChange={(v) => {\n const [a, b] = v as [number, number]\n onChange([a <= lo ? null : a, b >= hi ? null : b])\n }}\n />\n )\n }\n case 'select':\n return (\n <Select\n label={label}\n placeholder={placeholder}\n options={options}\n value={(value as string) ?? ''}\n onChange={(v) => onChange(v)}\n />\n )\n case 'multiSelect':\n return (\n <MultiSelect\n label={label}\n placeholder={placeholder}\n options={options}\n value={(value as string[]) ?? []}\n onChange={(v) => onChange(v)}\n />\n )\n case 'boolean':\n // tri-state as radios (Any / Yes / No, labels overridable via `booleanLabels`) — all visible at once\n return (\n <RadioGroup\n label={label}\n orientation=\"horizontal\"\n options={boolOptions(filter.booleanLabels, t)}\n value={boolToStr(value)}\n onChange={(v) => onChange(strToBool(v))}\n />\n )\n case 'date':\n return (\n <DatePicker\n label={label}\n value={(value as string) ?? ''}\n onChange={(v) => onChange(v ?? '')}\n />\n )\n case 'dateRange': {\n const [from, to] = (value as [string, string] | undefined) ?? ['', '']\n return (\n <RangeField\n label={label}\n from={\n <DatePicker\n placeholder={t('common.from')}\n value={from}\n onChange={(v) => onChange([v ?? '', to])}\n />\n }\n to={\n <DatePicker\n placeholder={t('common.to')}\n value={to}\n onChange={(v) => onChange([from, v ?? ''])}\n />\n }\n />\n )\n }\n case 'time':\n return (\n <TimePicker\n label={label}\n value={(value as string) ?? ''}\n onChange={(v) => onChange(v ?? '')}\n />\n )\n case 'timeRange': {\n const [from, to] = (value as [string, string] | undefined) ?? ['', '']\n return (\n <RangeField\n label={label}\n from={\n <TimePicker\n placeholder={t('common.from')}\n value={from}\n onChange={(v) => onChange([v ?? '', to])}\n />\n }\n to={\n <TimePicker\n placeholder={t('common.to')}\n value={to}\n onChange={(v) => onChange([from, v ?? ''])}\n />\n }\n />\n )\n }\n case 'dateTime':\n return (\n <DateTimePicker\n label={label}\n value={(value as string) ?? ''}\n onChange={(v) => onChange(v ?? '')}\n />\n )\n case 'dateTimeRange': {\n const [from, to] = (value as [string, string] | undefined) ?? ['', '']\n return (\n <RangeField\n label={label}\n stacked\n from={\n <DateTimePicker\n placeholder={t('common.from')}\n value={from}\n onChange={(v) => onChange([v ?? '', to])}\n />\n }\n to={\n <DateTimePicker\n placeholder={t('common.to')}\n value={to}\n onChange={(v) => onChange([from, v ?? ''])}\n />\n }\n />\n )\n }\n default:\n return null\n }\n}\n\nexport interface TableFiltersProps {\n /** The declarative filter definitions. */\n filters: TableFilter[]\n /** The committed filter values. */\n value: TableFilterState\n /** Commit new filter values (Apply / Clear). */\n onChange: (value: TableFilterState) => void\n}\n\n/**\n * The Table's filter control — a toolbar **Filters** button (with a count `Badge`) that opens a right\n * **drawer** (`Modal placement=\"right\"`) of fields (one per `filter` def). Edits a **draft** committed only\n * on **Apply**; **Clear** resets. A `Modal` (not a popover) so nested `Select` / `DatePicker` popovers work\n * inside it.\n */\nexport function TableFilters({ filters, value, onChange }: TableFiltersProps) {\n const t = useT()\n const [open, setOpen] = useState(false)\n const [draft, setDraft] = useState<TableFilterState>(value)\n const count = activeFilterCount(filters, value)\n const formId = useId() // links the footer Apply (submit) to the body form, so Enter also applies\n\n const openPanel = () => {\n setDraft(value) // seed the draft from the committed values each time the panel opens\n setOpen(true)\n }\n const commit = () => {\n onChange(draft)\n setOpen(false)\n }\n\n return (\n <>\n <Badge content={count} color=\"primary\">\n <IconButton variant=\"filled\" size=\"sm\" aria-label={t('table.filters')} onClick={openPanel}>\n <Icon name=\"Filter\" />\n </IconButton>\n </Badge>\n <Modal\n open={open}\n onClose={() => setOpen(false)}\n placement=\"right\"\n size=\"sm\"\n icon=\"Filter\"\n title={t('table.filters')}\n description={t('table.filtersDescription')}\n footer={\n // right-aligned: Clear (reset the draft fields) + Apply (commit). No Cancel — the Modal's × /\n // Escape / backdrop dismiss the drawer, discarding the uncommitted draft.\n <div className={styles.footer}>\n <div className={styles.footerEnd}>\n <Button variant=\"text\" startIcon={<Icon name=\"Trash\" />} onClick={() => setDraft({})}>\n {t('common.clear')}\n </Button>\n {/* submits the body form (`formId`) — so clicking Apply OR pressing Enter in a field commits */}\n <Button type=\"submit\" form={formId} startIcon={<Icon name=\"Filter\" />}>\n {t('common.apply')}\n </Button>\n </div>\n </div>\n }\n >\n <form\n id={formId}\n className={styles.fields}\n onSubmit={(e) => {\n e.preventDefault()\n commit()\n }}\n >\n {filters.map((filter) => (\n <FilterField\n key={filter.key}\n filter={filter}\n value={draft[filter.key]}\n onChange={(v) => setDraft((prev) => ({ ...prev, [filter.key]: v }))}\n />\n ))}\n </form>\n </Modal>\n </>\n )\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ForwardedRef,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport {\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type PaginationState,\n type SortingState,\n type Updater,\n} from '@tanstack/react-table'\nimport {\n DndContext,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n type ClientRect,\n type DragEndEvent,\n type Modifier,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n arrayMove,\n useSortable,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS, type Transform } from '@dnd-kit/utilities'\nimport { useT, useTableQueryConfig, type TableQueryConfig } from '../../theme'\nimport { buildTableQuery, parseTableQuery } from '../../helpers/table'\nimport {\n applyFilters,\n buildFilterQuery,\n parseFilterQuery,\n type TableFilter,\n type TableFilterState,\n} from './tableFilter'\nimport { TableFilters } from './TableFilters'\nimport { Badge } from '../Badge'\nimport { Dropdown } from '../Dropdown'\nimport { EmptyState } from '../EmptyState'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { ListItem } from '../List'\nimport { Loader } from '../Loader'\nimport { Pagination } from '../Pagination'\nimport { Select } from '../Select'\nimport { TextField } from '../TextField'\nimport { Typography } from '../Typography'\nimport styles from './Table.module.css'\n\n// Stripped from production builds: `process.env.NODE_ENV` is inlined by every consumer bundler (React's own\n// convention). Declared locally since the library ships without `@types/node`.\ndeclare const process: { env: { NODE_ENV?: string } } | undefined\n\nexport type TableAlign = 'left' | 'center' | 'right'\nexport type TableSortDirection = 'asc' | 'desc'\n\n/** Sentinel page size for the \"All\" rows-per-page choice — larger than any real dataset, so everything\n * lands on a single page. Emitted verbatim in `onChange` (server consumers should treat it as unbounded). */\nconst ALL_ROWS = Number.MAX_SAFE_INTEGER\n\n/** Default max width for a `wrap` column with no explicit `maxWidth` — a readable text width, so `wrap`\n * alone caps + wraps without the consumer having to pick a number. */\nconst DEFAULT_WRAP_MAX_WIDTH = 280\n\n/** A single column definition — the simple, engine-agnostic shape a consumer writes. */\nexport interface TableColumn<T> {\n /** Field key on the row — the column id, the default cell accessor, and the local sort/search key. */\n key: string\n /** Header content. */\n header: ReactNode\n /** Custom cell renderer. Defaults to the row's `key` value stringified. */\n cell?: (row: T, index: number) => ReactNode\n /** Enable sorting on this column (click the header to toggle asc → desc → none). Defaults to `false`. */\n sortable?: boolean\n /** Fixed column width — a px `number` or any CSS width string. Opts the column out of the default cap. */\n width?: number | string\n /**\n * Cap the column's width (px `number` or CSS string) — long content **wraps** within it onto 2+ lines\n * (the row grows) instead of stretching the table. **Implies `wrap`.** Only needed to override the\n * default wrap cap (`280px`); otherwise plain `wrap` is enough.\n */\n maxWidth?: number | string\n /**\n * Let this column's content **wrap** onto multiple lines (rows grow) instead of the single-line default —\n * a long unbroken token breaks too. On its own it caps the column at a readable **`280px`** (set\n * `maxWidth` for a different cap). Cells are single-line by default (the table scrolls horizontally); opt\n * a long-text column (name / note / address) in with `wrap`.\n */\n wrap?: boolean\n /** Cell + header text alignment. Defaults to `left`. */\n align?: TableAlign\n /**\n * Pin the column to an edge so it stays visible while the rest scrolls horizontally (e.g. an actions\n * column pinned `'right'`). One column per edge; a hairline separates it from the scrolling body. A\n * pinned column with **no `width`** shrinks to its content (so an actions column fits its buttons); set\n * `width` to override.\n */\n pinned?: 'left' | 'right'\n}\n\n/** The current sort — the column `key` + direction, or `null` when unsorted. */\nexport interface TableSortState {\n key: string\n direction: TableSortDirection\n}\n\n/** Details of a single row-reorder drag, passed to `onReorder` alongside the reordered rows. */\nexport interface TableReorderMeta {\n /** The stable row id (from `getRowId`) of the dragged row. */\n id: string\n /** The dragged row's original index in `data`. */\n from: number\n /** The index the row was dropped at (its new position in the reordered array). */\n to: number\n}\n\n/** The table's live state, emitted on every change — the server-mode fetch driver. */\nexport interface TableChangeState {\n /** 1-based page number. */\n page: number\n /** Rows per page. */\n size: number\n /** Current search query. */\n search: string\n /** Active sort, or `null`. */\n sort: TableSortState | null\n /** Active filter values, keyed by filter `key` (empty when none set). */\n filters: TableFilterState\n /**\n * The **built server-request params** for this state, from the query mapping (`config.table.query`\n * merged with the `queryMapping` prop) — ready to append to your endpoint, so you don't hand-map\n * page/size/search/sort. E.g. `fetch(`/products?${state.query}`)`.\n */\n params: URLSearchParams\n /** `params.toString()` — e.g. `\"skip=0&limit=10&q=phone&sortBy=price&order=desc\"`. */\n query: string\n}\n\n/** Props shared by both table modes (everything except the mode-specific `manualPagination` / `rowCount`). */\ninterface TableBaseProps<T> extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'title'> {\n /** Column definitions — keep them simple: a `key` + `header`, plus an optional `cell` renderer. */\n columns: TableColumn<T>[]\n /**\n * Row data. **Local mode** (default): the full dataset — the table searches / sorts / paginates it\n * client-side. **Server mode** (`manualPagination`): only the current page's rows — you fetch them in\n * `onChange` and pass `rowCount` for the total.\n */\n data: T[]\n /**\n * Stable row id from a row — used as the React key, so a row keeps its DOM identity (and any focus /\n * in-cell state) across sort / filter / refetch. Defaults to the row **index**, which is fine for static\n * data but reuses DOM by position when rows reorder or a server page swaps in — pass a real id (e.g.\n * `(row) => row.id`) for any table with row interactions or changing data.\n */\n getRowId?: (row: T, index: number) => string\n /** Optional heading shown at the top-left of the toolbar. */\n title?: ReactNode\n /** Extra toolbar content (e.g. future filter controls), rendered in the right group before sort/export. */\n toolbar?: ReactNode\n /** Show the search box in the toolbar. Defaults to `false`. */\n searchable?: boolean\n /** Placeholder for the search box. Defaults to `\"Search…\"`. */\n searchPlaceholder?: string\n /** Initial search query. */\n defaultSearch?: string\n /** Debounce (ms) before a typed search commits (local filter + `onChange`). Defaults to `300`. */\n debounceMs?: number\n /** Initial page (1-based). Defaults to `1` (overridden by the URL param when `urlSync`). */\n defaultPage?: number\n /** Initial rows per page. Defaults to `10` (overridden by the URL param when `urlSync`). */\n defaultPageSize?: number\n /** Rows-per-page choices in the footer `Select`. Defaults to `[10, 20, 50, 100, 200]`. */\n pageSizeOptions?: number[]\n /**\n * Add an **\"All\"** rows-per-page choice that puts every row on one page. Defaults to `true` — pass\n * `false` to hide it (e.g. for a large server dataset where fetching everything is undesirable).\n */\n allowAllRows?: boolean\n /** Show the rows-per-page `Select` in the footer. Defaults to `true`. */\n showPageSize?: boolean\n /** Show the jump-to-first-page (⏮) button in the pagination. Defaults to `false`. */\n showFirstButton?: boolean\n /** Show the jump-to-last-page (⏭) button in the pagination. Defaults to `false`. */\n showLastButton?: boolean\n /** Initial sort. */\n defaultSort?: TableSortState | null\n /**\n * Fires with the full `{ page, size, search, sort, params, query }` state on mount and whenever it\n * changes — wire this to your fetch in server mode (append `state.query` to your endpoint). Search\n * changes are debounced (`debounceMs`).\n */\n onChange?: (state: TableChangeState) => void\n /**\n * Per-table override for how `state.params` / `state.query` are built (param names, `page` vs `offset`\n * pagination, sort format) — merged over the app-wide `config.table.query`. Use it when one table hits a\n * differently-shaped endpoint (e.g. `{ pageParam: 'skip', sizeParam: 'limit', searchParam: 'q', pagination: 'offset' }`).\n */\n queryMapping?: TableQueryConfig\n /**\n * Handler for the toolbar **export** menu's built-in **\"Send On Email\"** item (label + icon are baked in).\n * Set it to show the export `Dropdown`; on click it fires with the current `TableChangeState` (incl.\n * `query`), so you just wire your endpoint — e.g. `onExportToEmail={(s) => exportCustomers(s.query)}`. Omit it\n * to hide the export menu.\n */\n onExportToEmail?: (state: TableChangeState) => void\n /**\n * Declarative filters — each renders a field in a toolbar **Filters** panel (a `Modal`). In **local**\n * mode the table filters `data` client-side; in **server** mode the active values ride in `onChange`\n * (`state.filters`). Core types: `text` / `number` / `numberRange` / `select` / `multiSelect` /\n * `boolean` / `date` / `dateRange` (`select` / `multiSelect` take `options`).\n */\n filters?: TableFilter[]\n /** Initial filter values, keyed by filter `key`. */\n defaultFilters?: TableFilterState\n /** Called when a body row is clicked (makes rows interactive). */\n onRowClick?: (row: T, index: number) => void\n /**\n * Per-row actions — return the action UI (your own `IconButton`s / menu / etc.) for a row and the table\n * renders it in a **pinned-right actions column** it adds for you (no column boilerplate). The cell is\n * `stopPropagation`-wrapped, so clicks inside it never fire the row's `onClick` — you don't handle that.\n */\n actions?: (row: T, index: number) => ReactNode\n /**\n * Enable **row drag-and-drop reordering** — a leading **drag-handle** column (a grip icon) is prepended,\n * and dragging it (or keyboard: focus the handle → Space → Arrows → Space) reorders the rows, firing\n * **`onReorder`**. **Local mode only**, and best with no active sort (a sort fights a manual order);\n * **requires `getRowId`** (dnd needs stable row ids). Built on `@dnd-kit`. Defaults to `false`.\n */\n reorderable?: boolean\n /**\n * Fired after a drag reorder with the **full `data` reordered** — you own `data`, so set it from this\n * (e.g. `onReorder={setRows}`). A second **`meta`** arg carries the drag details (`{ id, from, to }` —\n * the dragged row's id + its old/new index). Only fires while `reorderable`.\n */\n onReorder?: (rows: T[], meta: TableReorderMeta) => void\n /** Show a loading overlay over the table (e.g. while fetching a server page). Defaults to `false`. */\n loading?: boolean\n /** Custom content for the empty state (replaces the default `EmptyState`). */\n empty?: ReactNode\n /**\n * Mirror page + rows-per-page + search + sort + filters to the URL query, using the **same shape as the\n * server request** (`config.table.query` merged with `queryMapping`) — so the address bar matches\n * `state.query` exactly (e.g. `?page=1&size=10&sortBy=rating&orderBy=desc`). Read back on mount + restored\n * on Back/Forward. Defaults to `true`; pass `false` to opt out entirely. (Two synced tables on one page\n * need distinct param names via their `queryMapping`, since both write the same params otherwise.)\n */\n urlSync?: boolean\n // ── Controlled state ─────────────────────────────────────────────────────────\n // Each pairs with its `default*` counterpart: pass the controlled prop (with its `on*Change`) to own the\n // state from outside; omit it to let the table manage that piece internally (seeded from `default*`). Mix\n // freely — e.g. control only `filterValues` while page/sort stay uncontrolled. Pass **stable** values.\n /** Controlled 1-based page (pair with `onPageChange`); omit for uncontrolled (`defaultPage`). */\n page?: number\n /** Fired with the new 1-based page — on user paging, or a reset to page 1 from a size/sort/search/filter change. */\n onPageChange?: (page: number) => void\n /** Controlled rows-per-page (pair with `onPageSizeChange`); omit for uncontrolled (`defaultPageSize`). */\n pageSize?: number\n /** Fired with the new rows-per-page. */\n onPageSizeChange?: (size: number) => void\n /** Controlled (committed, debounced) search query (pair with `onSearchChange`); omit for uncontrolled (`defaultSearch`). */\n search?: string\n /** Fired with the committed (debounced) search query. */\n onSearchChange?: (search: string) => void\n /** Controlled sort, or `null` (pair with `onSortChange`); omit for uncontrolled (`defaultSort`). */\n sort?: TableSortState | null\n /** Fired with the new sort (or `null` when cleared). */\n onSortChange?: (sort: TableSortState | null) => void\n /** Controlled filter values, keyed by filter `key` (pair with `onFiltersChange`); omit for uncontrolled (`defaultFilters`). */\n filterValues?: TableFilterState\n /** Fired with the filter values on Apply / Clear. */\n onFiltersChange?: (filters: TableFilterState) => void\n /** Pin the header row while the body scrolls. Defaults to `false`. */\n stickyHeader?: boolean\n /** Zebra-stripe alternate rows. Defaults to `false`. */\n striped?: boolean\n /** Highlight rows on hover. Defaults to `true`. */\n hoverable?: boolean\n}\n\n/**\n * `Table` props. A discriminated union on `manualPagination` so the type enforces the server-mode contract:\n * **local mode** (default) needs no `rowCount`; **server mode** (`manualPagination`) **requires** it (the\n * table can't derive the total page count from a single fetched page).\n */\nexport type TableProps<T> =\n | (TableBaseProps<T> & {\n /** Local mode (default) — the table slices / sorts / filters `data` itself. */\n manualPagination?: false\n /** Ignored in local mode (the table knows the full count from `data`). */\n rowCount?: number\n })\n | (TableBaseProps<T> & {\n /**\n * **Server mode** — the table doesn't slice / sort / filter `data`; it tracks state and fires\n * `onChange`. Pass the current page's rows in `data` and the total in `rowCount`.\n */\n manualPagination: true\n /** Total row count across all pages — **required** in server mode to compute the page count. */\n rowCount: number\n })\n\n/** Resolve a TanStack `Updater` (a value or an `(old) => next` function) against the current value. */\nfunction resolveUpdater<S>(updater: Updater<S>, old: S): S {\n return typeof updater === 'function' ? (updater as (o: S) => S)(old) : updater\n}\n\n/**\n * A wrap column's width cap — its own `maxWidth`, else the readable default when it just sets `wrap`, else\n * none. Used as BOTH the preferred `width` and the `max-width` so the column sits at that width and its\n * content wraps within it (without a preferred width, `overflow-wrap` would starve it to near-zero as the\n * unbounded single-line columns grab the table's spare width).\n */\nfunction wrapCap<T>(col: TableColumn<T>): number | string | undefined {\n return col.maxWidth ?? (col.wrap ? DEFAULT_WRAP_MAX_WIDTH : undefined)\n}\n\n/** Stringify a primitive cell value; complex values should use a column `cell` renderer. */\nfunction formatCell(value: unknown): ReactNode {\n if (value == null) return ''\n if (typeof value === 'object') return ''\n return String(value)\n}\n\n/**\n * Wrap a cell's rendered content: a blank cell (`null` / `undefined` / `''` / `false`, from an empty value\n * or a `cell` renderer that returned nothing) shows a muted \"—\" placeholder so it reads as \"no value\" rather\n * than a rendering glitch. A `0` / `'0'` is a real value and stays as-is (not treated as empty).\n */\nfunction renderCellContent(content: ReactNode): ReactNode {\n if (content == null || content === '' || content === false) {\n return (\n <span className={styles.empty} aria-hidden>\n —\n </span>\n )\n }\n return content\n}\n\n/**\n * `URLSearchParams.toString()`, but with the commonly-unencoded chars `,` `:` `[` `]` left raw — all read\n * cleanly in a query and are accepted by servers in practice (`brand=a,b`, `created=…T09:00:00`,\n * `cat[0]=a`). Non-ASCII (e.g. Georgian text) stays percent-encoded — that's unavoidable in a URL. This\n * makes `state.query` pretty; `state.params.toString()` stays strictly encoded for consumers who want that.\n */\nfunction prettyQuery(params: URLSearchParams): string {\n return params\n .toString()\n .replace(/%2C/gi, ',')\n .replace(/%3A/gi, ':')\n .replace(/%5B/gi, '[')\n .replace(/%5D/gi, ']')\n}\n\n/** Clamp a transform so the dragged node stays within a bounding rect (dnd-kit's `restrictToBoundingRect`). */\nfunction restrictToBoundingRect(\n transform: Transform,\n rect: ClientRect,\n boundingRect: ClientRect,\n): Transform {\n const value = { ...transform }\n if (rect.top + transform.y <= boundingRect.top) {\n value.y = boundingRect.top - rect.top\n } else if (rect.bottom + transform.y >= boundingRect.top + boundingRect.height) {\n value.y = boundingRect.top + boundingRect.height - rect.bottom\n }\n if (rect.left + transform.x <= boundingRect.left) {\n value.x = boundingRect.left - rect.left\n } else if (rect.right + transform.x >= boundingRect.left + boundingRect.width) {\n value.x = boundingRect.left + boundingRect.width - rect.right\n }\n return value\n}\n\n// dnd-kit modifiers for row drag (inlined — no `@dnd-kit/modifiers` dep): keep the drag on the **vertical\n// axis**, and **clamp it to the parent** (`<tbody>`) so a row dragged past the table's top/bottom can't\n// extend beyond it and grow the scroll container / add a scrollbar.\nconst restrictToVerticalAxis: Modifier = ({ transform }) => ({ ...transform, x: 0 })\nconst restrictToParentElement: Modifier = ({ containerNodeRect, draggingNodeRect, transform }) =>\n draggingNodeRect && containerNodeRect\n ? restrictToBoundingRect(transform, draggingNodeRect, containerNodeRect)\n : transform\nconst rowDragModifiers = [restrictToVerticalAxis, restrictToParentElement]\n\n/**\n * A reorderable body row — wraps `useSortable` (dnd-kit) and renders a leading **drag-handle** cell (the\n * grip `IconButton`) before the row's data cells. The handle carries the drag listeners; the rest of the\n * row stays clickable (`onRowClick`). Only rendered when the table is `reorderable`.\n */\nfunction SortableRow({\n id,\n cells,\n clickable,\n onClick,\n}: {\n id: string\n cells: ReactNode\n clickable: boolean\n onClick?: () => void\n}) {\n const t = useT()\n const { setNodeRef, transform, transition, isDragging, attributes, listeners } = useSortable({\n id,\n })\n return (\n <tr\n ref={setNodeRef}\n className={clsx(styles.tr, clickable && styles.clickable, isDragging && styles.dragging)}\n style={\n {\n // Translate (not Transform) — skip dnd-kit's scaleX/scaleY, which would squish/stretch the\n // dragged row to the target's size when rows have different heights; keep the row's own size\n transform: CSS.Translate.toString(transform),\n transition,\n position: isDragging ? 'relative' : undefined,\n zIndex: isDragging ? 1 : undefined,\n } as CSSProperties\n }\n onClick={onClick}\n >\n <td className={clsx(styles.td, styles.dragHandleCell)}>\n <button\n type=\"button\"\n className={styles.dragHandle}\n aria-label={t('table.dragHandle')}\n {...attributes}\n {...listeners}\n onClick={(e) => e.stopPropagation()}\n >\n <Icon name=\"Menu\" size=\"sm\" />\n </button>\n </td>\n {cells}\n </tr>\n )\n}\n\n/** Wraps the table body in a dnd-kit `DndContext` only when reordering is on — a passthrough otherwise. */\nfunction ReorderProvider({\n enabled,\n sensors,\n onDragEnd,\n children,\n}: {\n enabled: boolean\n sensors: ReturnType<typeof useSensors>\n onDragEnd: (event: DragEndEvent) => void\n children: ReactNode\n}) {\n if (!enabled) return <>{children}</>\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={rowDragModifiers}\n onDragEnd={onDragEnd}\n >\n {children}\n </DndContext>\n )\n}\n\n/**\n * A data table built on **TanStack Table** (headless — an optional peer, `external`) styled entirely with\n * `--tz-*` tokens. Pass `columns` + `data` and it renders a sortable, paginated, searchable table. Works\n * two ways: **local** (hand it the full `data` — it searches / sorts / paginates client-side) or **server**\n * (`manualPagination` — pass the current page in `data` + the total in `rowCount`, and fetch in `onChange`).\n * Composes the library's `TextField` (search), `Select` (rows per page), `Pagination`, `EmptyState`, and\n * `Loader`; syncs page + size to the URL (`?page=1&size=10`) by default. The ref points at the root.\n *\n * @example\n * <Table data={users} columns={[\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'role', header: 'Role', cell: (u) => <Chip>{u.role}</Chip> },\n * ]} searchable />\n */\nexport const Table = forwardRef(function Table<T>(\n {\n columns,\n data,\n getRowId,\n title,\n toolbar,\n searchable = false,\n searchPlaceholder,\n defaultSearch = '',\n debounceMs = 300,\n defaultPage = 1,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100, 200],\n allowAllRows = true,\n showPageSize = true,\n showFirstButton = false,\n showLastButton = false,\n manualPagination = false,\n rowCount,\n defaultSort = null,\n onChange,\n queryMapping,\n onExportToEmail,\n filters,\n defaultFilters,\n onRowClick,\n actions,\n reorderable = false,\n onReorder,\n loading = false,\n empty,\n urlSync = true,\n page,\n onPageChange,\n pageSize,\n onPageSizeChange,\n search,\n onSearchChange,\n sort,\n onSortChange,\n filterValues,\n onFiltersChange,\n stickyHeader = false,\n striped = false,\n hoverable = true,\n className,\n ...props\n }: TableProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const t = useT()\n // the query mapping — the app-wide `config.table.query` merged with this table's override. It drives BOTH\n // the server-request query (`state.query`) AND the browser-URL sync, so the two share one shape.\n const configQueryMapping = useTableQueryConfig()\n const queryMappingRef = useRef<TableQueryConfig>({})\n queryMappingRef.current = { ...configQueryMapping, ...queryMapping }\n\n // keep the latest onChange for the stable emit effect (avoids re-subscribing)\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n // filter defs for the stable URL write / popstate closures\n const filtersRef = useRef(filters)\n filtersRef.current = filters\n\n // horizontal-scroll state → a soft shadow on a pinned column's inner edge when content is hidden under\n // it (so it reads as \"content scrolls under here\", not a hard cut)\n const scrollRef = useRef<HTMLDivElement | null>(null)\n const tableRef = useRef<HTMLTableElement | null>(null)\n const [pinShadow, setPinShadow] = useState({ start: false, end: false })\n\n // seed the URL-synced state once, parsing the browser query with the SAME mapping the request uses (so the\n // URL the table writes round-trips). `page` / `size` fall back to the defaults when absent from the URL.\n const [urlSeed] = useState(() => {\n const params =\n urlSync && typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null\n if (!params) {\n return {\n page: null as number | null,\n size: null as number | null,\n search: '',\n sort: null as TableSortState | null,\n filters: {} as TableFilterState,\n }\n }\n return {\n ...parseTableQuery(params, queryMappingRef.current),\n filters: filters?.length ? parseFilterQuery(filters, params, queryMappingRef.current) : {},\n }\n })\n\n const [pagination, setPagination] = useState<PaginationState>(() => ({\n pageIndex: (urlSeed.page ?? defaultPage) - 1,\n pageSize: urlSeed.size ?? defaultPageSize,\n }))\n // `searchInput` is the immediate input value; `globalFilter` is the committed (debounced) query — both\n // seed from the URL when synced, else `defaultSearch`\n const [searchInput, setSearchInput] = useState(urlSeed.search || defaultSearch)\n const [globalFilter, setGlobalFilter] = useState(urlSeed.search || defaultSearch)\n const [sorting, setSorting] = useState<SortingState>(() => {\n if (urlSeed.sort) return [{ id: urlSeed.sort.key, desc: urlSeed.sort.direction === 'desc' }]\n return defaultSort ? [{ id: defaultSort.key, desc: defaultSort.direction === 'desc' }] : []\n })\n const [filterState, setFilterState] = useState<TableFilterState>(() => ({\n ...defaultFilters,\n ...urlSeed.filters,\n }))\n\n const manual = manualPagination\n\n // ── controlled-or-uncontrolled resolution ──────────────────────────────────────\n // Each piece reads its controlled prop when provided, else the internal state above. Every mutation goes\n // through a `commit*` helper, which fires the `on*Change` callback AND updates the internal fallback (only\n // for the pieces that aren't controlled) — so controlled + uncontrolled behave identically downstream.\n const pageControlled = page !== undefined\n const sizeControlled = pageSize !== undefined\n const searchControlled = search !== undefined\n const sortControlled = sort !== undefined\n const filtersControlled = filterValues !== undefined\n\n const resolvedPagination: PaginationState = {\n pageIndex: pageControlled ? page - 1 : pagination.pageIndex,\n pageSize: sizeControlled ? pageSize : pagination.pageSize,\n }\n const resolvedGlobalFilter = searchControlled ? search : globalFilter\n const resolvedSorting = useMemo<SortingState>(\n () =>\n sortControlled ? (sort ? [{ id: sort.key, desc: sort.direction === 'desc' }] : []) : sorting,\n [sortControlled, sort, sorting],\n )\n const resolvedFilterState = useMemo<TableFilterState>(\n () => (filtersControlled ? filterValues : filterState),\n [filtersControlled, filterValues, filterState],\n )\n\n // commit a pagination change: notify the controlled page/size callbacks + update the internal fallback for\n // whichever piece is uncontrolled. A pagination change never resets the page (that's the point of paging).\n const commitPagination = (updater: Updater<PaginationState>) => {\n const cur = resolvedPagination\n const next = resolveUpdater(updater, cur)\n if (next.pageIndex !== cur.pageIndex) onPageChange?.(next.pageIndex + 1)\n if (next.pageSize !== cur.pageSize) onPageSizeChange?.(next.pageSize)\n setPagination((p) => ({\n pageIndex: pageControlled ? p.pageIndex : next.pageIndex,\n pageSize: sizeControlled ? p.pageSize : next.pageSize,\n }))\n }\n // resetting to the first page is the shared side effect of a size / search / sort / filter change\n const resetToFirstPage = () =>\n commitPagination((p) => (p.pageIndex === 0 ? p : { ...p, pageIndex: 0 }))\n\n const commitSearch = (value: string, resetPage = true) => {\n if (!searchControlled) setGlobalFilter(value)\n onSearchChange?.(value)\n if (resetPage) resetToFirstPage()\n }\n const commitSorting = (updater: Updater<SortingState>, resetPage = true) => {\n const next = resolveUpdater(updater, resolvedSorting)\n if (!sortControlled) setSorting(next)\n onSortChange?.(next[0] ? { key: next[0].id, direction: next[0].desc ? 'desc' : 'asc' } : null)\n if (resetPage) resetToFirstPage()\n }\n const commitFilters = (next: TableFilterState, resetPage = true) => {\n if (!filtersControlled) setFilterState(next)\n onFiltersChange?.(next)\n if (resetPage) resetToFirstPage()\n }\n\n // local mode: filter `data` client-side before TanStack (search / sort / paginate then run on the result);\n // server mode: pass it through — the consumer fetches per the emitted `state.filters`\n const filteredData = useMemo(\n () =>\n filters && filters.length > 0 && !manual\n ? applyFilters(data, filters, resolvedFilterState)\n : data,\n [filters, manual, data, resolvedFilterState],\n )\n // applying / clearing filters resets to the first page (the filtered set changes what \"page 1\" means)\n const handleFiltersChange = commitFilters\n\n const tanstackColumns = useMemo<ColumnDef<T>[]>(\n () =>\n columns.map((col) => ({\n id: col.key,\n accessorFn: (row: T) => (row as Record<string, unknown>)[col.key],\n enableSorting: !!col.sortable,\n })),\n [columns],\n )\n\n // rows-per-page choices + an optional trailing \"All\"\n const pageSizeChoices = useMemo(() => {\n const opts = pageSizeOptions.map((n) => ({ value: String(n), label: String(n) }))\n return allowAllRows ? [...opts, { value: 'all', label: t('common.all') }] : opts\n }, [pageSizeOptions, allowAllRows])\n\n // the columns actually rendered — the consumer's, plus an auto-built pinned-right actions column when\n // `actions` is given (display-only, so it stays out of `tanstackColumns` / sort / filter)\n const renderColumns = useMemo<TableColumn<T>[]>(() => {\n if (!actions) return columns\n const actionsColumn: TableColumn<T> = {\n key: '__actions',\n header: '',\n align: 'right',\n pinned: 'right',\n // render the consumer's action UI right-aligned; the wrapper swallows clicks so they never reach\n // the row's `onClick` — the consumer's own handlers don't need to `stopPropagation`\n cell: (row, index) => (\n <div className={styles.rowActions} onClick={(e) => e.stopPropagation()}>\n {actions(row, index)}\n </div>\n ),\n }\n return [...columns, actionsColumn]\n }, [columns, actions])\n\n // the sortable columns drive the toolbar sort menu — each lists an explicit ascending + descending entry\n const sortableColumns = useMemo(() => columns.filter((c) => c.sortable), [columns])\n // one row per sortable column; clicking cycles that column through ascending → descending → unsorted\n const cycleSort = (key: string) =>\n commitSorting((prev) => {\n const cur = prev[0]\n if (!cur || cur.id !== key) return [{ id: key, desc: false }] // → ascending\n if (!cur.desc) return [{ id: key, desc: true }] // ascending → descending\n return [] // descending → unsorted\n })\n\n const table = useReactTable<T>({\n data: filteredData,\n columns: tanstackColumns,\n state: {\n pagination: resolvedPagination,\n globalFilter: resolvedGlobalFilter,\n sorting: resolvedSorting,\n },\n onPaginationChange: commitPagination,\n onGlobalFilterChange: (updater) =>\n commitSearch(resolveUpdater(updater as Updater<string>, resolvedGlobalFilter)),\n onSortingChange: commitSorting,\n globalFilterFn: 'includesString',\n // first click always sorts ascending (A→Z / 0→9), for every column type — the intuitive default\n sortDescFirst: false,\n getCoreRowModel: getCoreRowModel(),\n getRowId,\n manualPagination: manual,\n manualFiltering: manual,\n manualSorting: manual,\n ...(manual\n ? { rowCount: rowCount ?? data.length }\n : {\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getSortedRowModel: getSortedRowModel(),\n }),\n })\n\n const rows = table.getRowModel().rows\n\n // row drag-and-drop reordering (dnd-kit) — pointer (5px activation) + keyboard sensors; the sortable ids\n // are the TanStack row ids (= `getRowId`), and a drop moves the item within the full `data` and emits it\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n const rowIdOf = (row: T, index: number) => (getRowId ? getRowId(row, index) : String(index))\n const handleReorder = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id || !onReorder) return\n const from = data.findIndex((r, i) => rowIdOf(r, i) === active.id)\n const to = data.findIndex((r, i) => rowIdOf(r, i) === over.id)\n if (from < 0 || to < 0) return\n onReorder(arrayMove(data, from, to), { id: String(active.id), from, to })\n }\n\n const totalRows = manual ? (rowCount ?? data.length) : table.getFilteredRowModel().rows.length\n const { pageIndex, pageSize: resolvedPageSize } = resolvedPagination\n const pageCount = Math.max(1, Math.ceil(totalRows / resolvedPageSize))\n const currentPage = pageIndex + 1\n const rangeStart = totalRows === 0 ? 0 : pageIndex * resolvedPageSize + 1\n const rangeEnd = manual\n ? Math.min(totalRows, pageIndex * resolvedPageSize + rows.length)\n : Math.min(totalRows, currentPage * resolvedPageSize)\n\n // keep the search box in sync when `search` is controlled externally (e.g. cleared from a parent button)\n useEffect(() => {\n if (search !== undefined) setSearchInput(search)\n }, [search])\n\n // debounce a typed search into the committed query, resetting to the first page when it actually changes\n useEffect(() => {\n if (searchInput === resolvedGlobalFilter) return\n const handle = setTimeout(() => commitSearch(searchInput), debounceMs)\n return () => clearTimeout(handle)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchInput, resolvedGlobalFilter, debounceMs])\n\n // clamp the page if the row count shrank beneath it (e.g. a local search filtered rows away)\n useEffect(() => {\n if (pageIndex > 0 && pageIndex >= pageCount) {\n commitPagination((p) => ({ ...p, pageIndex: pageCount - 1 }))\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageCount, pageIndex])\n\n const sortState: TableSortState | null = resolvedSorting[0]\n ? { key: resolvedSorting[0].id, direction: resolvedSorting[0].desc ? 'desc' : 'asc' }\n : null\n // the current table state, with the ready-to-use server-request params built from the query mapping (so a\n // consumer fetch / export is a one-liner). Rebuilt on demand — the emit effect + the export actions share it.\n const getTableState = (): TableChangeState => {\n const currentPageNum = pageIndex + 1\n const size = resolvedPageSize\n const params = buildTableQuery(\n { page: currentPageNum, size, search: resolvedGlobalFilter, sort: sortState },\n queryMappingRef.current,\n )\n // fold the active filters into the same server-request query (config-driven param names/format)\n if (filters?.length) {\n buildFilterQuery(filters, resolvedFilterState, queryMappingRef.current).forEach((v, k) =>\n params.append(k, v),\n )\n }\n return {\n page: currentPageNum,\n size,\n search: resolvedGlobalFilter,\n sort: sortState,\n filters: resolvedFilterState,\n params,\n query: prettyQuery(params),\n }\n }\n // emit the full state on mount + whenever it changes — the server-mode fetch driver\n useEffect(() => {\n onChangeRef.current?.(getTableState())\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pageIndex, resolvedPageSize, resolvedGlobalFilter, resolvedSorting, resolvedFilterState])\n\n const hasExport = onExportToEmail != null\n const hasFilters = filters != null && filters.length > 0\n\n // mirror the table's state to the URL using the SAME builder as the server request (`state.query`), so the\n // address bar matches the request shape (e.g. `?page=1&size=10&sortBy=rating&orderBy=desc`). `replaceState`\n // (no history spam); canonicalizes on mount; params the table doesn't own are preserved. Gated by `urlSync`.\n const writeQuery = useCallback(\n (\n page: number,\n pageSize: number,\n search: string,\n sort: TableSortState | null,\n activeFilters: TableFilterState,\n ) => {\n if (typeof window === 'undefined' || !urlSync) return\n const mapping = queryMappingRef.current\n const defs = filtersRef.current\n // build the same params the request uses (page/size/search/sort + the active filters)\n const built = buildTableQuery({ page, size: pageSize, search, sort }, mapping)\n if (defs?.length) {\n buildFilterQuery(defs, activeFilters, mapping).forEach((v, k) => built.append(k, v))\n }\n // the param names the table owns (resolved from the mapping) — cleared before copying `built` in, so a\n // now-empty piece (cleared search, unset filter, \"All\" dropping page/size) drops out of the URL too\n const m = {\n pageParam: 'page',\n sizeParam: 'size',\n searchParam: 'search',\n sortParam: 'sort',\n sortOrderParam: 'order',\n ...mapping,\n }\n const minSuffix = mapping.rangeMinSuffix ?? 'Min'\n const maxSuffix = mapping.rangeMaxSuffix ?? 'Max'\n const owned = [m.pageParam, m.sizeParam, m.searchParam, m.sortParam, m.sortOrderParam]\n for (const f of defs ?? []) {\n const p = f.queryKey ?? f.key\n owned.push(p, p + minSuffix, p + maxSuffix)\n }\n // keep unrelated params (another widget's `?tab=…`), drop ours (incl. indexed `key[0]`), copy in built\n const params = new URLSearchParams(window.location.search)\n for (const key of [...params.keys()]) {\n if (owned.includes(key) || owned.some((b) => key.startsWith(`${b}[`))) params.delete(key)\n }\n built.forEach((v, k) => params.append(k, v))\n\n const query = prettyQuery(params)\n const url = `${window.location.pathname}${query ? `?${query}` : ''}${window.location.hash}`\n // skip a no-op write (e.g. the mount canonicalization when the URL already matches)\n if (url === `${window.location.pathname}${window.location.search}${window.location.hash}`)\n return\n window.history.replaceState(window.history.state, '', url)\n },\n [urlSync],\n )\n useEffect(() => {\n writeQuery(\n pageIndex + 1,\n resolvedPageSize,\n resolvedGlobalFilter,\n sortState,\n resolvedFilterState,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n pageIndex,\n resolvedPageSize,\n resolvedGlobalFilter,\n resolvedSorting,\n resolvedFilterState,\n writeQuery,\n ])\n\n // Back/Forward → restore state from the query (parsed with the same mapping). Kept fresh behind a stable\n // ref (the commit* helpers + resolved values change each render), so the listener never re-subscribes. It\n // restores WITHOUT resetting the page (the URL carries the intended page) and routes through the commit*\n // helpers so a controlled parent is notified of the Back/Forward navigation too.\n const popStateRef = useRef<() => void>(() => {})\n popStateRef.current = () => {\n const params = new URLSearchParams(window.location.search)\n const mapping = queryMappingRef.current\n const parsed = parseTableQuery(params, mapping)\n commitPagination(() => ({\n pageIndex: (parsed.page ?? defaultPage) - 1,\n pageSize: parsed.size ?? resolvedPageSize,\n }))\n setSearchInput(parsed.search)\n commitSearch(parsed.search, false)\n commitSorting(\n () => (parsed.sort ? [{ id: parsed.sort.key, desc: parsed.sort.direction === 'desc' }] : []),\n false,\n )\n const defs = filtersRef.current\n if (defs?.length) commitFilters(parseFilterQuery(defs, params, mapping), false)\n }\n useEffect(() => {\n if (typeof window === 'undefined' || !urlSync) return\n const handler = () => popStateRef.current()\n window.addEventListener('popstate', handler)\n return () => window.removeEventListener('popstate', handler)\n }, [urlSync])\n\n // dev-only: a row-interactive table that relies on the index as its React key can misplace row DOM (and\n // in-cell focus / state) when rows reorder or a server page swaps in — hint to pass `getRowId`. Fires once.\n useEffect(() => {\n if (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV !== 'production' &&\n !getRowId &&\n (onRowClick != null || actions != null || reorderable)\n ) {\n console.warn(\n '[Table] No `getRowId` provided, so the row index is used as the React key. For a table with row ' +\n 'interactions or changing / paged data, pass `getRowId` (e.g. `(row) => row.id`) so each row keeps ' +\n 'its identity across sort / filter / refetch.',\n )\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // track horizontal scroll so a pinned column shows its shadow only while content is hidden under it\n useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n const update = () => {\n const canScroll = el.scrollWidth > el.clientWidth + 1\n const atStart = el.scrollLeft <= 0\n const atEnd = el.scrollLeft >= el.scrollWidth - el.clientWidth - 1\n const next = { start: canScroll && !atStart, end: canScroll && !atEnd }\n setPinShadow((s) => (s.start === next.start && s.end === next.end ? s : next))\n }\n update()\n el.addEventListener('scroll', update, { passive: true })\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(update) : null\n ro?.observe(el)\n if (ro && tableRef.current) ro.observe(tableRef.current)\n return () => {\n el.removeEventListener('scroll', update)\n ro?.disconnect()\n }\n }, [])\n\n const hasToolbar =\n title != null ||\n toolbar != null ||\n searchable ||\n hasFilters ||\n sortableColumns.length > 0 ||\n hasExport\n\n // the data `<td>`s for one row — shared by the plain and the reorderable (`SortableRow`) row paths\n const rowCells = (row: (typeof rows)[number]) =>\n renderColumns.map((col) => (\n <td\n key={col.key}\n className={clsx(\n styles.td,\n col.pinned === 'left' && styles.pinnedLeft,\n col.pinned === 'right' && styles.pinnedRight,\n (col.wrap || col.maxWidth != null) && styles.wrapCell,\n )}\n style={\n {\n width: col.width ?? (col.pinned ? 1 : wrapCap(col)),\n maxWidth: wrapCap(col),\n textAlign: col.align,\n } as CSSProperties\n }\n >\n {renderCellContent(\n col.cell ? col.cell(row.original, row.index) : formatCell(row.getValue(col.key)),\n )}\n </td>\n ))\n\n return (\n <div ref={ref} className={clsx(styles.root, className)} {...props}>\n {hasToolbar && (\n <div className={styles.toolbar}>\n {/* left group — title + search */}\n <div className={styles.toolbarStart}>\n {title != null && (\n <Typography variant=\"h4\" as=\"div\" className={styles.title}>\n {title}\n </Typography>\n )}\n {searchable && (\n <TextField\n className={styles.search}\n fullWidth={false}\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n placeholder={searchPlaceholder ?? t('common.search')}\n adornment={<Icon name=\"SearchNormal\" />}\n aria-label={t('common.search')}\n />\n )}\n </div>\n {/* right group — custom toolbar content + filters + sort + export */}\n <div className={styles.toolbarEnd}>\n {toolbar}\n {hasExport && (\n // export menu — a baked \"Send On Email\" item; the consumer only wires `onExportToEmail`\n <Dropdown\n placement=\"bottom-end\"\n trigger={\n <IconButton variant=\"filled\" size=\"sm\" aria-label={t('table.export')}>\n <Icon name=\"ExportArrow\" />\n </IconButton>\n }\n >\n <Typography as=\"div\" variant=\"caption\" color=\"muted\" className={styles.menuTitle}>\n {t('table.export')}\n </Typography>\n <ListItem clickable icon=\"Sms\" onClick={() => onExportToEmail?.(getTableState())}>\n {t('table.sendOnEmail')}\n </ListItem>\n </Dropdown>\n )}\n {sortableColumns.length > 0 && (\n // sort menu — one row per sortable column; clicking cycles that column asc → desc → unsorted.\n // The menu **stays open** (`closeOnSelect={false}`) so you can cycle without reopening; the\n // active row shows a `selected` tint + a direction arrow, and a dot `Badge` on the trigger\n // flags that a sort is applied.\n <Dropdown\n placement=\"bottom-end\"\n closeOnSelect={false}\n trigger={\n <Badge dot={resolvedSorting.length > 0} color=\"primary\">\n <IconButton variant=\"filled\" size=\"sm\" aria-label={t('table.sort')}>\n <Icon name=\"Sort\" />\n </IconButton>\n </Badge>\n }\n >\n <Typography as=\"div\" variant=\"caption\" color=\"muted\" className={styles.menuTitle}>\n {t('table.sortBy')}\n </Typography>\n {sortableColumns.map((col) => {\n const active = sortState?.key === col.key\n return (\n <ListItem\n key={col.key}\n clickable\n selected={active}\n // active column shows its direction (↑ asc / ↓ desc); clicking cycles asc → desc → off\n trailing={\n active ? (\n <Icon name={sortState?.direction === 'desc' ? 'ArrowDown' : 'ArrowUp2'} />\n ) : undefined\n }\n onClick={() => cycleSort(col.key)}\n >\n {col.header}\n </ListItem>\n )\n })}\n </Dropdown>\n )}\n {hasFilters && (\n <TableFilters\n filters={filters}\n value={resolvedFilterState}\n onChange={handleFiltersChange}\n />\n )}\n </div>\n </div>\n )}\n\n <ReorderProvider enabled={reorderable} sensors={sensors} onDragEnd={handleReorder}>\n <div\n ref={scrollRef}\n className={styles.scroll}\n data-pin-start={pinShadow.start ? 'true' : 'false'}\n data-pin-end={pinShadow.end ? 'true' : 'false'}\n >\n <table\n ref={tableRef}\n className={clsx(\n styles.table,\n striped && styles.striped,\n hoverable && styles.hoverable,\n stickyHeader && styles.sticky,\n )}\n >\n <thead>\n <tr>\n {reorderable && (\n <th className={clsx(styles.th, styles.dragHandleCell)} scope=\"col\" aria-hidden />\n )}\n {renderColumns.map((col) => {\n // look the column up only when sortable (for aria-sort) — the synthetic `__actions`\n // column isn't registered with TanStack, and getColumn would warn on its id\n const sorted = (col.sortable && table.getColumn(col.key)?.getIsSorted()) || false\n return (\n <th\n key={col.key}\n scope=\"col\"\n className={clsx(\n styles.th,\n col.pinned === 'left' && styles.pinnedLeft,\n col.pinned === 'right' && styles.pinnedRight,\n (col.wrap || col.maxWidth != null) && styles.wrapCell,\n )}\n style={\n {\n // a pinned column with no explicit width shrinks to its content (the `width: 1px`\n // min-content trick); a wrap column sits at its cap (so it doesn't get starved),\n // others size to content\n width: col.width ?? (col.pinned ? 1 : wrapCap(col)),\n maxWidth: wrapCap(col),\n textAlign: col.align,\n } as CSSProperties\n }\n aria-sort={\n col.sortable\n ? sorted === 'asc'\n ? 'ascending'\n : sorted === 'desc'\n ? 'descending'\n : 'none'\n : undefined\n }\n >\n {/* sorting lives in the toolbar's sort menu, not the header; `aria-sort` above still\n reflects the current sort for a11y */}\n {col.header}\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {rows.length > 0 ? (\n reorderable ? (\n // dnd-kit sortable rows — each `SortableRow` renders a leading drag-handle cell + `rowCells`\n <SortableContext\n items={rows.map((row) => row.id)}\n strategy={verticalListSortingStrategy}\n >\n {rows.map((row) => (\n <SortableRow\n key={row.id}\n id={row.id}\n clickable={!!onRowClick}\n onClick={onRowClick ? () => onRowClick(row.original, row.index) : undefined}\n cells={rowCells(row)}\n />\n ))}\n </SortableContext>\n ) : (\n rows.map((row) => (\n <tr\n key={row.id}\n className={clsx(styles.tr, onRowClick && styles.clickable)}\n onClick={onRowClick ? () => onRowClick(row.original, row.index) : undefined}\n >\n {rowCells(row)}\n </tr>\n ))\n )\n ) : (\n // no rows → a centered placeholder cell: the loader while fetching (mirrors the empty\n // state's presence), otherwise the empty state\n <tr>\n <td\n colSpan={Math.max(1, renderColumns.length + (reorderable ? 1 : 0))}\n className={styles.stateCell}\n >\n {loading ? (\n <div className={styles.loadingState}>\n <Loader size=\"lg\" />\n <Typography variant=\"bodySmall\" color=\"muted\" as=\"span\">\n Loading…\n </Typography>\n </div>\n ) : (\n (empty ?? <EmptyState />)\n )}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n {/* while refetching with rows already shown, dim them + spinner; the no-rows case is handled in\n the body above (a centered loader), not this overlay */}\n {loading && rows.length > 0 && (\n <div className={styles.loadingOverlay}>\n <Loader size=\"lg\" />\n </div>\n )}\n </div>\n </ReorderProvider>\n\n {totalRows > 0 && (\n <div className={styles.footer}>\n {/* the range count sits on its own row at the top */}\n <Typography variant=\"bodySmall\" color=\"muted\" as=\"span\" className={styles.rangeText}>\n {t('table.range', { from: rangeStart, to: rangeEnd, total: totalRows })}\n </Typography>\n {/* below it: rows-per-page (left) + the page navigator (right). The navigator is pointless with\n a single page (few rows / the \"All\" size) — hidden then. */}\n <div className={styles.footerMain}>\n {showPageSize && (\n <div className={styles.pageSize}>\n <Typography variant=\"bodySmall\" color=\"muted\" as=\"span\">\n {t('table.rowsPerPage')}\n </Typography>\n <Select\n className={styles.pageSizeSelect}\n fullWidth={false}\n clearable={false}\n showSelectedTick={false}\n value={resolvedPageSize >= ALL_ROWS ? 'all' : String(resolvedPageSize)}\n onChange={(value) =>\n commitPagination(() => ({\n pageIndex: 0,\n pageSize: value === 'all' ? ALL_ROWS : Number(value),\n }))\n }\n options={pageSizeChoices}\n />\n </div>\n )}\n {pageCount > 1 && (\n <Pagination\n count={pageCount}\n page={currentPage}\n onChange={(nextPage) =>\n commitPagination((p) => ({ ...p, pageIndex: nextPage - 1 }))\n }\n showFirstButton={showFirstButton}\n showLastButton={showLastButton}\n disabled={loading}\n />\n )}\n </div>\n </div>\n )}\n </div>\n )\n}) as <T>(props: TableProps<T> & { ref?: ForwardedRef<HTMLDivElement> }) => ReactElement\n"],"names":["isFilterActive","type","value","activeFilterCount","filters","state","n","f","pad","localDay","d","localMinute","localTime","toLocalDate","s","iso","datePart","dateTimePart","timePart","matchOne","cell","min","max","part","from","to","t","applyFilters","rows","active","row","buildFilterQuery","mapping","params","minSuffix","maxSuffix","multiFormat","param","arr","v","i","parseFilterQuery","lo","hi","boolOptions","labels","boolToStr","strToBool","RangeField","label","stacked","jsxs","styles","jsx","Typography","FilterField","filter","onChange","useT","options","placeholder","TextField","e","NumberField","low","high","Slider","a","b","Select","MultiSelect","RadioGroup","DatePicker","TimePicker","DateTimePicker","TableFilters","open","setOpen","useState","draft","setDraft","count","formId","useId","openPanel","commit","Fragment","Badge","IconButton","Icon","Modal","Button","prev","ALL_ROWS","DEFAULT_WRAP_MAX_WIDTH","resolveUpdater","updater","old","wrapCap","col","formatCell","renderCellContent","content","prettyQuery","restrictToBoundingRect","transform","rect","boundingRect","restrictToVerticalAxis","restrictToParentElement","containerNodeRect","draggingNodeRect","rowDragModifiers","SortableRow","id","cells","clickable","onClick","setNodeRef","transition","isDragging","attributes","listeners","useSortable","clsx","CSS","ReorderProvider","enabled","sensors","onDragEnd","children","DndContext","closestCenter","Table","forwardRef","columns","data","getRowId","title","toolbar","searchable","searchPlaceholder","defaultSearch","debounceMs","defaultPage","defaultPageSize","pageSizeOptions","allowAllRows","showPageSize","showFirstButton","showLastButton","manualPagination","rowCount","defaultSort","queryMapping","onExportToEmail","defaultFilters","onRowClick","actions","reorderable","onReorder","loading","empty","urlSync","page","onPageChange","pageSize","onPageSizeChange","search","onSearchChange","sort","onSortChange","filterValues","onFiltersChange","stickyHeader","striped","hoverable","className","props","ref","configQueryMapping","useTableQueryConfig","queryMappingRef","useRef","onChangeRef","filtersRef","scrollRef","tableRef","pinShadow","setPinShadow","urlSeed","parseTableQuery","pagination","setPagination","searchInput","setSearchInput","globalFilter","setGlobalFilter","sorting","setSorting","filterState","setFilterState","manual","pageControlled","sizeControlled","searchControlled","sortControlled","filtersControlled","resolvedPagination","resolvedGlobalFilter","resolvedSorting","useMemo","resolvedFilterState","commitPagination","cur","next","p","resetToFirstPage","commitSearch","resetPage","commitSorting","commitFilters","filteredData","handleFiltersChange","tanstackColumns","pageSizeChoices","opts","renderColumns","actionsColumn","index","sortableColumns","c","cycleSort","key","table","useReactTable","getCoreRowModel","getPaginationRowModel","getFilteredRowModel","getSortedRowModel","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","rowIdOf","handleReorder","event","over","r","arrayMove","totalRows","pageIndex","resolvedPageSize","pageCount","currentPage","rangeStart","rangeEnd","useEffect","handle","sortState","getTableState","currentPageNum","size","buildTableQuery","k","_a","hasExport","hasFilters","writeQuery","useCallback","activeFilters","defs","built","m","owned","query","url","popStateRef","parsed","handler","el","update","canScroll","atStart","atEnd","ro","hasToolbar","rowCells","Dropdown","ListItem","sorted","SortableContext","verticalListSortingStrategy","Loader","EmptyState","Pagination","nextPage"],"mappings":"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"}
@@ -0,0 +1,190 @@
1
+ import { jsxs as H, jsx as i } from "react/jsx-runtime";
2
+ import { forwardRef as le, useId as se, useContext as ae, useCallback as I, useState as ce, useRef as y, useEffect as v, createContext as ie } from "react";
3
+ import { clsx as m } from "clsx";
4
+ import { a as de } from "./names-D8ABK2Wk.js";
5
+ import { I as ue } from "./Icon-CophpkHo.js";
6
+ import { l as fe, i as pe } from "./ConfigProvider-2c94kUOk.js";
7
+ const be = "_root_1shrp_1", he = "_vertical_1shrp_7", _e = "_tablist_1shrp_13", we = "_horizontal_1shrp_17", ye = "_fullWidth_1shrp_31", ve = "_tab_1shrp_13", ge = "_underline_1shrp_36", Se = "_pill_1shrp_46", Ne = "_inner_1shrp_82", Te = "_icon_1shrp_88", Ie = "_label_1shrp_92", me = "_count_1shrp_97", Le = "_dot_1shrp_113", ze = "_error_1shrp_124", Ke = "_active_1shrp_135", Re = "_sm_1shrp_161", xe = "_md_1shrp_166", $e = "_lg_1shrp_171", Ee = "_panel_1shrp_178", r = {
8
+ root: be,
9
+ vertical: he,
10
+ tablist: _e,
11
+ horizontal: we,
12
+ fullWidth: ye,
13
+ tab: ve,
14
+ underline: ge,
15
+ pill: Se,
16
+ inner: Ne,
17
+ icon: Te,
18
+ label: Ie,
19
+ count: me,
20
+ dot: Le,
21
+ error: ze,
22
+ active: Ke,
23
+ sm: Re,
24
+ md: xe,
25
+ lg: $e,
26
+ panel: Ee
27
+ }, Qe = new Set(de), M = ie(0), je = le(function({
28
+ items: u,
29
+ value: h,
30
+ defaultValue: L,
31
+ onChange: f,
32
+ queryKey: z,
33
+ pushHistory: K = !1,
34
+ variant: O = "underline",
35
+ size: R = "md",
36
+ color: F = "primary",
37
+ orientation: d = "horizontal",
38
+ fullWidth: G = !1,
39
+ autoFocus: J = !1,
40
+ className: X,
41
+ style: Y,
42
+ "aria-label": Z
43
+ }, V) {
44
+ var j;
45
+ const x = se(), $ = ae(M), ee = fe(), te = pe(), a = z === null ? void 0 : z ?? ($ === 0 ? ee : te), p = I(
46
+ (e) => !!e && u.some((t) => t.value === e && !t.disabled),
47
+ [u]
48
+ ), g = I(() => !a || typeof window > "u" ? null : new URLSearchParams(window.location.search).get(a), [a]), E = (j = u.find((e) => !e.disabled)) == null ? void 0 : j.value, [ne, Q] = ce(() => {
49
+ const e = g();
50
+ return p(e) ? e : p(L) ? L : E;
51
+ }), k = h !== void 0, C = k ? h : ne, o = p(C) ? C : E, b = y(o);
52
+ b.current = o;
53
+ const _ = y(f);
54
+ _.current = f;
55
+ const S = y(!1), A = I(
56
+ (e, t) => {
57
+ if (!a || typeof window > "u") return;
58
+ const n = new URLSearchParams(window.location.search);
59
+ if (n.get(a) === e) return;
60
+ n.set(a, e);
61
+ const c = `${window.location.pathname}?${n.toString()}${window.location.hash}`;
62
+ window.history[t ? "pushState" : "replaceState"](window.history.state, "", c);
63
+ },
64
+ [a]
65
+ ), D = (e) => {
66
+ e !== b.current && (S.current = !0, k || Q(e), f == null || f(e));
67
+ };
68
+ v(() => {
69
+ if (!a || typeof window > "u" || o == null) return;
70
+ const e = S.current && K;
71
+ S.current = !1, A(o, e);
72
+ }, [a, o, K, A]), v(() => {
73
+ if (!a || typeof window > "u") return;
74
+ const e = () => {
75
+ var n;
76
+ const t = g();
77
+ p(t) && t !== b.current && (h === void 0 && Q(t), (n = _.current) == null || n.call(_, t));
78
+ };
79
+ return window.addEventListener("popstate", e), () => window.removeEventListener("popstate", e);
80
+ }, [a, g, p, h]);
81
+ const N = y(null), W = (e) => `[data-value="${typeof CSS < "u" && CSS.escape ? CSS.escape(e) : e}"]`, P = (e) => {
82
+ var t, n;
83
+ (n = (t = N.current) == null ? void 0 : t.querySelector(W(e))) == null || n.focus();
84
+ };
85
+ v(() => {
86
+ J && b.current != null && P(b.current);
87
+ }, []), v(() => {
88
+ if (o == null) return;
89
+ const e = N.current, t = e == null ? void 0 : e.querySelector(W(o));
90
+ if (!e || !t) return;
91
+ const n = e.getBoundingClientRect(), c = t.getBoundingClientRect();
92
+ if (d === "vertical") {
93
+ const l = c.top - n.top + e.scrollTop, s = l + c.height;
94
+ l < e.scrollTop ? e.scrollTop = l : s > e.scrollTop + e.clientHeight && (e.scrollTop = s - e.clientHeight);
95
+ } else {
96
+ const l = c.left - n.left + e.scrollLeft, s = l + c.width;
97
+ l < e.scrollLeft ? e.scrollLeft = l : s > e.scrollLeft + e.clientWidth && (e.scrollLeft = s - e.clientWidth);
98
+ }
99
+ }, [o]);
100
+ const re = (e) => {
101
+ const t = u.filter((T) => !T.disabled);
102
+ if (t.length === 0) return;
103
+ const n = d === "horizontal" ? "ArrowLeft" : "ArrowUp", c = d === "horizontal" ? "ArrowRight" : "ArrowDown", l = t.findIndex((T) => T.value === o);
104
+ let s = -1;
105
+ switch (e.key) {
106
+ case n:
107
+ s = (l - 1 + t.length) % t.length;
108
+ break;
109
+ case c:
110
+ s = (l + 1) % t.length;
111
+ break;
112
+ case "Home":
113
+ s = 0;
114
+ break;
115
+ case "End":
116
+ s = t.length - 1;
117
+ break;
118
+ default:
119
+ return;
120
+ }
121
+ e.preventDefault();
122
+ const B = t[s].value;
123
+ D(B), P(B);
124
+ }, oe = (e) => typeof e == "string" && Qe.has(e) ? /* @__PURE__ */ i(ue, { name: e, size: R }) : e, w = u.find((e) => e.value === o), q = `${x}-panel`, U = (e) => `${x}-tab-${e}`;
125
+ return /* @__PURE__ */ H("div", { ref: V, className: m(r.root, r[d], X), style: Y, children: [
126
+ /* @__PURE__ */ i(
127
+ "div",
128
+ {
129
+ ref: N,
130
+ role: "tablist",
131
+ "aria-label": Z,
132
+ "aria-orientation": d,
133
+ className: m(
134
+ r.tablist,
135
+ r[O],
136
+ r[R],
137
+ r[d],
138
+ G && d === "horizontal" && r.fullWidth
139
+ ),
140
+ onKeyDown: re,
141
+ children: u.map((e) => {
142
+ const t = e.value === o, n = F, c = oe(e.icon), l = e.badge != null && e.badge !== 0, s = !l && (e.dot || e.error);
143
+ return /* @__PURE__ */ i(
144
+ "button",
145
+ {
146
+ type: "button",
147
+ role: "tab",
148
+ "data-value": e.value,
149
+ id: U(e.value),
150
+ "aria-selected": t,
151
+ "aria-label": e.label == null ? e.ariaLabel ?? e.value : e.ariaLabel,
152
+ "aria-controls": t && e.content != null ? q : void 0,
153
+ "aria-disabled": e.disabled || void 0,
154
+ disabled: e.disabled,
155
+ tabIndex: t ? 0 : -1,
156
+ className: m(r.tab, t && r.active, e.error && r.error),
157
+ style: {
158
+ "--tz-btn-rgb": `var(--tz-color-${n}-rgb)`,
159
+ "--tz-btn-on": `var(--tz-color-${n}-contrast, #fff)`
160
+ },
161
+ onClick: () => D(e.value),
162
+ children: /* @__PURE__ */ H("span", { className: r.inner, children: [
163
+ c != null && /* @__PURE__ */ i("span", { className: r.icon, children: c }),
164
+ e.label != null && /* @__PURE__ */ i("span", { className: r.label, children: e.label }),
165
+ l && /* @__PURE__ */ i("span", { className: r.count, children: typeof e.badge == "number" && e.badge > 99 ? "99+" : e.badge }),
166
+ s && /* @__PURE__ */ i("span", { className: r.dot, "aria-hidden": "true" })
167
+ ] })
168
+ },
169
+ e.value
170
+ );
171
+ })
172
+ }
173
+ ),
174
+ (w == null ? void 0 : w.content) != null && o != null && /* @__PURE__ */ i(
175
+ "div",
176
+ {
177
+ role: "tabpanel",
178
+ id: q,
179
+ "aria-labelledby": U(o),
180
+ tabIndex: 0,
181
+ className: r.panel,
182
+ children: /* @__PURE__ */ i(M.Provider, { value: $ + 1, children: w.content })
183
+ }
184
+ )
185
+ ] });
186
+ });
187
+ export {
188
+ je as T
189
+ };
190
+ //# sourceMappingURL=Tabs--DDM-zKe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs--DDM-zKe.js","sources":["../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useNestedTabQueryKey, useTabsQueryKey, type ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport styles from './Tabs.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\n/**\n * Tracks `<Tabs>` nesting depth via context: a top-level strip is depth `0`, a strip rendered inside\n * another tab's panel is `1`, and so on. Used to pick the right default URL query key (`tabQueryKey` at\n * depth `0`, else `nestedTabQueryKey`) so nested strips don't collide on the same param. Default `0`.\n */\nconst TabsDepthContext = createContext(0)\n\nexport type TabsVariant = 'underline' | 'pill'\nexport type TabsSize = 'sm' | 'md' | 'lg'\nexport type TabsOrientation = 'horizontal' | 'vertical'\n\nexport interface TabItem {\n /** Unique value — also what's written to the URL query and passed to `onChange`. */\n value: string\n /** Tab label. */\n label?: ReactNode\n /** Accessible name — required for an icon-only tab (no visible `label`); falls back to `value`. */\n ariaLabel?: string\n /** Leading icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Disables the tab (not selectable; skipped by keyboard nav). */\n disabled?: boolean\n /** Marks the tab invalid — shows a small **red** dot (e.g. its section failed validation). No full-tab tint. */\n error?: boolean\n /** Small dot indicator in the tab color (e.g. unread / notification). `error` shows a red one instead. */\n dot?: boolean\n /** Count / text indicator (rendered with `Badge`); wins over `dot`. */\n badge?: number | string\n /** Panel content rendered below (or beside) the strip while this tab is active. Optional. */\n content?: ReactNode\n}\n\nexport interface TabsProps {\n /** The tabs. */\n items: TabItem[]\n /** Controlled active value. */\n value?: string\n /**\n * Initial active value (uncontrolled). Falls back to the URL query (when URL sync is active and the\n * param is present) and otherwise the first enabled tab.\n */\n defaultValue?: string\n /** Fires with the next active value. */\n onChange?: (value: string) => void\n /**\n * URL query param name to sync the active tab to (e.g. `'tab'` → `?tab=general`), so a page refresh\n * restores it. **Defaults to the configured `keys.tabQueryKey` (else `'tab'`)** at the top level, and\n * `keys.nestedTabQueryKey` (else `'nestedTab'`) for a strip **nested** inside another tab's panel — so\n * the two don't collide (auto-applied by nesting depth). Every tab strip URL-syncs out of the box.\n * Pass **`null`** to opt out (state only). For 3+ nesting levels, set distinct keys explicitly.\n */\n queryKey?: string | null\n /**\n * Push a history entry on each tab change, so the browser **Back** button returns to the previous\n * tab. Defaults to `false` — tab changes **replace** the URL, so Back leaves the page instead of\n * stepping through tabs (and `popstate` still restores a tab when one is in the query).\n */\n pushHistory?: boolean\n /** Visual style. Defaults to `'underline'`. */\n variant?: TabsVariant\n /** Preset size. Defaults to `'md'`. */\n size?: TabsSize\n /** Theme palette token tinting the active tab. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Strip direction. Defaults to `'horizontal'`. */\n orientation?: TabsOrientation\n /** Stretch the tabs to fill the strip equally (horizontal only). */\n fullWidth?: boolean\n /** Focus the active tab on mount (e.g. when the strip lives inside a popover that just opened). */\n autoFocus?: boolean\n /** Accessible label for the tablist. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tab strip with optional panels. Data-driven via `items` (each: `label`, `icon`, `disabled`,\n * `error`, `dot`/`badge` via `Badge`, optional `content`). Controlled (`value` + `onChange`) or\n * uncontrolled (`defaultValue`). The active tab **syncs to the URL query by default** under\n * **`queryKey`** (defaults to the configured `keys.tabQueryKey`, else `'tab'` — and `keys.nestedTabQueryKey`,\n * else `'nestedTab'`, for a strip nested in another tab's panel: `?<queryKey>=<value>`) so a\n * refresh restores it — pass **`queryKey={null}`** to opt out. Tab changes **replace** the URL by\n * default (so Back doesn't step through tabs); pass **`pushHistory`** to make Back navigate tabs. Full\n * keyboard support (Arrows / Home / End, roving tabindex) and `role=\"tablist\"`/`tab`/`tabpanel` a11y.\n */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n items,\n value,\n defaultValue,\n onChange,\n queryKey,\n pushHistory = false,\n variant = 'underline',\n size = 'md',\n color = 'primary',\n orientation = 'horizontal',\n fullWidth = false,\n autoFocus = false,\n className,\n style,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n const reactId = useId()\n\n // resolve the URL-sync key: an explicit `null` opts out (state only); omitting it falls back to the\n // configured default — `keys.tabQueryKey` for a top-level strip, `keys.nestedTabQueryKey` for one\n // nested inside another tab's panel (by depth) — so nested strips don't collide on the same param.\n const depth = useContext(TabsDepthContext)\n const tabQueryKey = useTabsQueryKey()\n const nestedTabQueryKey = useNestedTabQueryKey()\n const configQueryKey = depth === 0 ? tabQueryKey : nestedTabQueryKey\n const syncKey = queryKey === null ? undefined : (queryKey ?? configQueryKey)\n\n const isSelectable = useCallback(\n (v: string | null | undefined): v is string =>\n !!v && items.some((i) => i.value === v && !i.disabled),\n [items],\n )\n\n const readQuery = useCallback((): string | null => {\n if (!syncKey || typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get(syncKey)\n }, [syncKey])\n\n // undefined when every tab is disabled — better than defaulting to a disabled tab (nothing active)\n const firstEnabled = items.find((i) => !i.disabled)?.value\n\n const [internal, setInternal] = useState<string | undefined>(() => {\n const q = readQuery()\n if (isSelectable(q)) return q\n return isSelectable(defaultValue) ? defaultValue : firstEnabled\n })\n const isControlled = value !== undefined\n const raw = isControlled ? value : internal\n // clamp to a present, enabled tab — guarantees a focusable roving tabstop + a rendered panel (no\n // keyboard trap) and keeps a bogus/disabled value out of the URL; falls back to the first enabled tab\n const active = isSelectable(raw) ? raw : firstEnabled\n\n // keep the latest active / onChange / push-intent for the stable effects + popstate listener\n const activeRef = useRef(active)\n activeRef.current = active\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n const pushIntent = useRef(false)\n\n const writeQuery = useCallback(\n (next: string, push: boolean) => {\n if (!syncKey || typeof window === 'undefined') return\n const params = new URLSearchParams(window.location.search)\n if (params.get(syncKey) === next) return\n params.set(syncKey, next)\n const url = `${window.location.pathname}?${params.toString()}${window.location.hash}`\n window.history[push ? 'pushState' : 'replaceState'](window.history.state, '', url)\n },\n [syncKey],\n )\n\n const select = (next: string) => {\n if (next === activeRef.current) return\n pushIntent.current = true\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // mirror the *resolved* active tab into the URL whenever it changes (and on mount = canonicalize), so\n // the URL never holds a bogus value and a controlled value-change still syncs. A user-driven change\n // `push`es when `pushHistory` (Back walks tabs); programmatic / popstate changes just `replace`.\n useEffect(() => {\n if (!syncKey || typeof window === 'undefined' || active == null) return\n const push = pushIntent.current && pushHistory\n pushIntent.current = false\n writeQuery(active, push)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [syncKey, active, pushHistory, writeQuery])\n\n // Back/Forward → restore the tab from the query\n useEffect(() => {\n if (!syncKey || typeof window === 'undefined') return\n const onPopState = () => {\n const q = readQuery()\n if (isSelectable(q) && q !== activeRef.current) {\n if (value === undefined) setInternal(q)\n onChangeRef.current?.(q)\n }\n }\n window.addEventListener('popstate', onPopState)\n return () => window.removeEventListener('popstate', onPopState)\n }, [syncKey, readQuery, isSelectable, value])\n\n const tablistRef = useRef<HTMLDivElement | null>(null)\n const tabSelector = (v: string) =>\n `[data-value=\"${typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(v) : v}\"]`\n const focusTab = (v: string) => {\n tablistRef.current?.querySelector<HTMLElement>(tabSelector(v))?.focus()\n }\n\n // optionally move focus onto the active tab once, on mount (e.g. inside a popover that just opened)\n useEffect(() => {\n if (autoFocus && activeRef.current != null) focusTab(activeRef.current)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // keep the active tab in view when the strip overflows — by moving the tablist's OWN scroll offset\n // only. (scrollIntoView would also scroll every scrollable ancestor — i.e. the page — yanking a\n // below-the-fold strip's section into view on mount.)\n useEffect(() => {\n if (active == null) return\n const list = tablistRef.current\n const el = list?.querySelector<HTMLElement>(tabSelector(active))\n if (!list || !el) return\n const listRect = list.getBoundingClientRect()\n const elRect = el.getBoundingClientRect()\n if (orientation === 'vertical') {\n const top = elRect.top - listRect.top + list.scrollTop\n const bottom = top + elRect.height\n if (top < list.scrollTop) list.scrollTop = top\n else if (bottom > list.scrollTop + list.clientHeight)\n list.scrollTop = bottom - list.clientHeight\n } else {\n const left = elRect.left - listRect.left + list.scrollLeft\n const right = left + elRect.width\n if (left < list.scrollLeft) list.scrollLeft = left\n else if (right > list.scrollLeft + list.clientWidth)\n list.scrollLeft = right - list.clientWidth\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const enabled = items.filter((i) => !i.disabled)\n if (enabled.length === 0) return\n const prevKey = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const nextKey = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const current = enabled.findIndex((i) => i.value === active)\n let target = -1\n switch (event.key) {\n case prevKey:\n target = (current - 1 + enabled.length) % enabled.length\n break\n case nextKey:\n target = (current + 1) % enabled.length\n break\n case 'Home':\n target = 0\n break\n case 'End':\n target = enabled.length - 1\n break\n default:\n return\n }\n event.preventDefault()\n const next = enabled[target].value\n select(next)\n focusTab(next)\n }\n\n const renderIcon = (icon: TabItem['icon']) =>\n typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n const activeItem = items.find((i) => i.value === active)\n const panelId = `${reactId}-panel`\n const tabId = (v: string) => `${reactId}-tab-${v}`\n\n return (\n <div ref={ref} className={clsx(styles.root, styles[orientation], className)} style={style}>\n <div\n ref={tablistRef}\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n className={clsx(\n styles.tablist,\n styles[variant],\n styles[size],\n styles[orientation],\n fullWidth && orientation === 'horizontal' && styles.fullWidth,\n )}\n onKeyDown={handleKeyDown}\n >\n {items.map((item) => {\n const selected = item.value === active\n // the tab keeps its theme color; `error` shows up only as a red dot, not a full-tab tint\n const tint = color\n const icon = renderIcon(item.icon)\n const hasCount = item.badge != null && item.badge !== 0\n // a dot shows for an explicit `dot` (tinted) or an `error` tab (red — see CSS); count wins\n const showDot = !hasCount && (item.dot || item.error)\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n data-value={item.value}\n id={tabId(item.value)}\n aria-selected={selected}\n aria-label={item.label == null ? (item.ariaLabel ?? item.value) : item.ariaLabel}\n aria-controls={selected && item.content != null ? panelId : undefined}\n aria-disabled={item.disabled || undefined}\n disabled={item.disabled}\n tabIndex={selected ? 0 : -1}\n className={clsx(styles.tab, selected && styles.active, item.error && styles.error)}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${tint}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${tint}-contrast, #fff)`,\n } as CSSProperties\n }\n onClick={() => select(item.value)}\n >\n <span className={styles.inner}>\n {icon != null && <span className={styles.icon}>{icon}</span>}\n {item.label != null && <span className={styles.label}>{item.label}</span>}\n {hasCount && (\n <span className={styles.count}>\n {typeof item.badge === 'number' && item.badge > 99 ? '99+' : item.badge}\n </span>\n )}\n {showDot && <span className={styles.dot} aria-hidden=\"true\" />}\n </span>\n </button>\n )\n })}\n </div>\n\n {activeItem?.content != null && active != null && (\n <div\n role=\"tabpanel\"\n id={panelId}\n aria-labelledby={tabId(active)}\n tabIndex={0}\n className={styles.panel}\n >\n {/* a <Tabs> rendered in here is one level deeper → picks the nested query key by default */}\n <TabsDepthContext.Provider value={depth + 1}>\n {activeItem.content}\n </TabsDepthContext.Provider>\n </div>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","TabsDepthContext","createContext","Tabs","forwardRef","items","value","defaultValue","onChange","queryKey","pushHistory","variant","size","color","orientation","fullWidth","autoFocus","className","style","ariaLabel","ref","reactId","useId","depth","useContext","tabQueryKey","useTabsQueryKey","nestedTabQueryKey","useNestedTabQueryKey","syncKey","isSelectable","useCallback","v","i","readQuery","firstEnabled","_a","internal","setInternal","useState","q","isControlled","raw","active","activeRef","useRef","onChangeRef","pushIntent","writeQuery","next","push","params","url","select","useEffect","onPopState","tablistRef","tabSelector","focusTab","_b","list","el","listRect","elRect","top","bottom","left","right","handleKeyDown","event","enabled","prevKey","nextKey","current","target","renderIcon","icon","jsx","Icon","activeItem","panelId","tabId","jsxs","clsx","styles","item","selected","tint","hasCount","showDot"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const u=require("react/jsx-runtime"),s=require("react"),N=require("clsx"),re=require("./names-C2Yj1p3u.cjs"),se=require("./Icon-CXTl_QAP.cjs"),m=require("./ConfigProvider-ByOFXVyP.cjs"),le="_root_1shrp_1",oe="_vertical_1shrp_7",ce="_tablist_1shrp_13",ae="_horizontal_1shrp_17",ie="_fullWidth_1shrp_31",ue="_tab_1shrp_13",de="_underline_1shrp_36",fe="_pill_1shrp_46",be="_inner_1shrp_82",pe="_icon_1shrp_88",he="_label_1shrp_92",_e="_count_1shrp_97",we="_dot_1shrp_113",ve="_error_1shrp_124",ye="_active_1shrp_135",ge="_sm_1shrp_161",xe="_md_1shrp_166",Se="_lg_1shrp_171",Ne="_panel_1shrp_178",r={root:le,vertical:oe,tablist:ce,horizontal:ae,fullWidth:ie,tab:ue,underline:de,pill:fe,inner:be,icon:pe,label:he,count:_e,dot:we,error:ve,active:ye,sm:ge,md:xe,lg:Se,panel:Ne},Re=new Set(re.ICON_NAMES),B=s.createContext(0),Te=s.forwardRef(function({items:f,value:_,defaultValue:R,onChange:b,queryKey:T,pushHistory:I=!1,variant:H="underline",size:j="md",color:M="primary",orientation:d="horizontal",fullWidth:O=!1,autoFocus:F=!1,className:G,style:J,"aria-label":X},Y){var P;const L=s.useId(),E=s.useContext(B),Z=m.useTabsQueryKey(),V=m.useNestedTabQueryKey(),a=T===null?void 0:T??(E===0?Z:V),p=s.useCallback(e=>!!e&&f.some(t=>t.value===e&&!t.disabled),[f]),y=s.useCallback(()=>!a||typeof window>"u"?null:new URLSearchParams(window.location.search).get(a),[a]),z=(P=f.find(e=>!e.disabled))==null?void 0:P.value,[ee,C]=s.useState(()=>{const e=y();return p(e)?e:p(R)?R:z}),K=_!==void 0,k=K?_:ee,l=p(k)?k:z,h=s.useRef(l);h.current=l;const w=s.useRef(b);w.current=b;const g=s.useRef(!1),q=s.useCallback((e,t)=>{if(!a||typeof window>"u")return;const n=new URLSearchParams(window.location.search);if(n.get(a)===e)return;n.set(a,e);const i=`${window.location.pathname}?${n.toString()}${window.location.hash}`;window.history[t?"pushState":"replaceState"](window.history.state,"",i)},[a]),$=e=>{e!==h.current&&(g.current=!0,K||C(e),b==null||b(e))};s.useEffect(()=>{if(!a||typeof window>"u"||l==null)return;const e=g.current&&I;g.current=!1,q(l,e)},[a,l,I,q]),s.useEffect(()=>{if(!a||typeof window>"u")return;const e=()=>{var n;const t=y();p(t)&&t!==h.current&&(_===void 0&&C(t),(n=w.current)==null||n.call(w,t))};return window.addEventListener("popstate",e),()=>window.removeEventListener("popstate",e)},[a,y,p,_]);const x=s.useRef(null),Q=e=>`[data-value="${typeof CSS<"u"&&CSS.escape?CSS.escape(e):e}"]`,A=e=>{var t,n;(n=(t=x.current)==null?void 0:t.querySelector(Q(e)))==null||n.focus()};s.useEffect(()=>{F&&h.current!=null&&A(h.current)},[]),s.useEffect(()=>{if(l==null)return;const e=x.current,t=e==null?void 0:e.querySelector(Q(l));if(!e||!t)return;const n=e.getBoundingClientRect(),i=t.getBoundingClientRect();if(d==="vertical"){const o=i.top-n.top+e.scrollTop,c=o+i.height;o<e.scrollTop?e.scrollTop=o:c>e.scrollTop+e.clientHeight&&(e.scrollTop=c-e.clientHeight)}else{const o=i.left-n.left+e.scrollLeft,c=o+i.width;o<e.scrollLeft?e.scrollLeft=o:c>e.scrollLeft+e.clientWidth&&(e.scrollLeft=c-e.clientWidth)}},[l]);const te=e=>{const t=f.filter(S=>!S.disabled);if(t.length===0)return;const n=d==="horizontal"?"ArrowLeft":"ArrowUp",i=d==="horizontal"?"ArrowRight":"ArrowDown",o=t.findIndex(S=>S.value===l);let c=-1;switch(e.key){case n:c=(o-1+t.length)%t.length;break;case i:c=(o+1)%t.length;break;case"Home":c=0;break;case"End":c=t.length-1;break;default:return}e.preventDefault();const U=t[c].value;$(U),A(U)},ne=e=>typeof e=="string"&&Re.has(e)?u.jsx(se.Icon,{name:e,size:j}):e,v=f.find(e=>e.value===l),D=`${L}-panel`,W=e=>`${L}-tab-${e}`;return u.jsxs("div",{ref:Y,className:N.clsx(r.root,r[d],G),style:J,children:[u.jsx("div",{ref:x,role:"tablist","aria-label":X,"aria-orientation":d,className:N.clsx(r.tablist,r[H],r[j],r[d],O&&d==="horizontal"&&r.fullWidth),onKeyDown:te,children:f.map(e=>{const t=e.value===l,n=M,i=ne(e.icon),o=e.badge!=null&&e.badge!==0,c=!o&&(e.dot||e.error);return u.jsx("button",{type:"button",role:"tab","data-value":e.value,id:W(e.value),"aria-selected":t,"aria-label":e.label==null?e.ariaLabel??e.value:e.ariaLabel,"aria-controls":t&&e.content!=null?D:void 0,"aria-disabled":e.disabled||void 0,disabled:e.disabled,tabIndex:t?0:-1,className:N.clsx(r.tab,t&&r.active,e.error&&r.error),style:{"--tz-btn-rgb":`var(--tz-color-${n}-rgb)`,"--tz-btn-on":`var(--tz-color-${n}-contrast, #fff)`},onClick:()=>$(e.value),children:u.jsxs("span",{className:r.inner,children:[i!=null&&u.jsx("span",{className:r.icon,children:i}),e.label!=null&&u.jsx("span",{className:r.label,children:e.label}),o&&u.jsx("span",{className:r.count,children:typeof e.badge=="number"&&e.badge>99?"99+":e.badge}),c&&u.jsx("span",{className:r.dot,"aria-hidden":"true"})]})},e.value)})}),(v==null?void 0:v.content)!=null&&l!=null&&u.jsx("div",{role:"tabpanel",id:D,"aria-labelledby":W(l),tabIndex:0,className:r.panel,children:u.jsx(B.Provider,{value:E+1,children:v.content})})]})});exports.Tabs=Te;
2
+ //# sourceMappingURL=Tabs-BZcMnjdC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs-BZcMnjdC.cjs","sources":["../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useNestedTabQueryKey, useTabsQueryKey, type ThemeColor } from '../../theme'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport styles from './Tabs.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\n/**\n * Tracks `<Tabs>` nesting depth via context: a top-level strip is depth `0`, a strip rendered inside\n * another tab's panel is `1`, and so on. Used to pick the right default URL query key (`tabQueryKey` at\n * depth `0`, else `nestedTabQueryKey`) so nested strips don't collide on the same param. Default `0`.\n */\nconst TabsDepthContext = createContext(0)\n\nexport type TabsVariant = 'underline' | 'pill'\nexport type TabsSize = 'sm' | 'md' | 'lg'\nexport type TabsOrientation = 'horizontal' | 'vertical'\n\nexport interface TabItem {\n /** Unique value — also what's written to the URL query and passed to `onChange`. */\n value: string\n /** Tab label. */\n label?: ReactNode\n /** Accessible name — required for an icon-only tab (no visible `label`); falls back to `value`. */\n ariaLabel?: string\n /** Leading icon — a known `IconName` or any node. */\n icon?: IconName | ReactNode\n /** Disables the tab (not selectable; skipped by keyboard nav). */\n disabled?: boolean\n /** Marks the tab invalid — shows a small **red** dot (e.g. its section failed validation). No full-tab tint. */\n error?: boolean\n /** Small dot indicator in the tab color (e.g. unread / notification). `error` shows a red one instead. */\n dot?: boolean\n /** Count / text indicator (rendered with `Badge`); wins over `dot`. */\n badge?: number | string\n /** Panel content rendered below (or beside) the strip while this tab is active. Optional. */\n content?: ReactNode\n}\n\nexport interface TabsProps {\n /** The tabs. */\n items: TabItem[]\n /** Controlled active value. */\n value?: string\n /**\n * Initial active value (uncontrolled). Falls back to the URL query (when URL sync is active and the\n * param is present) and otherwise the first enabled tab.\n */\n defaultValue?: string\n /** Fires with the next active value. */\n onChange?: (value: string) => void\n /**\n * URL query param name to sync the active tab to (e.g. `'tab'` → `?tab=general`), so a page refresh\n * restores it. **Defaults to the configured `keys.tabQueryKey` (else `'tab'`)** at the top level, and\n * `keys.nestedTabQueryKey` (else `'nestedTab'`) for a strip **nested** inside another tab's panel — so\n * the two don't collide (auto-applied by nesting depth). Every tab strip URL-syncs out of the box.\n * Pass **`null`** to opt out (state only). For 3+ nesting levels, set distinct keys explicitly.\n */\n queryKey?: string | null\n /**\n * Push a history entry on each tab change, so the browser **Back** button returns to the previous\n * tab. Defaults to `false` — tab changes **replace** the URL, so Back leaves the page instead of\n * stepping through tabs (and `popstate` still restores a tab when one is in the query).\n */\n pushHistory?: boolean\n /** Visual style. Defaults to `'underline'`. */\n variant?: TabsVariant\n /** Preset size. Defaults to `'md'`. */\n size?: TabsSize\n /** Theme palette token tinting the active tab. Defaults to `'primary'`. */\n color?: ThemeColor\n /** Strip direction. Defaults to `'horizontal'`. */\n orientation?: TabsOrientation\n /** Stretch the tabs to fill the strip equally (horizontal only). */\n fullWidth?: boolean\n /** Focus the active tab on mount (e.g. when the strip lives inside a popover that just opened). */\n autoFocus?: boolean\n /** Accessible label for the tablist. */\n 'aria-label'?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A tab strip with optional panels. Data-driven via `items` (each: `label`, `icon`, `disabled`,\n * `error`, `dot`/`badge` via `Badge`, optional `content`). Controlled (`value` + `onChange`) or\n * uncontrolled (`defaultValue`). The active tab **syncs to the URL query by default** under\n * **`queryKey`** (defaults to the configured `keys.tabQueryKey`, else `'tab'` — and `keys.nestedTabQueryKey`,\n * else `'nestedTab'`, for a strip nested in another tab's panel: `?<queryKey>=<value>`) so a\n * refresh restores it — pass **`queryKey={null}`** to opt out. Tab changes **replace** the URL by\n * default (so Back doesn't step through tabs); pass **`pushHistory`** to make Back navigate tabs. Full\n * keyboard support (Arrows / Home / End, roving tabindex) and `role=\"tablist\"`/`tab`/`tabpanel` a11y.\n */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n items,\n value,\n defaultValue,\n onChange,\n queryKey,\n pushHistory = false,\n variant = 'underline',\n size = 'md',\n color = 'primary',\n orientation = 'horizontal',\n fullWidth = false,\n autoFocus = false,\n className,\n style,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n const reactId = useId()\n\n // resolve the URL-sync key: an explicit `null` opts out (state only); omitting it falls back to the\n // configured default — `keys.tabQueryKey` for a top-level strip, `keys.nestedTabQueryKey` for one\n // nested inside another tab's panel (by depth) — so nested strips don't collide on the same param.\n const depth = useContext(TabsDepthContext)\n const tabQueryKey = useTabsQueryKey()\n const nestedTabQueryKey = useNestedTabQueryKey()\n const configQueryKey = depth === 0 ? tabQueryKey : nestedTabQueryKey\n const syncKey = queryKey === null ? undefined : (queryKey ?? configQueryKey)\n\n const isSelectable = useCallback(\n (v: string | null | undefined): v is string =>\n !!v && items.some((i) => i.value === v && !i.disabled),\n [items],\n )\n\n const readQuery = useCallback((): string | null => {\n if (!syncKey || typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get(syncKey)\n }, [syncKey])\n\n // undefined when every tab is disabled — better than defaulting to a disabled tab (nothing active)\n const firstEnabled = items.find((i) => !i.disabled)?.value\n\n const [internal, setInternal] = useState<string | undefined>(() => {\n const q = readQuery()\n if (isSelectable(q)) return q\n return isSelectable(defaultValue) ? defaultValue : firstEnabled\n })\n const isControlled = value !== undefined\n const raw = isControlled ? value : internal\n // clamp to a present, enabled tab — guarantees a focusable roving tabstop + a rendered panel (no\n // keyboard trap) and keeps a bogus/disabled value out of the URL; falls back to the first enabled tab\n const active = isSelectable(raw) ? raw : firstEnabled\n\n // keep the latest active / onChange / push-intent for the stable effects + popstate listener\n const activeRef = useRef(active)\n activeRef.current = active\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n const pushIntent = useRef(false)\n\n const writeQuery = useCallback(\n (next: string, push: boolean) => {\n if (!syncKey || typeof window === 'undefined') return\n const params = new URLSearchParams(window.location.search)\n if (params.get(syncKey) === next) return\n params.set(syncKey, next)\n const url = `${window.location.pathname}?${params.toString()}${window.location.hash}`\n window.history[push ? 'pushState' : 'replaceState'](window.history.state, '', url)\n },\n [syncKey],\n )\n\n const select = (next: string) => {\n if (next === activeRef.current) return\n pushIntent.current = true\n if (!isControlled) setInternal(next)\n onChange?.(next)\n }\n\n // mirror the *resolved* active tab into the URL whenever it changes (and on mount = canonicalize), so\n // the URL never holds a bogus value and a controlled value-change still syncs. A user-driven change\n // `push`es when `pushHistory` (Back walks tabs); programmatic / popstate changes just `replace`.\n useEffect(() => {\n if (!syncKey || typeof window === 'undefined' || active == null) return\n const push = pushIntent.current && pushHistory\n pushIntent.current = false\n writeQuery(active, push)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [syncKey, active, pushHistory, writeQuery])\n\n // Back/Forward → restore the tab from the query\n useEffect(() => {\n if (!syncKey || typeof window === 'undefined') return\n const onPopState = () => {\n const q = readQuery()\n if (isSelectable(q) && q !== activeRef.current) {\n if (value === undefined) setInternal(q)\n onChangeRef.current?.(q)\n }\n }\n window.addEventListener('popstate', onPopState)\n return () => window.removeEventListener('popstate', onPopState)\n }, [syncKey, readQuery, isSelectable, value])\n\n const tablistRef = useRef<HTMLDivElement | null>(null)\n const tabSelector = (v: string) =>\n `[data-value=\"${typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(v) : v}\"]`\n const focusTab = (v: string) => {\n tablistRef.current?.querySelector<HTMLElement>(tabSelector(v))?.focus()\n }\n\n // optionally move focus onto the active tab once, on mount (e.g. inside a popover that just opened)\n useEffect(() => {\n if (autoFocus && activeRef.current != null) focusTab(activeRef.current)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // keep the active tab in view when the strip overflows — by moving the tablist's OWN scroll offset\n // only. (scrollIntoView would also scroll every scrollable ancestor — i.e. the page — yanking a\n // below-the-fold strip's section into view on mount.)\n useEffect(() => {\n if (active == null) return\n const list = tablistRef.current\n const el = list?.querySelector<HTMLElement>(tabSelector(active))\n if (!list || !el) return\n const listRect = list.getBoundingClientRect()\n const elRect = el.getBoundingClientRect()\n if (orientation === 'vertical') {\n const top = elRect.top - listRect.top + list.scrollTop\n const bottom = top + elRect.height\n if (top < list.scrollTop) list.scrollTop = top\n else if (bottom > list.scrollTop + list.clientHeight)\n list.scrollTop = bottom - list.clientHeight\n } else {\n const left = elRect.left - listRect.left + list.scrollLeft\n const right = left + elRect.width\n if (left < list.scrollLeft) list.scrollLeft = left\n else if (right > list.scrollLeft + list.clientWidth)\n list.scrollLeft = right - list.clientWidth\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active])\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const enabled = items.filter((i) => !i.disabled)\n if (enabled.length === 0) return\n const prevKey = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const nextKey = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const current = enabled.findIndex((i) => i.value === active)\n let target = -1\n switch (event.key) {\n case prevKey:\n target = (current - 1 + enabled.length) % enabled.length\n break\n case nextKey:\n target = (current + 1) % enabled.length\n break\n case 'Home':\n target = 0\n break\n case 'End':\n target = enabled.length - 1\n break\n default:\n return\n }\n event.preventDefault()\n const next = enabled[target].value\n select(next)\n focusTab(next)\n }\n\n const renderIcon = (icon: TabItem['icon']) =>\n typeof icon === 'string' && ICON_NAME_SET.has(icon) ? (\n <Icon name={icon as IconName} size={size} />\n ) : (\n icon\n )\n\n const activeItem = items.find((i) => i.value === active)\n const panelId = `${reactId}-panel`\n const tabId = (v: string) => `${reactId}-tab-${v}`\n\n return (\n <div ref={ref} className={clsx(styles.root, styles[orientation], className)} style={style}>\n <div\n ref={tablistRef}\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n className={clsx(\n styles.tablist,\n styles[variant],\n styles[size],\n styles[orientation],\n fullWidth && orientation === 'horizontal' && styles.fullWidth,\n )}\n onKeyDown={handleKeyDown}\n >\n {items.map((item) => {\n const selected = item.value === active\n // the tab keeps its theme color; `error` shows up only as a red dot, not a full-tab tint\n const tint = color\n const icon = renderIcon(item.icon)\n const hasCount = item.badge != null && item.badge !== 0\n // a dot shows for an explicit `dot` (tinted) or an `error` tab (red — see CSS); count wins\n const showDot = !hasCount && (item.dot || item.error)\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n data-value={item.value}\n id={tabId(item.value)}\n aria-selected={selected}\n aria-label={item.label == null ? (item.ariaLabel ?? item.value) : item.ariaLabel}\n aria-controls={selected && item.content != null ? panelId : undefined}\n aria-disabled={item.disabled || undefined}\n disabled={item.disabled}\n tabIndex={selected ? 0 : -1}\n className={clsx(styles.tab, selected && styles.active, item.error && styles.error)}\n style={\n {\n '--tz-btn-rgb': `var(--tz-color-${tint}-rgb)`,\n '--tz-btn-on': `var(--tz-color-${tint}-contrast, #fff)`,\n } as CSSProperties\n }\n onClick={() => select(item.value)}\n >\n <span className={styles.inner}>\n {icon != null && <span className={styles.icon}>{icon}</span>}\n {item.label != null && <span className={styles.label}>{item.label}</span>}\n {hasCount && (\n <span className={styles.count}>\n {typeof item.badge === 'number' && item.badge > 99 ? '99+' : item.badge}\n </span>\n )}\n {showDot && <span className={styles.dot} aria-hidden=\"true\" />}\n </span>\n </button>\n )\n })}\n </div>\n\n {activeItem?.content != null && active != null && (\n <div\n role=\"tabpanel\"\n id={panelId}\n aria-labelledby={tabId(active)}\n tabIndex={0}\n className={styles.panel}\n >\n {/* a <Tabs> rendered in here is one level deeper → picks the nested query key by default */}\n <TabsDepthContext.Provider value={depth + 1}>\n {activeItem.content}\n </TabsDepthContext.Provider>\n </div>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","TabsDepthContext","createContext","Tabs","forwardRef","items","value","defaultValue","onChange","queryKey","pushHistory","variant","size","color","orientation","fullWidth","autoFocus","className","style","ariaLabel","ref","reactId","useId","depth","useContext","tabQueryKey","useTabsQueryKey","nestedTabQueryKey","useNestedTabQueryKey","syncKey","isSelectable","useCallback","v","i","readQuery","firstEnabled","_a","internal","setInternal","useState","q","isControlled","raw","active","activeRef","useRef","onChangeRef","pushIntent","writeQuery","next","push","params","url","select","useEffect","onPopState","tablistRef","tabSelector","focusTab","_b","list","el","listRect","elRect","top","bottom","left","right","handleKeyDown","event","enabled","prevKey","nextKey","current","target","renderIcon","icon","jsx","Icon","activeItem","panelId","tabId","jsxs","clsx","styles","item","selected","tint","hasCount","showDot"],"mappings":"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"}