@giddaa-housing/ui 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/README.md +18 -6
  2. package/css/base.css +37 -0
  3. package/css/components.css +135 -0
  4. package/css/generated/shared.css +1 -0
  5. package/css/giddaa.css +402 -0
  6. package/css/preset.css +77 -0
  7. package/css/styles.css +2 -0
  8. package/css/theme.css +255 -0
  9. package/dist/accordion.js +5 -35
  10. package/dist/accordion.js.map +1 -1
  11. package/dist/activity-timeline.d.ts +33 -0
  12. package/dist/activity-timeline.js +212 -0
  13. package/dist/activity-timeline.js.map +1 -0
  14. package/dist/alert.js +5 -35
  15. package/dist/alert.js.map +1 -1
  16. package/dist/auth-layout.d.ts +23 -0
  17. package/dist/auth-layout.js +304 -0
  18. package/dist/auth-layout.js.map +1 -0
  19. package/dist/avatar.js +10 -142
  20. package/dist/avatar.js.map +1 -1
  21. package/dist/badge.d.ts +3 -2
  22. package/dist/badge.js +6 -114
  23. package/dist/badge.js.map +1 -1
  24. package/dist/bar-chart.d.ts +101 -77
  25. package/dist/bar-chart.js +142 -220
  26. package/dist/bar-chart.js.map +1 -1
  27. package/dist/breadcrumb.js +5 -35
  28. package/dist/breadcrumb.js.map +1 -1
  29. package/dist/bullet-chart.js +15 -48
  30. package/dist/bullet-chart.js.map +1 -1
  31. package/dist/button-group.js +14 -90
  32. package/dist/button-group.js.map +1 -1
  33. package/dist/button.d.ts +5 -5
  34. package/dist/button.js +7 -140
  35. package/dist/button.js.map +1 -1
  36. package/dist/calendar.js +12 -287
  37. package/dist/calendar.js.map +1 -1
  38. package/dist/card.js +5 -35
  39. package/dist/card.js.map +1 -1
  40. package/dist/carousel.js +12 -386
  41. package/dist/carousel.js.map +1 -1
  42. package/dist/chart.js +16 -480
  43. package/dist/chart.js.map +1 -1
  44. package/dist/checkbox.d.ts +1 -1
  45. package/dist/checkbox.js +13 -48
  46. package/dist/checkbox.js.map +1 -1
  47. package/dist/chunk-322YCNVL.js +278 -0
  48. package/dist/chunk-322YCNVL.js.map +1 -0
  49. package/dist/chunk-3ACQVT7A.js +25 -0
  50. package/dist/chunk-3ACQVT7A.js.map +1 -0
  51. package/dist/chunk-3T65TLJX.js +334 -0
  52. package/dist/chunk-3T65TLJX.js.map +1 -0
  53. package/dist/chunk-6ZSGQHH2.js +192 -0
  54. package/dist/chunk-6ZSGQHH2.js.map +1 -0
  55. package/dist/chunk-7TBMLFGW.js +41 -0
  56. package/dist/chunk-7TBMLFGW.js.map +1 -0
  57. package/dist/chunk-B4H6RNDH.js +135 -0
  58. package/dist/chunk-B4H6RNDH.js.map +1 -0
  59. package/dist/chunk-BUXCGZ6X.js +219 -0
  60. package/dist/chunk-BUXCGZ6X.js.map +1 -0
  61. package/dist/chunk-CHII2QHH.js +58 -0
  62. package/dist/chunk-CHII2QHH.js.map +1 -0
  63. package/dist/chunk-DMNOXRRW.js +147 -0
  64. package/dist/chunk-DMNOXRRW.js.map +1 -0
  65. package/dist/chunk-EFSOSSIC.js +130 -0
  66. package/dist/chunk-EFSOSSIC.js.map +1 -0
  67. package/dist/chunk-FZDSVMKY.js +363 -0
  68. package/dist/chunk-FZDSVMKY.js.map +1 -0
  69. package/dist/chunk-GJOFIJS3.js +246 -0
  70. package/dist/chunk-GJOFIJS3.js.map +1 -0
  71. package/dist/chunk-HL3ZSYES.js +23 -0
  72. package/dist/chunk-HL3ZSYES.js.map +1 -0
  73. package/dist/chunk-JVLUBAPB.js +129 -0
  74. package/dist/chunk-JVLUBAPB.js.map +1 -0
  75. package/dist/chunk-KDPYSOYZ.js +64 -0
  76. package/dist/chunk-KDPYSOYZ.js.map +1 -0
  77. package/dist/chunk-KSMDANKI.js +43 -0
  78. package/dist/chunk-KSMDANKI.js.map +1 -0
  79. package/dist/chunk-MEKCCOP5.js +46 -0
  80. package/dist/chunk-MEKCCOP5.js.map +1 -0
  81. package/dist/chunk-NOFXVRWL.js +451 -0
  82. package/dist/chunk-NOFXVRWL.js.map +1 -0
  83. package/dist/chunk-PC5MHNVA.js +171 -0
  84. package/dist/chunk-PC5MHNVA.js.map +1 -0
  85. package/dist/chunk-QKAQZ2GU.js +122 -0
  86. package/dist/chunk-QKAQZ2GU.js.map +1 -0
  87. package/dist/chunk-QZHSHSVV.js +26 -0
  88. package/dist/chunk-QZHSHSVV.js.map +1 -0
  89. package/dist/chunk-RBMK26XD.js +19 -0
  90. package/dist/chunk-RBMK26XD.js.map +1 -0
  91. package/dist/chunk-SFNJGF6M.js +262 -0
  92. package/dist/chunk-SFNJGF6M.js.map +1 -0
  93. package/dist/chunk-UJJNLGTM.js +112 -0
  94. package/dist/chunk-UJJNLGTM.js.map +1 -0
  95. package/dist/chunk-VGR4ZWJ3.js +418 -0
  96. package/dist/chunk-VGR4ZWJ3.js.map +1 -0
  97. package/dist/chunk-XG47P6D4.js +99 -0
  98. package/dist/chunk-XG47P6D4.js.map +1 -0
  99. package/dist/chunk-XZZAHNVM.js +21 -0
  100. package/dist/chunk-XZZAHNVM.js.map +1 -0
  101. package/dist/chunk-Y4TTYVNE.js +36 -0
  102. package/dist/chunk-Y4TTYVNE.js.map +1 -0
  103. package/dist/chunk-YDWIHW6Q.js +69 -0
  104. package/dist/chunk-YDWIHW6Q.js.map +1 -0
  105. package/dist/collapsible.js +6 -35
  106. package/dist/collapsible.js.map +1 -1
  107. package/dist/combobox.js +26 -694
  108. package/dist/combobox.js.map +1 -1
  109. package/dist/cta.d.ts +66 -0
  110. package/dist/cta.js +358 -0
  111. package/dist/cta.js.map +1 -0
  112. package/dist/currency-selector.d.ts +42 -0
  113. package/dist/currency-selector.js +192 -0
  114. package/dist/currency-selector.js.map +1 -0
  115. package/dist/date-picker.d.ts +18 -10
  116. package/dist/date-picker.js +105 -430
  117. package/dist/date-picker.js.map +1 -1
  118. package/dist/details-card.d.ts +19 -0
  119. package/dist/details-card.js +267 -0
  120. package/dist/details-card.js.map +1 -0
  121. package/dist/dialog.js +36 -146
  122. package/dist/dialog.js.map +1 -1
  123. package/dist/dropdown-menu.d.ts +1 -1
  124. package/dist/dropdown-menu.js +20 -358
  125. package/dist/dropdown-menu.js.map +1 -1
  126. package/dist/dropzone.js +13 -40
  127. package/dist/dropzone.js.map +1 -1
  128. package/dist/editorial-card.d.ts +29 -0
  129. package/dist/editorial-card.js +311 -0
  130. package/dist/editorial-card.js.map +1 -0
  131. package/dist/empty-state.js +5 -35
  132. package/dist/empty-state.js.map +1 -1
  133. package/dist/field.js +30 -135
  134. package/dist/field.js.map +1 -1
  135. package/dist/footer.d.ts +47 -0
  136. package/dist/footer.js +430 -0
  137. package/dist/footer.js.map +1 -0
  138. package/dist/funnel-chart.js +42 -415
  139. package/dist/funnel-chart.js.map +1 -1
  140. package/dist/gallery-indicator.d.ts +18 -0
  141. package/dist/gallery-indicator.js +12 -0
  142. package/dist/gallery-indicator.js.map +1 -0
  143. package/dist/heatmap-chart.d.ts +98 -0
  144. package/dist/heatmap-chart.js +248 -0
  145. package/dist/heatmap-chart.js.map +1 -0
  146. package/dist/infotip.d.ts +11 -0
  147. package/dist/infotip.js +66 -0
  148. package/dist/infotip.js.map +1 -0
  149. package/dist/input-group.d.ts +2 -1
  150. package/dist/input-group.js +15 -371
  151. package/dist/input-group.js.map +1 -1
  152. package/dist/input-size-context.js +5 -19
  153. package/dist/input-size-context.js.map +1 -1
  154. package/dist/input.js +6 -78
  155. package/dist/input.js.map +1 -1
  156. package/dist/item.js +5 -35
  157. package/dist/item.js.map +1 -1
  158. package/dist/kpi-card.js +12 -52
  159. package/dist/kpi-card.js.map +1 -1
  160. package/dist/label.js +5 -64
  161. package/dist/label.js.map +1 -1
  162. package/dist/line-chart.js +9 -166
  163. package/dist/line-chart.js.map +1 -1
  164. package/dist/logo.js +4 -141
  165. package/dist/logo.js.map +1 -1
  166. package/dist/map-indicator.d.ts +13 -0
  167. package/dist/map-indicator.js +109 -0
  168. package/dist/map-indicator.js.map +1 -0
  169. package/dist/match.d.ts +16 -0
  170. package/dist/match.js +113 -0
  171. package/dist/match.js.map +1 -0
  172. package/dist/media-gallery-hero.d.ts +60 -0
  173. package/dist/media-gallery-hero.js +362 -0
  174. package/dist/media-gallery-hero.js.map +1 -0
  175. package/dist/media-player.d.ts +60 -0
  176. package/dist/media-player.js +1394 -0
  177. package/dist/media-player.js.map +1 -0
  178. package/dist/number-input.js +30 -325
  179. package/dist/number-input.js.map +1 -1
  180. package/dist/page-header.js +4 -32
  181. package/dist/page-header.js.map +1 -1
  182. package/dist/pagination.d.ts +1 -0
  183. package/dist/pagination.js +27 -161
  184. package/dist/pagination.js.map +1 -1
  185. package/dist/password-input.d.ts +1 -0
  186. package/dist/password-input.js +21 -319
  187. package/dist/password-input.js.map +1 -1
  188. package/dist/phone-input.d.ts +2 -1
  189. package/dist/phone-input.js +148 -359
  190. package/dist/phone-input.js.map +1 -1
  191. package/dist/photo-gallery.d.ts +1 -1
  192. package/dist/photo-gallery.js +97 -393
  193. package/dist/photo-gallery.js.map +1 -1
  194. package/dist/pie-chart.js +17 -52
  195. package/dist/pie-chart.js.map +1 -1
  196. package/dist/popover.js +13 -158
  197. package/dist/popover.js.map +1 -1
  198. package/dist/price-tag.d.ts +35 -0
  199. package/dist/price-tag.js +178 -0
  200. package/dist/price-tag.js.map +1 -0
  201. package/dist/progress.d.ts +5 -2
  202. package/dist/progress.js +14 -303
  203. package/dist/progress.js.map +1 -1
  204. package/dist/property-listing-card.d.ts +32 -0
  205. package/dist/property-listing-card.js +235 -0
  206. package/dist/property-listing-card.js.map +1 -0
  207. package/dist/radar-chart.d.ts +110 -0
  208. package/dist/radar-chart.js +147 -0
  209. package/dist/radar-chart.js.map +1 -0
  210. package/dist/radio-group.js +15 -50
  211. package/dist/radio-group.js.map +1 -1
  212. package/dist/review-block.d.ts +20 -0
  213. package/dist/review-block.js +10 -0
  214. package/dist/review-block.js.map +1 -0
  215. package/dist/rich-text-editor.js +172 -433
  216. package/dist/rich-text-editor.js.map +1 -1
  217. package/dist/scatter-chart.d.ts +142 -0
  218. package/dist/scatter-chart.js +252 -0
  219. package/dist/scatter-chart.js.map +1 -0
  220. package/dist/search-input.d.ts +1 -0
  221. package/dist/search-input.js +22 -320
  222. package/dist/search-input.js.map +1 -1
  223. package/dist/select.js +15 -292
  224. package/dist/select.js.map +1 -1
  225. package/dist/separator.js +5 -68
  226. package/dist/separator.js.map +1 -1
  227. package/dist/sheet.js +14 -271
  228. package/dist/sheet.js.map +1 -1
  229. package/dist/sidebar.d.ts +1 -1
  230. package/dist/sidebar.js +89 -494
  231. package/dist/sidebar.js.map +1 -1
  232. package/dist/size-context.js +5 -17
  233. package/dist/size-context.js.map +1 -1
  234. package/dist/skeleton.js +4 -44
  235. package/dist/skeleton.js.map +1 -1
  236. package/dist/slider.d.ts +28 -0
  237. package/dist/slider.js +152 -0
  238. package/dist/slider.js.map +1 -0
  239. package/dist/sparkline.js +33 -341
  240. package/dist/sparkline.js.map +1 -1
  241. package/dist/stepper.js +5 -35
  242. package/dist/stepper.js.map +1 -1
  243. package/dist/styles.css +9593 -2
  244. package/dist/switch.js +13 -48
  245. package/dist/switch.js.map +1 -1
  246. package/dist/tab-list.js +35 -306
  247. package/dist/tab-list.js.map +1 -1
  248. package/dist/table.js +5 -32
  249. package/dist/table.js.map +1 -1
  250. package/dist/tabs.js +10 -150
  251. package/dist/tabs.js.map +1 -1
  252. package/dist/tag.d.ts +7 -6
  253. package/dist/tag.js +101 -97
  254. package/dist/tag.js.map +1 -1
  255. package/dist/testimonial-block.d.ts +34 -0
  256. package/dist/testimonial-block.js +377 -0
  257. package/dist/testimonial-block.js.map +1 -0
  258. package/dist/textarea.js +6 -73
  259. package/dist/textarea.js.map +1 -1
  260. package/dist/time-picker.js +119 -279
  261. package/dist/time-picker.js.map +1 -1
  262. package/dist/toast.js +27 -132
  263. package/dist/toast.js.map +1 -1
  264. package/dist/tooltip.d.ts +5 -5
  265. package/dist/tooltip.js +7 -90
  266. package/dist/tooltip.js.map +1 -1
  267. package/dist/tree-map.js +41 -414
  268. package/dist/tree-map.js.map +1 -1
  269. package/dist/waterfall-chart.d.ts +129 -0
  270. package/dist/waterfall-chart.js +577 -0
  271. package/dist/waterfall-chart.js.map +1 -0
  272. package/package.json +98 -28
  273. package/dist/base.css +0 -32
  274. package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
  275. package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
  276. package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
  277. package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
  278. package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
  279. package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
  280. package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
  281. package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
  282. package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
  283. package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
  284. package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
  285. package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
  286. package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
  287. package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
  288. package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
  289. package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
  290. package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
  291. package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
  292. package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
  293. package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
  294. package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
  295. package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
  296. package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
  297. package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
  298. package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
  299. package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
  300. package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
  301. package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
  302. package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
  303. package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
  304. package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
  305. package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
  306. package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
  307. package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
  308. package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
  309. package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
  310. package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
  311. package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
  312. package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
  313. package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
  314. package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
  315. package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
  316. package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
  317. package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
  318. package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
  319. package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
  320. package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
  321. package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
  322. package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
  323. package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
  324. package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
  325. package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
  326. package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
  327. package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
  328. package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
  329. package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
  330. package/dist/index.d.ts +0 -87
  331. package/dist/index.js +0 -10448
  332. package/dist/index.js.map +0 -1
  333. package/dist/red-hat-display.css +0 -2
  334. package/dist/theme/giddaa.css +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/dropzone.tsx","../src/lib/cn.ts","../src/lib/use-file-picker.ts"],"sourcesContent":["\"use client\";\n\nimport { UploadCloud } from \"lucide-react\";\nimport {\n\ttype ComponentProps,\n\tcreateContext,\n\ttype KeyboardEvent,\n\ttype ReactNode,\n\tuse,\n} from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport {\n\ttype UseFilePickerOptions,\n\ttype UseFilePickerReturn,\n\tuseFilePicker,\n} from \"../../lib/use-file-picker\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype DropzoneContextValue = Pick<\n\tUseFilePickerReturn,\n\t| \"isDragging\"\n\t| \"openFileDialog\"\n\t| \"getInputProps\"\n\t| \"handleDragEnter\"\n\t| \"handleDragLeave\"\n\t| \"handleDragOver\"\n\t| \"handleDrop\"\n> & { isDisabled: boolean };\n\nconst DropzoneContext = createContext<DropzoneContextValue | null>(null);\n\nfunction useDropzoneContext(): DropzoneContextValue {\n\tconst ctx = use(DropzoneContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"Dropzone compound components must be rendered inside <Dropzone>.\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Root\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface DropzoneProps extends UseFilePickerOptions {\n\tchildren?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Context provider that owns the `useFilePicker` instance.\n * Wrap `<DropzoneArea>` and `<DropzoneInput>` (plus any content helpers)\n * inside this component.\n *\n * @example\n * ```tsx\n * <Dropzone accept=\"image/*\" multiple maxFiles={5} onFilesAccepted={handleFiles}>\n * <DropzoneArea>\n * <DropzoneIcon />\n * <DropzoneTitle>Choose a file or drag & drop</DropzoneTitle>\n * <DropzoneDescription>JPEG, PNG – up to 2 MB</DropzoneDescription>\n * <DropzoneTrigger />\n * </DropzoneArea>\n * <DropzoneInput />\n * </Dropzone>\n * ```\n */\nfunction Dropzone({\n\tchildren,\n\tclassName,\n\tdisabled,\n\t...options\n}: DropzoneProps) {\n\tconst {\n\t\tisDragging,\n\t\topenFileDialog,\n\t\tgetInputProps,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleDrop,\n\t} = useFilePicker({ ...options, disabled });\n\n\treturn (\n\t\t<DropzoneContext.Provider\n\t\t\tvalue={{\n\t\t\t\tisDragging,\n\t\t\t\tisDisabled: disabled ?? false,\n\t\t\t\topenFileDialog,\n\t\t\t\tgetInputProps,\n\t\t\t\thandleDragEnter,\n\t\t\t\thandleDragLeave,\n\t\t\t\thandleDragOver,\n\t\t\t\thandleDrop,\n\t\t\t}}\n\t\t>\n\t\t\t<div data-slot=\"dropzone\" className={cn(\"relative\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</DropzoneContext.Provider>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Area (the interactive drop target)\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface DropzoneAreaProps\n\textends Omit<ComponentProps<\"div\">, \"onClick\" | \"onKeyDown\"> {\n\t/**\n\t * Accessible label for the drop zone.\n\t * Defaults to a sensible description.\n\t */\n\tlabel?: string;\n}\n\n/**\n * The visual, interactive drop zone.\n *\n * - Behaves as a `button` (role, tabIndex, Enter/Space keyboard support).\n * - Announces drag-state changes to screen readers via a live region.\n * - Applies design-token-based styles and reacts to `data-dragging` /\n * `data-disabled` for visual feedback.\n */\nfunction DropzoneArea({\n\tchildren,\n\tclassName,\n\tlabel = \"Upload files. Click to browse, or drag and drop files here.\",\n\t...props\n}: DropzoneAreaProps) {\n\tconst {\n\t\tisDragging,\n\t\tisDisabled,\n\t\topenFileDialog,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleDrop,\n\t} = useDropzoneContext();\n\n\tfunction handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\te.preventDefault();\n\t\t\topenFileDialog();\n\t\t}\n\t}\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useSemanticElements: The dropzone contains block-level compound content and owns drag events.\n\t\t<div\n\t\t\tdata-slot=\"dropzone-area\"\n\t\t\t// Data attributes drive all variant styles – no runtime class toggling.\n\t\t\tdata-dragging={isDragging ? \"true\" : undefined}\n\t\t\tdata-disabled={isDisabled ? \"true\" : undefined}\n\t\t\t// Accessibility ──────────────────────────────────────────────────────\n\t\t\trole=\"button\"\n\t\t\ttabIndex={isDisabled ? -1 : 0}\n\t\t\taria-label={label}\n\t\t\taria-disabled={isDisabled}\n\t\t\t// Interaction ────────────────────────────────────────────────────────\n\t\t\tonClick={isDisabled ? undefined : openFileDialog}\n\t\t\tonKeyDown={isDisabled ? undefined : handleKeyDown}\n\t\t\tonDragEnter={isDisabled ? undefined : handleDragEnter}\n\t\t\tonDragLeave={isDisabled ? undefined : handleDragLeave}\n\t\t\tonDragOver={isDisabled ? undefined : handleDragOver}\n\t\t\tonDrop={isDisabled ? undefined : handleDrop}\n\t\t\t// Styles ─────────────────────────────────────────────────────────────\n\t\t\tclassName={cn(\n\t\t\t\t// Layout & base\n\t\t\t\t\"flex min-h-48 w-full cursor-pointer flex-col items-center justify-center rounded-xl border p-8 text-center transition-colors duration-150 select-none\",\n\t\t\t\t// Default colours (design tokens)\n\t\t\t\t\"border-line bg-surface-brand-subtle\",\n\t\t\t\t// Focus ring – matches other interactive controls in the system\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-3 focus-visible:ring-ring/20 focus-visible:border-ring\",\n\t\t\t\t// Dragging variant\n\t\t\t\t\"data-[dragging=true]:border-dashed data-[dragging=true]:border-line-focus data-[dragging=true]:bg-surface-brand/10\",\n\t\t\t\t// Disabled variant\n\t\t\t\t\"data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\n\t\t\t{/* Live region: announces drag-state changes to screen-reader users */}\n\t\t\t<span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n\t\t\t\t{isDragging ? \"Drop files to upload.\" : \"\"}\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Input (visually hidden but present in the a11y tree)\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype DropzoneInputProps = Omit<ComponentProps<\"input\">, \"type\">;\n\n/**\n * The hidden `<input type=\"file\">` that backs the drop zone.\n * Rendered off-screen (not `display:none`) so it remains accessible.\n * Place it as a sibling to `<DropzoneArea>` inside `<Dropzone>`.\n */\nfunction DropzoneInput({ className, ...props }: DropzoneInputProps) {\n\tconst { getInputProps } = useDropzoneContext();\n\treturn (\n\t\t<input\n\t\t\t{...getInputProps({\n\t\t\t\t// sr-only keeps it in the a11y tree without being visible\n\t\t\t\tclassName: cn(\"sr-only\", className),\n\t\t\t\t// Prevent it from receiving keyboard focus independently\n\t\t\t\ttabIndex: -1,\n\t\t\t\t...props,\n\t\t\t})}\n\t\t/>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Content helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype DropzoneStateLabelProps = {\n\tchildren?: ReactNode;\n\tdisabledLabel?: ReactNode;\n\tdraggingLabel?: ReactNode;\n\tidleLabel?: ReactNode;\n};\n\ntype DropzoneTextProps = Omit<ComponentProps<\"p\">, \"children\"> &\n\tDropzoneStateLabelProps;\n\nfunction useDropzoneStateLabel({\n\tchildren,\n\tdisabledLabel,\n\tdraggingLabel,\n\tidleLabel,\n}: DropzoneStateLabelProps) {\n\tconst { isDragging, isDisabled } = useDropzoneContext();\n\n\tif (isDisabled && disabledLabel !== undefined) {\n\t\treturn disabledLabel;\n\t}\n\n\tif (isDragging && draggingLabel !== undefined) {\n\t\treturn draggingLabel;\n\t}\n\n\treturn idleLabel ?? children;\n}\n\n/**\n * A centred, brand-coloured icon container pre-populated with an upload cloud\n * icon. Pass `children` to swap the icon.\n */\nfunction DropzoneIcon({\n\tclassName,\n\tchildren,\n\t...props\n}: ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dropzone-icon\"\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"mb-4 flex size-11 shrink-0 items-center justify-center rounded-full\",\n\t\t\t\t// Solid brand fill with an inset ring for depth\n\t\t\t\t\"bg-surface-brand text-fg-on-brand ring-1 ring-inset ring-white/10\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ?? <UploadCloud className=\"size-5\" />}\n\t\t</div>\n\t);\n}\n\n/**\n * Primary heading text inside the drop zone.\n */\nfunction DropzoneTitle({\n\tclassName,\n\tchildren,\n\tdisabledLabel,\n\tdraggingLabel,\n\tidleLabel,\n\t...props\n}: DropzoneTextProps) {\n\tconst label = useDropzoneStateLabel({\n\t\tchildren,\n\t\tdisabledLabel,\n\t\tdraggingLabel,\n\t\tidleLabel,\n\t});\n\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"dropzone-title\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-lg font-semibold leading-snug text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{label}\n\t\t</p>\n\t);\n}\n\n/**\n * Secondary descriptive text inside the drop zone (file-type hints, size\n * limits, etc.).\n */\nfunction DropzoneDescription({\n\tclassName,\n\tchildren,\n\tdisabledLabel,\n\tdraggingLabel,\n\tidleLabel,\n\t...props\n}: DropzoneTextProps) {\n\tconst label = useDropzoneStateLabel({\n\t\tchildren,\n\t\tdisabledLabel,\n\t\tdraggingLabel,\n\t\tidleLabel,\n\t});\n\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"dropzone-description\"\n\t\t\tclassName={cn(\"mt-1 text-sm text-fg-muted\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{label}\n\t\t</p>\n\t);\n}\n\n/**\n * A decorative \"Browse File\" pill that visually suggests the click action.\n *\n * This element is `aria-hidden` because the surrounding `<DropzoneArea>`\n * already exposes a labelled `button` role to assistive technologies.\n * The pill is purely a visual affordance.\n */\nfunction DropzoneTrigger({\n\tclassName,\n\tchildren = \"Browse File\",\n\t...props\n}: ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"dropzone-trigger\"\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"mt-5 inline-flex h-8 shrink-0 items-center justify-center rounded-lg px-4\",\n\t\t\t\t\"bg-primary text-sm font-medium text-primary-foreground\",\n\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Exports\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport {\n\tDropzone,\n\tDropzoneArea,\n\tDropzoneDescription,\n\tDropzoneIcon,\n\tDropzoneInput,\n\tDropzoneTitle,\n\tDropzoneTrigger,\n\tuseDropzoneContext,\n};\n","import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [\n\t\t\t\t{\n\t\t\t\t\ttext: [\n\t\t\t\t\t\t\"gdt-display\",\n\t\t\t\t\t\t\"gdt-h1\",\n\t\t\t\t\t\t\"gdt-h2\",\n\t\t\t\t\t\t\"gdt-h3\",\n\t\t\t\t\t\t\"gdt-h4\",\n\t\t\t\t\t\t\"gdt-h5\",\n\t\t\t\t\t\t\"gdt-xl\",\n\t\t\t\t\t\t\"gdt-lg\",\n\t\t\t\t\t\t\"gdt-md\",\n\t\t\t\t\t\t\"gdt-sm\",\n\t\t\t\t\t\t\"gdt-xs\",\n\t\t\t\t\t\t\"gdt-subtext\",\n\t\t\t\t\t\t\"gdt-capitalized\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n});\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","import {\n\ttype ChangeEvent,\n\ttype ComponentPropsWithoutRef,\n\ttype DragEvent,\n\ttype Ref,\n\ttype RefObject,\n\tuseCallback,\n\tuseRef,\n\tuseState,\n} from \"react\";\n\ntype FilePickerErrorCode =\n\t| \"file-invalid-type\"\n\t| \"file-too-large\"\n\t| \"too-many-files\";\n\ntype FilePickerError = {\n\tcode: FilePickerErrorCode;\n\tmessage: string;\n};\n\ntype FileRejection = {\n\tfile: File;\n\terrors: FilePickerError[];\n};\n\ntype FilePickerResult = {\n\tacceptedFiles: File[];\n\trejectedFiles: FileRejection[];\n};\n\ntype UseFilePickerOptions = {\n\taccept?: string;\n\tdisabled?: boolean;\n\tmaxFiles?: number;\n\tmaxSize?: number;\n\tmultiple?: boolean;\n\tonFilesAccepted?: (files: File[]) => void;\n\tonFilesChange?: (result: FilePickerResult) => void;\n\tonFilesRejected?: (rejectedFiles: FileRejection[]) => void;\n};\n\ntype FilePickerInputProps = Omit<\n\tComponentPropsWithoutRef<\"input\">,\n\t\"type\" | \"accept\" | \"multiple\"\n> & {\n\taccept?: string;\n\tmultiple?: boolean;\n\tref?: Ref<HTMLInputElement>;\n};\n\ntype UseFilePickerReturn = {\n\tgetInputProps: (props?: FilePickerInputProps) => FilePickerInputProps & {\n\t\ttype: \"file\";\n\t\tref: Ref<HTMLInputElement>;\n\t};\n\thandleDragEnter: (event: DragEvent<HTMLElement>) => void;\n\thandleDragLeave: (event: DragEvent<HTMLElement>) => void;\n\thandleDragOver: (event: DragEvent<HTMLElement>) => void;\n\thandleDrop: (event: DragEvent<HTMLElement>) => void;\n\thandleFileChange: (event: ChangeEvent<HTMLInputElement>) => void;\n\tinputRef: RefObject<HTMLInputElement | null>;\n\tisDragging: boolean;\n\topenFileDialog: () => void;\n\tpickFiles: (files: FileList | File[]) => FilePickerResult;\n};\n\nfunction useFilePicker({\n\taccept = \"*\",\n\tdisabled = false,\n\tmaxFiles = Number.POSITIVE_INFINITY,\n\tmaxSize = Number.POSITIVE_INFINITY,\n\tmultiple = false,\n\tonFilesAccepted,\n\tonFilesChange,\n\tonFilesRejected,\n}: UseFilePickerOptions = {}): UseFilePickerReturn {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst dragDepthRef = useRef(0);\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tconst pickFiles = useCallback(\n\t\t(files: FileList | File[]): FilePickerResult => {\n\t\t\tconst incomingFiles = Array.from(files);\n\t\t\tconst limit = multiple ? maxFiles : 1;\n\t\t\tconst acceptedFiles: File[] = [];\n\t\t\tconst rejectedFiles: FileRejection[] = [];\n\n\t\t\tif (incomingFiles.length === 0 || disabled) {\n\t\t\t\treturn { acceptedFiles, rejectedFiles };\n\t\t\t}\n\n\t\t\tfor (const [index, file] of incomingFiles.entries()) {\n\t\t\t\tconst errors: FilePickerError[] = [];\n\n\t\t\t\tif (index >= limit) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tcode: \"too-many-files\",\n\t\t\t\t\t\tmessage: multiple\n\t\t\t\t\t\t\t? `You can only select up to ${limit} files.`\n\t\t\t\t\t\t\t: \"You can only select one file.\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(...validateFile(file, { accept, maxSize }));\n\t\t\t\t}\n\n\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\trejectedFiles.push({ file, errors });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tacceptedFiles.push(file);\n\t\t\t}\n\n\t\t\tconst result = { acceptedFiles, rejectedFiles };\n\n\t\t\tif (acceptedFiles.length > 0) {\n\t\t\t\tonFilesAccepted?.(acceptedFiles);\n\t\t\t}\n\n\t\t\tif (rejectedFiles.length > 0) {\n\t\t\t\tonFilesRejected?.(rejectedFiles);\n\t\t\t}\n\n\t\t\tonFilesChange?.(result);\n\n\t\t\tif (inputRef.current) {\n\t\t\t\tinputRef.current.value = \"\";\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\t[\n\t\t\taccept,\n\t\t\tdisabled,\n\t\t\tmaxFiles,\n\t\t\tmaxSize,\n\t\t\tmultiple,\n\t\t\tonFilesAccepted,\n\t\t\tonFilesChange,\n\t\t\tonFilesRejected,\n\t\t],\n\t);\n\n\tconst handleFileChange = useCallback(\n\t\t(event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tif (event.target.files) {\n\t\t\t\tpickFiles(event.target.files);\n\t\t\t}\n\t\t},\n\t\t[pickFiles],\n\t);\n\n\tconst openFileDialog = useCallback(() => {\n\t\tif (disabled) return;\n\t\tinputRef.current?.click();\n\t}, [disabled]);\n\n\tconst handleDragEnter = useCallback(\n\t\t(event: DragEvent<HTMLElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tif (disabled) return;\n\n\t\t\tdragDepthRef.current += 1;\n\t\t\tsetIsDragging(true);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst handleDragLeave = useCallback(\n\t\t(event: DragEvent<HTMLElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tif (disabled) return;\n\n\t\t\tdragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n\t\t\tif (dragDepthRef.current === 0) {\n\t\t\t\tsetIsDragging(false);\n\t\t\t}\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst handleDragOver = useCallback((event: DragEvent<HTMLElement>) => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(event: DragEvent<HTMLElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tdragDepthRef.current = 0;\n\t\t\tsetIsDragging(false);\n\n\t\t\tif (event.dataTransfer.files.length > 0) {\n\t\t\t\tpickFiles(event.dataTransfer.files);\n\t\t\t}\n\t\t},\n\t\t[pickFiles],\n\t);\n\n\tconst getInputProps = useCallback(\n\t\t(props: FilePickerInputProps = {}) => {\n\t\t\tconst { onChange, ref, ...inputProps } = props;\n\n\t\t\treturn {\n\t\t\t\t...inputProps,\n\t\t\t\ttype: \"file\" as const,\n\t\t\t\taccept: inputProps.accept ?? accept,\n\t\t\t\tdisabled: inputProps.disabled ?? disabled,\n\t\t\t\tmultiple: inputProps.multiple ?? multiple,\n\t\t\t\tref: (node: HTMLInputElement | null) => {\n\t\t\t\t\tinputRef.current = node;\n\t\t\t\t\tassignRef(ref, node);\n\t\t\t\t},\n\t\t\t\tonChange: (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\t\t\tonChange?.(event);\n\t\t\t\t\tif (!event.defaultPrevented) {\n\t\t\t\t\t\thandleFileChange(event);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t[accept, disabled, handleFileChange, multiple],\n\t);\n\n\treturn {\n\t\tgetInputProps,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleDrop,\n\t\thandleFileChange,\n\t\tinputRef,\n\t\tisDragging,\n\t\topenFileDialog,\n\t\tpickFiles,\n\t};\n}\n\nfunction validateFile(\n\tfile: File,\n\toptions: Pick<UseFilePickerOptions, \"accept\" | \"maxSize\"> = {},\n): FilePickerError[] {\n\tconst { accept = \"*\", maxSize = Number.POSITIVE_INFINITY } = options;\n\tconst errors: FilePickerError[] = [];\n\n\tif (file.size > maxSize) {\n\t\terrors.push({\n\t\t\tcode: \"file-too-large\",\n\t\t\tmessage: `File \"${file.name}\" exceeds the maximum size of ${formatBytes(maxSize)}.`,\n\t\t});\n\t}\n\n\tif (!isAcceptedFile(file, accept)) {\n\t\terrors.push({\n\t\t\tcode: \"file-invalid-type\",\n\t\t\tmessage: `File \"${file.name}\" is not an accepted file type.`,\n\t\t});\n\t}\n\n\treturn errors;\n}\n\nfunction isAcceptedFile(file: File, accept = \"*\") {\n\tif (accept === \"*\" || accept.trim() === \"\") return true;\n\n\tconst acceptedTypes = accept\n\t\t.split(\",\")\n\t\t.map((type) => type.trim().toLowerCase())\n\t\t.filter(Boolean);\n\n\tif (acceptedTypes.length === 0) return true;\n\n\tconst fileType = file.type.toLowerCase();\n\tconst fileExtension = getFileExtension(file.name);\n\n\treturn acceptedTypes.some((acceptedType) => {\n\t\tif (acceptedType.startsWith(\".\")) {\n\t\t\treturn fileExtension === acceptedType;\n\t\t}\n\n\t\tif (acceptedType.endsWith(\"/*\")) {\n\t\t\treturn fileType.startsWith(acceptedType.slice(0, -1));\n\t\t}\n\n\t\treturn fileType === acceptedType;\n\t});\n}\n\nfunction formatBytes(bytes: number, decimals = 2): string {\n\tif (bytes === 0) return \"0 Bytes\";\n\tif (!Number.isFinite(bytes)) return \"unlimited\";\n\n\tconst unit = 1024;\n\tconst precision = Math.max(0, decimals);\n\tconst sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n\tconst sizeIndex = Math.min(\n\t\tMath.floor(Math.log(bytes) / Math.log(unit)),\n\t\tsizes.length - 1,\n\t);\n\n\treturn `${Number.parseFloat((bytes / unit ** sizeIndex).toFixed(precision))} ${sizes[sizeIndex]}`;\n}\n\nfunction getFileExtension(fileName: string) {\n\tconst extension = fileName.toLowerCase().split(\".\").pop();\n\treturn extension && extension !== fileName.toLowerCase()\n\t\t? `.${extension}`\n\t\t: \"\";\n}\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null) {\n\tif (!ref) return;\n\n\tif (typeof ref === \"function\") {\n\t\tref(value);\n\t\treturn;\n\t}\n\n\tref.current = value;\n}\n\nexport { formatBytes, isAcceptedFile, useFilePicker, validateFile };\nexport type {\n\tFilePickerError,\n\tFilePickerErrorCode,\n\tFilePickerInputProps,\n\tFilePickerResult,\n\tFileRejection,\n\tUseFilePickerOptions,\n\tUseFilePickerReturn,\n};\n"],"mappings":";AAEA,SAAS,mBAAmB;AAC5B;AAAA,EAEC;AAAA,EAGA;AAAA,OACM;;;ACTP,SAA0B,YAAY;AACtC,SAAS,2BAA2B;AAEpC,IAAM,UAAU,oBAAoB;AAAA,EACnC,QAAQ;AAAA,IACP,aAAa;AAAA,MACZ,aAAa;AAAA,QACZ;AAAA,UACC,MAAM;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD,CAAC;AAEM,SAAS,MAAM,QAAsB;AAC3C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC5B;;;AC/BA;AAAA,EAMC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AA0DP,SAAS,cAAc;AAAA,EACtB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW,OAAO;AAAA,EAClB,UAAU,OAAO;AAAA,EACjB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACD,IAA0B,CAAC,GAAwB;AAClD,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,eAAe,OAAO,CAAC;AAC7B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,YAAY;AAAA,IACjB,CAAC,UAA+C;AAC/C,YAAM,gBAAgB,MAAM,KAAK,KAAK;AACtC,YAAM,QAAQ,WAAW,WAAW;AACpC,YAAM,gBAAwB,CAAC;AAC/B,YAAM,gBAAiC,CAAC;AAExC,UAAI,cAAc,WAAW,KAAK,UAAU;AAC3C,eAAO,EAAE,eAAe,cAAc;AAAA,MACvC;AAEA,iBAAW,CAAC,OAAO,IAAI,KAAK,cAAc,QAAQ,GAAG;AACpD,cAAM,SAA4B,CAAC;AAEnC,YAAI,SAAS,OAAO;AACnB,iBAAO,KAAK;AAAA,YACX,MAAM;AAAA,YACN,SAAS,WACN,6BAA6B,KAAK,YAClC;AAAA,UACJ,CAAC;AAAA,QACF,OAAO;AACN,iBAAO,KAAK,GAAG,aAAa,MAAM,EAAE,QAAQ,QAAQ,CAAC,CAAC;AAAA,QACvD;AAEA,YAAI,OAAO,SAAS,GAAG;AACtB,wBAAc,KAAK,EAAE,MAAM,OAAO,CAAC;AACnC;AAAA,QACD;AAEA,sBAAc,KAAK,IAAI;AAAA,MACxB;AAEA,YAAM,SAAS,EAAE,eAAe,cAAc;AAE9C,UAAI,cAAc,SAAS,GAAG;AAC7B,0BAAkB,aAAa;AAAA,MAChC;AAEA,UAAI,cAAc,SAAS,GAAG;AAC7B,0BAAkB,aAAa;AAAA,MAChC;AAEA,sBAAgB,MAAM;AAEtB,UAAI,SAAS,SAAS;AACrB,iBAAS,QAAQ,QAAQ;AAAA,MAC1B;AAEA,aAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,QAAM,mBAAmB;AAAA,IACxB,CAAC,UAAyC;AACzC,UAAI,MAAM,OAAO,OAAO;AACvB,kBAAU,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,IACD;AAAA,IACA,CAAC,SAAS;AAAA,EACX;AAEA,QAAM,iBAAiB,YAAY,MAAM;AACxC,QAAI,SAAU;AACd,aAAS,SAAS,MAAM;AAAA,EACzB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,kBAAkB;AAAA,IACvB,CAAC,UAAkC;AAClC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAEtB,UAAI,SAAU;AAEd,mBAAa,WAAW;AACxB,oBAAc,IAAI;AAAA,IACnB;AAAA,IACA,CAAC,QAAQ;AAAA,EACV;AAEA,QAAM,kBAAkB;AAAA,IACvB,CAAC,UAAkC;AAClC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAEtB,UAAI,SAAU;AAEd,mBAAa,UAAU,KAAK,IAAI,GAAG,aAAa,UAAU,CAAC;AAC3D,UAAI,aAAa,YAAY,GAAG;AAC/B,sBAAc,KAAK;AAAA,MACpB;AAAA,IACD;AAAA,IACA,CAAC,QAAQ;AAAA,EACV;AAEA,QAAM,iBAAiB,YAAY,CAAC,UAAkC;AACrE,UAAM,eAAe;AACrB,UAAM,gBAAgB;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa;AAAA,IAClB,CAAC,UAAkC;AAClC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAEtB,mBAAa,UAAU;AACvB,oBAAc,KAAK;AAEnB,UAAI,MAAM,aAAa,MAAM,SAAS,GAAG;AACxC,kBAAU,MAAM,aAAa,KAAK;AAAA,MACnC;AAAA,IACD;AAAA,IACA,CAAC,SAAS;AAAA,EACX;AAEA,QAAM,gBAAgB;AAAA,IACrB,CAAC,QAA8B,CAAC,MAAM;AACrC,YAAM,EAAE,UAAU,KAAK,GAAG,WAAW,IAAI;AAEzC,aAAO;AAAA,QACN,GAAG;AAAA,QACH,MAAM;AAAA,QACN,QAAQ,WAAW,UAAU;AAAA,QAC7B,UAAU,WAAW,YAAY;AAAA,QACjC,UAAU,WAAW,YAAY;AAAA,QACjC,KAAK,CAAC,SAAkC;AACvC,mBAAS,UAAU;AACnB,oBAAU,KAAK,IAAI;AAAA,QACpB;AAAA,QACA,UAAU,CAAC,UAAyC;AACnD,qBAAW,KAAK;AAChB,cAAI,CAAC,MAAM,kBAAkB;AAC5B,6BAAiB,KAAK;AAAA,UACvB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,UAAU,kBAAkB,QAAQ;AAAA,EAC9C;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEA,SAAS,aACR,MACA,UAA4D,CAAC,GACzC;AACpB,QAAM,EAAE,SAAS,KAAK,UAAU,OAAO,kBAAkB,IAAI;AAC7D,QAAM,SAA4B,CAAC;AAEnC,MAAI,KAAK,OAAO,SAAS;AACxB,WAAO,KAAK;AAAA,MACX,MAAM;AAAA,MACN,SAAS,SAAS,KAAK,IAAI,iCAAiC,YAAY,OAAO,CAAC;AAAA,IACjF,CAAC;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,MAAM,MAAM,GAAG;AAClC,WAAO,KAAK;AAAA,MACX,MAAM;AAAA,MACN,SAAS,SAAS,KAAK,IAAI;AAAA,IAC5B,CAAC;AAAA,EACF;AAEA,SAAO;AACR;AAEA,SAAS,eAAe,MAAY,SAAS,KAAK;AACjD,MAAI,WAAW,OAAO,OAAO,KAAK,MAAM,GAAI,QAAO;AAEnD,QAAM,gBAAgB,OACpB,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,YAAY,CAAC,EACvC,OAAO,OAAO;AAEhB,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,QAAM,WAAW,KAAK,KAAK,YAAY;AACvC,QAAM,gBAAgB,iBAAiB,KAAK,IAAI;AAEhD,SAAO,cAAc,KAAK,CAAC,iBAAiB;AAC3C,QAAI,aAAa,WAAW,GAAG,GAAG;AACjC,aAAO,kBAAkB;AAAA,IAC1B;AAEA,QAAI,aAAa,SAAS,IAAI,GAAG;AAChC,aAAO,SAAS,WAAW,aAAa,MAAM,GAAG,EAAE,CAAC;AAAA,IACrD;AAEA,WAAO,aAAa;AAAA,EACrB,CAAC;AACF;AAEA,SAAS,YAAY,OAAe,WAAW,GAAW;AACzD,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAEpC,QAAM,OAAO;AACb,QAAM,YAAY,KAAK,IAAI,GAAG,QAAQ;AACtC,QAAM,QAAQ,CAAC,SAAS,MAAM,MAAM,MAAM,MAAM,IAAI;AACpD,QAAM,YAAY,KAAK;AAAA,IACtB,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,IAC3C,MAAM,SAAS;AAAA,EAChB;AAEA,SAAO,GAAG,OAAO,YAAY,QAAQ,QAAQ,WAAW,QAAQ,SAAS,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AAChG;AAEA,SAAS,iBAAiB,UAAkB;AAC3C,QAAM,YAAY,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AACxD,SAAO,aAAa,cAAc,SAAS,YAAY,IACpD,IAAI,SAAS,KACb;AACJ;AAEA,SAAS,UAAa,KAAyB,OAAiB;AAC/D,MAAI,CAAC,IAAK;AAEV,MAAI,OAAO,QAAQ,YAAY;AAC9B,QAAI,KAAK;AACT;AAAA,EACD;AAEA,MAAI,UAAU;AACf;;;AFlOG,cAqDD,YArDC;AApEH,IAAM,kBAAkB,cAA2C,IAAI;AAEvE,SAAS,qBAA2C;AACnD,QAAM,MAAM,IAAI,eAAe;AAC/B,MAAI,CAAC,KAAK;AACT,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AA6BA,SAAS,SAAS;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAkB;AACjB,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI,cAAc,EAAE,GAAG,SAAS,SAAS,CAAC;AAE1C,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,OAAO;AAAA,QACN;AAAA,QACA,YAAY,YAAY;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MAEA,8BAAC,SAAI,aAAU,YAAW,WAAW,GAAG,YAAY,SAAS,GAC3D,UACF;AAAA;AAAA,EACD;AAEF;AAuBA,SAAS,aAAa;AAAA,EACrB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,GAAG;AACJ,GAAsB;AACrB,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI,mBAAmB;AAEvB,WAAS,cAAc,GAAkC;AACxD,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACvC,QAAE,eAAe;AACjB,qBAAe;AAAA,IAChB;AAAA,EACD;AAEA;AAAA;AAAA,IAEC;AAAA,MAAC;AAAA;AAAA,QACA,aAAU;AAAA,QAEV,iBAAe,aAAa,SAAS;AAAA,QACrC,iBAAe,aAAa,SAAS;AAAA,QAErC,MAAK;AAAA,QACL,UAAU,aAAa,KAAK;AAAA,QAC5B,cAAY;AAAA,QACZ,iBAAe;AAAA,QAEf,SAAS,aAAa,SAAY;AAAA,QAClC,WAAW,aAAa,SAAY;AAAA,QACpC,aAAa,aAAa,SAAY;AAAA,QACtC,aAAa,aAAa,SAAY;AAAA,QACtC,YAAY,aAAa,SAAY;AAAA,QACrC,QAAQ,aAAa,SAAY;AAAA,QAEjC,WAAW;AAAA;AAAA,UAEV;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,QACD;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,UAGD,oBAAC,UAAK,WAAU,WAAU,aAAU,UAAS,eAAY,QACvD,uBAAa,0BAA0B,IACzC;AAAA;AAAA;AAAA,IACD;AAAA;AAEF;AAaA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAuB;AACnE,QAAM,EAAE,cAAc,IAAI,mBAAmB;AAC7C,SACC;AAAA,IAAC;AAAA;AAAA,MACC,GAAG,cAAc;AAAA;AAAA,QAEjB,WAAW,GAAG,WAAW,SAAS;AAAA;AAAA,QAElC,UAAU;AAAA,QACV,GAAG;AAAA,MACJ,CAAC;AAAA;AAAA,EACF;AAEF;AAgBA,SAAS,sBAAsB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAA4B;AAC3B,QAAM,EAAE,YAAY,WAAW,IAAI,mBAAmB;AAEtD,MAAI,cAAc,kBAAkB,QAAW;AAC9C,WAAO;AAAA,EACR;AAEA,MAAI,cAAc,kBAAkB,QAAW;AAC9C,WAAO;AAAA,EACR;AAEA,SAAO,aAAa;AACrB;AAMA,SAAS,aAAa;AAAA,EACrB;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA0B;AACzB,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,eAAY;AAAA,MACZ,WAAW;AAAA,QACV;AAAA;AAAA,QAEA;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEH,sBAAY,oBAAC,eAAY,WAAU,UAAS;AAAA;AAAA,EAC9C;AAEF;AAKA,SAAS,cAAc;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAsB;AACrB,QAAM,QAAQ,sBAAsB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAED,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;AAMA,SAAS,oBAAoB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAsB;AACrB,QAAM,QAAQ,sBAAsB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAED,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,8BAA8B,SAAS;AAAA,MACpD,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;AASA,SAAS,gBAAgB;AAAA,EACxB;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACJ,GAA2B;AAC1B,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,eAAY;AAAA,MACZ,WAAW;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;","names":[]}
1
+ {"version":3,"sources":["../src/dropzone.tsx","../src/lib/use-file-picker.ts"],"sourcesContent":["\"use client\";\n\nimport { UploadCloud } from \"lucide-react\";\nimport {\n\ttype ComponentProps,\n\tcreateContext,\n\ttype KeyboardEvent,\n\ttype ReactNode,\n\tuse,\n} from \"react\";\nimport { cn } from \"./lib/cn\";\nimport {\n\ttype UseFilePickerOptions,\n\ttype UseFilePickerReturn,\n\tuseFilePicker,\n} from \"./lib/use-file-picker\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype DropzoneContextValue = Pick<\n\tUseFilePickerReturn,\n\t| \"isDragging\"\n\t| \"openFileDialog\"\n\t| \"getInputProps\"\n\t| \"handleDragEnter\"\n\t| \"handleDragLeave\"\n\t| \"handleDragOver\"\n\t| \"handleDrop\"\n> & { isDisabled: boolean };\n\nconst DropzoneContext = createContext<DropzoneContextValue | null>(null);\n\nfunction useDropzoneContext(): DropzoneContextValue {\n\tconst ctx = use(DropzoneContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"Dropzone compound components must be rendered inside <Dropzone>.\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Root\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface DropzoneProps extends UseFilePickerOptions {\n\tchildren?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Context provider that owns the `useFilePicker` instance.\n * Wrap `<DropzoneArea>` and `<DropzoneInput>` (plus any content helpers)\n * inside this component.\n *\n * @example\n * ```tsx\n * <Dropzone accept=\"image/*\" multiple maxFiles={5} onFilesAccepted={handleFiles}>\n * <DropzoneArea>\n * <DropzoneIcon />\n * <DropzoneTitle>Choose a file or drag & drop</DropzoneTitle>\n * <DropzoneDescription>JPEG, PNG – up to 2 MB</DropzoneDescription>\n * <DropzoneTrigger />\n * </DropzoneArea>\n * <DropzoneInput />\n * </Dropzone>\n * ```\n */\nfunction Dropzone({\n\tchildren,\n\tclassName,\n\tdisabled,\n\t...options\n}: DropzoneProps) {\n\tconst {\n\t\tisDragging,\n\t\topenFileDialog,\n\t\tgetInputProps,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleDrop,\n\t} = useFilePicker({ ...options, disabled });\n\n\treturn (\n\t\t<DropzoneContext.Provider\n\t\t\tvalue={{\n\t\t\t\tisDragging,\n\t\t\t\tisDisabled: disabled ?? false,\n\t\t\t\topenFileDialog,\n\t\t\t\tgetInputProps,\n\t\t\t\thandleDragEnter,\n\t\t\t\thandleDragLeave,\n\t\t\t\thandleDragOver,\n\t\t\t\thandleDrop,\n\t\t\t}}\n\t\t>\n\t\t\t<div data-slot=\"dropzone\" className={cn(\"relative\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</DropzoneContext.Provider>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Area (the interactive drop target)\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface DropzoneAreaProps\n\textends Omit<ComponentProps<\"div\">, \"onClick\" | \"onKeyDown\"> {\n\t/**\n\t * Accessible label for the drop zone.\n\t * Defaults to a sensible description.\n\t */\n\tlabel?: string;\n}\n\n/**\n * The visual, interactive drop zone.\n *\n * - Behaves as a `button` (role, tabIndex, Enter/Space keyboard support).\n * - Announces drag-state changes to screen readers via a live region.\n * - Applies design-token-based styles and reacts to `data-dragging` /\n * `data-disabled` for visual feedback.\n */\nfunction DropzoneArea({\n\tchildren,\n\tclassName,\n\tlabel = \"Upload files. Click to browse, or drag and drop files here.\",\n\t...props\n}: DropzoneAreaProps) {\n\tconst {\n\t\tisDragging,\n\t\tisDisabled,\n\t\topenFileDialog,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleDrop,\n\t} = useDropzoneContext();\n\n\tfunction handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\te.preventDefault();\n\t\t\topenFileDialog();\n\t\t}\n\t}\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useSemanticElements: The dropzone contains block-level compound content and owns drag events.\n\t\t<div\n\t\t\tdata-slot=\"dropzone-area\"\n\t\t\t// Data attributes drive all variant styles – no runtime class toggling.\n\t\t\tdata-dragging={isDragging ? \"true\" : undefined}\n\t\t\tdata-disabled={isDisabled ? \"true\" : undefined}\n\t\t\t// Accessibility ──────────────────────────────────────────────────────\n\t\t\trole=\"button\"\n\t\t\ttabIndex={isDisabled ? -1 : 0}\n\t\t\taria-label={label}\n\t\t\taria-disabled={isDisabled}\n\t\t\t// Interaction ────────────────────────────────────────────────────────\n\t\t\tonClick={isDisabled ? undefined : openFileDialog}\n\t\t\tonKeyDown={isDisabled ? undefined : handleKeyDown}\n\t\t\tonDragEnter={isDisabled ? undefined : handleDragEnter}\n\t\t\tonDragLeave={isDisabled ? undefined : handleDragLeave}\n\t\t\tonDragOver={isDisabled ? undefined : handleDragOver}\n\t\t\tonDrop={isDisabled ? undefined : handleDrop}\n\t\t\t// Styles ─────────────────────────────────────────────────────────────\n\t\t\tclassName={cn(\n\t\t\t\t// Layout & base\n\t\t\t\t\"flex min-h-48 w-full cursor-pointer flex-col items-center justify-center rounded-xl border p-8 text-center transition-colors duration-150 select-none\",\n\t\t\t\t// Default colours (design tokens)\n\t\t\t\t\"border-line bg-surface-brand-subtle\",\n\t\t\t\t// Focus ring – matches other interactive controls in the system\n\t\t\t\t\"focus-visible:border-line-focus focus-visible:ring-2 focus-visible:ring-line-focus/35 focus-visible:outline-none\",\n\t\t\t\t// Dragging variant\n\t\t\t\t\"data-[dragging=true]:border-dashed data-[dragging=true]:border-line-focus data-[dragging=true]:bg-surface-brand/10\",\n\t\t\t\t// Disabled variant\n\t\t\t\t\"data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\n\t\t\t{/* Live region: announces drag-state changes to screen-reader users */}\n\t\t\t<span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n\t\t\t\t{isDragging ? \"Drop files to upload.\" : \"\"}\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Input (visually hidden but present in the a11y tree)\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype DropzoneInputProps = Omit<ComponentProps<\"input\">, \"type\">;\n\n/**\n * The hidden `<input type=\"file\">` that backs the drop zone.\n * Rendered off-screen (not `display:none`) so it remains accessible.\n * Place it as a sibling to `<DropzoneArea>` inside `<Dropzone>`.\n */\nfunction DropzoneInput({ className, ...props }: DropzoneInputProps) {\n\tconst { getInputProps } = useDropzoneContext();\n\treturn (\n\t\t<input\n\t\t\t{...getInputProps({\n\t\t\t\t// sr-only keeps it in the a11y tree without being visible\n\t\t\t\tclassName: cn(\"sr-only\", className),\n\t\t\t\t// Prevent it from receiving keyboard focus independently\n\t\t\t\ttabIndex: -1,\n\t\t\t\t...props,\n\t\t\t})}\n\t\t/>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Content helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype DropzoneStateLabelProps = {\n\tchildren?: ReactNode;\n\tdisabledLabel?: ReactNode;\n\tdraggingLabel?: ReactNode;\n\tidleLabel?: ReactNode;\n};\n\ntype DropzoneTextProps = Omit<ComponentProps<\"p\">, \"children\"> &\n\tDropzoneStateLabelProps;\n\nfunction useDropzoneStateLabel({\n\tchildren,\n\tdisabledLabel,\n\tdraggingLabel,\n\tidleLabel,\n}: DropzoneStateLabelProps) {\n\tconst { isDragging, isDisabled } = useDropzoneContext();\n\n\tif (isDisabled && disabledLabel !== undefined) {\n\t\treturn disabledLabel;\n\t}\n\n\tif (isDragging && draggingLabel !== undefined) {\n\t\treturn draggingLabel;\n\t}\n\n\treturn idleLabel ?? children;\n}\n\n/**\n * A centred, brand-coloured icon container pre-populated with an upload cloud\n * icon. Pass `children` to swap the icon.\n */\nfunction DropzoneIcon({\n\tclassName,\n\tchildren,\n\t...props\n}: ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dropzone-icon\"\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"mb-4 flex size-11 shrink-0 items-center justify-center rounded-full\",\n\t\t\t\t// Solid brand fill with an inset ring for depth\n\t\t\t\t\"bg-surface-brand text-fg-on-brand ring-1 ring-fg-on-brand/10 ring-inset\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ?? <UploadCloud className=\"size-5\" />}\n\t\t</div>\n\t);\n}\n\n/**\n * Primary heading text inside the drop zone.\n */\nfunction DropzoneTitle({\n\tclassName,\n\tchildren,\n\tdisabledLabel,\n\tdraggingLabel,\n\tidleLabel,\n\t...props\n}: DropzoneTextProps) {\n\tconst label = useDropzoneStateLabel({\n\t\tchildren,\n\t\tdisabledLabel,\n\t\tdraggingLabel,\n\t\tidleLabel,\n\t});\n\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"dropzone-title\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-gdt-md font-semibold leading-snug text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{label}\n\t\t</p>\n\t);\n}\n\n/**\n * Secondary descriptive text inside the drop zone (file-type hints, size\n * limits, etc.).\n */\nfunction DropzoneDescription({\n\tclassName,\n\tchildren,\n\tdisabledLabel,\n\tdraggingLabel,\n\tidleLabel,\n\t...props\n}: DropzoneTextProps) {\n\tconst label = useDropzoneStateLabel({\n\t\tchildren,\n\t\tdisabledLabel,\n\t\tdraggingLabel,\n\t\tidleLabel,\n\t});\n\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"dropzone-description\"\n\t\t\tclassName={cn(\"mt-1 text-gdt-sm text-fg-secondary\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{label}\n\t\t</p>\n\t);\n}\n\n/**\n * A decorative \"Browse File\" pill that visually suggests the click action.\n *\n * This element is `aria-hidden` because the surrounding `<DropzoneArea>`\n * already exposes a labelled `button` role to assistive technologies.\n * The pill is purely a visual affordance.\n */\nfunction DropzoneTrigger({\n\tclassName,\n\tchildren = \"Browse File\",\n\t...props\n}: ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"dropzone-trigger\"\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\n\t\t\t\t\"mt-5 inline-flex h-8 shrink-0 items-center justify-center rounded-full px-4\",\n\t\t\t\t\"bg-action-primary text-gdt-sm font-medium text-fg-on-brand\",\n\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Exports\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport {\n\tDropzone,\n\tDropzoneArea,\n\tDropzoneDescription,\n\tDropzoneIcon,\n\tDropzoneInput,\n\tDropzoneTitle,\n\tDropzoneTrigger,\n\tuseDropzoneContext,\n};\n","import {\n\ttype ChangeEvent,\n\ttype ComponentPropsWithoutRef,\n\ttype DragEvent,\n\ttype Ref,\n\ttype RefObject,\n\tuseCallback,\n\tuseRef,\n\tuseState,\n} from \"react\";\n\ntype FilePickerErrorCode =\n\t| \"file-invalid-type\"\n\t| \"file-too-large\"\n\t| \"too-many-files\";\n\ntype FilePickerError = {\n\tcode: FilePickerErrorCode;\n\tmessage: string;\n};\n\ntype FileRejection = {\n\tfile: File;\n\terrors: FilePickerError[];\n};\n\ntype FilePickerResult = {\n\tacceptedFiles: File[];\n\trejectedFiles: FileRejection[];\n};\n\ntype UseFilePickerOptions = {\n\taccept?: string;\n\tdisabled?: boolean;\n\tmaxFiles?: number;\n\tmaxSize?: number;\n\tmultiple?: boolean;\n\tonFilesAccepted?: (files: File[]) => void;\n\tonFilesChange?: (result: FilePickerResult) => void;\n\tonFilesRejected?: (rejectedFiles: FileRejection[]) => void;\n};\n\ntype FilePickerInputProps = Omit<\n\tComponentPropsWithoutRef<\"input\">,\n\t\"type\" | \"accept\" | \"multiple\"\n> & {\n\taccept?: string;\n\tmultiple?: boolean;\n\tref?: Ref<HTMLInputElement>;\n};\n\ntype UseFilePickerReturn = {\n\tgetInputProps: (props?: FilePickerInputProps) => FilePickerInputProps & {\n\t\ttype: \"file\";\n\t\tref: Ref<HTMLInputElement>;\n\t};\n\thandleDragEnter: (event: DragEvent<HTMLElement>) => void;\n\thandleDragLeave: (event: DragEvent<HTMLElement>) => void;\n\thandleDragOver: (event: DragEvent<HTMLElement>) => void;\n\thandleDrop: (event: DragEvent<HTMLElement>) => void;\n\thandleFileChange: (event: ChangeEvent<HTMLInputElement>) => void;\n\tinputRef: RefObject<HTMLInputElement | null>;\n\tisDragging: boolean;\n\topenFileDialog: () => void;\n\tpickFiles: (files: FileList | File[]) => FilePickerResult;\n};\n\nfunction useFilePicker({\n\taccept = \"*\",\n\tdisabled = false,\n\tmaxFiles = Number.POSITIVE_INFINITY,\n\tmaxSize = Number.POSITIVE_INFINITY,\n\tmultiple = false,\n\tonFilesAccepted,\n\tonFilesChange,\n\tonFilesRejected,\n}: UseFilePickerOptions = {}): UseFilePickerReturn {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst dragDepthRef = useRef(0);\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tconst pickFiles = useCallback(\n\t\t(files: FileList | File[]): FilePickerResult => {\n\t\t\tconst incomingFiles = Array.from(files);\n\t\t\tconst limit = multiple ? maxFiles : 1;\n\t\t\tconst acceptedFiles: File[] = [];\n\t\t\tconst rejectedFiles: FileRejection[] = [];\n\n\t\t\tif (incomingFiles.length === 0 || disabled) {\n\t\t\t\treturn { acceptedFiles, rejectedFiles };\n\t\t\t}\n\n\t\t\tfor (const [index, file] of incomingFiles.entries()) {\n\t\t\t\tconst errors: FilePickerError[] = [];\n\n\t\t\t\tif (index >= limit) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tcode: \"too-many-files\",\n\t\t\t\t\t\tmessage: multiple\n\t\t\t\t\t\t\t? `You can only select up to ${limit} files.`\n\t\t\t\t\t\t\t: \"You can only select one file.\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(...validateFile(file, { accept, maxSize }));\n\t\t\t\t}\n\n\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\trejectedFiles.push({ file, errors });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tacceptedFiles.push(file);\n\t\t\t}\n\n\t\t\tconst result = { acceptedFiles, rejectedFiles };\n\n\t\t\tif (acceptedFiles.length > 0) {\n\t\t\t\tonFilesAccepted?.(acceptedFiles);\n\t\t\t}\n\n\t\t\tif (rejectedFiles.length > 0) {\n\t\t\t\tonFilesRejected?.(rejectedFiles);\n\t\t\t}\n\n\t\t\tonFilesChange?.(result);\n\n\t\t\tif (inputRef.current) {\n\t\t\t\tinputRef.current.value = \"\";\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\t[\n\t\t\taccept,\n\t\t\tdisabled,\n\t\t\tmaxFiles,\n\t\t\tmaxSize,\n\t\t\tmultiple,\n\t\t\tonFilesAccepted,\n\t\t\tonFilesChange,\n\t\t\tonFilesRejected,\n\t\t],\n\t);\n\n\tconst handleFileChange = useCallback(\n\t\t(event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tif (event.target.files) {\n\t\t\t\tpickFiles(event.target.files);\n\t\t\t}\n\t\t},\n\t\t[pickFiles],\n\t);\n\n\tconst openFileDialog = useCallback(() => {\n\t\tif (disabled) return;\n\t\tinputRef.current?.click();\n\t}, [disabled]);\n\n\tconst handleDragEnter = useCallback(\n\t\t(event: DragEvent<HTMLElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tif (disabled) return;\n\n\t\t\tdragDepthRef.current += 1;\n\t\t\tsetIsDragging(true);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst handleDragLeave = useCallback(\n\t\t(event: DragEvent<HTMLElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tif (disabled) return;\n\n\t\t\tdragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n\t\t\tif (dragDepthRef.current === 0) {\n\t\t\t\tsetIsDragging(false);\n\t\t\t}\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst handleDragOver = useCallback((event: DragEvent<HTMLElement>) => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(event: DragEvent<HTMLElement>) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tdragDepthRef.current = 0;\n\t\t\tsetIsDragging(false);\n\n\t\t\tif (event.dataTransfer.files.length > 0) {\n\t\t\t\tpickFiles(event.dataTransfer.files);\n\t\t\t}\n\t\t},\n\t\t[pickFiles],\n\t);\n\n\tconst getInputProps = useCallback(\n\t\t(props: FilePickerInputProps = {}) => {\n\t\t\tconst { onChange, ref, ...inputProps } = props;\n\n\t\t\treturn {\n\t\t\t\t...inputProps,\n\t\t\t\ttype: \"file\" as const,\n\t\t\t\taccept: inputProps.accept ?? accept,\n\t\t\t\tdisabled: inputProps.disabled ?? disabled,\n\t\t\t\tmultiple: inputProps.multiple ?? multiple,\n\t\t\t\tref: (node: HTMLInputElement | null) => {\n\t\t\t\t\tinputRef.current = node;\n\t\t\t\t\tassignRef(ref, node);\n\t\t\t\t},\n\t\t\t\tonChange: (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\t\t\tonChange?.(event);\n\t\t\t\t\tif (!event.defaultPrevented) {\n\t\t\t\t\t\thandleFileChange(event);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t[accept, disabled, handleFileChange, multiple],\n\t);\n\n\treturn {\n\t\tgetInputProps,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleDrop,\n\t\thandleFileChange,\n\t\tinputRef,\n\t\tisDragging,\n\t\topenFileDialog,\n\t\tpickFiles,\n\t};\n}\n\nfunction validateFile(\n\tfile: File,\n\toptions: Pick<UseFilePickerOptions, \"accept\" | \"maxSize\"> = {},\n): FilePickerError[] {\n\tconst { accept = \"*\", maxSize = Number.POSITIVE_INFINITY } = options;\n\tconst errors: FilePickerError[] = [];\n\n\tif (file.size > maxSize) {\n\t\terrors.push({\n\t\t\tcode: \"file-too-large\",\n\t\t\tmessage: `File \"${file.name}\" exceeds the maximum size of ${formatBytes(maxSize)}.`,\n\t\t});\n\t}\n\n\tif (!isAcceptedFile(file, accept)) {\n\t\terrors.push({\n\t\t\tcode: \"file-invalid-type\",\n\t\t\tmessage: `File \"${file.name}\" is not an accepted file type.`,\n\t\t});\n\t}\n\n\treturn errors;\n}\n\nfunction isAcceptedFile(file: File, accept = \"*\") {\n\tif (accept === \"*\" || accept.trim() === \"\") return true;\n\n\tconst acceptedTypes = accept\n\t\t.split(\",\")\n\t\t.map((type) => type.trim().toLowerCase())\n\t\t.filter(Boolean);\n\n\tif (acceptedTypes.length === 0) return true;\n\n\tconst fileType = file.type.toLowerCase();\n\tconst fileExtension = getFileExtension(file.name);\n\n\treturn acceptedTypes.some((acceptedType) => {\n\t\tif (acceptedType.startsWith(\".\")) {\n\t\t\treturn fileExtension === acceptedType;\n\t\t}\n\n\t\tif (acceptedType.endsWith(\"/*\")) {\n\t\t\treturn fileType.startsWith(acceptedType.slice(0, -1));\n\t\t}\n\n\t\treturn fileType === acceptedType;\n\t});\n}\n\nfunction formatBytes(bytes: number, decimals = 2): string {\n\tif (bytes === 0) return \"0 Bytes\";\n\tif (!Number.isFinite(bytes)) return \"unlimited\";\n\n\tconst unit = 1024;\n\tconst precision = Math.max(0, decimals);\n\tconst sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n\tconst sizeIndex = Math.min(\n\t\tMath.floor(Math.log(bytes) / Math.log(unit)),\n\t\tsizes.length - 1,\n\t);\n\n\treturn `${Number.parseFloat((bytes / unit ** sizeIndex).toFixed(precision))} ${sizes[sizeIndex]}`;\n}\n\nfunction getFileExtension(fileName: string) {\n\tconst extension = fileName.toLowerCase().split(\".\").pop();\n\treturn extension && extension !== fileName.toLowerCase()\n\t\t? `.${extension}`\n\t\t: \"\";\n}\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null) {\n\tif (!ref) return;\n\n\tif (typeof ref === \"function\") {\n\t\tref(value);\n\t\treturn;\n\t}\n\n\tref.current = value;\n}\n\nexport { formatBytes, isAcceptedFile, useFilePicker, validateFile };\nexport type {\n\tFilePickerError,\n\tFilePickerErrorCode,\n\tFilePickerInputProps,\n\tFilePickerResult,\n\tFileRejection,\n\tUseFilePickerOptions,\n\tUseFilePickerReturn,\n};\n"],"mappings":";;;;;;AAEA,SAAS,mBAAmB;AAC5B;AAAA,EAEC;AAAA,EAGA;AAAA,OACM;;;ACTP;AAAA,EAMC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AA0DP,SAAS,cAAc;AAAA,EACtB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW,OAAO;AAAA,EAClB,UAAU,OAAO;AAAA,EACjB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACD,IAA0B,CAAC,GAAwB;AAClD,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,eAAe,OAAO,CAAC;AAC7B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,YAAY;AAAA,IACjB,CAAC,UAA+C;AAC/C,YAAM,gBAAgB,MAAM,KAAK,KAAK;AACtC,YAAM,QAAQ,WAAW,WAAW;AACpC,YAAM,gBAAwB,CAAC;AAC/B,YAAM,gBAAiC,CAAC;AAExC,UAAI,cAAc,WAAW,KAAK,UAAU;AAC3C,eAAO,EAAE,eAAe,cAAc;AAAA,MACvC;AAEA,iBAAW,CAAC,OAAO,IAAI,KAAK,cAAc,QAAQ,GAAG;AACpD,cAAM,SAA4B,CAAC;AAEnC,YAAI,SAAS,OAAO;AACnB,iBAAO,KAAK;AAAA,YACX,MAAM;AAAA,YACN,SAAS,WACN,6BAA6B,KAAK,YAClC;AAAA,UACJ,CAAC;AAAA,QACF,OAAO;AACN,iBAAO,KAAK,GAAG,aAAa,MAAM,EAAE,QAAQ,QAAQ,CAAC,CAAC;AAAA,QACvD;AAEA,YAAI,OAAO,SAAS,GAAG;AACtB,wBAAc,KAAK,EAAE,MAAM,OAAO,CAAC;AACnC;AAAA,QACD;AAEA,sBAAc,KAAK,IAAI;AAAA,MACxB;AAEA,YAAM,SAAS,EAAE,eAAe,cAAc;AAE9C,UAAI,cAAc,SAAS,GAAG;AAC7B,0BAAkB,aAAa;AAAA,MAChC;AAEA,UAAI,cAAc,SAAS,GAAG;AAC7B,0BAAkB,aAAa;AAAA,MAChC;AAEA,sBAAgB,MAAM;AAEtB,UAAI,SAAS,SAAS;AACrB,iBAAS,QAAQ,QAAQ;AAAA,MAC1B;AAEA,aAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,QAAM,mBAAmB;AAAA,IACxB,CAAC,UAAyC;AACzC,UAAI,MAAM,OAAO,OAAO;AACvB,kBAAU,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,IACD;AAAA,IACA,CAAC,SAAS;AAAA,EACX;AAEA,QAAM,iBAAiB,YAAY,MAAM;AACxC,QAAI,SAAU;AACd,aAAS,SAAS,MAAM;AAAA,EACzB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,kBAAkB;AAAA,IACvB,CAAC,UAAkC;AAClC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAEtB,UAAI,SAAU;AAEd,mBAAa,WAAW;AACxB,oBAAc,IAAI;AAAA,IACnB;AAAA,IACA,CAAC,QAAQ;AAAA,EACV;AAEA,QAAM,kBAAkB;AAAA,IACvB,CAAC,UAAkC;AAClC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAEtB,UAAI,SAAU;AAEd,mBAAa,UAAU,KAAK,IAAI,GAAG,aAAa,UAAU,CAAC;AAC3D,UAAI,aAAa,YAAY,GAAG;AAC/B,sBAAc,KAAK;AAAA,MACpB;AAAA,IACD;AAAA,IACA,CAAC,QAAQ;AAAA,EACV;AAEA,QAAM,iBAAiB,YAAY,CAAC,UAAkC;AACrE,UAAM,eAAe;AACrB,UAAM,gBAAgB;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa;AAAA,IAClB,CAAC,UAAkC;AAClC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAEtB,mBAAa,UAAU;AACvB,oBAAc,KAAK;AAEnB,UAAI,MAAM,aAAa,MAAM,SAAS,GAAG;AACxC,kBAAU,MAAM,aAAa,KAAK;AAAA,MACnC;AAAA,IACD;AAAA,IACA,CAAC,SAAS;AAAA,EACX;AAEA,QAAM,gBAAgB;AAAA,IACrB,CAAC,QAA8B,CAAC,MAAM;AACrC,YAAM,EAAE,UAAU,KAAK,GAAG,WAAW,IAAI;AAEzC,aAAO;AAAA,QACN,GAAG;AAAA,QACH,MAAM;AAAA,QACN,QAAQ,WAAW,UAAU;AAAA,QAC7B,UAAU,WAAW,YAAY;AAAA,QACjC,UAAU,WAAW,YAAY;AAAA,QACjC,KAAK,CAAC,SAAkC;AACvC,mBAAS,UAAU;AACnB,oBAAU,KAAK,IAAI;AAAA,QACpB;AAAA,QACA,UAAU,CAAC,UAAyC;AACnD,qBAAW,KAAK;AAChB,cAAI,CAAC,MAAM,kBAAkB;AAC5B,6BAAiB,KAAK;AAAA,UACvB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACA,CAAC,QAAQ,UAAU,kBAAkB,QAAQ;AAAA,EAC9C;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEA,SAAS,aACR,MACA,UAA4D,CAAC,GACzC;AACpB,QAAM,EAAE,SAAS,KAAK,UAAU,OAAO,kBAAkB,IAAI;AAC7D,QAAM,SAA4B,CAAC;AAEnC,MAAI,KAAK,OAAO,SAAS;AACxB,WAAO,KAAK;AAAA,MACX,MAAM;AAAA,MACN,SAAS,SAAS,KAAK,IAAI,iCAAiC,YAAY,OAAO,CAAC;AAAA,IACjF,CAAC;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,MAAM,MAAM,GAAG;AAClC,WAAO,KAAK;AAAA,MACX,MAAM;AAAA,MACN,SAAS,SAAS,KAAK,IAAI;AAAA,IAC5B,CAAC;AAAA,EACF;AAEA,SAAO;AACR;AAEA,SAAS,eAAe,MAAY,SAAS,KAAK;AACjD,MAAI,WAAW,OAAO,OAAO,KAAK,MAAM,GAAI,QAAO;AAEnD,QAAM,gBAAgB,OACpB,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,YAAY,CAAC,EACvC,OAAO,OAAO;AAEhB,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,QAAM,WAAW,KAAK,KAAK,YAAY;AACvC,QAAM,gBAAgB,iBAAiB,KAAK,IAAI;AAEhD,SAAO,cAAc,KAAK,CAAC,iBAAiB;AAC3C,QAAI,aAAa,WAAW,GAAG,GAAG;AACjC,aAAO,kBAAkB;AAAA,IAC1B;AAEA,QAAI,aAAa,SAAS,IAAI,GAAG;AAChC,aAAO,SAAS,WAAW,aAAa,MAAM,GAAG,EAAE,CAAC;AAAA,IACrD;AAEA,WAAO,aAAa;AAAA,EACrB,CAAC;AACF;AAEA,SAAS,YAAY,OAAe,WAAW,GAAW;AACzD,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAEpC,QAAM,OAAO;AACb,QAAM,YAAY,KAAK,IAAI,GAAG,QAAQ;AACtC,QAAM,QAAQ,CAAC,SAAS,MAAM,MAAM,MAAM,MAAM,IAAI;AACpD,QAAM,YAAY,KAAK;AAAA,IACtB,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,IAC3C,MAAM,SAAS;AAAA,EAChB;AAEA,SAAO,GAAG,OAAO,YAAY,QAAQ,QAAQ,WAAW,QAAQ,SAAS,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AAChG;AAEA,SAAS,iBAAiB,UAAkB;AAC3C,QAAM,YAAY,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AACxD,SAAO,aAAa,cAAc,SAAS,YAAY,IACpD,IAAI,SAAS,KACb;AACJ;AAEA,SAAS,UAAa,KAAyB,OAAiB;AAC/D,MAAI,CAAC,IAAK;AAEV,MAAI,OAAO,QAAQ,YAAY;AAC9B,QAAI,KAAK;AACT;AAAA,EACD;AAEA,MAAI,UAAU;AACf;;;ADlOG,cAqDD,YArDC;AApEH,IAAM,kBAAkB,cAA2C,IAAI;AAEvE,SAAS,qBAA2C;AACnD,QAAM,MAAM,IAAI,eAAe;AAC/B,MAAI,CAAC,KAAK;AACT,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AA6BA,SAAS,SAAS;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAkB;AACjB,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI,cAAc,EAAE,GAAG,SAAS,SAAS,CAAC;AAE1C,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,OAAO;AAAA,QACN;AAAA,QACA,YAAY,YAAY;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MAEA,8BAAC,SAAI,aAAU,YAAW,WAAW,GAAG,YAAY,SAAS,GAC3D,UACF;AAAA;AAAA,EACD;AAEF;AAuBA,SAAS,aAAa;AAAA,EACrB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,GAAG;AACJ,GAAsB;AACrB,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI,mBAAmB;AAEvB,WAAS,cAAc,GAAkC;AACxD,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACvC,QAAE,eAAe;AACjB,qBAAe;AAAA,IAChB;AAAA,EACD;AAEA;AAAA;AAAA,IAEC;AAAA,MAAC;AAAA;AAAA,QACA,aAAU;AAAA,QAEV,iBAAe,aAAa,SAAS;AAAA,QACrC,iBAAe,aAAa,SAAS;AAAA,QAErC,MAAK;AAAA,QACL,UAAU,aAAa,KAAK;AAAA,QAC5B,cAAY;AAAA,QACZ,iBAAe;AAAA,QAEf,SAAS,aAAa,SAAY;AAAA,QAClC,WAAW,aAAa,SAAY;AAAA,QACpC,aAAa,aAAa,SAAY;AAAA,QACtC,aAAa,aAAa,SAAY;AAAA,QACtC,YAAY,aAAa,SAAY;AAAA,QACrC,QAAQ,aAAa,SAAY;AAAA,QAEjC,WAAW;AAAA;AAAA,UAEV;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,QACD;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,UAGD,oBAAC,UAAK,WAAU,WAAU,aAAU,UAAS,eAAY,QACvD,uBAAa,0BAA0B,IACzC;AAAA;AAAA;AAAA,IACD;AAAA;AAEF;AAaA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAuB;AACnE,QAAM,EAAE,cAAc,IAAI,mBAAmB;AAC7C,SACC;AAAA,IAAC;AAAA;AAAA,MACC,GAAG,cAAc;AAAA;AAAA,QAEjB,WAAW,GAAG,WAAW,SAAS;AAAA;AAAA,QAElC,UAAU;AAAA,QACV,GAAG;AAAA,MACJ,CAAC;AAAA;AAAA,EACF;AAEF;AAgBA,SAAS,sBAAsB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAA4B;AAC3B,QAAM,EAAE,YAAY,WAAW,IAAI,mBAAmB;AAEtD,MAAI,cAAc,kBAAkB,QAAW;AAC9C,WAAO;AAAA,EACR;AAEA,MAAI,cAAc,kBAAkB,QAAW;AAC9C,WAAO;AAAA,EACR;AAEA,SAAO,aAAa;AACrB;AAMA,SAAS,aAAa;AAAA,EACrB;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA0B;AACzB,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,eAAY;AAAA,MACZ,WAAW;AAAA,QACV;AAAA;AAAA,QAEA;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEH,sBAAY,oBAAC,eAAY,WAAU,UAAS;AAAA;AAAA,EAC9C;AAEF;AAKA,SAAS,cAAc;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAsB;AACrB,QAAM,QAAQ,sBAAsB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAED,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;AAMA,SAAS,oBAAoB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAsB;AACrB,QAAM,QAAQ,sBAAsB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAED,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;AASA,SAAS,gBAAgB;AAAA,EACxB;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACJ,GAA2B;AAC1B,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,eAAY;AAAA,MACZ,WAAW;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;","names":[]}
@@ -0,0 +1,29 @@
1
+ import * as React from 'react';
2
+ import * as class_variance_authority_types from 'class-variance-authority/types';
3
+ import { useRender } from '@base-ui/react/use-render';
4
+ import { VariantProps } from 'class-variance-authority';
5
+
6
+ declare const editorialCardVariants: (props?: ({
7
+ size?: "sm" | "md" | "lg" | null | undefined;
8
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
9
+ type EditorialCardProps = useRender.ComponentProps<"article"> & VariantProps<typeof editorialCardVariants>;
10
+ declare function EditorialCard({ className, render, size, ...props }: EditorialCardProps): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
11
+ declare function EditorialCardHeader({ className, render, ...props }: useRender.ComponentProps<"div">): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
12
+ declare function EditorialCardMeta({ className, render, ...props }: useRender.ComponentProps<"p">): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
13
+ declare function EditorialCardTitle({ className, render, ...props }: useRender.ComponentProps<"h3">): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
14
+ declare function EditorialCardMedia({ className, render, ...props }: useRender.ComponentProps<"div">): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
15
+ declare function EditorialCardCategory({ className, render, ...props }: useRender.ComponentProps<"span">): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
16
+ declare function EditorialCardPlayButton({ className, render, children, "aria-label": ariaLabel, ...props }: useRender.ComponentProps<"button">): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
17
+ type EditorialCardAttributionProps = Omit<useRender.ComponentProps<"div">, "children"> & {
18
+ authorName: string;
19
+ brand?: {
20
+ name?: string;
21
+ photo?: string;
22
+ };
23
+ prefix?: string;
24
+ };
25
+ declare function EditorialCardAttribution({ authorName, brand, className, prefix, render, ...props }: EditorialCardAttributionProps): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
26
+ declare function EditorialCardExcerpt({ className, render, ...props }: useRender.ComponentProps<"p">): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
27
+ declare function EditorialCardLink({ className, render, children, ...props }: useRender.ComponentProps<"a">): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
28
+
29
+ export { EditorialCard, EditorialCardAttribution, type EditorialCardAttributionProps, EditorialCardCategory, EditorialCardExcerpt, EditorialCardHeader, EditorialCardLink, EditorialCardMedia, EditorialCardMeta, EditorialCardPlayButton, type EditorialCardProps, EditorialCardTitle, editorialCardVariants };
@@ -0,0 +1,311 @@
1
+ import {
2
+ buttonVariants
3
+ } from "./chunk-B4H6RNDH.js";
4
+ import {
5
+ Avatar,
6
+ AvatarFallback,
7
+ AvatarImage
8
+ } from "./chunk-QKAQZ2GU.js";
9
+ import "./chunk-HL3ZSYES.js";
10
+ import {
11
+ cn
12
+ } from "./chunk-Y4TTYVNE.js";
13
+
14
+ // src/editorial-card.tsx
15
+ import { mergeProps } from "@base-ui/react/merge-props";
16
+ import { useRender } from "@base-ui/react/use-render";
17
+ import { cva } from "class-variance-authority";
18
+ import { ArrowRight, Play } from "lucide-react";
19
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
+ var editorialCardVariants = cva(
21
+ "group/editorial-card relative flex w-full min-w-0 flex-col overflow-hidden rounded-2xl border border-line-subtle bg-surface text-fg-primary transition-[background-color,border-color,box-shadow]",
22
+ {
23
+ variants: {
24
+ size: {
25
+ sm: "gap-2.5 p-4",
26
+ md: "gap-3 p-4.5",
27
+ lg: "gap-3.5 p-5"
28
+ }
29
+ },
30
+ defaultVariants: {
31
+ size: "md"
32
+ }
33
+ }
34
+ );
35
+ function EditorialCard({
36
+ className,
37
+ render,
38
+ size = "md",
39
+ ...props
40
+ }) {
41
+ return useRender({
42
+ defaultTagName: "article",
43
+ props: mergeProps(
44
+ {
45
+ className: cn(editorialCardVariants({ size }), className)
46
+ },
47
+ props
48
+ ),
49
+ render,
50
+ state: {
51
+ slot: "editorial-card",
52
+ size
53
+ }
54
+ });
55
+ }
56
+ function EditorialCardHeader({
57
+ className,
58
+ render,
59
+ ...props
60
+ }) {
61
+ return useRender({
62
+ defaultTagName: "div",
63
+ props: mergeProps(
64
+ {
65
+ className: cn(
66
+ "flex min-w-0 flex-col gap-2 group-data-[size=lg]/editorial-card:gap-3",
67
+ className
68
+ )
69
+ },
70
+ props
71
+ ),
72
+ render,
73
+ state: {
74
+ slot: "editorial-card-header"
75
+ }
76
+ });
77
+ }
78
+ function getInitials(name) {
79
+ return name.trim().split(/\s+/).slice(0, 2).map((part) => part[0]?.toUpperCase()).join("");
80
+ }
81
+ function EditorialCardMeta({
82
+ className,
83
+ render,
84
+ ...props
85
+ }) {
86
+ return useRender({
87
+ defaultTagName: "p",
88
+ props: mergeProps(
89
+ {
90
+ className: cn(
91
+ "text-fg-secondary text-gdt-xs group-data-[size=lg]/editorial-card:text-gdt-sm",
92
+ className
93
+ )
94
+ },
95
+ props
96
+ ),
97
+ render,
98
+ state: {
99
+ slot: "editorial-card-meta"
100
+ }
101
+ });
102
+ }
103
+ function EditorialCardTitle({
104
+ className,
105
+ render,
106
+ ...props
107
+ }) {
108
+ return useRender({
109
+ defaultTagName: "h3",
110
+ props: mergeProps(
111
+ {
112
+ className: cn(
113
+ "text-fg-primary text-gdt-md font-extrabold group-data-[size=md]/editorial-card:text-gdt-lg",
114
+ "group-data-[size=lg]/editorial-card:text-gdt-h5",
115
+ className
116
+ )
117
+ },
118
+ props
119
+ ),
120
+ render,
121
+ state: {
122
+ slot: "editorial-card-title"
123
+ }
124
+ });
125
+ }
126
+ function EditorialCardMedia({
127
+ className,
128
+ render,
129
+ ...props
130
+ }) {
131
+ return useRender({
132
+ defaultTagName: "div",
133
+ props: mergeProps(
134
+ {
135
+ className: cn(
136
+ "relative isolate flex min-w-0 items-center justify-center overflow-hidden rounded-xl bg-surface-raised",
137
+ "min-h-28 group-data-[size=md]/editorial-card:min-h-40 group-data-[size=lg]/editorial-card:min-h-56",
138
+ "[&>img]:absolute [&>img]:inset-0 [&>img]:size-full [&>img]:object-cover",
139
+ className
140
+ )
141
+ },
142
+ props
143
+ ),
144
+ render,
145
+ state: {
146
+ slot: "editorial-card-media"
147
+ }
148
+ });
149
+ }
150
+ function EditorialCardCategory({
151
+ className,
152
+ render,
153
+ ...props
154
+ }) {
155
+ return useRender({
156
+ defaultTagName: "span",
157
+ props: mergeProps(
158
+ {
159
+ className: cn(
160
+ "absolute top-2 left-2 z-10 inline-flex w-fit items-center rounded-full bg-surface-brand px-2 py-1",
161
+ "text-gdt-capitalized font-bold text-fg-on-brand uppercase",
162
+ "group-data-[size=lg]/editorial-card:top-3 group-data-[size=sm]/editorial-card:left-3 group-data-[size=sm]/editorial-card:py-0.5 group-data-[size=lg]/editorial-card:px-3",
163
+ className
164
+ )
165
+ },
166
+ props
167
+ ),
168
+ render,
169
+ state: {
170
+ slot: "editorial-card-category"
171
+ }
172
+ });
173
+ }
174
+ function EditorialCardPlayButton({
175
+ className,
176
+ render,
177
+ children,
178
+ "aria-label": ariaLabel = "Play media",
179
+ ...props
180
+ }) {
181
+ return useRender({
182
+ defaultTagName: "button",
183
+ props: mergeProps(
184
+ {
185
+ "aria-label": ariaLabel,
186
+ className: cn(
187
+ "absolute top-1/2 left-1/2 z-10 -translate-x-1/2 -translate-y-1/2 active:-translate-y-1/2",
188
+ buttonVariants({ variant: "glass-overlay", size: "icon-lg" }),
189
+ "size-12 group-data-[size=md]/editorial-card:size-16 group-data-[size=lg]/editorial-card:size-20",
190
+ "[&>svg]:ml-1 [&>svg]:size-5 group-data-[size=md]/editorial-card:[&>svg]:size-7 group-data-[size=lg]/editorial-card:[&>svg]:size-8",
191
+ className
192
+ ),
193
+ children: children ?? /* @__PURE__ */ jsx(Play, { "aria-hidden": "true", fill: "currentColor" })
194
+ },
195
+ props
196
+ ),
197
+ render,
198
+ state: {
199
+ slot: "editorial-card-play-button"
200
+ }
201
+ });
202
+ }
203
+ function EditorialCardAttribution({
204
+ authorName,
205
+ brand,
206
+ className,
207
+ prefix = "By",
208
+ render,
209
+ ...props
210
+ }) {
211
+ const brandName = brand?.name?.trim();
212
+ const brandPhoto = brand?.photo;
213
+ const showBrandAvatar = Boolean(brandName || brandPhoto);
214
+ return useRender({
215
+ defaultTagName: "div",
216
+ props: mergeProps(
217
+ {
218
+ className: cn(
219
+ "flex min-w-0 items-center gap-2 text-gdt-xs text-fg-secondary",
220
+ "group-data-[size=lg]/editorial-card:text-gdt-sm",
221
+ className
222
+ ),
223
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
224
+ prefix ? /* @__PURE__ */ jsx("span", { children: prefix }) : null,
225
+ showBrandAvatar ? /* @__PURE__ */ jsxs(
226
+ Avatar,
227
+ {
228
+ size: "sm",
229
+ className: "size-6 group-data-[size=lg]/editorial-card:size-7",
230
+ children: [
231
+ brandPhoto ? /* @__PURE__ */ jsx(AvatarImage, { alt: brandName ?? "", src: brandPhoto }) : null,
232
+ brandName ? /* @__PURE__ */ jsx(AvatarFallback, { className: "text-gdt-capitalized bg-surface-brand text-fg-on-brand", children: getInitials(brandName) }) : null
233
+ ]
234
+ }
235
+ ) : null,
236
+ /* @__PURE__ */ jsx("span", { className: "truncate font-bold text-fg-primary", children: authorName })
237
+ ] })
238
+ },
239
+ props
240
+ ),
241
+ render,
242
+ state: {
243
+ slot: "editorial-card-attribution"
244
+ }
245
+ });
246
+ }
247
+ function EditorialCardExcerpt({
248
+ className,
249
+ render,
250
+ ...props
251
+ }) {
252
+ return useRender({
253
+ defaultTagName: "p",
254
+ props: mergeProps(
255
+ {
256
+ className: cn(
257
+ "line-clamp-3 text-gdt-xs text-fg-secondary group-data-[size=md]/editorial-card:text-gdt-md group-data-[size=lg]/editorial-card:text-gdt-lg",
258
+ className
259
+ )
260
+ },
261
+ props
262
+ ),
263
+ render,
264
+ state: {
265
+ slot: "editorial-card-excerpt"
266
+ }
267
+ });
268
+ }
269
+ function EditorialCardLink({
270
+ className,
271
+ render,
272
+ children,
273
+ ...props
274
+ }) {
275
+ return useRender({
276
+ defaultTagName: "a",
277
+ props: mergeProps(
278
+ {
279
+ className: cn(
280
+ "inline-flex w-fit items-center gap-gdt-sm text-gdt-xs font-bold text-fg-brand underline underline-offset-2",
281
+ "group-data-[size=lg]/editorial-card:text-gdt-sm hover:opacity-80 focus-visible:outline-none",
282
+ "focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]",
283
+ className
284
+ ),
285
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
286
+ /* @__PURE__ */ jsx(ArrowRight, { "aria-hidden": "true", className: "size-5 shrink-0" }),
287
+ /* @__PURE__ */ jsx("span", { children })
288
+ ] })
289
+ },
290
+ props
291
+ ),
292
+ render,
293
+ state: {
294
+ slot: "editorial-card-link"
295
+ }
296
+ });
297
+ }
298
+ export {
299
+ EditorialCard,
300
+ EditorialCardAttribution,
301
+ EditorialCardCategory,
302
+ EditorialCardExcerpt,
303
+ EditorialCardHeader,
304
+ EditorialCardLink,
305
+ EditorialCardMedia,
306
+ EditorialCardMeta,
307
+ EditorialCardPlayButton,
308
+ EditorialCardTitle,
309
+ editorialCardVariants
310
+ };
311
+ //# sourceMappingURL=editorial-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editorial-card.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { ArrowRight, Play } from \"lucide-react\";\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\";\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./lib/cn\";\n\nconst editorialCardVariants = cva(\n\t\"group/editorial-card relative flex w-full min-w-0 flex-col overflow-hidden rounded-2xl border border-line-subtle bg-surface text-fg-primary transition-[background-color,border-color,box-shadow]\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"gap-2.5 p-4\",\n\t\t\t\tmd: \"gap-3 p-4.5\",\n\t\t\t\tlg: \"gap-3.5 p-5\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\ntype EditorialCardProps = useRender.ComponentProps<\"article\"> &\n\tVariantProps<typeof editorialCardVariants>;\n\nfunction EditorialCard({\n\tclassName,\n\trender,\n\tsize = \"md\",\n\t...props\n}: EditorialCardProps) {\n\treturn useRender({\n\t\tdefaultTagName: \"article\",\n\t\tprops: mergeProps<\"article\">(\n\t\t\t{\n\t\t\t\tclassName: cn(editorialCardVariants({ size }), className),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card\",\n\t\t\tsize,\n\t\t},\n\t});\n}\n\nfunction EditorialCardHeader({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"div\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"flex min-w-0 flex-col gap-2 group-data-[size=lg]/editorial-card:gap-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-header\",\n\t\t},\n\t});\n}\n\nfunction getInitials(name: string) {\n\treturn name\n\t\t.trim()\n\t\t.split(/\\s+/)\n\t\t.slice(0, 2)\n\t\t.map((part) => part[0]?.toUpperCase())\n\t\t.join(\"\");\n}\n\nfunction EditorialCardMeta({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"p\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"p\",\n\t\tprops: mergeProps<\"p\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"text-fg-secondary text-gdt-xs group-data-[size=lg]/editorial-card:text-gdt-sm\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-meta\",\n\t\t},\n\t});\n}\n\nfunction EditorialCardTitle({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"h3\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"h3\",\n\t\tprops: mergeProps<\"h3\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"text-fg-primary text-gdt-md font-extrabold group-data-[size=md]/editorial-card:text-gdt-lg\",\n\t\t\t\t\t\"group-data-[size=lg]/editorial-card:text-gdt-h5\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-title\",\n\t\t},\n\t});\n}\n\nfunction EditorialCardMedia({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"div\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"relative isolate flex min-w-0 items-center justify-center overflow-hidden rounded-xl bg-surface-raised\",\n\t\t\t\t\t\"min-h-28 group-data-[size=md]/editorial-card:min-h-40 group-data-[size=lg]/editorial-card:min-h-56\",\n\t\t\t\t\t\"[&>img]:absolute [&>img]:inset-0 [&>img]:size-full [&>img]:object-cover\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-media\",\n\t\t},\n\t});\n}\n\nfunction EditorialCardCategory({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"span\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"span\",\n\t\tprops: mergeProps<\"span\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"absolute top-2 left-2 z-10 inline-flex w-fit items-center rounded-full bg-surface-brand px-2 py-1\",\n\t\t\t\t\t\"text-gdt-capitalized font-bold text-fg-on-brand uppercase\",\n\t\t\t\t\t\"group-data-[size=lg]/editorial-card:top-3 group-data-[size=sm]/editorial-card:left-3 group-data-[size=sm]/editorial-card:py-0.5 group-data-[size=lg]/editorial-card:px-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-category\",\n\t\t},\n\t});\n}\n\nfunction EditorialCardPlayButton({\n\tclassName,\n\trender,\n\tchildren,\n\t\"aria-label\": ariaLabel = \"Play media\",\n\t...props\n}: useRender.ComponentProps<\"button\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"button\",\n\t\tprops: mergeProps<\"button\">(\n\t\t\t{\n\t\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"absolute top-1/2 left-1/2 z-10 -translate-x-1/2 -translate-y-1/2 active:-translate-y-1/2\",\n\t\t\t\t\tbuttonVariants({ variant: \"glass-overlay\", size: \"icon-lg\" }),\n\t\t\t\t\t\"size-12 group-data-[size=md]/editorial-card:size-16 group-data-[size=lg]/editorial-card:size-20\",\n\t\t\t\t\t\"[&>svg]:ml-1 [&>svg]:size-5 group-data-[size=md]/editorial-card:[&>svg]:size-7 group-data-[size=lg]/editorial-card:[&>svg]:size-8\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t\tchildren: children ?? <Play aria-hidden=\"true\" fill=\"currentColor\" />,\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-play-button\",\n\t\t},\n\t});\n}\n\ntype EditorialCardAttributionProps = Omit<\n\tuseRender.ComponentProps<\"div\">,\n\t\"children\"\n> & {\n\tauthorName: string;\n\tbrand?: {\n\t\tname?: string;\n\t\tphoto?: string;\n\t};\n\tprefix?: string;\n};\n\nfunction EditorialCardAttribution({\n\tauthorName,\n\tbrand,\n\tclassName,\n\tprefix = \"By\",\n\trender,\n\t...props\n}: EditorialCardAttributionProps) {\n\tconst brandName = brand?.name?.trim();\n\tconst brandPhoto = brand?.photo;\n\tconst showBrandAvatar = Boolean(brandName || brandPhoto);\n\n\treturn useRender({\n\t\tdefaultTagName: \"div\",\n\t\tprops: mergeProps<\"div\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"flex min-w-0 items-center gap-2 text-gdt-xs text-fg-secondary\",\n\t\t\t\t\t\"group-data-[size=lg]/editorial-card:text-gdt-sm\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t\tchildren: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{prefix ? <span>{prefix}</span> : null}\n\t\t\t\t\t\t{showBrandAvatar ? (\n\t\t\t\t\t\t\t<Avatar\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tclassName=\"size-6 group-data-[size=lg]/editorial-card:size-7\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{brandPhoto ? (\n\t\t\t\t\t\t\t\t\t<AvatarImage alt={brandName ?? \"\"} src={brandPhoto} />\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{brandName ? (\n\t\t\t\t\t\t\t\t\t<AvatarFallback className=\"text-gdt-capitalized bg-surface-brand text-fg-on-brand\">\n\t\t\t\t\t\t\t\t\t\t{getInitials(brandName)}\n\t\t\t\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</Avatar>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<span className=\"truncate font-bold text-fg-primary\">\n\t\t\t\t\t\t\t{authorName}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-attribution\",\n\t\t},\n\t});\n}\n\nfunction EditorialCardExcerpt({\n\tclassName,\n\trender,\n\t...props\n}: useRender.ComponentProps<\"p\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"p\",\n\t\tprops: mergeProps<\"p\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"line-clamp-3 text-gdt-xs text-fg-secondary group-data-[size=md]/editorial-card:text-gdt-md group-data-[size=lg]/editorial-card:text-gdt-lg\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-excerpt\",\n\t\t},\n\t});\n}\n\nfunction EditorialCardLink({\n\tclassName,\n\trender,\n\tchildren,\n\t...props\n}: useRender.ComponentProps<\"a\">) {\n\treturn useRender({\n\t\tdefaultTagName: \"a\",\n\t\tprops: mergeProps<\"a\">(\n\t\t\t{\n\t\t\t\tclassName: cn(\n\t\t\t\t\t\"inline-flex w-fit items-center gap-gdt-sm text-gdt-xs font-bold text-fg-brand underline underline-offset-2\",\n\t\t\t\t\t\"group-data-[size=lg]/editorial-card:text-gdt-sm hover:opacity-80 focus-visible:outline-none\",\n\t\t\t\t\t\"focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]\",\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t\tchildren: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ArrowRight aria-hidden=\"true\" className=\"size-5 shrink-0\" />\n\t\t\t\t\t\t<span>{children}</span>\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t},\n\t\t\tprops,\n\t\t),\n\t\trender,\n\t\tstate: {\n\t\t\tslot: \"editorial-card-link\",\n\t\t},\n\t});\n}\n\nexport {\n\tEditorialCard,\n\tEditorialCardAttribution,\n\tEditorialCardCategory,\n\tEditorialCardExcerpt,\n\tEditorialCardHeader,\n\tEditorialCardLink,\n\tEditorialCardMedia,\n\tEditorialCardMeta,\n\tEditorialCardPlayButton,\n\tEditorialCardTitle,\n\teditorialCardVariants,\n};\nexport type { EditorialCardAttributionProps, EditorialCardProps };\n"],"mappings":"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","names":[]}
@@ -1,39 +1,9 @@
1
- // src/components/ui/empty-state.tsx
2
- import { cva } from "class-variance-authority";
3
-
4
- // src/lib/cn.ts
5
- import { clsx } from "clsx";
6
- import { extendTailwindMerge } from "tailwind-merge";
7
- var twMerge = extendTailwindMerge({
8
- extend: {
9
- classGroups: {
10
- "font-size": [
11
- {
12
- text: [
13
- "gdt-display",
14
- "gdt-h1",
15
- "gdt-h2",
16
- "gdt-h3",
17
- "gdt-h4",
18
- "gdt-h5",
19
- "gdt-xl",
20
- "gdt-lg",
21
- "gdt-md",
22
- "gdt-sm",
23
- "gdt-xs",
24
- "gdt-subtext",
25
- "gdt-capitalized"
26
- ]
27
- }
28
- ]
29
- }
30
- }
31
- });
32
- function cn(...inputs) {
33
- return twMerge(clsx(inputs));
34
- }
1
+ import {
2
+ cn
3
+ } from "./chunk-Y4TTYVNE.js";
35
4
 
36
- // src/components/ui/empty-state.tsx
5
+ // src/empty-state.tsx
6
+ import { cva } from "class-variance-authority";
37
7
  import { jsx } from "react/jsx-runtime";
38
8
  function Empty({
39
9
  className,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/empty-state.tsx","../src/lib/cn.ts"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\n\nfunction Empty({\n\tclassName,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tvariant?: \"filled\" | \"outline\" | \"default\";\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-gdt-xl rounded-2xl p-gdt-2xl text-center text-balance\",\n\t\t\t\tvariant === \"filled\" && \"bg-surface-raised border border-line-subtle\",\n\t\t\t\tvariant === \"outline\" && \"border border-line\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full max-w-95 flex-col items-center gap-gdt-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst emptyMediaVariants = cva(\n\t\"mb-gdt-sm flex shrink-0 items-center justify-center text-fg-brand [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-transparent\",\n\t\t\t\ticon: \"size-24 rounded-full bg-surface-brand-subtle [&_svg:not([class*='size-'])]:size-10\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t},\n\t},\n);\n\nfunction EmptyMedia({\n\tclassName,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-media\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(emptyMediaVariants({ variant, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-title\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-gdt-h4 font-extrabold tracking-tight text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"empty-description\"\n\t\t\tclassName={cn(\n\t\t\t\t\"max-w-95 text-gdt-md font-normal text-fg-secondary [&>a]:font-semibold [&>a]:text-fg-brand [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full max-w-95 min-w-0 flex-col items-center justify-center gap-gdt-sm text-gdt-sm text-balance sm:flex-row [&_[data-slot=button]]:w-full sm:[&_[data-slot=button]]:w-auto\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tEmpty,\n\tEmptyHeader,\n\tEmptyTitle,\n\tEmptyDescription,\n\tEmptyContent,\n\tEmptyMedia,\n};\n","import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [\n\t\t\t\t{\n\t\t\t\t\ttext: [\n\t\t\t\t\t\t\"gdt-display\",\n\t\t\t\t\t\t\"gdt-h1\",\n\t\t\t\t\t\t\"gdt-h2\",\n\t\t\t\t\t\t\"gdt-h3\",\n\t\t\t\t\t\t\"gdt-h4\",\n\t\t\t\t\t\t\"gdt-h5\",\n\t\t\t\t\t\t\"gdt-xl\",\n\t\t\t\t\t\t\"gdt-lg\",\n\t\t\t\t\t\t\"gdt-md\",\n\t\t\t\t\t\t\"gdt-sm\",\n\t\t\t\t\t\t\"gdt-xs\",\n\t\t\t\t\t\t\"gdt-subtext\",\n\t\t\t\t\t\t\"gdt-capitalized\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n});\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n"],"mappings":";AAAA,SAAS,WAA8B;;;ACAvC,SAA0B,YAAY;AACtC,SAAS,2BAA2B;AAEpC,IAAM,UAAU,oBAAoB;AAAA,EACnC,QAAQ;AAAA,IACP,aAAa;AAAA,MACZ,aAAa;AAAA,QACZ;AAAA,UACC,MAAM;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD,CAAC;AAEM,SAAS,MAAM,QAAsB;AAC3C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC5B;;;ADlBE;AARF,SAAS,MAAM;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACJ,GAEG;AACF,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA,YAAY,YAAY;AAAA,QACxB,YAAY,aAAa;AAAA,QACzB;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,IAAM,qBAAqB;AAAA,EAC1B;AAAA,EACA;AAAA,IACC,UAAU;AAAA,MACT,SAAS;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,MAChB,SAAS;AAAA,IACV;AAAA,EACD;AACD;AAEA,SAAS,WAAW;AAAA,EACnB;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACJ,GAA0E;AACzE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,mBAAmB,EAAE,SAAS,UAAU,CAAC,CAAC;AAAA,MACvD,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,MAAM,GAA8B;AAC7E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}
1
+ {"version":3,"sources":["../src/empty-state.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"./lib/cn\";\n\nfunction Empty({\n\tclassName,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tvariant?: \"filled\" | \"outline\" | \"default\";\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-gdt-xl rounded-2xl p-gdt-2xl text-center text-balance\",\n\t\t\t\tvariant === \"filled\" && \"bg-surface-raised border border-line-subtle\",\n\t\t\t\tvariant === \"outline\" && \"border border-line\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full max-w-95 flex-col items-center gap-gdt-sm\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst emptyMediaVariants = cva(\n\t\"mb-gdt-sm flex shrink-0 items-center justify-center text-fg-brand [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: \"bg-transparent\",\n\t\t\t\ticon: \"size-24 rounded-full bg-surface-brand-subtle [&_svg:not([class*='size-'])]:size-10\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t},\n\t},\n);\n\nfunction EmptyMedia({\n\tclassName,\n\tvariant = \"default\",\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-media\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(emptyMediaVariants({ variant, className }))}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-title\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-gdt-h4 font-extrabold tracking-tight text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"empty-description\"\n\t\t\tclassName={cn(\n\t\t\t\t\"max-w-95 text-gdt-md font-normal text-fg-secondary [&>a]:font-semibold [&>a]:text-fg-brand [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"empty-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full max-w-95 min-w-0 flex-col items-center justify-center gap-gdt-sm text-gdt-sm text-balance sm:flex-row [&_[data-slot=button]]:w-full sm:[&_[data-slot=button]]:w-auto\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tEmpty,\n\tEmptyHeader,\n\tEmptyTitle,\n\tEmptyDescription,\n\tEmptyContent,\n\tEmptyMedia,\n};\n"],"mappings":";;;;;AAAA,SAAS,WAA8B;AAarC;AARF,SAAS,MAAM;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACJ,GAEG;AACF,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA,YAAY,YAAY;AAAA,QACxB,YAAY,aAAa;AAAA,QACzB;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,IAAM,qBAAqB;AAAA,EAC1B;AAAA,EACA;AAAA,IACC,UAAU;AAAA,MACT,SAAS;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,MAChB,SAAS;AAAA,IACV;AAAA,EACD;AACD;AAEA,SAAS,WAAW;AAAA,EACnB;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACJ,GAA0E;AACzE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,mBAAmB,EAAE,SAAS,UAAU,CAAC,CAAC;AAAA,MACvD,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,iBAAiB,EAAE,WAAW,GAAG,MAAM,GAA8B;AAC7E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}