@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
@@ -31,11 +31,14 @@ __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");
35
+ const button_namespaceObject = require("@anvilkit/ui/button");
34
36
  const card_namespaceObject = require("@anvilkit/ui/card");
35
37
  const input_namespaceObject = require("@anvilkit/ui/input");
36
38
  const windowed_namespaceObject = require("@anvilkit/ui/windowed");
37
39
  const external_react_namespaceObject = require("react");
38
40
  const infer_kind_cjs_namespaceObject = require("../utils/infer-kind.cjs");
41
+ const external_FolderTree_cjs_namespaceObject = require("./FolderTree.cjs");
39
42
  const KIND_FILTERS = [
40
43
  "image",
41
44
  "video",
@@ -47,11 +50,121 @@ const DEFAULT_VIRTUALIZE_THRESHOLD = 50;
47
50
  const DEFAULT_ITEM_HEIGHT = 56;
48
51
  const DEFAULT_MAX_HEIGHT = 400;
49
52
  const DEFAULT_PAGE_SIZE = 100;
50
- 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 }) {
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
+ });
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)();
51
163
  const [activeIndex, setActiveIndex] = external_react_namespaceObject.useState(assets.length > 0 ? 0 : -1);
52
164
  const [query, setQuery] = external_react_namespaceObject.useState("");
53
165
  const [activeKinds, setActiveKinds] = external_react_namespaceObject.useState([]);
54
- const [pageLimit, setPageLimit] = external_react_namespaceObject.useState(pageSize);
166
+ const [extraPages, setExtraPages] = external_react_namespaceObject.useState(0);
167
+ const pageLimit = pageSize * (extraPages + 1);
55
168
  const buttonRefs = external_react_namespaceObject.useRef([]);
56
169
  const pendingFocusRef = external_react_namespaceObject.useRef(null);
57
170
  const searchIndex = external_react_namespaceObject.useMemo(()=>{
@@ -75,8 +188,9 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
75
188
  const lower = query.trim().toLowerCase();
76
189
  const hasKindFilter = activeKinds.length > 0;
77
190
  if ("" === lower && !hasKindFilter) return assets;
191
+ const activeKindSet = hasKindFilter ? new Set(activeKinds) : null;
78
192
  const result = [];
79
- for (const entry of searchIndex)if (!hasKindFilter || activeKinds.includes(entry.kind)) {
193
+ for (const entry of searchIndex)if (!activeKindSet || activeKindSet.has(entry.kind)) {
80
194
  if ("" === lower || entry.haystack.includes(lower)) result.push(entry.asset);
81
195
  }
82
196
  return result;
@@ -94,137 +208,83 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
94
208
  ]);
95
209
  const total = visibleSlice.length;
96
210
  const hasMore = searchEnabled && filteredAssets.length > visibleSlice.length;
97
- external_react_namespaceObject.useEffect(()=>{
98
- if (0 === total) return void setActiveIndex(-1);
99
- setActiveIndex((currentIndex)=>currentIndex >= 0 && currentIndex < total ? currentIndex : 0);
100
- }, [
101
- total
102
- ]);
103
- function focusRow(index) {
211
+ const effectiveActiveIndex = 0 === total ? -1 : activeIndex >= 0 && activeIndex < total ? activeIndex : 0;
212
+ const focusRow = external_react_namespaceObject.useCallback((index)=>{
104
213
  const node = buttonRefs.current[index];
105
214
  if (node) {
106
215
  node.focus();
107
216
  return true;
108
217
  }
109
218
  return false;
110
- }
111
- function moveFocus(nextIndex) {
219
+ }, []);
220
+ const moveFocus = external_react_namespaceObject.useCallback((nextIndex)=>{
112
221
  if (0 === total) return;
113
222
  const clampedIndex = Math.max(0, Math.min(nextIndex, total - 1));
114
223
  pendingFocusRef.current = clampedIndex;
115
224
  setActiveIndex(clampedIndex);
116
225
  if (focusRow(clampedIndex)) pendingFocusRef.current = null;
117
- }
118
- 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)=>{
119
242
  setActiveKinds((current)=>current.includes(kind) ? current.filter((entry)=>entry !== kind) : [
120
243
  ...current,
121
244
  kind
122
245
  ]);
123
- }
124
- const renderRow = (asset, index)=>/*#__PURE__*/ external_react_namespaceObject.createElement(external_react_namespaceObject.Fragment, null, /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
125
- "aria-label": `Insert asset ${asset.id}`,
126
- onClick: ()=>{
127
- onInsert(asset);
128
- },
129
- onFocus: ()=>{
130
- setActiveIndex(index);
131
- },
132
- onKeyDown: (event)=>{
133
- if ("ArrowDown" === event.key) {
134
- event.preventDefault();
135
- moveFocus(index + 1);
136
- return;
137
- }
138
- if ("ArrowUp" === event.key) {
139
- event.preventDefault();
140
- moveFocus(index - 1);
141
- return;
142
- }
143
- if ("Home" === event.key) {
144
- event.preventDefault();
145
- moveFocus(0);
146
- return;
147
- }
148
- if ("End" === event.key) {
149
- event.preventDefault();
150
- moveFocus(total - 1);
151
- return;
152
- }
153
- if ("Enter" === event.key || " " === event.key) {
154
- event.preventDefault();
155
- onInsert(asset);
156
- }
157
- },
158
- ref: (node)=>{
159
- buttonRefs.current[index] = node;
160
- if (node && pendingFocusRef.current === index) {
161
- pendingFocusRef.current = null;
162
- node.focus();
163
- }
164
- },
165
- tabIndex: activeIndex === index ? 0 : -1,
166
- type: "button"
167
- }, /*#__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", {
168
- "aria-label": `Edit asset ${asset.id}`,
169
- "data-asset-action": "edit",
170
- onClick: ()=>{
171
- onEdit(asset);
172
- },
173
- type: "button"
174
- }, "Edit") : null, void 0 !== onReplace ? /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
175
- "aria-label": `Replace asset ${asset.id}`,
176
- "data-asset-action": "replace",
177
- onClick: ()=>{
178
- onReplace(asset);
179
- },
180
- type: "button"
181
- }, "Replace") : null, void 0 !== onDelete ? /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
182
- "aria-label": `Delete asset ${asset.id}`,
183
- "data-asset-action": "delete",
184
- onClick: ()=>{
185
- onDelete(asset);
186
- },
187
- type: "button"
188
- }, "Delete") : null);
189
- const filterRow = searchEnabled ? /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
190
- "data-asset-manager-filters": true
191
- }, /*#__PURE__*/ external_react_namespaceObject.createElement(input_namespaceObject.Input, {
192
- "aria-label": "Search assets",
193
- onChange: (event)=>{
194
- setQuery(event.target.value);
195
- setPageLimit(pageSize);
196
- },
197
- placeholder: "Search by name, tag, or MIME",
198
- value: query
199
- }), /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
200
- "aria-label": "Asset kind filters",
201
- role: "group"
202
- }, KIND_FILTERS.map((kind)=>{
203
- const active = activeKinds.includes(kind);
204
- return /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
205
- "aria-label": `Filter ${kind} assets`,
206
- "aria-pressed": active,
207
- "data-asset-kind-filter": kind,
208
- key: kind,
209
- onClick: ()=>{
210
- toggleKind(kind);
211
- setPageLimit(pageSize);
212
- },
213
- type: "button"
214
- }, kind);
215
- }))) : 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;
278
+ const filterRow = /*#__PURE__*/ external_react_namespaceObject.createElement(external_react_namespaceObject.Fragment, null, aboveFilters, searchRow);
216
279
  if (0 === total) {
217
- const emptyLabel = searchEnabled && ("" !== query || activeKinds.length > 0) ? "No assets match the current filters." : "No assets uploaded yet.";
218
- 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", {
219
- "aria-label": "Assets",
220
- role: "list"
221
- }, /*#__PURE__*/ external_react_namespaceObject.createElement("li", {
222
- role: "listitem"
223
- }, 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))));
224
284
  }
225
- 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, {
226
- activeIndex: activeIndex >= 0 ? activeIndex : void 0,
227
- "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"),
228
288
  as: "ul",
229
289
  "data-testid": "asset-browser-virtualized",
230
290
  estimateSize: itemHeight,
@@ -233,13 +293,15 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
233
293
  maxHeight: maxHeight,
234
294
  renderItem: renderRow,
235
295
  threshold: virtualizeThreshold
236
- }), hasMore ? /*#__PURE__*/ external_react_namespaceObject.createElement("button", {
296
+ }), hasMore ? /*#__PURE__*/ external_react_namespaceObject.createElement(button_namespaceObject.Button, {
237
297
  "data-asset-action": "load-more",
238
298
  onClick: ()=>{
239
- setPageLimit((current)=>current + pageSize);
299
+ setExtraPages((current)=>current + 1);
240
300
  },
241
- type: "button"
242
- }, "Load more") : null));
301
+ type: "button",
302
+ variant: "outline",
303
+ size: "sm"
304
+ }, msg("assetManager.button.loadMore")) : null));
243
305
  }
244
306
  exports.AssetBrowser = __webpack_exports__.AssetBrowser;
245
307
  for(var __rspack_i in __webpack_exports__)if (-1 === [
@@ -1,3 +1,4 @@
1
+ import * as React from "react";
1
2
  import type { UploadResult } from "../types/types.js";
2
3
  export interface AssetBrowserProps {
3
4
  readonly assets: readonly UploadResult[];
@@ -25,6 +26,16 @@ export interface AssetBrowserProps {
25
26
  * pre-filter at the host layer) keep their previous chrome.
26
27
  */
27
28
  readonly searchEnabled?: boolean;
29
+ /**
30
+ * Optional content rendered above the filter row — typically a folder
31
+ * breadcrumb + tree + source tabs (PRD 0002 §7.4). Purely additive.
32
+ */
33
+ readonly aboveFilters?: React.ReactNode;
34
+ /**
35
+ * When `true`, asset rows are draggable carrying an asset-id payload
36
+ * (`ASSET_DRAG_MIME`) so they can be dropped onto a `FolderTree` row.
37
+ */
38
+ readonly draggableRows?: boolean;
28
39
  /**
29
40
  * Page size used by the "Load more" affordance once the visible
30
41
  * slice exceeds this number. Defaults to 100.
@@ -49,5 +60,5 @@ export interface AssetBrowserProps {
49
60
  /** Pixel height of the scroll container when virtualizing. */
50
61
  readonly maxHeight?: number;
51
62
  }
52
- export declare function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEnabled, pageSize, virtualizeThreshold, itemHeight, maxHeight, }: AssetBrowserProps): import("react/jsx-runtime").JSX.Element;
63
+ export declare function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEnabled, aboveFilters, draggableRows, pageSize, virtualizeThreshold, itemHeight, maxHeight, }: AssetBrowserProps): import("react/jsx-runtime").JSX.Element;
53
64
  //# sourceMappingURL=AssetBrowser.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssetBrowser.d.cts","sourceRoot":"","sources":["../../src/ui/AssetBrowser.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWjE,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,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,QAA4B,EAC5B,mBAAkD,EAClD,UAAgC,EAChC,SAA8B,GAC9B,EAAE,iBAAiB,2CAuSnB"}
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,3 +1,4 @@
1
+ import * as React from "react";
1
2
  import type { UploadResult } from "../types/types.js";
2
3
  export interface AssetBrowserProps {
3
4
  readonly assets: readonly UploadResult[];
@@ -25,6 +26,16 @@ export interface AssetBrowserProps {
25
26
  * pre-filter at the host layer) keep their previous chrome.
26
27
  */
27
28
  readonly searchEnabled?: boolean;
29
+ /**
30
+ * Optional content rendered above the filter row — typically a folder
31
+ * breadcrumb + tree + source tabs (PRD 0002 §7.4). Purely additive.
32
+ */
33
+ readonly aboveFilters?: React.ReactNode;
34
+ /**
35
+ * When `true`, asset rows are draggable carrying an asset-id payload
36
+ * (`ASSET_DRAG_MIME`) so they can be dropped onto a `FolderTree` row.
37
+ */
38
+ readonly draggableRows?: boolean;
28
39
  /**
29
40
  * Page size used by the "Load more" affordance once the visible
30
41
  * slice exceeds this number. Defaults to 100.
@@ -49,5 +60,5 @@ export interface AssetBrowserProps {
49
60
  /** Pixel height of the scroll container when virtualizing. */
50
61
  readonly maxHeight?: number;
51
62
  }
52
- export declare function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEnabled, pageSize, virtualizeThreshold, itemHeight, maxHeight, }: AssetBrowserProps): import("react/jsx-runtime").JSX.Element;
63
+ export declare function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEnabled, aboveFilters, draggableRows, pageSize, virtualizeThreshold, itemHeight, maxHeight, }: AssetBrowserProps): import("react/jsx-runtime").JSX.Element;
53
64
  //# sourceMappingURL=AssetBrowser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssetBrowser.d.ts","sourceRoot":"","sources":["../../src/ui/AssetBrowser.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWjE,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,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,QAA4B,EAC5B,mBAAkD,EAClD,UAAgC,EAChC,SAA8B,GAC9B,EAAE,iBAAiB,2CAuSnB"}
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"}