@anvilkit/plugin-asset-manager 0.1.6 → 0.1.8

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 (251) hide show
  1. package/README.md +28 -20
  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/index.cjs +7 -0
  23. package/dist/index.d.cts +11 -3
  24. package/dist/index.d.cts.map +1 -1
  25. package/dist/index.d.ts +11 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -1
  28. package/dist/plugin.cjs +70 -5
  29. package/dist/plugin.d.cts +3 -2
  30. package/dist/plugin.d.cts.map +1 -1
  31. package/dist/plugin.d.ts +3 -2
  32. package/dist/plugin.d.ts.map +1 -1
  33. package/dist/plugin.js +70 -5
  34. package/dist/sources/composite-source.cjs +138 -0
  35. package/dist/sources/composite-source.d.cts +39 -0
  36. package/dist/sources/composite-source.d.cts.map +1 -0
  37. package/dist/sources/composite-source.d.ts +39 -0
  38. package/dist/sources/composite-source.d.ts.map +1 -0
  39. package/dist/sources/composite-source.js +100 -0
  40. package/dist/sources/federated-search.cjs +173 -0
  41. package/dist/sources/federated-search.d.cts +33 -0
  42. package/dist/sources/federated-search.d.cts.map +1 -0
  43. package/dist/sources/federated-search.d.ts +33 -0
  44. package/dist/sources/federated-search.d.ts.map +1 -0
  45. package/dist/sources/federated-search.js +123 -0
  46. package/dist/sources/provider.cjs +18 -0
  47. package/dist/sources/provider.d.cts +51 -0
  48. package/dist/sources/provider.d.cts.map +1 -0
  49. package/dist/sources/provider.d.ts +51 -0
  50. package/dist/sources/provider.d.ts.map +1 -0
  51. package/dist/sources/provider.js +1 -0
  52. package/dist/sources/unsplash/client.cjs +189 -0
  53. package/dist/sources/unsplash/client.d.cts +87 -0
  54. package/dist/sources/unsplash/client.d.cts.map +1 -0
  55. package/dist/sources/unsplash/client.d.ts +87 -0
  56. package/dist/sources/unsplash/client.d.ts.map +1 -0
  57. package/dist/sources/unsplash/client.js +151 -0
  58. package/dist/sources/unsplash/index.cjs +194 -0
  59. package/dist/sources/unsplash/index.d.cts +16 -0
  60. package/dist/sources/unsplash/index.d.cts.map +1 -0
  61. package/dist/sources/unsplash/index.d.ts +16 -0
  62. package/dist/sources/unsplash/index.d.ts.map +1 -0
  63. package/dist/sources/unsplash/index.js +150 -0
  64. package/dist/sources/unsplash/themes.cjs +141 -0
  65. package/dist/sources/unsplash/themes.d.cts +18 -0
  66. package/dist/sources/unsplash/themes.d.cts.map +1 -0
  67. package/dist/sources/unsplash/themes.d.ts +18 -0
  68. package/dist/sources/unsplash/themes.d.ts.map +1 -0
  69. package/dist/sources/unsplash/themes.js +93 -0
  70. package/dist/sources/unsplash/throttle-cache.cjs +86 -0
  71. package/dist/sources/unsplash/throttle-cache.d.cts +25 -0
  72. package/dist/sources/unsplash/throttle-cache.d.cts.map +1 -0
  73. package/dist/sources/unsplash/throttle-cache.d.ts +25 -0
  74. package/dist/sources/unsplash/throttle-cache.d.ts.map +1 -0
  75. package/dist/sources/unsplash/throttle-cache.js +45 -0
  76. package/dist/types/categories.cjs +18 -0
  77. package/dist/types/categories.d.cts +48 -0
  78. package/dist/types/categories.d.cts.map +1 -0
  79. package/dist/types/categories.d.ts +48 -0
  80. package/dist/types/categories.d.ts.map +1 -0
  81. package/dist/types/categories.js +1 -0
  82. package/dist/types/data-source.cjs +18 -0
  83. package/dist/types/data-source.d.cts +59 -0
  84. package/dist/types/data-source.d.cts.map +1 -0
  85. package/dist/types/data-source.d.ts +59 -0
  86. package/dist/types/data-source.d.ts.map +1 -0
  87. package/dist/types/data-source.js +1 -0
  88. package/dist/types/filter.cjs +18 -0
  89. package/dist/types/filter.d.cts +55 -0
  90. package/dist/types/filter.d.cts.map +1 -0
  91. package/dist/types/filter.d.ts +55 -0
  92. package/dist/types/filter.d.ts.map +1 -0
  93. package/dist/types/filter.js +1 -0
  94. package/dist/types/folders.cjs +42 -0
  95. package/dist/types/folders.d.cts +46 -0
  96. package/dist/types/folders.d.cts.map +1 -0
  97. package/dist/types/folders.d.ts +46 -0
  98. package/dist/types/folders.d.ts.map +1 -0
  99. package/dist/types/folders.js +4 -0
  100. package/dist/types/options.cjs +18 -0
  101. package/dist/types/options.d.cts +68 -0
  102. package/dist/types/options.d.cts.map +1 -0
  103. package/dist/types/options.d.ts +68 -0
  104. package/dist/types/options.d.ts.map +1 -0
  105. package/dist/types/options.js +1 -0
  106. package/dist/types/types.d.cts +21 -27
  107. package/dist/types/types.d.cts.map +1 -1
  108. package/dist/types/types.d.ts +21 -27
  109. package/dist/types/types.d.ts.map +1 -1
  110. package/dist/types/unsplash.cjs +18 -0
  111. package/dist/types/unsplash.d.cts +60 -0
  112. package/dist/types/unsplash.d.cts.map +1 -0
  113. package/dist/types/unsplash.d.ts +60 -0
  114. package/dist/types/unsplash.d.ts.map +1 -0
  115. package/dist/types/unsplash.js +1 -0
  116. package/dist/ui/AssetBrowser.cjs +183 -121
  117. package/dist/ui/AssetBrowser.d.cts +12 -1
  118. package/dist/ui/AssetBrowser.d.cts.map +1 -1
  119. package/dist/ui/AssetBrowser.d.ts +12 -1
  120. package/dist/ui/AssetBrowser.d.ts.map +1 -1
  121. package/dist/ui/AssetBrowser.js +183 -121
  122. package/dist/ui/AssetCommandPalette.cjs +20 -18
  123. package/dist/ui/AssetCommandPalette.d.cts.map +1 -1
  124. package/dist/ui/AssetCommandPalette.d.ts.map +1 -1
  125. package/dist/ui/AssetCommandPalette.js +20 -18
  126. package/dist/ui/AssetManagerUI.cjs +31 -17
  127. package/dist/ui/AssetManagerUI.d.cts +19 -3
  128. package/dist/ui/AssetManagerUI.d.cts.map +1 -1
  129. package/dist/ui/AssetManagerUI.d.ts +19 -3
  130. package/dist/ui/AssetManagerUI.d.ts.map +1 -1
  131. package/dist/ui/AssetManagerUI.js +31 -17
  132. package/dist/ui/DeleteAssetDialog.cjs +5 -3
  133. package/dist/ui/DeleteAssetDialog.d.cts.map +1 -1
  134. package/dist/ui/DeleteAssetDialog.d.ts.map +1 -1
  135. package/dist/ui/DeleteAssetDialog.js +5 -3
  136. package/dist/ui/DeleteFolderDialog.cjs +80 -0
  137. package/dist/ui/DeleteFolderDialog.d.cts +11 -0
  138. package/dist/ui/DeleteFolderDialog.d.cts.map +1 -0
  139. package/dist/ui/DeleteFolderDialog.d.ts +11 -0
  140. package/dist/ui/DeleteFolderDialog.d.ts.map +1 -0
  141. package/dist/ui/DeleteFolderDialog.js +42 -0
  142. package/dist/ui/EmptyFolderState.cjs +56 -0
  143. package/dist/ui/EmptyFolderState.d.cts +6 -0
  144. package/dist/ui/EmptyFolderState.d.cts.map +1 -0
  145. package/dist/ui/EmptyFolderState.d.ts +6 -0
  146. package/dist/ui/EmptyFolderState.d.ts.map +1 -0
  147. package/dist/ui/EmptyFolderState.js +18 -0
  148. package/dist/ui/FolderBreadcrumb.cjs +76 -0
  149. package/dist/ui/FolderBreadcrumb.d.cts +9 -0
  150. package/dist/ui/FolderBreadcrumb.d.cts.map +1 -0
  151. package/dist/ui/FolderBreadcrumb.d.ts +9 -0
  152. package/dist/ui/FolderBreadcrumb.d.ts.map +1 -0
  153. package/dist/ui/FolderBreadcrumb.js +38 -0
  154. package/dist/ui/FolderNameDialog.cjs +105 -0
  155. package/dist/ui/FolderNameDialog.d.cts +14 -0
  156. package/dist/ui/FolderNameDialog.d.cts.map +1 -0
  157. package/dist/ui/FolderNameDialog.d.ts +14 -0
  158. package/dist/ui/FolderNameDialog.d.ts.map +1 -0
  159. package/dist/ui/FolderNameDialog.js +67 -0
  160. package/dist/ui/FolderTree.cjs +85 -0
  161. package/dist/ui/FolderTree.d.cts +13 -0
  162. package/dist/ui/FolderTree.d.cts.map +1 -0
  163. package/dist/ui/FolderTree.d.ts +13 -0
  164. package/dist/ui/FolderTree.d.ts.map +1 -0
  165. package/dist/ui/FolderTree.js +44 -0
  166. package/dist/ui/MetadataPanel.cjs +23 -17
  167. package/dist/ui/MetadataPanel.d.cts.map +1 -1
  168. package/dist/ui/MetadataPanel.d.ts.map +1 -1
  169. package/dist/ui/MetadataPanel.js +23 -17
  170. package/dist/ui/MoveTargetPicker.cjs +87 -0
  171. package/dist/ui/MoveTargetPicker.d.cts +16 -0
  172. package/dist/ui/MoveTargetPicker.d.cts.map +1 -0
  173. package/dist/ui/MoveTargetPicker.d.ts +16 -0
  174. package/dist/ui/MoveTargetPicker.d.ts.map +1 -0
  175. package/dist/ui/MoveTargetPicker.js +49 -0
  176. package/dist/ui/ReplaceAssetDialog.cjs +19 -17
  177. package/dist/ui/ReplaceAssetDialog.d.cts +2 -1
  178. package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -1
  179. package/dist/ui/ReplaceAssetDialog.d.ts +2 -1
  180. package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -1
  181. package/dist/ui/ReplaceAssetDialog.js +19 -17
  182. package/dist/ui/UnsplashPanel.cjs +137 -0
  183. package/dist/ui/UnsplashPanel.d.cts +28 -0
  184. package/dist/ui/UnsplashPanel.d.cts.map +1 -0
  185. package/dist/ui/UnsplashPanel.d.ts +28 -0
  186. package/dist/ui/UnsplashPanel.d.ts.map +1 -0
  187. package/dist/ui/UnsplashPanel.js +99 -0
  188. package/dist/ui/UploadButton.cjs +12 -13
  189. package/dist/ui/UploadButton.d.cts +9 -2
  190. package/dist/ui/UploadButton.d.cts.map +1 -1
  191. package/dist/ui/UploadButton.d.ts +9 -2
  192. package/dist/ui/UploadButton.d.ts.map +1 -1
  193. package/dist/ui/UploadButton.js +12 -13
  194. package/dist/ui/index.cjs +41 -0
  195. package/dist/ui/index.d.cts +15 -0
  196. package/dist/ui/index.d.cts.map +1 -1
  197. package/dist/ui/index.d.ts +15 -0
  198. package/dist/ui/index.d.ts.map +1 -1
  199. package/dist/ui/index.js +8 -0
  200. package/dist/utils/data-source.cjs +190 -0
  201. package/dist/utils/data-source.d.cts +63 -0
  202. package/dist/utils/data-source.d.cts.map +1 -0
  203. package/dist/utils/data-source.d.ts +63 -0
  204. package/dist/utils/data-source.d.ts.map +1 -0
  205. package/dist/utils/data-source.js +149 -0
  206. package/dist/utils/errors.cjs +18 -0
  207. package/dist/utils/errors.d.cts +27 -0
  208. package/dist/utils/errors.d.cts.map +1 -1
  209. package/dist/utils/errors.d.ts +27 -0
  210. package/dist/utils/errors.d.ts.map +1 -1
  211. package/dist/utils/errors.js +16 -1
  212. package/dist/utils/folders.cjs +335 -0
  213. package/dist/utils/folders.d.cts +54 -0
  214. package/dist/utils/folders.d.cts.map +1 -0
  215. package/dist/utils/folders.d.ts +54 -0
  216. package/dist/utils/folders.d.ts.map +1 -0
  217. package/dist/utils/folders.js +297 -0
  218. package/dist/utils/header-action.cjs +1 -1
  219. package/dist/utils/header-action.d.cts.map +1 -1
  220. package/dist/utils/header-action.d.ts.map +1 -1
  221. package/dist/utils/header-action.js +1 -1
  222. package/dist/utils/registry.cjs +38 -12
  223. package/dist/utils/registry.d.cts +29 -1
  224. package/dist/utils/registry.d.cts.map +1 -1
  225. package/dist/utils/registry.d.ts +29 -1
  226. package/dist/utils/registry.d.ts.map +1 -1
  227. package/dist/utils/registry.js +31 -11
  228. package/dist/utils/resolver.cjs +5 -4
  229. package/dist/utils/resolver.d.cts.map +1 -1
  230. package/dist/utils/resolver.d.ts.map +1 -1
  231. package/dist/utils/resolver.js +5 -4
  232. package/dist/utils/studio-asset-source.cjs +13 -4
  233. package/dist/utils/studio-asset-source.d.cts +6 -1
  234. package/dist/utils/studio-asset-source.d.cts.map +1 -1
  235. package/dist/utils/studio-asset-source.d.ts +6 -1
  236. package/dist/utils/studio-asset-source.d.ts.map +1 -1
  237. package/dist/utils/studio-asset-source.js +9 -3
  238. package/dist/utils/validate-upload-result.d.cts +2 -1
  239. package/dist/utils/validate-upload-result.d.cts.map +1 -1
  240. package/dist/utils/validate-upload-result.d.ts +2 -1
  241. package/dist/utils/validate-upload-result.d.ts.map +1 -1
  242. package/dist/version.cjs +1 -1
  243. package/dist/version.d.cts +1 -1
  244. package/dist/version.d.ts +1 -1
  245. package/dist/version.js +1 -1
  246. package/i18n/messages/en.json +99 -0
  247. package/i18n/messages/ja.json +99 -0
  248. package/i18n/messages/ko.json +99 -0
  249. package/i18n/messages/zh.json +99 -0
  250. package/meta/config.json +1 -1
  251. package/package.json +19 -8
@@ -1,8 +1,11 @@
1
1
  "use client";
2
+ import { useMsg } from "@anvilkit/core/i18n";
3
+ import { Button } from "@anvilkit/ui/button";
2
4
  import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@anvilkit/ui/card";
3
5
  import { Input } from "@anvilkit/ui/input";
4
6
  import { Windowed } from "@anvilkit/ui/windowed";
5
7
  import { inferAssetKind } from "../utils/infer-kind.js";
8
+ import { ASSET_DRAG_MIME } from "./FolderTree.js";
6
9
  import * as __rspack_external_react from "react";
7
10
  const KIND_FILTERS = [
8
11
  "image",
@@ -15,11 +18,121 @@ const DEFAULT_VIRTUALIZE_THRESHOLD = 50;
15
18
  const DEFAULT_ITEM_HEIGHT = 56;
16
19
  const DEFAULT_MAX_HEIGHT = 400;
17
20
  const DEFAULT_PAGE_SIZE = 100;
18
- function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEnabled = false, pageSize = DEFAULT_PAGE_SIZE, virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD, itemHeight = DEFAULT_ITEM_HEIGHT, maxHeight = DEFAULT_MAX_HEIGHT }) {
21
+ function AssetFilterRow({ query, onQueryChange, activeKinds, onToggleKind }) {
22
+ const msg = useMsg();
23
+ return /*#__PURE__*/ __rspack_external_react.createElement("div", {
24
+ "data-asset-manager-filters": true
25
+ }, /*#__PURE__*/ __rspack_external_react.createElement(Input, {
26
+ "aria-label": msg("assetManager.browser.searchLabel"),
27
+ onChange: (event)=>{
28
+ onQueryChange(event.target.value);
29
+ },
30
+ placeholder: msg("assetManager.browser.searchPlaceholder"),
31
+ value: query
32
+ }), /*#__PURE__*/ __rspack_external_react.createElement("div", {
33
+ "aria-label": msg("assetManager.browser.filterLabel"),
34
+ role: "group"
35
+ }, KIND_FILTERS.map((kind)=>{
36
+ const active = activeKinds.includes(kind);
37
+ return /*#__PURE__*/ __rspack_external_react.createElement(Button, {
38
+ "aria-label": msg("assetManager.browser.filterByKind").replace("{kind}", kind),
39
+ "aria-pressed": active,
40
+ "data-asset-kind-filter": kind,
41
+ key: kind,
42
+ onClick: ()=>{
43
+ onToggleKind(kind);
44
+ },
45
+ type: "button",
46
+ variant: active ? "secondary" : "ghost",
47
+ size: "sm"
48
+ }, msg(`assetManager.kind.${kind}`));
49
+ })));
50
+ }
51
+ const AssetBrowser_AssetRow = /*#__PURE__*/ __rspack_external_react.memo(function({ asset, index, isActive, total, draggableRows, onInsert, onEdit, onReplace, onDelete, onFocusRow, onMoveFocus, registerRow }) {
52
+ const msg = useMsg();
53
+ return /*#__PURE__*/ __rspack_external_react.createElement(__rspack_external_react.Fragment, null, /*#__PURE__*/ __rspack_external_react.createElement("button", {
54
+ "aria-label": msg("assetManager.browser.insert").replace("{id}", asset.id),
55
+ draggable: draggableRows,
56
+ "data-asset-draggable": draggableRows ? "" : void 0,
57
+ onDragStart: draggableRows ? (event)=>{
58
+ event.dataTransfer.setData(ASSET_DRAG_MIME, JSON.stringify([
59
+ asset.id
60
+ ]));
61
+ event.dataTransfer.effectAllowed = "move";
62
+ } : void 0,
63
+ onClick: ()=>{
64
+ onInsert(asset);
65
+ },
66
+ onFocus: ()=>{
67
+ onFocusRow(index);
68
+ },
69
+ onKeyDown: (event)=>{
70
+ if ("ArrowDown" === event.key) {
71
+ event.preventDefault();
72
+ onMoveFocus(index + 1);
73
+ return;
74
+ }
75
+ if ("ArrowUp" === event.key) {
76
+ event.preventDefault();
77
+ onMoveFocus(index - 1);
78
+ return;
79
+ }
80
+ if ("Home" === event.key) {
81
+ event.preventDefault();
82
+ onMoveFocus(0);
83
+ return;
84
+ }
85
+ if ("End" === event.key) {
86
+ event.preventDefault();
87
+ onMoveFocus(total - 1);
88
+ return;
89
+ }
90
+ if ("Enter" === event.key || " " === event.key) {
91
+ event.preventDefault();
92
+ onInsert(asset);
93
+ }
94
+ },
95
+ ref: (node)=>{
96
+ registerRow(index, node);
97
+ },
98
+ tabIndex: isActive ? 0 : -1,
99
+ type: "button"
100
+ }, /*#__PURE__*/ __rspack_external_react.createElement("span", null, asset.id), /*#__PURE__*/ __rspack_external_react.createElement("span", null, asset.meta?.mimeType ?? msg("assetManager.browser.unknownMime"))), void 0 !== onEdit ? /*#__PURE__*/ __rspack_external_react.createElement(Button, {
101
+ "aria-label": msg("assetManager.browser.edit").replace("{id}", asset.id),
102
+ "data-asset-action": "edit",
103
+ onClick: ()=>{
104
+ onEdit(asset);
105
+ },
106
+ type: "button",
107
+ variant: "ghost",
108
+ size: "sm"
109
+ }, msg("assetManager.button.edit")) : null, void 0 !== onReplace ? /*#__PURE__*/ __rspack_external_react.createElement(Button, {
110
+ "aria-label": msg("assetManager.browser.replace").replace("{id}", asset.id),
111
+ "data-asset-action": "replace",
112
+ onClick: ()=>{
113
+ onReplace(asset);
114
+ },
115
+ type: "button",
116
+ variant: "ghost",
117
+ size: "sm"
118
+ }, msg("assetManager.button.replace")) : null, void 0 !== onDelete ? /*#__PURE__*/ __rspack_external_react.createElement(Button, {
119
+ "aria-label": msg("assetManager.browser.delete").replace("{id}", asset.id),
120
+ "data-asset-action": "delete",
121
+ onClick: ()=>{
122
+ onDelete(asset);
123
+ },
124
+ type: "button",
125
+ variant: "ghost",
126
+ size: "sm"
127
+ }, msg("assetManager.button.delete")) : null);
128
+ });
129
+ 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 }) {
130
+ const msg = useMsg();
19
131
  const [activeIndex, setActiveIndex] = __rspack_external_react.useState(assets.length > 0 ? 0 : -1);
20
132
  const [query, setQuery] = __rspack_external_react.useState("");
21
133
  const [activeKinds, setActiveKinds] = __rspack_external_react.useState([]);
22
- const [pageLimit, setPageLimit] = __rspack_external_react.useState(pageSize);
134
+ const [extraPages, setExtraPages] = __rspack_external_react.useState(0);
135
+ const pageLimit = pageSize * (extraPages + 1);
23
136
  const buttonRefs = __rspack_external_react.useRef([]);
24
137
  const pendingFocusRef = __rspack_external_react.useRef(null);
25
138
  const searchIndex = __rspack_external_react.useMemo(()=>{
@@ -43,8 +156,9 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
43
156
  const lower = query.trim().toLowerCase();
44
157
  const hasKindFilter = activeKinds.length > 0;
45
158
  if ("" === lower && !hasKindFilter) return assets;
159
+ const activeKindSet = hasKindFilter ? new Set(activeKinds) : null;
46
160
  const result = [];
47
- for (const entry of searchIndex)if (!hasKindFilter || activeKinds.includes(entry.kind)) {
161
+ for (const entry of searchIndex)if (!activeKindSet || activeKindSet.has(entry.kind)) {
48
162
  if ("" === lower || entry.haystack.includes(lower)) result.push(entry.asset);
49
163
  }
50
164
  return result;
@@ -62,137 +176,83 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
62
176
  ]);
63
177
  const total = visibleSlice.length;
64
178
  const hasMore = searchEnabled && filteredAssets.length > visibleSlice.length;
65
- __rspack_external_react.useEffect(()=>{
66
- if (0 === total) return void setActiveIndex(-1);
67
- setActiveIndex((currentIndex)=>currentIndex >= 0 && currentIndex < total ? currentIndex : 0);
68
- }, [
69
- total
70
- ]);
71
- function focusRow(index) {
179
+ const effectiveActiveIndex = 0 === total ? -1 : activeIndex >= 0 && activeIndex < total ? activeIndex : 0;
180
+ const focusRow = __rspack_external_react.useCallback((index)=>{
72
181
  const node = buttonRefs.current[index];
73
182
  if (node) {
74
183
  node.focus();
75
184
  return true;
76
185
  }
77
186
  return false;
78
- }
79
- function moveFocus(nextIndex) {
187
+ }, []);
188
+ const moveFocus = __rspack_external_react.useCallback((nextIndex)=>{
80
189
  if (0 === total) return;
81
190
  const clampedIndex = Math.max(0, Math.min(nextIndex, total - 1));
82
191
  pendingFocusRef.current = clampedIndex;
83
192
  setActiveIndex(clampedIndex);
84
193
  if (focusRow(clampedIndex)) pendingFocusRef.current = null;
85
- }
86
- function toggleKind(kind) {
194
+ }, [
195
+ total,
196
+ focusRow
197
+ ]);
198
+ const registerRow = __rspack_external_react.useCallback((index, node)=>{
199
+ buttonRefs.current[index] = node;
200
+ if (node && pendingFocusRef.current === index) {
201
+ pendingFocusRef.current = null;
202
+ node.focus();
203
+ }
204
+ }, []);
205
+ const changeQuery = __rspack_external_react.useCallback((value)=>{
206
+ setQuery(value);
207
+ setExtraPages(0);
208
+ }, []);
209
+ const toggleKind = __rspack_external_react.useCallback((kind)=>{
87
210
  setActiveKinds((current)=>current.includes(kind) ? current.filter((entry)=>entry !== kind) : [
88
211
  ...current,
89
212
  kind
90
213
  ]);
91
- }
92
- const renderRow = (asset, index)=>/*#__PURE__*/ __rspack_external_react.createElement(__rspack_external_react.Fragment, null, /*#__PURE__*/ __rspack_external_react.createElement("button", {
93
- "aria-label": `Insert asset ${asset.id}`,
94
- onClick: ()=>{
95
- onInsert(asset);
96
- },
97
- onFocus: ()=>{
98
- setActiveIndex(index);
99
- },
100
- onKeyDown: (event)=>{
101
- if ("ArrowDown" === event.key) {
102
- event.preventDefault();
103
- moveFocus(index + 1);
104
- return;
105
- }
106
- if ("ArrowUp" === event.key) {
107
- event.preventDefault();
108
- moveFocus(index - 1);
109
- return;
110
- }
111
- if ("Home" === event.key) {
112
- event.preventDefault();
113
- moveFocus(0);
114
- return;
115
- }
116
- if ("End" === event.key) {
117
- event.preventDefault();
118
- moveFocus(total - 1);
119
- return;
120
- }
121
- if ("Enter" === event.key || " " === event.key) {
122
- event.preventDefault();
123
- onInsert(asset);
124
- }
125
- },
126
- ref: (node)=>{
127
- buttonRefs.current[index] = node;
128
- if (node && pendingFocusRef.current === index) {
129
- pendingFocusRef.current = null;
130
- node.focus();
131
- }
132
- },
133
- tabIndex: activeIndex === index ? 0 : -1,
134
- type: "button"
135
- }, /*#__PURE__*/ __rspack_external_react.createElement("span", null, asset.id), /*#__PURE__*/ __rspack_external_react.createElement("span", null, asset.meta?.mimeType ?? "unknown type")), void 0 !== onEdit ? /*#__PURE__*/ __rspack_external_react.createElement("button", {
136
- "aria-label": `Edit asset ${asset.id}`,
137
- "data-asset-action": "edit",
138
- onClick: ()=>{
139
- onEdit(asset);
140
- },
141
- type: "button"
142
- }, "Edit") : null, void 0 !== onReplace ? /*#__PURE__*/ __rspack_external_react.createElement("button", {
143
- "aria-label": `Replace asset ${asset.id}`,
144
- "data-asset-action": "replace",
145
- onClick: ()=>{
146
- onReplace(asset);
147
- },
148
- type: "button"
149
- }, "Replace") : null, void 0 !== onDelete ? /*#__PURE__*/ __rspack_external_react.createElement("button", {
150
- "aria-label": `Delete asset ${asset.id}`,
151
- "data-asset-action": "delete",
152
- onClick: ()=>{
153
- onDelete(asset);
154
- },
155
- type: "button"
156
- }, "Delete") : null);
157
- const filterRow = searchEnabled ? /*#__PURE__*/ __rspack_external_react.createElement("div", {
158
- "data-asset-manager-filters": true
159
- }, /*#__PURE__*/ __rspack_external_react.createElement(Input, {
160
- "aria-label": "Search assets",
161
- onChange: (event)=>{
162
- setQuery(event.target.value);
163
- setPageLimit(pageSize);
164
- },
165
- placeholder: "Search by name, tag, or MIME",
166
- value: query
167
- }), /*#__PURE__*/ __rspack_external_react.createElement("div", {
168
- "aria-label": "Asset kind filters",
169
- role: "group"
170
- }, KIND_FILTERS.map((kind)=>{
171
- const active = activeKinds.includes(kind);
172
- return /*#__PURE__*/ __rspack_external_react.createElement("button", {
173
- "aria-label": `Filter ${kind} assets`,
174
- "aria-pressed": active,
175
- "data-asset-kind-filter": kind,
176
- key: kind,
177
- onClick: ()=>{
178
- toggleKind(kind);
179
- setPageLimit(pageSize);
180
- },
181
- type: "button"
182
- }, kind);
183
- }))) : null;
214
+ setExtraPages(0);
215
+ }, []);
216
+ const renderRow = __rspack_external_react.useCallback((asset, index)=>/*#__PURE__*/ __rspack_external_react.createElement(AssetBrowser_AssetRow, {
217
+ asset: asset,
218
+ draggableRows: draggableRows,
219
+ index: index,
220
+ isActive: effectiveActiveIndex === index,
221
+ onDelete: onDelete,
222
+ onEdit: onEdit,
223
+ onFocusRow: setActiveIndex,
224
+ onInsert: onInsert,
225
+ onMoveFocus: moveFocus,
226
+ onReplace: onReplace,
227
+ registerRow: registerRow,
228
+ total: total
229
+ }), [
230
+ draggableRows,
231
+ effectiveActiveIndex,
232
+ moveFocus,
233
+ onDelete,
234
+ onEdit,
235
+ onInsert,
236
+ onReplace,
237
+ registerRow,
238
+ total
239
+ ]);
240
+ const searchRow = searchEnabled ? /*#__PURE__*/ __rspack_external_react.createElement(AssetFilterRow, {
241
+ activeKinds: activeKinds,
242
+ onQueryChange: changeQuery,
243
+ onToggleKind: toggleKind,
244
+ query: query
245
+ }) : null;
246
+ const filterRow = /*#__PURE__*/ __rspack_external_react.createElement(__rspack_external_react.Fragment, null, aboveFilters, searchRow);
184
247
  if (0 === total) {
185
- const emptyLabel = searchEnabled && ("" !== query || activeKinds.length > 0) ? "No assets match the current filters." : "No assets uploaded yet.";
186
- return /*#__PURE__*/ __rspack_external_react.createElement(Card, null, /*#__PURE__*/ __rspack_external_react.createElement(CardHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(CardTitle, null, "Asset browser"), /*#__PURE__*/ __rspack_external_react.createElement(CardDescription, null, "Validated assets currently registered in memory.")), /*#__PURE__*/ __rspack_external_react.createElement(CardContent, null, filterRow, /*#__PURE__*/ __rspack_external_react.createElement("ul", {
187
- "aria-label": "Assets",
188
- role: "list"
189
- }, /*#__PURE__*/ __rspack_external_react.createElement("li", {
190
- role: "listitem"
191
- }, emptyLabel))));
248
+ const emptyLabel = searchEnabled && ("" !== query || activeKinds.length > 0) ? msg("assetManager.browser.emptyFiltered") : msg("assetManager.browser.empty");
249
+ return /*#__PURE__*/ __rspack_external_react.createElement(Card, null, /*#__PURE__*/ __rspack_external_react.createElement(CardHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(CardTitle, null, msg("assetManager.browser.title")), /*#__PURE__*/ __rspack_external_react.createElement(CardDescription, null, msg("assetManager.browser.subtitle"))), /*#__PURE__*/ __rspack_external_react.createElement(CardContent, null, filterRow, /*#__PURE__*/ __rspack_external_react.createElement("ul", {
250
+ "aria-label": msg("assetManager.browser.assetsLabel")
251
+ }, /*#__PURE__*/ __rspack_external_react.createElement("li", null, emptyLabel))));
192
252
  }
193
- return /*#__PURE__*/ __rspack_external_react.createElement(Card, null, /*#__PURE__*/ __rspack_external_react.createElement(CardHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(CardTitle, null, "Asset browser"), /*#__PURE__*/ __rspack_external_react.createElement(CardDescription, null, "Validated assets currently registered in memory.")), /*#__PURE__*/ __rspack_external_react.createElement(CardContent, null, filterRow, /*#__PURE__*/ __rspack_external_react.createElement(Windowed, {
194
- activeIndex: activeIndex >= 0 ? activeIndex : void 0,
195
- "aria-label": "Assets",
253
+ return /*#__PURE__*/ __rspack_external_react.createElement(Card, null, /*#__PURE__*/ __rspack_external_react.createElement(CardHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(CardTitle, null, msg("assetManager.browser.title")), /*#__PURE__*/ __rspack_external_react.createElement(CardDescription, null, msg("assetManager.browser.subtitle"))), /*#__PURE__*/ __rspack_external_react.createElement(CardContent, null, filterRow, /*#__PURE__*/ __rspack_external_react.createElement(Windowed, {
254
+ activeIndex: effectiveActiveIndex >= 0 ? effectiveActiveIndex : void 0,
255
+ "aria-label": msg("assetManager.browser.assetsLabel"),
196
256
  as: "ul",
197
257
  "data-testid": "asset-browser-virtualized",
198
258
  estimateSize: itemHeight,
@@ -201,12 +261,14 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
201
261
  maxHeight: maxHeight,
202
262
  renderItem: renderRow,
203
263
  threshold: virtualizeThreshold
204
- }), hasMore ? /*#__PURE__*/ __rspack_external_react.createElement("button", {
264
+ }), hasMore ? /*#__PURE__*/ __rspack_external_react.createElement(Button, {
205
265
  "data-asset-action": "load-more",
206
266
  onClick: ()=>{
207
- setPageLimit((current)=>current + pageSize);
267
+ setExtraPages((current)=>current + 1);
208
268
  },
209
- type: "button"
210
- }, "Load more") : null));
269
+ type: "button",
270
+ variant: "outline",
271
+ size: "sm"
272
+ }, msg("assetManager.button.loadMore")) : null));
211
273
  }
212
274
  export { AssetBrowser };
@@ -31,12 +31,14 @@ __webpack_require__.r(__webpack_exports__);
31
31
  __webpack_require__.d(__webpack_exports__, {
32
32
  AssetCommandPalette: ()=>AssetCommandPalette
33
33
  });
34
+ const i18n_namespaceObject = require("@anvilkit/core/i18n");
34
35
  const dialog_namespaceObject = require("@anvilkit/ui/dialog");
35
36
  const input_namespaceObject = require("@anvilkit/ui/input");
36
37
  const external_react_namespaceObject = require("react");
37
38
  const infer_kind_cjs_namespaceObject = require("../utils/infer-kind.cjs");
38
39
  const DEFAULT_MAX_RESULTS = 20;
39
40
  function AssetCommandPalette({ registry, open, onOpenChange, onSelect, maxResults = DEFAULT_MAX_RESULTS }) {
41
+ const msg = (0, i18n_namespaceObject.useMsg)();
40
42
  const [query, setQuery] = external_react_namespaceObject.useState("");
41
43
  const [results, setResults] = external_react_namespaceObject.useState([]);
42
44
  const [activeIndex, setActiveIndex] = external_react_namespaceObject.useState(0);
@@ -53,17 +55,21 @@ function AssetCommandPalette({ registry, open, onOpenChange, onSelect, maxResult
53
55
  registry,
54
56
  maxResults
55
57
  ]);
56
- const queryRef = external_react_namespaceObject.useRef(query);
57
- queryRef.current = query;
58
+ const onRegistryChange = external_react_namespaceObject.useEffectEvent(()=>{
59
+ refresh(query);
60
+ });
58
61
  external_react_namespaceObject.useEffect(()=>{
59
62
  if (!open) return;
60
- setQuery("");
61
63
  queueMicrotask(()=>{
62
64
  inputRef.current?.focus();
63
65
  });
64
66
  }, [
65
67
  open
66
68
  ]);
69
+ function emitOpenChange(nextOpen) {
70
+ if (!nextOpen) setQuery("");
71
+ onOpenChange(nextOpen);
72
+ }
67
73
  external_react_namespaceObject.useEffect(()=>{
68
74
  if (!open) return;
69
75
  refresh(query);
@@ -74,14 +80,10 @@ function AssetCommandPalette({ registry, open, onOpenChange, onSelect, maxResult
74
80
  ]);
75
81
  external_react_namespaceObject.useEffect(()=>{
76
82
  if (!open) return;
77
- const unsubscribe = registry.subscribe(()=>{
78
- refresh(queryRef.current);
79
- });
80
- return unsubscribe;
83
+ return registry.subscribe(onRegistryChange);
81
84
  }, [
82
85
  open,
83
- registry,
84
- refresh
86
+ registry
85
87
  ]);
86
88
  function handleKeyDown(event) {
87
89
  if ("ArrowDown" === event.key) {
@@ -99,39 +101,39 @@ function AssetCommandPalette({ registry, open, onOpenChange, onSelect, maxResult
99
101
  const picked = results[activeIndex];
100
102
  if (void 0 !== picked) {
101
103
  onSelect(picked);
102
- onOpenChange(false);
104
+ emitOpenChange(false);
103
105
  }
104
106
  }
105
107
  }
106
108
  return /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.Dialog, {
107
109
  open: open,
108
- onOpenChange: onOpenChange
109
- }, /*#__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, "Find an asset"), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogDescription, null, "Search by name, id, MIME type, or tag.")), /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
110
- "aria-label": "Asset search query",
110
+ onOpenChange: emitOpenChange
111
+ }, /*#__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, msg("assetManager.palette.title")), /*#__PURE__*/ external_react_namespaceObject.createElement(dialog_namespaceObject.DialogDescription, null, msg("assetManager.palette.subtitle"))), /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
112
+ "aria-label": msg("assetManager.palette.searchLabel"),
111
113
  onChange: (event)=>{
112
114
  setQuery(event.target.value);
113
115
  },
114
116
  onKeyDown: handleKeyDown,
115
- placeholder: "Type to search…",
117
+ placeholder: msg("assetManager.palette.searchPlaceholder"),
116
118
  ref: inputRef,
117
119
  value: query
118
120
  }), /*#__PURE__*/ external_react_namespaceObject.createElement("ul", {
119
- "aria-label": "Asset results",
121
+ "aria-label": msg("assetManager.palette.resultsLabel"),
120
122
  "data-asset-manager-palette-results": true,
121
123
  ref: listRef,
122
124
  role: "listbox"
123
125
  }, 0 === results.length ? /*#__PURE__*/ external_react_namespaceObject.createElement("li", {
124
126
  role: "presentation"
125
- }, "No matches.") : results.map((asset, index)=>/*#__PURE__*/ external_react_namespaceObject.createElement("li", {
127
+ }, msg("assetManager.palette.noMatches")) : results.map((asset, index)=>/*#__PURE__*/ external_react_namespaceObject.createElement("li", {
126
128
  "aria-selected": index === activeIndex,
127
129
  key: asset.id,
128
130
  role: "option"
129
131
  }, /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
130
- "aria-label": `Insert asset ${asset.id}`,
132
+ "aria-label": msg("assetManager.browser.insert").replace("{id}", asset.id),
131
133
  "data-active": index === activeIndex ? "true" : void 0,
132
134
  onClick: ()=>{
133
135
  onSelect(asset);
134
- onOpenChange(false);
136
+ emitOpenChange(false);
135
137
  },
136
138
  onMouseEnter: ()=>{
137
139
  setActiveIndex(index);
@@ -1 +1 @@
1
- {"version":3,"file":"AssetCommandPalette.d.cts","sourceRoot":"","sources":["../../src/ui/AssetCommandPalette.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGrE,MAAM,WAAW,wBAAwB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,wBAAgB,mBAAmB,CAAC,EACnC,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,UAAgC,GAChC,EAAE,wBAAwB,2CAiI1B"}
1
+ {"version":3,"file":"AssetCommandPalette.d.cts","sourceRoot":"","sources":["../../src/ui/AssetCommandPalette.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGrE,MAAM,WAAW,wBAAwB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,wBAAgB,mBAAmB,CAAC,EACnC,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,UAAgC,GAChC,EAAE,wBAAwB,2CA6I1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssetCommandPalette.d.ts","sourceRoot":"","sources":["../../src/ui/AssetCommandPalette.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGrE,MAAM,WAAW,wBAAwB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,wBAAgB,mBAAmB,CAAC,EACnC,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,UAAgC,GAChC,EAAE,wBAAwB,2CAiI1B"}
1
+ {"version":3,"file":"AssetCommandPalette.d.ts","sourceRoot":"","sources":["../../src/ui/AssetCommandPalette.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGrE,MAAM,WAAW,wBAAwB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,wBAAgB,mBAAmB,CAAC,EACnC,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,UAAgC,GAChC,EAAE,wBAAwB,2CA6I1B"}
@@ -1,10 +1,12 @@
1
1
  "use client";
2
+ import { useMsg } from "@anvilkit/core/i18n";
2
3
  import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@anvilkit/ui/dialog";
3
4
  import { Input } from "@anvilkit/ui/input";
4
5
  import { inferAssetKind } from "../utils/infer-kind.js";
5
6
  import * as __rspack_external_react from "react";
6
7
  const DEFAULT_MAX_RESULTS = 20;
7
8
  function AssetCommandPalette({ registry, open, onOpenChange, onSelect, maxResults = DEFAULT_MAX_RESULTS }) {
9
+ const msg = useMsg();
8
10
  const [query, setQuery] = __rspack_external_react.useState("");
9
11
  const [results, setResults] = __rspack_external_react.useState([]);
10
12
  const [activeIndex, setActiveIndex] = __rspack_external_react.useState(0);
@@ -21,17 +23,21 @@ function AssetCommandPalette({ registry, open, onOpenChange, onSelect, maxResult
21
23
  registry,
22
24
  maxResults
23
25
  ]);
24
- const queryRef = __rspack_external_react.useRef(query);
25
- queryRef.current = query;
26
+ const onRegistryChange = __rspack_external_react.useEffectEvent(()=>{
27
+ refresh(query);
28
+ });
26
29
  __rspack_external_react.useEffect(()=>{
27
30
  if (!open) return;
28
- setQuery("");
29
31
  queueMicrotask(()=>{
30
32
  inputRef.current?.focus();
31
33
  });
32
34
  }, [
33
35
  open
34
36
  ]);
37
+ function emitOpenChange(nextOpen) {
38
+ if (!nextOpen) setQuery("");
39
+ onOpenChange(nextOpen);
40
+ }
35
41
  __rspack_external_react.useEffect(()=>{
36
42
  if (!open) return;
37
43
  refresh(query);
@@ -42,14 +48,10 @@ function AssetCommandPalette({ registry, open, onOpenChange, onSelect, maxResult
42
48
  ]);
43
49
  __rspack_external_react.useEffect(()=>{
44
50
  if (!open) return;
45
- const unsubscribe = registry.subscribe(()=>{
46
- refresh(queryRef.current);
47
- });
48
- return unsubscribe;
51
+ return registry.subscribe(onRegistryChange);
49
52
  }, [
50
53
  open,
51
- registry,
52
- refresh
54
+ registry
53
55
  ]);
54
56
  function handleKeyDown(event) {
55
57
  if ("ArrowDown" === event.key) {
@@ -67,39 +69,39 @@ function AssetCommandPalette({ registry, open, onOpenChange, onSelect, maxResult
67
69
  const picked = results[activeIndex];
68
70
  if (void 0 !== picked) {
69
71
  onSelect(picked);
70
- onOpenChange(false);
72
+ emitOpenChange(false);
71
73
  }
72
74
  }
73
75
  }
74
76
  return /*#__PURE__*/ __rspack_external_react.createElement(Dialog, {
75
77
  open: open,
76
- onOpenChange: onOpenChange
77
- }, /*#__PURE__*/ __rspack_external_react.createElement(DialogContent, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogTitle, null, "Find an asset"), /*#__PURE__*/ __rspack_external_react.createElement(DialogDescription, null, "Search by name, id, MIME type, or tag.")), /*#__PURE__*/ __rspack_external_react.createElement(Input, {
78
- "aria-label": "Asset search query",
78
+ onOpenChange: emitOpenChange
79
+ }, /*#__PURE__*/ __rspack_external_react.createElement(DialogContent, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogHeader, null, /*#__PURE__*/ __rspack_external_react.createElement(DialogTitle, null, msg("assetManager.palette.title")), /*#__PURE__*/ __rspack_external_react.createElement(DialogDescription, null, msg("assetManager.palette.subtitle"))), /*#__PURE__*/ __rspack_external_react.createElement(Input, {
80
+ "aria-label": msg("assetManager.palette.searchLabel"),
79
81
  onChange: (event)=>{
80
82
  setQuery(event.target.value);
81
83
  },
82
84
  onKeyDown: handleKeyDown,
83
- placeholder: "Type to search…",
85
+ placeholder: msg("assetManager.palette.searchPlaceholder"),
84
86
  ref: inputRef,
85
87
  value: query
86
88
  }), /*#__PURE__*/ __rspack_external_react.createElement("ul", {
87
- "aria-label": "Asset results",
89
+ "aria-label": msg("assetManager.palette.resultsLabel"),
88
90
  "data-asset-manager-palette-results": true,
89
91
  ref: listRef,
90
92
  role: "listbox"
91
93
  }, 0 === results.length ? /*#__PURE__*/ __rspack_external_react.createElement("li", {
92
94
  role: "presentation"
93
- }, "No matches.") : results.map((asset, index)=>/*#__PURE__*/ __rspack_external_react.createElement("li", {
95
+ }, msg("assetManager.palette.noMatches")) : results.map((asset, index)=>/*#__PURE__*/ __rspack_external_react.createElement("li", {
94
96
  "aria-selected": index === activeIndex,
95
97
  key: asset.id,
96
98
  role: "option"
97
99
  }, /*#__PURE__*/ __rspack_external_react.createElement("button", {
98
- "aria-label": `Insert asset ${asset.id}`,
100
+ "aria-label": msg("assetManager.browser.insert").replace("{id}", asset.id),
99
101
  "data-active": index === activeIndex ? "true" : void 0,
100
102
  onClick: ()=>{
101
103
  onSelect(asset);
102
- onOpenChange(false);
104
+ emitOpenChange(false);
103
105
  },
104
106
  onMouseEnter: ()=>{
105
107
  setActiveIndex(index);