@jameskabz/nextcraft-ui 0.6.3 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/dist/components/craft-alert.cjs +69 -0
  2. package/dist/components/craft-alert.cjs.map +1 -0
  3. package/dist/components/craft-alert.d.cts +16 -0
  4. package/dist/components/craft-alert.d.ts +16 -0
  5. package/dist/components/craft-alert.js +45 -0
  6. package/dist/components/craft-alert.js.map +1 -0
  7. package/dist/components/craft-badge.cjs +54 -0
  8. package/dist/components/craft-badge.cjs.map +1 -0
  9. package/dist/components/craft-badge.d.cts +12 -0
  10. package/dist/components/craft-badge.d.ts +12 -0
  11. package/dist/components/craft-badge.js +30 -0
  12. package/dist/components/craft-badge.js.map +1 -0
  13. package/dist/components/craft-button.cjs +66 -0
  14. package/dist/components/craft-button.cjs.map +1 -0
  15. package/dist/components/craft-button.d.cts +15 -0
  16. package/dist/components/craft-button.d.ts +15 -0
  17. package/dist/components/craft-button.js +42 -0
  18. package/dist/components/craft-button.js.map +1 -0
  19. package/dist/components/craft-card.cjs +63 -0
  20. package/dist/components/craft-card.cjs.map +1 -0
  21. package/dist/components/craft-card.d.cts +13 -0
  22. package/dist/components/craft-card.d.ts +13 -0
  23. package/dist/components/craft-card.js +39 -0
  24. package/dist/components/craft-card.js.map +1 -0
  25. package/dist/components/craft-checkbox.cjs +103 -0
  26. package/dist/components/craft-checkbox.cjs.map +1 -0
  27. package/dist/components/craft-checkbox.d.cts +16 -0
  28. package/dist/components/craft-checkbox.d.ts +16 -0
  29. package/dist/components/craft-checkbox.js +69 -0
  30. package/dist/components/craft-checkbox.js.map +1 -0
  31. package/dist/components/craft-command-palette.cjs +134 -0
  32. package/dist/components/craft-command-palette.cjs.map +1 -0
  33. package/dist/components/craft-command-palette.d.cts +28 -0
  34. package/dist/components/craft-command-palette.d.ts +28 -0
  35. package/dist/components/craft-command-palette.js +100 -0
  36. package/dist/components/craft-command-palette.js.map +1 -0
  37. package/dist/components/craft-confirm-dialog.cjs +114 -0
  38. package/dist/components/craft-confirm-dialog.cjs.map +1 -0
  39. package/dist/components/craft-confirm-dialog.d.cts +21 -0
  40. package/dist/components/craft-confirm-dialog.d.ts +21 -0
  41. package/dist/components/craft-confirm-dialog.js +80 -0
  42. package/dist/components/craft-confirm-dialog.js.map +1 -0
  43. package/dist/components/craft-create-edit-drawer.cjs +112 -0
  44. package/dist/components/craft-create-edit-drawer.cjs.map +1 -0
  45. package/dist/components/craft-create-edit-drawer.d.cts +28 -0
  46. package/dist/components/craft-create-edit-drawer.d.ts +28 -0
  47. package/dist/components/craft-create-edit-drawer.js +78 -0
  48. package/dist/components/craft-create-edit-drawer.js.map +1 -0
  49. package/dist/components/craft-currency-input.cjs +68 -0
  50. package/dist/components/craft-currency-input.cjs.map +1 -0
  51. package/dist/components/craft-currency-input.d.cts +14 -0
  52. package/dist/components/craft-currency-input.d.ts +14 -0
  53. package/dist/components/craft-currency-input.js +34 -0
  54. package/dist/components/craft-currency-input.js.map +1 -0
  55. package/dist/components/craft-data-table.cjs +407 -0
  56. package/dist/components/craft-data-table.cjs.map +1 -0
  57. package/dist/components/craft-data-table.d.cts +58 -0
  58. package/dist/components/craft-data-table.d.ts +58 -0
  59. package/dist/{chunk-ZRV4Y374.js → components/craft-data-table.js} +30 -239
  60. package/dist/components/craft-data-table.js.map +1 -0
  61. package/dist/components/craft-date-picker.cjs +226 -0
  62. package/dist/components/craft-date-picker.cjs.map +1 -0
  63. package/dist/components/craft-date-picker.d.cts +17 -0
  64. package/dist/components/craft-date-picker.d.ts +17 -0
  65. package/dist/components/craft-date-picker.js +192 -0
  66. package/dist/components/craft-date-picker.js.map +1 -0
  67. package/dist/components/craft-drawer.cjs +126 -0
  68. package/dist/components/craft-drawer.cjs.map +1 -0
  69. package/dist/components/craft-drawer.d.cts +19 -0
  70. package/dist/components/craft-drawer.d.ts +19 -0
  71. package/dist/components/craft-drawer.js +92 -0
  72. package/dist/components/craft-drawer.js.map +1 -0
  73. package/dist/components/craft-dropdown-menu.cjs +127 -0
  74. package/dist/components/craft-dropdown-menu.cjs.map +1 -0
  75. package/dist/components/craft-dropdown-menu.d.cts +28 -0
  76. package/dist/components/craft-dropdown-menu.d.ts +28 -0
  77. package/dist/components/craft-dropdown-menu.js +93 -0
  78. package/dist/components/craft-dropdown-menu.js.map +1 -0
  79. package/dist/components/craft-empty-state.cjs +58 -0
  80. package/dist/components/craft-empty-state.cjs.map +1 -0
  81. package/dist/components/craft-empty-state.d.cts +14 -0
  82. package/dist/components/craft-empty-state.d.ts +14 -0
  83. package/dist/components/craft-empty-state.js +34 -0
  84. package/dist/components/craft-empty-state.js.map +1 -0
  85. package/dist/components/craft-error-state.cjs +60 -0
  86. package/dist/components/craft-error-state.cjs.map +1 -0
  87. package/dist/components/craft-error-state.d.cts +15 -0
  88. package/dist/components/craft-error-state.d.ts +15 -0
  89. package/dist/components/craft-error-state.js +36 -0
  90. package/dist/components/craft-error-state.js.map +1 -0
  91. package/dist/components/craft-filter-bar.cjs +76 -0
  92. package/dist/components/craft-filter-bar.cjs.map +1 -0
  93. package/dist/components/craft-filter-bar.d.cts +18 -0
  94. package/dist/components/craft-filter-bar.d.ts +18 -0
  95. package/dist/components/craft-filter-bar.js +52 -0
  96. package/dist/components/craft-filter-bar.js.map +1 -0
  97. package/dist/components/craft-form-builder.cjs +330 -0
  98. package/dist/components/craft-form-builder.cjs.map +1 -0
  99. package/dist/components/craft-form-builder.d.cts +57 -0
  100. package/dist/components/craft-form-builder.d.ts +57 -0
  101. package/dist/components/craft-form-builder.js +301 -0
  102. package/dist/components/craft-form-builder.js.map +1 -0
  103. package/dist/components/craft-form-field.cjs +301 -0
  104. package/dist/components/craft-form-field.cjs.map +1 -0
  105. package/dist/components/craft-form-field.d.cts +30 -0
  106. package/dist/components/craft-form-field.d.ts +30 -0
  107. package/dist/components/craft-form-field.js +280 -0
  108. package/dist/components/craft-form-field.js.map +1 -0
  109. package/dist/components/craft-form.cjs +114 -0
  110. package/dist/components/craft-form.cjs.map +1 -0
  111. package/dist/components/craft-form.d.cts +27 -0
  112. package/dist/components/craft-form.d.ts +27 -0
  113. package/dist/components/craft-form.js +80 -0
  114. package/dist/components/craft-form.js.map +1 -0
  115. package/dist/components/craft-icon.cjs +102 -0
  116. package/dist/components/craft-icon.cjs.map +1 -0
  117. package/dist/components/craft-icon.d.cts +19 -0
  118. package/dist/components/craft-icon.d.ts +19 -0
  119. package/dist/{chunk-FEFH5O5K.js → components/craft-icon.js} +31 -13
  120. package/dist/components/craft-icon.js.map +1 -0
  121. package/dist/components/craft-input.cjs +78 -0
  122. package/dist/components/craft-input.cjs.map +1 -0
  123. package/dist/components/craft-input.d.cts +19 -0
  124. package/dist/components/craft-input.d.ts +19 -0
  125. package/dist/{chunk-7SKDTIEK.js → components/craft-input.js} +5 -10
  126. package/dist/components/craft-input.js.map +1 -0
  127. package/dist/components/craft-link.cjs +70 -0
  128. package/dist/components/craft-link.cjs.map +1 -0
  129. package/dist/components/craft-link.d.cts +14 -0
  130. package/dist/components/craft-link.d.ts +14 -0
  131. package/dist/components/craft-link.js +36 -0
  132. package/dist/components/craft-link.js.map +1 -0
  133. package/dist/components/craft-loading-state.cjs +64 -0
  134. package/dist/components/craft-loading-state.cjs.map +1 -0
  135. package/dist/components/craft-loading-state.d.cts +13 -0
  136. package/dist/components/craft-loading-state.d.ts +13 -0
  137. package/dist/components/craft-loading-state.js +40 -0
  138. package/dist/components/craft-loading-state.js.map +1 -0
  139. package/dist/components/craft-modal.cjs +174 -0
  140. package/dist/components/craft-modal.cjs.map +1 -0
  141. package/dist/components/craft-modal.d.cts +19 -0
  142. package/dist/components/craft-modal.d.ts +19 -0
  143. package/dist/components/craft-modal.js +140 -0
  144. package/dist/components/craft-modal.js.map +1 -0
  145. package/dist/components/craft-number-input.cjs +63 -0
  146. package/dist/components/craft-number-input.cjs.map +1 -0
  147. package/dist/components/craft-number-input.d.cts +12 -0
  148. package/dist/components/craft-number-input.d.ts +12 -0
  149. package/dist/components/craft-number-input.js +29 -0
  150. package/dist/components/craft-number-input.js.map +1 -0
  151. package/dist/components/craft-pagination.cjs +130 -0
  152. package/dist/components/craft-pagination.cjs.map +1 -0
  153. package/dist/components/craft-pagination.d.cts +19 -0
  154. package/dist/components/craft-pagination.d.ts +19 -0
  155. package/dist/components/craft-pagination.js +106 -0
  156. package/dist/components/craft-pagination.js.map +1 -0
  157. package/dist/components/craft-popover.cjs +123 -0
  158. package/dist/components/craft-popover.cjs.map +1 -0
  159. package/dist/components/craft-popover.d.cts +20 -0
  160. package/dist/components/craft-popover.d.ts +20 -0
  161. package/dist/components/craft-popover.js +89 -0
  162. package/dist/components/craft-popover.js.map +1 -0
  163. package/dist/components/craft-select.cjs +84 -0
  164. package/dist/components/craft-select.cjs.map +1 -0
  165. package/dist/components/craft-select.d.cts +12 -0
  166. package/dist/components/craft-select.d.ts +12 -0
  167. package/dist/components/craft-select.js +50 -0
  168. package/dist/components/craft-select.js.map +1 -0
  169. package/dist/components/craft-skeleton.cjs +45 -0
  170. package/dist/components/craft-skeleton.cjs.map +1 -0
  171. package/dist/components/craft-skeleton.d.cts +10 -0
  172. package/dist/components/craft-skeleton.d.ts +10 -0
  173. package/dist/components/craft-skeleton.js +21 -0
  174. package/dist/components/craft-skeleton.js.map +1 -0
  175. package/dist/components/craft-stat-card.cjs +67 -0
  176. package/dist/components/craft-stat-card.cjs.map +1 -0
  177. package/dist/components/craft-stat-card.d.cts +17 -0
  178. package/dist/components/craft-stat-card.d.ts +17 -0
  179. package/dist/components/craft-stat-card.js +43 -0
  180. package/dist/components/craft-stat-card.js.map +1 -0
  181. package/dist/components/craft-submit-button.cjs +71 -0
  182. package/dist/components/craft-submit-button.cjs.map +1 -0
  183. package/dist/components/craft-submit-button.d.cts +13 -0
  184. package/dist/components/craft-submit-button.d.ts +13 -0
  185. package/dist/components/craft-submit-button.js +47 -0
  186. package/dist/components/craft-submit-button.js.map +1 -0
  187. package/dist/components/craft-switch.cjs +82 -0
  188. package/dist/components/craft-switch.cjs.map +1 -0
  189. package/dist/components/craft-switch.d.cts +14 -0
  190. package/dist/components/craft-switch.d.ts +14 -0
  191. package/dist/components/craft-switch.js +48 -0
  192. package/dist/components/craft-switch.js.map +1 -0
  193. package/dist/components/craft-table-toolbar.cjs +79 -0
  194. package/dist/components/craft-table-toolbar.cjs.map +1 -0
  195. package/dist/components/craft-table-toolbar.d.cts +19 -0
  196. package/dist/components/craft-table-toolbar.d.ts +19 -0
  197. package/dist/components/craft-table-toolbar.js +55 -0
  198. package/dist/components/craft-table-toolbar.js.map +1 -0
  199. package/dist/components/craft-tabs.cjs +105 -0
  200. package/dist/components/craft-tabs.cjs.map +1 -0
  201. package/dist/components/craft-tabs.d.cts +19 -0
  202. package/dist/components/craft-tabs.d.ts +19 -0
  203. package/dist/components/craft-tabs.js +71 -0
  204. package/dist/components/craft-tabs.js.map +1 -0
  205. package/dist/components/craft-textarea.cjs +69 -0
  206. package/dist/components/craft-textarea.cjs.map +1 -0
  207. package/dist/components/craft-textarea.d.cts +12 -0
  208. package/dist/components/craft-textarea.d.ts +12 -0
  209. package/dist/components/craft-textarea.js +35 -0
  210. package/dist/components/craft-textarea.js.map +1 -0
  211. package/dist/components/craft-toast.cjs +98 -0
  212. package/dist/components/craft-toast.cjs.map +1 -0
  213. package/dist/components/craft-toast.d.cts +24 -0
  214. package/dist/components/craft-toast.d.ts +24 -0
  215. package/dist/components/craft-toast.js +63 -0
  216. package/dist/components/craft-toast.js.map +1 -0
  217. package/dist/components/craft-tooltip.cjs +75 -0
  218. package/dist/components/craft-tooltip.cjs.map +1 -0
  219. package/dist/components/craft-tooltip.d.cts +13 -0
  220. package/dist/components/craft-tooltip.d.ts +13 -0
  221. package/dist/components/craft-tooltip.js +41 -0
  222. package/dist/components/craft-tooltip.js.map +1 -0
  223. package/dist/components/forms/types.cjs +17 -0
  224. package/dist/components/forms/types.cjs.map +1 -0
  225. package/dist/components/forms/types.d.cts +7 -0
  226. package/dist/components/forms/types.d.ts +7 -0
  227. package/dist/components/forms/types.js +1 -0
  228. package/dist/components/forms/types.js.map +1 -0
  229. package/dist/components/glass-card.cjs +64 -0
  230. package/dist/components/glass-card.cjs.map +1 -0
  231. package/dist/components/glass-card.d.cts +12 -0
  232. package/dist/components/glass-card.d.ts +12 -0
  233. package/dist/components/glass-card.js +40 -0
  234. package/dist/components/glass-card.js.map +1 -0
  235. package/dist/components/layout/app-shell.cjs +49 -0
  236. package/dist/components/layout/app-shell.cjs.map +1 -0
  237. package/dist/components/layout/app-shell.d.cts +10 -0
  238. package/dist/components/layout/app-shell.d.ts +10 -0
  239. package/dist/components/layout/app-shell.js +25 -0
  240. package/dist/components/layout/app-shell.js.map +1 -0
  241. package/dist/components/layout/app-template.cjs +104 -0
  242. package/dist/components/layout/app-template.cjs.map +1 -0
  243. package/dist/components/layout/app-template.d.cts +19 -0
  244. package/dist/components/layout/app-template.d.ts +19 -0
  245. package/dist/components/layout/app-template.js +70 -0
  246. package/dist/components/layout/app-template.js.map +1 -0
  247. package/dist/components/layout/auth-layout.cjs +65 -0
  248. package/dist/components/layout/auth-layout.cjs.map +1 -0
  249. package/dist/components/layout/auth-layout.d.cts +12 -0
  250. package/dist/components/layout/auth-layout.d.ts +12 -0
  251. package/dist/components/layout/auth-layout.js +41 -0
  252. package/dist/components/layout/auth-layout.js.map +1 -0
  253. package/dist/components/layout/breadcrumbs.cjs +39 -0
  254. package/dist/components/layout/breadcrumbs.cjs.map +1 -0
  255. package/dist/components/layout/breadcrumbs.d.cts +13 -0
  256. package/dist/components/layout/breadcrumbs.d.ts +13 -0
  257. package/dist/components/layout/breadcrumbs.js +15 -0
  258. package/dist/components/layout/breadcrumbs.js.map +1 -0
  259. package/dist/components/layout/container.cjs +45 -0
  260. package/dist/components/layout/container.cjs.map +1 -0
  261. package/dist/components/layout/container.d.cts +9 -0
  262. package/dist/components/layout/container.d.ts +9 -0
  263. package/dist/components/layout/container.js +21 -0
  264. package/dist/components/layout/container.js.map +1 -0
  265. package/dist/components/layout/grid.cjs +47 -0
  266. package/dist/components/layout/grid.cjs.map +1 -0
  267. package/dist/components/layout/grid.d.cts +10 -0
  268. package/dist/components/layout/grid.d.ts +10 -0
  269. package/dist/components/layout/grid.js +23 -0
  270. package/dist/components/layout/grid.js.map +1 -0
  271. package/dist/components/layout/layout-config.cjs +78 -0
  272. package/dist/components/layout/layout-config.cjs.map +1 -0
  273. package/dist/components/layout/layout-config.d.cts +92 -0
  274. package/dist/components/layout/layout-config.d.ts +92 -0
  275. package/dist/components/layout/layout-config.js +54 -0
  276. package/dist/components/layout/layout-config.js.map +1 -0
  277. package/dist/components/layout/page-header.cjs +52 -0
  278. package/dist/components/layout/page-header.cjs.map +1 -0
  279. package/dist/components/layout/page-header.d.cts +11 -0
  280. package/dist/components/layout/page-header.d.ts +11 -0
  281. package/dist/components/layout/page-header.js +28 -0
  282. package/dist/components/layout/page-header.js.map +1 -0
  283. package/dist/components/layout/sidebar.cjs +64 -0
  284. package/dist/components/layout/sidebar.cjs.map +1 -0
  285. package/dist/components/layout/sidebar.d.cts +17 -0
  286. package/dist/components/layout/sidebar.d.ts +17 -0
  287. package/dist/components/layout/sidebar.js +40 -0
  288. package/dist/components/layout/sidebar.js.map +1 -0
  289. package/dist/components/layout/top-nav.cjs +49 -0
  290. package/dist/components/layout/top-nav.cjs.map +1 -0
  291. package/dist/components/layout/top-nav.d.cts +11 -0
  292. package/dist/components/layout/top-nav.d.ts +11 -0
  293. package/dist/components/layout/top-nav.js +25 -0
  294. package/dist/components/layout/top-nav.js.map +1 -0
  295. package/dist/components/layout/types.cjs +29 -0
  296. package/dist/components/layout/types.cjs.map +1 -0
  297. package/dist/components/layout/types.d.cts +12 -0
  298. package/dist/components/layout/types.d.ts +12 -0
  299. package/dist/components/layout/types.js +5 -0
  300. package/dist/components/layout/types.js.map +1 -0
  301. package/dist/components/table/types.cjs +17 -0
  302. package/dist/components/table/types.cjs.map +1 -0
  303. package/dist/components/table/types.d.cts +7 -0
  304. package/dist/components/table/types.d.ts +7 -0
  305. package/dist/components/table/types.js +1 -0
  306. package/dist/components/table/types.js.map +1 -0
  307. package/dist/components/theme-switcher.cjs +72 -0
  308. package/dist/components/theme-switcher.cjs.map +1 -0
  309. package/dist/components/theme-switcher.d.cts +9 -0
  310. package/dist/components/theme-switcher.d.ts +9 -0
  311. package/dist/components/theme-switcher.js +48 -0
  312. package/dist/components/theme-switcher.js.map +1 -0
  313. package/dist/craft/components.cjs +64 -1779
  314. package/dist/craft/components.cjs.map +1 -1
  315. package/dist/craft/components.d.cts +36 -369
  316. package/dist/craft/components.d.ts +36 -369
  317. package/dist/craft/components.js +31 -42
  318. package/dist/craft/components.js.map +1 -1
  319. package/dist/craft/forms.cjs +6 -1347
  320. package/dist/craft/forms.cjs.map +1 -1
  321. package/dist/craft/forms.d.cts +7 -101
  322. package/dist/craft/forms.d.ts +7 -101
  323. package/dist/craft/forms.js +3 -8
  324. package/dist/craft/forms.js.map +1 -1
  325. package/dist/craft/layout.cjs +20 -374
  326. package/dist/craft/layout.cjs.map +1 -1
  327. package/dist/craft/layout.d.cts +12 -170
  328. package/dist/craft/layout.d.ts +12 -170
  329. package/dist/craft/layout.js +10 -14
  330. package/dist/craft/layout.js.map +1 -1
  331. package/dist/craft/table.cjs +8 -632
  332. package/dist/craft/table.cjs.map +1 -1
  333. package/dist/craft/table.d.cts +7 -99
  334. package/dist/craft/table.d.ts +7 -99
  335. package/dist/craft/table.js +4 -8
  336. package/dist/craft/table.js.map +1 -1
  337. package/dist/craft/theme.cjs +5 -137
  338. package/dist/craft/theme.cjs.map +1 -1
  339. package/dist/craft/theme.d.cts +3 -9
  340. package/dist/craft/theme.d.ts +3 -9
  341. package/dist/craft/theme.js +2 -6
  342. package/dist/craft/theme.js.map +1 -1
  343. package/dist/index.cjs +103 -3426
  344. package/dist/index.cjs.map +1 -1
  345. package/dist/index.d.cts +50 -6
  346. package/dist/index.d.ts +50 -6
  347. package/dist/index.js +50 -70
  348. package/dist/index.js.map +1 -1
  349. package/dist/utils/cn.cjs +31 -0
  350. package/dist/utils/cn.cjs.map +1 -0
  351. package/dist/utils/cn.d.cts +3 -0
  352. package/dist/utils/cn.d.ts +3 -0
  353. package/dist/{chunk-VQ6T3HIX.js → utils/cn.js} +1 -3
  354. package/dist/utils/cn.js.map +1 -0
  355. package/package.json +6 -1
  356. package/dist/chunk-6F7FN2ZF.js +0 -671
  357. package/dist/chunk-6F7FN2ZF.js.map +0 -1
  358. package/dist/chunk-7Q4Z47HT.js +0 -657
  359. package/dist/chunk-7Q4Z47HT.js.map +0 -1
  360. package/dist/chunk-7SKDTIEK.js.map +0 -1
  361. package/dist/chunk-FEFH5O5K.js.map +0 -1
  362. package/dist/chunk-M2EKVXB6.js +0 -127
  363. package/dist/chunk-M2EKVXB6.js.map +0 -1
  364. package/dist/chunk-SBLIF6UU.js +0 -1029
  365. package/dist/chunk-SBLIF6UU.js.map +0 -1
  366. package/dist/chunk-VQ6T3HIX.js.map +0 -1
  367. package/dist/chunk-YVZL4GET.js +0 -328
  368. package/dist/chunk-YVZL4GET.js.map +0 -1
  369. package/dist/chunk-ZRV4Y374.js.map +0 -1
@@ -0,0 +1,140 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { createPortal } from "react-dom";
5
+ import { cn } from "@/utils/cn";
6
+ const FOCUSABLE_SELECTORS = [
7
+ "a[href]",
8
+ "button:not([disabled])",
9
+ "textarea:not([disabled])",
10
+ "input:not([disabled])",
11
+ "select:not([disabled])",
12
+ "[tabindex]:not([tabindex='-1'])"
13
+ ].join(",");
14
+ function useFocusTrap(active) {
15
+ const ref = React.useRef(null);
16
+ React.useEffect(() => {
17
+ if (!active || !ref.current) return;
18
+ const root = ref.current;
19
+ const getFocusable = () => Array.from(root.querySelectorAll(FOCUSABLE_SELECTORS));
20
+ const focusables = getFocusable();
21
+ if (focusables.length) {
22
+ focusables[0].focus();
23
+ } else {
24
+ root.focus();
25
+ }
26
+ const handleKeyDown = (event) => {
27
+ if (event.key !== "Tab") return;
28
+ const items = getFocusable();
29
+ if (!items.length) return;
30
+ const first = items[0];
31
+ const last = items[items.length - 1];
32
+ const activeEl = document.activeElement;
33
+ if (event.shiftKey && activeEl === first) {
34
+ event.preventDefault();
35
+ last.focus();
36
+ } else if (!event.shiftKey && activeEl === last) {
37
+ event.preventDefault();
38
+ first.focus();
39
+ }
40
+ };
41
+ root.addEventListener("keydown", handleKeyDown);
42
+ return () => root.removeEventListener("keydown", handleKeyDown);
43
+ }, [active]);
44
+ return ref;
45
+ }
46
+ function CraftModal({
47
+ open,
48
+ defaultOpen = false,
49
+ onOpenChange,
50
+ tone,
51
+ title,
52
+ description,
53
+ children,
54
+ trigger,
55
+ footer,
56
+ className
57
+ }) {
58
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);
59
+ const isControlled = typeof open === "boolean";
60
+ const isOpen = isControlled ? open : uncontrolledOpen;
61
+ const setOpen = React.useCallback(
62
+ (next) => {
63
+ if (!isControlled) {
64
+ setUncontrolledOpen(next);
65
+ }
66
+ onOpenChange == null ? void 0 : onOpenChange(next);
67
+ },
68
+ [isControlled, onOpenChange]
69
+ );
70
+ React.useEffect(() => {
71
+ if (!isOpen) return;
72
+ const handleKey = (event) => {
73
+ if (event.key === "Escape") setOpen(false);
74
+ };
75
+ document.addEventListener("keydown", handleKey);
76
+ return () => document.removeEventListener("keydown", handleKey);
77
+ }, [isOpen, setOpen]);
78
+ const ref = useFocusTrap(isOpen);
79
+ const content = isOpen ? /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center px-4 py-8", children: [
80
+ /* @__PURE__ */ jsx(
81
+ "div",
82
+ {
83
+ className: "absolute inset-0 backdrop-blur-sm",
84
+ onClick: () => setOpen(false)
85
+ }
86
+ ),
87
+ /* @__PURE__ */ jsxs(
88
+ "div",
89
+ {
90
+ ref,
91
+ tabIndex: -1,
92
+ className: cn(
93
+ "relative z-10 w-full max-w-7xl rounded-3xl border border-[rgb(var(--nc-border)/0.45)] p-6 text-[rgb(var(--nc-fg))] shadow-[0_20px_60px_rgba(0,0,0,0.45)] backdrop-blur-2xl",
94
+ "max-h-[calc(100vh-1rem)] overflow-y-auto",
95
+ className
96
+ ),
97
+ "data-nc-theme": tone,
98
+ children: [
99
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
100
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
101
+ title && /* @__PURE__ */ jsx("h3", { className: "text-2xl font-semibold", children: title }),
102
+ description && /* @__PURE__ */ jsx("p", { className: "text-[rgb(var(--nc-fg-muted))]", children: description })
103
+ ] }),
104
+ /* @__PURE__ */ jsx(
105
+ "button",
106
+ {
107
+ className: "rounded-full border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-2 text-[rgb(var(--nc-fg-soft))] transition hover:text-[rgb(var(--nc-fg))]",
108
+ onClick: () => setOpen(false),
109
+ "aria-label": "Close",
110
+ children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 20 20", className: "h-4 w-4", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" }) })
111
+ }
112
+ )
113
+ ] }),
114
+ /* @__PURE__ */ jsx("div", { className: "mt-5 space-y-4", children }),
115
+ footer && /* @__PURE__ */ jsx("div", { className: "mt-6", children: footer })
116
+ ]
117
+ }
118
+ )
119
+ ] }) : null;
120
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
121
+ trigger && /* @__PURE__ */ jsx(
122
+ "span",
123
+ {
124
+ onClick: () => setOpen(true),
125
+ onKeyDown: (event) => {
126
+ if (event.key === "Enter" || event.key === " ") setOpen(true);
127
+ },
128
+ role: "button",
129
+ tabIndex: 0,
130
+ className: "inline-flex",
131
+ children: trigger
132
+ }
133
+ ),
134
+ typeof document !== "undefined" && content ? createPortal(content, document.body) : content
135
+ ] });
136
+ }
137
+ export {
138
+ CraftModal
139
+ };
140
+ //# sourceMappingURL=craft-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/craft-modal.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nconst FOCUSABLE_SELECTORS = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nfunction useFocusTrap(active: boolean) {\n const ref = React.useRef<HTMLDivElement | null>(null);\n\n React.useEffect(() => {\n if (!active || !ref.current) return;\n const root = ref.current;\n const getFocusable = () =>\n Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTORS));\n\n const focusables = getFocusable();\n if (focusables.length) {\n focusables[0].focus();\n } else {\n root.focus();\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\") return;\n const items = getFocusable();\n if (!items.length) return;\n const first = items[0];\n const last = items[items.length - 1];\n const activeEl = document.activeElement as HTMLElement | null;\n\n if (event.shiftKey && activeEl === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && activeEl === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n root.addEventListener(\"keydown\", handleKeyDown);\n return () => root.removeEventListener(\"keydown\", handleKeyDown);\n }, [active]);\n\n return ref;\n}\n\nexport type CraftModalProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n tone?: ThemeName;\n title?: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n footer?: React.ReactNode;\n className?: string;\n};\n\nexport function CraftModal({\n open,\n defaultOpen = false,\n onOpenChange,\n tone,\n title,\n description,\n children,\n trigger,\n footer,\n className,\n}: CraftModalProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const isControlled = typeof open === \"boolean\";\n const isOpen = isControlled ? open : uncontrolledOpen;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n React.useEffect(() => {\n if (!isOpen) return;\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [isOpen, setOpen]);\n\n const ref = useFocusTrap(isOpen);\n\n const content = isOpen ? (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center px-4 py-8\">\n <div\n className=\"absolute inset-0 backdrop-blur-sm\"\n onClick={() => setOpen(false)}\n />\n <div\n ref={ref}\n tabIndex={-1}\n className={cn(\n \"relative z-10 w-full max-w-7xl rounded-3xl border border-[rgb(var(--nc-border)/0.45)] p-6 text-[rgb(var(--nc-fg))] shadow-[0_20px_60px_rgba(0,0,0,0.45)] backdrop-blur-2xl\",\n \"max-h-[calc(100vh-1rem)] overflow-y-auto\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"space-y-1\">\n {title && <h3 className=\"text-2xl font-semibold\">{title}</h3>}\n {description && <p className=\"text-[rgb(var(--nc-fg-muted))]\">{description}</p>}\n </div>\n <button\n className=\"rounded-full border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] p-2 text-[rgb(var(--nc-fg-soft))] transition hover:text-[rgb(var(--nc-fg))]\"\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n >\n <svg viewBox=\"0 0 20 20\" className=\"h-4 w-4\" fill=\"currentColor\">\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n </svg>\n </button>\n </div>\n <div className=\"mt-5 space-y-4\">{children}</div>\n {footer && <div className=\"mt-6\">{footer}</div>}\n </div>\n </div>\n ) : null;\n\n return (\n <>\n {trigger && (\n <span\n onClick={() => setOpen(true)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") setOpen(true);\n }}\n role=\"button\"\n tabIndex={0}\n className=\"inline-flex\"\n >\n {trigger}\n </span>\n )}\n {typeof document !== \"undefined\" && content\n ? createPortal(content, document.body)\n : content}\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var craft_number_input_exports = {};
30
+ __export(craft_number_input_exports, {
31
+ CraftNumberInput: () => CraftNumberInput
32
+ });
33
+ module.exports = __toCommonJS(craft_number_input_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
35
+ var React = __toESM(require("react"), 1);
36
+ var import_cn = require("@/utils/cn");
37
+ const CraftNumberInput = React.forwardRef(({ className, tone, ...props }, ref) => {
38
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative w-full", "data-nc-theme": tone, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
39
+ "input",
40
+ {
41
+ ref,
42
+ type: "number",
43
+ className: (0, import_cn.cn)(
44
+ "w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl",
45
+ "shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]",
46
+ "focus:outline-none focus:ring-4",
47
+ "transition-all duration-300",
48
+ "disabled:opacity-50 disabled:cursor-not-allowed",
49
+ "border-[rgb(var(--nc-border)/0.35)]",
50
+ "focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]",
51
+ "px-5 py-3 text-base",
52
+ className
53
+ ),
54
+ ...props
55
+ }
56
+ ) });
57
+ });
58
+ CraftNumberInput.displayName = "CraftNumberInput";
59
+ // Annotate the CommonJS export names for ESM import in node:
60
+ 0 && (module.exports = {
61
+ CraftNumberInput
62
+ });
63
+ //# sourceMappingURL=craft-number-input.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/craft-number-input.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftNumberInputProps = React.InputHTMLAttributes<HTMLInputElement> & {\n tone?: ThemeName;\n};\n\nexport const CraftNumberInput = React.forwardRef<\n HTMLInputElement,\n CraftNumberInputProps\n>(({ className, tone, ...props }, ref) => {\n return (\n <div className=\"relative w-full\" data-nc-theme={tone}>\n <input\n ref={ref}\n type=\"number\"\n className={cn(\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl\",\n \"shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]\",\n \"focus:outline-none focus:ring-4\",\n \"transition-all duration-300\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"border-[rgb(var(--nc-border)/0.35)]\",\n \"focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]\",\n \"px-5 py-3 text-base\",\n className\n )}\n {...props}\n />\n </div>\n );\n});\n\nCraftNumberInput.displayName = \"CraftNumberInput\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAeM;AAfN,YAAuB;AAEvB,gBAAmB;AAOZ,MAAM,mBAAmB,MAAM,WAGpC,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AACxC,SACE,4CAAC,SAAI,WAAU,mBAAkB,iBAAe,MAC9C;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,eAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF;AAEJ,CAAC;AAED,iBAAiB,cAAc;","names":[]}
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import { a as ThemeName } from '../theme-context-EVI9PfKv.cjs';
3
+ import 'react/jsx-runtime';
4
+
5
+ type CraftNumberInputProps = React.InputHTMLAttributes<HTMLInputElement> & {
6
+ tone?: ThemeName;
7
+ };
8
+ declare const CraftNumberInput: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & {
9
+ tone?: ThemeName;
10
+ } & React.RefAttributes<HTMLInputElement>>;
11
+
12
+ export { CraftNumberInput, type CraftNumberInputProps };
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import { a as ThemeName } from '../theme-context-EVI9PfKv.js';
3
+ import 'react/jsx-runtime';
4
+
5
+ type CraftNumberInputProps = React.InputHTMLAttributes<HTMLInputElement> & {
6
+ tone?: ThemeName;
7
+ };
8
+ declare const CraftNumberInput: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & {
9
+ tone?: ThemeName;
10
+ } & React.RefAttributes<HTMLInputElement>>;
11
+
12
+ export { CraftNumberInput, type CraftNumberInputProps };
@@ -0,0 +1,29 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "@/utils/cn";
4
+ const CraftNumberInput = React.forwardRef(({ className, tone, ...props }, ref) => {
5
+ return /* @__PURE__ */ jsx("div", { className: "relative w-full", "data-nc-theme": tone, children: /* @__PURE__ */ jsx(
6
+ "input",
7
+ {
8
+ ref,
9
+ type: "number",
10
+ className: cn(
11
+ "w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl",
12
+ "shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]",
13
+ "focus:outline-none focus:ring-4",
14
+ "transition-all duration-300",
15
+ "disabled:opacity-50 disabled:cursor-not-allowed",
16
+ "border-[rgb(var(--nc-border)/0.35)]",
17
+ "focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]",
18
+ "px-5 py-3 text-base",
19
+ className
20
+ ),
21
+ ...props
22
+ }
23
+ ) });
24
+ });
25
+ CraftNumberInput.displayName = "CraftNumberInput";
26
+ export {
27
+ CraftNumberInput
28
+ };
29
+ //# sourceMappingURL=craft-number-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/craft-number-input.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftNumberInputProps = React.InputHTMLAttributes<HTMLInputElement> & {\n tone?: ThemeName;\n};\n\nexport const CraftNumberInput = React.forwardRef<\n HTMLInputElement,\n CraftNumberInputProps\n>(({ className, tone, ...props }, ref) => {\n return (\n <div className=\"relative w-full\" data-nc-theme={tone}>\n <input\n ref={ref}\n type=\"number\"\n className={cn(\n \"w-full rounded-2xl border-2 bg-[rgb(var(--nc-surface)/0.08)] text-[rgb(var(--nc-fg))] backdrop-blur-xl\",\n \"shadow-[inset_0_2px_8px_rgba(0,0,0,0.3)]\",\n \"focus:outline-none focus:ring-4\",\n \"transition-all duration-300\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"border-[rgb(var(--nc-border)/0.35)]\",\n \"focus:border-[rgb(var(--nc-accent-1)/0.8)] focus:ring-[rgb(var(--nc-accent-1)/0.3)]\",\n \"px-5 py-3 text-base\",\n className\n )}\n {...props}\n />\n </div>\n );\n});\n\nCraftNumberInput.displayName = \"CraftNumberInput\";\n"],"mappings":"AAeM;AAfN,YAAY,WAAW;AAEvB,SAAS,UAAU;AAOZ,MAAM,mBAAmB,MAAM,WAGpC,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AACxC,SACE,oBAAC,SAAI,WAAU,mBAAkB,iBAAe,MAC9C;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN,GACF;AAEJ,CAAC;AAED,iBAAiB,cAAc;","names":[]}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var craft_pagination_exports = {};
21
+ __export(craft_pagination_exports, {
22
+ CraftPagination: () => CraftPagination
23
+ });
24
+ module.exports = __toCommonJS(craft_pagination_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_cn = require("@/utils/cn");
27
+ function getPageNumbers(pageIndex, pageCount, maxButtons = 5) {
28
+ if (pageCount <= maxButtons) {
29
+ return Array.from({ length: pageCount }, (_, i) => i);
30
+ }
31
+ const pages = [];
32
+ const start = Math.max(0, pageIndex - 1);
33
+ const end = Math.min(pageCount - 1, pageIndex + 1);
34
+ pages.push(0);
35
+ if (start > 1) pages.push("ellipsis");
36
+ for (let i = start; i <= end; i += 1) {
37
+ if (i !== 0 && i !== pageCount - 1) pages.push(i);
38
+ }
39
+ if (end < pageCount - 2) pages.push("ellipsis");
40
+ pages.push(pageCount - 1);
41
+ return pages;
42
+ }
43
+ function CraftPagination({
44
+ pageIndex,
45
+ pageCount,
46
+ onPageChange,
47
+ canPrevious = pageIndex > 0,
48
+ canNext = pageIndex < pageCount - 1,
49
+ pageSize,
50
+ pageSizeOptions = [10, 20, 50],
51
+ onPageSizeChange,
52
+ tone,
53
+ className
54
+ }) {
55
+ const pages = getPageNumbers(pageIndex, pageCount);
56
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
57
+ "div",
58
+ {
59
+ className: (0, import_cn.cn)(
60
+ "flex flex-wrap items-center justify-between gap-4",
61
+ className
62
+ ),
63
+ "data-nc-theme": tone,
64
+ children: [
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
67
+ "button",
68
+ {
69
+ type: "button",
70
+ className: (0, import_cn.cn)(
71
+ "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition",
72
+ "hover:bg-[rgb(var(--nc-surface)/0.2)]",
73
+ !canPrevious && "opacity-50 cursor-not-allowed"
74
+ ),
75
+ onClick: () => onPageChange(Math.max(pageIndex - 1, 0)),
76
+ disabled: !canPrevious,
77
+ children: "Prev"
78
+ }
79
+ ),
80
+ pages.map(
81
+ (page, index) => page === "ellipsis" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "px-2 text-[rgb(var(--nc-fg-muted))]", children: "..." }, `ellipsis-${index}`) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
82
+ "button",
83
+ {
84
+ type: "button",
85
+ className: (0, import_cn.cn)(
86
+ "rounded-xl border px-3 py-2 text-xs transition",
87
+ page === pageIndex ? "border-[rgb(var(--nc-accent-1)/0.6)] bg-[rgb(var(--nc-accent-1)/0.2)] text-[rgb(var(--nc-fg))]" : "border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))] hover:text-[rgb(var(--nc-fg))] hover:bg-[rgb(var(--nc-surface)/0.2)]"
88
+ ),
89
+ onClick: () => onPageChange(page),
90
+ children: page + 1
91
+ },
92
+ page
93
+ )
94
+ ),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
96
+ "button",
97
+ {
98
+ type: "button",
99
+ className: (0, import_cn.cn)(
100
+ "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition",
101
+ "hover:bg-[rgb(var(--nc-surface)/0.2)]",
102
+ !canNext && "opacity-50 cursor-not-allowed"
103
+ ),
104
+ onClick: () => onPageChange(Math.min(pageIndex + 1, pageCount - 1)),
105
+ disabled: !canNext,
106
+ children: "Next"
107
+ }
108
+ )
109
+ ] }),
110
+ onPageSizeChange && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 text-xs text-[rgb(var(--nc-fg-muted))]", children: [
111
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Rows" }),
112
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
113
+ "select",
114
+ {
115
+ className: "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]",
116
+ value: pageSize,
117
+ onChange: (event) => onPageSizeChange(Number(event.target.value)),
118
+ children: pageSizeOptions.map((size) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: size, children: size }, size))
119
+ }
120
+ )
121
+ ] })
122
+ ]
123
+ }
124
+ );
125
+ }
126
+ // Annotate the CommonJS export names for ESM import in node:
127
+ 0 && (module.exports = {
128
+ CraftPagination
129
+ });
130
+ //# sourceMappingURL=craft-pagination.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/craft-pagination.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftPaginationProps = {\n pageIndex: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n canPrevious?: boolean;\n canNext?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n onPageSizeChange?: (size: number) => void;\n tone?: ThemeName;\n className?: string;\n};\n\nfunction getPageNumbers(pageIndex: number, pageCount: number, maxButtons = 5) {\n if (pageCount <= maxButtons) {\n return Array.from({ length: pageCount }, (_, i) => i);\n }\n\n const pages: Array<number | \"ellipsis\"> = [];\n const start = Math.max(0, pageIndex - 1);\n const end = Math.min(pageCount - 1, pageIndex + 1);\n\n pages.push(0);\n\n if (start > 1) pages.push(\"ellipsis\");\n\n for (let i = start; i <= end; i += 1) {\n if (i !== 0 && i !== pageCount - 1) pages.push(i);\n }\n\n if (end < pageCount - 2) pages.push(\"ellipsis\");\n\n pages.push(pageCount - 1);\n\n return pages;\n}\n\nexport function CraftPagination({\n pageIndex,\n pageCount,\n onPageChange,\n canPrevious = pageIndex > 0,\n canNext = pageIndex < pageCount - 1,\n pageSize,\n pageSizeOptions = [10, 20, 50],\n onPageSizeChange,\n tone,\n className,\n}: CraftPaginationProps) {\n const pages = getPageNumbers(pageIndex, pageCount);\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center justify-between gap-4\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n className={cn(\n \"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition\",\n \"hover:bg-[rgb(var(--nc-surface)/0.2)]\",\n !canPrevious && \"opacity-50 cursor-not-allowed\"\n )}\n onClick={() => onPageChange(Math.max(pageIndex - 1, 0))}\n disabled={!canPrevious}\n >\n Prev\n </button>\n {pages.map((page, index) =>\n page === \"ellipsis\" ? (\n <span key={`ellipsis-${index}`} className=\"px-2 text-[rgb(var(--nc-fg-muted))]\">\n ...\n </span>\n ) : (\n <button\n key={page}\n type=\"button\"\n className={cn(\n \"rounded-xl border px-3 py-2 text-xs transition\",\n page === pageIndex\n ? \"border-[rgb(var(--nc-accent-1)/0.6)] bg-[rgb(var(--nc-accent-1)/0.2)] text-[rgb(var(--nc-fg))]\"\n : \"border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))] hover:text-[rgb(var(--nc-fg))] hover:bg-[rgb(var(--nc-surface)/0.2)]\"\n )}\n onClick={() => onPageChange(page)}\n >\n {page + 1}\n </button>\n )\n )}\n <button\n type=\"button\"\n className={cn(\n \"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition\",\n \"hover:bg-[rgb(var(--nc-surface)/0.2)]\",\n !canNext && \"opacity-50 cursor-not-allowed\"\n )}\n onClick={() => onPageChange(Math.min(pageIndex + 1, pageCount - 1))}\n disabled={!canNext}\n >\n Next\n </button>\n </div>\n\n {onPageSizeChange && (\n <div className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg-muted))]\">\n <span>Rows</span>\n <select\n className=\"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkEM;AA9DN,gBAAmB;AAgBnB,SAAS,eAAe,WAAmB,WAAmB,aAAa,GAAG;AAC5E,MAAI,aAAa,YAAY;AAC3B,WAAO,MAAM,KAAK,EAAE,QAAQ,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC;AAAA,EACtD;AAEA,QAAM,QAAoC,CAAC;AAC3C,QAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,CAAC;AACvC,QAAM,MAAM,KAAK,IAAI,YAAY,GAAG,YAAY,CAAC;AAEjD,QAAM,KAAK,CAAC;AAEZ,MAAI,QAAQ,EAAG,OAAM,KAAK,UAAU;AAEpC,WAAS,IAAI,OAAO,KAAK,KAAK,KAAK,GAAG;AACpC,QAAI,MAAM,KAAK,MAAM,YAAY,EAAG,OAAM,KAAK,CAAC;AAAA,EAClD;AAEA,MAAI,MAAM,YAAY,EAAG,OAAM,KAAK,UAAU;AAE9C,QAAM,KAAK,YAAY,CAAC;AAExB,SAAO;AACT;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B,UAAU,YAAY,YAAY;AAAA,EAClC;AAAA,EACA,kBAAkB,CAAC,IAAI,IAAI,EAAE;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,QAAQ,eAAe,WAAW,SAAS;AAEjD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,qDAAC,SAAI,WAAU,2BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,eAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,CAAC,eAAe;AAAA,cAClB;AAAA,cACA,SAAS,MAAM,aAAa,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC;AAAA,cACtD,UAAU,CAAC;AAAA,cACZ;AAAA;AAAA,UAED;AAAA,UACC,MAAM;AAAA,YAAI,CAAC,MAAM,UAChB,SAAS,aACP,4CAAC,UAA+B,WAAU,uCAAsC,mBAArE,YAAY,KAAK,EAE5B,IAEA;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,eAAW;AAAA,kBACT;AAAA,kBACA,SAAS,YACL,mGACA;AAAA,gBACN;AAAA,gBACA,SAAS,MAAM,aAAa,IAAI;AAAA,gBAE/B,iBAAO;AAAA;AAAA,cAVH;AAAA,YAWP;AAAA,UAEJ;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,eAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,CAAC,WAAW;AAAA,cACd;AAAA,cACA,SAAS,MAAM,aAAa,KAAK,IAAI,YAAY,GAAG,YAAY,CAAC,CAAC;AAAA,cAClE,UAAU,CAAC;AAAA,cACZ;AAAA;AAAA,UAED;AAAA,WACF;AAAA,QAEC,oBACC,6CAAC,SAAI,WAAU,kEACb;AAAA,sDAAC,UAAK,kBAAI;AAAA,UACV;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,cACP,UAAU,CAAC,UAAU,iBAAiB,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,cAE/D,0BAAgB,IAAI,CAAC,SACpB,4CAAC,YAAkB,OAAO,MACvB,kBADU,IAEb,CACD;AAAA;AAAA,UACH;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { a as ThemeName } from '../theme-context-EVI9PfKv.cjs';
3
+ import 'react';
4
+
5
+ type CraftPaginationProps = {
6
+ pageIndex: number;
7
+ pageCount: number;
8
+ onPageChange: (page: number) => void;
9
+ canPrevious?: boolean;
10
+ canNext?: boolean;
11
+ pageSize?: number;
12
+ pageSizeOptions?: number[];
13
+ onPageSizeChange?: (size: number) => void;
14
+ tone?: ThemeName;
15
+ className?: string;
16
+ };
17
+ declare function CraftPagination({ pageIndex, pageCount, onPageChange, canPrevious, canNext, pageSize, pageSizeOptions, onPageSizeChange, tone, className, }: CraftPaginationProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { CraftPagination, type CraftPaginationProps };
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { a as ThemeName } from '../theme-context-EVI9PfKv.js';
3
+ import 'react';
4
+
5
+ type CraftPaginationProps = {
6
+ pageIndex: number;
7
+ pageCount: number;
8
+ onPageChange: (page: number) => void;
9
+ canPrevious?: boolean;
10
+ canNext?: boolean;
11
+ pageSize?: number;
12
+ pageSizeOptions?: number[];
13
+ onPageSizeChange?: (size: number) => void;
14
+ tone?: ThemeName;
15
+ className?: string;
16
+ };
17
+ declare function CraftPagination({ pageIndex, pageCount, onPageChange, canPrevious, canNext, pageSize, pageSizeOptions, onPageSizeChange, tone, className, }: CraftPaginationProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { CraftPagination, type CraftPaginationProps };
@@ -0,0 +1,106 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { cn } from "@/utils/cn";
4
+ function getPageNumbers(pageIndex, pageCount, maxButtons = 5) {
5
+ if (pageCount <= maxButtons) {
6
+ return Array.from({ length: pageCount }, (_, i) => i);
7
+ }
8
+ const pages = [];
9
+ const start = Math.max(0, pageIndex - 1);
10
+ const end = Math.min(pageCount - 1, pageIndex + 1);
11
+ pages.push(0);
12
+ if (start > 1) pages.push("ellipsis");
13
+ for (let i = start; i <= end; i += 1) {
14
+ if (i !== 0 && i !== pageCount - 1) pages.push(i);
15
+ }
16
+ if (end < pageCount - 2) pages.push("ellipsis");
17
+ pages.push(pageCount - 1);
18
+ return pages;
19
+ }
20
+ function CraftPagination({
21
+ pageIndex,
22
+ pageCount,
23
+ onPageChange,
24
+ canPrevious = pageIndex > 0,
25
+ canNext = pageIndex < pageCount - 1,
26
+ pageSize,
27
+ pageSizeOptions = [10, 20, 50],
28
+ onPageSizeChange,
29
+ tone,
30
+ className
31
+ }) {
32
+ const pages = getPageNumbers(pageIndex, pageCount);
33
+ return /* @__PURE__ */ jsxs(
34
+ "div",
35
+ {
36
+ className: cn(
37
+ "flex flex-wrap items-center justify-between gap-4",
38
+ className
39
+ ),
40
+ "data-nc-theme": tone,
41
+ children: [
42
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43
+ /* @__PURE__ */ jsx(
44
+ "button",
45
+ {
46
+ type: "button",
47
+ className: cn(
48
+ "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition",
49
+ "hover:bg-[rgb(var(--nc-surface)/0.2)]",
50
+ !canPrevious && "opacity-50 cursor-not-allowed"
51
+ ),
52
+ onClick: () => onPageChange(Math.max(pageIndex - 1, 0)),
53
+ disabled: !canPrevious,
54
+ children: "Prev"
55
+ }
56
+ ),
57
+ pages.map(
58
+ (page, index) => page === "ellipsis" ? /* @__PURE__ */ jsx("span", { className: "px-2 text-[rgb(var(--nc-fg-muted))]", children: "..." }, `ellipsis-${index}`) : /* @__PURE__ */ jsx(
59
+ "button",
60
+ {
61
+ type: "button",
62
+ className: cn(
63
+ "rounded-xl border px-3 py-2 text-xs transition",
64
+ page === pageIndex ? "border-[rgb(var(--nc-accent-1)/0.6)] bg-[rgb(var(--nc-accent-1)/0.2)] text-[rgb(var(--nc-fg))]" : "border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))] hover:text-[rgb(var(--nc-fg))] hover:bg-[rgb(var(--nc-surface)/0.2)]"
65
+ ),
66
+ onClick: () => onPageChange(page),
67
+ children: page + 1
68
+ },
69
+ page
70
+ )
71
+ ),
72
+ /* @__PURE__ */ jsx(
73
+ "button",
74
+ {
75
+ type: "button",
76
+ className: cn(
77
+ "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition",
78
+ "hover:bg-[rgb(var(--nc-surface)/0.2)]",
79
+ !canNext && "opacity-50 cursor-not-allowed"
80
+ ),
81
+ onClick: () => onPageChange(Math.min(pageIndex + 1, pageCount - 1)),
82
+ disabled: !canNext,
83
+ children: "Next"
84
+ }
85
+ )
86
+ ] }),
87
+ onPageSizeChange && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-[rgb(var(--nc-fg-muted))]", children: [
88
+ /* @__PURE__ */ jsx("span", { children: "Rows" }),
89
+ /* @__PURE__ */ jsx(
90
+ "select",
91
+ {
92
+ className: "rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]",
93
+ value: pageSize,
94
+ onChange: (event) => onPageSizeChange(Number(event.target.value)),
95
+ children: pageSizeOptions.map((size) => /* @__PURE__ */ jsx("option", { value: size, children: size }, size))
96
+ }
97
+ )
98
+ ] })
99
+ ]
100
+ }
101
+ );
102
+ }
103
+ export {
104
+ CraftPagination
105
+ };
106
+ //# sourceMappingURL=craft-pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/craft-pagination.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\n\nexport type CraftPaginationProps = {\n pageIndex: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n canPrevious?: boolean;\n canNext?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n onPageSizeChange?: (size: number) => void;\n tone?: ThemeName;\n className?: string;\n};\n\nfunction getPageNumbers(pageIndex: number, pageCount: number, maxButtons = 5) {\n if (pageCount <= maxButtons) {\n return Array.from({ length: pageCount }, (_, i) => i);\n }\n\n const pages: Array<number | \"ellipsis\"> = [];\n const start = Math.max(0, pageIndex - 1);\n const end = Math.min(pageCount - 1, pageIndex + 1);\n\n pages.push(0);\n\n if (start > 1) pages.push(\"ellipsis\");\n\n for (let i = start; i <= end; i += 1) {\n if (i !== 0 && i !== pageCount - 1) pages.push(i);\n }\n\n if (end < pageCount - 2) pages.push(\"ellipsis\");\n\n pages.push(pageCount - 1);\n\n return pages;\n}\n\nexport function CraftPagination({\n pageIndex,\n pageCount,\n onPageChange,\n canPrevious = pageIndex > 0,\n canNext = pageIndex < pageCount - 1,\n pageSize,\n pageSizeOptions = [10, 20, 50],\n onPageSizeChange,\n tone,\n className,\n}: CraftPaginationProps) {\n const pages = getPageNumbers(pageIndex, pageCount);\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center justify-between gap-4\",\n className\n )}\n data-nc-theme={tone}\n >\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n className={cn(\n \"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition\",\n \"hover:bg-[rgb(var(--nc-surface)/0.2)]\",\n !canPrevious && \"opacity-50 cursor-not-allowed\"\n )}\n onClick={() => onPageChange(Math.max(pageIndex - 1, 0))}\n disabled={!canPrevious}\n >\n Prev\n </button>\n {pages.map((page, index) =>\n page === \"ellipsis\" ? (\n <span key={`ellipsis-${index}`} className=\"px-2 text-[rgb(var(--nc-fg-muted))]\">\n ...\n </span>\n ) : (\n <button\n key={page}\n type=\"button\"\n className={cn(\n \"rounded-xl border px-3 py-2 text-xs transition\",\n page === pageIndex\n ? \"border-[rgb(var(--nc-accent-1)/0.6)] bg-[rgb(var(--nc-accent-1)/0.2)] text-[rgb(var(--nc-fg))]\"\n : \"border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))] hover:text-[rgb(var(--nc-fg))] hover:bg-[rgb(var(--nc-surface)/0.2)]\"\n )}\n onClick={() => onPageChange(page)}\n >\n {page + 1}\n </button>\n )\n )}\n <button\n type=\"button\"\n className={cn(\n \"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))] transition\",\n \"hover:bg-[rgb(var(--nc-surface)/0.2)]\",\n !canNext && \"opacity-50 cursor-not-allowed\"\n )}\n onClick={() => onPageChange(Math.min(pageIndex + 1, pageCount - 1))}\n disabled={!canNext}\n >\n Next\n </button>\n </div>\n\n {onPageSizeChange && (\n <div className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg-muted))]\">\n <span>Rows</span>\n <select\n className=\"rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";AAkEM,SACE,KADF;AA9DN,SAAS,UAAU;AAgBnB,SAAS,eAAe,WAAmB,WAAmB,aAAa,GAAG;AAC5E,MAAI,aAAa,YAAY;AAC3B,WAAO,MAAM,KAAK,EAAE,QAAQ,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC;AAAA,EACtD;AAEA,QAAM,QAAoC,CAAC;AAC3C,QAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,CAAC;AACvC,QAAM,MAAM,KAAK,IAAI,YAAY,GAAG,YAAY,CAAC;AAEjD,QAAM,KAAK,CAAC;AAEZ,MAAI,QAAQ,EAAG,OAAM,KAAK,UAAU;AAEpC,WAAS,IAAI,OAAO,KAAK,KAAK,KAAK,GAAG;AACpC,QAAI,MAAM,KAAK,MAAM,YAAY,EAAG,OAAM,KAAK,CAAC;AAAA,EAClD;AAEA,MAAI,MAAM,YAAY,EAAG,OAAM,KAAK,UAAU;AAE9C,QAAM,KAAK,YAAY,CAAC;AAExB,SAAO;AACT;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B,UAAU,YAAY,YAAY;AAAA,EAClC;AAAA,EACA,kBAAkB,CAAC,IAAI,IAAI,EAAE;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,QAAQ,eAAe,WAAW,SAAS;AAEjD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAe;AAAA,MAEf;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,CAAC,eAAe;AAAA,cAClB;AAAA,cACA,SAAS,MAAM,aAAa,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC;AAAA,cACtD,UAAU,CAAC;AAAA,cACZ;AAAA;AAAA,UAED;AAAA,UACC,MAAM;AAAA,YAAI,CAAC,MAAM,UAChB,SAAS,aACP,oBAAC,UAA+B,WAAU,uCAAsC,mBAArE,YAAY,KAAK,EAE5B,IAEA;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAW;AAAA,kBACT;AAAA,kBACA,SAAS,YACL,mGACA;AAAA,gBACN;AAAA,gBACA,SAAS,MAAM,aAAa,IAAI;AAAA,gBAE/B,iBAAO;AAAA;AAAA,cAVH;AAAA,YAWP;AAAA,UAEJ;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,CAAC,WAAW;AAAA,cACd;AAAA,cACA,SAAS,MAAM,aAAa,KAAK,IAAI,YAAY,GAAG,YAAY,CAAC,CAAC;AAAA,cAClE,UAAU,CAAC;AAAA,cACZ;AAAA;AAAA,UAED;AAAA,WACF;AAAA,QAEC,oBACC,qBAAC,SAAI,WAAU,kEACb;AAAA,8BAAC,UAAK,kBAAI;AAAA,UACV;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,cACP,UAAU,CAAC,UAAU,iBAAiB,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,cAE/D,0BAAgB,IAAI,CAAC,SACpB,oBAAC,YAAkB,OAAO,MACvB,kBADU,IAEb,CACD;AAAA;AAAA,UACH;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}