@anvilkit/plugin-asset-manager 0.1.7 → 0.1.9

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 (141) hide show
  1. package/README.md +4 -4
  2. package/dist/adapters/data-url.d.cts +13 -0
  3. package/dist/adapters/data-url.d.cts.map +1 -1
  4. package/dist/adapters/data-url.d.ts +13 -0
  5. package/dist/adapters/data-url.d.ts.map +1 -1
  6. package/dist/adapters/in-memory.d.cts +8 -1
  7. package/dist/adapters/in-memory.d.cts.map +1 -1
  8. package/dist/adapters/in-memory.d.ts +8 -1
  9. package/dist/adapters/in-memory.d.ts.map +1 -1
  10. package/dist/i18n/entry.cjs +75 -0
  11. package/dist/i18n/entry.d.cts +15 -0
  12. package/dist/i18n/entry.d.cts.map +1 -0
  13. package/dist/i18n/entry.d.ts +15 -0
  14. package/dist/i18n/entry.d.ts.map +1 -0
  15. package/dist/i18n/entry.js +29 -0
  16. package/dist/i18n/provider.cjs +49 -0
  17. package/dist/i18n/provider.d.cts +20 -0
  18. package/dist/i18n/provider.d.cts.map +1 -0
  19. package/dist/i18n/provider.d.ts +20 -0
  20. package/dist/i18n/provider.d.ts.map +1 -0
  21. package/dist/i18n/provider.js +11 -0
  22. package/dist/plugin.cjs +3 -1
  23. package/dist/plugin.d.cts.map +1 -1
  24. package/dist/plugin.d.ts.map +1 -1
  25. package/dist/plugin.js +3 -1
  26. package/dist/sources/composite-source.cjs +4 -3
  27. package/dist/sources/composite-source.d.cts.map +1 -1
  28. package/dist/sources/composite-source.d.ts.map +1 -1
  29. package/dist/sources/composite-source.js +4 -3
  30. package/dist/sources/federated-search.cjs +16 -6
  31. package/dist/sources/federated-search.d.cts.map +1 -1
  32. package/dist/sources/federated-search.d.ts.map +1 -1
  33. package/dist/sources/federated-search.js +16 -6
  34. package/dist/sources/unsplash/index.cjs +6 -4
  35. package/dist/sources/unsplash/index.d.cts.map +1 -1
  36. package/dist/sources/unsplash/index.d.ts.map +1 -1
  37. package/dist/sources/unsplash/index.js +6 -4
  38. package/dist/types/types.d.cts +7 -1
  39. package/dist/types/types.d.cts.map +1 -1
  40. package/dist/types/types.d.ts +7 -1
  41. package/dist/types/types.d.ts.map +1 -1
  42. package/dist/ui/AssetBrowser.cjs +175 -134
  43. package/dist/ui/AssetBrowser.d.cts.map +1 -1
  44. package/dist/ui/AssetBrowser.d.ts.map +1 -1
  45. package/dist/ui/AssetBrowser.js +175 -134
  46. package/dist/ui/AssetCommandPalette.cjs +20 -18
  47. package/dist/ui/AssetCommandPalette.d.cts.map +1 -1
  48. package/dist/ui/AssetCommandPalette.d.ts.map +1 -1
  49. package/dist/ui/AssetCommandPalette.js +20 -18
  50. package/dist/ui/AssetManagerUI.cjs +23 -15
  51. package/dist/ui/AssetManagerUI.d.cts.map +1 -1
  52. package/dist/ui/AssetManagerUI.d.ts.map +1 -1
  53. package/dist/ui/AssetManagerUI.js +23 -15
  54. package/dist/ui/DeleteAssetDialog.cjs +5 -3
  55. package/dist/ui/DeleteAssetDialog.d.cts.map +1 -1
  56. package/dist/ui/DeleteAssetDialog.d.ts.map +1 -1
  57. package/dist/ui/DeleteAssetDialog.js +5 -3
  58. package/dist/ui/DeleteFolderDialog.cjs +6 -4
  59. package/dist/ui/DeleteFolderDialog.d.cts.map +1 -1
  60. package/dist/ui/DeleteFolderDialog.d.ts.map +1 -1
  61. package/dist/ui/DeleteFolderDialog.js +6 -4
  62. package/dist/ui/EmptyFolderState.cjs +6 -3
  63. package/dist/ui/EmptyFolderState.d.cts +1 -1
  64. package/dist/ui/EmptyFolderState.d.cts.map +1 -1
  65. package/dist/ui/EmptyFolderState.d.ts +1 -1
  66. package/dist/ui/EmptyFolderState.d.ts.map +1 -1
  67. package/dist/ui/EmptyFolderState.js +6 -3
  68. package/dist/ui/FolderBreadcrumb.cjs +7 -4
  69. package/dist/ui/FolderBreadcrumb.d.cts.map +1 -1
  70. package/dist/ui/FolderBreadcrumb.d.ts.map +1 -1
  71. package/dist/ui/FolderBreadcrumb.js +7 -4
  72. package/dist/ui/FolderNameDialog.cjs +19 -12
  73. package/dist/ui/FolderNameDialog.d.cts.map +1 -1
  74. package/dist/ui/FolderNameDialog.d.ts.map +1 -1
  75. package/dist/ui/FolderNameDialog.js +19 -12
  76. package/dist/ui/FolderTree.cjs +4 -2
  77. package/dist/ui/FolderTree.d.cts.map +1 -1
  78. package/dist/ui/FolderTree.d.ts.map +1 -1
  79. package/dist/ui/FolderTree.js +4 -2
  80. package/dist/ui/MetadataPanel.cjs +16 -13
  81. package/dist/ui/MetadataPanel.d.cts.map +1 -1
  82. package/dist/ui/MetadataPanel.d.ts.map +1 -1
  83. package/dist/ui/MetadataPanel.js +16 -13
  84. package/dist/ui/MoveTargetPicker.cjs +7 -4
  85. package/dist/ui/MoveTargetPicker.d.cts.map +1 -1
  86. package/dist/ui/MoveTargetPicker.d.ts.map +1 -1
  87. package/dist/ui/MoveTargetPicker.js +7 -4
  88. package/dist/ui/ReplaceAssetDialog.cjs +19 -17
  89. package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -1
  90. package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -1
  91. package/dist/ui/ReplaceAssetDialog.js +19 -17
  92. package/dist/ui/UnsplashPanel.cjs +15 -12
  93. package/dist/ui/UnsplashPanel.d.cts.map +1 -1
  94. package/dist/ui/UnsplashPanel.d.ts.map +1 -1
  95. package/dist/ui/UnsplashPanel.js +15 -12
  96. package/dist/ui/UploadButton.cjs +11 -8
  97. package/dist/ui/UploadButton.d.cts.map +1 -1
  98. package/dist/ui/UploadButton.d.ts.map +1 -1
  99. package/dist/ui/UploadButton.js +11 -8
  100. package/dist/ui/index.cjs +4 -0
  101. package/dist/ui/index.d.cts +1 -0
  102. package/dist/ui/index.d.cts.map +1 -1
  103. package/dist/ui/index.d.ts +1 -0
  104. package/dist/ui/index.d.ts.map +1 -1
  105. package/dist/ui/index.js +1 -0
  106. package/dist/utils/data-source.cjs +18 -5
  107. package/dist/utils/data-source.d.cts.map +1 -1
  108. package/dist/utils/data-source.d.ts.map +1 -1
  109. package/dist/utils/data-source.js +19 -6
  110. package/dist/utils/folders.cjs +107 -33
  111. package/dist/utils/folders.d.cts +7 -2
  112. package/dist/utils/folders.d.cts.map +1 -1
  113. package/dist/utils/folders.d.ts +7 -2
  114. package/dist/utils/folders.d.ts.map +1 -1
  115. package/dist/utils/folders.js +107 -33
  116. package/dist/utils/header-action.cjs +1 -1
  117. package/dist/utils/header-action.d.cts.map +1 -1
  118. package/dist/utils/header-action.d.ts.map +1 -1
  119. package/dist/utils/header-action.js +1 -1
  120. package/dist/utils/registry.cjs +23 -12
  121. package/dist/utils/registry.d.cts +16 -8
  122. package/dist/utils/registry.d.cts.map +1 -1
  123. package/dist/utils/registry.d.ts +16 -8
  124. package/dist/utils/registry.d.ts.map +1 -1
  125. package/dist/utils/registry.js +19 -8
  126. package/dist/utils/resolver.cjs +5 -4
  127. package/dist/utils/resolver.d.cts.map +1 -1
  128. package/dist/utils/resolver.d.ts.map +1 -1
  129. package/dist/utils/resolver.js +5 -4
  130. package/dist/utils/studio-asset-source.cjs +8 -2
  131. package/dist/utils/studio-asset-source.js +8 -2
  132. package/dist/version.cjs +1 -1
  133. package/dist/version.d.cts +1 -1
  134. package/dist/version.d.ts +1 -1
  135. package/dist/version.js +1 -1
  136. package/i18n/messages/en.json +99 -0
  137. package/i18n/messages/ja.json +99 -0
  138. package/i18n/messages/ko.json +99 -0
  139. package/i18n/messages/zh.json +99 -0
  140. package/meta/config.json +1 -1
  141. package/package.json +11 -10
@@ -36,6 +36,7 @@ const external_client_cjs_namespaceObject = require("./client.cjs");
36
36
  const external_themes_cjs_namespaceObject = require("./themes.cjs");
37
37
  const external_throttle_cache_cjs_namespaceObject = require("./throttle-cache.cjs");
38
38
  const UNSPLASH_THEME_FACET = "unsplash:theme";
39
+ const BYID_MAX_ENTRIES = 512;
39
40
  function unsplashEnabled(options) {
40
41
  return options.enabled ?? (void 0 !== options.proxyEndpoint || void 0 !== options.accessKey);
41
42
  }
@@ -65,7 +66,7 @@ function createUnsplashProvider(options) {
65
66
  const throttle = (0, external_throttle_cache_cjs_namespaceObject.createSingleFlightThrottle)({
66
67
  minIntervalMs: options.minRequestIntervalMs ?? 1200
67
68
  });
68
- const byId = new Map();
69
+ const byId = (0, external_throttle_cache_cjs_namespaceObject.createTtlCache)(options.cacheTtlMs ?? 300000, BYID_MAX_ENTRIES);
69
70
  const toUploadResult = (photo)=>Object.freeze({
70
71
  id: `unsplash:${photo.id}`,
71
72
  url: photo.urls.regular,
@@ -127,7 +128,8 @@ function createUnsplashProvider(options) {
127
128
  total = result.total;
128
129
  }
129
130
  const items = photos.map(toUploadResult);
130
- for (const item of items)byId.set(item.id, item);
131
+ const seenAt = Date.now();
132
+ for (const item of items)byId.set(item.id, item, seenAt);
131
133
  const listPage = {
132
134
  items,
133
135
  total,
@@ -137,7 +139,7 @@ function createUnsplashProvider(options) {
137
139
  return listPage;
138
140
  };
139
141
  const pickResult = async (asset, signal)=>{
140
- const cached = byId.get(asset.id);
142
+ const cached = byId.get(asset.id, Date.now());
141
143
  if (cached?.meta?.attribution !== void 0) {
142
144
  client.trackDownload(cached.meta.attribution.downloadLocation, signal);
143
145
  return cached;
@@ -145,7 +147,7 @@ function createUnsplashProvider(options) {
145
147
  const photoId = asset.id.startsWith("unsplash:") ? asset.id.slice(9) : asset.id;
146
148
  try {
147
149
  const result = toUploadResult(await client.getPhoto(photoId, signal));
148
- byId.set(result.id, result);
150
+ byId.set(result.id, result, Date.now());
149
151
  if (result.meta?.attribution !== void 0) client.trackDownload(result.meta.attribution.downloadLocation, signal);
150
152
  return result;
151
153
  } catch {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/sources/unsplash/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAc,MAAM,gBAAgB,CAAC;AAYtE,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAKvE;AAMD,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,qBAAqB,GAC5B,mBAAmB,CAmLrB"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/sources/unsplash/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAc,MAAM,gBAAgB,CAAC;AAYtE,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AASrD,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAKvE;AAMD,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,qBAAqB,GAC5B,mBAAmB,CA0LrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sources/unsplash/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAc,MAAM,gBAAgB,CAAC;AAYtE,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAKvE;AAMD,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,qBAAqB,GAC5B,mBAAmB,CAmLrB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sources/unsplash/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAc,MAAM,gBAAgB,CAAC;AAYtE,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AASrD,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAKvE;AAMD,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,qBAAqB,GAC5B,mBAAmB,CA0LrB"}
@@ -2,6 +2,7 @@ import { createUnsplashClient } from "./client.js";
2
2
  import { ALL_THEME_ID, resolveDefaultThemeId, resolveThemes } from "./themes.js";
3
3
  import { createSingleFlightThrottle, createTtlCache } from "./throttle-cache.js";
4
4
  const UNSPLASH_THEME_FACET = "unsplash:theme";
5
+ const BYID_MAX_ENTRIES = 512;
5
6
  function unsplashEnabled(options) {
6
7
  return options.enabled ?? (void 0 !== options.proxyEndpoint || void 0 !== options.accessKey);
7
8
  }
@@ -31,7 +32,7 @@ function createUnsplashProvider(options) {
31
32
  const throttle = createSingleFlightThrottle({
32
33
  minIntervalMs: options.minRequestIntervalMs ?? 1200
33
34
  });
34
- const byId = new Map();
35
+ const byId = createTtlCache(options.cacheTtlMs ?? 300000, BYID_MAX_ENTRIES);
35
36
  const toUploadResult = (photo)=>Object.freeze({
36
37
  id: `unsplash:${photo.id}`,
37
38
  url: photo.urls.regular,
@@ -93,7 +94,8 @@ function createUnsplashProvider(options) {
93
94
  total = result.total;
94
95
  }
95
96
  const items = photos.map(toUploadResult);
96
- for (const item of items)byId.set(item.id, item);
97
+ const seenAt = Date.now();
98
+ for (const item of items)byId.set(item.id, item, seenAt);
97
99
  const listPage = {
98
100
  items,
99
101
  total,
@@ -103,7 +105,7 @@ function createUnsplashProvider(options) {
103
105
  return listPage;
104
106
  };
105
107
  const pickResult = async (asset, signal)=>{
106
- const cached = byId.get(asset.id);
108
+ const cached = byId.get(asset.id, Date.now());
107
109
  if (cached?.meta?.attribution !== void 0) {
108
110
  client.trackDownload(cached.meta.attribution.downloadLocation, signal);
109
111
  return cached;
@@ -111,7 +113,7 @@ function createUnsplashProvider(options) {
111
113
  const photoId = asset.id.startsWith("unsplash:") ? asset.id.slice(9) : asset.id;
112
114
  try {
113
115
  const result = toUploadResult(await client.getPhoto(photoId, signal));
114
- byId.set(result.id, result);
116
+ byId.set(result.id, result, Date.now());
115
117
  if (result.meta?.attribution !== void 0) client.trackDownload(result.meta.attribution.downloadLocation, signal);
116
118
  return result;
117
119
  } catch {
@@ -11,7 +11,13 @@ export interface AssetMeta {
11
11
  * extended to preserve this field in Phase 1 (M5); the type is additive here.
12
12
  */
13
13
  readonly attribution?: {
14
- readonly source: "unsplash";
14
+ /**
15
+ * Provider that requires the credit. Open string union: `"unsplash"`
16
+ * keeps autocomplete while a future credit-requiring provider (Pexels,
17
+ * etc.) can set its own id without a breaking type change. Mirrors the
18
+ * `AssetSourceId` idiom.
19
+ */
20
+ readonly source: "unsplash" | (string & {});
15
21
  readonly photographerName: string;
16
22
  readonly photographerUrl: string;
17
23
  readonly unsplashUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,13 @@ export interface AssetMeta {
11
11
  * extended to preserve this field in Phase 1 (M5); the type is additive here.
12
12
  */
13
13
  readonly attribution?: {
14
- readonly source: "unsplash";
14
+ /**
15
+ * Provider that requires the credit. Open string union: `"unsplash"`
16
+ * keeps autocomplete while a future credit-requiring provider (Pexels,
17
+ * etc.) can set its own id without a breaking type change. Mirrors the
18
+ * `AssetSourceId` idiom.
19
+ */
20
+ readonly source: "unsplash" | (string & {});
15
21
  readonly photographerName: string;
16
22
  readonly photographerUrl: string;
17
23
  readonly unsplashUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,7 @@ __webpack_require__.r(__webpack_exports__);
31
31
  __webpack_require__.d(__webpack_exports__, {
32
32
  AssetBrowser: ()=>AssetBrowser
33
33
  });
34
+ const i18n_namespaceObject = require("@anvilkit/core/i18n");
34
35
  const button_namespaceObject = require("@anvilkit/ui/button");
35
36
  const card_namespaceObject = require("@anvilkit/ui/card");
36
37
  const input_namespaceObject = require("@anvilkit/ui/input");
@@ -49,11 +50,121 @@ const DEFAULT_VIRTUALIZE_THRESHOLD = 50;
49
50
  const DEFAULT_ITEM_HEIGHT = 56;
50
51
  const DEFAULT_MAX_HEIGHT = 400;
51
52
  const DEFAULT_PAGE_SIZE = 100;
53
+ function AssetFilterRow({ query, onQueryChange, activeKinds, onToggleKind }) {
54
+ const msg = (0, i18n_namespaceObject.useMsg)();
55
+ return /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
56
+ "data-asset-manager-filters": true
57
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
58
+ "aria-label": msg("assetManager.browser.searchLabel"),
59
+ onChange: (event)=>{
60
+ onQueryChange(event.target.value);
61
+ },
62
+ placeholder: msg("assetManager.browser.searchPlaceholder"),
63
+ value: query
64
+ }), /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
65
+ "aria-label": msg("assetManager.browser.filterLabel"),
66
+ role: "group"
67
+ }, KIND_FILTERS.map((kind)=>{
68
+ const active = activeKinds.includes(kind);
69
+ return /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
70
+ "aria-label": msg("assetManager.browser.filterByKind").replace("{kind}", kind),
71
+ "aria-pressed": active,
72
+ "data-asset-kind-filter": kind,
73
+ key: kind,
74
+ onClick: ()=>{
75
+ onToggleKind(kind);
76
+ },
77
+ type: "button",
78
+ variant: active ? "secondary" : "ghost",
79
+ size: "sm"
80
+ }, msg(`assetManager.kind.${kind}`));
81
+ })));
82
+ }
83
+ const AssetBrowser_AssetRow = /*#__PURE__*/ external_react_namespaceObject.memo(function({ asset, index, isActive, total, draggableRows, onInsert, onEdit, onReplace, onDelete, onFocusRow, onMoveFocus, registerRow }) {
84
+ const msg = (0, i18n_namespaceObject.useMsg)();
85
+ return /*#__PURE__*/ external_react_namespaceObject.createElement(external_react_namespaceObject.Fragment, null, /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
86
+ "aria-label": msg("assetManager.browser.insert").replace("{id}", asset.id),
87
+ draggable: draggableRows,
88
+ "data-asset-draggable": draggableRows ? "" : void 0,
89
+ onDragStart: draggableRows ? (event)=>{
90
+ event.dataTransfer.setData(external_FolderTree_cjs_namespaceObject.ASSET_DRAG_MIME, JSON.stringify([
91
+ asset.id
92
+ ]));
93
+ event.dataTransfer.effectAllowed = "move";
94
+ } : void 0,
95
+ onClick: ()=>{
96
+ onInsert(asset);
97
+ },
98
+ onFocus: ()=>{
99
+ onFocusRow(index);
100
+ },
101
+ onKeyDown: (event)=>{
102
+ if ("ArrowDown" === event.key) {
103
+ event.preventDefault();
104
+ onMoveFocus(index + 1);
105
+ return;
106
+ }
107
+ if ("ArrowUp" === event.key) {
108
+ event.preventDefault();
109
+ onMoveFocus(index - 1);
110
+ return;
111
+ }
112
+ if ("Home" === event.key) {
113
+ event.preventDefault();
114
+ onMoveFocus(0);
115
+ return;
116
+ }
117
+ if ("End" === event.key) {
118
+ event.preventDefault();
119
+ onMoveFocus(total - 1);
120
+ return;
121
+ }
122
+ if ("Enter" === event.key || " " === event.key) {
123
+ event.preventDefault();
124
+ onInsert(asset);
125
+ }
126
+ },
127
+ ref: (node)=>{
128
+ registerRow(index, node);
129
+ },
130
+ tabIndex: isActive ? 0 : -1,
131
+ type: "button"
132
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement("span", null, asset.id), /*#__PURE__*/ external_react_namespaceObject.createElement("span", null, asset.meta?.mimeType ?? msg("assetManager.browser.unknownMime"))), void 0 !== onEdit ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
133
+ "aria-label": msg("assetManager.browser.edit").replace("{id}", asset.id),
134
+ "data-asset-action": "edit",
135
+ onClick: ()=>{
136
+ onEdit(asset);
137
+ },
138
+ type: "button",
139
+ variant: "ghost",
140
+ size: "sm"
141
+ }, msg("assetManager.button.edit")) : null, void 0 !== onReplace ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
142
+ "aria-label": msg("assetManager.browser.replace").replace("{id}", asset.id),
143
+ "data-asset-action": "replace",
144
+ onClick: ()=>{
145
+ onReplace(asset);
146
+ },
147
+ type: "button",
148
+ variant: "ghost",
149
+ size: "sm"
150
+ }, msg("assetManager.button.replace")) : null, void 0 !== onDelete ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
151
+ "aria-label": msg("assetManager.browser.delete").replace("{id}", asset.id),
152
+ "data-asset-action": "delete",
153
+ onClick: ()=>{
154
+ onDelete(asset);
155
+ },
156
+ type: "button",
157
+ variant: "ghost",
158
+ size: "sm"
159
+ }, msg("assetManager.button.delete")) : null);
160
+ });
52
161
  function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEnabled = false, aboveFilters, draggableRows = false, pageSize = DEFAULT_PAGE_SIZE, virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD, itemHeight = DEFAULT_ITEM_HEIGHT, maxHeight = DEFAULT_MAX_HEIGHT }) {
162
+ const msg = (0, i18n_namespaceObject.useMsg)();
53
163
  const [activeIndex, setActiveIndex] = external_react_namespaceObject.useState(assets.length > 0 ? 0 : -1);
54
164
  const [query, setQuery] = external_react_namespaceObject.useState("");
55
165
  const [activeKinds, setActiveKinds] = external_react_namespaceObject.useState([]);
56
- const [pageLimit, setPageLimit] = external_react_namespaceObject.useState(pageSize);
166
+ const [extraPages, setExtraPages] = external_react_namespaceObject.useState(0);
167
+ const pageLimit = pageSize * (extraPages + 1);
57
168
  const buttonRefs = external_react_namespaceObject.useRef([]);
58
169
  const pendingFocusRef = external_react_namespaceObject.useRef(null);
59
170
  const searchIndex = external_react_namespaceObject.useMemo(()=>{
@@ -77,8 +188,9 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
77
188
  const lower = query.trim().toLowerCase();
78
189
  const hasKindFilter = activeKinds.length > 0;
79
190
  if ("" === lower && !hasKindFilter) return assets;
191
+ const activeKindSet = hasKindFilter ? new Set(activeKinds) : null;
80
192
  const result = [];
81
- for (const entry of searchIndex)if (!hasKindFilter || activeKinds.includes(entry.kind)) {
193
+ for (const entry of searchIndex)if (!activeKindSet || activeKindSet.has(entry.kind)) {
82
194
  if ("" === lower || entry.haystack.includes(lower)) result.push(entry.asset);
83
195
  }
84
196
  return result;
@@ -96,154 +208,83 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
96
208
  ]);
97
209
  const total = visibleSlice.length;
98
210
  const hasMore = searchEnabled && filteredAssets.length > visibleSlice.length;
99
- external_react_namespaceObject.useEffect(()=>{
100
- if (0 === total) return void setActiveIndex(-1);
101
- setActiveIndex((currentIndex)=>currentIndex >= 0 && currentIndex < total ? currentIndex : 0);
102
- }, [
103
- total
104
- ]);
105
- function focusRow(index) {
211
+ const effectiveActiveIndex = 0 === total ? -1 : activeIndex >= 0 && activeIndex < total ? activeIndex : 0;
212
+ const focusRow = external_react_namespaceObject.useCallback((index)=>{
106
213
  const node = buttonRefs.current[index];
107
214
  if (node) {
108
215
  node.focus();
109
216
  return true;
110
217
  }
111
218
  return false;
112
- }
113
- function moveFocus(nextIndex) {
219
+ }, []);
220
+ const moveFocus = external_react_namespaceObject.useCallback((nextIndex)=>{
114
221
  if (0 === total) return;
115
222
  const clampedIndex = Math.max(0, Math.min(nextIndex, total - 1));
116
223
  pendingFocusRef.current = clampedIndex;
117
224
  setActiveIndex(clampedIndex);
118
225
  if (focusRow(clampedIndex)) pendingFocusRef.current = null;
119
- }
120
- function toggleKind(kind) {
226
+ }, [
227
+ total,
228
+ focusRow
229
+ ]);
230
+ const registerRow = external_react_namespaceObject.useCallback((index, node)=>{
231
+ buttonRefs.current[index] = node;
232
+ if (node && pendingFocusRef.current === index) {
233
+ pendingFocusRef.current = null;
234
+ node.focus();
235
+ }
236
+ }, []);
237
+ const changeQuery = external_react_namespaceObject.useCallback((value)=>{
238
+ setQuery(value);
239
+ setExtraPages(0);
240
+ }, []);
241
+ const toggleKind = external_react_namespaceObject.useCallback((kind)=>{
121
242
  setActiveKinds((current)=>current.includes(kind) ? current.filter((entry)=>entry !== kind) : [
122
243
  ...current,
123
244
  kind
124
245
  ]);
125
- }
126
- const renderRow = (asset, index)=>/*#__PURE__*/ external_react_namespaceObject.createElement(external_react_namespaceObject.Fragment, null, /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
127
- "aria-label": `Insert asset ${asset.id}`,
128
- draggable: draggableRows,
129
- "data-asset-draggable": draggableRows ? "" : void 0,
130
- onDragStart: draggableRows ? (event)=>{
131
- event.dataTransfer.setData(external_FolderTree_cjs_namespaceObject.ASSET_DRAG_MIME, JSON.stringify([
132
- asset.id
133
- ]));
134
- event.dataTransfer.effectAllowed = "move";
135
- } : void 0,
136
- onClick: ()=>{
137
- onInsert(asset);
138
- },
139
- onFocus: ()=>{
140
- setActiveIndex(index);
141
- },
142
- onKeyDown: (event)=>{
143
- if ("ArrowDown" === event.key) {
144
- event.preventDefault();
145
- moveFocus(index + 1);
146
- return;
147
- }
148
- if ("ArrowUp" === event.key) {
149
- event.preventDefault();
150
- moveFocus(index - 1);
151
- return;
152
- }
153
- if ("Home" === event.key) {
154
- event.preventDefault();
155
- moveFocus(0);
156
- return;
157
- }
158
- if ("End" === event.key) {
159
- event.preventDefault();
160
- moveFocus(total - 1);
161
- return;
162
- }
163
- if ("Enter" === event.key || " " === event.key) {
164
- event.preventDefault();
165
- onInsert(asset);
166
- }
167
- },
168
- ref: (node)=>{
169
- buttonRefs.current[index] = node;
170
- if (node && pendingFocusRef.current === index) {
171
- pendingFocusRef.current = null;
172
- node.focus();
173
- }
174
- },
175
- tabIndex: activeIndex === index ? 0 : -1,
176
- type: "button"
177
- }, /*#__PURE__*/ external_react_namespaceObject.createElement("span", null, asset.id), /*#__PURE__*/ external_react_namespaceObject.createElement("span", null, asset.meta?.mimeType ?? "unknown type")), void 0 !== onEdit ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
178
- "aria-label": `Edit asset ${asset.id}`,
179
- "data-asset-action": "edit",
180
- onClick: ()=>{
181
- onEdit(asset);
182
- },
183
- type: "button",
184
- variant: "ghost",
185
- size: "sm"
186
- }, "Edit") : null, void 0 !== onReplace ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
187
- "aria-label": `Replace asset ${asset.id}`,
188
- "data-asset-action": "replace",
189
- onClick: ()=>{
190
- onReplace(asset);
191
- },
192
- type: "button",
193
- variant: "ghost",
194
- size: "sm"
195
- }, "Replace") : null, void 0 !== onDelete ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
196
- "aria-label": `Delete asset ${asset.id}`,
197
- "data-asset-action": "delete",
198
- onClick: ()=>{
199
- onDelete(asset);
200
- },
201
- type: "button",
202
- variant: "ghost",
203
- size: "sm"
204
- }, "Delete") : null);
205
- const searchRow = searchEnabled ? /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
206
- "data-asset-manager-filters": true
207
- }, /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
208
- "aria-label": "Search assets",
209
- onChange: (event)=>{
210
- setQuery(event.target.value);
211
- setPageLimit(pageSize);
212
- },
213
- placeholder: "Search by name, tag, or MIME",
214
- value: query
215
- }), /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
216
- "aria-label": "Asset kind filters",
217
- role: "group"
218
- }, KIND_FILTERS.map((kind)=>{
219
- const active = activeKinds.includes(kind);
220
- return /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
221
- "aria-label": `Filter ${kind} assets`,
222
- "aria-pressed": active,
223
- "data-asset-kind-filter": kind,
224
- key: kind,
225
- onClick: ()=>{
226
- toggleKind(kind);
227
- setPageLimit(pageSize);
228
- },
229
- type: "button",
230
- variant: active ? "secondary" : "ghost",
231
- size: "sm"
232
- }, kind);
233
- }))) : null;
246
+ setExtraPages(0);
247
+ }, []);
248
+ const renderRow = external_react_namespaceObject.useCallback((asset, index)=>/*#__PURE__*/ external_react_namespaceObject.createElement(AssetBrowser_AssetRow, {
249
+ asset: asset,
250
+ draggableRows: draggableRows,
251
+ index: index,
252
+ isActive: effectiveActiveIndex === index,
253
+ onDelete: onDelete,
254
+ onEdit: onEdit,
255
+ onFocusRow: setActiveIndex,
256
+ onInsert: onInsert,
257
+ onMoveFocus: moveFocus,
258
+ onReplace: onReplace,
259
+ registerRow: registerRow,
260
+ total: total
261
+ }), [
262
+ draggableRows,
263
+ effectiveActiveIndex,
264
+ moveFocus,
265
+ onDelete,
266
+ onEdit,
267
+ onInsert,
268
+ onReplace,
269
+ registerRow,
270
+ total
271
+ ]);
272
+ const searchRow = searchEnabled ? /*#__PURE__*/ external_react_namespaceObject.createElement(AssetFilterRow, {
273
+ activeKinds: activeKinds,
274
+ onQueryChange: changeQuery,
275
+ onToggleKind: toggleKind,
276
+ query: query
277
+ }) : null;
234
278
  const filterRow = /*#__PURE__*/ external_react_namespaceObject.createElement(external_react_namespaceObject.Fragment, null, aboveFilters, searchRow);
235
279
  if (0 === total) {
236
- const emptyLabel = searchEnabled && ("" !== query || activeKinds.length > 0) ? "No assets match the current filters." : "No assets uploaded yet.";
237
- 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 browser"), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardDescription, null, "Validated assets currently registered in memory.")), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardContent, null, filterRow, /*#__PURE__*/ external_react_namespaceObject.createElement("ul", {
238
- "aria-label": "Assets",
239
- role: "list"
240
- }, /*#__PURE__*/ external_react_namespaceObject.createElement("li", {
241
- role: "listitem"
242
- }, emptyLabel))));
280
+ const emptyLabel = searchEnabled && ("" !== query || activeKinds.length > 0) ? msg("assetManager.browser.emptyFiltered") : msg("assetManager.browser.empty");
281
+ 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, msg("assetManager.browser.title")), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardDescription, null, msg("assetManager.browser.subtitle"))), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardContent, null, filterRow, /*#__PURE__*/ external_react_namespaceObject.createElement("ul", {
282
+ "aria-label": msg("assetManager.browser.assetsLabel")
283
+ }, /*#__PURE__*/ external_react_namespaceObject.createElement("li", null, emptyLabel))));
243
284
  }
244
- 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 browser"), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardDescription, null, "Validated assets currently registered in memory.")), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardContent, null, filterRow, /*#__PURE__*/ external_react_namespaceObject.createElement(windowed_namespaceObject.Windowed, {
245
- activeIndex: activeIndex >= 0 ? activeIndex : void 0,
246
- "aria-label": "Assets",
285
+ 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, msg("assetManager.browser.title")), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardDescription, null, msg("assetManager.browser.subtitle"))), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardContent, null, filterRow, /*#__PURE__*/ external_react_namespaceObject.createElement(windowed_namespaceObject.Windowed, {
286
+ activeIndex: effectiveActiveIndex >= 0 ? effectiveActiveIndex : void 0,
287
+ "aria-label": msg("assetManager.browser.assetsLabel"),
247
288
  as: "ul",
248
289
  "data-testid": "asset-browser-virtualized",
249
290
  estimateSize: itemHeight,
@@ -255,12 +296,12 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
255
296
  }), hasMore ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
256
297
  "data-asset-action": "load-more",
257
298
  onClick: ()=>{
258
- setPageLimit((current)=>current + pageSize);
299
+ setExtraPages((current)=>current + 1);
259
300
  },
260
301
  type: "button",
261
302
  variant: "outline",
262
303
  size: "sm"
263
- }, "Load more") : null));
304
+ }, msg("assetManager.button.loadMore")) : null));
264
305
  }
265
306
  exports.AssetBrowser = __webpack_exports__.AssetBrowser;
266
307
  for(var __rspack_i in __webpack_exports__)if (-1 === [
@@ -1 +1 @@
1
- {"version":3,"file":"AssetBrowser.d.cts","sourceRoot":"","sources":["../../src/ui/AssetBrowser.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAYjE,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAOD,wBAAgB,YAAY,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,MAAM,EACN,aAAqB,EACrB,YAAY,EACZ,aAAqB,EACrB,QAA4B,EAC5B,mBAAkD,EAClD,UAAgC,EAChC,SAA8B,GAC9B,EAAE,iBAAiB,2CAqUnB"}
1
+ {"version":3,"file":"AssetBrowser.d.cts","sourceRoot":"","sources":["../../src/ui/AssetBrowser.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAYjE,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAmOD,wBAAgB,YAAY,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,MAAM,EACN,aAAqB,EACrB,YAAY,EACZ,aAAqB,EACrB,QAA4B,EAC5B,mBAAkD,EAClD,UAAgC,EAChC,SAA8B,GAC9B,EAAE,iBAAiB,2CA8PnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssetBrowser.d.ts","sourceRoot":"","sources":["../../src/ui/AssetBrowser.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAYjE,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAOD,wBAAgB,YAAY,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,MAAM,EACN,aAAqB,EACrB,YAAY,EACZ,aAAqB,EACrB,QAA4B,EAC5B,mBAAkD,EAClD,UAAgC,EAChC,SAA8B,GAC9B,EAAE,iBAAiB,2CAqUnB"}
1
+ {"version":3,"file":"AssetBrowser.d.ts","sourceRoot":"","sources":["../../src/ui/AssetBrowser.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAYjE,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAmOD,wBAAgB,YAAY,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,MAAM,EACN,aAAqB,EACrB,YAAY,EACZ,aAAqB,EACrB,QAA4B,EAC5B,mBAAkD,EAClD,UAAgC,EAChC,SAA8B,GAC9B,EAAE,iBAAiB,2CA8PnB"}