@anvilkit/plugin-asset-manager 0.1.5 → 0.1.7

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 (224) hide show
  1. package/README.md +27 -19
  2. package/dist/adapters/data-url.cjs +9 -5
  3. package/dist/adapters/extract-image-dimensions.cjs +12 -8
  4. package/dist/adapters/in-memory.cjs +9 -5
  5. package/dist/adapters/s3-presigned.cjs +9 -5
  6. package/dist/index.cjs +16 -5
  7. package/dist/index.d.cts +11 -3
  8. package/dist/index.d.cts.map +1 -1
  9. package/dist/index.d.ts +11 -3
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -1
  12. package/dist/plugin.cjs +76 -9
  13. package/dist/plugin.d.cts +3 -2
  14. package/dist/plugin.d.cts.map +1 -1
  15. package/dist/plugin.d.ts +3 -2
  16. package/dist/plugin.d.ts.map +1 -1
  17. package/dist/plugin.js +67 -4
  18. package/dist/sources/composite-source.cjs +137 -0
  19. package/dist/sources/composite-source.d.cts +39 -0
  20. package/dist/sources/composite-source.d.cts.map +1 -0
  21. package/dist/sources/composite-source.d.ts +39 -0
  22. package/dist/sources/composite-source.d.ts.map +1 -0
  23. package/dist/sources/composite-source.js +99 -0
  24. package/dist/sources/federated-search.cjs +163 -0
  25. package/dist/sources/federated-search.d.cts +33 -0
  26. package/dist/sources/federated-search.d.cts.map +1 -0
  27. package/dist/sources/federated-search.d.ts +33 -0
  28. package/dist/sources/federated-search.d.ts.map +1 -0
  29. package/dist/sources/federated-search.js +113 -0
  30. package/dist/sources/provider.cjs +18 -0
  31. package/dist/sources/provider.d.cts +51 -0
  32. package/dist/sources/provider.d.cts.map +1 -0
  33. package/dist/sources/provider.d.ts +51 -0
  34. package/dist/sources/provider.d.ts.map +1 -0
  35. package/dist/sources/provider.js +1 -0
  36. package/dist/sources/unsplash/client.cjs +189 -0
  37. package/dist/sources/unsplash/client.d.cts +87 -0
  38. package/dist/sources/unsplash/client.d.cts.map +1 -0
  39. package/dist/sources/unsplash/client.d.ts +87 -0
  40. package/dist/sources/unsplash/client.d.ts.map +1 -0
  41. package/dist/sources/unsplash/client.js +151 -0
  42. package/dist/sources/unsplash/index.cjs +192 -0
  43. package/dist/sources/unsplash/index.d.cts +16 -0
  44. package/dist/sources/unsplash/index.d.cts.map +1 -0
  45. package/dist/sources/unsplash/index.d.ts +16 -0
  46. package/dist/sources/unsplash/index.d.ts.map +1 -0
  47. package/dist/sources/unsplash/index.js +148 -0
  48. package/dist/sources/unsplash/themes.cjs +141 -0
  49. package/dist/sources/unsplash/themes.d.cts +18 -0
  50. package/dist/sources/unsplash/themes.d.cts.map +1 -0
  51. package/dist/sources/unsplash/themes.d.ts +18 -0
  52. package/dist/sources/unsplash/themes.d.ts.map +1 -0
  53. package/dist/sources/unsplash/themes.js +93 -0
  54. package/dist/sources/unsplash/throttle-cache.cjs +86 -0
  55. package/dist/sources/unsplash/throttle-cache.d.cts +25 -0
  56. package/dist/sources/unsplash/throttle-cache.d.cts.map +1 -0
  57. package/dist/sources/unsplash/throttle-cache.d.ts +25 -0
  58. package/dist/sources/unsplash/throttle-cache.d.ts.map +1 -0
  59. package/dist/sources/unsplash/throttle-cache.js +45 -0
  60. package/dist/testing/index.cjs +9 -5
  61. package/dist/types/categories.cjs +18 -0
  62. package/dist/types/categories.d.cts +48 -0
  63. package/dist/types/categories.d.cts.map +1 -0
  64. package/dist/types/categories.d.ts +48 -0
  65. package/dist/types/categories.d.ts.map +1 -0
  66. package/dist/types/categories.js +1 -0
  67. package/dist/types/data-source.cjs +18 -0
  68. package/dist/types/data-source.d.cts +59 -0
  69. package/dist/types/data-source.d.cts.map +1 -0
  70. package/dist/types/data-source.d.ts +59 -0
  71. package/dist/types/data-source.d.ts.map +1 -0
  72. package/dist/types/data-source.js +1 -0
  73. package/dist/types/filter.cjs +18 -0
  74. package/dist/types/filter.d.cts +55 -0
  75. package/dist/types/filter.d.cts.map +1 -0
  76. package/dist/types/filter.d.ts +55 -0
  77. package/dist/types/filter.d.ts.map +1 -0
  78. package/dist/types/filter.js +1 -0
  79. package/dist/types/folders.cjs +42 -0
  80. package/dist/types/folders.d.cts +46 -0
  81. package/dist/types/folders.d.cts.map +1 -0
  82. package/dist/types/folders.d.ts +46 -0
  83. package/dist/types/folders.d.ts.map +1 -0
  84. package/dist/types/folders.js +4 -0
  85. package/dist/types/options.cjs +18 -0
  86. package/dist/types/options.d.cts +68 -0
  87. package/dist/types/options.d.cts.map +1 -0
  88. package/dist/types/options.d.ts +68 -0
  89. package/dist/types/options.d.ts.map +1 -0
  90. package/dist/types/options.js +1 -0
  91. package/dist/types/types.d.cts +15 -27
  92. package/dist/types/types.d.cts.map +1 -1
  93. package/dist/types/types.d.ts +15 -27
  94. package/dist/types/types.d.ts.map +1 -1
  95. package/dist/types/unsplash.cjs +18 -0
  96. package/dist/types/unsplash.d.cts +60 -0
  97. package/dist/types/unsplash.d.cts.map +1 -0
  98. package/dist/types/unsplash.d.ts +60 -0
  99. package/dist/types/unsplash.d.ts.map +1 -0
  100. package/dist/types/unsplash.js +1 -0
  101. package/dist/ui/AssetBrowser.cjs +69 -104
  102. package/dist/ui/AssetBrowser.d.cts +17 -7
  103. package/dist/ui/AssetBrowser.d.cts.map +1 -1
  104. package/dist/ui/AssetBrowser.d.ts +17 -7
  105. package/dist/ui/AssetBrowser.d.ts.map +1 -1
  106. package/dist/ui/AssetBrowser.js +60 -99
  107. package/dist/ui/AssetCommandPalette.cjs +9 -5
  108. package/dist/ui/AssetManagerUI.cjs +17 -7
  109. package/dist/ui/AssetManagerUI.d.cts +19 -3
  110. package/dist/ui/AssetManagerUI.d.cts.map +1 -1
  111. package/dist/ui/AssetManagerUI.d.ts +19 -3
  112. package/dist/ui/AssetManagerUI.d.ts.map +1 -1
  113. package/dist/ui/AssetManagerUI.js +8 -2
  114. package/dist/ui/DeleteAssetDialog.cjs +9 -5
  115. package/dist/ui/DeleteFolderDialog.cjs +78 -0
  116. package/dist/ui/DeleteFolderDialog.d.cts +11 -0
  117. package/dist/ui/DeleteFolderDialog.d.cts.map +1 -0
  118. package/dist/ui/DeleteFolderDialog.d.ts +11 -0
  119. package/dist/ui/DeleteFolderDialog.d.ts.map +1 -0
  120. package/dist/ui/DeleteFolderDialog.js +40 -0
  121. package/dist/ui/EmptyFolderState.cjs +53 -0
  122. package/dist/ui/EmptyFolderState.d.cts +6 -0
  123. package/dist/ui/EmptyFolderState.d.cts.map +1 -0
  124. package/dist/ui/EmptyFolderState.d.ts +6 -0
  125. package/dist/ui/EmptyFolderState.d.ts.map +1 -0
  126. package/dist/ui/EmptyFolderState.js +15 -0
  127. package/dist/ui/FolderBreadcrumb.cjs +73 -0
  128. package/dist/ui/FolderBreadcrumb.d.cts +9 -0
  129. package/dist/ui/FolderBreadcrumb.d.cts.map +1 -0
  130. package/dist/ui/FolderBreadcrumb.d.ts +9 -0
  131. package/dist/ui/FolderBreadcrumb.d.ts.map +1 -0
  132. package/dist/ui/FolderBreadcrumb.js +35 -0
  133. package/dist/ui/FolderNameDialog.cjs +98 -0
  134. package/dist/ui/FolderNameDialog.d.cts +14 -0
  135. package/dist/ui/FolderNameDialog.d.cts.map +1 -0
  136. package/dist/ui/FolderNameDialog.d.ts +14 -0
  137. package/dist/ui/FolderNameDialog.d.ts.map +1 -0
  138. package/dist/ui/FolderNameDialog.js +60 -0
  139. package/dist/ui/FolderTree.cjs +83 -0
  140. package/dist/ui/FolderTree.d.cts +13 -0
  141. package/dist/ui/FolderTree.d.cts.map +1 -0
  142. package/dist/ui/FolderTree.d.ts +13 -0
  143. package/dist/ui/FolderTree.d.ts.map +1 -0
  144. package/dist/ui/FolderTree.js +42 -0
  145. package/dist/ui/MetadataPanel.cjs +16 -9
  146. package/dist/ui/MetadataPanel.d.cts.map +1 -1
  147. package/dist/ui/MetadataPanel.d.ts.map +1 -1
  148. package/dist/ui/MetadataPanel.js +7 -4
  149. package/dist/ui/MoveTargetPicker.cjs +84 -0
  150. package/dist/ui/MoveTargetPicker.d.cts +16 -0
  151. package/dist/ui/MoveTargetPicker.d.cts.map +1 -0
  152. package/dist/ui/MoveTargetPicker.d.ts +16 -0
  153. package/dist/ui/MoveTargetPicker.d.ts.map +1 -0
  154. package/dist/ui/MoveTargetPicker.js +46 -0
  155. package/dist/ui/ReplaceAssetDialog.cjs +9 -5
  156. package/dist/ui/ReplaceAssetDialog.d.cts +2 -1
  157. package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -1
  158. package/dist/ui/ReplaceAssetDialog.d.ts +2 -1
  159. package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -1
  160. package/dist/ui/UnsplashPanel.cjs +134 -0
  161. package/dist/ui/UnsplashPanel.d.cts +28 -0
  162. package/dist/ui/UnsplashPanel.d.cts.map +1 -0
  163. package/dist/ui/UnsplashPanel.d.ts +28 -0
  164. package/dist/ui/UnsplashPanel.d.ts.map +1 -0
  165. package/dist/ui/UnsplashPanel.js +96 -0
  166. package/dist/ui/UploadButton.cjs +10 -10
  167. package/dist/ui/UploadButton.d.cts +9 -2
  168. package/dist/ui/UploadButton.d.cts.map +1 -1
  169. package/dist/ui/UploadButton.d.ts +9 -2
  170. package/dist/ui/UploadButton.d.ts.map +1 -1
  171. package/dist/ui/UploadButton.js +1 -5
  172. package/dist/ui/index.cjs +46 -5
  173. package/dist/ui/index.d.cts +14 -0
  174. package/dist/ui/index.d.cts.map +1 -1
  175. package/dist/ui/index.d.ts +14 -0
  176. package/dist/ui/index.d.ts.map +1 -1
  177. package/dist/ui/index.js +7 -0
  178. package/dist/utils/asset-reference.cjs +12 -8
  179. package/dist/utils/csp.cjs +12 -8
  180. package/dist/utils/data-source.cjs +177 -0
  181. package/dist/utils/data-source.d.cts +63 -0
  182. package/dist/utils/data-source.d.cts.map +1 -0
  183. package/dist/utils/data-source.d.ts +63 -0
  184. package/dist/utils/data-source.d.ts.map +1 -0
  185. package/dist/utils/data-source.js +136 -0
  186. package/dist/utils/errors.cjs +31 -9
  187. package/dist/utils/errors.d.cts +27 -0
  188. package/dist/utils/errors.d.cts.map +1 -1
  189. package/dist/utils/errors.d.ts +27 -0
  190. package/dist/utils/errors.d.ts.map +1 -1
  191. package/dist/utils/errors.js +16 -1
  192. package/dist/utils/folders.cjs +261 -0
  193. package/dist/utils/folders.d.cts +49 -0
  194. package/dist/utils/folders.d.cts.map +1 -0
  195. package/dist/utils/folders.d.ts +49 -0
  196. package/dist/utils/folders.d.ts.map +1 -0
  197. package/dist/utils/folders.js +223 -0
  198. package/dist/utils/header-action.cjs +12 -8
  199. package/dist/utils/infer-kind.cjs +12 -8
  200. package/dist/utils/registry.cjs +36 -17
  201. package/dist/utils/registry.d.cts +21 -1
  202. package/dist/utils/registry.d.cts.map +1 -1
  203. package/dist/utils/registry.d.ts +21 -1
  204. package/dist/utils/registry.d.ts.map +1 -1
  205. package/dist/utils/registry.js +20 -11
  206. package/dist/utils/resolver.cjs +9 -5
  207. package/dist/utils/retry.cjs +13 -9
  208. package/dist/utils/studio-asset-source.cjs +14 -7
  209. package/dist/utils/studio-asset-source.d.cts +6 -1
  210. package/dist/utils/studio-asset-source.d.cts.map +1 -1
  211. package/dist/utils/studio-asset-source.d.ts +6 -1
  212. package/dist/utils/studio-asset-source.d.ts.map +1 -1
  213. package/dist/utils/studio-asset-source.js +1 -1
  214. package/dist/utils/validate-upload-result.cjs +9 -5
  215. package/dist/utils/validate-upload-result.d.cts +2 -1
  216. package/dist/utils/validate-upload-result.d.cts.map +1 -1
  217. package/dist/utils/validate-upload-result.d.ts +2 -1
  218. package/dist/utils/validate-upload-result.d.ts.map +1 -1
  219. package/dist/version.cjs +12 -8
  220. package/dist/version.d.cts +1 -1
  221. package/dist/version.d.ts +1 -1
  222. package/dist/version.js +1 -1
  223. package/meta/config.json +1 -1
  224. package/package.json +19 -9
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ "use client";
3
+ var __webpack_require__ = {};
4
+ (()=>{
5
+ __webpack_require__.d = (exports1, getters, values)=>{
6
+ var define = (defs, kind)=>{
7
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
8
+ enumerable: true,
9
+ [kind]: defs[key]
10
+ });
11
+ };
12
+ define(getters, "get");
13
+ define(values, "value");
14
+ };
15
+ })();
16
+ (()=>{
17
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
18
+ })();
19
+ (()=>{
20
+ __webpack_require__.r = (exports1)=>{
21
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
22
+ value: 'Module'
23
+ });
24
+ Object.defineProperty(exports1, '__esModule', {
25
+ value: true
26
+ });
27
+ };
28
+ })();
29
+ var __webpack_exports__ = {};
30
+ __webpack_require__.r(__webpack_exports__);
31
+ __webpack_require__.d(__webpack_exports__, {
32
+ EmptyFolderState: ()=>EmptyFolderState
33
+ });
34
+ const button_namespaceObject = require("@anvilkit/ui/button");
35
+ const external_react_namespaceObject = require("react");
36
+ function EmptyFolderState({ onUpload, message = "This folder is empty." }) {
37
+ return /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
38
+ "data-testid": "ak-empty-folder",
39
+ className: "flex flex-col items-center gap-2 p-6 text-center text-sm text-[var(--ak-studio-muted-fg)]"
40
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement("p", null, message), onUpload ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
41
+ type: "button",
42
+ variant: "outline",
43
+ size: "sm",
44
+ onClick: onUpload
45
+ }, "Drop files here or upload") : null);
46
+ }
47
+ exports.EmptyFolderState = __webpack_exports__.EmptyFolderState;
48
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
49
+ "EmptyFolderState"
50
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
51
+ Object.defineProperty(exports, '__esModule', {
52
+ value: true
53
+ });
@@ -0,0 +1,6 @@
1
+ export interface EmptyFolderStateProps {
2
+ readonly onUpload?: () => void;
3
+ readonly message?: string;
4
+ }
5
+ export declare function EmptyFolderState({ onUpload, message, }: EmptyFolderStateProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=EmptyFolderState.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyFolderState.d.cts","sourceRoot":"","sources":["../../src/ui/EmptyFolderState.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAAC,EAChC,QAAQ,EACR,OAAiC,GACjC,EAAE,qBAAqB,2CAcvB"}
@@ -0,0 +1,6 @@
1
+ export interface EmptyFolderStateProps {
2
+ readonly onUpload?: () => void;
3
+ readonly message?: string;
4
+ }
5
+ export declare function EmptyFolderState({ onUpload, message, }: EmptyFolderStateProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=EmptyFolderState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyFolderState.d.ts","sourceRoot":"","sources":["../../src/ui/EmptyFolderState.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAAC,EAChC,QAAQ,EACR,OAAiC,GACjC,EAAE,qBAAqB,2CAcvB"}
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { Button } from "@anvilkit/ui/button";
3
+ import * as __rspack_external_react from "react";
4
+ function EmptyFolderState({ onUpload, message = "This folder is empty." }) {
5
+ return /*#__PURE__*/ __rspack_external_react.createElement("div", {
6
+ "data-testid": "ak-empty-folder",
7
+ className: "flex flex-col items-center gap-2 p-6 text-center text-sm text-[var(--ak-studio-muted-fg)]"
8
+ }, /*#__PURE__*/ __rspack_external_react.createElement("p", null, message), onUpload ? /*#__PURE__*/ __rspack_external_react.createElement(Button, {
9
+ type: "button",
10
+ variant: "outline",
11
+ size: "sm",
12
+ onClick: onUpload
13
+ }, "Drop files here or upload") : null);
14
+ }
15
+ export { EmptyFolderState };
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ "use client";
3
+ var __webpack_require__ = {};
4
+ (()=>{
5
+ __webpack_require__.d = (exports1, getters, values)=>{
6
+ var define = (defs, kind)=>{
7
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
8
+ enumerable: true,
9
+ [kind]: defs[key]
10
+ });
11
+ };
12
+ define(getters, "get");
13
+ define(values, "value");
14
+ };
15
+ })();
16
+ (()=>{
17
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
18
+ })();
19
+ (()=>{
20
+ __webpack_require__.r = (exports1)=>{
21
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
22
+ value: 'Module'
23
+ });
24
+ Object.defineProperty(exports1, '__esModule', {
25
+ value: true
26
+ });
27
+ };
28
+ })();
29
+ var __webpack_exports__ = {};
30
+ __webpack_require__.r(__webpack_exports__);
31
+ __webpack_require__.d(__webpack_exports__, {
32
+ FolderBreadcrumb: ()=>FolderBreadcrumb
33
+ });
34
+ const breadcrumb_namespaceObject = require("@anvilkit/ui/breadcrumb");
35
+ const button_namespaceObject = require("@anvilkit/ui/button");
36
+ const external_react_namespaceObject = require("react");
37
+ function FolderBreadcrumb({ path, onNavigate, rootLabel = "All assets" }) {
38
+ const atRoot = 0 === path.length;
39
+ return /*#__PURE__*/ external_react_namespaceObject.createElement(breadcrumb_namespaceObject.Breadcrumb, {
40
+ "aria-label": "Folders",
41
+ "data-testid": "ak-folder-breadcrumb"
42
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement(breadcrumb_namespaceObject.BreadcrumbList, null, /*#__PURE__*/ external_react_namespaceObject.createElement(breadcrumb_namespaceObject.BreadcrumbItem, null, atRoot ? /*#__PURE__*/ external_react_namespaceObject.createElement(breadcrumb_namespaceObject.BreadcrumbPage, {
43
+ "data-folder-crumb": "root"
44
+ }, rootLabel) : /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
45
+ type: "button",
46
+ variant: "link",
47
+ size: "sm",
48
+ className: "h-auto p-0",
49
+ "data-folder-crumb": "root",
50
+ onClick: ()=>onNavigate(null)
51
+ }, rootLabel)), path.map((folder, index)=>{
52
+ const isCurrent = index === path.length - 1;
53
+ return /*#__PURE__*/ external_react_namespaceObject.createElement(external_react_namespaceObject.Fragment, {
54
+ key: folder.id
55
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement(breadcrumb_namespaceObject.BreadcrumbSeparator, null), /*#__PURE__*/ external_react_namespaceObject.createElement(breadcrumb_namespaceObject.BreadcrumbItem, null, isCurrent ? /*#__PURE__*/ external_react_namespaceObject.createElement(breadcrumb_namespaceObject.BreadcrumbPage, {
56
+ "data-folder-crumb": folder.id
57
+ }, folder.name) : /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
58
+ type: "button",
59
+ variant: "link",
60
+ size: "sm",
61
+ className: "h-auto p-0",
62
+ "data-folder-crumb": folder.id,
63
+ onClick: ()=>onNavigate(folder.id)
64
+ }, folder.name)));
65
+ })));
66
+ }
67
+ exports.FolderBreadcrumb = __webpack_exports__.FolderBreadcrumb;
68
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
69
+ "FolderBreadcrumb"
70
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
71
+ Object.defineProperty(exports, '__esModule', {
72
+ value: true
73
+ });
@@ -0,0 +1,9 @@
1
+ import type { AssetFolder } from "../types/folders.js";
2
+ export interface FolderBreadcrumbProps {
3
+ /** Root → … → current folder. Empty ⇒ at root. */
4
+ readonly path: readonly AssetFolder[];
5
+ readonly onNavigate: (folderId: string | null) => void;
6
+ readonly rootLabel?: string;
7
+ }
8
+ export declare function FolderBreadcrumb({ path, onNavigate, rootLabel, }: FolderBreadcrumbProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=FolderBreadcrumb.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderBreadcrumb.d.cts","sourceRoot":"","sources":["../../src/ui/FolderBreadcrumb.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACrC,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAChC,IAAI,EACJ,UAAU,EACV,SAAwB,GACxB,EAAE,qBAAqB,2CAoDvB"}
@@ -0,0 +1,9 @@
1
+ import type { AssetFolder } from "../types/folders.js";
2
+ export interface FolderBreadcrumbProps {
3
+ /** Root → … → current folder. Empty ⇒ at root. */
4
+ readonly path: readonly AssetFolder[];
5
+ readonly onNavigate: (folderId: string | null) => void;
6
+ readonly rootLabel?: string;
7
+ }
8
+ export declare function FolderBreadcrumb({ path, onNavigate, rootLabel, }: FolderBreadcrumbProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=FolderBreadcrumb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderBreadcrumb.d.ts","sourceRoot":"","sources":["../../src/ui/FolderBreadcrumb.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACrC,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAChC,IAAI,EACJ,UAAU,EACV,SAAwB,GACxB,EAAE,qBAAqB,2CAoDvB"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { Breadcrumb, BreadcrumbItem, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "@anvilkit/ui/breadcrumb";
3
+ import { Button } from "@anvilkit/ui/button";
4
+ import * as __rspack_external_react from "react";
5
+ function FolderBreadcrumb({ path, onNavigate, rootLabel = "All assets" }) {
6
+ const atRoot = 0 === path.length;
7
+ return /*#__PURE__*/ __rspack_external_react.createElement(Breadcrumb, {
8
+ "aria-label": "Folders",
9
+ "data-testid": "ak-folder-breadcrumb"
10
+ }, /*#__PURE__*/ __rspack_external_react.createElement(BreadcrumbList, null, /*#__PURE__*/ __rspack_external_react.createElement(BreadcrumbItem, null, atRoot ? /*#__PURE__*/ __rspack_external_react.createElement(BreadcrumbPage, {
11
+ "data-folder-crumb": "root"
12
+ }, rootLabel) : /*#__PURE__*/ __rspack_external_react.createElement(Button, {
13
+ type: "button",
14
+ variant: "link",
15
+ size: "sm",
16
+ className: "h-auto p-0",
17
+ "data-folder-crumb": "root",
18
+ onClick: ()=>onNavigate(null)
19
+ }, rootLabel)), path.map((folder, index)=>{
20
+ const isCurrent = index === path.length - 1;
21
+ return /*#__PURE__*/ __rspack_external_react.createElement(__rspack_external_react.Fragment, {
22
+ key: folder.id
23
+ }, /*#__PURE__*/ __rspack_external_react.createElement(BreadcrumbSeparator, null), /*#__PURE__*/ __rspack_external_react.createElement(BreadcrumbItem, null, isCurrent ? /*#__PURE__*/ __rspack_external_react.createElement(BreadcrumbPage, {
24
+ "data-folder-crumb": folder.id
25
+ }, folder.name) : /*#__PURE__*/ __rspack_external_react.createElement(Button, {
26
+ type: "button",
27
+ variant: "link",
28
+ size: "sm",
29
+ className: "h-auto p-0",
30
+ "data-folder-crumb": folder.id,
31
+ onClick: ()=>onNavigate(folder.id)
32
+ }, folder.name)));
33
+ })));
34
+ }
35
+ export { FolderBreadcrumb };
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ "use client";
3
+ var __webpack_require__ = {};
4
+ (()=>{
5
+ __webpack_require__.d = (exports1, getters, values)=>{
6
+ var define = (defs, kind)=>{
7
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
8
+ enumerable: true,
9
+ [kind]: defs[key]
10
+ });
11
+ };
12
+ define(getters, "get");
13
+ define(values, "value");
14
+ };
15
+ })();
16
+ (()=>{
17
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
18
+ })();
19
+ (()=>{
20
+ __webpack_require__.r = (exports1)=>{
21
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
22
+ value: 'Module'
23
+ });
24
+ Object.defineProperty(exports1, '__esModule', {
25
+ value: true
26
+ });
27
+ };
28
+ })();
29
+ var __webpack_exports__ = {};
30
+ __webpack_require__.r(__webpack_exports__);
31
+ __webpack_require__.d(__webpack_exports__, {
32
+ FolderNameDialog: ()=>FolderNameDialog
33
+ });
34
+ const button_namespaceObject = require("@anvilkit/ui/button");
35
+ const dialog_namespaceObject = require("@anvilkit/ui/dialog");
36
+ const input_namespaceObject = require("@anvilkit/ui/input");
37
+ const external_react_namespaceObject = require("react");
38
+ function FolderNameDialog({ open, onOpenChange, onSubmit, title = "New folder", submitLabel = "Create", initialName = "" }) {
39
+ const [name, setName] = external_react_namespaceObject.useState(initialName);
40
+ const [busy, setBusy] = external_react_namespaceObject.useState(false);
41
+ const [error, setError] = external_react_namespaceObject.useState(null);
42
+ external_react_namespaceObject.useEffect(()=>{
43
+ if (open) {
44
+ setName(initialName);
45
+ setError(null);
46
+ }
47
+ }, [
48
+ open,
49
+ initialName
50
+ ]);
51
+ async function handleSubmit() {
52
+ const trimmed = name.trim();
53
+ if ("" === trimmed || busy) return;
54
+ setBusy(true);
55
+ setError(null);
56
+ try {
57
+ await onSubmit(trimmed);
58
+ onOpenChange(false);
59
+ } catch (cause) {
60
+ setError(cause instanceof Error ? cause.message : "Could not save the folder.");
61
+ } finally{
62
+ setBusy(false);
63
+ }
64
+ }
65
+ return /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.Dialog, {
66
+ open: open,
67
+ onOpenChange: (next)=>{
68
+ if (!busy) onOpenChange(next);
69
+ }
70
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogContent, null, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogHeader, null, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogTitle, null, title)), /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
71
+ value: name,
72
+ placeholder: "Folder name",
73
+ "data-testid": "ak-folder-name-input",
74
+ onChange: (event)=>setName(event.currentTarget.value),
75
+ onKeyDown: (event)=>{
76
+ if ("Enter" === event.key) handleSubmit();
77
+ }
78
+ }), error ? /*#__PURE__*/ external_react_namespaceObject.createElement("p", {
79
+ role: "alert",
80
+ className: "text-sm text-[var(--ak-studio-danger-fg,#dc2626)]"
81
+ }, error) : null, /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogFooter, null, /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
82
+ type: "button",
83
+ variant: "outline",
84
+ disabled: busy,
85
+ onClick: ()=>onOpenChange(false)
86
+ }, "Cancel"), /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
87
+ type: "button",
88
+ disabled: busy || "" === name.trim(),
89
+ onClick: ()=>void handleSubmit()
90
+ }, busy ? "Saving…" : submitLabel))));
91
+ }
92
+ exports.FolderNameDialog = __webpack_exports__.FolderNameDialog;
93
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
94
+ "FolderNameDialog"
95
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
96
+ Object.defineProperty(exports, '__esModule', {
97
+ value: true
98
+ });
@@ -0,0 +1,14 @@
1
+ /**
2
+ * One dialog for both create and rename — pass `initialName` + labels. Exported
3
+ * as `CreateFolderDialog` / `RenameFolderDialog` thin aliases from the barrel.
4
+ */
5
+ export interface FolderNameDialogProps {
6
+ readonly open: boolean;
7
+ readonly onOpenChange: (open: boolean) => void;
8
+ readonly onSubmit: (name: string) => void | Promise<void>;
9
+ readonly title?: string;
10
+ readonly submitLabel?: string;
11
+ readonly initialName?: string;
12
+ }
13
+ export declare function FolderNameDialog({ open, onOpenChange, onSubmit, title, submitLabel, initialName, }: FolderNameDialogProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=FolderNameDialog.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderNameDialog.d.cts","sourceRoot":"","sources":["../../src/ui/FolderNameDialog.tsx"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,EAChC,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,KAAoB,EACpB,WAAsB,EACtB,WAAgB,GAChB,EAAE,qBAAqB,2CA8EvB"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * One dialog for both create and rename — pass `initialName` + labels. Exported
3
+ * as `CreateFolderDialog` / `RenameFolderDialog` thin aliases from the barrel.
4
+ */
5
+ export interface FolderNameDialogProps {
6
+ readonly open: boolean;
7
+ readonly onOpenChange: (open: boolean) => void;
8
+ readonly onSubmit: (name: string) => void | Promise<void>;
9
+ readonly title?: string;
10
+ readonly submitLabel?: string;
11
+ readonly initialName?: string;
12
+ }
13
+ export declare function FolderNameDialog({ open, onOpenChange, onSubmit, title, submitLabel, initialName, }: FolderNameDialogProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=FolderNameDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderNameDialog.d.ts","sourceRoot":"","sources":["../../src/ui/FolderNameDialog.tsx"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,EAChC,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,KAAoB,EACpB,WAAsB,EACtB,WAAgB,GAChB,EAAE,qBAAqB,2CA8EvB"}
@@ -0,0 +1,60 @@
1
+ "use client";
2
+ import { Button } from "@anvilkit/ui/button";
3
+ import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@anvilkit/ui/dialog";
4
+ import { Input } from "@anvilkit/ui/input";
5
+ import * as __rspack_external_react from "react";
6
+ function FolderNameDialog({ open, onOpenChange, onSubmit, title = "New folder", submitLabel = "Create", initialName = "" }) {
7
+ const [name, setName] = __rspack_external_react.useState(initialName);
8
+ const [busy, setBusy] = __rspack_external_react.useState(false);
9
+ const [error, setError] = __rspack_external_react.useState(null);
10
+ __rspack_external_react.useEffect(()=>{
11
+ if (open) {
12
+ setName(initialName);
13
+ setError(null);
14
+ }
15
+ }, [
16
+ open,
17
+ initialName
18
+ ]);
19
+ async function handleSubmit() {
20
+ const trimmed = name.trim();
21
+ if ("" === trimmed || busy) return;
22
+ setBusy(true);
23
+ setError(null);
24
+ try {
25
+ await onSubmit(trimmed);
26
+ onOpenChange(false);
27
+ } catch (cause) {
28
+ setError(cause instanceof Error ? cause.message : "Could not save the folder.");
29
+ } finally{
30
+ setBusy(false);
31
+ }
32
+ }
33
+ return /*#__PURE__*/ __rspack_external_react.createElement(Dialog, {
34
+ open: open,
35
+ onOpenChange: (next)=>{
36
+ if (!busy) onOpenChange(next);
37
+ }
38
+ }, /*#__PURE__*/ __rspack_external_react.createElement(DialogContent, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogTitle, null, title)), /*#__PURE__*/ __rspack_external_react.createElement(Input, {
39
+ value: name,
40
+ placeholder: "Folder name",
41
+ "data-testid": "ak-folder-name-input",
42
+ onChange: (event)=>setName(event.currentTarget.value),
43
+ onKeyDown: (event)=>{
44
+ if ("Enter" === event.key) handleSubmit();
45
+ }
46
+ }), error ? /*#__PURE__*/ __rspack_external_react.createElement("p", {
47
+ role: "alert",
48
+ className: "text-sm text-[var(--ak-studio-danger-fg,#dc2626)]"
49
+ }, error) : null, /*#__PURE__*/ __rspack_external_react.createElement(DialogFooter, null, /*#__PURE__*/ __rspack_external_react.createElement(Button, {
50
+ type: "button",
51
+ variant: "outline",
52
+ disabled: busy,
53
+ onClick: ()=>onOpenChange(false)
54
+ }, "Cancel"), /*#__PURE__*/ __rspack_external_react.createElement(Button, {
55
+ type: "button",
56
+ disabled: busy || "" === name.trim(),
57
+ onClick: ()=>void handleSubmit()
58
+ }, busy ? "Saving…" : submitLabel))));
59
+ }
60
+ export { FolderNameDialog };
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ "use client";
3
+ var __webpack_require__ = {};
4
+ (()=>{
5
+ __webpack_require__.d = (exports1, getters, values)=>{
6
+ var define = (defs, kind)=>{
7
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
8
+ enumerable: true,
9
+ [kind]: defs[key]
10
+ });
11
+ };
12
+ define(getters, "get");
13
+ define(values, "value");
14
+ };
15
+ })();
16
+ (()=>{
17
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
18
+ })();
19
+ (()=>{
20
+ __webpack_require__.r = (exports1)=>{
21
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
22
+ value: 'Module'
23
+ });
24
+ Object.defineProperty(exports1, '__esModule', {
25
+ value: true
26
+ });
27
+ };
28
+ })();
29
+ var __webpack_exports__ = {};
30
+ __webpack_require__.r(__webpack_exports__);
31
+ __webpack_require__.d(__webpack_exports__, {
32
+ ASSET_DRAG_MIME: ()=>ASSET_DRAG_MIME,
33
+ FolderTree: ()=>FolderTree
34
+ });
35
+ const button_namespaceObject = require("@anvilkit/ui/button");
36
+ const external_react_namespaceObject = require("react");
37
+ const ASSET_DRAG_MIME = "application/x-anvilkit-assets";
38
+ function FolderTree({ folders, currentFolderId, onNavigate, onDropAssets }) {
39
+ const [dropTarget, setDropTarget] = external_react_namespaceObject.useState(null);
40
+ const handleDrop = (folderId)=>(event)=>{
41
+ event.preventDefault();
42
+ setDropTarget(null);
43
+ if (void 0 === onDropAssets) return;
44
+ try {
45
+ const raw = event.dataTransfer.getData(ASSET_DRAG_MIME);
46
+ const assetIds = raw ? JSON.parse(raw) : [];
47
+ if (Array.isArray(assetIds) && assetIds.length > 0) onDropAssets(assetIds, folderId);
48
+ } catch {}
49
+ };
50
+ if (0 === folders.length) return null;
51
+ const droppable = void 0 !== onDropAssets;
52
+ return /*#__PURE__*/ external_react_namespaceObject.createElement("ul", {
53
+ "aria-label": "Folders",
54
+ "data-testid": "ak-folder-tree",
55
+ className: "flex flex-col gap-1"
56
+ }, folders.map((folder)=>/*#__PURE__*/ external_react_namespaceObject.createElement("li", {
57
+ key: folder.id
58
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
59
+ type: "button",
60
+ variant: folder.id === currentFolderId ? "secondary" : "ghost",
61
+ size: "sm",
62
+ className: "w-full justify-start",
63
+ "data-folder-id": folder.id,
64
+ "data-drop-target": dropTarget === folder.id ? "" : void 0,
65
+ title: droppable ? `Open ${folder.name} — or drop assets here to move them in` : void 0,
66
+ onClick: ()=>onNavigate(folder.id),
67
+ onDragOver: onDropAssets ? (event)=>{
68
+ event.preventDefault();
69
+ setDropTarget(folder.id);
70
+ } : void 0,
71
+ onDragLeave: onDropAssets ? ()=>setDropTarget((current)=>current === folder.id ? null : current) : void 0,
72
+ onDrop: onDropAssets ? handleDrop(folder.id) : void 0
73
+ }, folder.name, " (", folder.counts.assets, ")"))));
74
+ }
75
+ exports.ASSET_DRAG_MIME = __webpack_exports__.ASSET_DRAG_MIME;
76
+ exports.FolderTree = __webpack_exports__.FolderTree;
77
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
78
+ "ASSET_DRAG_MIME",
79
+ "FolderTree"
80
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
81
+ Object.defineProperty(exports, '__esModule', {
82
+ value: true
83
+ });
@@ -0,0 +1,13 @@
1
+ import type { AssetFolder } from "../types/folders.js";
2
+ /** dataTransfer MIME for an asset-id drag payload (native HTML5 DnD, no @dnd-kit). */
3
+ export declare const ASSET_DRAG_MIME = "application/x-anvilkit-assets";
4
+ export interface FolderTreeProps {
5
+ /** Child folders of the current folder. */
6
+ readonly folders: readonly AssetFolder[];
7
+ readonly currentFolderId: string | null;
8
+ readonly onNavigate: (folderId: string | null) => void;
9
+ /** Drop handler for an asset-id payload dragged onto a folder row. */
10
+ readonly onDropAssets?: (assetIds: readonly string[], folderId: string | null) => void;
11
+ }
12
+ export declare function FolderTree({ folders, currentFolderId, onNavigate, onDropAssets, }: FolderTreeProps): import("react/jsx-runtime").JSX.Element | null;
13
+ //# sourceMappingURL=FolderTree.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderTree.d.cts","sourceRoot":"","sources":["../../src/ui/FolderTree.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,sFAAsF;AACtF,eAAO,MAAM,eAAe,kCAAkC,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,CACvB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,KACnB,IAAI,CAAC;CACV;AAED,wBAAgB,UAAU,CAAC,EAC1B,OAAO,EACP,eAAe,EACf,UAAU,EACV,YAAY,GACZ,EAAE,eAAe,kDAoEjB"}
@@ -0,0 +1,13 @@
1
+ import type { AssetFolder } from "../types/folders.js";
2
+ /** dataTransfer MIME for an asset-id drag payload (native HTML5 DnD, no @dnd-kit). */
3
+ export declare const ASSET_DRAG_MIME = "application/x-anvilkit-assets";
4
+ export interface FolderTreeProps {
5
+ /** Child folders of the current folder. */
6
+ readonly folders: readonly AssetFolder[];
7
+ readonly currentFolderId: string | null;
8
+ readonly onNavigate: (folderId: string | null) => void;
9
+ /** Drop handler for an asset-id payload dragged onto a folder row. */
10
+ readonly onDropAssets?: (assetIds: readonly string[], folderId: string | null) => void;
11
+ }
12
+ export declare function FolderTree({ folders, currentFolderId, onNavigate, onDropAssets, }: FolderTreeProps): import("react/jsx-runtime").JSX.Element | null;
13
+ //# sourceMappingURL=FolderTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderTree.d.ts","sourceRoot":"","sources":["../../src/ui/FolderTree.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,sFAAsF;AACtF,eAAO,MAAM,eAAe,kCAAkC,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,CACvB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,KACnB,IAAI,CAAC;CACV;AAED,wBAAgB,UAAU,CAAC,EAC1B,OAAO,EACP,eAAe,EACf,UAAU,EACV,YAAY,GACZ,EAAE,eAAe,kDAoEjB"}
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { Button } from "@anvilkit/ui/button";
3
+ import * as __rspack_external_react from "react";
4
+ const ASSET_DRAG_MIME = "application/x-anvilkit-assets";
5
+ function FolderTree({ folders, currentFolderId, onNavigate, onDropAssets }) {
6
+ const [dropTarget, setDropTarget] = __rspack_external_react.useState(null);
7
+ const handleDrop = (folderId)=>(event)=>{
8
+ event.preventDefault();
9
+ setDropTarget(null);
10
+ if (void 0 === onDropAssets) return;
11
+ try {
12
+ const raw = event.dataTransfer.getData(ASSET_DRAG_MIME);
13
+ const assetIds = raw ? JSON.parse(raw) : [];
14
+ if (Array.isArray(assetIds) && assetIds.length > 0) onDropAssets(assetIds, folderId);
15
+ } catch {}
16
+ };
17
+ if (0 === folders.length) return null;
18
+ const droppable = void 0 !== onDropAssets;
19
+ return /*#__PURE__*/ __rspack_external_react.createElement("ul", {
20
+ "aria-label": "Folders",
21
+ "data-testid": "ak-folder-tree",
22
+ className: "flex flex-col gap-1"
23
+ }, folders.map((folder)=>/*#__PURE__*/ __rspack_external_react.createElement("li", {
24
+ key: folder.id
25
+ }, /*#__PURE__*/ __rspack_external_react.createElement(Button, {
26
+ type: "button",
27
+ variant: folder.id === currentFolderId ? "secondary" : "ghost",
28
+ size: "sm",
29
+ className: "w-full justify-start",
30
+ "data-folder-id": folder.id,
31
+ "data-drop-target": dropTarget === folder.id ? "" : void 0,
32
+ title: droppable ? `Open ${folder.name} — or drop assets here to move them in` : void 0,
33
+ onClick: ()=>onNavigate(folder.id),
34
+ onDragOver: onDropAssets ? (event)=>{
35
+ event.preventDefault();
36
+ setDropTarget(folder.id);
37
+ } : void 0,
38
+ onDragLeave: onDropAssets ? ()=>setDropTarget((current)=>current === folder.id ? null : current) : void 0,
39
+ onDrop: onDropAssets ? handleDrop(folder.id) : void 0
40
+ }, folder.name, " (", folder.counts.assets, ")"))));
41
+ }
42
+ export { ASSET_DRAG_MIME, FolderTree };