@startdownnotez404/ui 1.3.5 → 1.3.6

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 (254) hide show
  1. package/dist/AutocompleteField-653233JU.mjs +203 -0
  2. package/dist/AutocompleteField-653233JU.mjs.map +1 -0
  3. package/dist/AvatarField-KFASMVZU.mjs +378 -0
  4. package/dist/AvatarField-KFASMVZU.mjs.map +1 -0
  5. package/dist/{DateField-ZYMZFHL4.mjs → DateField-CDJ6W6XF.mjs} +19 -7
  6. package/dist/DateField-CDJ6W6XF.mjs.map +1 -0
  7. package/dist/DateRangeField-ZWSFT5KV.mjs +118 -0
  8. package/dist/DateRangeField-ZWSFT5KV.mjs.map +1 -0
  9. package/dist/{DateTimeField-TPTJ7YIZ.mjs → DateTimeField-SFAF4I6A.mjs} +36 -11
  10. package/dist/DateTimeField-SFAF4I6A.mjs.map +1 -0
  11. package/dist/FileUploadField-TSNCSLXX.mjs +101 -0
  12. package/dist/FileUploadField-TSNCSLXX.mjs.map +1 -0
  13. package/dist/{JSONEditorField-TMRWGXVR.mjs → JSONEditorField-3KXC2GOG.mjs} +7 -6
  14. package/dist/{JSONEditorField-TMRWGXVR.mjs.map → JSONEditorField-3KXC2GOG.mjs.map} +1 -1
  15. package/dist/{PopperMenu-LJ36RPBW.mjs → PopperMenu-PSHLKIEZ.mjs} +26 -12
  16. package/dist/{PopperMenu-LJ36RPBW.mjs.map → PopperMenu-PSHLKIEZ.mjs.map} +1 -1
  17. package/dist/{TelField-LOGRVZ4I.mjs → TelField-FRQT2UBJ.mjs} +8 -7
  18. package/dist/{TelField-LOGRVZ4I.mjs.map → TelField-FRQT2UBJ.mjs.map} +1 -1
  19. package/dist/TimeField-XVWXBJID.mjs +94 -0
  20. package/dist/TimeField-XVWXBJID.mjs.map +1 -0
  21. package/dist/alert.d.mts +148 -18
  22. package/dist/alert.d.ts +148 -18
  23. package/dist/alert.js +698 -254
  24. package/dist/alert.js.map +1 -1
  25. package/dist/alert.mjs +46 -10
  26. package/dist/autocomplete.d.mts +438 -4
  27. package/dist/autocomplete.d.ts +438 -4
  28. package/dist/autocomplete.js +632 -21
  29. package/dist/autocomplete.js.map +1 -1
  30. package/dist/autocomplete.mjs +26 -7
  31. package/dist/avatar.js +2 -1
  32. package/dist/avatar.js.map +1 -1
  33. package/dist/avatar.mjs +12 -11
  34. package/dist/box.mjs +2 -1
  35. package/dist/button.mjs +3 -2
  36. package/dist/chart.mjs +3 -2
  37. package/dist/checkbox.mjs +3 -2
  38. package/dist/chunk-2FK24ZPJ.mjs +78 -0
  39. package/dist/chunk-2FK24ZPJ.mjs.map +1 -0
  40. package/dist/{chunk-V26V2S3W.mjs → chunk-3O3N6X6D.mjs} +3 -3
  41. package/dist/{chunk-Y74ALKBL.mjs → chunk-4MSPA7U7.mjs} +11 -9
  42. package/dist/{chunk-Y74ALKBL.mjs.map → chunk-4MSPA7U7.mjs.map} +1 -1
  43. package/dist/{chunk-24XDGNJ6.mjs → chunk-4P45Z5LR.mjs} +63 -41
  44. package/dist/chunk-4P45Z5LR.mjs.map +1 -0
  45. package/dist/chunk-4SSJY32J.mjs +1182 -0
  46. package/dist/chunk-4SSJY32J.mjs.map +1 -0
  47. package/dist/{chunk-XJ2SXC2Q.mjs → chunk-6B6I27TT.mjs} +18 -16
  48. package/dist/{chunk-XJ2SXC2Q.mjs.map → chunk-6B6I27TT.mjs.map} +1 -1
  49. package/dist/chunk-6JKMEH2L.mjs +205 -0
  50. package/dist/chunk-6JKMEH2L.mjs.map +1 -0
  51. package/dist/{chunk-IN3O4R7Q.mjs → chunk-7O526A2D.mjs} +6 -4
  52. package/dist/{chunk-IN3O4R7Q.mjs.map → chunk-7O526A2D.mjs.map} +1 -1
  53. package/dist/chunk-AFLEG5ZC.mjs +28 -0
  54. package/dist/chunk-AFLEG5ZC.mjs.map +1 -0
  55. package/dist/{chunk-UGMRJMFZ.mjs → chunk-BO5CU4ZM.mjs} +4 -4
  56. package/dist/{chunk-JIU5GVM7.mjs → chunk-D4XPNSSI.mjs} +5 -3
  57. package/dist/{chunk-JIU5GVM7.mjs.map → chunk-D4XPNSSI.mjs.map} +1 -1
  58. package/dist/chunk-DPIMA5IO.mjs +72 -0
  59. package/dist/chunk-DPIMA5IO.mjs.map +1 -0
  60. package/dist/chunk-F2CGFVIZ.mjs +83 -0
  61. package/dist/chunk-F2CGFVIZ.mjs.map +1 -0
  62. package/dist/{chunk-R5MKQN6D.mjs → chunk-FBLSJQWK.mjs} +3 -3
  63. package/dist/{chunk-BGB7JHIU.mjs → chunk-FMGZCOJC.mjs} +5 -3
  64. package/dist/{chunk-BGB7JHIU.mjs.map → chunk-FMGZCOJC.mjs.map} +1 -1
  65. package/dist/{chunk-UTVSYS6S.mjs → chunk-FNSIQ2B7.mjs} +18 -6
  66. package/dist/chunk-FNSIQ2B7.mjs.map +1 -0
  67. package/dist/{chunk-JWANK42G.mjs → chunk-FUZ2JNTZ.mjs} +3 -3
  68. package/dist/{chunk-CRYIEYZZ.mjs → chunk-HAJWE62X.mjs} +66 -42
  69. package/dist/chunk-HAJWE62X.mjs.map +1 -0
  70. package/dist/{chunk-CWFWRZWU.mjs → chunk-KSN33A6I.mjs} +3 -2
  71. package/dist/{chunk-CWFWRZWU.mjs.map → chunk-KSN33A6I.mjs.map} +1 -1
  72. package/dist/chunk-KYTHGFFY.mjs +866 -0
  73. package/dist/chunk-KYTHGFFY.mjs.map +1 -0
  74. package/dist/{chunk-QKGCW37O.mjs → chunk-LDFM46LV.mjs} +5 -3
  75. package/dist/{chunk-QKGCW37O.mjs.map → chunk-LDFM46LV.mjs.map} +1 -1
  76. package/dist/chunk-LQNDBPHU.mjs +142 -0
  77. package/dist/chunk-LQNDBPHU.mjs.map +1 -0
  78. package/dist/{chunk-E3I2VDHZ.mjs → chunk-M2PYXSAF.mjs} +6 -4
  79. package/dist/{chunk-E3I2VDHZ.mjs.map → chunk-M2PYXSAF.mjs.map} +1 -1
  80. package/dist/{chunk-DELCADNF.mjs → chunk-ODVKRIVN.mjs} +30 -30
  81. package/dist/{chunk-HR3A4H4E.mjs → chunk-PEJL2T2K.mjs} +13 -11
  82. package/dist/{chunk-HR3A4H4E.mjs.map → chunk-PEJL2T2K.mjs.map} +1 -1
  83. package/dist/{chunk-OGNGPI3M.mjs → chunk-PL55YKT4.mjs} +2 -2
  84. package/dist/{chunk-S6EZVRZC.mjs → chunk-PNSJC6PC.mjs} +5 -28
  85. package/dist/chunk-PNSJC6PC.mjs.map +1 -0
  86. package/dist/{chunk-TDRA5EZI.mjs → chunk-PUREEN2J.mjs} +7 -7
  87. package/dist/chunk-QFS5CENY.mjs +659 -0
  88. package/dist/chunk-QFS5CENY.mjs.map +1 -0
  89. package/dist/chunk-RSN7NH2J.mjs +250 -0
  90. package/dist/chunk-RSN7NH2J.mjs.map +1 -0
  91. package/dist/{chunk-UDREPVEY.mjs → chunk-RVSMEZE3.mjs} +12 -78
  92. package/dist/chunk-RVSMEZE3.mjs.map +1 -0
  93. package/dist/{chunk-SRWPHN2N.mjs → chunk-S64IYJ6Y.mjs} +2 -2
  94. package/dist/{chunk-ZG3NQI77.mjs → chunk-SMD7OEUW.mjs} +6 -4
  95. package/dist/{chunk-ZG3NQI77.mjs.map → chunk-SMD7OEUW.mjs.map} +1 -1
  96. package/dist/{chunk-NJYNJLT7.mjs → chunk-SWFB3A3G.mjs} +2 -2
  97. package/dist/{chunk-RXBQ7KXF.mjs → chunk-USXGNKWJ.mjs} +98 -44
  98. package/dist/chunk-USXGNKWJ.mjs.map +1 -0
  99. package/dist/{chunk-OJV6V7YZ.mjs → chunk-VL7V52YD.mjs} +27 -20
  100. package/dist/chunk-VL7V52YD.mjs.map +1 -0
  101. package/dist/{chunk-2ZZJTBTE.mjs → chunk-WJZ3IYET.mjs} +2 -2
  102. package/dist/chunk-XAJAMVAG.mjs +1720 -0
  103. package/dist/chunk-XAJAMVAG.mjs.map +1 -0
  104. package/dist/chunk-YIJ5QVJ6.mjs +277 -0
  105. package/dist/chunk-YIJ5QVJ6.mjs.map +1 -0
  106. package/dist/{chunk-T6AMRENK.mjs → chunk-YRW5NKD7.mjs} +148 -112
  107. package/dist/chunk-YRW5NKD7.mjs.map +1 -0
  108. package/dist/chunk-ZMJKG2UI.mjs +71 -0
  109. package/dist/chunk-ZMJKG2UI.mjs.map +1 -0
  110. package/dist/confirm.d.mts +48 -0
  111. package/dist/confirm.d.ts +48 -0
  112. package/dist/confirm.js +334 -0
  113. package/dist/confirm.js.map +1 -0
  114. package/dist/confirm.mjs +20 -0
  115. package/dist/datePicker.d.mts +256 -14
  116. package/dist/datePicker.d.ts +256 -14
  117. package/dist/datePicker.js +1624 -145
  118. package/dist/datePicker.js.map +1 -1
  119. package/dist/datePicker.mjs +19 -6
  120. package/dist/dialog.d.mts +166 -0
  121. package/dist/dialog.d.ts +166 -0
  122. package/dist/dialog.js +362 -0
  123. package/dist/dialog.js.map +1 -0
  124. package/dist/dialog.mjs +45 -0
  125. package/dist/emptyState.d.mts +17 -0
  126. package/dist/emptyState.d.ts +17 -0
  127. package/dist/emptyState.js +253 -0
  128. package/dist/emptyState.js.map +1 -0
  129. package/dist/emptyState.mjs +12 -0
  130. package/dist/emptyState.mjs.map +1 -0
  131. package/dist/errorState.d.mts +18 -0
  132. package/dist/errorState.d.ts +18 -0
  133. package/dist/{displayFile.js → errorState.js} +107 -156
  134. package/dist/errorState.js.map +1 -0
  135. package/dist/errorState.mjs +15 -0
  136. package/dist/errorState.mjs.map +1 -0
  137. package/dist/fileUpload.d.mts +197 -0
  138. package/dist/fileUpload.d.ts +197 -0
  139. package/dist/fileUpload.js +1483 -0
  140. package/dist/fileUpload.js.map +1 -0
  141. package/dist/fileUpload.mjs +65 -0
  142. package/dist/fileUpload.mjs.map +1 -0
  143. package/dist/flowMap.mjs +7 -6
  144. package/dist/flowMap.mjs.map +1 -1
  145. package/dist/image.js +1195 -429
  146. package/dist/image.js.map +1 -1
  147. package/dist/image.mjs +8 -6
  148. package/dist/index.d.ts +7 -2
  149. package/dist/index.js +8606 -4087
  150. package/dist/index.js.map +1 -1
  151. package/dist/index.mjs +314 -152
  152. package/dist/inlineError.d.mts +16 -0
  153. package/dist/inlineError.d.ts +16 -0
  154. package/dist/inlineError.js +297 -0
  155. package/dist/inlineError.js.map +1 -0
  156. package/dist/inlineError.mjs +15 -0
  157. package/dist/inlineError.mjs.map +1 -0
  158. package/dist/input.mjs +8 -7
  159. package/dist/jsonEditor.mjs +3 -2
  160. package/dist/list.mjs +7 -6
  161. package/dist/loading.mjs +8 -6
  162. package/dist/markdown.mjs +7 -6
  163. package/dist/markdown.mjs.map +1 -1
  164. package/dist/menu.mjs +9 -8
  165. package/dist/modal.js +2 -1
  166. package/dist/modal.js.map +1 -1
  167. package/dist/modal.mjs +7 -5
  168. package/dist/process.d.mts +33 -75
  169. package/dist/process.d.ts +33 -75
  170. package/dist/process.js +1275 -203
  171. package/dist/process.js.map +1 -1
  172. package/dist/process.mjs +12 -9
  173. package/dist/scrollToLoad.mjs +4 -3
  174. package/dist/select.mjs +10 -9
  175. package/dist/skeleton.d.mts +15 -1
  176. package/dist/skeleton.d.ts +15 -1
  177. package/dist/skeleton.js +114 -2
  178. package/dist/skeleton.js.map +1 -1
  179. package/dist/skeleton.mjs +6 -3
  180. package/dist/stepper.mjs +4 -3
  181. package/dist/tab.mjs +10 -9
  182. package/dist/table.d.mts +269 -85
  183. package/dist/table.d.ts +269 -85
  184. package/dist/table.js +5102 -3153
  185. package/dist/table.js.map +1 -1
  186. package/dist/table.mjs +21 -19
  187. package/dist/theme.js +1766 -432
  188. package/dist/theme.js.map +1 -1
  189. package/dist/theme.mjs +32 -25
  190. package/dist/timeline.mjs +4 -3
  191. package/dist/toast.d.mts +49 -0
  192. package/dist/toast.d.ts +49 -0
  193. package/dist/toast.js +175 -0
  194. package/dist/toast.js.map +1 -0
  195. package/dist/toast.mjs +9 -0
  196. package/dist/toast.mjs.map +1 -0
  197. package/dist/toggleButtonGroup.mjs +3 -2
  198. package/dist/useForm.d.mts +270 -86
  199. package/dist/useForm.d.ts +270 -86
  200. package/dist/useForm.js +4672 -2727
  201. package/dist/useForm.js.map +1 -1
  202. package/dist/useForm.mjs +18 -16
  203. package/dist/useSearch.mjs +13 -12
  204. package/dist/variablesRenderer.mjs +8 -7
  205. package/package.json +3 -3
  206. package/dist/AutocompleteField-ZKNU2IRR.mjs +0 -181
  207. package/dist/AutocompleteField-ZKNU2IRR.mjs.map +0 -1
  208. package/dist/AvatarField-SAODT3CZ.mjs +0 -275
  209. package/dist/AvatarField-SAODT3CZ.mjs.map +0 -1
  210. package/dist/DateField-ZYMZFHL4.mjs.map +0 -1
  211. package/dist/DateTimeField-TPTJ7YIZ.mjs.map +0 -1
  212. package/dist/FileUploadField-NTMWBJER.mjs +0 -78
  213. package/dist/FileUploadField-NTMWBJER.mjs.map +0 -1
  214. package/dist/chunk-24XDGNJ6.mjs.map +0 -1
  215. package/dist/chunk-27KYFU7R.mjs +0 -30
  216. package/dist/chunk-27KYFU7R.mjs.map +0 -1
  217. package/dist/chunk-AAH2O24U.mjs +0 -325
  218. package/dist/chunk-AAH2O24U.mjs.map +0 -1
  219. package/dist/chunk-CRYIEYZZ.mjs.map +0 -1
  220. package/dist/chunk-EEH7HACG.mjs +0 -249
  221. package/dist/chunk-EEH7HACG.mjs.map +0 -1
  222. package/dist/chunk-EKPULYPU.mjs +0 -497
  223. package/dist/chunk-EKPULYPU.mjs.map +0 -1
  224. package/dist/chunk-OJV6V7YZ.mjs.map +0 -1
  225. package/dist/chunk-RXBQ7KXF.mjs.map +0 -1
  226. package/dist/chunk-S6EZVRZC.mjs.map +0 -1
  227. package/dist/chunk-SGCUDWO3.mjs +0 -396
  228. package/dist/chunk-SGCUDWO3.mjs.map +0 -1
  229. package/dist/chunk-T6AMRENK.mjs.map +0 -1
  230. package/dist/chunk-UDREPVEY.mjs.map +0 -1
  231. package/dist/chunk-UTVSYS6S.mjs.map +0 -1
  232. package/dist/chunk-XIMFP6RB.mjs +0 -161
  233. package/dist/chunk-XIMFP6RB.mjs.map +0 -1
  234. package/dist/displayFile.d.mts +0 -95
  235. package/dist/displayFile.d.ts +0 -95
  236. package/dist/displayFile.js.map +0 -1
  237. package/dist/displayFile.mjs +0 -19
  238. package/dist/fileUploader.d.mts +0 -86
  239. package/dist/fileUploader.d.ts +0 -86
  240. package/dist/fileUploader.js +0 -722
  241. package/dist/fileUploader.js.map +0 -1
  242. package/dist/fileUploader.mjs +0 -16
  243. /package/dist/{chunk-V26V2S3W.mjs.map → chunk-3O3N6X6D.mjs.map} +0 -0
  244. /package/dist/{chunk-UGMRJMFZ.mjs.map → chunk-BO5CU4ZM.mjs.map} +0 -0
  245. /package/dist/{chunk-R5MKQN6D.mjs.map → chunk-FBLSJQWK.mjs.map} +0 -0
  246. /package/dist/{chunk-JWANK42G.mjs.map → chunk-FUZ2JNTZ.mjs.map} +0 -0
  247. /package/dist/{chunk-DELCADNF.mjs.map → chunk-ODVKRIVN.mjs.map} +0 -0
  248. /package/dist/{chunk-OGNGPI3M.mjs.map → chunk-PL55YKT4.mjs.map} +0 -0
  249. /package/dist/{chunk-TDRA5EZI.mjs.map → chunk-PUREEN2J.mjs.map} +0 -0
  250. /package/dist/{chunk-SRWPHN2N.mjs.map → chunk-S64IYJ6Y.mjs.map} +0 -0
  251. /package/dist/{chunk-NJYNJLT7.mjs.map → chunk-SWFB3A3G.mjs.map} +0 -0
  252. /package/dist/{chunk-2ZZJTBTE.mjs.map → chunk-WJZ3IYET.mjs.map} +0 -0
  253. /package/dist/{displayFile.mjs.map → confirm.mjs.map} +0 -0
  254. /package/dist/{fileUploader.mjs.map → dialog.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/elemental/FileUpload/src/FileUpload.tsx","../src/components/elemental/FileUpload/src/theme.ts","../src/components/elemental/FileUpload/src/utils.ts"],"sourcesContent":["'use client'\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { Box, Stack } from '@/ele/Box'\nimport { Typography } from '@/ele/Typography'\nimport { Button, IconButton } from '@/ele/Button'\nimport { FormHelperText, FormLabel } from '@/ele/Form'\nimport { LinearProgress } from '@/ele/Progress'\nimport { CloseIcon, CloudUploadIcon } from '@/icons/MuiIcon'\nimport { FileIcon, defaultStyles, type FileIconProps } from 'react-file-icon'\nimport {\n fileUploadButtonSx,\n fileUploadDropzoneSx,\n fileUploadIconWellSx,\n fileUploadItemSx,\n fileUploadLibIconSx,\n fileUploadRootSx,\n fileUploadThumbSx,\n fileUploadTileIconWellSx,\n fileUploadTileLibIconSx,\n fileUploadTileListSx,\n fileUploadTileMediaSx,\n fileUploadTileProgressSx,\n fileUploadTileRemoveSx,\n fileUploadTileSx,\n} from './theme'\nimport type { FileUploadItem, FileUploadProps } from './types'\nimport {\n createFileUploadItem,\n formatFileSize,\n isImageFile,\n resolveFileIconStyle,\n validateFiles,\n} from './utils'\n\nfunction mergeSx(\n ...parts: Array<FileUploadProps['sx'] | false | null | undefined>\n): FileUploadProps['sx'] {\n const out: unknown[] = []\n for (const p of parts) {\n if (!p) continue\n if (Array.isArray(p)) out.push(...p)\n else out.push(p)\n }\n return out as FileUploadProps['sx']\n}\n\n/**\n * Soft FileUpload dropzone + file list.\n *\n * **UseForm API:** controlled `value: FileUploadItem[]` / `onChange`.\n * Submit blobs with `value.map((i) => i.file)`. Drive progress from outside\n * by updating `progress` / `status` / `error` on the same items (stable `id`).\n *\n * Soft quiet 1px dashed border + elevated fill (EmptyState / Autocomplete glass).\n * `variant=\"button\"` = compact soft upload button (compound DropZoneButton parity).\n */\nexport const FileUpload = forwardRef<HTMLDivElement, FileUploadProps>(\n function FileUpload(props, ref) {\n const {\n value: valueProp,\n defaultValue,\n onChange,\n onRemove,\n onReject,\n multiple = true,\n accept,\n maxSize,\n maxFiles,\n disabled = false,\n hideDropzone = false,\n disableRemove = false,\n readOnly = false,\n label,\n name,\n helperText,\n error = false,\n required = false,\n variant = 'dropzone',\n itemVariant = 'row',\n buttonLabel = 'Upload file',\n dropzoneTitle = 'Drag & drop files here',\n dropzoneDescription = 'or click to browse',\n id: idProp,\n className,\n sx,\n 'data-testid': dataTestId = 'file-upload',\n } = props\n\n const reactId = useId()\n const inputId = idProp ?? `file-upload-${reactId}`\n const helperId = `${inputId}-helper`\n const inputRef = useRef<HTMLInputElement>(null)\n\n const isControlled = valueProp !== undefined\n const [uncontrolled, setUncontrolled] = useState<FileUploadItem[]>(\n () => defaultValue ?? [],\n )\n const items = useMemo(\n () => (isControlled ? (valueProp ?? []) : uncontrolled),\n [isControlled, valueProp, uncontrolled],\n )\n\n const [active, setActive] = useState(false)\n const dragDepth = useRef(0)\n\n const atCapacity = useMemo(() => {\n if (!multiple) return items.length >= 1\n if (maxFiles != null && maxFiles > 0) return items.length >= maxFiles\n return false\n }, [items.length, maxFiles, multiple])\n\n const commit = useCallback(\n (next: FileUploadItem[]) => {\n if (!isControlled) setUncontrolled(next)\n onChange?.(next)\n },\n [isControlled, onChange],\n )\n\n const ingest = useCallback(\n (fileList: FileList | File[]) => {\n if (disabled) return\n const incoming = Array.from(fileList)\n if (incoming.length === 0) return\n\n const { accepted, rejections } = validateFiles(incoming, {\n accept,\n maxSize,\n maxFiles,\n currentCount: items.length,\n multiple,\n })\n\n if (rejections.length > 0) {\n onReject?.(rejections)\n }\n\n if (accepted.length === 0) return\n\n const nextItems = accepted.map(createFileUploadItem)\n if (!multiple) {\n commit(nextItems.slice(0, 1))\n return\n }\n commit([...items, ...nextItems])\n },\n [\n accept,\n disabled,\n items,\n maxFiles,\n maxSize,\n multiple,\n onReject,\n commit,\n ],\n )\n\n const handleRemove = useCallback(\n (item: FileUploadItem) => {\n if (disabled) return\n const next = items.filter((i) => i.id !== item.id)\n commit(next)\n onRemove?.(item, next)\n if (inputRef.current) inputRef.current.value = ''\n },\n [commit, disabled, items, onRemove],\n )\n\n const openPicker = useCallback(() => {\n if (disabled || atCapacity) return\n inputRef.current?.click()\n }, [atCapacity, disabled])\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) ingest(e.target.files)\n // Allow re-selecting the same file name.\n e.target.value = ''\n },\n [ingest],\n )\n\n const onDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (disabled || atCapacity) return\n dragDepth.current += 1\n setActive(true)\n },\n [atCapacity, disabled],\n )\n\n const onDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragDepth.current = Math.max(0, dragDepth.current - 1)\n if (dragDepth.current === 0) setActive(false)\n }, [])\n\n const onDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }, [])\n\n const onDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragDepth.current = 0\n setActive(false)\n if (disabled || atCapacity) return\n if (e.dataTransfer.files?.length) {\n ingest(e.dataTransfer.files)\n }\n },\n [atCapacity, disabled, ingest],\n )\n\n const queueOnly = readOnly || hideDropzone\n const removeDisabled = readOnly || disableRemove || disabled\n const showTrigger = !queueOnly && !atCapacity\n const isButton = variant === 'button'\n\n const fileInput = (\n <input\n ref={inputRef}\n id={inputId}\n name={name}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={onInputChange}\n style={{ display: 'none' }}\n aria-hidden\n tabIndex={-1}\n />\n )\n\n const dragHandlers = {\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n } as const\n\n return (\n <Box\n ref={ref}\n className={className}\n data-testid={dataTestId}\n data-variant={variant}\n data-readonly={readOnly || queueOnly ? 'true' : undefined}\n sx={mergeSx(fileUploadRootSx, sx) as never}\n >\n {label ? (\n <FormLabel\n htmlFor={showTrigger ? inputId : undefined}\n required={required}\n error={error}\n sx={{\n mb: 0.25,\n color: error ? 'error.main' : 'text.secondary',\n fontSize: '0.8rem',\n fontWeight: 600,\n }}\n >\n {label}\n </FormLabel>\n ) : null}\n\n {fileInput}\n\n {showTrigger ? (\n isButton ? (\n <Button\n type=\"button\"\n disableElevation\n disabled={disabled}\n aria-invalid={error || undefined}\n aria-describedby={helperText ? helperId : undefined}\n data-active={active ? 'true' : 'false'}\n data-error={error ? 'true' : 'false'}\n data-testid={`${dataTestId}-button`}\n startIcon={<CloudUploadIcon sx={{ fontSize: '1.15rem' }} />}\n onClick={openPicker}\n sx={fileUploadButtonSx}\n {...dragHandlers}\n >\n {buttonLabel}\n </Button>\n ) : (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-invalid={error || undefined}\n aria-describedby={helperText ? helperId : undefined}\n data-active={active ? 'true' : 'false'}\n data-error={error ? 'true' : 'false'}\n data-disabled={disabled ? 'true' : 'false'}\n data-testid={`${dataTestId}-dropzone`}\n sx={fileUploadDropzoneSx}\n onClick={openPicker}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n openPicker()\n }\n }}\n {...dragHandlers}\n >\n <CloudUploadIcon\n aria-hidden\n sx={{ fontSize: 36, color: 'var(--fu-icon)', opacity: 0.9 }}\n />\n {typeof dropzoneTitle === 'string' ? (\n <Typography\n variant=\"subtitle2\"\n sx={{ m: 0, color: 'var(--fu-text)', fontWeight: 600 }}\n >\n {dropzoneTitle}\n </Typography>\n ) : (\n dropzoneTitle\n )}\n {dropzoneDescription ? (\n typeof dropzoneDescription === 'string' ? (\n <Typography\n variant=\"caption\"\n sx={{ m: 0, color: 'var(--fu-text-secondary)' }}\n >\n {dropzoneDescription}\n </Typography>\n ) : (\n dropzoneDescription\n )\n ) : null}\n </Box>\n )\n ) : null}\n\n {items.length > 0 ? (\n itemVariant === 'tile' ? (\n <Box\n component=\"ul\"\n data-testid={`${dataTestId}-list`}\n data-item-variant=\"tile\"\n sx={fileUploadTileListSx}\n >\n {items.map((item) => (\n <FileUploadListItem\n key={item.id}\n item={item}\n disabled={disabled}\n disableRemove={removeDisabled}\n onRemove={handleRemove}\n testId={`${dataTestId}-item`}\n itemVariant=\"tile\"\n />\n ))}\n </Box>\n ) : (\n <Stack\n component=\"ul\"\n spacing={1}\n data-testid={`${dataTestId}-list`}\n data-item-variant=\"row\"\n sx={{ m: 0, p: 0, listStyle: 'none' }}\n >\n {items.map((item) => (\n <FileUploadListItem\n key={item.id}\n item={item}\n disabled={disabled}\n disableRemove={removeDisabled}\n onRemove={handleRemove}\n testId={`${dataTestId}-item`}\n itemVariant=\"row\"\n />\n ))}\n </Stack>\n )\n ) : null}\n\n {helperText ? (\n <FormHelperText\n id={helperId}\n error={error}\n sx={{ mx: 0.5, mt: 0 }}\n >\n {helperText}\n </FormHelperText>\n ) : null}\n </Box>\n )\n },\n)\n\nfunction FileUploadTypeIcon({\n file,\n tile = false,\n}: {\n file: File\n tile?: boolean\n}) {\n const resolved = resolveFileIconStyle(\n file,\n defaultStyles as Record<string, Partial<FileIconProps> | undefined>,\n )\n const { extension, styleKey } = resolved\n const iconStyle = resolved.style as Partial<FileIconProps>\n\n return (\n <Box\n aria-hidden\n data-testid=\"file-upload-icon\"\n data-ext={extension || undefined}\n data-style-key={styleKey || undefined}\n sx={tile ? fileUploadTileIconWellSx : fileUploadIconWellSx}\n >\n <Box sx={tile ? fileUploadTileLibIconSx : fileUploadLibIconSx}>\n <FileIcon\n fold\n radius={3}\n extension={extension}\n {...iconStyle}\n />\n </Box>\n </Box>\n )\n}\n\n/**\n * Image/* → soft object-URL thumbnail; onError falls back to react-file-icon.\n * Non-images use react-file-icon + defaultStyles (extension / mime).\n * Object URLs revoked on file change / unmount.\n */\nfunction FileUploadThumb({\n file,\n tile = false,\n}: {\n file: File\n tile?: boolean\n}) {\n const [url, setUrl] = useState<string | null>(null)\n const [previewFailed, setPreviewFailed] = useState(false)\n\n useEffect(() => {\n setPreviewFailed(false)\n if (!isImageFile(file)) {\n setUrl(null)\n return\n }\n const objectUrl = URL.createObjectURL(file)\n setUrl(objectUrl)\n return () => {\n URL.revokeObjectURL(objectUrl)\n }\n }, [file])\n\n if (url && !previewFailed) {\n return (\n <Box\n component=\"img\"\n src={url}\n alt=\"\"\n data-testid=\"file-upload-thumb\"\n sx={tile ? fileUploadTileMediaSx : fileUploadThumbSx}\n onError={() => setPreviewFailed(true)}\n />\n )\n }\n\n return <FileUploadTypeIcon file={file} tile={tile} />\n}\n\ntype ListItemProps = {\n item: FileUploadItem\n disabled: boolean\n disableRemove?: boolean\n onRemove: (item: FileUploadItem) => void\n testId: string\n itemVariant: 'row' | 'tile'\n}\n\nfunction FileUploadListItem({\n item,\n disabled,\n disableRemove = false,\n onRemove,\n testId,\n itemVariant,\n}: ListItemProps) {\n if (itemVariant === 'tile') {\n return (\n <FileUploadTileItem\n item={item}\n disabled={disabled}\n disableRemove={disableRemove}\n onRemove={onRemove}\n testId={testId}\n />\n )\n }\n\n const status = item.status ?? (item.error ? 'error' : 'idle')\n const showProgress =\n status === 'uploading' ||\n (typeof item.progress === 'number' &&\n item.progress > 0 &&\n item.progress < 100 &&\n status !== 'error' &&\n status !== 'success')\n\n return (\n <Box\n component=\"li\"\n data-testid={testId}\n data-status={status}\n data-item-variant=\"row\"\n sx={fileUploadItemSx}\n >\n <FileUploadThumb file={item.file} />\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography\n variant=\"body2\"\n noWrap\n title={item.file.name}\n sx={{ m: 0, fontWeight: 500, color: 'var(--fu-text)' }}\n >\n {item.file.name}\n </Typography>\n <Typography\n variant=\"caption\"\n sx={{ m: 0, color: 'var(--fu-text-secondary)' }}\n >\n {formatFileSize(item.file.size)}\n {item.error ? ` · ${item.error}` : null}\n {status === 'success' && !item.error ? ' · Done' : null}\n </Typography>\n {showProgress ? (\n <LinearProgress\n variant=\"determinate\"\n value={Math.max(0, Math.min(100, item.progress ?? 0))}\n aria-label={`Upload progress ${item.progress ?? 0}%`}\n sx={{ mt: 0.75, height: 4, borderRadius: 2 }}\n />\n ) : null}\n {status === 'uploading' && item.progress == null ? (\n <LinearProgress\n aria-label=\"Uploading\"\n sx={{ mt: 0.75, height: 4, borderRadius: 2 }}\n />\n ) : null}\n </Box>\n {disableRemove ? null : (\n <IconButton\n size=\"small\"\n aria-label={`Remove ${item.file.name}`}\n disabled={disabled}\n onClick={() => onRemove(item)}\n sx={{\n flexShrink: 0,\n color: 'var(--fu-text-secondary)',\n p: 0.35,\n }}\n >\n <CloseIcon sx={{ fontSize: '1rem' }} />\n </IconButton>\n )}\n </Box>\n )\n}\n\n/** Square preview tile — hover shows circular white X at top-right. */\nfunction FileUploadTileItem({\n item,\n disabled,\n disableRemove = false,\n onRemove,\n testId,\n}: Omit<ListItemProps, 'itemVariant'>) {\n const status = item.status ?? (item.error ? 'error' : 'idle')\n const showProgress =\n status === 'uploading' ||\n (typeof item.progress === 'number' &&\n item.progress > 0 &&\n item.progress < 100 &&\n status !== 'error' &&\n status !== 'success')\n const indeterminate = status === 'uploading' && item.progress == null\n\n return (\n <Box\n component=\"li\"\n data-testid={testId}\n data-status={status}\n data-item-variant=\"tile\"\n title={item.file.name}\n sx={fileUploadTileSx}\n >\n <FileUploadThumb file={item.file} tile />\n {showProgress ? (\n <LinearProgress\n variant=\"determinate\"\n value={Math.max(0, Math.min(100, item.progress ?? 0))}\n aria-label={`Upload progress ${item.progress ?? 0}%`}\n sx={fileUploadTileProgressSx}\n />\n ) : null}\n {indeterminate ? (\n <LinearProgress\n aria-label=\"Uploading\"\n sx={fileUploadTileProgressSx}\n />\n ) : null}\n {disableRemove ? null : (\n <IconButton\n className=\"fu-tile-remove\"\n size=\"small\"\n aria-label={`Remove ${item.file.name}`}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation()\n onRemove(item)\n }}\n sx={fileUploadTileRemoveSx}\n >\n <CloseIcon sx={{ fontSize: '0.85rem' }} />\n </IconButton>\n )}\n </Box>\n )\n}\n\nexport default FileUpload\n","import type { SxProps, Theme } from '@mui/material/styles'\n\n/**\n * Soft / quiet FileUpload chrome — Google-style dark:\n * darker canvas, lighter elevated surfaces, 1px borders (not thick outlines).\n * Mirrors EmptyState dashed soft fill + Autocomplete glass vars language.\n */\nexport const fileUploadRootSx: SxProps<Theme> = {\n '--fu-border': 'var(--mui-palette-border-1)',\n '--fu-border-hover': 'var(--mui-palette-border-hover-1, var(--mui-palette-text-secondary))',\n '--fu-border-active': 'color-mix(in srgb, var(--mui-palette-text-secondary) 65%, transparent)',\n '--fu-border-error': 'var(--mui-palette-error-main)',\n '--fu-surface':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 78%, transparent)',\n '--fu-surface-hover':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 92%, transparent)',\n '--fu-surface-active':\n 'color-mix(in srgb, var(--mui-palette-primary-main) 8%, var(--mui-palette-background-paper))',\n '--fu-item-bg':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 88%, transparent)',\n '--fu-icon': 'var(--mui-palette-text-secondary)',\n '--fu-text': 'var(--mui-palette-text-primary)',\n '--fu-text-secondary': 'var(--mui-palette-text-secondary)',\n '--fu-shadow':\n 'inset 0 1px 0 color-mix(in srgb, var(--mui-palette-common-white) 6%, transparent)',\n '--fu-radius': '16px',\n '--fu-item-radius': '12px',\n\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n width: '100%',\n boxSizing: 'border-box',\n\n '[color-scheme=\"dark\"] &': {\n '--fu-surface':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 70%, transparent)',\n '--fu-surface-hover':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 88%, transparent)',\n '--fu-item-bg':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 82%, transparent)',\n '--fu-shadow':\n 'inset 0 1px 0 color-mix(in srgb, var(--mui-palette-common-white) 8%, transparent), 0 1px 2px rgba(0,0,0,0.18)',\n },\n}\n\nexport const fileUploadDropzoneSx: SxProps<Theme> = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n gap: 0.75,\n px: 3,\n py: 3.5,\n minHeight: 140,\n borderRadius: 'var(--fu-radius)',\n border: '1px dashed var(--fu-drop-border, var(--fu-border))',\n backgroundColor: 'var(--fu-drop-bg, var(--fu-surface))',\n boxShadow: 'var(--fu-shadow)',\n color: 'var(--fu-text-secondary)',\n cursor: 'pointer',\n outline: 'none',\n boxSizing: 'border-box',\n transition: 'border-color 160ms ease, background-color 160ms ease, box-shadow 160ms ease',\n '&:hover': {\n borderColor: 'var(--fu-border-hover)',\n backgroundColor: 'var(--fu-surface-hover)',\n },\n '&:focus-visible': {\n borderColor: 'var(--fu-border-active)',\n borderStyle: 'solid',\n },\n '&[data-active=\"true\"]': {\n borderColor: 'var(--fu-border-active)',\n borderStyle: 'solid',\n backgroundColor: 'var(--fu-surface-active)',\n },\n '&[data-error=\"true\"]': {\n '--fu-drop-border': 'var(--fu-border-error)',\n },\n '&[data-disabled=\"true\"]': {\n opacity: 0.58,\n cursor: 'default',\n pointerEvents: 'none',\n },\n}\n\nexport const fileUploadItemSx: SxProps<Theme> = {\n display: 'flex',\n alignItems: 'center',\n gap: 1.25,\n px: 1.25,\n py: 1,\n borderRadius: 'var(--fu-item-radius)',\n border: '1px solid var(--fu-border)',\n backgroundColor: 'var(--fu-item-bg)',\n boxShadow: 'var(--fu-shadow)',\n boxSizing: 'border-box',\n minWidth: 0,\n '&[data-status=\"error\"]': {\n borderColor: 'color-mix(in srgb, var(--mui-palette-error-main) 55%, var(--fu-border))',\n backgroundColor:\n 'color-mix(in srgb, var(--mui-palette-error-main) 8%, var(--fu-item-bg))',\n },\n}\n\n\nexport const fileUploadThumbSx: SxProps<Theme> = {\n width: 36,\n height: 36,\n minWidth: 36,\n borderRadius: '8px',\n objectFit: 'cover',\n flexShrink: 0,\n border: '1px solid var(--fu-border)',\n backgroundColor: 'var(--fu-item-bg)',\n display: 'block',\n boxSizing: 'border-box',\n}\n\nexport const fileUploadIconWellSx: SxProps<Theme> = {\n width: 36,\n height: 36,\n minWidth: 36,\n borderRadius: '8px',\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: '1px solid var(--fu-border)',\n backgroundColor:\n 'color-mix(in srgb, var(--mui-palette-background-paper) 55%, transparent)',\n boxSizing: 'border-box',\n overflow: 'hidden',\n}\n\n/** Scale react-file-icon SVG into the soft well — do not gray/desaturate. */\nexport const fileUploadLibIconSx: SxProps<Theme> = {\n width: 24,\n height: 30,\n lineHeight: 0,\n flexShrink: 0,\n // Keep library colors vivid (no opacity / filter / color overrides).\n color: 'unset',\n filter: 'none',\n opacity: 1,\n '& svg': {\n width: '100%',\n height: '100%',\n display: 'block',\n // Prevent inherited MUI text color from washing glyph/label fills.\n color: 'unset',\n },\n}\n\n/** Compact soft upload button — quiet 1px border, elevated dark surface. */\nexport const fileUploadButtonSx: SxProps<Theme> = {\n alignSelf: 'flex-start',\n textTransform: 'none',\n fontWeight: 600,\n fontSize: '0.8125rem',\n lineHeight: 1.25,\n borderRadius: '10px',\n px: 1.5,\n py: 0.75,\n minHeight: 36,\n border: '1px solid var(--fu-border)',\n backgroundColor: 'var(--fu-surface)',\n color: 'var(--fu-text)',\n boxShadow: 'var(--fu-shadow)',\n transition: 'border-color 160ms ease, background-color 160ms ease, box-shadow 160ms ease',\n '&:hover': {\n borderColor: 'var(--fu-border-hover)',\n backgroundColor: 'var(--fu-surface-hover)',\n },\n '&:focus-visible': {\n borderColor: 'var(--fu-border-active)',\n outline: 'none',\n },\n '&[data-active=\"true\"]': {\n borderColor: 'var(--fu-border-active)',\n backgroundColor: 'var(--fu-surface-active)',\n },\n '&[data-error=\"true\"]': {\n borderColor: 'var(--fu-border-error)',\n color: 'var(--fu-border-error)',\n },\n '&.Mui-disabled': {\n opacity: 0.58,\n borderColor: 'var(--fu-border)',\n color: 'var(--fu-text-secondary)',\n },\n '& .MuiButton-startIcon': {\n marginRight: '8px',\n marginLeft: 0,\n color: 'var(--fu-icon)',\n },\n}\n\n/** Flex wrap grid for tile items. */\nexport const fileUploadTileListSx: SxProps<Theme> = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 1.25,\n m: 0,\n p: 0,\n listStyle: 'none',\n}\n\n/** Soft square preview tile (~80px). */\nexport const fileUploadTileSx: SxProps<Theme> = {\n '--fu-tile-size': '80px',\n position: 'relative',\n width: 'var(--fu-tile-size)',\n height: 'var(--fu-tile-size)',\n minWidth: 'var(--fu-tile-size)',\n borderRadius: '12px',\n border: '1px solid var(--fu-border)',\n backgroundColor: 'var(--fu-item-bg)',\n boxShadow: 'var(--fu-shadow)',\n boxSizing: 'border-box',\n overflow: 'hidden',\n flexShrink: 0,\n '&[data-status=\"error\"]': {\n borderColor: 'color-mix(in srgb, var(--mui-palette-error-main) 55%, var(--fu-border))',\n },\n '&:hover .fu-tile-remove, &:focus-within .fu-tile-remove': {\n opacity: 1,\n pointerEvents: 'auto',\n },\n}\n\n/** Fill tile with image cover. */\nexport const fileUploadTileMediaSx: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n borderRadius: 'inherit',\n}\n\n/** Centered type-icon well inside a tile (non-images). */\nexport const fileUploadTileIconWellSx: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor:\n 'color-mix(in srgb, var(--mui-palette-background-paper) 55%, transparent)',\n border: 'none',\n borderRadius: 0,\n boxSizing: 'border-box',\n overflow: 'hidden',\n}\n\nexport const fileUploadTileLibIconSx: SxProps<Theme> = {\n width: 36,\n height: 44,\n lineHeight: 0,\n flexShrink: 0,\n color: 'unset',\n filter: 'none',\n opacity: 1,\n '& svg': {\n width: '100%',\n height: '100%',\n display: 'block',\n color: 'unset',\n },\n}\n\n/** Circular white X — top-right overlap; visible on hover/focus. */\nexport const fileUploadTileRemoveSx: SxProps<Theme> = {\n position: 'absolute',\n top: 4,\n right: 4,\n zIndex: 2,\n width: 22,\n height: 22,\n p: 0,\n opacity: 0,\n pointerEvents: 'none',\n backgroundColor: '#fff',\n color: 'rgba(15, 23, 42, 0.72)',\n boxShadow: '0 1px 3px rgba(0,0,0,0.22)',\n border: '1px solid color-mix(in srgb, var(--mui-palette-common-black) 8%, transparent)',\n transition: 'opacity 140ms ease, background-color 140ms ease',\n '&:hover': {\n backgroundColor: '#fff',\n color: 'rgba(15, 23, 42, 0.92)',\n },\n '&.Mui-disabled': {\n opacity: 0,\n },\n}\n\n/** Thin progress strip along tile bottom. */\nexport const fileUploadTileProgressSx: SxProps<Theme> = {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n height: 3,\n borderRadius: 0,\n backgroundColor: 'color-mix(in srgb, var(--mui-palette-common-black) 25%, transparent)',\n '& .MuiLinearProgress-bar': {\n borderRadius: 0,\n },\n}\n","import type { FileRejectCode, FileRejection, FileUploadItem } from './types'\n\nlet idSeq = 0\n\n/** Stable id for a new upload item (browser crypto when available). */\nexport function createFileUploadId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n idSeq += 1\n return `fu-${Date.now()}-${idSeq}`\n}\n\nexport function createFileUploadItem(file: File): FileUploadItem {\n return {\n id: createFileUploadId(),\n file,\n status: 'idle',\n progress: 0,\n }\n}\n\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return '—'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n }\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\ntype AcceptRule = { type: 'ext'; value: string } | { type: 'mime'; value: string }\n\nfunction parseAccept(accept?: string): AcceptRule[] {\n if (!accept || !accept.trim()) return []\n return accept\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean)\n .map((token) => {\n if (token.startsWith('.')) {\n return { type: 'ext' as const, value: token.toLowerCase() }\n }\n return { type: 'mime' as const, value: token.toLowerCase() }\n })\n}\n\nfunction matchesAccept(file: File, rules: AcceptRule[]): boolean {\n if (rules.length === 0) return true\n const name = file.name.toLowerCase()\n const mime = (file.type || '').toLowerCase()\n return rules.some((rule) => {\n if (rule.type === 'ext') {\n return name.endsWith(rule.value)\n }\n if (rule.value.endsWith('/*')) {\n const prefix = rule.value.slice(0, -1)\n return mime.startsWith(prefix)\n }\n return mime === rule.value\n })\n}\n\nexport type ValidateFilesOptions = {\n accept?: string\n maxSize?: number\n maxFiles?: number\n currentCount: number\n multiple: boolean\n}\n\n/**\n * Validate incoming FileList / File[] against accept, maxSize, maxFiles, multiple.\n * Accepted files are those that pass; capacity is applied in order.\n */\nexport function validateFiles(\n incoming: File[],\n opts: ValidateFilesOptions,\n): { accepted: File[]; rejections: FileRejection[] } {\n const rules = parseAccept(opts.accept)\n const accepted: File[] = []\n const rejections: FileRejection[] = []\n\n const hardCap = opts.multiple\n ? opts.maxFiles != null && opts.maxFiles > 0\n ? opts.maxFiles\n : Infinity\n : 1\n\n for (const file of incoming) {\n const errors: FileRejectCode[] = []\n\n if (!matchesAccept(file, rules)) {\n errors.push('file-invalid-type')\n }\n if (opts.maxSize != null && opts.maxSize > 0 && file.size > opts.maxSize) {\n errors.push('file-too-large')\n }\n if (opts.currentCount + accepted.length >= hardCap) {\n errors.push('too-many-files')\n }\n\n if (errors.length > 0) {\n rejections.push({ file, errors })\n } else {\n accepted.push(file)\n }\n }\n\n return { accepted, rejections }\n}\n\n\n/** Common mime → extension when File.name has no suffix. */\nconst MIME_TO_EXT: Record<string, string> = {\n 'application/pdf': 'pdf',\n 'application/zip': 'zip',\n 'application/x-zip-compressed': 'zip',\n 'application/gzip': 'gz',\n 'application/x-gzip': 'gz',\n 'application/x-rar-compressed': 'rar',\n 'application/vnd.rar': 'rar',\n 'application/x-7z-compressed': '7z',\n 'application/x-tar': 'tar',\n 'application/json': 'json',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.ms-powerpoint': 'ppt',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',\n 'text/plain': 'txt',\n 'text/csv': 'csv',\n 'text/markdown': 'md',\n 'image/jpeg': 'jpg',\n 'image/png': 'png',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n}\n\n/**\n * Extension for react-file-icon / defaultStyles lookup.\n * Prefers File.name; falls back to a small mime map (not an icon map).\n */\nexport function getFileExtension(file: File): string {\n const name = file.name || ''\n const dot = name.lastIndexOf('.')\n if (dot > 0 && dot < name.length - 1) {\n return name.slice(dot + 1).toLowerCase()\n }\n const mime = (file.type || '').toLowerCase()\n return MIME_TO_EXT[mime] ?? ''\n}\n\nexport function isImageFile(file: File): boolean {\n return typeof file.type === 'string' && file.type.startsWith('image/')\n}\n\nexport type FileIconStyleBag = Record<string, unknown> & {\n type?: string\n labelColor?: string\n labelTextColor?: string\n labelUppercase?: boolean\n foldColor?: string\n color?: string\n glyphColor?: string\n gradientOpacity?: number\n}\n\n/** Alias odd archive suffixes onto react-file-icon defaultStyles keys. */\nconst EXT_ALIASES: Record<string, string> = {\n '7z': '7zip',\n tgz: 'gz',\n tbz: 'gz',\n tbz2: 'gz',\n}\n\n/**\n * defaultStyles.zip/rar/gz only set `type: \"compressed\"` — no labelColor.\n * Amber badge so archives read like pdf's red chip.\n */\nexport const ARCHIVE_FILE_ICON_STYLE = {\n type: 'compressed' as const,\n labelColor: '#E2A903',\n labelTextColor: '#1A1A1A',\n labelUppercase: true,\n foldColor: '#C48E02',\n color: '#F6E7A8',\n glyphColor: 'rgba(40, 30, 0, 0.35)',\n}\n\nconst ARCHIVE_EXTS = new Set([\n 'zip',\n 'zipx',\n 'rar',\n '7z',\n '7zip',\n 'gz',\n 'tar',\n 'tgz',\n 'sitx',\n 'bz2',\n])\n\n/**\n * Many defaultStyles entries are type-only (no labelColor/color) and render as\n * mono whitesmoke. Colorize by glyph `type` so every icon stays vivid.\n * Keys match react-file-icon `type` enum.\n */\nexport const TYPE_COLOR_FALLBACKS: Record<string, FileIconStyleBag> = {\n '3d': {\n type: '3d',\n labelColor: '#5FB9AD',\n foldColor: '#4A9E94',\n color: '#E5F6F4',\n },\n acrobat: {\n type: 'acrobat',\n labelColor: '#D93831',\n foldColor: '#B82E28',\n color: '#FCE8E7',\n },\n android: {\n type: 'android',\n labelColor: '#3DDC84',\n foldColor: '#2BB86A',\n color: '#E6FBF0',\n },\n audio: {\n type: 'audio',\n labelColor: '#9B59B6',\n foldColor: '#7E3F9A',\n color: '#F3E9F8',\n },\n binary: {\n type: 'binary',\n labelColor: '#E67E22',\n foldColor: '#C86A1A',\n color: '#FDF0E4',\n },\n code: {\n type: 'code',\n labelColor: '#3498DB',\n foldColor: '#2A7AB0',\n color: '#E7F3FB',\n },\n compressed: { ...ARCHIVE_FILE_ICON_STYLE },\n document: {\n type: 'document',\n labelColor: '#5B8DEF',\n labelUppercase: true,\n foldColor: '#4A75C9',\n color: '#E8EEF9',\n glyphColor: 'rgba(40, 60, 120, 0.35)',\n },\n drive: {\n type: 'drive',\n labelColor: '#27AE60',\n foldColor: '#1E8A4B',\n color: '#E5F7ED',\n },\n font: {\n type: 'font',\n labelColor: '#8E44AD',\n foldColor: '#71368A',\n color: '#F2E8F7',\n },\n image: {\n type: 'image',\n labelColor: '#1ABC9C',\n foldColor: '#14967C',\n color: '#E4F8F3',\n },\n presentation: {\n type: 'presentation',\n labelColor: '#D35400',\n labelUppercase: true,\n foldColor: '#A84300',\n color: '#FCEADE',\n glyphColor: 'rgba(120, 50, 0, 0.35)',\n },\n settings: {\n type: 'settings',\n labelColor: '#16A085',\n foldColor: '#117A65',\n color: '#E4F6F2',\n },\n spreadsheet: {\n type: 'spreadsheet',\n labelColor: '#2D7D46',\n labelUppercase: true,\n foldColor: '#246338',\n color: '#E5F2EA',\n glyphColor: 'rgba(20, 60, 30, 0.35)',\n },\n vector: {\n type: 'vector',\n labelColor: '#FF7F18',\n foldColor: '#D96A12',\n color: '#FFF0E4',\n },\n video: {\n type: 'video',\n labelColor: '#E74C3C',\n foldColor: '#C0392B',\n color: '#FCE9E7',\n },\n}\n\n/** Unknown / empty ext — never mono whitesmoke. */\nexport const UNKNOWN_FILE_ICON_STYLE: FileIconStyleBag = {\n type: 'document',\n labelColor: '#5B8DEF',\n labelTextColor: '#FFFFFF',\n labelUppercase: true,\n foldColor: '#4A75C9',\n color: '#E8EEF9',\n glyphColor: 'rgba(40, 60, 120, 0.35)',\n}\n\nexport type FileIconStyleProps = {\n /** Label text on the icon (original ext when possible). */\n extension?: string\n /** Key used for defaultStyles lookup (after aliases). */\n styleKey: string\n /** Props to spread onto <FileIcon /> (full defaultStyles + enrichments). */\n style: FileIconStyleBag\n}\n\nconst MONO_PAGE_COLORS = new Set([\n '',\n 'whitesmoke',\n '#fff',\n '#ffffff',\n 'white',\n '#f5f5f5',\n '#fafafa',\n])\n\nfunction hasVividColor(style: FileIconStyleBag): boolean {\n if (typeof style.labelColor === 'string' && style.labelColor.trim()) {\n return true\n }\n if (typeof style.color === 'string') {\n const c = style.color.trim().toLowerCase()\n if (c && !MONO_PAGE_COLORS.has(c)) return true\n }\n return false\n}\n\nfunction mergeColorEnrichment(\n lib: FileIconStyleBag,\n enrichment: FileIconStyleBag,\n): FileIconStyleBag {\n // Spread library defaults fully, then fill only missing color fields —\n // never clobber a rich defaultStyles entry (e.g. pdf/doc/ai).\n return {\n ...enrichment,\n ...lib,\n labelColor: lib.labelColor ?? enrichment.labelColor,\n labelTextColor: lib.labelTextColor ?? enrichment.labelTextColor,\n foldColor: lib.foldColor ?? enrichment.foldColor,\n color: lib.color ?? enrichment.color,\n glyphColor: lib.glyphColor ?? enrichment.glyphColor,\n labelUppercase: lib.labelUppercase ?? enrichment.labelUppercase,\n type: lib.type ?? enrichment.type,\n }\n}\n\n/**\n * Resolve extension + style for react-file-icon.\n * Always spreads `defaultStyles[key]` fully; enriches type-only / unknown\n * entries so icons are never forced grayscale.\n */\nexport function resolveFileIconStyle(\n file: File,\n defaultStyles: Record<string, FileIconStyleBag | undefined>,\n): FileIconStyleProps {\n const rawExt = getFileExtension(file)\n const styleKey = (EXT_ALIASES[rawExt] ?? rawExt).toLowerCase()\n const displayExt = rawExt || styleKey || undefined\n\n // Full library defaults (labelColor, glyphColor, foldColor, type, …).\n const lib: FileIconStyleBag = {\n ...((styleKey ? defaultStyles[styleKey] : undefined) ?? {}),\n }\n\n const isArchive =\n ARCHIVE_EXTS.has(rawExt) ||\n ARCHIVE_EXTS.has(styleKey) ||\n lib.type === 'compressed'\n\n let style: FileIconStyleBag\n if (isArchive) {\n style = { ...lib, ...ARCHIVE_FILE_ICON_STYLE }\n } else if (hasVividColor(lib)) {\n style = { ...lib }\n } else if (lib.type && TYPE_COLOR_FALLBACKS[lib.type]) {\n style = mergeColorEnrichment(lib, TYPE_COLOR_FALLBACKS[lib.type])\n } else {\n style = mergeColorEnrichment(lib, UNKNOWN_FILE_ICON_STYLE)\n }\n\n return {\n extension: displayExt,\n styleKey,\n style,\n }\n}\n"],"mappings":"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","names":["defaultStyles","FileUpload","default"]}
@@ -1,36 +1,38 @@
1
- import {
2
- default as default8
3
- } from "./chunk-VYD3PDBB.mjs";
4
1
  import {
5
2
  MenuPopper,
6
3
  Menu_default,
7
4
  useMenu
8
- } from "./chunk-HR3A4H4E.mjs";
9
- import {
10
- default3 as default7
11
- } from "./chunk-T4X375IG.mjs";
5
+ } from "./chunk-PEJL2T2K.mjs";
12
6
  import {
13
7
  MuiPaper
14
8
  } from "./chunk-3VUAM2GY.mjs";
9
+ import {
10
+ default3 as default8
11
+ } from "./chunk-T4X375IG.mjs";
15
12
  import {
16
13
  CircularProgress
17
14
  } from "./chunk-WYYP3Y34.mjs";
18
15
  import {
19
- Button,
20
- IconButton_default
21
- } from "./chunk-JIU5GVM7.mjs";
16
+ default as default7
17
+ } from "./chunk-VYD3PDBB.mjs";
22
18
  import {
23
19
  default108 as default5,
24
20
  default118 as default6,
25
21
  default33 as default4
26
22
  } from "./chunk-ZVFYOXDE.mjs";
23
+ import {
24
+ Button,
25
+ IconButton_default
26
+ } from "./chunk-D4XPNSSI.mjs";
27
27
  import {
28
28
  default as default3
29
29
  } from "./chunk-4RPFRNXG.mjs";
30
30
  import {
31
- default as default2,
31
+ default as default2
32
+ } from "./chunk-PNSJC6PC.mjs";
33
+ import {
32
34
  mergeSx
33
- } from "./chunk-S6EZVRZC.mjs";
35
+ } from "./chunk-AFLEG5ZC.mjs";
34
36
 
35
37
  // src/components/compound/UseSearch/context.tsx
36
38
  import * as React2 from "react";
@@ -154,7 +156,7 @@ var SearchBar = ({
154
156
  [handleSubmit, submitOnEnter]
155
157
  );
156
158
  return /* @__PURE__ */ jsx2(
157
- default8,
159
+ default7,
158
160
  {
159
161
  value: query,
160
162
  onChange: (e) => setQuery(e.target.value),
@@ -170,8 +172,8 @@ var SearchBar = ({
170
172
  ),
171
173
  slotProps: {
172
174
  input: {
173
- startAdornment: adornment ? /* @__PURE__ */ jsx2(default7, { position: "start", children: adornment }) : void 0,
174
- endAdornment: /* @__PURE__ */ jsxs(default7, { position: "end", children: [
175
+ startAdornment: adornment ? /* @__PURE__ */ jsx2(default8, { position: "start", children: adornment }) : void 0,
176
+ endAdornment: /* @__PURE__ */ jsxs(default8, { position: "end", children: [
175
177
  query ? /* @__PURE__ */ jsx2(IconButton_default, { size: "small", onClick: handleClear, "aria-label": "Clear search input", children: /* @__PURE__ */ jsx2(default5, { fontSize: "small" }) }) : null,
176
178
  showSubmitButton ? loading ? /* @__PURE__ */ jsx2(CircularProgress, { size: 18, thickness: 5 }) : /* @__PURE__ */ jsx2(IconButton_default, { size: "small", onClick: handleSubmit, "aria-label": "Submit search", children: /* @__PURE__ */ jsx2(default4, { fontSize: "small" }) }) : null
177
179
  ] })
@@ -555,4 +557,4 @@ export {
555
557
  SearchResults,
556
558
  UseSearchLayout
557
559
  };
558
- //# sourceMappingURL=chunk-XJ2SXC2Q.mjs.map
560
+ //# sourceMappingURL=chunk-6B6I27TT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/compound/UseSearch/context.tsx","../src/components/compound/UseSearch/useSearch.ts","../src/components/compound/UseSearch/SearchBar.tsx","../src/components/compound/UseSearch/SearchScope.tsx","../src/components/compound/UseSearch/SuggestionList.tsx","../src/components/compound/UseSearch/theme.ts","../src/components/compound/UseSearch/ScopeSuggestions.tsx","../src/components/compound/UseSearch/UseSearchLayout.tsx","../src/components/compound/UseSearch/SearchResults.tsx"],"sourcesContent":["import * as React from 'react';\nimport {UseSearchOptions, UseSearchReturn} from './_types';\nimport {useSearch} from './useSearch';\n\ntype SearchContextType = UseSearchReturn;\n\nconst SearchContext = React.createContext<SearchContextType | null>(null);\n\n// props accepted by <SearchProvider>. `options` corresponds to the\n// same configuration object passed to the standalone `useSearch` hook.\nexport interface SearchProviderProps {\n options?: UseSearchOptions;\n children: React.ReactNode;\n}\n\nexport const SearchProvider: React.FC<SearchProviderProps> = ({options, children}) => {\n const search = useSearch(options);\n return <SearchContext.Provider value={search}>{children}</SearchContext.Provider>;\n};\n\nexport function useSearchContext(): SearchContextType {\n const ctx = React.useContext(SearchContext);\n if (!ctx) {\n throw new Error('useSearchContext must be used within a SearchProvider');\n }\n return ctx;\n}\n","import * as React from 'react';\nimport {UseSearchOptions, UseSearchReturn} from './_types';\n\nexport function useSearch(options: UseSearchOptions = {}): UseSearchReturn {\n const {\n defaultQuery = '',\n query: controlledQuery,\n onQueryChange,\n debounceMs = 300,\n defaultScope,\n scope: controlledScope,\n onScopeChange,\n } = options;\n\n const isQueryControlled = controlledQuery !== undefined;\n const isScopeControlled = controlledScope !== undefined;\n\n const [innerQuery, setInnerQuery] = React.useState(defaultQuery);\n const [debouncedQuery, setDebouncedQuery] = React.useState(controlledQuery ?? defaultQuery);\n const [innerScope, setInnerScope] = React.useState<string | undefined>(defaultScope);\n\n const query = isQueryControlled ? controlledQuery : innerQuery;\n\n // Stable refs for callbacks - prevents unnecessary re-references if inline functions are passed.\n const onQueryChangeRef = React.useRef(onQueryChange);\n React.useLayoutEffect(() => { onQueryChangeRef.current = onQueryChange; }, [onQueryChange]);\n \n const onScopeChangeRef = React.useRef(onScopeChange);\n React.useLayoutEffect(() => { onScopeChangeRef.current = onScopeChange; }, [onScopeChange]);\n\n const setQuery = React.useCallback(\n (q: string) => {\n if (!isQueryControlled) {\n setInnerQuery(q);\n }\n onQueryChangeRef.current?.(q);\n },\n [isQueryControlled],\n );\n\n const scope = isScopeControlled ? controlledScope : innerScope;\n\n const setScope = React.useCallback(\n (nextScope: string | undefined) => {\n if (!isScopeControlled) {\n setInnerScope(nextScope);\n }\n onScopeChangeRef.current?.(nextScope);\n },\n [isScopeControlled],\n );\n\n const clear = React.useCallback(() => {\n if (!isQueryControlled) {\n setInnerQuery(defaultQuery);\n }\n onQueryChangeRef.current?.(defaultQuery);\n\n if (!isScopeControlled) {\n setInnerScope(defaultScope);\n }\n onScopeChangeRef.current?.(defaultScope);\n }, [defaultQuery, defaultScope, isQueryControlled, isScopeControlled]);\n\n React.useEffect(() => {\n const timer = window.setTimeout(() => {\n setDebouncedQuery(query);\n }, debounceMs);\n\n // Cleanup guarantees pending timers are cancelled on unmount.\n return () => window.clearTimeout(timer);\n }, [query, debounceMs]);\n\n return {query, debouncedQuery, setQuery, scope, setScope, clear};\n}\n","import * as React from 'react';\nimport { InputAdornment } from '@/ele/Form';\nimport { TextField } from '@/ele/Input';\nimport { IconButton } from '@/ele/Button';\nimport { CircularProgress } from '@/ele/Progress';\nimport { ClearIcon, SearchIcon } from '@/icons/MuiIcon';\nimport type {SearchBarProps} from './_types';\nimport {useSearchContext} from './context';\nimport { mergeSx } from '@/_utils/_func';\n\nexport const SearchBar: React.FC<SearchBarProps> = ({\n placeholder,\n adornment,\n onSubmit,\n showSubmitButton = true,\n submitOnEnter = true,\n loading = false,\n sx,\n}) => {\n const {query, scope, setQuery} = useSearchContext();\n\n // Stable ref — callers can pass inline functions without stale-closure bugs.\n const onSubmitRef = React.useRef(onSubmit);\n React.useLayoutEffect(() => { onSubmitRef.current = onSubmit; }, [onSubmit]);\n\n const handleClear = React.useCallback(() => {\n setQuery('');\n }, [setQuery]);\n\n const handleSubmit = React.useCallback(() => {\n const normalized = query.trim();\n if (!normalized) {\n return;\n }\n onSubmitRef.current?.(normalized, scope);\n }, [query, scope]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!submitOnEnter) {\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit, submitOnEnter],\n );\n\n return (\n <TextField\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n sx={mergeSx(\n {\n \"& .MuiInputAdornment-root\": {\n gap: 0.5,\n },\n },\n sx,\n )}\n slotProps={{\n input: {\n startAdornment: adornment ? (\n <InputAdornment position=\"start\">{adornment}</InputAdornment>\n ) : undefined,\n endAdornment: (\n <InputAdornment position=\"end\">\n {query ? (\n <IconButton size=\"small\" onClick={handleClear} aria-label=\"Clear search input\">\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n ) : null}\n {showSubmitButton ? (\n loading ? (\n <CircularProgress size={18} thickness={5} />\n ) : (\n <IconButton size=\"small\" onClick={handleSubmit} aria-label=\"Submit search\">\n <SearchIcon fontSize=\"small\" />\n </IconButton>\n )\n ) : null}\n </InputAdornment>\n ),\n },\n }}\n />\n );\n};\n","import * as React from 'react';\nimport {Button} from '@/ele/Button';\nimport {MenuPopper, useMenu} from '@/ele/Menu';\nimport {ArrowDropDownRoundedIcon} from '@/icons/MuiIcon';\nimport type {SearchScopeProps} from './_types';\nimport {useSearchContext} from './context';\n\nexport const SearchScope: React.FC<SearchScopeProps> = ({\n options,\n sx,\n placeholderLabel = 'All',\n}) => {\n const {scope, setScope} = useSearchContext();\n\n const openMenuProps = useMenu({\n onItemClickClientArg: ({closeHandler}) => {\n closeHandler?.();\n },\n initSelected: scope ? [scope] : [],\n });\n\n const menuOptions = React.useMemo(() => (options || []).map(option => ({\n id: option.value,\n label: option.label,\n onClick: () => {\n setScope(option.value);\n },\n })), [options, setScope]);\n\n if (!options || options.length === 0) {\n return null;\n }\n\n const activeLabel = options.find(option => option.value === scope)?.label ?? placeholderLabel;\n\n return (\n <>\n <Button\n size='small'\n variant='outlined'\n onClick={openMenuProps.onTriggerClickHandler}\n endIcon={<ArrowDropDownRoundedIcon />}\n sx={sx}\n >\n {activeLabel}\n </Button>\n\n <MenuPopper\n options={menuOptions}\n openMenuProps={{\n ...openMenuProps,\n initSelected: scope ? [scope] : [],\n sorted: false,\n }}\n placement='bottom-start'\n menuItemProps={{\n fontSize: '0.875rem',\n padding: '6px 12px',\n }}\n />\n </>\n );\n};\n","import * as React from 'react';\nimport { Box } from '@/ele/Box';\nimport { CircularProgress } from '@/ele/Progress';\nimport { Paper } from '@/ele/Paper';\nimport { Typography } from '@/ele/Typography';\nimport {Menu} from '@/ele/Menu';\nimport type {SuggestionItem, SuggestionListProps} from './_types';\nimport {useSearchContext} from './context';\nimport { useSearchRootSx } from './theme';\nimport { mergeSx } from '@/_utils/_func';\n\nconst DEFAULT_MAX_ITEMS = 8;\n\nexport function SuggestionList<T extends SuggestionItem>({\n items,\n onSelect,\n renderItem,\n getItemLabel,\n maxItems = DEFAULT_MAX_ITEMS,\n showWhenEmptyQuery = false,\n loading = false,\n loadingText = 'Fetching suggestions...',\n emptyText = 'No suggestions',\n filterMode = 'client',\n footer,\n sx,\n}: SuggestionListProps<T>) {\n const {query, setQuery} = useSearchContext();\n\n const resolvedGetLabel = React.useCallback(\n (item: T) => (getItemLabel ? getItemLabel(item) : item.label),\n [getItemLabel],\n );\n\n const normalizedQuery = query.trim().toLowerCase();\n\n const filteredItems = React.useMemo(() => {\n if (!showWhenEmptyQuery && !normalizedQuery) {\n return [] as T[];\n }\n\n if (filterMode === 'none') {\n return items.slice(0, maxItems);\n }\n\n return items\n .filter(item => {\n if (!normalizedQuery) {\n return true;\n }\n return resolvedGetLabel(item).toLowerCase().includes(normalizedQuery);\n })\n .slice(0, maxItems);\n }, [filterMode, items, maxItems, normalizedQuery, resolvedGetLabel, showWhenEmptyQuery]);\n\n const handleSelect = React.useCallback(\n (item: T) => {\n setQuery(resolvedGetLabel(item));\n onSelect?.(item);\n },\n [onSelect, resolvedGetLabel, setQuery],\n );\n\n const menuOptions = React.useMemo(\n () =>\n filteredItems.map(item => ({\n id: String(item.id),\n label: renderItem ? renderItem(item) : resolvedGetLabel(item),\n onClick: () => handleSelect(item),\n })),\n [filteredItems, handleSelect, renderItem, resolvedGetLabel],\n );\n\n if (loading && (normalizedQuery || showWhenEmptyQuery)) {\n return (\n <Paper elevation={3} sx={sx}>\n <Box sx={{display: 'flex', alignItems: 'center', gap: 1, px: 1.5, py: 1.25}}>\n <CircularProgress size={16} thickness={5} />\n <Typography variant='body2'>{loadingText}</Typography>\n </Box>\n </Paper>\n );\n }\n\n if (filteredItems.length === 0) {\n if (!normalizedQuery && !showWhenEmptyQuery) {\n return null;\n }\n\n return (\n <Paper elevation={3} sx={sx}>\n <Box sx={mergeSx({ px: 1.5, py: 1.25 }, useSearchRootSx)}>\n <Typography variant='body2' sx={{ color: 'var(--usesearch-empty-text-color)' }}>\n {emptyText}\n </Typography>\n </Box>\n </Paper>\n );\n }\n\n return (\n <Paper elevation={3} sx={sx}>\n <Menu\n options={menuOptions}\n initSelected={[]}\n sorted={false}\n menuItemProps={{\n fontSize: '0.875rem',\n padding: '6px 12px',\n }}\n />\n {footer ? (\n <Box sx={{px: 1, pb: 1}}>\n {footer}\n </Box>\n ) : null}\n </Paper>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\n/**\n * Root-level CSS variable aliases for UseSearch compound component.\n * Spread on container elements — children consume via `var(--*)`.\n */\nexport const useSearchRootSx: SxProps<Theme> = {\n '--usesearch-empty-text-color': 'var(--mui-palette-text-secondary)',\n};\n","import * as React from 'react';\nimport {Button} from '@/ele/Button';\nimport {ScopeSuggestionsProps, SuggestionItem} from './_types';\nimport {SuggestionList} from './SuggestionList';\nimport {useSearchContext} from './context';\n\nexport function ScopeSuggestions<T extends SuggestionItem>({\n getSuggestions,\n onLoadMore,\n hasMore,\n loadMoreLabel = 'Load more',\n onLoadingChange,\n onError,\n onSelect,\n renderItem,\n getItemLabel,\n maxItems,\n showWhenEmptyQuery,\n loadingText,\n emptyText,\n filterMode,\n sx,\n}: ScopeSuggestionsProps<T>) {\n const {scope, debouncedQuery} = useSearchContext();\n const requestIdRef = React.useRef(0);\n const [items, setItems] = React.useState<T[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n\n // Stable refs for callbacks — prevents infinite loops when callers pass inline functions.\n const getSuggestionsRef = React.useRef(getSuggestions);\n React.useLayoutEffect(() => { getSuggestionsRef.current = getSuggestions; }, [getSuggestions]);\n const onLoadingChangeRef = React.useRef(onLoadingChange);\n React.useLayoutEffect(() => { onLoadingChangeRef.current = onLoadingChange; }, [onLoadingChange]);\n const onErrorRef = React.useRef(onError);\n React.useLayoutEffect(() => { onErrorRef.current = onError; }, [onError]);\n\n const resolvedHasMore = React.useMemo(() => {\n if (typeof hasMore === 'function') {\n return hasMore(items, scope, debouncedQuery.trim());\n }\n return Boolean(hasMore);\n }, [debouncedQuery, hasMore, items, scope]);\n\n React.useEffect(() => {\n const query = debouncedQuery.trim();\n\n if (!query && !showWhenEmptyQuery) {\n setItems([]);\n setLoading(false);\n setLoadingMore(false);\n onLoadingChangeRef.current?.(false);\n return;\n }\n\n requestIdRef.current += 1;\n const currentRequestId = requestIdRef.current;\n let isActive = true;\n\n setLoading(true);\n onLoadingChangeRef.current?.(true);\n\n Promise.resolve(getSuggestionsRef.current(scope, query))\n .then(next => {\n if (!isActive || currentRequestId !== requestIdRef.current) {\n return;\n }\n setItems(next);\n })\n .catch(error => {\n if (!isActive || currentRequestId !== requestIdRef.current) {\n return;\n }\n setItems([]);\n onErrorRef.current?.(error);\n })\n .finally(() => {\n if (!isActive || currentRequestId !== requestIdRef.current) {\n return;\n }\n setLoading(false);\n setLoadingMore(false);\n onLoadingChangeRef.current?.(false);\n });\n\n return () => {\n isActive = false;\n // Notify parent that loading stopped when the effect is re-run or component unmounts.\n onLoadingChangeRef.current?.(false);\n };\n }, [debouncedQuery, scope, showWhenEmptyQuery]);\n\n const handleLoadMore = React.useCallback(() => {\n if (!onLoadMore || loading || loadingMore) {\n return;\n }\n\n const query = debouncedQuery.trim();\n if (!query && !showWhenEmptyQuery) {\n return;\n }\n\n setLoadingMore(true);\n Promise.resolve(onLoadMore(scope, query, items))\n .then(next => {\n setItems(next);\n })\n .catch(error => {\n onErrorRef.current?.(error);\n })\n .finally(() => {\n setLoadingMore(false);\n });\n }, [debouncedQuery, items, loading, loadingMore, onLoadMore, scope, showWhenEmptyQuery]);\n\n const footer = onLoadMore && resolvedHasMore ? (\n <Button\n size='small'\n variant='text'\n fullWidth\n disabled={loadingMore || loading}\n onClick={handleLoadMore}\n >\n {loadingMore ? 'Loading more...' : loadMoreLabel}\n </Button>\n ) : null;\n\n return (\n <SuggestionList\n items={items}\n loading={loading}\n footer={footer}\n onSelect={onSelect}\n renderItem={renderItem}\n getItemLabel={getItemLabel}\n maxItems={maxItems}\n showWhenEmptyQuery={showWhenEmptyQuery}\n loadingText={loadingText}\n emptyText={emptyText}\n filterMode={filterMode}\n sx={sx}\n />\n );\n}\n","import * as React from 'react';\nimport { Box } from '@/ele/Box';\nimport type {SuggestionItem, UseSearchLayoutProps} from './_types';\nimport {SearchBar} from './SearchBar';\nimport {SearchScope} from './SearchScope';\nimport {ScopeSuggestions} from './ScopeSuggestions';\nimport {SearchResults} from './SearchResults';\n\nconst DEFAULT_CONTAINER_SX = {width: 560, maxWidth: '90vw', position: 'relative'};\nconst DEFAULT_ROW_SX = {display: 'flex', gap: 1};\nconst DEFAULT_SCOPE_SX = {minWidth: 130};\nconst DEFAULT_SEARCH_BAR_SX = {flex: 1};\nconst DEFAULT_SUGGESTIONS_SX = {\n position: 'absolute',\n top: 56,\n left: 0,\n right: 0,\n zIndex: 2,\n};\n\nexport function UseSearchLayout<T extends SuggestionItem>({\n scopeOptions,\n scopePlaceholderLabel = 'Engine',\n searchPlaceholder = 'Search',\n getSuggestions,\n onLoadMoreSuggestions,\n hasMoreSuggestions,\n loadMoreSuggestionsLabel,\n onSuggestionSelect,\n renderSuggestionItem,\n getSuggestionLabel,\n suggestionFilterMode,\n suggestionsLoadingText,\n suggestionsEmptyText,\n onSuggestionsError,\n onSearchSubmit,\n children,\n containerSx,\n rowSx,\n scopeSx,\n searchBarSx,\n suggestionsSx,\n}: UseSearchLayoutProps<T>) {\n const [suggestionsLoading, setSuggestionsLoading] = React.useState(false);\n\n return (\n <Box sx={containerSx ?? DEFAULT_CONTAINER_SX}>\n <Box sx={rowSx ?? DEFAULT_ROW_SX}>\n <SearchScope\n options={scopeOptions}\n sx={scopeSx ?? DEFAULT_SCOPE_SX}\n placeholderLabel={scopePlaceholderLabel}\n />\n <SearchBar\n placeholder={searchPlaceholder}\n sx={searchBarSx ?? DEFAULT_SEARCH_BAR_SX}\n loading={suggestionsLoading}\n onSubmit={onSearchSubmit}\n />\n </Box>\n\n {getSuggestions && (\n <ScopeSuggestions\n getSuggestions={getSuggestions}\n onLoadMore={onLoadMoreSuggestions}\n hasMore={hasMoreSuggestions}\n loadMoreLabel={loadMoreSuggestionsLabel}\n onLoadingChange={setSuggestionsLoading}\n onSelect={onSuggestionSelect}\n renderItem={renderSuggestionItem}\n getItemLabel={getSuggestionLabel}\n filterMode={suggestionFilterMode}\n loadingText={suggestionsLoadingText}\n emptyText={suggestionsEmptyText}\n onError={onSuggestionsError}\n sx={suggestionsSx ?? DEFAULT_SUGGESTIONS_SX}\n />\n )}\n\n <SearchResults>\n {children}\n </SearchResults>\n </Box>\n );\n}\n","import * as React from 'react';\nimport type {SearchResultsProps} from './_types';\nimport {useSearchContext} from './context';\n\nexport const SearchResults: React.FC<SearchResultsProps> = ({children}) => {\n const {debouncedQuery, scope} = useSearchContext();\n return <>{children(debouncedQuery, scope)}</>;\n};\n"],"mappings":"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","names":["React","React","jsx","default","React","jsx","jsxs","default","React","jsx","jsxs","default","React","jsx","React","Fragment","jsx","jsx","jsxs","default"]}
1
+ {"version":3,"sources":["../src/components/compound/UseSearch/context.tsx","../src/components/compound/UseSearch/useSearch.ts","../src/components/compound/UseSearch/SearchBar.tsx","../src/components/compound/UseSearch/SearchScope.tsx","../src/components/compound/UseSearch/SuggestionList.tsx","../src/components/compound/UseSearch/theme.ts","../src/components/compound/UseSearch/ScopeSuggestions.tsx","../src/components/compound/UseSearch/UseSearchLayout.tsx","../src/components/compound/UseSearch/SearchResults.tsx"],"sourcesContent":["import * as React from 'react';\nimport {UseSearchOptions, UseSearchReturn} from './_types';\nimport {useSearch} from './useSearch';\n\ntype SearchContextType = UseSearchReturn;\n\nconst SearchContext = React.createContext<SearchContextType | null>(null);\n\n// props accepted by <SearchProvider>. `options` corresponds to the\n// same configuration object passed to the standalone `useSearch` hook.\nexport interface SearchProviderProps {\n options?: UseSearchOptions;\n children: React.ReactNode;\n}\n\nexport const SearchProvider: React.FC<SearchProviderProps> = ({options, children}) => {\n const search = useSearch(options);\n return <SearchContext.Provider value={search}>{children}</SearchContext.Provider>;\n};\n\nexport function useSearchContext(): SearchContextType {\n const ctx = React.useContext(SearchContext);\n if (!ctx) {\n throw new Error('useSearchContext must be used within a SearchProvider');\n }\n return ctx;\n}\n","import * as React from 'react';\nimport {UseSearchOptions, UseSearchReturn} from './_types';\n\nexport function useSearch(options: UseSearchOptions = {}): UseSearchReturn {\n const {\n defaultQuery = '',\n query: controlledQuery,\n onQueryChange,\n debounceMs = 300,\n defaultScope,\n scope: controlledScope,\n onScopeChange,\n } = options;\n\n const isQueryControlled = controlledQuery !== undefined;\n const isScopeControlled = controlledScope !== undefined;\n\n const [innerQuery, setInnerQuery] = React.useState(defaultQuery);\n const [debouncedQuery, setDebouncedQuery] = React.useState(controlledQuery ?? defaultQuery);\n const [innerScope, setInnerScope] = React.useState<string | undefined>(defaultScope);\n\n const query = isQueryControlled ? controlledQuery : innerQuery;\n\n // Stable refs for callbacks - prevents unnecessary re-references if inline functions are passed.\n const onQueryChangeRef = React.useRef(onQueryChange);\n React.useLayoutEffect(() => { onQueryChangeRef.current = onQueryChange; }, [onQueryChange]);\n \n const onScopeChangeRef = React.useRef(onScopeChange);\n React.useLayoutEffect(() => { onScopeChangeRef.current = onScopeChange; }, [onScopeChange]);\n\n const setQuery = React.useCallback(\n (q: string) => {\n if (!isQueryControlled) {\n setInnerQuery(q);\n }\n onQueryChangeRef.current?.(q);\n },\n [isQueryControlled],\n );\n\n const scope = isScopeControlled ? controlledScope : innerScope;\n\n const setScope = React.useCallback(\n (nextScope: string | undefined) => {\n if (!isScopeControlled) {\n setInnerScope(nextScope);\n }\n onScopeChangeRef.current?.(nextScope);\n },\n [isScopeControlled],\n );\n\n const clear = React.useCallback(() => {\n if (!isQueryControlled) {\n setInnerQuery(defaultQuery);\n }\n onQueryChangeRef.current?.(defaultQuery);\n\n if (!isScopeControlled) {\n setInnerScope(defaultScope);\n }\n onScopeChangeRef.current?.(defaultScope);\n }, [defaultQuery, defaultScope, isQueryControlled, isScopeControlled]);\n\n React.useEffect(() => {\n const timer = window.setTimeout(() => {\n setDebouncedQuery(query);\n }, debounceMs);\n\n // Cleanup guarantees pending timers are cancelled on unmount.\n return () => window.clearTimeout(timer);\n }, [query, debounceMs]);\n\n return {query, debouncedQuery, setQuery, scope, setScope, clear};\n}\n","import * as React from 'react';\nimport { InputAdornment } from '@/ele/Form';\nimport { TextField } from '@/ele/Input';\nimport { IconButton } from '@/ele/Button';\nimport { CircularProgress } from '@/ele/Progress';\nimport { ClearIcon, SearchIcon } from '@/icons/MuiIcon';\nimport type {SearchBarProps} from './_types';\nimport {useSearchContext} from './context';\nimport { mergeSx } from '@/_utils/_func';\n\nexport const SearchBar: React.FC<SearchBarProps> = ({\n placeholder,\n adornment,\n onSubmit,\n showSubmitButton = true,\n submitOnEnter = true,\n loading = false,\n sx,\n}) => {\n const {query, scope, setQuery} = useSearchContext();\n\n // Stable ref — callers can pass inline functions without stale-closure bugs.\n const onSubmitRef = React.useRef(onSubmit);\n React.useLayoutEffect(() => { onSubmitRef.current = onSubmit; }, [onSubmit]);\n\n const handleClear = React.useCallback(() => {\n setQuery('');\n }, [setQuery]);\n\n const handleSubmit = React.useCallback(() => {\n const normalized = query.trim();\n if (!normalized) {\n return;\n }\n onSubmitRef.current?.(normalized, scope);\n }, [query, scope]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!submitOnEnter) {\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit, submitOnEnter],\n );\n\n return (\n <TextField\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n sx={mergeSx(\n {\n \"& .MuiInputAdornment-root\": {\n gap: 0.5,\n },\n },\n sx,\n )}\n slotProps={{\n input: {\n startAdornment: adornment ? (\n <InputAdornment position=\"start\">{adornment}</InputAdornment>\n ) : undefined,\n endAdornment: (\n <InputAdornment position=\"end\">\n {query ? (\n <IconButton size=\"small\" onClick={handleClear} aria-label=\"Clear search input\">\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n ) : null}\n {showSubmitButton ? (\n loading ? (\n <CircularProgress size={18} thickness={5} />\n ) : (\n <IconButton size=\"small\" onClick={handleSubmit} aria-label=\"Submit search\">\n <SearchIcon fontSize=\"small\" />\n </IconButton>\n )\n ) : null}\n </InputAdornment>\n ),\n },\n }}\n />\n );\n};\n","import * as React from 'react';\nimport {Button} from '@/ele/Button';\nimport {MenuPopper, useMenu} from '@/ele/Menu';\nimport {ArrowDropDownRoundedIcon} from '@/icons/MuiIcon';\nimport type {SearchScopeProps} from './_types';\nimport {useSearchContext} from './context';\n\nexport const SearchScope: React.FC<SearchScopeProps> = ({\n options,\n sx,\n placeholderLabel = 'All',\n}) => {\n const {scope, setScope} = useSearchContext();\n\n const openMenuProps = useMenu({\n onItemClickClientArg: ({closeHandler}) => {\n closeHandler?.();\n },\n initSelected: scope ? [scope] : [],\n });\n\n const menuOptions = React.useMemo(() => (options || []).map(option => ({\n id: option.value,\n label: option.label,\n onClick: () => {\n setScope(option.value);\n },\n })), [options, setScope]);\n\n if (!options || options.length === 0) {\n return null;\n }\n\n const activeLabel = options.find(option => option.value === scope)?.label ?? placeholderLabel;\n\n return (\n <>\n <Button\n size='small'\n variant='outlined'\n onClick={openMenuProps.onTriggerClickHandler}\n endIcon={<ArrowDropDownRoundedIcon />}\n sx={sx}\n >\n {activeLabel}\n </Button>\n\n <MenuPopper\n options={menuOptions}\n openMenuProps={{\n ...openMenuProps,\n initSelected: scope ? [scope] : [],\n sorted: false,\n }}\n placement='bottom-start'\n menuItemProps={{\n fontSize: '0.875rem',\n padding: '6px 12px',\n }}\n />\n </>\n );\n};\n","import * as React from 'react';\nimport { Box } from '@/ele/Box';\nimport { CircularProgress } from '@/ele/Progress';\nimport { Paper } from '@/ele/Paper';\nimport { Typography } from '@/ele/Typography';\nimport {Menu} from '@/ele/Menu';\nimport type {SuggestionItem, SuggestionListProps} from './_types';\nimport {useSearchContext} from './context';\nimport { useSearchRootSx } from './theme';\nimport { mergeSx } from '@/_utils/_func';\n\nconst DEFAULT_MAX_ITEMS = 8;\n\nexport function SuggestionList<T extends SuggestionItem>({\n items,\n onSelect,\n renderItem,\n getItemLabel,\n maxItems = DEFAULT_MAX_ITEMS,\n showWhenEmptyQuery = false,\n loading = false,\n loadingText = 'Fetching suggestions...',\n emptyText = 'No suggestions',\n filterMode = 'client',\n footer,\n sx,\n}: SuggestionListProps<T>) {\n const {query, setQuery} = useSearchContext();\n\n const resolvedGetLabel = React.useCallback(\n (item: T) => (getItemLabel ? getItemLabel(item) : item.label),\n [getItemLabel],\n );\n\n const normalizedQuery = query.trim().toLowerCase();\n\n const filteredItems = React.useMemo(() => {\n if (!showWhenEmptyQuery && !normalizedQuery) {\n return [] as T[];\n }\n\n if (filterMode === 'none') {\n return items.slice(0, maxItems);\n }\n\n return items\n .filter(item => {\n if (!normalizedQuery) {\n return true;\n }\n return resolvedGetLabel(item).toLowerCase().includes(normalizedQuery);\n })\n .slice(0, maxItems);\n }, [filterMode, items, maxItems, normalizedQuery, resolvedGetLabel, showWhenEmptyQuery]);\n\n const handleSelect = React.useCallback(\n (item: T) => {\n setQuery(resolvedGetLabel(item));\n onSelect?.(item);\n },\n [onSelect, resolvedGetLabel, setQuery],\n );\n\n const menuOptions = React.useMemo(\n () =>\n filteredItems.map(item => ({\n id: String(item.id),\n label: renderItem ? renderItem(item) : resolvedGetLabel(item),\n onClick: () => handleSelect(item),\n })),\n [filteredItems, handleSelect, renderItem, resolvedGetLabel],\n );\n\n if (loading && (normalizedQuery || showWhenEmptyQuery)) {\n return (\n <Paper elevation={3} sx={sx}>\n <Box sx={{display: 'flex', alignItems: 'center', gap: 1, px: 1.5, py: 1.25}}>\n <CircularProgress size={16} thickness={5} />\n <Typography variant='body2'>{loadingText}</Typography>\n </Box>\n </Paper>\n );\n }\n\n if (filteredItems.length === 0) {\n if (!normalizedQuery && !showWhenEmptyQuery) {\n return null;\n }\n\n return (\n <Paper elevation={3} sx={sx}>\n <Box sx={mergeSx({ px: 1.5, py: 1.25 }, useSearchRootSx)}>\n <Typography variant='body2' sx={{ color: 'var(--usesearch-empty-text-color)' }}>\n {emptyText}\n </Typography>\n </Box>\n </Paper>\n );\n }\n\n return (\n <Paper elevation={3} sx={sx}>\n <Menu\n options={menuOptions}\n initSelected={[]}\n sorted={false}\n menuItemProps={{\n fontSize: '0.875rem',\n padding: '6px 12px',\n }}\n />\n {footer ? (\n <Box sx={{px: 1, pb: 1}}>\n {footer}\n </Box>\n ) : null}\n </Paper>\n );\n}\n","import type { SxProps, Theme } from '@mui/material/styles';\n\n/**\n * Root-level CSS variable aliases for UseSearch compound component.\n * Spread on container elements — children consume via `var(--*)`.\n */\nexport const useSearchRootSx: SxProps<Theme> = {\n '--usesearch-empty-text-color': 'var(--mui-palette-text-secondary)',\n};\n","import * as React from 'react';\nimport {Button} from '@/ele/Button';\nimport {ScopeSuggestionsProps, SuggestionItem} from './_types';\nimport {SuggestionList} from './SuggestionList';\nimport {useSearchContext} from './context';\n\nexport function ScopeSuggestions<T extends SuggestionItem>({\n getSuggestions,\n onLoadMore,\n hasMore,\n loadMoreLabel = 'Load more',\n onLoadingChange,\n onError,\n onSelect,\n renderItem,\n getItemLabel,\n maxItems,\n showWhenEmptyQuery,\n loadingText,\n emptyText,\n filterMode,\n sx,\n}: ScopeSuggestionsProps<T>) {\n const {scope, debouncedQuery} = useSearchContext();\n const requestIdRef = React.useRef(0);\n const [items, setItems] = React.useState<T[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n\n // Stable refs for callbacks — prevents infinite loops when callers pass inline functions.\n const getSuggestionsRef = React.useRef(getSuggestions);\n React.useLayoutEffect(() => { getSuggestionsRef.current = getSuggestions; }, [getSuggestions]);\n const onLoadingChangeRef = React.useRef(onLoadingChange);\n React.useLayoutEffect(() => { onLoadingChangeRef.current = onLoadingChange; }, [onLoadingChange]);\n const onErrorRef = React.useRef(onError);\n React.useLayoutEffect(() => { onErrorRef.current = onError; }, [onError]);\n\n const resolvedHasMore = React.useMemo(() => {\n if (typeof hasMore === 'function') {\n return hasMore(items, scope, debouncedQuery.trim());\n }\n return Boolean(hasMore);\n }, [debouncedQuery, hasMore, items, scope]);\n\n React.useEffect(() => {\n const query = debouncedQuery.trim();\n\n if (!query && !showWhenEmptyQuery) {\n setItems([]);\n setLoading(false);\n setLoadingMore(false);\n onLoadingChangeRef.current?.(false);\n return;\n }\n\n requestIdRef.current += 1;\n const currentRequestId = requestIdRef.current;\n let isActive = true;\n\n setLoading(true);\n onLoadingChangeRef.current?.(true);\n\n Promise.resolve(getSuggestionsRef.current(scope, query))\n .then(next => {\n if (!isActive || currentRequestId !== requestIdRef.current) {\n return;\n }\n setItems(next);\n })\n .catch(error => {\n if (!isActive || currentRequestId !== requestIdRef.current) {\n return;\n }\n setItems([]);\n onErrorRef.current?.(error);\n })\n .finally(() => {\n if (!isActive || currentRequestId !== requestIdRef.current) {\n return;\n }\n setLoading(false);\n setLoadingMore(false);\n onLoadingChangeRef.current?.(false);\n });\n\n return () => {\n isActive = false;\n // Notify parent that loading stopped when the effect is re-run or component unmounts.\n onLoadingChangeRef.current?.(false);\n };\n }, [debouncedQuery, scope, showWhenEmptyQuery]);\n\n const handleLoadMore = React.useCallback(() => {\n if (!onLoadMore || loading || loadingMore) {\n return;\n }\n\n const query = debouncedQuery.trim();\n if (!query && !showWhenEmptyQuery) {\n return;\n }\n\n setLoadingMore(true);\n Promise.resolve(onLoadMore(scope, query, items))\n .then(next => {\n setItems(next);\n })\n .catch(error => {\n onErrorRef.current?.(error);\n })\n .finally(() => {\n setLoadingMore(false);\n });\n }, [debouncedQuery, items, loading, loadingMore, onLoadMore, scope, showWhenEmptyQuery]);\n\n const footer = onLoadMore && resolvedHasMore ? (\n <Button\n size='small'\n variant='text'\n fullWidth\n disabled={loadingMore || loading}\n onClick={handleLoadMore}\n >\n {loadingMore ? 'Loading more...' : loadMoreLabel}\n </Button>\n ) : null;\n\n return (\n <SuggestionList\n items={items}\n loading={loading}\n footer={footer}\n onSelect={onSelect}\n renderItem={renderItem}\n getItemLabel={getItemLabel}\n maxItems={maxItems}\n showWhenEmptyQuery={showWhenEmptyQuery}\n loadingText={loadingText}\n emptyText={emptyText}\n filterMode={filterMode}\n sx={sx}\n />\n );\n}\n","import * as React from 'react';\nimport { Box } from '@/ele/Box';\nimport type {SuggestionItem, UseSearchLayoutProps} from './_types';\nimport {SearchBar} from './SearchBar';\nimport {SearchScope} from './SearchScope';\nimport {ScopeSuggestions} from './ScopeSuggestions';\nimport {SearchResults} from './SearchResults';\n\nconst DEFAULT_CONTAINER_SX = {width: 560, maxWidth: '90vw', position: 'relative'};\nconst DEFAULT_ROW_SX = {display: 'flex', gap: 1};\nconst DEFAULT_SCOPE_SX = {minWidth: 130};\nconst DEFAULT_SEARCH_BAR_SX = {flex: 1};\nconst DEFAULT_SUGGESTIONS_SX = {\n position: 'absolute',\n top: 56,\n left: 0,\n right: 0,\n zIndex: 2,\n};\n\nexport function UseSearchLayout<T extends SuggestionItem>({\n scopeOptions,\n scopePlaceholderLabel = 'Engine',\n searchPlaceholder = 'Search',\n getSuggestions,\n onLoadMoreSuggestions,\n hasMoreSuggestions,\n loadMoreSuggestionsLabel,\n onSuggestionSelect,\n renderSuggestionItem,\n getSuggestionLabel,\n suggestionFilterMode,\n suggestionsLoadingText,\n suggestionsEmptyText,\n onSuggestionsError,\n onSearchSubmit,\n children,\n containerSx,\n rowSx,\n scopeSx,\n searchBarSx,\n suggestionsSx,\n}: UseSearchLayoutProps<T>) {\n const [suggestionsLoading, setSuggestionsLoading] = React.useState(false);\n\n return (\n <Box sx={containerSx ?? DEFAULT_CONTAINER_SX}>\n <Box sx={rowSx ?? DEFAULT_ROW_SX}>\n <SearchScope\n options={scopeOptions}\n sx={scopeSx ?? DEFAULT_SCOPE_SX}\n placeholderLabel={scopePlaceholderLabel}\n />\n <SearchBar\n placeholder={searchPlaceholder}\n sx={searchBarSx ?? DEFAULT_SEARCH_BAR_SX}\n loading={suggestionsLoading}\n onSubmit={onSearchSubmit}\n />\n </Box>\n\n {getSuggestions && (\n <ScopeSuggestions\n getSuggestions={getSuggestions}\n onLoadMore={onLoadMoreSuggestions}\n hasMore={hasMoreSuggestions}\n loadMoreLabel={loadMoreSuggestionsLabel}\n onLoadingChange={setSuggestionsLoading}\n onSelect={onSuggestionSelect}\n renderItem={renderSuggestionItem}\n getItemLabel={getSuggestionLabel}\n filterMode={suggestionFilterMode}\n loadingText={suggestionsLoadingText}\n emptyText={suggestionsEmptyText}\n onError={onSuggestionsError}\n sx={suggestionsSx ?? DEFAULT_SUGGESTIONS_SX}\n />\n )}\n\n <SearchResults>\n {children}\n </SearchResults>\n </Box>\n );\n}\n","import * as React from 'react';\nimport type {SearchResultsProps} from './_types';\nimport {useSearchContext} from './context';\n\nexport const SearchResults: React.FC<SearchResultsProps> = ({children}) => {\n const {debouncedQuery, scope} = useSearchContext();\n return <>{children(debouncedQuery, scope)}</>;\n};\n"],"mappings":"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","names":["React","React","jsx","default","React","jsx","jsxs","default","React","jsx","jsxs","default","React","jsx","React","Fragment","jsx","jsx","jsxs","default"]}
@@ -0,0 +1,205 @@
1
+ import {
2
+ require_classnames
3
+ } from "./chunk-2FK24ZPJ.mjs";
4
+ import {
5
+ CLASSNAMEs
6
+ } from "./chunk-KSN33A6I.mjs";
7
+ import {
8
+ mergeSx
9
+ } from "./chunk-AFLEG5ZC.mjs";
10
+ import {
11
+ __toESM
12
+ } from "./chunk-FJ6ZGZIA.mjs";
13
+
14
+ // src/components/elemental/Dialog/src/Dialog/Dialog.tsx
15
+ var import_classnames = __toESM(require_classnames());
16
+ import MuiDialog from "@mui/material/Dialog";
17
+
18
+ // src/components/elemental/Dialog/src/Dialog/theme.ts
19
+ var DIALOG_PAPER_RADIUS = "16px";
20
+ var DIALOG_SHADOW_LIGHT = "0 1px 2px rgba(0, 0, 0, 0.10), 0 4px 12px rgba(0, 0, 0, 0.12), 0 10px 24px rgba(0, 0, 0, 0.10)";
21
+ var DIALOG_SHADOW_DARK = "0 1px 2px rgba(0, 0, 0, 0.45), 0 4px 10px rgba(0, 0, 0, 0.50), 0 12px 28px rgba(0, 0, 0, 0.55)";
22
+ var dialogDarkShadowSx = {
23
+ '[data-mui-color-scheme="dark"] &, [color-scheme="dark"] &': {
24
+ "--dialog-shadow": DIALOG_SHADOW_DARK,
25
+ boxShadow: DIALOG_SHADOW_DARK
26
+ }
27
+ };
28
+ var dialogPaperTokens = {
29
+ "--dialog-bg": "var(--mui-palette-background-paper)",
30
+ "--dialog-border": "var(--mui-palette-border-1)",
31
+ "--dialog-shadow": DIALOG_SHADOW_LIGHT,
32
+ backgroundColor: "var(--dialog-bg)",
33
+ // Kill MUI Paper dark-mode elevation overlay so paper stays a flat soft surface.
34
+ backgroundImage: "none",
35
+ borderRadius: DIALOG_PAPER_RADIUS,
36
+ border: "1px solid var(--dialog-border)",
37
+ boxShadow: "var(--dialog-shadow)",
38
+ outline: "none"
39
+ };
40
+ var dialogPaperSx = {
41
+ ...dialogPaperTokens,
42
+ ...dialogDarkShadowSx
43
+ };
44
+ var dialogBackdropTokens = {
45
+ backgroundColor: "color-mix(in srgb, var(--mui-palette-common-black, #000) 36%, transparent)",
46
+ backdropFilter: "blur(2px)"
47
+ };
48
+ var dialogBackdropSx = dialogBackdropTokens;
49
+ var dialogTheme = {
50
+ styleOverrides: {
51
+ paper: {
52
+ ...dialogPaperTokens,
53
+ ...dialogDarkShadowSx
54
+ }
55
+ }
56
+ };
57
+ var dialogTitleTheme = {
58
+ styleOverrides: {
59
+ root: {
60
+ fontSize: "1.05rem",
61
+ fontWeight: 600,
62
+ padding: "20px 20px 8px",
63
+ lineHeight: 1.35
64
+ }
65
+ }
66
+ };
67
+ var dialogContentTheme = {
68
+ styleOverrides: {
69
+ root: {
70
+ padding: "8px 20px 12px",
71
+ "&.MuiDialogContent-root:first-of-type": {
72
+ paddingTop: "16px"
73
+ }
74
+ }
75
+ }
76
+ };
77
+ var dialogSecondaryButtonSx = {
78
+ textTransform: "none",
79
+ color: "var(--mui-palette-text-secondary)",
80
+ borderColor: "var(--mui-palette-border-1)",
81
+ "--button-color": "var(--mui-palette-text-secondary)",
82
+ "--variant-outlinedColor": "var(--mui-palette-text-secondary)",
83
+ "--variant-outlinedBorder": "var(--mui-palette-border-1)",
84
+ "&:hover": {
85
+ color: "var(--mui-palette-text-secondary)",
86
+ borderColor: "var(--mui-palette-border-hover-1)",
87
+ backgroundColor: "var(--mui-palette-background-hover-1)",
88
+ "--button-hover-border-color": "var(--mui-palette-border-hover-1)"
89
+ }
90
+ };
91
+ var dialogActionsTheme = {
92
+ styleOverrides: {
93
+ root: {
94
+ padding: "8px 16px 16px",
95
+ gap: "8px",
96
+ // Soften default Cancel pattern (outlined + inherit) inside Dialog only.
97
+ // Do not restyle primary/error/etc. outlined buttons or global Buttons.
98
+ "& .MuiButton-outlined.MuiButton-colorInherit": {
99
+ ...dialogSecondaryButtonSx
100
+ }
101
+ }
102
+ }
103
+ };
104
+ var dialogContentTextTheme = {
105
+ styleOverrides: {
106
+ root: {
107
+ color: "var(--mui-palette-text-secondary)",
108
+ fontSize: "0.875rem"
109
+ }
110
+ }
111
+ };
112
+
113
+ // src/components/elemental/Dialog/src/Dialog/Dialog.tsx
114
+ import { jsx } from "react/jsx-runtime";
115
+ function resolveSlotProps(slot, ownerState) {
116
+ if (slot == null) return void 0;
117
+ if (typeof slot === "function") {
118
+ return slot(ownerState);
119
+ }
120
+ return slot;
121
+ }
122
+ function Dialog({
123
+ className,
124
+ slotProps,
125
+ ...rest
126
+ }) {
127
+ const modalClass = (0, import_classnames.default)(CLASSNAMEs.elemental.dialog, className);
128
+ return /* @__PURE__ */ jsx(
129
+ MuiDialog,
130
+ {
131
+ className: modalClass,
132
+ ...rest,
133
+ slotProps: {
134
+ ...slotProps,
135
+ paper: (ownerState) => {
136
+ const resolved = resolveSlotProps(slotProps?.paper, ownerState) ?? {};
137
+ const { sx: hostSx, elevation, ...restPaper } = resolved;
138
+ return {
139
+ elevation: elevation ?? 0,
140
+ ...restPaper,
141
+ sx: mergeSx(dialogPaperSx, hostSx)
142
+ };
143
+ },
144
+ backdrop: (ownerState) => {
145
+ const resolved = resolveSlotProps(slotProps?.backdrop, ownerState) ?? {};
146
+ const { sx: hostSx, ...restBackdrop } = resolved;
147
+ return {
148
+ ...restBackdrop,
149
+ sx: mergeSx(dialogBackdropSx, hostSx)
150
+ };
151
+ }
152
+ }
153
+ }
154
+ );
155
+ }
156
+
157
+ // src/components/elemental/Dialog/src/Dialog/DialogTitle.tsx
158
+ import MuiDialogTitle from "@mui/material/DialogTitle";
159
+ import { jsx as jsx2 } from "react/jsx-runtime";
160
+ function DialogTitle(props) {
161
+ return /* @__PURE__ */ jsx2(MuiDialogTitle, { ...props });
162
+ }
163
+
164
+ // src/components/elemental/Dialog/src/Dialog/DialogContent.tsx
165
+ import MuiDialogContent from "@mui/material/DialogContent";
166
+ import { jsx as jsx3 } from "react/jsx-runtime";
167
+ function DialogContent(props) {
168
+ return /* @__PURE__ */ jsx3(MuiDialogContent, { ...props });
169
+ }
170
+
171
+ // src/components/elemental/Dialog/src/Dialog/DialogActions.tsx
172
+ import MuiDialogActions from "@mui/material/DialogActions";
173
+ import { jsx as jsx4 } from "react/jsx-runtime";
174
+ function DialogActions(props) {
175
+ return /* @__PURE__ */ jsx4(MuiDialogActions, { ...props });
176
+ }
177
+
178
+ // src/components/elemental/Dialog/src/Dialog/DialogContentText.tsx
179
+ import MuiDialogContentText from "@mui/material/DialogContentText";
180
+ import { jsx as jsx5 } from "react/jsx-runtime";
181
+ function DialogContentText(props) {
182
+ return /* @__PURE__ */ jsx5(MuiDialogContentText, { ...props });
183
+ }
184
+
185
+ export {
186
+ DIALOG_PAPER_RADIUS,
187
+ DIALOG_SHADOW_LIGHT,
188
+ DIALOG_SHADOW_DARK,
189
+ dialogPaperTokens,
190
+ dialogPaperSx,
191
+ dialogBackdropTokens,
192
+ dialogBackdropSx,
193
+ dialogTheme,
194
+ dialogTitleTheme,
195
+ dialogContentTheme,
196
+ dialogSecondaryButtonSx,
197
+ dialogActionsTheme,
198
+ dialogContentTextTheme,
199
+ Dialog,
200
+ DialogTitle,
201
+ DialogContent,
202
+ DialogActions,
203
+ DialogContentText
204
+ };
205
+ //# sourceMappingURL=chunk-6JKMEH2L.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/elemental/Dialog/src/Dialog/Dialog.tsx","../src/components/elemental/Dialog/src/Dialog/theme.ts","../src/components/elemental/Dialog/src/Dialog/DialogTitle.tsx","../src/components/elemental/Dialog/src/Dialog/DialogContent.tsx","../src/components/elemental/Dialog/src/Dialog/DialogActions.tsx","../src/components/elemental/Dialog/src/Dialog/DialogContentText.tsx"],"sourcesContent":["'use client'\nimport MuiDialog, { type DialogProps as MuiDialogProps } from '@mui/material/Dialog'\nimport classnames from 'classnames'\nimport { CLASSNAMEs } from '@/_utils/_const/classNames'\nimport { mergeSx } from '@/_utils/_func'\nimport { dialogBackdropSx, dialogPaperSx } from './theme'\n\nexport type DialogProps = MuiDialogProps\n\ntype SlotOwnerState = unknown\n\nfunction resolveSlotProps<T extends object>(\n slot: T | ((ownerState: SlotOwnerState) => T) | undefined,\n ownerState: SlotOwnerState,\n): T | undefined {\n if (slot == null) return undefined\n if (typeof slot === 'function') {\n return (slot as (ownerState: SlotOwnerState) => T)(ownerState)\n }\n return slot\n}\n\n/**\n * Soft theme-aware Dialog — MUI Dialog API with Confirm/MuiModal quiet chrome.\n *\n * Drop-in for `@mui/material/Dialog` consumers: same props, soft paper\n * (`background.paper` + hairline border) and soft backdrop.\n *\n * [Doc](https://mui.com/material-ui/api/dialog/)\n */\nexport default function Dialog({\n className,\n slotProps,\n ...rest\n}: DialogProps) {\n const modalClass = classnames(CLASSNAMEs.elemental.dialog, className)\n\n return (\n <MuiDialog\n className={modalClass}\n {...rest}\n slotProps={{\n ...slotProps,\n paper: (ownerState) => {\n const resolved = resolveSlotProps(slotProps?.paper as object | ((o: SlotOwnerState) => object) | undefined, ownerState) ?? {}\n const { sx: hostSx, elevation, ...restPaper } = resolved as {\n sx?: unknown\n elevation?: number\n [key: string]: unknown\n }\n return {\n elevation: elevation ?? 0,\n ...restPaper,\n sx: mergeSx(dialogPaperSx, hostSx as never),\n }\n },\n backdrop: (ownerState) => {\n const resolved = resolveSlotProps(slotProps?.backdrop as object | ((o: SlotOwnerState) => object) | undefined, ownerState) ?? {}\n const { sx: hostSx, ...restBackdrop } = resolved as {\n sx?: unknown\n [key: string]: unknown\n }\n return {\n ...restBackdrop,\n sx: mergeSx(dialogBackdropSx, hostSx as never),\n }\n },\n }}\n />\n )\n}\n","import type { SxProps, Theme } from '@mui/material/styles'\nimport type { MuiComponentTheme } from '@/_utils/_types'\n\n/** Soft dialog paper radius - matches Confirm quiet chrome. */\nexport const DIALOG_PAPER_RADIUS = '16px'\n\n/** Soft black elevation for light scheme (quiet, no thick chrome). */\nexport const DIALOG_SHADOW_LIGHT =\n '0 1px 2px rgba(0, 0, 0, 0.10), 0 4px 12px rgba(0, 0, 0, 0.12), 0 10px 24px rgba(0, 0, 0, 0.10)'\n\n/**\n * Soft black elevation for dark scheme.\n * Avoid palette `shadow-outset-1` here: it uses border-1 grey and reads as a pale halo.\n */\nexport const DIALOG_SHADOW_DARK =\n '0 1px 2px rgba(0, 0, 0, 0.45), 0 4px 10px rgba(0, 0, 0, 0.50), 0 12px 28px rgba(0, 0, 0, 0.55)'\n\nconst dialogDarkShadowSx = {\n '[data-mui-color-scheme=\"dark\"] &, [color-scheme=\"dark\"] &': {\n '--dialog-shadow': DIALOG_SHADOW_DARK,\n boxShadow: DIALOG_SHADOW_DARK,\n },\n} as const\n\n/** Soft/quiet Dialog paper tokens (shared by wrapper sx + theme overrides). */\nexport const dialogPaperTokens = {\n '--dialog-bg': 'var(--mui-palette-background-paper)',\n '--dialog-border': 'var(--mui-palette-border-1)',\n '--dialog-shadow': DIALOG_SHADOW_LIGHT,\n\n backgroundColor: 'var(--dialog-bg)',\n // Kill MUI Paper dark-mode elevation overlay so paper stays a flat soft surface.\n backgroundImage: 'none',\n borderRadius: DIALOG_PAPER_RADIUS,\n border: '1px solid var(--dialog-border)',\n boxShadow: 'var(--dialog-shadow)',\n outline: 'none',\n} as const\n\n/**\n * Soft/quiet Dialog paper.\n * Uses elevated `background.paper` (Google-style mid-grey over near-black canvas\n * in dark) with a hairline border - not raw white MUI defaults or thick chrome.\n */\nexport const dialogPaperSx: SxProps<Theme> = {\n ...dialogPaperTokens,\n ...dialogDarkShadowSx,\n}\n\n/** Soft glass-adjacent backdrop - same language as Confirm. */\nexport const dialogBackdropTokens = {\n backgroundColor:\n 'color-mix(in srgb, var(--mui-palette-common-black, #000) 36%, transparent)',\n backdropFilter: 'blur(2px)',\n} as const\n\nexport const dialogBackdropSx: SxProps<Theme> = dialogBackdropTokens\n\nexport const dialogTheme = {\n styleOverrides: {\n paper: {\n ...dialogPaperTokens,\n ...dialogDarkShadowSx,\n },\n },\n} as const satisfies MuiComponentTheme<'MuiDialog'>\n\nexport const dialogTitleTheme = {\n styleOverrides: {\n root: {\n fontSize: '1.05rem',\n fontWeight: 600,\n padding: '20px 20px 8px',\n lineHeight: 1.35,\n },\n },\n} as const satisfies MuiComponentTheme<'MuiDialogTitle'>\n\nexport const dialogContentTheme = {\n styleOverrides: {\n root: {\n padding: '8px 20px 12px',\n '&.MuiDialogContent-root:first-of-type': {\n paddingTop: '16px',\n },\n },\n },\n} as const satisfies MuiComponentTheme<'MuiDialogContent'>\n\n/**\n * Soft secondary / Cancel button chrome for DialogActions.\n * Matches Confirm cancel: quiet border-1 + muted text-secondary\n * (not stark white inherit outline in dark).\n */\nexport const dialogSecondaryButtonSx = {\n textTransform: 'none' as const,\n color: 'var(--mui-palette-text-secondary)',\n borderColor: 'var(--mui-palette-border-1)',\n '--button-color': 'var(--mui-palette-text-secondary)',\n '--variant-outlinedColor': 'var(--mui-palette-text-secondary)',\n '--variant-outlinedBorder': 'var(--mui-palette-border-1)',\n '&:hover': {\n color: 'var(--mui-palette-text-secondary)',\n borderColor: 'var(--mui-palette-border-hover-1)',\n backgroundColor: 'var(--mui-palette-background-hover-1)',\n '--button-hover-border-color': 'var(--mui-palette-border-hover-1)',\n },\n}\n\nexport const dialogActionsTheme = {\n styleOverrides: {\n root: {\n padding: '8px 16px 16px',\n gap: '8px',\n // Soften default Cancel pattern (outlined + inherit) inside Dialog only.\n // Do not restyle primary/error/etc. outlined buttons or global Buttons.\n '& .MuiButton-outlined.MuiButton-colorInherit': {\n ...dialogSecondaryButtonSx,\n },\n },\n },\n} as const satisfies MuiComponentTheme<'MuiDialogActions'>\n\nexport const dialogContentTextTheme = {\n styleOverrides: {\n root: {\n color: 'var(--mui-palette-text-secondary)',\n fontSize: '0.875rem',\n },\n },\n} as const satisfies MuiComponentTheme<'MuiDialogContentText'>\n","'use client'\nimport MuiDialogTitle, {\n type DialogTitleProps as MuiDialogTitleProps,\n} from '@mui/material/DialogTitle'\n\nexport type DialogTitleProps = MuiDialogTitleProps\n\n/**\n * Soft Dialog title — same API as `@mui/material/DialogTitle`.\n */\nexport default function DialogTitle(props: DialogTitleProps) {\n return <MuiDialogTitle {...props} />\n}\n","'use client'\nimport MuiDialogContent, {\n type DialogContentProps as MuiDialogContentProps,\n} from '@mui/material/DialogContent'\n\nexport type DialogContentProps = MuiDialogContentProps\n\n/**\n * Soft Dialog content — same API as `@mui/material/DialogContent`.\n */\nexport default function DialogContent(props: DialogContentProps) {\n return <MuiDialogContent {...props} />\n}\n","'use client'\nimport MuiDialogActions, {\n type DialogActionsProps as MuiDialogActionsProps,\n} from '@mui/material/DialogActions'\n\nexport type DialogActionsProps = MuiDialogActionsProps\n\n/**\n * Soft Dialog actions — same API as `@mui/material/DialogActions`.\n */\nexport default function DialogActions(props: DialogActionsProps) {\n return <MuiDialogActions {...props} />\n}\n","'use client'\nimport MuiDialogContentText, {\n type DialogContentTextProps as MuiDialogContentTextProps,\n} from '@mui/material/DialogContentText'\n\nexport type DialogContentTextProps = MuiDialogContentTextProps\n\n/**\n * Soft Dialog content text — same API as `@mui/material/DialogContentText`.\n */\nexport default function DialogContentText(props: DialogContentTextProps) {\n return <MuiDialogContentText {...props} />\n}\n"],"mappings":"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","names":["classnames","jsx","jsx","jsx","jsx"]}