@hoardodile/ui 0.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 (356) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +70 -0
  3. package/dist/components/alert.d.ts +13 -0
  4. package/dist/components/alert.js +97 -0
  5. package/dist/components/alert.js.map +1 -0
  6. package/dist/components/app-dialog.d.ts +62 -0
  7. package/dist/components/app-dialog.js +656 -0
  8. package/dist/components/app-dialog.js.map +1 -0
  9. package/dist/components/badge.d.ts +11 -0
  10. package/dist/components/badge.js +70 -0
  11. package/dist/components/badge.js.map +1 -0
  12. package/dist/components/breadcrumb.d.ts +12 -0
  13. package/dist/components/breadcrumb.js +617 -0
  14. package/dist/components/breadcrumb.js.map +1 -0
  15. package/dist/components/button.d.ts +17 -0
  16. package/dist/components/button.js +78 -0
  17. package/dist/components/button.js.map +1 -0
  18. package/dist/components/caption-bar.d.ts +44 -0
  19. package/dist/components/caption-bar.js +827 -0
  20. package/dist/components/caption-bar.js.map +1 -0
  21. package/dist/components/chart-card.d.ts +15 -0
  22. package/dist/components/chart-card.js +27 -0
  23. package/dist/components/chart-card.js.map +1 -0
  24. package/dist/components/checkbox.d.ts +6 -0
  25. package/dist/components/checkbox.js +76 -0
  26. package/dist/components/checkbox.js.map +1 -0
  27. package/dist/components/chip-button.d.ts +28 -0
  28. package/dist/components/chip-button.js +87 -0
  29. package/dist/components/chip-button.js.map +1 -0
  30. package/dist/components/close-confirm-dialog.d.ts +19 -0
  31. package/dist/components/close-confirm-dialog.js +743 -0
  32. package/dist/components/close-confirm-dialog.js.map +1 -0
  33. package/dist/components/color-picker.d.ts +32 -0
  34. package/dist/components/color-picker.js +667 -0
  35. package/dist/components/color-picker.js.map +1 -0
  36. package/dist/components/combobox.d.ts +32 -0
  37. package/dist/components/combobox.js +1211 -0
  38. package/dist/components/combobox.js.map +1 -0
  39. package/dist/components/confirm-by-typing-dialog.d.ts +48 -0
  40. package/dist/components/confirm-by-typing-dialog.js +759 -0
  41. package/dist/components/confirm-by-typing-dialog.js.map +1 -0
  42. package/dist/components/confirm-dialog.d.ts +34 -0
  43. package/dist/components/confirm-dialog.js +710 -0
  44. package/dist/components/confirm-dialog.js.map +1 -0
  45. package/dist/components/count-badge.d.ts +13 -0
  46. package/dist/components/count-badge.js +39 -0
  47. package/dist/components/count-badge.js.map +1 -0
  48. package/dist/components/dialog.d.ts +40 -0
  49. package/dist/components/dialog.js +571 -0
  50. package/dist/components/dialog.js.map +1 -0
  51. package/dist/components/dropdown-menu.d.ts +45 -0
  52. package/dist/components/dropdown-menu.js +1003 -0
  53. package/dist/components/dropdown-menu.js.map +1 -0
  54. package/dist/components/dropdown-select.d.ts +29 -0
  55. package/dist/components/dropdown-select.js +1036 -0
  56. package/dist/components/dropdown-select.js.map +1 -0
  57. package/dist/components/empty.d.ts +15 -0
  58. package/dist/components/empty.js +119 -0
  59. package/dist/components/empty.js.map +1 -0
  60. package/dist/components/filter-rail.d.ts +48 -0
  61. package/dist/components/filter-rail.js +231 -0
  62. package/dist/components/filter-rail.js.map +1 -0
  63. package/dist/components/fixed-action-bar.d.ts +24 -0
  64. package/dist/components/fixed-action-bar.js +48 -0
  65. package/dist/components/fixed-action-bar.js.map +1 -0
  66. package/dist/components/font-picker.d.ts +45 -0
  67. package/dist/components/font-picker.js +759 -0
  68. package/dist/components/font-picker.js.map +1 -0
  69. package/dist/components/form.d.ts +17 -0
  70. package/dist/components/form.js +150 -0
  71. package/dist/components/form.js.map +1 -0
  72. package/dist/components/group-label.d.ts +12 -0
  73. package/dist/components/group-label.js +10 -0
  74. package/dist/components/group-label.js.map +1 -0
  75. package/dist/components/icon-tile.d.ts +16 -0
  76. package/dist/components/icon-tile.js +67 -0
  77. package/dist/components/icon-tile.js.map +1 -0
  78. package/dist/components/icon-toggle.d.ts +24 -0
  79. package/dist/components/icon-toggle.js +81 -0
  80. package/dist/components/icon-toggle.js.map +1 -0
  81. package/dist/components/icon.d.ts +2 -0
  82. package/dist/components/icon.js +49 -0
  83. package/dist/components/icon.js.map +1 -0
  84. package/dist/components/image-crop-panel.d.ts +80 -0
  85. package/dist/components/image-crop-panel.js +1104 -0
  86. package/dist/components/image-crop-panel.js.map +1 -0
  87. package/dist/components/image-cropper.d.ts +63 -0
  88. package/dist/components/image-cropper.js +166 -0
  89. package/dist/components/image-cropper.js.map +1 -0
  90. package/dist/components/input-group.d.ts +22 -0
  91. package/dist/components/input-group.js +270 -0
  92. package/dist/components/input-group.js.map +1 -0
  93. package/dist/components/input.d.ts +16 -0
  94. package/dist/components/input.js +60 -0
  95. package/dist/components/input.js.map +1 -0
  96. package/dist/components/label.d.ts +5 -0
  97. package/dist/components/label.js +40 -0
  98. package/dist/components/label.js.map +1 -0
  99. package/dist/components/list-empty-row.d.ts +16 -0
  100. package/dist/components/list-empty-row.js +40 -0
  101. package/dist/components/list-empty-row.js.map +1 -0
  102. package/dist/components/management-empty.d.ts +14 -0
  103. package/dist/components/management-empty.js +40 -0
  104. package/dist/components/management-empty.js.map +1 -0
  105. package/dist/components/management-skeleton.d.ts +11 -0
  106. package/dist/components/management-skeleton.js +72 -0
  107. package/dist/components/management-skeleton.js.map +1 -0
  108. package/dist/components/meta-chip.d.ts +17 -0
  109. package/dist/components/meta-chip.js +49 -0
  110. package/dist/components/meta-chip.js.map +1 -0
  111. package/dist/components/mobile-drawer.d.ts +29 -0
  112. package/dist/components/mobile-drawer.js +331 -0
  113. package/dist/components/mobile-drawer.js.map +1 -0
  114. package/dist/components/page-header.d.ts +20 -0
  115. package/dist/components/page-header.js +44 -0
  116. package/dist/components/page-header.js.map +1 -0
  117. package/dist/components/page-scaffold.d.ts +34 -0
  118. package/dist/components/page-scaffold.js +157 -0
  119. package/dist/components/page-scaffold.js.map +1 -0
  120. package/dist/components/pagination-bar.d.ts +22 -0
  121. package/dist/components/pagination-bar.js +703 -0
  122. package/dist/components/pagination-bar.js.map +1 -0
  123. package/dist/components/pagination.d.ts +22 -0
  124. package/dist/components/pagination.js +680 -0
  125. package/dist/components/pagination.js.map +1 -0
  126. package/dist/components/panel-toolbar.d.ts +37 -0
  127. package/dist/components/panel-toolbar.js +781 -0
  128. package/dist/components/panel-toolbar.js.map +1 -0
  129. package/dist/components/pill-tabs.d.ts +33 -0
  130. package/dist/components/pill-tabs.js +66 -0
  131. package/dist/components/pill-tabs.js.map +1 -0
  132. package/dist/components/plugin-download-consent.d.ts +52 -0
  133. package/dist/components/plugin-download-consent.js +780 -0
  134. package/dist/components/plugin-download-consent.js.map +1 -0
  135. package/dist/components/popover.d.ts +26 -0
  136. package/dist/components/popover.js +343 -0
  137. package/dist/components/popover.js.map +1 -0
  138. package/dist/components/progress.d.ts +10 -0
  139. package/dist/components/progress.js +103 -0
  140. package/dist/components/progress.js.map +1 -0
  141. package/dist/components/query-state-view.d.ts +36 -0
  142. package/dist/components/query-state-view.js +17 -0
  143. package/dist/components/query-state-view.js.map +1 -0
  144. package/dist/components/radio-group.d.ts +8 -0
  145. package/dist/components/radio-group.js +60 -0
  146. package/dist/components/radio-group.js.map +1 -0
  147. package/dist/components/scroll-area.d.ts +7 -0
  148. package/dist/components/scroll-area.js +80 -0
  149. package/dist/components/scroll-area.js.map +1 -0
  150. package/dist/components/search-field.d.ts +49 -0
  151. package/dist/components/search-field.js +586 -0
  152. package/dist/components/search-field.js.map +1 -0
  153. package/dist/components/secondary-stat.d.ts +13 -0
  154. package/dist/components/secondary-stat.js +56 -0
  155. package/dist/components/secondary-stat.js.map +1 -0
  156. package/dist/components/section-header.d.ts +23 -0
  157. package/dist/components/section-header.js +76 -0
  158. package/dist/components/section-header.js.map +1 -0
  159. package/dist/components/section-label.d.ts +20 -0
  160. package/dist/components/section-label.js +46 -0
  161. package/dist/components/section-label.js.map +1 -0
  162. package/dist/components/section-tabs.d.ts +47 -0
  163. package/dist/components/section-tabs.js +145 -0
  164. package/dist/components/section-tabs.js.map +1 -0
  165. package/dist/components/separator.d.ts +14 -0
  166. package/dist/components/separator.js +49 -0
  167. package/dist/components/separator.js.map +1 -0
  168. package/dist/components/sheet.d.ts +22 -0
  169. package/dist/components/sheet.js +469 -0
  170. package/dist/components/sheet.js.map +1 -0
  171. package/dist/components/sidebar.d.ts +69 -0
  172. package/dist/components/sidebar.js +1645 -0
  173. package/dist/components/sidebar.js.map +1 -0
  174. package/dist/components/skeleton.d.ts +8 -0
  175. package/dist/components/skeleton.js +41 -0
  176. package/dist/components/skeleton.js.map +1 -0
  177. package/dist/components/slider.d.ts +6 -0
  178. package/dist/components/slider.js +75 -0
  179. package/dist/components/slider.js.map +1 -0
  180. package/dist/components/sortable-chip-list.d.ts +26 -0
  181. package/dist/components/sortable-chip-list.js +59 -0
  182. package/dist/components/sortable-chip-list.js.map +1 -0
  183. package/dist/components/spinner.d.ts +5 -0
  184. package/dist/components/spinner.js +65 -0
  185. package/dist/components/spinner.js.map +1 -0
  186. package/dist/components/surface.d.ts +13 -0
  187. package/dist/components/surface.js +51 -0
  188. package/dist/components/surface.js.map +1 -0
  189. package/dist/components/switch.d.ts +8 -0
  190. package/dist/components/switch.js +53 -0
  191. package/dist/components/switch.js.map +1 -0
  192. package/dist/components/table.d.ts +12 -0
  193. package/dist/components/table.js +129 -0
  194. package/dist/components/table.js.map +1 -0
  195. package/dist/components/textarea.d.ts +15 -0
  196. package/dist/components/textarea.js +58 -0
  197. package/dist/components/textarea.js.map +1 -0
  198. package/dist/components/toast.d.ts +19 -0
  199. package/dist/components/toast.js +805 -0
  200. package/dist/components/toast.js.map +1 -0
  201. package/dist/components/toggle.d.ts +12 -0
  202. package/dist/components/toggle.js +63 -0
  203. package/dist/components/toggle.js.map +1 -0
  204. package/dist/components/tooltip.d.ts +9 -0
  205. package/dist/components/tooltip.js +82 -0
  206. package/dist/components/tooltip.js.map +1 -0
  207. package/dist/hooks/use-dialog-footer-actions.d.ts +18 -0
  208. package/dist/hooks/use-dialog-footer-actions.js +11 -0
  209. package/dist/hooks/use-dialog-footer-actions.js.map +1 -0
  210. package/dist/hooks/use-form-field.d.ts +33 -0
  211. package/dist/hooks/use-form-field.js +36 -0
  212. package/dist/hooks/use-form-field.js.map +1 -0
  213. package/dist/hooks/use-mobile.d.ts +34 -0
  214. package/dist/hooks/use-mobile.js +29 -0
  215. package/dist/hooks/use-mobile.js.map +1 -0
  216. package/dist/hooks/use-pinch-pan.d.ts +56 -0
  217. package/dist/hooks/use-pinch-pan.js +223 -0
  218. package/dist/hooks/use-pinch-pan.js.map +1 -0
  219. package/dist/hooks/useMobileBackToClose.d.ts +61 -0
  220. package/dist/hooks/useMobileBackToClose.js +234 -0
  221. package/dist/hooks/useMobileBackToClose.js.map +1 -0
  222. package/dist/icon-BOgL5bpL.d.ts +85 -0
  223. package/dist/icons/actions.d.ts +4 -0
  224. package/dist/icons/actions.js +520 -0
  225. package/dist/icons/actions.js.map +1 -0
  226. package/dist/icons/icon-style.d.ts +2 -0
  227. package/dist/icons/icon-style.js +51 -0
  228. package/dist/icons/icon-style.js.map +1 -0
  229. package/dist/icons/marks.d.ts +15 -0
  230. package/dist/icons/marks.js +48 -0
  231. package/dist/icons/marks.js.map +1 -0
  232. package/dist/icons/registry.d.ts +177 -0
  233. package/dist/icons/registry.js +1180 -0
  234. package/dist/icons/registry.js.map +1 -0
  235. package/dist/index.d.ts +6 -0
  236. package/dist/index.js +653 -0
  237. package/dist/index.js.map +1 -0
  238. package/dist/lib/merge-config.d.ts +15 -0
  239. package/dist/lib/merge-config.js +20 -0
  240. package/dist/lib/merge-config.js.map +1 -0
  241. package/dist/lib/pagination.d.ts +19 -0
  242. package/dist/lib/pagination.js +26 -0
  243. package/dist/lib/pagination.js.map +1 -0
  244. package/dist/lib/utils.d.ts +5 -0
  245. package/dist/lib/utils.js +26 -0
  246. package/dist/lib/utils.js.map +1 -0
  247. package/dist/styles/theme.css +480 -0
  248. package/dist/styles/theme.css.map +1 -0
  249. package/dist/styles/theme.d.ts +2 -0
  250. package/dist/viewport.d.ts +64 -0
  251. package/dist/viewport.js +13 -0
  252. package/dist/viewport.js.map +1 -0
  253. package/package.json +122 -0
  254. package/src/components/alert.tsx +76 -0
  255. package/src/components/app-dialog.tsx +187 -0
  256. package/src/components/badge.tsx +52 -0
  257. package/src/components/breadcrumb.tsx +129 -0
  258. package/src/components/button.tsx +70 -0
  259. package/src/components/caption-bar.test.tsx +151 -0
  260. package/src/components/caption-bar.tsx +392 -0
  261. package/src/components/chart-card.tsx +31 -0
  262. package/src/components/checkbox.tsx +28 -0
  263. package/src/components/chip-button.tsx +69 -0
  264. package/src/components/close-confirm-dialog.tsx +99 -0
  265. package/src/components/color-picker.tsx +186 -0
  266. package/src/components/combobox.tsx +335 -0
  267. package/src/components/confirm-by-typing-dialog.tsx +130 -0
  268. package/src/components/confirm-dialog.test.tsx +39 -0
  269. package/src/components/confirm-dialog.tsx +98 -0
  270. package/src/components/count-badge.tsx +23 -0
  271. package/src/components/dialog.tsx +315 -0
  272. package/src/components/dropdown-menu.tsx +311 -0
  273. package/src/components/dropdown-select.tsx +211 -0
  274. package/src/components/empty.tsx +104 -0
  275. package/src/components/filter-rail.tsx +139 -0
  276. package/src/components/fixed-action-bar.tsx +46 -0
  277. package/src/components/font-picker.tsx +257 -0
  278. package/src/components/form.tsx +127 -0
  279. package/src/components/group-label.tsx +13 -0
  280. package/src/components/icon-tile.tsx +35 -0
  281. package/src/components/icon-toggle.tsx +57 -0
  282. package/src/components/icon.tsx +66 -0
  283. package/src/components/image-crop-panel.test.tsx +167 -0
  284. package/src/components/image-crop-panel.tsx +465 -0
  285. package/src/components/image-cropper.test.tsx +144 -0
  286. package/src/components/image-cropper.tsx +265 -0
  287. package/src/components/input-group.tsx +156 -0
  288. package/src/components/input.tsx +45 -0
  289. package/src/components/label.tsx +20 -0
  290. package/src/components/list-empty-row.tsx +27 -0
  291. package/src/components/management-empty.tsx +25 -0
  292. package/src/components/management-skeleton.tsx +23 -0
  293. package/src/components/meta-chip.tsx +40 -0
  294. package/src/components/mobile-drawer.test.tsx +52 -0
  295. package/src/components/mobile-drawer.tsx +98 -0
  296. package/src/components/page-header.tsx +47 -0
  297. package/src/components/page-scaffold.test.tsx +24 -0
  298. package/src/components/page-scaffold.tsx +131 -0
  299. package/src/components/pagination-bar.test.tsx +87 -0
  300. package/src/components/pagination-bar.tsx +139 -0
  301. package/src/components/pagination.tsx +139 -0
  302. package/src/components/panel-toolbar.tsx +99 -0
  303. package/src/components/pill-tabs.test.tsx +84 -0
  304. package/src/components/pill-tabs.tsx +77 -0
  305. package/src/components/plugin-download-consent.test.tsx +90 -0
  306. package/src/components/plugin-download-consent.tsx +183 -0
  307. package/src/components/popover.tsx +133 -0
  308. package/src/components/progress.tsx +88 -0
  309. package/src/components/query-state-view.tsx +47 -0
  310. package/src/components/radio-group.tsx +36 -0
  311. package/src/components/scroll-area.tsx +52 -0
  312. package/src/components/search-field.test.tsx +86 -0
  313. package/src/components/search-field.tsx +119 -0
  314. package/src/components/secondary-stat.tsx +24 -0
  315. package/src/components/section-header.tsx +54 -0
  316. package/src/components/section-label.tsx +40 -0
  317. package/src/components/section-tabs.test.tsx +154 -0
  318. package/src/components/section-tabs.tsx +190 -0
  319. package/src/components/separator.tsx +38 -0
  320. package/src/components/sheet.tsx +170 -0
  321. package/src/components/sidebar.tsx +725 -0
  322. package/src/components/skeleton.tsx +18 -0
  323. package/src/components/slider.tsx +52 -0
  324. package/src/components/sortable-chip-list.tsx +56 -0
  325. package/src/components/spinner.tsx +35 -0
  326. package/src/components/surface.tsx +37 -0
  327. package/src/components/switch.tsx +30 -0
  328. package/src/components/table.tsx +116 -0
  329. package/src/components/textarea.tsx +41 -0
  330. package/src/components/toast.tsx +239 -0
  331. package/src/components/toggle.tsx +45 -0
  332. package/src/components/tooltip.tsx +64 -0
  333. package/src/hooks/use-dialog-footer-actions.ts +23 -0
  334. package/src/hooks/use-form-field.ts +62 -0
  335. package/src/hooks/use-mobile.ts +54 -0
  336. package/src/hooks/use-pinch-pan.test.tsx +42 -0
  337. package/src/hooks/use-pinch-pan.ts +340 -0
  338. package/src/hooks/useMobileBackToClose.test.tsx +140 -0
  339. package/src/hooks/useMobileBackToClose.ts +508 -0
  340. package/src/icons/actions.ts +10 -0
  341. package/src/icons/icon-style.test.tsx +69 -0
  342. package/src/icons/icon-style.ts +104 -0
  343. package/src/icons/marks.tsx +72 -0
  344. package/src/icons/registry.test.ts +65 -0
  345. package/src/icons/registry.ts +1163 -0
  346. package/src/index.ts +22 -0
  347. package/src/lib/merge-config.test.ts +109 -0
  348. package/src/lib/merge-config.ts +22 -0
  349. package/src/lib/pagination.test.ts +55 -0
  350. package/src/lib/pagination.ts +42 -0
  351. package/src/lib/utils.ts +6 -0
  352. package/src/styles/scan-contract.test.ts +74 -0
  353. package/src/styles/theme.css +798 -0
  354. package/src/test/i18n.tsx +22 -0
  355. package/src/test/setup.ts +104 -0
  356. package/src/viewport.ts +69 -0
@@ -0,0 +1,1104 @@
1
+ import { clsx } from 'clsx';
2
+ import { extendTailwindMerge } from 'tailwind-merge';
3
+ import { Button as Button$1 } from '@base-ui/react/button';
4
+ import { cva } from 'class-variance-authority';
5
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
+ import { createContext, useId, useRef, useState, useEffect, useCallback, useContext, useSyncExternalStore, createElement } from 'react';
7
+ import { Switch as Switch$1 } from '@base-ui/react/switch';
8
+ import '@solar-icons/react/bold/add-circle';
9
+ import '@solar-icons/react/bold/align-left';
10
+ import '@solar-icons/react/bold/alt-arrow-down';
11
+ import '@solar-icons/react/bold/alt-arrow-left';
12
+ import '@solar-icons/react/bold/alt-arrow-right';
13
+ import '@solar-icons/react/bold/alt-arrow-up';
14
+ import '@solar-icons/react/bold/archive';
15
+ import '@solar-icons/react/bold/arrow-right';
16
+ import '@solar-icons/react/bold/arrow-to-top-left';
17
+ import '@solar-icons/react/bold/arrow-to-top-right';
18
+ import '@solar-icons/react/bold/bell';
19
+ import '@solar-icons/react/bold/bolt';
20
+ import '@solar-icons/react/bold/book';
21
+ import '@solar-icons/react/bold/book-2';
22
+ import '@solar-icons/react/bold/bookmark';
23
+ import '@solar-icons/react/bold/bookmark-circle';
24
+ import '@solar-icons/react/bold/box';
25
+ import '@solar-icons/react/bold/branching-paths-up';
26
+ import '@solar-icons/react/bold/bug';
27
+ import '@solar-icons/react/bold/calendar-date';
28
+ import '@solar-icons/react/bold/chat-round';
29
+ import '@solar-icons/react/bold/chat-round-dots';
30
+ import '@solar-icons/react/bold/chat-round-line';
31
+ import '@solar-icons/react/bold/chat-square';
32
+ import '@solar-icons/react/bold/check-circle';
33
+ import '@solar-icons/react/bold/checklist';
34
+ import '@solar-icons/react/bold/clipboard-list';
35
+ import '@solar-icons/react/bold/clock-circle';
36
+ import '@solar-icons/react/bold/compass';
37
+ import '@solar-icons/react/bold/copy';
38
+ import '@solar-icons/react/bold/crown';
39
+ import '@solar-icons/react/bold/danger-triangle';
40
+ import '@solar-icons/react/bold/database';
41
+ import '@solar-icons/react/bold/diskette';
42
+ import '@solar-icons/react/bold/dislike';
43
+ import '@solar-icons/react/bold/document-add';
44
+ import '@solar-icons/react/bold/document-text';
45
+ import '@solar-icons/react/bold/double-alt-arrow-down';
46
+ import '@solar-icons/react/bold/download';
47
+ import '@solar-icons/react/bold/eraser';
48
+ import '@solar-icons/react/bold/eye';
49
+ import '@solar-icons/react/bold/file';
50
+ import '@solar-icons/react/bold/file-remove';
51
+ import '@solar-icons/react/bold/file-text';
52
+ import '@solar-icons/react/bold/filter';
53
+ import '@solar-icons/react/bold/filters';
54
+ import '@solar-icons/react/bold/folder';
55
+ import '@solar-icons/react/bold/folder-open';
56
+ import '@solar-icons/react/bold/folder-path-connect';
57
+ import '@solar-icons/react/bold/forbidden-circle';
58
+ import { GalleryIcon as GalleryIcon$2 } from '@solar-icons/react/bold/gallery';
59
+ import '@solar-icons/react/bold/gallery-add';
60
+ import '@solar-icons/react/bold/gallery-wide';
61
+ import '@solar-icons/react/bold/global';
62
+ import '@solar-icons/react/bold/graph-down';
63
+ import '@solar-icons/react/bold/graph-up';
64
+ import '@solar-icons/react/bold/hamburger-menu';
65
+ import '@solar-icons/react/bold/hand-heart';
66
+ import '@solar-icons/react/bold/heart';
67
+ import '@solar-icons/react/bold/help';
68
+ import '@solar-icons/react/bold/history';
69
+ import '@solar-icons/react/bold/home-angle';
70
+ import '@solar-icons/react/bold/info-circle';
71
+ import '@solar-icons/react/bold/layers';
72
+ import '@solar-icons/react/bold/letter';
73
+ import '@solar-icons/react/bold/like';
74
+ import '@solar-icons/react/bold/link';
75
+ import '@solar-icons/react/bold/list';
76
+ import '@solar-icons/react/bold/list-vertical';
77
+ import '@solar-icons/react/bold/lock-password';
78
+ import '@solar-icons/react/bold/login-2';
79
+ import '@solar-icons/react/bold/logout';
80
+ import '@solar-icons/react/bold/magic-wand-2';
81
+ import '@solar-icons/react/bold/magnifier';
82
+ import '@solar-icons/react/bold/magnifier-zoom-in';
83
+ import '@solar-icons/react/bold/magnifier-zoom-out';
84
+ import '@solar-icons/react/bold/maximize';
85
+ import '@solar-icons/react/bold/menu-dots';
86
+ import '@solar-icons/react/bold/minimize';
87
+ import '@solar-icons/react/bold/minus-square';
88
+ import '@solar-icons/react/bold/monitor';
89
+ import '@solar-icons/react/bold/monitor-smartphone';
90
+ import '@solar-icons/react/bold/moon';
91
+ import '@solar-icons/react/bold/move-to-folder';
92
+ import '@solar-icons/react/bold/music-notes';
93
+ import '@solar-icons/react/bold/palette';
94
+ import '@solar-icons/react/bold/palette-round';
95
+ import '@solar-icons/react/bold/pause';
96
+ import '@solar-icons/react/bold/pen';
97
+ import '@solar-icons/react/bold/pen-new-round';
98
+ import '@solar-icons/react/bold/pie-chart';
99
+ import '@solar-icons/react/bold/pin';
100
+ import '@solar-icons/react/bold/play';
101
+ import '@solar-icons/react/bold/plug-circle';
102
+ import '@solar-icons/react/bold/plus-minus';
103
+ import '@solar-icons/react/bold/pulse';
104
+ import '@solar-icons/react/bold/refresh';
105
+ import { RefreshCircleIcon as RefreshCircleIcon$2 } from '@solar-icons/react/bold/refresh-circle';
106
+ import '@solar-icons/react/bold/reorder';
107
+ import '@solar-icons/react/bold/repeat';
108
+ import '@solar-icons/react/bold/reply';
109
+ import '@solar-icons/react/bold/restart';
110
+ import '@solar-icons/react/bold/rocket';
111
+ import '@solar-icons/react/bold/route';
112
+ import '@solar-icons/react/bold/scale';
113
+ import '@solar-icons/react/bold/server';
114
+ import '@solar-icons/react/bold/settings';
115
+ import '@solar-icons/react/bold/share';
116
+ import '@solar-icons/react/bold/shield-check';
117
+ import '@solar-icons/react/bold/sidebar-minimalistic';
118
+ import '@solar-icons/react/bold/slider-horizontal';
119
+ import '@solar-icons/react/bold/smartphone';
120
+ import '@solar-icons/react/bold/sort';
121
+ import '@solar-icons/react/bold/sort-by-time';
122
+ import '@solar-icons/react/bold/sort-horizontal';
123
+ import '@solar-icons/react/bold/sort-vertical';
124
+ import '@solar-icons/react/bold/star';
125
+ import '@solar-icons/react/bold/structure';
126
+ import '@solar-icons/react/bold/sun';
127
+ import '@solar-icons/react/bold/tag';
128
+ import '@solar-icons/react/bold/telescope';
129
+ import '@solar-icons/react/bold/test-tube';
130
+ import '@solar-icons/react/bold/text-format';
131
+ import '@solar-icons/react/bold/transfer-horizontal';
132
+ import '@solar-icons/react/bold/translation';
133
+ import '@solar-icons/react/bold/trash-bin-minimalistic';
134
+ import '@solar-icons/react/bold/undo-left';
135
+ import '@solar-icons/react/bold/undo-left-round';
136
+ import '@solar-icons/react/bold/undo-right';
137
+ import '@solar-icons/react/bold/undo-right-round';
138
+ import { UploadIcon as UploadIcon$2 } from '@solar-icons/react/bold/upload';
139
+ import '@solar-icons/react/bold/user';
140
+ import '@solar-icons/react/bold/user-id';
141
+ import '@solar-icons/react/bold/user-minus';
142
+ import '@solar-icons/react/bold/user-plus';
143
+ import '@solar-icons/react/bold/users-group-rounded';
144
+ import '@solar-icons/react/bold/users-group-two-rounded';
145
+ import '@solar-icons/react/bold/video-frame';
146
+ import '@solar-icons/react/bold/widget-2';
147
+ import '@solar-icons/react/bold/widget-5';
148
+ import '@solar-icons/react/bold/window-frame';
149
+ import '@solar-icons/react/bold-duotone/add-circle';
150
+ import '@solar-icons/react/bold-duotone/align-left';
151
+ import '@solar-icons/react/bold-duotone/alt-arrow-down';
152
+ import '@solar-icons/react/bold-duotone/alt-arrow-left';
153
+ import '@solar-icons/react/bold-duotone/alt-arrow-right';
154
+ import '@solar-icons/react/bold-duotone/alt-arrow-up';
155
+ import '@solar-icons/react/bold-duotone/archive';
156
+ import '@solar-icons/react/bold-duotone/arrow-right';
157
+ import '@solar-icons/react/bold-duotone/arrow-to-top-left';
158
+ import '@solar-icons/react/bold-duotone/arrow-to-top-right';
159
+ import '@solar-icons/react/bold-duotone/bell';
160
+ import '@solar-icons/react/bold-duotone/bolt';
161
+ import '@solar-icons/react/bold-duotone/book';
162
+ import '@solar-icons/react/bold-duotone/book-2';
163
+ import '@solar-icons/react/bold-duotone/bookmark';
164
+ import '@solar-icons/react/bold-duotone/bookmark-circle';
165
+ import '@solar-icons/react/bold-duotone/box';
166
+ import '@solar-icons/react/bold-duotone/branching-paths-up';
167
+ import '@solar-icons/react/bold-duotone/bug';
168
+ import '@solar-icons/react/bold-duotone/calendar-date';
169
+ import '@solar-icons/react/bold-duotone/chat-round';
170
+ import '@solar-icons/react/bold-duotone/chat-round-dots';
171
+ import '@solar-icons/react/bold-duotone/chat-round-line';
172
+ import '@solar-icons/react/bold-duotone/chat-square';
173
+ import '@solar-icons/react/bold-duotone/check-circle';
174
+ import '@solar-icons/react/bold-duotone/checklist';
175
+ import '@solar-icons/react/bold-duotone/clipboard-list';
176
+ import '@solar-icons/react/bold-duotone/clock-circle';
177
+ import '@solar-icons/react/bold-duotone/compass';
178
+ import '@solar-icons/react/bold-duotone/copy';
179
+ import '@solar-icons/react/bold-duotone/crown';
180
+ import '@solar-icons/react/bold-duotone/danger-triangle';
181
+ import '@solar-icons/react/bold-duotone/database';
182
+ import '@solar-icons/react/bold-duotone/diskette';
183
+ import '@solar-icons/react/bold-duotone/dislike';
184
+ import '@solar-icons/react/bold-duotone/document-add';
185
+ import '@solar-icons/react/bold-duotone/document-text';
186
+ import '@solar-icons/react/bold-duotone/double-alt-arrow-down';
187
+ import '@solar-icons/react/bold-duotone/download';
188
+ import '@solar-icons/react/bold-duotone/eraser';
189
+ import '@solar-icons/react/bold-duotone/eye';
190
+ import '@solar-icons/react/bold-duotone/file';
191
+ import '@solar-icons/react/bold-duotone/file-remove';
192
+ import '@solar-icons/react/bold-duotone/file-text';
193
+ import '@solar-icons/react/bold-duotone/filter';
194
+ import '@solar-icons/react/bold-duotone/filters';
195
+ import '@solar-icons/react/bold-duotone/folder';
196
+ import '@solar-icons/react/bold-duotone/folder-open';
197
+ import '@solar-icons/react/bold-duotone/folder-path-connect';
198
+ import '@solar-icons/react/bold-duotone/forbidden-circle';
199
+ import { GalleryIcon as GalleryIcon$1 } from '@solar-icons/react/bold-duotone/gallery';
200
+ import '@solar-icons/react/bold-duotone/gallery-add';
201
+ import '@solar-icons/react/bold-duotone/gallery-wide';
202
+ import '@solar-icons/react/bold-duotone/global';
203
+ import '@solar-icons/react/bold-duotone/graph-down';
204
+ import '@solar-icons/react/bold-duotone/graph-up';
205
+ import '@solar-icons/react/bold-duotone/hamburger-menu';
206
+ import '@solar-icons/react/bold-duotone/hand-heart';
207
+ import '@solar-icons/react/bold-duotone/heart';
208
+ import '@solar-icons/react/bold-duotone/help';
209
+ import '@solar-icons/react/bold-duotone/history';
210
+ import '@solar-icons/react/bold-duotone/home-angle';
211
+ import '@solar-icons/react/bold-duotone/info-circle';
212
+ import '@solar-icons/react/bold-duotone/layers';
213
+ import '@solar-icons/react/bold-duotone/letter';
214
+ import '@solar-icons/react/bold-duotone/like';
215
+ import '@solar-icons/react/bold-duotone/link';
216
+ import '@solar-icons/react/bold-duotone/list';
217
+ import '@solar-icons/react/bold-duotone/list-vertical';
218
+ import '@solar-icons/react/bold-duotone/lock-password';
219
+ import '@solar-icons/react/bold-duotone/login-2';
220
+ import '@solar-icons/react/bold-duotone/logout';
221
+ import '@solar-icons/react/bold-duotone/magic-wand-2';
222
+ import '@solar-icons/react/bold-duotone/magnifier';
223
+ import '@solar-icons/react/bold-duotone/magnifier-zoom-in';
224
+ import '@solar-icons/react/bold-duotone/magnifier-zoom-out';
225
+ import '@solar-icons/react/bold-duotone/maximize';
226
+ import '@solar-icons/react/bold-duotone/menu-dots';
227
+ import '@solar-icons/react/bold-duotone/minimize';
228
+ import '@solar-icons/react/bold-duotone/minus-square';
229
+ import '@solar-icons/react/bold-duotone/monitor';
230
+ import '@solar-icons/react/bold-duotone/monitor-smartphone';
231
+ import '@solar-icons/react/bold-duotone/moon';
232
+ import '@solar-icons/react/bold-duotone/move-to-folder';
233
+ import '@solar-icons/react/bold-duotone/music-notes';
234
+ import '@solar-icons/react/bold-duotone/palette';
235
+ import '@solar-icons/react/bold-duotone/palette-round';
236
+ import '@solar-icons/react/bold-duotone/pause';
237
+ import '@solar-icons/react/bold-duotone/pen';
238
+ import '@solar-icons/react/bold-duotone/pen-new-round';
239
+ import '@solar-icons/react/bold-duotone/pie-chart';
240
+ import '@solar-icons/react/bold-duotone/pin';
241
+ import '@solar-icons/react/bold-duotone/play';
242
+ import '@solar-icons/react/bold-duotone/plug-circle';
243
+ import '@solar-icons/react/bold-duotone/plus-minus';
244
+ import '@solar-icons/react/bold-duotone/pulse';
245
+ import '@solar-icons/react/bold-duotone/refresh';
246
+ import { RefreshCircleIcon as RefreshCircleIcon$1 } from '@solar-icons/react/bold-duotone/refresh-circle';
247
+ import '@solar-icons/react/bold-duotone/reorder';
248
+ import '@solar-icons/react/bold-duotone/repeat';
249
+ import '@solar-icons/react/bold-duotone/reply';
250
+ import '@solar-icons/react/bold-duotone/restart';
251
+ import '@solar-icons/react/bold-duotone/rocket';
252
+ import '@solar-icons/react/bold-duotone/route';
253
+ import '@solar-icons/react/bold-duotone/scale';
254
+ import '@solar-icons/react/bold-duotone/server';
255
+ import '@solar-icons/react/bold-duotone/settings';
256
+ import '@solar-icons/react/bold-duotone/share';
257
+ import '@solar-icons/react/bold-duotone/shield-check';
258
+ import '@solar-icons/react/bold-duotone/sidebar-minimalistic';
259
+ import '@solar-icons/react/bold-duotone/slider-horizontal';
260
+ import '@solar-icons/react/bold-duotone/smartphone';
261
+ import '@solar-icons/react/bold-duotone/sort';
262
+ import '@solar-icons/react/bold-duotone/sort-by-time';
263
+ import '@solar-icons/react/bold-duotone/sort-horizontal';
264
+ import '@solar-icons/react/bold-duotone/sort-vertical';
265
+ import '@solar-icons/react/bold-duotone/star';
266
+ import '@solar-icons/react/bold-duotone/structure';
267
+ import '@solar-icons/react/bold-duotone/sun';
268
+ import '@solar-icons/react/bold-duotone/tag';
269
+ import '@solar-icons/react/bold-duotone/telescope';
270
+ import '@solar-icons/react/bold-duotone/test-tube';
271
+ import '@solar-icons/react/bold-duotone/text-format';
272
+ import '@solar-icons/react/bold-duotone/transfer-horizontal';
273
+ import '@solar-icons/react/bold-duotone/translation';
274
+ import '@solar-icons/react/bold-duotone/trash-bin-minimalistic';
275
+ import '@solar-icons/react/bold-duotone/undo-left';
276
+ import '@solar-icons/react/bold-duotone/undo-left-round';
277
+ import '@solar-icons/react/bold-duotone/undo-right';
278
+ import '@solar-icons/react/bold-duotone/undo-right-round';
279
+ import { UploadIcon as UploadIcon$1 } from '@solar-icons/react/bold-duotone/upload';
280
+ import '@solar-icons/react/bold-duotone/user';
281
+ import '@solar-icons/react/bold-duotone/user-id';
282
+ import '@solar-icons/react/bold-duotone/user-minus';
283
+ import '@solar-icons/react/bold-duotone/user-plus';
284
+ import '@solar-icons/react/bold-duotone/users-group-rounded';
285
+ import '@solar-icons/react/bold-duotone/users-group-two-rounded';
286
+ import '@solar-icons/react/bold-duotone/video-frame';
287
+ import '@solar-icons/react/bold-duotone/widget-2';
288
+ import '@solar-icons/react/bold-duotone/widget-5';
289
+ import '@solar-icons/react/bold-duotone/window-frame';
290
+ import '@solar-icons/react/linear/add-circle';
291
+ import '@solar-icons/react/linear/align-left';
292
+ import '@solar-icons/react/linear/alt-arrow-down';
293
+ import '@solar-icons/react/linear/alt-arrow-left';
294
+ import '@solar-icons/react/linear/alt-arrow-right';
295
+ import '@solar-icons/react/linear/alt-arrow-up';
296
+ import '@solar-icons/react/linear/archive';
297
+ import '@solar-icons/react/linear/arrow-right';
298
+ import '@solar-icons/react/linear/arrow-to-top-left';
299
+ import '@solar-icons/react/linear/arrow-to-top-right';
300
+ import '@solar-icons/react/linear/bell';
301
+ import '@solar-icons/react/linear/bolt';
302
+ import '@solar-icons/react/linear/book';
303
+ import '@solar-icons/react/linear/book-2';
304
+ import '@solar-icons/react/linear/bookmark';
305
+ import '@solar-icons/react/linear/bookmark-circle';
306
+ import '@solar-icons/react/linear/box';
307
+ import '@solar-icons/react/linear/branching-paths-up';
308
+ import '@solar-icons/react/linear/bug';
309
+ import '@solar-icons/react/linear/calendar-date';
310
+ import '@solar-icons/react/linear/chat-round';
311
+ import '@solar-icons/react/linear/chat-round-dots';
312
+ import '@solar-icons/react/linear/chat-round-line';
313
+ import '@solar-icons/react/linear/chat-square';
314
+ import '@solar-icons/react/linear/check-circle';
315
+ import '@solar-icons/react/linear/checklist';
316
+ import '@solar-icons/react/linear/clipboard-list';
317
+ import '@solar-icons/react/linear/clock-circle';
318
+ import '@solar-icons/react/linear/compass';
319
+ import '@solar-icons/react/linear/copy';
320
+ import '@solar-icons/react/linear/crown';
321
+ import '@solar-icons/react/linear/danger-triangle';
322
+ import '@solar-icons/react/linear/database';
323
+ import '@solar-icons/react/linear/diskette';
324
+ import '@solar-icons/react/linear/dislike';
325
+ import '@solar-icons/react/linear/document-add';
326
+ import '@solar-icons/react/linear/document-text';
327
+ import '@solar-icons/react/linear/double-alt-arrow-down';
328
+ import '@solar-icons/react/linear/download';
329
+ import '@solar-icons/react/linear/eraser';
330
+ import '@solar-icons/react/linear/eye';
331
+ import '@solar-icons/react/linear/file';
332
+ import '@solar-icons/react/linear/file-remove';
333
+ import '@solar-icons/react/linear/file-text';
334
+ import '@solar-icons/react/linear/filter';
335
+ import '@solar-icons/react/linear/filters';
336
+ import '@solar-icons/react/linear/folder';
337
+ import '@solar-icons/react/linear/folder-open';
338
+ import '@solar-icons/react/linear/folder-path-connect';
339
+ import '@solar-icons/react/linear/forbidden-circle';
340
+ import { GalleryIcon } from '@solar-icons/react/linear/gallery';
341
+ import '@solar-icons/react/linear/gallery-add';
342
+ import '@solar-icons/react/linear/gallery-wide';
343
+ import '@solar-icons/react/linear/global';
344
+ import '@solar-icons/react/linear/graph-down';
345
+ import '@solar-icons/react/linear/graph-up';
346
+ import '@solar-icons/react/linear/hamburger-menu';
347
+ import '@solar-icons/react/linear/hand-heart';
348
+ import '@solar-icons/react/linear/heart';
349
+ import '@solar-icons/react/linear/help';
350
+ import '@solar-icons/react/linear/history';
351
+ import '@solar-icons/react/linear/home-angle';
352
+ import '@solar-icons/react/linear/info-circle';
353
+ import '@solar-icons/react/linear/layers';
354
+ import '@solar-icons/react/linear/letter';
355
+ import '@solar-icons/react/linear/like';
356
+ import '@solar-icons/react/linear/link';
357
+ import '@solar-icons/react/linear/list';
358
+ import '@solar-icons/react/linear/list-vertical';
359
+ import '@solar-icons/react/linear/lock-password';
360
+ import '@solar-icons/react/linear/login-2';
361
+ import '@solar-icons/react/linear/logout';
362
+ import '@solar-icons/react/linear/magic-wand-2';
363
+ import '@solar-icons/react/linear/magnifier';
364
+ import '@solar-icons/react/linear/magnifier-zoom-in';
365
+ import '@solar-icons/react/linear/magnifier-zoom-out';
366
+ import '@solar-icons/react/linear/maximize';
367
+ import '@solar-icons/react/linear/minimize';
368
+ import '@solar-icons/react/linear/minus-square';
369
+ import '@solar-icons/react/linear/monitor';
370
+ import '@solar-icons/react/linear/monitor-smartphone';
371
+ import '@solar-icons/react/linear/moon';
372
+ import '@solar-icons/react/linear/move-to-folder';
373
+ import '@solar-icons/react/linear/music-notes';
374
+ import '@solar-icons/react/linear/palette';
375
+ import '@solar-icons/react/linear/palette-round';
376
+ import '@solar-icons/react/linear/pause';
377
+ import '@solar-icons/react/linear/pen';
378
+ import '@solar-icons/react/linear/pen-new-round';
379
+ import '@solar-icons/react/linear/pie-chart';
380
+ import '@solar-icons/react/linear/pin';
381
+ import '@solar-icons/react/linear/play';
382
+ import '@solar-icons/react/linear/plug-circle';
383
+ import '@solar-icons/react/linear/plus-minus';
384
+ import '@solar-icons/react/linear/pulse';
385
+ import '@solar-icons/react/linear/refresh';
386
+ import { RefreshCircleIcon } from '@solar-icons/react/linear/refresh-circle';
387
+ import '@solar-icons/react/linear/reorder';
388
+ import '@solar-icons/react/linear/repeat';
389
+ import '@solar-icons/react/linear/reply';
390
+ import '@solar-icons/react/linear/restart';
391
+ import '@solar-icons/react/linear/rocket';
392
+ import '@solar-icons/react/linear/route';
393
+ import '@solar-icons/react/linear/scale';
394
+ import '@solar-icons/react/linear/server';
395
+ import '@solar-icons/react/linear/settings';
396
+ import '@solar-icons/react/linear/share';
397
+ import '@solar-icons/react/linear/shield-check';
398
+ import '@solar-icons/react/linear/sidebar-minimalistic';
399
+ import '@solar-icons/react/linear/slider-horizontal';
400
+ import '@solar-icons/react/linear/smartphone';
401
+ import '@solar-icons/react/linear/sort';
402
+ import '@solar-icons/react/linear/sort-by-time';
403
+ import '@solar-icons/react/linear/sort-horizontal';
404
+ import '@solar-icons/react/linear/sort-vertical';
405
+ import '@solar-icons/react/linear/star';
406
+ import '@solar-icons/react/linear/structure';
407
+ import '@solar-icons/react/linear/sun';
408
+ import '@solar-icons/react/linear/tag';
409
+ import '@solar-icons/react/linear/telescope';
410
+ import '@solar-icons/react/linear/test-tube';
411
+ import '@solar-icons/react/linear/text-format';
412
+ import '@solar-icons/react/linear/transfer-horizontal';
413
+ import '@solar-icons/react/linear/translation';
414
+ import '@solar-icons/react/linear/trash-bin-minimalistic';
415
+ import '@solar-icons/react/linear/undo-left';
416
+ import '@solar-icons/react/linear/undo-left-round';
417
+ import '@solar-icons/react/linear/undo-right';
418
+ import '@solar-icons/react/linear/undo-right-round';
419
+ import { UploadIcon } from '@solar-icons/react/linear/upload';
420
+ import '@solar-icons/react/linear/user';
421
+ import '@solar-icons/react/linear/user-id';
422
+ import '@solar-icons/react/linear/user-minus';
423
+ import '@solar-icons/react/linear/user-plus';
424
+ import '@solar-icons/react/linear/users-group-rounded';
425
+ import '@solar-icons/react/linear/users-group-two-rounded';
426
+ import '@solar-icons/react/linear/video-frame';
427
+ import '@solar-icons/react/linear/widget-2';
428
+ import '@solar-icons/react/linear/widget-5';
429
+ import '@solar-icons/react/linear/window-frame';
430
+ import { Toast } from '@base-ui/react/toast';
431
+ import { useTranslation } from 'react-i18next';
432
+ import ReactCrop from 'react-image-crop';
433
+ import 'react-image-crop/dist/ReactCrop.css';
434
+
435
+ // src/lib/utils.ts
436
+ var mergeTheme = {
437
+ text: ["tiny", "ui", "doc", "doc-title", "doc-heading", "quote"],
438
+ spacing: ["chip", "control", "nav", "sidebar", "panel"],
439
+ tracking: ["label"],
440
+ shadow: ["card", "dialog"],
441
+ container: ["reading", "medium", "content"],
442
+ font: ["doc", "heading"],
443
+ ease: ["standard"],
444
+ animate: ["skel", "pop"]
445
+ };
446
+ var twMerge = extendTailwindMerge({
447
+ extend: { theme: mergeTheme }
448
+ });
449
+
450
+ // src/lib/utils.ts
451
+ function cn(...inputs) {
452
+ return twMerge(clsx(inputs));
453
+ }
454
+ var buttonVariants = cva(
455
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg text-ui font-medium whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
456
+ {
457
+ variants: {
458
+ variant: {
459
+ default: "bg-primary px-4! text-primary-foreground hover:bg-primary/80",
460
+ outline: "border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
461
+ secondary: "bg-secondary text-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-foreground",
462
+ ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
463
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
464
+ danger: "bg-[color-mix(in_oklab,var(--destructive),black_12%)] text-white hover:bg-[color-mix(in_oklab,var(--destructive),black_4%)] focus-visible:border-destructive/40 focus-visible:ring-destructive/20 disabled:bg-destructive/10 disabled:text-muted-foreground dark:focus-visible:ring-destructive/40",
465
+ link: "text-primary underline-offset-4 hover:underline"
466
+ },
467
+ size: {
468
+ default: "h-control gap-2 px-3 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
469
+ xs: "h-6 gap-2 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
470
+ sm: "h-chip gap-2 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
471
+ lg: "h-10 gap-2 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
472
+ icon: "size-9",
473
+ "icon-xs": "size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3",
474
+ "icon-sm": "size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md",
475
+ "icon-lg": "size-10"
476
+ }
477
+ },
478
+ defaultVariants: {
479
+ variant: "default",
480
+ size: "default"
481
+ }
482
+ }
483
+ );
484
+ function Button({
485
+ active,
486
+ className,
487
+ variant = "default",
488
+ size = "default",
489
+ ...props
490
+ }) {
491
+ return /* @__PURE__ */ jsx(
492
+ Button$1,
493
+ {
494
+ "data-slot": "button",
495
+ className: cn(
496
+ buttonVariants({ variant, size, className }),
497
+ active && "bg-accent text-accent-foreground hover:bg-accent"
498
+ ),
499
+ ...props
500
+ }
501
+ );
502
+ }
503
+ var DialogFooterActionsContext = createContext(null);
504
+ function useDialogFooterActions() {
505
+ return useContext(DialogFooterActionsContext);
506
+ }
507
+ function DialogFooterActions({ children }) {
508
+ const slot = useDialogFooterActions();
509
+ useEffect(() => {
510
+ if (slot === null) return;
511
+ slot.setFooterActions(children);
512
+ return () => slot.setFooterActions(null);
513
+ }, [slot, children]);
514
+ return null;
515
+ }
516
+ function Label({ className, ...props }) {
517
+ return /* @__PURE__ */ jsx(
518
+ "label",
519
+ {
520
+ "data-slot": "label",
521
+ className: cn(
522
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
523
+ className
524
+ ),
525
+ ...props
526
+ }
527
+ );
528
+ }
529
+ function Switch({
530
+ className,
531
+ size = "default",
532
+ ...props
533
+ }) {
534
+ return /* @__PURE__ */ jsx(
535
+ Switch$1.Root,
536
+ {
537
+ "data-slot": "switch",
538
+ "data-size": size,
539
+ className: cn(
540
+ "peer group/switch relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent shadow-xs transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-5 data-[size=default]:w-9 data-[size=default]:p-[3px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",
541
+ className
542
+ ),
543
+ ...props,
544
+ children: /* @__PURE__ */ jsx(
545
+ Switch$1.Thumb,
546
+ {
547
+ "data-slot": "switch-thumb",
548
+ className: "pointer-events-none block rounded-full bg-background ring-1 ring-foreground/10 transition-transform group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%+2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"
549
+ }
550
+ )
551
+ }
552
+ );
553
+ }
554
+ function readIconMode() {
555
+ return document.documentElement.dataset.iconStyle === "linear" ? "linear" : "boldDuotone";
556
+ }
557
+ var currentMode = "boldDuotone";
558
+ var observer;
559
+ var listeners = /* @__PURE__ */ new Set();
560
+ function ensureObserver() {
561
+ if (observer !== void 0 || typeof document === "undefined") return;
562
+ observer = new MutationObserver(() => {
563
+ const next = readIconMode();
564
+ if (next === currentMode) return;
565
+ currentMode = next;
566
+ for (const cb of listeners) cb();
567
+ });
568
+ observer.observe(document.documentElement, {
569
+ attributes: true,
570
+ attributeFilter: ["data-icon-style"]
571
+ });
572
+ }
573
+ function subscribeIconStyle(callback) {
574
+ ensureObserver();
575
+ currentMode = readIconMode();
576
+ listeners.add(callback);
577
+ return () => {
578
+ listeners.delete(callback);
579
+ };
580
+ }
581
+ function getIconStyleSnapshot() {
582
+ return currentMode;
583
+ }
584
+ function createIcon(variants) {
585
+ function Icon(props) {
586
+ const current = useSyncExternalStore(
587
+ subscribeIconStyle,
588
+ getIconStyleSnapshot,
589
+ () => "boldDuotone"
590
+ );
591
+ const { mode, ...rest } = props;
592
+ const Component = variants[mode ?? current];
593
+ const className = typeof rest.className === "string" ? `hd-icon ${rest.className}` : "hd-icon";
594
+ return createElement(Component, { ...rest, className });
595
+ }
596
+ return Icon;
597
+ }
598
+ var Gallery = createIcon({
599
+ bold: GalleryIcon$2,
600
+ boldDuotone: GalleryIcon$1,
601
+ linear: GalleryIcon
602
+ });
603
+ var RefreshCircle = createIcon({
604
+ bold: RefreshCircleIcon$2,
605
+ boldDuotone: RefreshCircleIcon$1,
606
+ linear: RefreshCircleIcon
607
+ });
608
+ var Upload = createIcon({
609
+ bold: UploadIcon$2,
610
+ boldDuotone: UploadIcon$1,
611
+ linear: UploadIcon
612
+ });
613
+ var toast = Toast.createToastManager();
614
+ Toast.createToastManager;
615
+ Toast.useToastManager;
616
+ function ImageCropper(props) {
617
+ const {
618
+ src,
619
+ aspect,
620
+ mimeType = "image/png",
621
+ quality = 0.92,
622
+ displayMaxWidth,
623
+ displayMaxHeight = "70vh"
624
+ } = props;
625
+ const imgRef = useRef(null);
626
+ const [crop, setCrop] = useState(void 0);
627
+ const [completed, setCompleted] = useState(void 0);
628
+ const handleImageLoad = useCallback(
629
+ (e) => {
630
+ const { naturalWidth, naturalHeight } = e.currentTarget;
631
+ const initial = buildInitialCrop(naturalWidth, naturalHeight, aspect);
632
+ setCrop(initial);
633
+ setCompleted(initial);
634
+ },
635
+ [aspect]
636
+ );
637
+ const onCropReady = props.onCropReady;
638
+ const onPreviewChange = props.onPreviewChange;
639
+ useEffect(() => {
640
+ const img = imgRef.current;
641
+ if (img === null || completed === void 0 || completed.width === 0) {
642
+ return;
643
+ }
644
+ onCropReady(() => renderCroppedImage(img, completed, mimeType, quality));
645
+ if (onPreviewChange !== void 0) {
646
+ onPreviewChange(renderPreviewDataUrl(img, completed));
647
+ }
648
+ }, [completed, mimeType, quality, onCropReady, onPreviewChange]);
649
+ return /* @__PURE__ */ jsx("div", { className: "react-crop-theme flex min-h-0 w-full max-w-full flex-col items-center gap-2 overflow-hidden", children: /* @__PURE__ */ jsx(
650
+ ReactCrop,
651
+ {
652
+ className: "max-w-full",
653
+ crop,
654
+ onChange: (_, percentCrop) => setCrop(percentCrop),
655
+ onComplete: (_, percentCrop) => setCompleted(percentCrop),
656
+ aspect,
657
+ keepSelection: true,
658
+ ruleOfThirds: true,
659
+ children: /* @__PURE__ */ jsx(
660
+ "img",
661
+ {
662
+ ref: imgRef,
663
+ src,
664
+ onLoad: handleImageLoad,
665
+ className: "h-auto max-w-full",
666
+ style: {
667
+ maxWidth: displayMaxWidth,
668
+ maxHeight: displayMaxHeight
669
+ }
670
+ }
671
+ )
672
+ }
673
+ ) });
674
+ }
675
+ function buildInitialCrop(imgWidth, imgHeight, aspect) {
676
+ if (aspect === void 0) {
677
+ return { unit: "%", x: 0, y: 0, width: 100, height: 100 };
678
+ }
679
+ const imgAspect = imgWidth / imgHeight;
680
+ let widthPct;
681
+ let heightPct;
682
+ if (imgAspect >= aspect) {
683
+ heightPct = 100;
684
+ widthPct = 100 * aspect / imgAspect;
685
+ } else {
686
+ widthPct = 100;
687
+ heightPct = 100 * imgAspect / aspect;
688
+ }
689
+ return {
690
+ unit: "%",
691
+ x: (100 - widthPct) / 2,
692
+ y: (100 - heightPct) / 2,
693
+ width: widthPct,
694
+ height: heightPct
695
+ };
696
+ }
697
+ var CroppedImageRenderError = class extends Error {
698
+ constructor(message) {
699
+ super(message);
700
+ this.name = "CroppedImageRenderError";
701
+ }
702
+ };
703
+ async function renderCroppedImage(image, crop, mimeType, quality) {
704
+ const sourceRect = cropToNaturalRect(image, crop);
705
+ const canvas = document.createElement("canvas");
706
+ canvas.width = sourceRect.sw;
707
+ canvas.height = sourceRect.sh;
708
+ const ctx = canvas.getContext("2d");
709
+ if (ctx === null) {
710
+ throw new CroppedImageRenderError("2d context is unavailable");
711
+ }
712
+ ctx.imageSmoothingQuality = "high";
713
+ ctx.drawImage(
714
+ image,
715
+ sourceRect.sx,
716
+ sourceRect.sy,
717
+ sourceRect.sw,
718
+ sourceRect.sh,
719
+ 0,
720
+ 0,
721
+ sourceRect.sw,
722
+ sourceRect.sh
723
+ );
724
+ const blob = await new Promise((resolve) => {
725
+ canvas.toBlob(resolve, mimeType, quality);
726
+ });
727
+ if (blob === null) {
728
+ throw new CroppedImageRenderError("toBlob returned null");
729
+ }
730
+ return { blob, width: sourceRect.sw, height: sourceRect.sh, mimeType };
731
+ }
732
+ function renderPreviewDataUrl(image, crop) {
733
+ const sourceRect = cropToNaturalRect(image, crop);
734
+ const canvas = document.createElement("canvas");
735
+ canvas.width = sourceRect.sw;
736
+ canvas.height = sourceRect.sh;
737
+ const ctx = canvas.getContext("2d", { alpha: true });
738
+ if (ctx === null) return "";
739
+ ctx.imageSmoothingQuality = "high";
740
+ ctx.drawImage(
741
+ image,
742
+ sourceRect.sx,
743
+ sourceRect.sy,
744
+ sourceRect.sw,
745
+ sourceRect.sh,
746
+ 0,
747
+ 0,
748
+ sourceRect.sw,
749
+ sourceRect.sh
750
+ );
751
+ return canvas.toDataURL("image/png");
752
+ }
753
+ function cropToNaturalRect(image, crop) {
754
+ const naturalWidth = image.naturalWidth;
755
+ const naturalHeight = image.naturalHeight;
756
+ if (crop.unit === "px") {
757
+ return {
758
+ sx: crop.x,
759
+ sy: crop.y,
760
+ sw: Math.max(1, Math.round(crop.width)),
761
+ sh: Math.max(1, Math.round(crop.height))
762
+ };
763
+ }
764
+ const sx = crop.x / 100 * naturalWidth;
765
+ const sy = crop.y / 100 * naturalHeight;
766
+ const swRaw = crop.width / 100 * naturalWidth;
767
+ const shRaw = crop.height / 100 * naturalHeight;
768
+ const sw = Math.max(1, Math.round(swRaw));
769
+ const sh = Math.max(1, Math.round(shRaw));
770
+ return { sx, sy, sw, sh };
771
+ }
772
+ function ImageCropPanel(props) {
773
+ const {
774
+ aspect,
775
+ mimeType = "image/png",
776
+ accept = "image/*",
777
+ previewShape = "square",
778
+ previewWidth: previewWidthProp,
779
+ previewHeight: previewHeightProp,
780
+ onSave,
781
+ onSaved,
782
+ onClear,
783
+ initialSrc,
784
+ allowChangeSource = true,
785
+ onSavingChange,
786
+ cropStageWidth,
787
+ cropStageHeight,
788
+ showPreviewSwitch = false,
789
+ hidePreview = false,
790
+ fillWidth = false,
791
+ panelClassName,
792
+ containerClassName,
793
+ cropColumnClassName,
794
+ cropStageClassName,
795
+ hideActionButton = false,
796
+ autoSaveOnCrop = false
797
+ } = props;
798
+ const { t } = useTranslation("ui", { useSuspense: false });
799
+ const footerSlot = useDialogFooterActions();
800
+ const previewWidth = previewWidthProp ?? cropStageWidth ?? 200;
801
+ const previewHeight = previewHeightProp ?? cropStageHeight ?? 200;
802
+ const effectiveCropWidth = cropStageWidth ?? 320;
803
+ const effectiveCropHeight = cropStageHeight ?? 240;
804
+ const stageAspectRatio = fillWidth && cropStageWidth !== void 0 && cropStageHeight !== void 0 ? `${cropStageWidth} / ${cropStageHeight}` : void 0;
805
+ const previewToggleId = useId();
806
+ const fileInputRef = useRef(null);
807
+ const [imageSrc, setImageSrc] = useState(initialSrc);
808
+ const renderRef = useRef(void 0);
809
+ const [previewDataUrl, setPreviewDataUrl] = useState(
810
+ void 0
811
+ );
812
+ const [previewPaneOn, setPreviewPaneOn] = useState(false);
813
+ const [dragOver, setDragOver] = useState(false);
814
+ const [saving, setSaving] = useState(false);
815
+ const previewVisible = !hidePreview && (!showPreviewSwitch || previewPaneOn);
816
+ const autoSaveTimerRef = useRef(
817
+ void 0
818
+ );
819
+ const callbacksRef = useRef({ onSave, onSaved, onSavingChange, t });
820
+ callbacksRef.current = { onSave, onSaved, onSavingChange, t };
821
+ useEffect(
822
+ function syncInitialSrc() {
823
+ if (initialSrc !== void 0) setImageSrc(initialSrc);
824
+ },
825
+ [initialSrc]
826
+ );
827
+ const handleCropReady = useCallback(
828
+ (render) => {
829
+ renderRef.current = render;
830
+ if (autoSaveOnCrop) {
831
+ if (autoSaveTimerRef.current) {
832
+ clearTimeout(autoSaveTimerRef.current);
833
+ }
834
+ autoSaveTimerRef.current = setTimeout(() => {
835
+ render().then(async (cropped) => {
836
+ const { onSave: onSave2, onSaved: onSaved2, onSavingChange: onSavingChange2, t: t2 } = callbacksRef.current;
837
+ try {
838
+ setSaving(true);
839
+ onSavingChange2?.(true);
840
+ await onSave2(cropped);
841
+ onSaved2?.();
842
+ } catch (err) {
843
+ const msg = err instanceof Error ? err.message : String(err);
844
+ toast.add({
845
+ title: msg || t2("imageCrop.saveFailed"),
846
+ type: "error"
847
+ });
848
+ } finally {
849
+ setSaving(false);
850
+ onSavingChange2?.(false);
851
+ }
852
+ }).catch((err) => {
853
+ const { t: t2 } = callbacksRef.current;
854
+ const msg = err instanceof Error ? err.message : String(err);
855
+ toast.add({
856
+ title: msg || t2("imageCrop.saveFailed"),
857
+ type: "error"
858
+ });
859
+ });
860
+ }, 600);
861
+ }
862
+ },
863
+ [autoSaveOnCrop]
864
+ );
865
+ const handlePreviewChange = useCallback((dataUrl) => {
866
+ setPreviewDataUrl(dataUrl);
867
+ }, []);
868
+ function handlePreviewToggle(on) {
869
+ setPreviewPaneOn(on);
870
+ if (!on) setPreviewDataUrl(void 0);
871
+ }
872
+ function handleFileChange(e) {
873
+ const file = e.target.files?.[0];
874
+ if (file === void 0) return;
875
+ readFileAsDataUrl(file);
876
+ }
877
+ function handleDrop(e) {
878
+ e.preventDefault();
879
+ setDragOver(false);
880
+ const file = e.dataTransfer.files?.[0];
881
+ if (file !== void 0) readFileAsDataUrl(file);
882
+ }
883
+ function readFileAsDataUrl(file) {
884
+ const reader = new FileReader();
885
+ reader.addEventListener("load", () => {
886
+ const result = reader.result;
887
+ if (typeof result === "string") setImageSrc(result);
888
+ });
889
+ reader.readAsDataURL(file);
890
+ }
891
+ function handleReselect() {
892
+ if (autoSaveTimerRef.current) {
893
+ clearTimeout(autoSaveTimerRef.current);
894
+ autoSaveTimerRef.current = void 0;
895
+ }
896
+ setImageSrc(void 0);
897
+ renderRef.current = void 0;
898
+ setPreviewDataUrl(void 0);
899
+ setPreviewPaneOn(false);
900
+ fileInputRef.current?.click();
901
+ }
902
+ async function handleSave() {
903
+ const render = renderRef.current;
904
+ if (render === void 0) {
905
+ onClear?.();
906
+ return;
907
+ }
908
+ setSaving(true);
909
+ onSavingChange?.(true);
910
+ try {
911
+ const cropped = await render();
912
+ await onSave(cropped);
913
+ onSaved?.();
914
+ } catch (err) {
915
+ const msg = err instanceof Error ? err.message : String(err);
916
+ toast.add({
917
+ title: msg || t("imageCrop.saveFailed"),
918
+ type: "error"
919
+ });
920
+ } finally {
921
+ setSaving(false);
922
+ onSavingChange?.(false);
923
+ }
924
+ }
925
+ const previewRadiusClass = previewShape === "circle" ? "rounded-full" : "rounded";
926
+ const actionButton = /* @__PURE__ */ jsx(
927
+ Button,
928
+ {
929
+ type: "button",
930
+ onClick: handleSave,
931
+ disabled: saving,
932
+ "data-testid": "image-crop-save",
933
+ children: saving ? t("imageCrop.saving") : imageSrc === void 0 ? t("imageCrop.remove") : t("imageCrop.save")
934
+ }
935
+ );
936
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-4", panelClassName), children: [
937
+ allowChangeSource ? /* @__PURE__ */ jsx(
938
+ "input",
939
+ {
940
+ ref: fileInputRef,
941
+ type: "file",
942
+ accept,
943
+ className: "hidden",
944
+ onChange: handleFileChange,
945
+ "data-testid": "image-crop-file-input"
946
+ }
947
+ ) : null,
948
+ /* @__PURE__ */ jsxs(
949
+ "div",
950
+ {
951
+ className: cn(
952
+ "flex flex-col items-center gap-6 py-2 sm:flex-row sm:items-center sm:justify-center",
953
+ containerClassName
954
+ ),
955
+ children: [
956
+ /* @__PURE__ */ jsxs(
957
+ "div",
958
+ {
959
+ className: cn(
960
+ "flex flex-col items-center gap-2",
961
+ stageAspectRatio !== void 0 && "w-full",
962
+ cropColumnClassName
963
+ ),
964
+ children: [
965
+ imageSrc === void 0 ? allowChangeSource ? /* @__PURE__ */ jsxs(
966
+ "button",
967
+ {
968
+ type: "button",
969
+ onClick: () => fileInputRef.current?.click(),
970
+ onDragOver: (e) => {
971
+ e.preventDefault();
972
+ setDragOver(true);
973
+ },
974
+ onDragLeave: () => setDragOver(false),
975
+ onDrop: handleDrop,
976
+ className: cn(
977
+ "flex select-none flex-col items-center justify-center gap-2 rounded-md border border-border bg-muted text-muted-foreground transition-colors duration-300 hover:bg-accent hover:text-accent-foreground",
978
+ dragOver && "bg-accent text-accent-foreground",
979
+ stageAspectRatio !== void 0 && "w-full"
980
+ ),
981
+ "data-testid": "image-crop-frame",
982
+ style: stageAspectRatio !== void 0 ? { aspectRatio: stageAspectRatio } : {
983
+ width: cropStageWidth ?? 240,
984
+ height: cropStageHeight ?? 240
985
+ },
986
+ children: [
987
+ /* @__PURE__ */ jsx(Upload, { className: "size-5" }),
988
+ /* @__PURE__ */ jsx("p", { className: "text-sm", children: t("imageCrop.pickHint") })
989
+ ]
990
+ }
991
+ ) : /* @__PURE__ */ jsx(
992
+ "div",
993
+ {
994
+ className: cn(
995
+ "flex items-center justify-center rounded-md border border-dashed border-border text-sm text-muted-foreground",
996
+ stageAspectRatio !== void 0 && "w-full"
997
+ ),
998
+ style: stageAspectRatio !== void 0 ? { aspectRatio: stageAspectRatio } : {
999
+ width: cropStageWidth ?? 240,
1000
+ height: cropStageHeight ?? 240
1001
+ },
1002
+ children: t("imageCrop.pickHint")
1003
+ }
1004
+ ) : /* @__PURE__ */ jsx(
1005
+ "div",
1006
+ {
1007
+ className: cn(
1008
+ "flex min-h-0 items-center justify-center overflow-hidden rounded-md border border-border bg-card",
1009
+ stageAspectRatio === void 0 && "max-w-90",
1010
+ cropStageClassName,
1011
+ stageAspectRatio !== void 0 && "w-full"
1012
+ ),
1013
+ style: stageAspectRatio !== void 0 ? { aspectRatio: stageAspectRatio } : {
1014
+ minHeight: `${cropStageHeight}px`,
1015
+ minWidth: `${cropStageWidth}px`,
1016
+ width: effectiveCropWidth,
1017
+ height: effectiveCropHeight,
1018
+ maxWidth: effectiveCropWidth,
1019
+ maxHeight: effectiveCropHeight
1020
+ },
1021
+ children: /* @__PURE__ */ jsx(
1022
+ ImageCropper,
1023
+ {
1024
+ src: imageSrc,
1025
+ aspect,
1026
+ mimeType,
1027
+ displayMaxWidth: stageAspectRatio !== void 0 ? "100%" : effectiveCropWidth,
1028
+ displayMaxHeight: stageAspectRatio !== void 0 ? void 0 : effectiveCropHeight,
1029
+ onCropReady: handleCropReady,
1030
+ onPreviewChange: previewVisible ? handlePreviewChange : void 0
1031
+ }
1032
+ )
1033
+ }
1034
+ ),
1035
+ imageSrc !== void 0 && allowChangeSource ? /* @__PURE__ */ jsxs(
1036
+ Button,
1037
+ {
1038
+ type: "button",
1039
+ size: "sm",
1040
+ variant: "ghost",
1041
+ onClick: handleReselect,
1042
+ className: "text-muted-foreground text-xs",
1043
+ children: [
1044
+ /* @__PURE__ */ jsx(RefreshCircle, { className: "mr-1 h-3.5 w-3.5" }),
1045
+ t("imageCrop.reselect")
1046
+ ]
1047
+ }
1048
+ ) : null
1049
+ ]
1050
+ }
1051
+ ),
1052
+ previewVisible ? /* @__PURE__ */ jsxs(Fragment, { children: [
1053
+ /* @__PURE__ */ jsx("div", { className: cn("hidden w-px bg-border sm:block h-40") }),
1054
+ /* @__PURE__ */ jsx("div", { className: cn("block bg-border sm:hidden h-px w-32") }),
1055
+ /* @__PURE__ */ jsx("div", { className: cn("flex shrink-0 flex-col items-center gap-1.5"), children: /* @__PURE__ */ jsx(
1056
+ "div",
1057
+ {
1058
+ style: { width: previewWidth, height: previewHeight },
1059
+ className: cn(
1060
+ "flex items-center justify-center overflow-hidden border border-border bg-muted text-muted-foreground",
1061
+ previewRadiusClass
1062
+ ),
1063
+ "data-testid": "image-crop-preview",
1064
+ title: t("imageCrop.previewLabel"),
1065
+ children: previewDataUrl !== void 0 ? /* @__PURE__ */ jsx(
1066
+ "img",
1067
+ {
1068
+ src: previewDataUrl,
1069
+ alt: t("imageCrop.previewAlt"),
1070
+ className: "max-h-full max-w-full object-cover"
1071
+ }
1072
+ ) : /* @__PURE__ */ jsx(Gallery, { className: "h-10 w-10 opacity-60" })
1073
+ }
1074
+ ) })
1075
+ ] }) : null
1076
+ ]
1077
+ }
1078
+ ),
1079
+ showPreviewSwitch && imageSrc !== void 0 ? /* @__PURE__ */ jsxs("div", { className: cn("flex items-center justify-center gap-2"), children: [
1080
+ /* @__PURE__ */ jsx(
1081
+ Switch,
1082
+ {
1083
+ id: previewToggleId,
1084
+ checked: previewPaneOn,
1085
+ onCheckedChange: handlePreviewToggle,
1086
+ "data-testid": "image-crop-preview-toggle"
1087
+ }
1088
+ ),
1089
+ /* @__PURE__ */ jsx(
1090
+ Label,
1091
+ {
1092
+ htmlFor: previewToggleId,
1093
+ className: "text-muted-foreground cursor-pointer text-sm font-normal",
1094
+ children: t("imageCrop.showPreview")
1095
+ }
1096
+ )
1097
+ ] }) : null,
1098
+ !hideActionButton && (footerSlot === null ? /* @__PURE__ */ jsx("div", { className: cn("flex justify-end pt-2"), children: actionButton }) : /* @__PURE__ */ jsx(DialogFooterActions, { children: actionButton }))
1099
+ ] });
1100
+ }
1101
+
1102
+ export { ImageCropPanel };
1103
+ //# sourceMappingURL=image-crop-panel.js.map
1104
+ //# sourceMappingURL=image-crop-panel.js.map