@anvilkit/plugin-asset-manager 0.1.1

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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/adapters/data-url.cjs +78 -0
  4. package/dist/adapters/data-url.d.cts +6 -0
  5. package/dist/adapters/data-url.d.cts.map +1 -0
  6. package/dist/adapters/data-url.d.ts +6 -0
  7. package/dist/adapters/data-url.d.ts.map +1 -0
  8. package/dist/adapters/data-url.js +44 -0
  9. package/dist/adapters/extract-image-dimensions.cjs +69 -0
  10. package/dist/adapters/extract-image-dimensions.d.cts +21 -0
  11. package/dist/adapters/extract-image-dimensions.d.cts.map +1 -0
  12. package/dist/adapters/extract-image-dimensions.d.ts +21 -0
  13. package/dist/adapters/extract-image-dimensions.d.ts.map +1 -0
  14. package/dist/adapters/extract-image-dimensions.js +35 -0
  15. package/dist/adapters/in-memory.cjs +62 -0
  16. package/dist/adapters/in-memory.d.cts +3 -0
  17. package/dist/adapters/in-memory.d.cts.map +1 -0
  18. package/dist/adapters/in-memory.d.ts +3 -0
  19. package/dist/adapters/in-memory.d.ts.map +1 -0
  20. package/dist/adapters/in-memory.js +28 -0
  21. package/dist/adapters/s3-presigned.cjs +166 -0
  22. package/dist/adapters/s3-presigned.d.cts +59 -0
  23. package/dist/adapters/s3-presigned.d.cts.map +1 -0
  24. package/dist/adapters/s3-presigned.d.ts +59 -0
  25. package/dist/adapters/s3-presigned.d.ts.map +1 -0
  26. package/dist/adapters/s3-presigned.js +129 -0
  27. package/dist/asset-reference.cjs +38 -0
  28. package/dist/asset-reference.d.cts +10 -0
  29. package/dist/asset-reference.d.cts.map +1 -0
  30. package/dist/asset-reference.d.ts +10 -0
  31. package/dist/asset-reference.d.ts.map +1 -0
  32. package/dist/asset-reference.js +4 -0
  33. package/dist/csp.cjs +83 -0
  34. package/dist/csp.d.cts +45 -0
  35. package/dist/csp.d.cts.map +1 -0
  36. package/dist/csp.d.ts +45 -0
  37. package/dist/csp.d.ts.map +1 -0
  38. package/dist/csp.js +49 -0
  39. package/dist/errors.cjs +58 -0
  40. package/dist/errors.d.cts +15 -0
  41. package/dist/errors.d.cts.map +1 -0
  42. package/dist/errors.d.ts +15 -0
  43. package/dist/errors.d.ts.map +1 -0
  44. package/dist/errors.js +21 -0
  45. package/dist/header-action.cjs +44 -0
  46. package/dist/header-action.d.cts +3 -0
  47. package/dist/header-action.d.cts.map +1 -0
  48. package/dist/header-action.d.ts +3 -0
  49. package/dist/header-action.d.ts.map +1 -0
  50. package/dist/header-action.js +10 -0
  51. package/dist/index.cjs +90 -0
  52. package/dist/index.d.cts +18 -0
  53. package/dist/index.d.cts.map +1 -0
  54. package/dist/index.d.ts +18 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +10 -0
  57. package/dist/infer-kind.cjs +45 -0
  58. package/dist/infer-kind.d.cts +8 -0
  59. package/dist/infer-kind.d.cts.map +1 -0
  60. package/dist/infer-kind.d.ts +8 -0
  61. package/dist/infer-kind.d.ts.map +1 -0
  62. package/dist/infer-kind.js +11 -0
  63. package/dist/plugin.cjs +258 -0
  64. package/dist/plugin.d.cts +9 -0
  65. package/dist/plugin.d.cts.map +1 -0
  66. package/dist/plugin.d.ts +9 -0
  67. package/dist/plugin.d.ts.map +1 -0
  68. package/dist/plugin.js +212 -0
  69. package/dist/registry.cjs +198 -0
  70. package/dist/registry.d.cts +3 -0
  71. package/dist/registry.d.cts.map +1 -0
  72. package/dist/registry.d.ts +3 -0
  73. package/dist/registry.d.ts.map +1 -0
  74. package/dist/registry.js +164 -0
  75. package/dist/resolver.cjs +185 -0
  76. package/dist/resolver.d.cts +10 -0
  77. package/dist/resolver.d.cts.map +1 -0
  78. package/dist/resolver.d.ts +10 -0
  79. package/dist/resolver.d.ts.map +1 -0
  80. package/dist/resolver.js +148 -0
  81. package/dist/retry.cjs +123 -0
  82. package/dist/retry.d.cts +71 -0
  83. package/dist/retry.d.cts.map +1 -0
  84. package/dist/retry.d.ts +71 -0
  85. package/dist/retry.d.ts.map +1 -0
  86. package/dist/retry.js +86 -0
  87. package/dist/studio-asset-source.cjs +211 -0
  88. package/dist/studio-asset-source.d.cts +52 -0
  89. package/dist/studio-asset-source.d.cts.map +1 -0
  90. package/dist/studio-asset-source.d.ts +52 -0
  91. package/dist/studio-asset-source.d.ts.map +1 -0
  92. package/dist/studio-asset-source.js +171 -0
  93. package/dist/testing/index.cjs +66 -0
  94. package/dist/testing/index.d.cts +24 -0
  95. package/dist/testing/index.d.cts.map +1 -0
  96. package/dist/testing/index.d.ts +24 -0
  97. package/dist/testing/index.d.ts.map +1 -0
  98. package/dist/testing/index.js +29 -0
  99. package/dist/types.cjs +18 -0
  100. package/dist/types.d.cts +132 -0
  101. package/dist/types.d.cts.map +1 -0
  102. package/dist/types.d.ts +132 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +0 -0
  105. package/dist/ui/AssetBrowser.cjs +271 -0
  106. package/dist/ui/AssetBrowser.d.cts +45 -0
  107. package/dist/ui/AssetBrowser.d.cts.map +1 -0
  108. package/dist/ui/AssetBrowser.d.ts +45 -0
  109. package/dist/ui/AssetBrowser.d.ts.map +1 -0
  110. package/dist/ui/AssetBrowser.js +237 -0
  111. package/dist/ui/AssetCommandPalette.cjs +135 -0
  112. package/dist/ui/AssetCommandPalette.d.cts +21 -0
  113. package/dist/ui/AssetCommandPalette.d.cts.map +1 -0
  114. package/dist/ui/AssetCommandPalette.d.ts +21 -0
  115. package/dist/ui/AssetCommandPalette.d.ts.map +1 -0
  116. package/dist/ui/AssetCommandPalette.js +101 -0
  117. package/dist/ui/AssetManagerUI.cjs +169 -0
  118. package/dist/ui/AssetManagerUI.d.cts +15 -0
  119. package/dist/ui/AssetManagerUI.d.cts.map +1 -0
  120. package/dist/ui/AssetManagerUI.d.ts +15 -0
  121. package/dist/ui/AssetManagerUI.d.ts.map +1 -0
  122. package/dist/ui/AssetManagerUI.js +135 -0
  123. package/dist/ui/DeleteAssetDialog.cjs +70 -0
  124. package/dist/ui/DeleteAssetDialog.d.cts +22 -0
  125. package/dist/ui/DeleteAssetDialog.d.cts.map +1 -0
  126. package/dist/ui/DeleteAssetDialog.d.ts +22 -0
  127. package/dist/ui/DeleteAssetDialog.d.ts.map +1 -0
  128. package/dist/ui/DeleteAssetDialog.js +36 -0
  129. package/dist/ui/MetadataPanel.cjs +147 -0
  130. package/dist/ui/MetadataPanel.d.cts +21 -0
  131. package/dist/ui/MetadataPanel.d.cts.map +1 -0
  132. package/dist/ui/MetadataPanel.d.ts +21 -0
  133. package/dist/ui/MetadataPanel.d.ts.map +1 -0
  134. package/dist/ui/MetadataPanel.js +113 -0
  135. package/dist/ui/ReplaceAssetDialog.cjs +125 -0
  136. package/dist/ui/ReplaceAssetDialog.d.cts +14 -0
  137. package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -0
  138. package/dist/ui/ReplaceAssetDialog.d.ts +14 -0
  139. package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -0
  140. package/dist/ui/ReplaceAssetDialog.js +91 -0
  141. package/dist/ui/UploadButton.cjs +189 -0
  142. package/dist/ui/UploadButton.d.cts +17 -0
  143. package/dist/ui/UploadButton.d.cts.map +1 -0
  144. package/dist/ui/UploadButton.d.ts +17 -0
  145. package/dist/ui/UploadButton.d.ts.map +1 -0
  146. package/dist/ui/UploadButton.js +155 -0
  147. package/dist/ui/index.cjs +60 -0
  148. package/dist/ui/index.d.cts +15 -0
  149. package/dist/ui/index.d.cts.map +1 -0
  150. package/dist/ui/index.d.ts +15 -0
  151. package/dist/ui/index.d.ts.map +1 -0
  152. package/dist/ui/index.js +7 -0
  153. package/dist/validate-upload-result.cjs +149 -0
  154. package/dist/validate-upload-result.d.cts +9 -0
  155. package/dist/validate-upload-result.d.cts.map +1 -0
  156. package/dist/validate-upload-result.d.ts +9 -0
  157. package/dist/validate-upload-result.d.ts.map +1 -0
  158. package/dist/validate-upload-result.js +115 -0
  159. package/package.json +131 -0
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ AssetManagerUI: ()=>AssetManagerUI
28
+ });
29
+ const card_namespaceObject = require("@anvilkit/ui/card");
30
+ const progress_namespaceObject = require("@anvilkit/ui/progress");
31
+ const external_react_namespaceObject = require("react");
32
+ const external_validate_upload_result_cjs_namespaceObject = require("../validate-upload-result.cjs");
33
+ const external_AssetBrowser_cjs_namespaceObject = require("./AssetBrowser.cjs");
34
+ const external_AssetCommandPalette_cjs_namespaceObject = require("./AssetCommandPalette.cjs");
35
+ const external_DeleteAssetDialog_cjs_namespaceObject = require("./DeleteAssetDialog.cjs");
36
+ const external_MetadataPanel_cjs_namespaceObject = require("./MetadataPanel.cjs");
37
+ const external_ReplaceAssetDialog_cjs_namespaceObject = require("./ReplaceAssetDialog.cjs");
38
+ const external_UploadButton_cjs_namespaceObject = require("./UploadButton.cjs");
39
+ function AssetManagerUI({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onAssetInserted, registry, searchEnabled = true, uploader }) {
40
+ const [assets, setAssets] = external_react_namespaceObject.useState(()=>registry.list());
41
+ const [progress, setProgress] = external_react_namespaceObject.useState(null);
42
+ const [pendingDelete, setPendingDelete] = external_react_namespaceObject.useState(null);
43
+ const [pendingReplace, setPendingReplace] = external_react_namespaceObject.useState(null);
44
+ const [pendingEdit, setPendingEdit] = external_react_namespaceObject.useState(null);
45
+ const [paletteOpen, setPaletteOpen] = external_react_namespaceObject.useState(false);
46
+ external_react_namespaceObject.useEffect(()=>{
47
+ setAssets(registry.list());
48
+ const unsubscribe = registry.subscribe(()=>{
49
+ setAssets(registry.list());
50
+ });
51
+ return unsubscribe;
52
+ }, [
53
+ registry
54
+ ]);
55
+ external_react_namespaceObject.useEffect(()=>{
56
+ if (!searchEnabled) return;
57
+ function handler(event) {
58
+ if ((event.metaKey || event.ctrlKey) && "k" === event.key.toLowerCase()) {
59
+ event.preventDefault();
60
+ setPaletteOpen((current)=>!current);
61
+ }
62
+ }
63
+ window.addEventListener("keydown", handler);
64
+ return ()=>{
65
+ window.removeEventListener("keydown", handler);
66
+ };
67
+ }, [
68
+ searchEnabled
69
+ ]);
70
+ function handleUploaded(asset) {
71
+ const stored = registry.register(asset);
72
+ onAssetInserted?.(stored);
73
+ }
74
+ async function handleConfirmDelete(asset) {
75
+ registry.delete(asset.id);
76
+ setPendingDelete(null);
77
+ }
78
+ async function handleConfirmReplace(asset, file) {
79
+ const uploaded = await uploader(file);
80
+ const validated = (0, external_validate_upload_result_cjs_namespaceObject.validateUploadResult)({
81
+ ...uploaded,
82
+ meta: {
83
+ size: file.size,
84
+ ...file.type ? {
85
+ mimeType: file.type
86
+ } : {},
87
+ ...uploaded.meta ?? {}
88
+ }
89
+ }, {
90
+ dataUrlAllowlistOptIn,
91
+ allowMixedScriptHostnames
92
+ });
93
+ registry.replace(asset.id, validated);
94
+ setPendingReplace(null);
95
+ }
96
+ async function handleConfirmEdit(asset, next) {
97
+ if ("" !== next.name && next.name !== asset.name) registry.rename(asset.id, next.name);
98
+ registry.setTags(asset.id, next.tags);
99
+ setPendingEdit(null);
100
+ }
101
+ const showProgress = null !== progress && progress.total > 0;
102
+ const percent = showProgress ? Math.round(progress.completed / progress.total * 100) : 0;
103
+ return /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.Card, null, /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardHeader, null, /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardTitle, null, "Asset manager"), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardDescription, null, "Upload via the configured adapter, then insert a validated asset reference.")), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardContent, null, /*#__PURE__*/ external_react_namespaceObject.createElement(external_UploadButton_cjs_namespaceObject.UploadButton, {
104
+ acceptedMimeTypes: acceptedMimeTypes,
105
+ allowMixedScriptHostnames: allowMixedScriptHostnames,
106
+ dataUrlAllowlistOptIn: dataUrlAllowlistOptIn,
107
+ maxFileSize: maxFileSize,
108
+ onProgress: setProgress,
109
+ onUploaded: handleUploaded,
110
+ uploader: uploader
111
+ }), showProgress ? /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
112
+ "data-asset-manager-progress": true
113
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement(progress_namespaceObject.Progress, {
114
+ "aria-label": "Batch upload progress",
115
+ value: percent
116
+ }), /*#__PURE__*/ external_react_namespaceObject.createElement("p", {
117
+ "aria-live": "polite",
118
+ role: "status"
119
+ }, "Uploading ", progress.completed, " of ", progress.total)) : null, /*#__PURE__*/ external_react_namespaceObject.createElement(external_AssetBrowser_cjs_namespaceObject.AssetBrowser, {
120
+ assets: assets,
121
+ onDelete: (asset)=>{
122
+ setPendingDelete(asset);
123
+ },
124
+ onEdit: (asset)=>{
125
+ setPendingEdit(asset);
126
+ },
127
+ onInsert: (asset)=>{
128
+ onAssetInserted?.(asset);
129
+ },
130
+ onReplace: (asset)=>{
131
+ setPendingReplace(asset);
132
+ },
133
+ searchEnabled: searchEnabled
134
+ }), /*#__PURE__*/ external_react_namespaceObject.createElement(external_DeleteAssetDialog_cjs_namespaceObject.DeleteAssetDialog, {
135
+ asset: pendingDelete,
136
+ onCancel: ()=>{
137
+ setPendingDelete(null);
138
+ },
139
+ onConfirm: handleConfirmDelete
140
+ }), /*#__PURE__*/ external_react_namespaceObject.createElement(external_ReplaceAssetDialog_cjs_namespaceObject.ReplaceAssetDialog, {
141
+ acceptedMimeTypes: acceptedMimeTypes,
142
+ asset: pendingReplace,
143
+ maxFileSize: maxFileSize,
144
+ onCancel: ()=>{
145
+ setPendingReplace(null);
146
+ },
147
+ onConfirm: handleConfirmReplace
148
+ }), /*#__PURE__*/ external_react_namespaceObject.createElement(external_MetadataPanel_cjs_namespaceObject.MetadataPanel, {
149
+ asset: pendingEdit,
150
+ onCancel: ()=>{
151
+ setPendingEdit(null);
152
+ },
153
+ onConfirm: handleConfirmEdit
154
+ }), searchEnabled ? /*#__PURE__*/ external_react_namespaceObject.createElement(external_AssetCommandPalette_cjs_namespaceObject.AssetCommandPalette, {
155
+ onOpenChange: setPaletteOpen,
156
+ onSelect: (asset)=>{
157
+ onAssetInserted?.(asset);
158
+ },
159
+ open: paletteOpen,
160
+ registry: registry
161
+ }) : null));
162
+ }
163
+ exports.AssetManagerUI = __webpack_exports__.AssetManagerUI;
164
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
165
+ "AssetManagerUI"
166
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
167
+ Object.defineProperty(exports, '__esModule', {
168
+ value: true
169
+ });
@@ -0,0 +1,15 @@
1
+ import type { AssetManagerOptions, AssetRegistry, UploadResult } from "../types.js";
2
+ export interface AssetManagerUIProps extends Pick<AssetManagerOptions, "acceptedMimeTypes" | "maxFileSize" | "uploader" | "dataUrlAllowlistOptIn" | "allowMixedScriptHostnames"> {
3
+ readonly registry: AssetRegistry;
4
+ readonly onAssetInserted?: (asset: UploadResult) => void;
5
+ /**
6
+ * When `true`, exposes the search input + kind chips on the embedded
7
+ * `AssetBrowser` and enables Cmd-K / Ctrl-K to open the
8
+ * `AssetCommandPalette`. Defaults to `true` because Phase 3 is the
9
+ * library-management milestone — hosts that want the lean Phase 1
10
+ * chrome can opt out.
11
+ */
12
+ readonly searchEnabled?: boolean;
13
+ }
14
+ export declare function AssetManagerUI({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onAssetInserted, registry, searchEnabled, uploader, }: AssetManagerUIProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=AssetManagerUI.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetManagerUI.d.cts","sourceRoot":"","sources":["../../src/ui/AssetManagerUI.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACX,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,MAAM,aAAa,CAAC;AASrB,MAAM,WAAW,mBAChB,SAAQ,IAAI,CACX,mBAAmB,EACjB,mBAAmB,GACnB,aAAa,GACb,UAAU,GACV,uBAAuB,GACvB,2BAA2B,CAC7B;IACD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACzD;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,cAAc,CAAC,EAC9B,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,QAAQ,EACR,aAAoB,EACpB,QAAQ,GACR,EAAE,mBAAmB,2CAiKrB"}
@@ -0,0 +1,15 @@
1
+ import type { AssetManagerOptions, AssetRegistry, UploadResult } from "../types.js";
2
+ export interface AssetManagerUIProps extends Pick<AssetManagerOptions, "acceptedMimeTypes" | "maxFileSize" | "uploader" | "dataUrlAllowlistOptIn" | "allowMixedScriptHostnames"> {
3
+ readonly registry: AssetRegistry;
4
+ readonly onAssetInserted?: (asset: UploadResult) => void;
5
+ /**
6
+ * When `true`, exposes the search input + kind chips on the embedded
7
+ * `AssetBrowser` and enables Cmd-K / Ctrl-K to open the
8
+ * `AssetCommandPalette`. Defaults to `true` because Phase 3 is the
9
+ * library-management milestone — hosts that want the lean Phase 1
10
+ * chrome can opt out.
11
+ */
12
+ readonly searchEnabled?: boolean;
13
+ }
14
+ export declare function AssetManagerUI({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onAssetInserted, registry, searchEnabled, uploader, }: AssetManagerUIProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=AssetManagerUI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetManagerUI.d.ts","sourceRoot":"","sources":["../../src/ui/AssetManagerUI.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACX,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,MAAM,aAAa,CAAC;AASrB,MAAM,WAAW,mBAChB,SAAQ,IAAI,CACX,mBAAmB,EACjB,mBAAmB,GACnB,aAAa,GACb,UAAU,GACV,uBAAuB,GACvB,2BAA2B,CAC7B;IACD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACzD;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,cAAc,CAAC,EAC9B,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,QAAQ,EACR,aAAoB,EACpB,QAAQ,GACR,EAAE,mBAAmB,2CAiKrB"}
@@ -0,0 +1,135 @@
1
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@anvilkit/ui/card";
2
+ import { Progress } from "@anvilkit/ui/progress";
3
+ import { validateUploadResult } from "../validate-upload-result.js";
4
+ import { AssetBrowser } from "./AssetBrowser.js";
5
+ import { AssetCommandPalette } from "./AssetCommandPalette.js";
6
+ import { DeleteAssetDialog } from "./DeleteAssetDialog.js";
7
+ import { MetadataPanel } from "./MetadataPanel.js";
8
+ import { ReplaceAssetDialog } from "./ReplaceAssetDialog.js";
9
+ import { UploadButton } from "./UploadButton.js";
10
+ import * as __rspack_external_react from "react";
11
+ function AssetManagerUI({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onAssetInserted, registry, searchEnabled = true, uploader }) {
12
+ const [assets, setAssets] = __rspack_external_react.useState(()=>registry.list());
13
+ const [progress, setProgress] = __rspack_external_react.useState(null);
14
+ const [pendingDelete, setPendingDelete] = __rspack_external_react.useState(null);
15
+ const [pendingReplace, setPendingReplace] = __rspack_external_react.useState(null);
16
+ const [pendingEdit, setPendingEdit] = __rspack_external_react.useState(null);
17
+ const [paletteOpen, setPaletteOpen] = __rspack_external_react.useState(false);
18
+ __rspack_external_react.useEffect(()=>{
19
+ setAssets(registry.list());
20
+ const unsubscribe = registry.subscribe(()=>{
21
+ setAssets(registry.list());
22
+ });
23
+ return unsubscribe;
24
+ }, [
25
+ registry
26
+ ]);
27
+ __rspack_external_react.useEffect(()=>{
28
+ if (!searchEnabled) return;
29
+ function handler(event) {
30
+ if ((event.metaKey || event.ctrlKey) && "k" === event.key.toLowerCase()) {
31
+ event.preventDefault();
32
+ setPaletteOpen((current)=>!current);
33
+ }
34
+ }
35
+ window.addEventListener("keydown", handler);
36
+ return ()=>{
37
+ window.removeEventListener("keydown", handler);
38
+ };
39
+ }, [
40
+ searchEnabled
41
+ ]);
42
+ function handleUploaded(asset) {
43
+ const stored = registry.register(asset);
44
+ onAssetInserted?.(stored);
45
+ }
46
+ async function handleConfirmDelete(asset) {
47
+ registry.delete(asset.id);
48
+ setPendingDelete(null);
49
+ }
50
+ async function handleConfirmReplace(asset, file) {
51
+ const uploaded = await uploader(file);
52
+ const validated = validateUploadResult({
53
+ ...uploaded,
54
+ meta: {
55
+ size: file.size,
56
+ ...file.type ? {
57
+ mimeType: file.type
58
+ } : {},
59
+ ...uploaded.meta ?? {}
60
+ }
61
+ }, {
62
+ dataUrlAllowlistOptIn,
63
+ allowMixedScriptHostnames
64
+ });
65
+ registry.replace(asset.id, validated);
66
+ setPendingReplace(null);
67
+ }
68
+ async function handleConfirmEdit(asset, next) {
69
+ if ("" !== next.name && next.name !== asset.name) registry.rename(asset.id, next.name);
70
+ registry.setTags(asset.id, next.tags);
71
+ setPendingEdit(null);
72
+ }
73
+ const showProgress = null !== progress && progress.total > 0;
74
+ const percent = showProgress ? Math.round(progress.completed / progress.total * 100) : 0;
75
+ return /*#__PURE__*/ __rspack_external_react.createElement(Card, null, /*#__PURE__*/ __rspack_external_react.createElement(CardHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(CardTitle, null, "Asset manager"), /*#__PURE__*/ __rspack_external_react.createElement(CardDescription, null, "Upload via the configured adapter, then insert a validated asset reference.")), /*#__PURE__*/ __rspack_external_react.createElement(CardContent, null, /*#__PURE__*/ __rspack_external_react.createElement(UploadButton, {
76
+ acceptedMimeTypes: acceptedMimeTypes,
77
+ allowMixedScriptHostnames: allowMixedScriptHostnames,
78
+ dataUrlAllowlistOptIn: dataUrlAllowlistOptIn,
79
+ maxFileSize: maxFileSize,
80
+ onProgress: setProgress,
81
+ onUploaded: handleUploaded,
82
+ uploader: uploader
83
+ }), showProgress ? /*#__PURE__*/ __rspack_external_react.createElement("div", {
84
+ "data-asset-manager-progress": true
85
+ }, /*#__PURE__*/ __rspack_external_react.createElement(Progress, {
86
+ "aria-label": "Batch upload progress",
87
+ value: percent
88
+ }), /*#__PURE__*/ __rspack_external_react.createElement("p", {
89
+ "aria-live": "polite",
90
+ role: "status"
91
+ }, "Uploading ", progress.completed, " of ", progress.total)) : null, /*#__PURE__*/ __rspack_external_react.createElement(AssetBrowser, {
92
+ assets: assets,
93
+ onDelete: (asset)=>{
94
+ setPendingDelete(asset);
95
+ },
96
+ onEdit: (asset)=>{
97
+ setPendingEdit(asset);
98
+ },
99
+ onInsert: (asset)=>{
100
+ onAssetInserted?.(asset);
101
+ },
102
+ onReplace: (asset)=>{
103
+ setPendingReplace(asset);
104
+ },
105
+ searchEnabled: searchEnabled
106
+ }), /*#__PURE__*/ __rspack_external_react.createElement(DeleteAssetDialog, {
107
+ asset: pendingDelete,
108
+ onCancel: ()=>{
109
+ setPendingDelete(null);
110
+ },
111
+ onConfirm: handleConfirmDelete
112
+ }), /*#__PURE__*/ __rspack_external_react.createElement(ReplaceAssetDialog, {
113
+ acceptedMimeTypes: acceptedMimeTypes,
114
+ asset: pendingReplace,
115
+ maxFileSize: maxFileSize,
116
+ onCancel: ()=>{
117
+ setPendingReplace(null);
118
+ },
119
+ onConfirm: handleConfirmReplace
120
+ }), /*#__PURE__*/ __rspack_external_react.createElement(MetadataPanel, {
121
+ asset: pendingEdit,
122
+ onCancel: ()=>{
123
+ setPendingEdit(null);
124
+ },
125
+ onConfirm: handleConfirmEdit
126
+ }), searchEnabled ? /*#__PURE__*/ __rspack_external_react.createElement(AssetCommandPalette, {
127
+ onOpenChange: setPaletteOpen,
128
+ onSelect: (asset)=>{
129
+ onAssetInserted?.(asset);
130
+ },
131
+ open: paletteOpen,
132
+ registry: registry
133
+ }) : null));
134
+ }
135
+ export { AssetManagerUI };
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ DeleteAssetDialog: ()=>DeleteAssetDialog
28
+ });
29
+ const button_namespaceObject = require("@anvilkit/ui/button");
30
+ const dialog_namespaceObject = require("@anvilkit/ui/dialog");
31
+ const external_react_namespaceObject = require("react");
32
+ function DeleteAssetDialog({ asset, onCancel, onConfirm, referenceCount }) {
33
+ const [busy, setBusy] = external_react_namespaceObject.useState(false);
34
+ async function handleConfirm() {
35
+ if (null === asset || busy) return;
36
+ setBusy(true);
37
+ try {
38
+ await onConfirm(asset);
39
+ } finally{
40
+ setBusy(false);
41
+ }
42
+ }
43
+ function handleOpenChange(nextOpen) {
44
+ if (!nextOpen && !busy) onCancel();
45
+ }
46
+ const open = null !== asset;
47
+ const label = asset?.name ?? asset?.id ?? "";
48
+ const mimeType = asset?.meta?.mimeType;
49
+ return /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.Dialog, {
50
+ open: open,
51
+ onOpenChange: handleOpenChange
52
+ }, /*#__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, "Delete asset?"), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogDescription, null, label, mimeType ? ` (${mimeType})` : "", " will be removed from the registry. References to it in the page will fail to resolve.", "number" == typeof referenceCount && referenceCount > 0 ? ` This asset is referenced in ${referenceCount} ${1 === referenceCount ? "node" : "nodes"}.` : "")), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogFooter, null, /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
53
+ type: "button",
54
+ variant: "outline",
55
+ onClick: onCancel,
56
+ disabled: busy
57
+ }, "Cancel"), /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
58
+ type: "button",
59
+ variant: "destructive",
60
+ onClick: handleConfirm,
61
+ disabled: busy || null === asset
62
+ }, busy ? "Deleting…" : "Delete"))));
63
+ }
64
+ exports.DeleteAssetDialog = __webpack_exports__.DeleteAssetDialog;
65
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
66
+ "DeleteAssetDialog"
67
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
68
+ Object.defineProperty(exports, '__esModule', {
69
+ value: true
70
+ });
@@ -0,0 +1,22 @@
1
+ import type { UploadResult } from "../types.js";
2
+ export interface DeleteAssetDialogProps {
3
+ /**
4
+ * Asset to confirm deletion for. When `null`, the dialog is closed.
5
+ * Setting this to an asset opens the dialog; the host clears it on
6
+ * cancel or after confirm resolves.
7
+ */
8
+ readonly asset: UploadResult | null;
9
+ /**
10
+ * Called when the user confirms. May return a Promise to keep the
11
+ * "Delete" button in a busy state until it settles.
12
+ */
13
+ readonly onConfirm: (asset: UploadResult) => void | Promise<void>;
14
+ readonly onCancel: () => void;
15
+ /**
16
+ * Optional context such as "This asset is referenced in 2 nodes".
17
+ * Rendered after the default destructive-action description.
18
+ */
19
+ readonly referenceCount?: number;
20
+ }
21
+ export declare function DeleteAssetDialog({ asset, onCancel, onConfirm, referenceCount, }: DeleteAssetDialogProps): import("react/jsx-runtime").JSX.Element;
22
+ //# sourceMappingURL=DeleteAssetDialog.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteAssetDialog.d.cts","sourceRoot":"","sources":["../../src/ui/DeleteAssetDialog.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,SAAS,EACT,cAAc,GACd,EAAE,sBAAsB,2CA8DxB"}
@@ -0,0 +1,22 @@
1
+ import type { UploadResult } from "../types.js";
2
+ export interface DeleteAssetDialogProps {
3
+ /**
4
+ * Asset to confirm deletion for. When `null`, the dialog is closed.
5
+ * Setting this to an asset opens the dialog; the host clears it on
6
+ * cancel or after confirm resolves.
7
+ */
8
+ readonly asset: UploadResult | null;
9
+ /**
10
+ * Called when the user confirms. May return a Promise to keep the
11
+ * "Delete" button in a busy state until it settles.
12
+ */
13
+ readonly onConfirm: (asset: UploadResult) => void | Promise<void>;
14
+ readonly onCancel: () => void;
15
+ /**
16
+ * Optional context such as "This asset is referenced in 2 nodes".
17
+ * Rendered after the default destructive-action description.
18
+ */
19
+ readonly referenceCount?: number;
20
+ }
21
+ export declare function DeleteAssetDialog({ asset, onCancel, onConfirm, referenceCount, }: DeleteAssetDialogProps): import("react/jsx-runtime").JSX.Element;
22
+ //# sourceMappingURL=DeleteAssetDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteAssetDialog.d.ts","sourceRoot":"","sources":["../../src/ui/DeleteAssetDialog.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,SAAS,EACT,cAAc,GACd,EAAE,sBAAsB,2CA8DxB"}
@@ -0,0 +1,36 @@
1
+ import { Button } from "@anvilkit/ui/button";
2
+ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@anvilkit/ui/dialog";
3
+ import * as __rspack_external_react from "react";
4
+ function DeleteAssetDialog({ asset, onCancel, onConfirm, referenceCount }) {
5
+ const [busy, setBusy] = __rspack_external_react.useState(false);
6
+ async function handleConfirm() {
7
+ if (null === asset || busy) return;
8
+ setBusy(true);
9
+ try {
10
+ await onConfirm(asset);
11
+ } finally{
12
+ setBusy(false);
13
+ }
14
+ }
15
+ function handleOpenChange(nextOpen) {
16
+ if (!nextOpen && !busy) onCancel();
17
+ }
18
+ const open = null !== asset;
19
+ const label = asset?.name ?? asset?.id ?? "";
20
+ const mimeType = asset?.meta?.mimeType;
21
+ return /*#__PURE__*/ __rspack_external_react.createElement(Dialog, {
22
+ open: open,
23
+ onOpenChange: handleOpenChange
24
+ }, /*#__PURE__*/ __rspack_external_react.createElement(DialogContent, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogTitle, null, "Delete asset?"), /*#__PURE__*/ __rspack_external_react.createElement(DialogDescription, null, label, mimeType ? ` (${mimeType})` : "", " will be removed from the registry. References to it in the page will fail to resolve.", "number" == typeof referenceCount && referenceCount > 0 ? ` This asset is referenced in ${referenceCount} ${1 === referenceCount ? "node" : "nodes"}.` : "")), /*#__PURE__*/ __rspack_external_react.createElement(DialogFooter, null, /*#__PURE__*/ __rspack_external_react.createElement(Button, {
25
+ type: "button",
26
+ variant: "outline",
27
+ onClick: onCancel,
28
+ disabled: busy
29
+ }, "Cancel"), /*#__PURE__*/ __rspack_external_react.createElement(Button, {
30
+ type: "button",
31
+ variant: "destructive",
32
+ onClick: handleConfirm,
33
+ disabled: busy || null === asset
34
+ }, busy ? "Deleting…" : "Delete"))));
35
+ }
36
+ export { DeleteAssetDialog };
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ MetadataPanel: ()=>MetadataPanel
28
+ });
29
+ const button_namespaceObject = require("@anvilkit/ui/button");
30
+ const dialog_namespaceObject = require("@anvilkit/ui/dialog");
31
+ const input_namespaceObject = require("@anvilkit/ui/input");
32
+ const external_react_namespaceObject = require("react");
33
+ function MetadataPanel({ asset, onCancel, onConfirm }) {
34
+ const [name, setName] = external_react_namespaceObject.useState("");
35
+ const [tagInput, setTagInput] = external_react_namespaceObject.useState("");
36
+ const [tags, setTags] = external_react_namespaceObject.useState([]);
37
+ const [busy, setBusy] = external_react_namespaceObject.useState(false);
38
+ external_react_namespaceObject.useEffect(()=>{
39
+ if (null === asset) return;
40
+ setName(asset.name ?? "");
41
+ setTags(asset.tags ?? []);
42
+ setTagInput("");
43
+ setBusy(false);
44
+ }, [
45
+ asset
46
+ ]);
47
+ function commitTagInput() {
48
+ const next = tagInput.trim().toLowerCase();
49
+ if ("" === next) return tags;
50
+ if (tags.includes(next)) {
51
+ setTagInput("");
52
+ return tags;
53
+ }
54
+ const merged = [
55
+ ...tags,
56
+ next
57
+ ];
58
+ setTags(merged);
59
+ setTagInput("");
60
+ return merged;
61
+ }
62
+ function removeTag(value) {
63
+ setTags((current)=>current.filter((entry)=>entry !== value));
64
+ }
65
+ function handleTagKeyDown(event) {
66
+ if ("Enter" === event.key || "," === event.key) {
67
+ event.preventDefault();
68
+ commitTagInput();
69
+ }
70
+ }
71
+ async function handleConfirm() {
72
+ if (null === asset || busy) return;
73
+ const finalTags = "" === tagInput.trim() ? tags : commitTagInput();
74
+ setBusy(true);
75
+ try {
76
+ await onConfirm(asset, {
77
+ name: name.trim(),
78
+ tags: finalTags
79
+ });
80
+ } finally{
81
+ setBusy(false);
82
+ }
83
+ }
84
+ function handleOpenChange(nextOpen) {
85
+ if (!nextOpen && !busy) onCancel();
86
+ }
87
+ const open = null !== asset;
88
+ const mimeType = asset?.meta?.mimeType;
89
+ return /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.Dialog, {
90
+ open: open,
91
+ onOpenChange: handleOpenChange
92
+ }, /*#__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, "Edit asset"), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogDescription, null, asset?.id, mimeType ? ` (${mimeType})` : "")), /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
93
+ "data-asset-manager-metadata": true
94
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement("label", {
95
+ htmlFor: "asset-metadata-name"
96
+ }, "Name"), /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
97
+ id: "asset-metadata-name",
98
+ value: name,
99
+ onChange: (event)=>{
100
+ setName(event.target.value);
101
+ },
102
+ placeholder: asset?.id ?? "",
103
+ disabled: busy
104
+ }), /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
105
+ "data-asset-manager-tag-editor": true
106
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement("label", {
107
+ htmlFor: "asset-metadata-tag-input"
108
+ }, "Tags"), /*#__PURE__*/ external_react_namespaceObject.createElement("ul", {
109
+ "aria-label": "Current tags",
110
+ role: "list"
111
+ }, tags.map((tag)=>/*#__PURE__*/ external_react_namespaceObject.createElement("li", {
112
+ key: tag
113
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement("span", null, tag), /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
114
+ "aria-label": `Remove tag ${tag}`,
115
+ "data-asset-action": "remove-tag",
116
+ disabled: busy,
117
+ onClick: ()=>{
118
+ removeTag(tag);
119
+ },
120
+ type: "button"
121
+ }, "\xd7")))), /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
122
+ id: "asset-metadata-tag-input",
123
+ value: tagInput,
124
+ onChange: (event)=>{
125
+ setTagInput(event.target.value);
126
+ },
127
+ onKeyDown: handleTagKeyDown,
128
+ placeholder: "Add a tag and press Enter",
129
+ disabled: busy
130
+ }))), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogFooter, null, /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
131
+ disabled: busy,
132
+ onClick: onCancel,
133
+ type: "button",
134
+ variant: "outline"
135
+ }, "Cancel"), /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
136
+ disabled: busy || null === asset,
137
+ onClick: handleConfirm,
138
+ type: "button"
139
+ }, busy ? "Saving…" : "Save"))));
140
+ }
141
+ exports.MetadataPanel = __webpack_exports__.MetadataPanel;
142
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
143
+ "MetadataPanel"
144
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
145
+ Object.defineProperty(exports, '__esModule', {
146
+ value: true
147
+ });