@gabvdl/ui 0.0.14

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 (330) hide show
  1. package/README.md +95 -0
  2. package/dist/components/button/button.d.ts +39 -0
  3. package/dist/components/button/button.d.ts.map +1 -0
  4. package/dist/components/button/button.js +72 -0
  5. package/dist/components/button/button.js.map +1 -0
  6. package/dist/components/button/index.d.ts +5 -0
  7. package/dist/components/button/index.d.ts.map +1 -0
  8. package/dist/components/button/tooltip.d.ts +31 -0
  9. package/dist/components/button/tooltip.d.ts.map +1 -0
  10. package/dist/components/button/tooltip.js +83 -0
  11. package/dist/components/button/tooltip.js.map +1 -0
  12. package/dist/components/changelog/changelog.d.ts +52 -0
  13. package/dist/components/changelog/changelog.d.ts.map +1 -0
  14. package/dist/components/changelog/changelog.js +164 -0
  15. package/dist/components/changelog/changelog.js.map +1 -0
  16. package/dist/components/changelog/index.d.ts +3 -0
  17. package/dist/components/changelog/index.d.ts.map +1 -0
  18. package/dist/components/copy-button/copy-button.d.ts +16 -0
  19. package/dist/components/copy-button/copy-button.d.ts.map +1 -0
  20. package/dist/components/copy-button/copy-button.js +40 -0
  21. package/dist/components/copy-button/copy-button.js.map +1 -0
  22. package/dist/components/copy-button/index.d.ts +3 -0
  23. package/dist/components/copy-button/index.d.ts.map +1 -0
  24. package/dist/components/drop-zone/drop-zone.d.ts +20 -0
  25. package/dist/components/drop-zone/drop-zone.d.ts.map +1 -0
  26. package/dist/components/drop-zone/drop-zone.js +54 -0
  27. package/dist/components/drop-zone/drop-zone.js.map +1 -0
  28. package/dist/components/drop-zone/index.d.ts +5 -0
  29. package/dist/components/drop-zone/index.d.ts.map +1 -0
  30. package/dist/components/drop-zone/use-file-drop.d.ts +45 -0
  31. package/dist/components/drop-zone/use-file-drop.d.ts.map +1 -0
  32. package/dist/components/drop-zone/use-file-drop.js +97 -0
  33. package/dist/components/drop-zone/use-file-drop.js.map +1 -0
  34. package/dist/components/element-picker/element-picker-field.d.ts +30 -0
  35. package/dist/components/element-picker/element-picker-field.d.ts.map +1 -0
  36. package/dist/components/element-picker/element-picker-field.js +273 -0
  37. package/dist/components/element-picker/element-picker-field.js.map +1 -0
  38. package/dist/components/element-picker/element-picker.d.ts +45 -0
  39. package/dist/components/element-picker/element-picker.d.ts.map +1 -0
  40. package/dist/components/element-picker/element-picker.js +179 -0
  41. package/dist/components/element-picker/element-picker.js.map +1 -0
  42. package/dist/components/element-picker/element-preview.d.ts +23 -0
  43. package/dist/components/element-picker/element-preview.d.ts.map +1 -0
  44. package/dist/components/element-picker/element-preview.js +72 -0
  45. package/dist/components/element-picker/element-preview.js.map +1 -0
  46. package/dist/components/element-picker/index.d.ts +12 -0
  47. package/dist/components/element-picker/index.d.ts.map +1 -0
  48. package/dist/components/element-picker/parse.d.ts +32 -0
  49. package/dist/components/element-picker/parse.d.ts.map +1 -0
  50. package/dist/components/element-picker/parse.js +230 -0
  51. package/dist/components/element-picker/parse.js.map +1 -0
  52. package/dist/components/element-picker/types.d.ts +72 -0
  53. package/dist/components/element-picker/types.d.ts.map +1 -0
  54. package/dist/components/element-picker/use-element-picker.d.ts +56 -0
  55. package/dist/components/element-picker/use-element-picker.d.ts.map +1 -0
  56. package/dist/components/element-picker/use-element-picker.js +201 -0
  57. package/dist/components/element-picker/use-element-picker.js.map +1 -0
  58. package/dist/components/empty-state/empty-state.d.ts +16 -0
  59. package/dist/components/empty-state/empty-state.d.ts.map +1 -0
  60. package/dist/components/empty-state/empty-state.js +41 -0
  61. package/dist/components/empty-state/empty-state.js.map +1 -0
  62. package/dist/components/empty-state/index.d.ts +3 -0
  63. package/dist/components/empty-state/index.d.ts.map +1 -0
  64. package/dist/components/floating-panel/dock-context.d.ts +66 -0
  65. package/dist/components/floating-panel/dock-context.d.ts.map +1 -0
  66. package/dist/components/floating-panel/dock-context.js +96 -0
  67. package/dist/components/floating-panel/dock-context.js.map +1 -0
  68. package/dist/components/floating-panel/dock.d.ts +26 -0
  69. package/dist/components/floating-panel/dock.d.ts.map +1 -0
  70. package/dist/components/floating-panel/dock.js +46 -0
  71. package/dist/components/floating-panel/dock.js.map +1 -0
  72. package/dist/components/floating-panel/floating-panel.d.ts +69 -0
  73. package/dist/components/floating-panel/floating-panel.d.ts.map +1 -0
  74. package/dist/components/floating-panel/floating-panel.js +285 -0
  75. package/dist/components/floating-panel/floating-panel.js.map +1 -0
  76. package/dist/components/floating-panel/index.d.ts +7 -0
  77. package/dist/components/floating-panel/index.d.ts.map +1 -0
  78. package/dist/components/fuzzy-list/fuzzy-list.d.ts +96 -0
  79. package/dist/components/fuzzy-list/fuzzy-list.d.ts.map +1 -0
  80. package/dist/components/fuzzy-list/fuzzy-list.js +127 -0
  81. package/dist/components/fuzzy-list/fuzzy-list.js.map +1 -0
  82. package/dist/components/fuzzy-list/index.d.ts +4 -0
  83. package/dist/components/fuzzy-list/index.d.ts.map +1 -0
  84. package/dist/components/global-search/global-search.d.ts +78 -0
  85. package/dist/components/global-search/global-search.d.ts.map +1 -0
  86. package/dist/components/global-search/global-search.js +181 -0
  87. package/dist/components/global-search/global-search.js.map +1 -0
  88. package/dist/components/global-search/hotkey.d.ts +23 -0
  89. package/dist/components/global-search/hotkey.d.ts.map +1 -0
  90. package/dist/components/global-search/hotkey.js +41 -0
  91. package/dist/components/global-search/hotkey.js.map +1 -0
  92. package/dist/components/global-search/index.d.ts +5 -0
  93. package/dist/components/global-search/index.d.ts.map +1 -0
  94. package/dist/components/iframe-preview/iframe-preview.d.ts +64 -0
  95. package/dist/components/iframe-preview/iframe-preview.d.ts.map +1 -0
  96. package/dist/components/iframe-preview/iframe-preview.js +257 -0
  97. package/dist/components/iframe-preview/iframe-preview.js.map +1 -0
  98. package/dist/components/iframe-preview/index.d.ts +3 -0
  99. package/dist/components/iframe-preview/index.d.ts.map +1 -0
  100. package/dist/components/image-viewer/image-viewer.d.ts +30 -0
  101. package/dist/components/image-viewer/image-viewer.d.ts.map +1 -0
  102. package/dist/components/image-viewer/image-viewer.js +226 -0
  103. package/dist/components/image-viewer/image-viewer.js.map +1 -0
  104. package/dist/components/image-viewer/index.d.ts +4 -0
  105. package/dist/components/image-viewer/index.d.ts.map +1 -0
  106. package/dist/components/image-viewer/progressive-image.d.ts +20 -0
  107. package/dist/components/image-viewer/progressive-image.d.ts.map +1 -0
  108. package/dist/components/image-viewer/progressive-image.js +62 -0
  109. package/dist/components/image-viewer/progressive-image.js.map +1 -0
  110. package/dist/components/image-viewer/viewable-image.d.ts +17 -0
  111. package/dist/components/image-viewer/viewable-image.d.ts.map +1 -0
  112. package/dist/components/image-viewer/viewable-image.js +38 -0
  113. package/dist/components/image-viewer/viewable-image.js.map +1 -0
  114. package/dist/components/input/index.d.ts +3 -0
  115. package/dist/components/input/index.d.ts.map +1 -0
  116. package/dist/components/input/input.d.ts +15 -0
  117. package/dist/components/input/input.d.ts.map +1 -0
  118. package/dist/components/input/input.js +56 -0
  119. package/dist/components/input/input.js.map +1 -0
  120. package/dist/components/modal/index.d.ts +5 -0
  121. package/dist/components/modal/index.d.ts.map +1 -0
  122. package/dist/components/modal/modal-context.d.ts +37 -0
  123. package/dist/components/modal/modal-context.d.ts.map +1 -0
  124. package/dist/components/modal/modal-context.js +81 -0
  125. package/dist/components/modal/modal-context.js.map +1 -0
  126. package/dist/components/modal/modal.d.ts +28 -0
  127. package/dist/components/modal/modal.d.ts.map +1 -0
  128. package/dist/components/modal/modal.js +94 -0
  129. package/dist/components/modal/modal.js.map +1 -0
  130. package/dist/components/nav-2d/index.d.ts +3 -0
  131. package/dist/components/nav-2d/index.d.ts.map +1 -0
  132. package/dist/components/nav-2d/nav-2d.d.ts +59 -0
  133. package/dist/components/nav-2d/nav-2d.d.ts.map +1 -0
  134. package/dist/components/nav-2d/nav-2d.js +290 -0
  135. package/dist/components/nav-2d/nav-2d.js.map +1 -0
  136. package/dist/components/phone-preview/index.d.ts +3 -0
  137. package/dist/components/phone-preview/index.d.ts.map +1 -0
  138. package/dist/components/phone-preview/phone-preview.d.ts +45 -0
  139. package/dist/components/phone-preview/phone-preview.d.ts.map +1 -0
  140. package/dist/components/phone-preview/phone-preview.js +117 -0
  141. package/dist/components/phone-preview/phone-preview.js.map +1 -0
  142. package/dist/components/progressive-bash/index.d.ts +7 -0
  143. package/dist/components/progressive-bash/index.d.ts.map +1 -0
  144. package/dist/components/progressive-bash/parse.d.ts +88 -0
  145. package/dist/components/progressive-bash/parse.d.ts.map +1 -0
  146. package/dist/components/progressive-bash/parse.js +120 -0
  147. package/dist/components/progressive-bash/parse.js.map +1 -0
  148. package/dist/components/progressive-bash/playback.d.ts +50 -0
  149. package/dist/components/progressive-bash/playback.d.ts.map +1 -0
  150. package/dist/components/progressive-bash/playback.js +19 -0
  151. package/dist/components/progressive-bash/playback.js.map +1 -0
  152. package/dist/components/progressive-bash/progressive-bash.d.ts +97 -0
  153. package/dist/components/progressive-bash/progressive-bash.d.ts.map +1 -0
  154. package/dist/components/progressive-bash/progressive-bash.js +377 -0
  155. package/dist/components/progressive-bash/progressive-bash.js.map +1 -0
  156. package/dist/components/progressive-list/index.d.ts +3 -0
  157. package/dist/components/progressive-list/index.d.ts.map +1 -0
  158. package/dist/components/progressive-list/progressive-list.d.ts +55 -0
  159. package/dist/components/progressive-list/progressive-list.d.ts.map +1 -0
  160. package/dist/components/progressive-list/progressive-list.js +83 -0
  161. package/dist/components/progressive-list/progressive-list.js.map +1 -0
  162. package/dist/components/progressive-table/index.d.ts +3 -0
  163. package/dist/components/progressive-table/index.d.ts.map +1 -0
  164. package/dist/components/progressive-table/progressive-table.d.ts +58 -0
  165. package/dist/components/progressive-table/progressive-table.d.ts.map +1 -0
  166. package/dist/components/progressive-table/progressive-table.js +86 -0
  167. package/dist/components/progressive-table/progressive-table.js.map +1 -0
  168. package/dist/components/progressive-text/index.d.ts +3 -0
  169. package/dist/components/progressive-text/index.d.ts.map +1 -0
  170. package/dist/components/progressive-text/progressive-text.d.ts +54 -0
  171. package/dist/components/progressive-text/progressive-text.d.ts.map +1 -0
  172. package/dist/components/progressive-text/progressive-text.js +97 -0
  173. package/dist/components/progressive-text/progressive-text.js.map +1 -0
  174. package/dist/components/progressive-timeline/index.d.ts +3 -0
  175. package/dist/components/progressive-timeline/index.d.ts.map +1 -0
  176. package/dist/components/progressive-timeline/progressive-timeline.d.ts +46 -0
  177. package/dist/components/progressive-timeline/progressive-timeline.d.ts.map +1 -0
  178. package/dist/components/progressive-timeline/progressive-timeline.js +62 -0
  179. package/dist/components/progressive-timeline/progressive-timeline.js.map +1 -0
  180. package/dist/components/relative-time/index.d.ts +3 -0
  181. package/dist/components/relative-time/index.d.ts.map +1 -0
  182. package/dist/components/relative-time/relative-time.d.ts +14 -0
  183. package/dist/components/relative-time/relative-time.d.ts.map +1 -0
  184. package/dist/components/relative-time/relative-time.js +15 -0
  185. package/dist/components/relative-time/relative-time.js.map +1 -0
  186. package/dist/components/resizable-layout/index.d.ts +3 -0
  187. package/dist/components/resizable-layout/index.d.ts.map +1 -0
  188. package/dist/components/resizable-layout/resizable-layout.d.ts +113 -0
  189. package/dist/components/resizable-layout/resizable-layout.d.ts.map +1 -0
  190. package/dist/components/resizable-layout/resizable-layout.js +398 -0
  191. package/dist/components/resizable-layout/resizable-layout.js.map +1 -0
  192. package/dist/components/rich-input/compose.d.ts +13 -0
  193. package/dist/components/rich-input/compose.d.ts.map +1 -0
  194. package/dist/components/rich-input/compose.js +28 -0
  195. package/dist/components/rich-input/compose.js.map +1 -0
  196. package/dist/components/rich-input/index.d.ts +5 -0
  197. package/dist/components/rich-input/index.d.ts.map +1 -0
  198. package/dist/components/rich-input/parts.d.ts +53 -0
  199. package/dist/components/rich-input/parts.d.ts.map +1 -0
  200. package/dist/components/rich-input/parts.js +285 -0
  201. package/dist/components/rich-input/parts.js.map +1 -0
  202. package/dist/components/rich-input/rich-input.d.ts +64 -0
  203. package/dist/components/rich-input/rich-input.d.ts.map +1 -0
  204. package/dist/components/rich-input/rich-input.js +351 -0
  205. package/dist/components/rich-input/rich-input.js.map +1 -0
  206. package/dist/components/rich-input/types.d.ts +92 -0
  207. package/dist/components/rich-input/types.d.ts.map +1 -0
  208. package/dist/components/rich-input/use-draft.d.ts +9 -0
  209. package/dist/components/rich-input/use-draft.d.ts.map +1 -0
  210. package/dist/components/rich-input/use-draft.js +47 -0
  211. package/dist/components/rich-input/use-draft.js.map +1 -0
  212. package/dist/components/rich-input/use-file-upload.d.ts +18 -0
  213. package/dist/components/rich-input/use-file-upload.d.ts.map +1 -0
  214. package/dist/components/rich-input/use-file-upload.js +88 -0
  215. package/dist/components/rich-input/use-file-upload.js.map +1 -0
  216. package/dist/components/rich-input/use-guidelines.d.ts +16 -0
  217. package/dist/components/rich-input/use-guidelines.d.ts.map +1 -0
  218. package/dist/components/rich-input/use-guidelines.js +85 -0
  219. package/dist/components/rich-input/use-guidelines.js.map +1 -0
  220. package/dist/components/rich-input/use-input-history.d.ts +22 -0
  221. package/dist/components/rich-input/use-input-history.d.ts.map +1 -0
  222. package/dist/components/rich-input/use-input-history.js +61 -0
  223. package/dist/components/rich-input/use-input-history.js.map +1 -0
  224. package/dist/components/rich-input/use-mention.d.ts +24 -0
  225. package/dist/components/rich-input/use-mention.d.ts.map +1 -0
  226. package/dist/components/rich-input/use-mention.js +54 -0
  227. package/dist/components/rich-input/use-mention.js.map +1 -0
  228. package/dist/components/search-input/index.d.ts +3 -0
  229. package/dist/components/search-input/index.d.ts.map +1 -0
  230. package/dist/components/search-input/search-input.d.ts +14 -0
  231. package/dist/components/search-input/search-input.d.ts.map +1 -0
  232. package/dist/components/search-input/search-input.js +63 -0
  233. package/dist/components/search-input/search-input.js.map +1 -0
  234. package/dist/components/skeleton/index.d.ts +3 -0
  235. package/dist/components/skeleton/index.d.ts.map +1 -0
  236. package/dist/components/skeleton/skeleton.d.ts +19 -0
  237. package/dist/components/skeleton/skeleton.d.ts.map +1 -0
  238. package/dist/components/skeleton/skeleton.js +29 -0
  239. package/dist/components/skeleton/skeleton.js.map +1 -0
  240. package/dist/components/spinner/index.d.ts +3 -0
  241. package/dist/components/spinner/index.d.ts.map +1 -0
  242. package/dist/components/spinner/spinner.d.ts +11 -0
  243. package/dist/components/spinner/spinner.d.ts.map +1 -0
  244. package/dist/components/spinner/spinner.js +32 -0
  245. package/dist/components/spinner/spinner.js.map +1 -0
  246. package/dist/components/status-badge/index.d.ts +3 -0
  247. package/dist/components/status-badge/index.d.ts.map +1 -0
  248. package/dist/components/status-badge/status-badge.d.ts +31 -0
  249. package/dist/components/status-badge/status-badge.d.ts.map +1 -0
  250. package/dist/components/status-badge/status-badge.js +53 -0
  251. package/dist/components/status-badge/status-badge.js.map +1 -0
  252. package/dist/components/theme/index.d.ts +5 -0
  253. package/dist/components/theme/index.d.ts.map +1 -0
  254. package/dist/components/theme/theme-toggle.d.ts +11 -0
  255. package/dist/components/theme/theme-toggle.d.ts.map +1 -0
  256. package/dist/components/theme/theme-toggle.js +57 -0
  257. package/dist/components/theme/theme-toggle.js.map +1 -0
  258. package/dist/components/theme/theme.d.ts +29 -0
  259. package/dist/components/theme/theme.d.ts.map +1 -0
  260. package/dist/components/theme/theme.js +70 -0
  261. package/dist/components/theme/theme.js.map +1 -0
  262. package/dist/components/toast/index.d.ts +3 -0
  263. package/dist/components/toast/index.d.ts.map +1 -0
  264. package/dist/components/toast/toast.d.ts +64 -0
  265. package/dist/components/toast/toast.d.ts.map +1 -0
  266. package/dist/components/toast/toast.js +155 -0
  267. package/dist/components/toast/toast.js.map +1 -0
  268. package/dist/components/virtual-list/index.d.ts +3 -0
  269. package/dist/components/virtual-list/index.d.ts.map +1 -0
  270. package/dist/components/virtual-list/virtual-list.d.ts +71 -0
  271. package/dist/components/virtual-list/virtual-list.d.ts.map +1 -0
  272. package/dist/components/virtual-list/virtual-list.js +65 -0
  273. package/dist/components/virtual-list/virtual-list.js.map +1 -0
  274. package/dist/hooks/index.d.ts +12 -0
  275. package/dist/hooks/index.d.ts.map +1 -0
  276. package/dist/hooks/use-copy-to-clipboard.d.ts +26 -0
  277. package/dist/hooks/use-copy-to-clipboard.d.ts.map +1 -0
  278. package/dist/hooks/use-copy-to-clipboard.js +36 -0
  279. package/dist/hooks/use-copy-to-clipboard.js.map +1 -0
  280. package/dist/hooks/use-debounced-value.d.ts +23 -0
  281. package/dist/hooks/use-debounced-value.d.ts.map +1 -0
  282. package/dist/hooks/use-debounced-value.js +19 -0
  283. package/dist/hooks/use-debounced-value.js.map +1 -0
  284. package/dist/hooks/use-intersection.d.ts +25 -0
  285. package/dist/hooks/use-intersection.d.ts.map +1 -0
  286. package/dist/hooks/use-intersection.js +38 -0
  287. package/dist/hooks/use-intersection.js.map +1 -0
  288. package/dist/hooks/use-local-storage.d.ts +12 -0
  289. package/dist/hooks/use-local-storage.d.ts.map +1 -0
  290. package/dist/hooks/use-local-storage.js +43 -0
  291. package/dist/hooks/use-local-storage.js.map +1 -0
  292. package/dist/hooks/use-long-press.d.ts +37 -0
  293. package/dist/hooks/use-long-press.d.ts.map +1 -0
  294. package/dist/hooks/use-long-press.js +39 -0
  295. package/dist/hooks/use-long-press.js.map +1 -0
  296. package/dist/hooks/use-media-query.d.ts +17 -0
  297. package/dist/hooks/use-media-query.d.ts.map +1 -0
  298. package/dist/hooks/use-media-query.js +37 -0
  299. package/dist/hooks/use-media-query.js.map +1 -0
  300. package/dist/hooks/use-overlay.d.ts +20 -0
  301. package/dist/hooks/use-overlay.d.ts.map +1 -0
  302. package/dist/hooks/use-overlay.js +42 -0
  303. package/dist/hooks/use-overlay.js.map +1 -0
  304. package/dist/image-viewer.css +152 -0
  305. package/dist/index.d.ts +67 -0
  306. package/dist/index.d.ts.map +1 -0
  307. package/dist/index.js +161 -0
  308. package/dist/index.js.map +1 -0
  309. package/dist/lib/format.d.ts +19 -0
  310. package/dist/lib/format.d.ts.map +1 -0
  311. package/dist/lib/format.js +62 -0
  312. package/dist/lib/format.js.map +1 -0
  313. package/dist/lib/highlight.d.ts +15 -0
  314. package/dist/lib/highlight.d.ts.map +1 -0
  315. package/dist/lib/highlight.js +39 -0
  316. package/dist/lib/highlight.js.map +1 -0
  317. package/dist/lib/search.d.ts +40 -0
  318. package/dist/lib/search.d.ts.map +1 -0
  319. package/dist/lib/search.js +91 -0
  320. package/dist/lib/search.js.map +1 -0
  321. package/dist/lib/utils.d.ts +4 -0
  322. package/dist/lib/utils.d.ts.map +1 -0
  323. package/dist/lib/utils.js +9 -0
  324. package/dist/lib/utils.js.map +1 -0
  325. package/dist/overlay.css +78 -0
  326. package/dist/styles.css +6 -0
  327. package/dist/theme.css +81 -0
  328. package/dist/tooltip.css +53 -0
  329. package/dist/virtual-list.css +29 -0
  330. package/package.json +77 -0
@@ -0,0 +1,3 @@
1
+ export { Changelog } from './changelog';
2
+ export type { ChangelogEntry, ChangelogProps } from './changelog';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/changelog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+ export interface CopyButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {
3
+ /** The text to copy. A function is called lazily, on click. */
4
+ value: string | (() => string);
5
+ /** Show the label next to the icon. */
6
+ label?: string;
7
+ /** Offer the native share sheet first on touch devices. */
8
+ share?: boolean;
9
+ onCopied?: () => void;
10
+ }
11
+ /**
12
+ * Copy-to-clipboard with the transient check mark — the six lines re-typed in a
13
+ * dozen projects, minus the empty `catch {}` they all shipped.
14
+ */
15
+ export declare function CopyButton({ value, label, share, onCopied, className, ...props }: CopyButtonProps): React.JSX.Element;
16
+ //# sourceMappingURL=copy-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-button.d.ts","sourceRoot":"","sources":["../../../src/components/copy-button/copy-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACnG,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAC/B,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,KAAa,EACb,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,eAAe,qBAuBjB"}
@@ -0,0 +1,40 @@
1
+ import { jsxs as c, jsx as i } from "react/jsx-runtime";
2
+ import "react";
3
+ import { Check as a, Copy as d } from "lucide-react";
4
+ import { cn as f } from "../../lib/utils.js";
5
+ import { useCopyToClipboard as l } from "../../hooks/use-copy-to-clipboard.js";
6
+ function k({
7
+ value: o,
8
+ label: e,
9
+ share: n = !1,
10
+ onCopied: r,
11
+ className: s,
12
+ ...m
13
+ }) {
14
+ const { copy: p, copied: t } = l({ share: n });
15
+ return /* @__PURE__ */ c(
16
+ "button",
17
+ {
18
+ type: "button",
19
+ onClick: async () => {
20
+ await p(typeof o == "function" ? o() : o) && (r == null || r());
21
+ },
22
+ "aria-label": e ?? (t ? "Copied" : "Copy"),
23
+ title: t ? "Copied" : "Copy",
24
+ className: f(
25
+ "inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",
26
+ t && "text-emerald-600 dark:text-emerald-400",
27
+ s
28
+ ),
29
+ ...m,
30
+ children: [
31
+ t ? /* @__PURE__ */ i(a, { className: "size-3.5" }) : /* @__PURE__ */ i(d, { className: "size-3.5" }),
32
+ e && /* @__PURE__ */ i("span", { children: t ? "Copied" : e })
33
+ ]
34
+ }
35
+ );
36
+ }
37
+ export {
38
+ k as CopyButton
39
+ };
40
+ //# sourceMappingURL=copy-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-button.js","sources":["../../../src/components/copy-button/copy-button.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Check, Copy } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { useCopyToClipboard } from '../../hooks/use-copy-to-clipboard';\n\nexport interface CopyButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n /** The text to copy. A function is called lazily, on click. */\n value: string | (() => string);\n /** Show the label next to the icon. */\n label?: string;\n /** Offer the native share sheet first on touch devices. */\n share?: boolean;\n onCopied?: () => void;\n}\n\n/**\n * Copy-to-clipboard with the transient check mark — the six lines re-typed in a\n * dozen projects, minus the empty `catch {}` they all shipped.\n */\nexport function CopyButton({\n value,\n label,\n share = false,\n onCopied,\n className,\n ...props\n}: CopyButtonProps) {\n const { copy, copied } = useCopyToClipboard({ share });\n\n return (\n <button\n type=\"button\"\n onClick={async () => {\n const ok = await copy(typeof value === 'function' ? value() : value);\n if (ok) onCopied?.();\n }}\n aria-label={label ?? (copied ? 'Copied' : 'Copy')}\n title={copied ? 'Copied' : 'Copy'}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground',\n copied && 'text-emerald-600 dark:text-emerald-400',\n className,\n )}\n {...props}\n >\n {copied ? <Check className=\"size-3.5\" /> : <Copy className=\"size-3.5\" />}\n {label && <span>{copied ? 'Copied' : label}</span>}\n </button>\n );\n}\n"],"names":["CopyButton","value","label","share","onCopied","className","props","copy","copied","useCopyToClipboard","jsxs","cn","jsx","Check","Copy"],"mappings":";;;;;AAoBO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAAoB;AAClB,QAAM,EAAE,MAAAC,GAAM,QAAAC,EAAA,IAAWC,EAAmB,EAAE,OAAAN,GAAO;AAErD,SACE,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS,YAAY;AAEnB,QADW,MAAMH,EAAK,OAAON,KAAU,aAAaA,EAAA,IAAUA,CAAK,MAC3DG,KAAA,QAAAA;AAAA,MACV;AAAA,MACA,cAAYF,MAAUM,IAAS,WAAW;AAAA,MAC1C,OAAOA,IAAS,WAAW;AAAA,MAC3B,WAAWG;AAAA,QACT;AAAA,QACAH,KAAU;AAAA,QACVH;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAE,IAAS,gBAAAI,EAACC,KAAM,WAAU,WAAA,CAAW,IAAK,gBAAAD,EAACE,GAAA,EAAK,WAAU,WAAA,CAAW;AAAA,QACrEZ,KAAS,gBAAAU,EAAC,QAAA,EAAM,UAAAJ,IAAS,WAAWN,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjD;"}
@@ -0,0 +1,3 @@
1
+ export { CopyButton } from './copy-button';
2
+ export type { CopyButtonProps } from './copy-button';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/copy-button/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { UseFileDropOptions } from './use-file-drop';
2
+ import * as React from 'react';
3
+ export interface DropZoneProps extends UseFileDropOptions {
4
+ /** Headline inside the zone. */
5
+ label?: React.ReactNode;
6
+ /** Small print — say what you accept and how big. */
7
+ hint?: React.ReactNode;
8
+ /** Replaces the default body entirely. Gets the live drag state. */
9
+ children?: (state: {
10
+ dragging: boolean;
11
+ open: () => void;
12
+ }) => React.ReactNode;
13
+ className?: string;
14
+ }
15
+ /**
16
+ * A drag-and-drop file target that also clicks through to the file picker, with
17
+ * the whole-window drag highlight and folder support behind one prop.
18
+ */
19
+ export declare function DropZone({ label, hint, children, className, ...options }: DropZoneProps): React.JSX.Element;
20
+ //# sourceMappingURL=drop-zone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-zone.d.ts","sourceRoot":"","sources":["../../../src/components/drop-zone/drop-zone.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,gCAAgC;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,qDAAqD;IACrD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAyB,EACzB,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,GAAG,OAAO,EACX,EAAE,aAAa,qBAyCf"}
@@ -0,0 +1,54 @@
1
+ import { jsxs as s, jsx as r, Fragment as p } from "react/jsx-runtime";
2
+ import "react";
3
+ import { Upload as f } from "lucide-react";
4
+ import { cn as a } from "../../lib/utils.js";
5
+ import { useFileDrop as b } from "./use-file-drop.js";
6
+ function D({
7
+ label: l = "Drop files here",
8
+ hint: i,
9
+ children: d,
10
+ className: m,
11
+ ...e
12
+ }) {
13
+ const { dragging: o, rootProps: u, inputProps: c, open: t } = b(e);
14
+ return /* @__PURE__ */ s(
15
+ "div",
16
+ {
17
+ ...u,
18
+ onClick: e.disabled ? void 0 : t,
19
+ onKeyDown: (n) => {
20
+ (n.key === "Enter" || n.key === " ") && (n.preventDefault(), t());
21
+ },
22
+ role: "button",
23
+ tabIndex: e.disabled ? -1 : 0,
24
+ "aria-disabled": e.disabled,
25
+ className: a(
26
+ "relative flex cursor-pointer flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-border px-6 py-10 text-center transition-colors outline-none",
27
+ "hover:border-ring/60 hover:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring",
28
+ o && "border-ring bg-muted/60",
29
+ e.disabled && "pointer-events-none opacity-50",
30
+ m
31
+ ),
32
+ children: [
33
+ /* @__PURE__ */ r("input", { ...c }),
34
+ d ? d({ dragging: o, open: t }) : /* @__PURE__ */ s(p, { children: [
35
+ /* @__PURE__ */ r(
36
+ f,
37
+ {
38
+ className: a(
39
+ "size-6 text-muted-foreground transition-transform",
40
+ o && "scale-110 text-foreground"
41
+ )
42
+ }
43
+ ),
44
+ /* @__PURE__ */ r("p", { className: "text-sm font-medium text-foreground", children: l }),
45
+ i && /* @__PURE__ */ r("p", { className: "text-xs text-muted-foreground", children: i })
46
+ ] })
47
+ ]
48
+ }
49
+ );
50
+ }
51
+ export {
52
+ D as DropZone
53
+ };
54
+ //# sourceMappingURL=drop-zone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-zone.js","sources":["../../../src/components/drop-zone/drop-zone.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Upload } from 'lucide-react';\n\nimport { cn } from '../../lib/utils';\nimport { useFileDrop, type UseFileDropOptions } from './use-file-drop';\n\nexport interface DropZoneProps extends UseFileDropOptions {\n /** Headline inside the zone. */\n label?: React.ReactNode;\n /** Small print — say what you accept and how big. */\n hint?: React.ReactNode;\n /** Replaces the default body entirely. Gets the live drag state. */\n children?: (state: { dragging: boolean; open: () => void }) => React.ReactNode;\n className?: string;\n}\n\n/**\n * A drag-and-drop file target that also clicks through to the file picker, with\n * the whole-window drag highlight and folder support behind one prop.\n */\nexport function DropZone({\n label = 'Drop files here',\n hint,\n children,\n className,\n ...options\n}: DropZoneProps) {\n const { dragging, rootProps, inputProps, open } = useFileDrop(options);\n\n return (\n <div\n {...rootProps}\n onClick={options.disabled ? undefined : open}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n open();\n }\n }}\n role=\"button\"\n tabIndex={options.disabled ? -1 : 0}\n aria-disabled={options.disabled}\n className={cn(\n 'relative flex cursor-pointer flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-border px-6 py-10 text-center transition-colors outline-none',\n 'hover:border-ring/60 hover:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring',\n dragging && 'border-ring bg-muted/60',\n options.disabled && 'pointer-events-none opacity-50',\n className,\n )}\n >\n <input {...inputProps} />\n {children ? (\n children({ dragging, open })\n ) : (\n <>\n <Upload\n className={cn(\n 'size-6 text-muted-foreground transition-transform',\n dragging && 'scale-110 text-foreground',\n )}\n />\n <p className=\"text-sm font-medium text-foreground\">{label}</p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </>\n )}\n </div>\n );\n}\n"],"names":["DropZone","label","hint","children","className","options","dragging","rootProps","inputProps","open","useFileDrop","jsxs","e","cn","jsx","Fragment","Upload"],"mappings":";;;;;AAoBO,SAASA,EAAS;AAAA,EACvB,OAAAC,IAAQ;AAAA,EACR,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAAkB;AAChB,QAAM,EAAE,UAAAC,GAAU,WAAAC,GAAW,YAAAC,GAAY,MAAAC,EAAA,IAASC,EAAYL,CAAO;AAErE,SACE,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGJ;AAAA,MACJ,SAASF,EAAQ,WAAW,SAAYI;AAAA,MACxC,WAAW,CAACG,MAAM;AAChB,SAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFH,EAAA;AAAA,MAEJ;AAAA,MACA,MAAK;AAAA,MACL,UAAUJ,EAAQ,WAAW,KAAK;AAAA,MAClC,iBAAeA,EAAQ;AAAA,MACvB,WAAWQ;AAAA,QACT;AAAA,QACA;AAAA,QACAP,KAAY;AAAA,QACZD,EAAQ,YAAY;AAAA,QACpBD;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,gBAAAU,EAAC,SAAA,EAAO,GAAGN,GAAY;AAAA,QACtBL,IACCA,EAAS,EAAE,UAAAG,GAAU,MAAAG,EAAA,CAAM,IAE3B,gBAAAE,EAAAI,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAD;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,WAAWH;AAAA,gBACT;AAAA,gBACAP,KAAY;AAAA,cAAA;AAAA,YACd;AAAA,UAAA;AAAA,UAEF,gBAAAQ,EAAC,KAAA,EAAE,WAAU,uCAAuC,UAAAb,GAAM;AAAA,UACzDC,KAAQ,gBAAAY,EAAC,KAAA,EAAE,WAAU,iCAAiC,UAAAZ,EAAA,CAAK;AAAA,QAAA,EAAA,CAC9D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -0,0 +1,5 @@
1
+ export { DropZone } from './drop-zone';
2
+ export type { DropZoneProps } from './drop-zone';
3
+ export { useFileDrop } from './use-file-drop';
4
+ export type { FileRejection, UseFileDropOptions } from './use-file-drop';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/drop-zone/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import * as React from 'react';
2
+ export interface FileRejection {
3
+ file: File;
4
+ reason: 'type' | 'size' | 'count';
5
+ }
6
+ export interface UseFileDropOptions {
7
+ onFiles: (files: File[]) => void;
8
+ /** Same syntax as `<input accept>`: `image/*,.glb`. */
9
+ accept?: string;
10
+ multiple?: boolean;
11
+ maxFiles?: number;
12
+ /** Per-file cap, in bytes. */
13
+ maxSize?: number;
14
+ /** Walk dropped folders recursively (Chromium/WebKit). */
15
+ recursive?: boolean;
16
+ disabled?: boolean;
17
+ onReject?: (rejections: FileRejection[]) => void;
18
+ }
19
+ /**
20
+ * The headless half of `<DropZone>`: drag state, the click-to-browse input, and
21
+ * validation. Spread `rootProps` on any element to make it a drop target.
22
+ *
23
+ * Drag events fire for every child element, so the depth counter is what keeps
24
+ * the highlight from flickering as the pointer crosses them.
25
+ */
26
+ export declare function useFileDrop({ onFiles, accept, multiple, maxFiles, maxSize, recursive, disabled, onReject, }: UseFileDropOptions): {
27
+ dragging: boolean;
28
+ rootProps: {
29
+ onDragEnter: (e: React.DragEvent) => void;
30
+ onDragOver: (e: React.DragEvent) => void;
31
+ onDragLeave: (e: React.DragEvent) => void;
32
+ onDrop: (e: React.DragEvent) => Promise<void>;
33
+ };
34
+ inputProps: {
35
+ ref: React.RefObject<HTMLInputElement | null>;
36
+ type: "file";
37
+ accept: string | undefined;
38
+ multiple: boolean;
39
+ disabled: boolean;
40
+ className: string;
41
+ onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
42
+ };
43
+ open: () => void | undefined;
44
+ };
45
+ //# sourceMappingURL=use-file-drop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-file-drop.d.ts","sourceRoot":"","sources":["../../../src/components/drop-zone/use-file-drop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACjC,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,MAAM,EACN,QAAe,EACf,QAAQ,EACR,OAAO,EACP,SAAiB,EACjB,QAAgB,EAChB,QAAQ,GACT,EAAE,kBAAkB;;;yBAgCA,KAAK,CAAC,SAAS;wBAMhB,KAAK,CAAC,SAAS;yBAKd,KAAK,CAAC,SAAS;oBAMd,KAAK,CAAC,SAAS;;;;;;;;;sBAoBnB,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC;;;EAUpD"}
@@ -0,0 +1,97 @@
1
+ import * as u from "react";
2
+ function A({
3
+ onFiles: r,
4
+ accept: s,
5
+ multiple: a = !0,
6
+ maxFiles: n,
7
+ maxSize: t,
8
+ recursive: y = !1,
9
+ disabled: l = !1,
10
+ onReject: c
11
+ }) {
12
+ const [T, g] = u.useState(!1), p = u.useRef(0), w = u.useRef(null), D = u.useMemo(() => E(s), [s]), d = u.useCallback(
13
+ (e) => {
14
+ const f = [], o = [];
15
+ for (const i of e)
16
+ L(i, D) ? t != null && i.size > t ? o.push({ file: i, reason: "size" }) : n != null && f.length >= n ? o.push({ file: i, reason: "count" }) : !a && f.length >= 1 ? o.push({ file: i, reason: "count" }) : f.push(i) : o.push({ file: i, reason: "type" });
17
+ o.length && (c == null || c(o)), f.length && r(f);
18
+ },
19
+ [D, n, t, a, r, c]
20
+ ), m = () => {
21
+ p.current = 0, g(!1);
22
+ }, C = {
23
+ onDragEnter: (e) => {
24
+ l || !h(e.dataTransfer) || (e.preventDefault(), p.current += 1, g(!0));
25
+ },
26
+ onDragOver: (e) => {
27
+ l || !h(e.dataTransfer) || (e.preventDefault(), e.dataTransfer.dropEffect = "copy");
28
+ },
29
+ onDragLeave: (e) => {
30
+ l || !h(e.dataTransfer) || (e.preventDefault(), p.current -= 1, p.current <= 0 && m());
31
+ },
32
+ onDrop: async (e) => {
33
+ if (l || !h(e.dataTransfer)) return;
34
+ e.preventDefault(), m();
35
+ const f = [...e.dataTransfer.files], o = y ? await W(e.dataTransfer.items) : [];
36
+ d(o.length > 0 ? o : f);
37
+ }
38
+ }, P = {
39
+ ref: w,
40
+ type: "file",
41
+ accept: s,
42
+ multiple: a,
43
+ disabled: l,
44
+ className: "hidden",
45
+ onChange: (e) => {
46
+ d([...e.target.files ?? []]), e.target.value = "";
47
+ }
48
+ }, v = u.useCallback(() => {
49
+ var e;
50
+ return (e = w.current) == null ? void 0 : e.click();
51
+ }, []);
52
+ return { dragging: T, rootProps: C, inputProps: P, open: v };
53
+ }
54
+ function h(r) {
55
+ return !!r && Array.from(r.types ?? []).includes("Files");
56
+ }
57
+ function E(r) {
58
+ return r ? r.split(",").map((s) => s.trim().toLowerCase()).filter(Boolean) : [];
59
+ }
60
+ function L(r, s) {
61
+ if (s.length === 0) return !0;
62
+ const a = r.type.toLowerCase(), n = r.name.toLowerCase();
63
+ return s.some(
64
+ (t) => t.startsWith(".") ? n.endsWith(t) : t.endsWith("/*") ? a.startsWith(t.slice(0, -1)) : a === t
65
+ );
66
+ }
67
+ async function W(r) {
68
+ const s = [...r].map((n) => {
69
+ var t;
70
+ return (t = n.webkitGetAsEntry) == null ? void 0 : t.call(n);
71
+ }).filter(Boolean);
72
+ if (s.length === 0) return [];
73
+ const a = [];
74
+ return await Promise.all(s.map((n) => k(n, a))), a;
75
+ }
76
+ async function k(r, s) {
77
+ if (r.isFile) {
78
+ const n = await new Promise(
79
+ (t) => r.file(t, () => t(null))
80
+ );
81
+ n && s.push(n);
82
+ return;
83
+ }
84
+ if (!r.isDirectory) return;
85
+ const a = r.createReader();
86
+ for (; ; ) {
87
+ const n = await new Promise(
88
+ (t) => a.readEntries(t, () => t([]))
89
+ );
90
+ if (n.length === 0) return;
91
+ await Promise.all(n.map((t) => k(t, s)));
92
+ }
93
+ }
94
+ export {
95
+ A as useFileDrop
96
+ };
97
+ //# sourceMappingURL=use-file-drop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-file-drop.js","sources":["../../../src/components/drop-zone/use-file-drop.ts"],"sourcesContent":["import * as React from 'react';\n\nexport interface FileRejection {\n file: File;\n reason: 'type' | 'size' | 'count';\n}\n\nexport interface UseFileDropOptions {\n onFiles: (files: File[]) => void;\n /** Same syntax as `<input accept>`: `image/*,.glb`. */\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n /** Per-file cap, in bytes. */\n maxSize?: number;\n /** Walk dropped folders recursively (Chromium/WebKit). */\n recursive?: boolean;\n disabled?: boolean;\n onReject?: (rejections: FileRejection[]) => void;\n}\n\n/**\n * The headless half of `<DropZone>`: drag state, the click-to-browse input, and\n * validation. Spread `rootProps` on any element to make it a drop target.\n *\n * Drag events fire for every child element, so the depth counter is what keeps\n * the highlight from flickering as the pointer crosses them.\n */\nexport function useFileDrop({\n onFiles,\n accept,\n multiple = true,\n maxFiles,\n maxSize,\n recursive = false,\n disabled = false,\n onReject,\n}: UseFileDropOptions) {\n const [dragging, setDragging] = React.useState(false);\n const depth = React.useRef(0);\n const input = React.useRef<HTMLInputElement>(null);\n\n const accepts = React.useMemo(() => parseAccept(accept), [accept]);\n\n const take = React.useCallback(\n (list: File[]) => {\n const kept: File[] = [];\n const rejected: FileRejection[] = [];\n\n for (const file of list) {\n if (!matches(file, accepts)) rejected.push({ file, reason: 'type' });\n else if (maxSize != null && file.size > maxSize) rejected.push({ file, reason: 'size' });\n else if (maxFiles != null && kept.length >= maxFiles) rejected.push({ file, reason: 'count' });\n else if (!multiple && kept.length >= 1) rejected.push({ file, reason: 'count' });\n else kept.push(file);\n }\n\n if (rejected.length) onReject?.(rejected);\n if (kept.length) onFiles(kept);\n },\n [accepts, maxFiles, maxSize, multiple, onFiles, onReject],\n );\n\n const reset = () => {\n depth.current = 0;\n setDragging(false);\n };\n\n const rootProps = {\n onDragEnter: (e: React.DragEvent) => {\n if (disabled || !isFileDrag(e.dataTransfer)) return;\n e.preventDefault();\n depth.current += 1;\n setDragging(true);\n },\n onDragOver: (e: React.DragEvent) => {\n if (disabled || !isFileDrag(e.dataTransfer)) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n },\n onDragLeave: (e: React.DragEvent) => {\n if (disabled || !isFileDrag(e.dataTransfer)) return;\n e.preventDefault();\n depth.current -= 1;\n if (depth.current <= 0) reset();\n },\n onDrop: async (e: React.DragEvent) => {\n if (disabled || !isFileDrag(e.dataTransfer)) return;\n e.preventDefault();\n reset();\n // Read the flat list up front: the DataTransfer is dead once we await.\n const plain = [...e.dataTransfer.files];\n // The entries API is the only way to see inside a dropped folder, but it\n // is non-standard — where it gives us nothing, take the flat list.\n const walked = recursive ? await walkItems(e.dataTransfer.items) : [];\n take(walked.length > 0 ? walked : plain);\n },\n };\n\n const inputProps = {\n ref: input,\n type: 'file' as const,\n accept,\n multiple,\n disabled,\n className: 'hidden',\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n take([...(e.target.files ?? [])]);\n e.target.value = ''; // so picking the same file twice fires again\n },\n };\n\n /** Open the OS file picker. */\n const open = React.useCallback(() => input.current?.click(), []);\n\n return { dragging, rootProps, inputProps, open };\n}\n\n/**\n * A drag only concerns us when it carries files. Text dragged from elsewhere on\n * the page reports no `Files` type, and must be left alone so it can still drop\n * into whatever the zone wraps (a textarea, say).\n */\nfunction isFileDrag(dt: DataTransfer | null): boolean {\n return !!dt && Array.from(dt.types ?? []).includes('Files');\n}\n\nfunction parseAccept(accept?: string): string[] {\n return accept\n ? accept\n .split(',')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean)\n : [];\n}\n\nfunction matches(file: File, accepts: string[]): boolean {\n if (accepts.length === 0) return true;\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n return accepts.some((a) =>\n a.startsWith('.')\n ? name.endsWith(a)\n : a.endsWith('/*')\n ? type.startsWith(a.slice(0, -1))\n : type === a,\n );\n}\n\n/* ─── Folder drops ────────────────────────────────────────────────────────────\n * `dataTransfer.files` flattens a dropped folder to nothing. The entries API is\n * the only way to read one, and it is non-standard — hence the `any`s and the\n * silent bail on browsers that lack it.\n */\nasync function walkItems(items: DataTransferItemList): Promise<File[]> {\n const entries = [...items]\n .map((item) => (item as any).webkitGetAsEntry?.())\n .filter(Boolean);\n if (entries.length === 0) return [];\n\n const out: File[] = [];\n await Promise.all(entries.map((entry: any) => walk(entry, out)));\n return out;\n}\n\nasync function walk(entry: any, out: File[]): Promise<void> {\n if (entry.isFile) {\n const file = await new Promise<File | null>((resolve) =>\n entry.file(resolve, () => resolve(null)),\n );\n if (file) out.push(file);\n return;\n }\n if (!entry.isDirectory) return;\n\n const reader = entry.createReader();\n // readEntries pages at ~100 entries — keep reading until it returns nothing.\n for (;;) {\n const batch: any[] = await new Promise((resolve) =>\n reader.readEntries(resolve, () => resolve([])),\n );\n if (batch.length === 0) return;\n await Promise.all(batch.map((child) => walk(child, out)));\n }\n}\n"],"names":["useFileDrop","onFiles","accept","multiple","maxFiles","maxSize","recursive","disabled","onReject","dragging","setDragging","React","depth","input","accepts","parseAccept","take","list","kept","rejected","file","matches","reset","rootProps","isFileDrag","plain","walked","walkItems","inputProps","open","_a","dt","type","name","a","items","entries","item","out","entry","walk","resolve","reader","batch","child"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { UseElementPickerOptions } from './use-element-picker';
2
+ import * as React from 'react';
3
+ type View = 'preview' | 'html' | 'parsed';
4
+ export interface ElementPickerFieldProps extends UseElementPickerOptions {
5
+ /** Field label. */
6
+ label?: React.ReactNode;
7
+ /** Small print under the label. */
8
+ hint?: React.ReactNode;
9
+ /** Text on the trigger while idle. */
10
+ pickLabel?: string;
11
+ /** Shown when nothing is selected yet. */
12
+ emptyLabel?: React.ReactNode;
13
+ /** Which detail tab a card opens on. Default `parsed`. */
14
+ defaultView?: View;
15
+ className?: string;
16
+ }
17
+ /**
18
+ * The element picker as a form input: a trigger that arms the page, and a list
19
+ * of what you selected — each with a live thumbnail, its formatted HTML, and
20
+ * the parse (text, kind, hierarchy, attributes, computed styles) laid out for
21
+ * reading. Hovering a card spotlights the element back in the page.
22
+ *
23
+ * The value is `PickedElement[]`; `info` on each is plain data, so
24
+ * `JSON.stringify(picked.map((p) => p.info))` is a ready-made payload — which
25
+ * is the point: this is how you let someone hand an LLM, a scraper or a bug
26
+ * report the exact bits of a page they mean.
27
+ */
28
+ export declare function ElementPickerField({ label, hint, pickLabel, emptyLabel, defaultView, className, ...options }: ElementPickerFieldProps): React.JSX.Element;
29
+ export {};
30
+ //# sourceMappingURL=element-picker-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-picker-field.d.ts","sourceRoot":"","sources":["../../../src/components/element-picker/element-picker-field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAiBtF,KAAK,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAkQ1C,MAAM,WAAW,uBAAwB,SAAQ,uBAAuB;IACtE,mBAAmB;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,mCAAmC;IACnC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAuB,EACvB,IAAI,EACJ,SAA2B,EAC3B,UAAmC,EACnC,WAAsB,EACtB,SAAS,EACT,GAAG,OAAO,EACX,EAAE,uBAAuB,qBA+DzB"}