@kywi-software/core 0.2.0 → 0.3.0

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 (364) hide show
  1. package/README.md +57 -2
  2. package/dist/admin/app.d.ts +10 -1
  3. package/dist/admin/app.d.ts.map +1 -1
  4. package/dist/admin/app.js +2 -2
  5. package/dist/admin/app.js.map +1 -1
  6. package/dist/admin/approval-queue.d.ts +3 -1
  7. package/dist/admin/approval-queue.d.ts.map +1 -1
  8. package/dist/admin/approval-queue.js +2 -2
  9. package/dist/admin/approval-queue.js.map +1 -1
  10. package/dist/admin/audience-list.d.ts.map +1 -1
  11. package/dist/admin/audience-list.js +9 -1
  12. package/dist/admin/audience-list.js.map +1 -1
  13. package/dist/admin/chrome.d.ts +7 -1
  14. package/dist/admin/chrome.d.ts.map +1 -1
  15. package/dist/admin/chrome.js +2 -1
  16. package/dist/admin/chrome.js.map +1 -1
  17. package/dist/admin/content-editor-api.d.ts +27 -1
  18. package/dist/admin/content-editor-api.d.ts.map +1 -1
  19. package/dist/admin/content-editor-api.js +60 -2
  20. package/dist/admin/content-editor-api.js.map +1 -1
  21. package/dist/admin/content-form.d.ts +62 -6
  22. package/dist/admin/content-form.d.ts.map +1 -1
  23. package/dist/admin/content-form.js +118 -13
  24. package/dist/admin/content-form.js.map +1 -1
  25. package/dist/admin/content-permissions-tab.d.ts +13 -0
  26. package/dist/admin/content-permissions-tab.d.ts.map +1 -0
  27. package/dist/admin/content-permissions-tab.js +90 -0
  28. package/dist/admin/content-permissions-tab.js.map +1 -0
  29. package/dist/admin/context.d.ts +8 -0
  30. package/dist/admin/context.d.ts.map +1 -1
  31. package/dist/admin/context.js.map +1 -1
  32. package/dist/admin/feed-builder.d.ts.map +1 -1
  33. package/dist/admin/feed-builder.js +20 -1
  34. package/dist/admin/feed-builder.js.map +1 -1
  35. package/dist/admin/field-components.d.ts.map +1 -1
  36. package/dist/admin/field-components.js +26 -1
  37. package/dist/admin/field-components.js.map +1 -1
  38. package/dist/admin/form-builder.js +6 -1
  39. package/dist/admin/form-builder.js.map +1 -1
  40. package/dist/admin/form-helpers.d.ts.map +1 -1
  41. package/dist/admin/form-helpers.js +2 -0
  42. package/dist/admin/form-helpers.js.map +1 -1
  43. package/dist/admin/kywi-logo.d.ts +21 -0
  44. package/dist/admin/kywi-logo.d.ts.map +1 -0
  45. package/dist/admin/kywi-logo.js +123 -0
  46. package/dist/admin/kywi-logo.js.map +1 -0
  47. package/dist/admin/layout-editor/component-actions.d.ts +18 -0
  48. package/dist/admin/layout-editor/component-actions.d.ts.map +1 -1
  49. package/dist/admin/layout-editor/component-actions.js +19 -0
  50. package/dist/admin/layout-editor/component-actions.js.map +1 -1
  51. package/dist/admin/layout-editor/component-picker-field.d.ts +20 -0
  52. package/dist/admin/layout-editor/component-picker-field.d.ts.map +1 -0
  53. package/dist/admin/layout-editor/component-picker-field.js +16 -0
  54. package/dist/admin/layout-editor/component-picker-field.js.map +1 -0
  55. package/dist/admin/layout-editor/drag-utils.d.ts +48 -0
  56. package/dist/admin/layout-editor/drag-utils.d.ts.map +1 -1
  57. package/dist/admin/layout-editor/drag-utils.js +43 -0
  58. package/dist/admin/layout-editor/drag-utils.js.map +1 -1
  59. package/dist/admin/layout-editor/editor-canvas.d.ts +9 -1
  60. package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
  61. package/dist/admin/layout-editor/editor-canvas.js +41 -15
  62. package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
  63. package/dist/admin/layout-editor/editor-state.d.ts +9 -1
  64. package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
  65. package/dist/admin/layout-editor/editor-state.js +34 -0
  66. package/dist/admin/layout-editor/editor-state.js.map +1 -1
  67. package/dist/admin/layout-editor/editor.css +83 -0
  68. package/dist/admin/layout-editor/form-picker-field.d.ts +17 -0
  69. package/dist/admin/layout-editor/form-picker-field.d.ts.map +1 -0
  70. package/dist/admin/layout-editor/form-picker-field.js +35 -0
  71. package/dist/admin/layout-editor/form-picker-field.js.map +1 -0
  72. package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
  73. package/dist/admin/layout-editor/layout-editor.js +95 -28
  74. package/dist/admin/layout-editor/layout-editor.js.map +1 -1
  75. package/dist/admin/layout-editor/mode-toggle.d.ts.map +1 -1
  76. package/dist/admin/layout-editor/mode-toggle.js +1 -1
  77. package/dist/admin/layout-editor/mode-toggle.js.map +1 -1
  78. package/dist/admin/layout-editor/module-overlay.d.ts +10 -1
  79. package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
  80. package/dist/admin/layout-editor/module-overlay.js +3 -3
  81. package/dist/admin/layout-editor/module-overlay.js.map +1 -1
  82. package/dist/admin/layout-editor/props-panel.d.ts +10 -1
  83. package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
  84. package/dist/admin/layout-editor/props-panel.js +25 -2
  85. package/dist/admin/layout-editor/props-panel.js.map +1 -1
  86. package/dist/admin/layout-editor/section-insert-line.d.ts.map +1 -1
  87. package/dist/admin/layout-editor/section-insert-line.js +1 -1
  88. package/dist/admin/layout-editor/section-insert-line.js.map +1 -1
  89. package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
  90. package/dist/admin/layout-editor/section-overlay.js +1 -1
  91. package/dist/admin/layout-editor/section-overlay.js.map +1 -1
  92. package/dist/admin/layout-editor/section-template-picker.d.ts +9 -1
  93. package/dist/admin/layout-editor/section-template-picker.d.ts.map +1 -1
  94. package/dist/admin/layout-editor/section-template-picker.js +45 -2
  95. package/dist/admin/layout-editor/section-template-picker.js.map +1 -1
  96. package/dist/admin/registry.d.ts.map +1 -1
  97. package/dist/admin/registry.js +11 -0
  98. package/dist/admin/registry.js.map +1 -1
  99. package/dist/admin/server.d.ts +15 -2
  100. package/dist/admin/server.d.ts.map +1 -1
  101. package/dist/admin/server.js +37 -1
  102. package/dist/admin/server.js.map +1 -1
  103. package/dist/admin/shell.d.ts.map +1 -1
  104. package/dist/admin/shell.js +62 -3
  105. package/dist/admin/shell.js.map +1 -1
  106. package/dist/admin/styles/admin.css +105 -27
  107. package/dist/admin/surface-matcher.d.ts +27 -0
  108. package/dist/admin/surface-matcher.d.ts.map +1 -1
  109. package/dist/admin/surface-matcher.js +11 -0
  110. package/dist/admin/surface-matcher.js.map +1 -1
  111. package/dist/admin/surfaces/approvals/approvals-data.d.ts +29 -9
  112. package/dist/admin/surfaces/approvals/approvals-data.d.ts.map +1 -1
  113. package/dist/admin/surfaces/approvals/approvals-data.js +65 -22
  114. package/dist/admin/surfaces/approvals/approvals-data.js.map +1 -1
  115. package/dist/admin/surfaces/approvals/approvals-index.d.ts.map +1 -1
  116. package/dist/admin/surfaces/approvals/approvals-index.js +47 -14
  117. package/dist/admin/surfaces/approvals/approvals-index.js.map +1 -1
  118. package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -1
  119. package/dist/admin/surfaces/content/content-edit.js +34 -8
  120. package/dist/admin/surfaces/content/content-edit.js.map +1 -1
  121. package/dist/admin/surfaces/content/content-index.d.ts.map +1 -1
  122. package/dist/admin/surfaces/content/content-index.js +29 -2
  123. package/dist/admin/surfaces/content/content-index.js.map +1 -1
  124. package/dist/admin/surfaces/content/content-new.d.ts.map +1 -1
  125. package/dist/admin/surfaces/content/content-new.js +6 -4
  126. package/dist/admin/surfaces/content/content-new.js.map +1 -1
  127. package/dist/admin/surfaces/contentTree/content-tree.d.ts.map +1 -1
  128. package/dist/admin/surfaces/contentTree/content-tree.js +25 -2
  129. package/dist/admin/surfaces/contentTree/content-tree.js.map +1 -1
  130. package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -1
  131. package/dist/admin/surfaces/contentTypes/content-types-designer.js +78 -47
  132. package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -1
  133. package/dist/admin/surfaces/feeds/feed-editor.d.ts.map +1 -1
  134. package/dist/admin/surfaces/feeds/feed-editor.js +21 -4
  135. package/dist/admin/surfaces/feeds/feed-editor.js.map +1 -1
  136. package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -1
  137. package/dist/admin/surfaces/layouts/layout-editor-client.js +7 -4
  138. package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -1
  139. package/dist/admin/surfaces/login.d.ts.map +1 -1
  140. package/dist/admin/surfaces/login.js +2 -1
  141. package/dist/admin/surfaces/login.js.map +1 -1
  142. package/dist/admin/surfaces/media/media-client.d.ts.map +1 -1
  143. package/dist/admin/surfaces/media/media-client.js +10 -2
  144. package/dist/admin/surfaces/media/media-client.js.map +1 -1
  145. package/dist/admin/surfaces/settings/settings-site.d.ts.map +1 -1
  146. package/dist/admin/surfaces/settings/settings-site.js +39 -2
  147. package/dist/admin/surfaces/settings/settings-site.js.map +1 -1
  148. package/dist/admin/surfaces/settings/settings-sites.js +18 -0
  149. package/dist/admin/surfaces/settings/settings-sites.js.map +1 -1
  150. package/dist/admin/surfaces/trash/trash-index.d.ts.map +1 -1
  151. package/dist/admin/surfaces/trash/trash-index.js +45 -8
  152. package/dist/admin/surfaces/trash/trash-index.js.map +1 -1
  153. package/dist/admin/surfaces/users/users-data.d.ts +11 -0
  154. package/dist/admin/surfaces/users/users-data.d.ts.map +1 -1
  155. package/dist/admin/surfaces/users/users-data.js +20 -1
  156. package/dist/admin/surfaces/users/users-data.js.map +1 -1
  157. package/dist/admin/surfaces/webServices/web-services-data.d.ts +11 -1
  158. package/dist/admin/surfaces/webServices/web-services-data.d.ts.map +1 -1
  159. package/dist/admin/surfaces/webServices/web-services-data.js +13 -0
  160. package/dist/admin/surfaces/webServices/web-services-data.js.map +1 -1
  161. package/dist/admin/surfaces/webServices/webhooks.d.ts +3 -0
  162. package/dist/admin/surfaces/webServices/webhooks.d.ts.map +1 -0
  163. package/dist/admin/surfaces/webServices/webhooks.js +69 -0
  164. package/dist/admin/surfaces/webServices/webhooks.js.map +1 -0
  165. package/dist/admin/webhook-manager.d.ts +32 -0
  166. package/dist/admin/webhook-manager.d.ts.map +1 -0
  167. package/dist/admin/webhook-manager.js +62 -0
  168. package/dist/admin/webhook-manager.js.map +1 -0
  169. package/dist/api/admin-features-routes.d.ts.map +1 -1
  170. package/dist/api/admin-features-routes.js +30 -0
  171. package/dist/api/admin-features-routes.js.map +1 -1
  172. package/dist/api/api-key-routes.d.ts.map +1 -1
  173. package/dist/api/api-key-routes.js +6 -1
  174. package/dist/api/api-key-routes.js.map +1 -1
  175. package/dist/api/auth.d.ts +8 -0
  176. package/dist/api/auth.d.ts.map +1 -1
  177. package/dist/api/auth.js +11 -1
  178. package/dist/api/auth.js.map +1 -1
  179. package/dist/api/comment-routes.d.ts.map +1 -1
  180. package/dist/api/comment-routes.js +102 -47
  181. package/dist/api/comment-routes.js.map +1 -1
  182. package/dist/api/config-routes.d.ts +10 -2
  183. package/dist/api/config-routes.d.ts.map +1 -1
  184. package/dist/api/config-routes.js +46 -25
  185. package/dist/api/config-routes.js.map +1 -1
  186. package/dist/api/content-routes.d.ts.map +1 -1
  187. package/dist/api/content-routes.js +41 -0
  188. package/dist/api/content-routes.js.map +1 -1
  189. package/dist/api/content-schemas.d.ts.map +1 -1
  190. package/dist/api/content-schemas.js +34 -1
  191. package/dist/api/content-schemas.js.map +1 -1
  192. package/dist/api/content-type-routes.d.ts.map +1 -1
  193. package/dist/api/content-type-routes.js +58 -3
  194. package/dist/api/content-type-routes.js.map +1 -1
  195. package/dist/api/feed-routes.d.ts +180 -0
  196. package/dist/api/feed-routes.d.ts.map +1 -1
  197. package/dist/api/feed-routes.js +10 -2
  198. package/dist/api/feed-routes.js.map +1 -1
  199. package/dist/api/form-routes.d.ts +6 -0
  200. package/dist/api/form-routes.d.ts.map +1 -1
  201. package/dist/api/form-routes.js +93 -14
  202. package/dist/api/form-routes.js.map +1 -1
  203. package/dist/api/graphql/resolvers.d.ts +4 -4
  204. package/dist/api/index.d.ts.map +1 -1
  205. package/dist/api/index.js +12 -1
  206. package/dist/api/index.js.map +1 -1
  207. package/dist/api/media-routes.d.ts.map +1 -1
  208. package/dist/api/media-routes.js +18 -1
  209. package/dist/api/media-routes.js.map +1 -1
  210. package/dist/api/webhook-routes.d.ts.map +1 -1
  211. package/dist/api/webhook-routes.js +19 -2
  212. package/dist/api/webhook-routes.js.map +1 -1
  213. package/dist/api/workflow-routes.d.ts.map +1 -1
  214. package/dist/api/workflow-routes.js +163 -4
  215. package/dist/api/workflow-routes.js.map +1 -1
  216. package/dist/auth/roles.d.ts +28 -0
  217. package/dist/auth/roles.d.ts.map +1 -1
  218. package/dist/auth/roles.js +49 -0
  219. package/dist/auth/roles.js.map +1 -1
  220. package/dist/config/reserved-field-names.d.ts +29 -0
  221. package/dist/config/reserved-field-names.d.ts.map +1 -0
  222. package/dist/config/reserved-field-names.js +59 -0
  223. package/dist/config/reserved-field-names.js.map +1 -0
  224. package/dist/config/types.d.ts +31 -2
  225. package/dist/config/types.d.ts.map +1 -1
  226. package/dist/config/types.js.map +1 -1
  227. package/dist/db/analytics-queries.d.ts +1 -1
  228. package/dist/db/api-key-queries.d.ts +7 -2
  229. package/dist/db/api-key-queries.d.ts.map +1 -1
  230. package/dist/db/api-key-queries.js +8 -2
  231. package/dist/db/api-key-queries.js.map +1 -1
  232. package/dist/db/apply-snapshot.d.ts +58 -0
  233. package/dist/db/apply-snapshot.d.ts.map +1 -0
  234. package/dist/db/apply-snapshot.js +142 -0
  235. package/dist/db/apply-snapshot.js.map +1 -0
  236. package/dist/db/audit-queries.d.ts +3 -3
  237. package/dist/db/category-queries.d.ts +3 -3
  238. package/dist/db/changeset-audit-queries.d.ts +2 -2
  239. package/dist/db/changeset-queries.d.ts +5 -5
  240. package/dist/db/changeset-queries.d.ts.map +1 -1
  241. package/dist/db/changeset-queries.js +24 -7
  242. package/dist/db/changeset-queries.js.map +1 -1
  243. package/dist/db/content-queries.d.ts +6 -0
  244. package/dist/db/content-queries.d.ts.map +1 -1
  245. package/dist/db/content-queries.js +8 -0
  246. package/dist/db/content-queries.js.map +1 -1
  247. package/dist/db/content-type-queries.d.ts +20 -0
  248. package/dist/db/content-type-queries.d.ts.map +1 -1
  249. package/dist/db/content-type-queries.js +32 -0
  250. package/dist/db/content-type-queries.js.map +1 -1
  251. package/dist/db/dashboard-queries.d.ts.map +1 -1
  252. package/dist/db/dashboard-queries.js +5 -1
  253. package/dist/db/dashboard-queries.js.map +1 -1
  254. package/dist/db/dynamic-schema.d.ts.map +1 -1
  255. package/dist/db/dynamic-schema.js +2 -0
  256. package/dist/db/dynamic-schema.js.map +1 -1
  257. package/dist/db/extension-queries.d.ts +8 -8
  258. package/dist/db/feed-queries.d.ts +3 -3
  259. package/dist/db/index.d.ts +3 -0
  260. package/dist/db/index.d.ts.map +1 -1
  261. package/dist/db/index.js +7 -0
  262. package/dist/db/index.js.map +1 -1
  263. package/dist/db/media-queries.d.ts +31 -7
  264. package/dist/db/media-queries.d.ts.map +1 -1
  265. package/dist/db/media-queries.js +13 -1
  266. package/dist/db/media-queries.js.map +1 -1
  267. package/dist/db/membership-dedupe.d.ts +26 -0
  268. package/dist/db/membership-dedupe.d.ts.map +1 -0
  269. package/dist/db/membership-dedupe.js +68 -0
  270. package/dist/db/membership-dedupe.js.map +1 -0
  271. package/dist/db/revision-queries.d.ts +122 -0
  272. package/dist/db/revision-queries.d.ts.map +1 -0
  273. package/dist/db/revision-queries.js +213 -0
  274. package/dist/db/revision-queries.js.map +1 -0
  275. package/dist/db/schema-apply.d.ts +8 -0
  276. package/dist/db/schema-apply.d.ts.map +1 -1
  277. package/dist/db/schema-apply.js +17 -0
  278. package/dist/db/schema-apply.js.map +1 -1
  279. package/dist/db/schema-field-queries.d.ts +2 -0
  280. package/dist/db/schema-field-queries.d.ts.map +1 -1
  281. package/dist/db/schema-field-queries.js +4 -0
  282. package/dist/db/schema-field-queries.js.map +1 -1
  283. package/dist/db/site-plugin-queries.d.ts +2 -2
  284. package/dist/db/user-queries.d.ts +12 -0
  285. package/dist/db/user-queries.d.ts.map +1 -1
  286. package/dist/db/user-queries.js +18 -4
  287. package/dist/db/user-queries.js.map +1 -1
  288. package/dist/db/version-queries.d.ts +37 -0
  289. package/dist/db/version-queries.d.ts.map +1 -1
  290. package/dist/db/version-queries.js +36 -0
  291. package/dist/db/version-queries.js.map +1 -1
  292. package/dist/db/webhook-queries.d.ts +27 -5
  293. package/dist/db/webhook-queries.d.ts.map +1 -1
  294. package/dist/db/webhook-queries.js +17 -0
  295. package/dist/db/webhook-queries.js.map +1 -1
  296. package/dist/db/workflow-queries.d.ts +2 -2
  297. package/dist/experiments/schema.d.ts +1 -1
  298. package/dist/hooks/index.d.ts +1 -1
  299. package/dist/hooks/index.d.ts.map +1 -1
  300. package/dist/hooks/index.js +1 -1
  301. package/dist/hooks/index.js.map +1 -1
  302. package/dist/hooks/webhook-retry.d.ts +22 -1
  303. package/dist/hooks/webhook-retry.d.ts.map +1 -1
  304. package/dist/hooks/webhook-retry.js +38 -1
  305. package/dist/hooks/webhook-retry.js.map +1 -1
  306. package/dist/host/index.d.ts +28 -0
  307. package/dist/host/index.d.ts.map +1 -1
  308. package/dist/host/index.js +56 -1
  309. package/dist/host/index.js.map +1 -1
  310. package/dist/layout/comments-module.d.ts +18 -0
  311. package/dist/layout/comments-module.d.ts.map +1 -0
  312. package/dist/layout/comments-module.js +130 -0
  313. package/dist/layout/comments-module.js.map +1 -0
  314. package/dist/layout/feed-hydration.d.ts +75 -0
  315. package/dist/layout/feed-hydration.d.ts.map +1 -0
  316. package/dist/layout/feed-hydration.js +158 -0
  317. package/dist/layout/feed-hydration.js.map +1 -0
  318. package/dist/layout/index.d.ts +2 -1
  319. package/dist/layout/index.d.ts.map +1 -1
  320. package/dist/layout/index.js +2 -1
  321. package/dist/layout/index.js.map +1 -1
  322. package/dist/layout/module-render-context.d.ts +13 -0
  323. package/dist/layout/module-render-context.d.ts.map +1 -0
  324. package/dist/layout/module-render-context.js +15 -0
  325. package/dist/layout/module-render-context.js.map +1 -0
  326. package/dist/layout/modules-extended.d.ts.map +1 -1
  327. package/dist/layout/modules-extended.js +92 -13
  328. package/dist/layout/modules-extended.js.map +1 -1
  329. package/dist/layout/registry.d.ts.map +1 -1
  330. package/dist/layout/registry.js +22 -6
  331. package/dist/layout/registry.js.map +1 -1
  332. package/dist/layout/renderer.d.ts +17 -1
  333. package/dist/layout/renderer.d.ts.map +1 -1
  334. package/dist/layout/renderer.js +11 -4
  335. package/dist/layout/renderer.js.map +1 -1
  336. package/dist/nav/index.d.ts +1 -0
  337. package/dist/nav/index.d.ts.map +1 -1
  338. package/dist/nav/index.js +4 -0
  339. package/dist/nav/index.js.map +1 -1
  340. package/dist/nav/url-resolver.d.ts +10 -2
  341. package/dist/nav/url-resolver.d.ts.map +1 -1
  342. package/dist/nav/url-resolver.js +17 -3
  343. package/dist/nav/url-resolver.js.map +1 -1
  344. package/dist/schema/base.d.ts +37 -1
  345. package/dist/schema/base.d.ts.map +1 -1
  346. package/dist/schema/base.js +20 -2
  347. package/dist/schema/base.js.map +1 -1
  348. package/dist/schema/generate.d.ts +8 -0
  349. package/dist/schema/generate.d.ts.map +1 -1
  350. package/dist/schema/generate.js +7 -4
  351. package/dist/schema/generate.js.map +1 -1
  352. package/dist/schema/mapper.d.ts.map +1 -1
  353. package/dist/schema/mapper.js +2 -0
  354. package/dist/schema/mapper.js.map +1 -1
  355. package/dist/schema/mysql-tables.d.ts +34 -0
  356. package/dist/schema/mysql-tables.d.ts.map +1 -1
  357. package/dist/schema/mysql-tables.js +14 -2
  358. package/dist/schema/mysql-tables.js.map +1 -1
  359. package/dist/server.d.ts +1 -0
  360. package/dist/server.d.ts.map +1 -1
  361. package/dist/server.js +1 -0
  362. package/dist/server.js.map +1 -1
  363. package/dist/site/styles.css +384 -0
  364. package/package.json +2 -1
@@ -2,9 +2,35 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useEffect } from 'react';
4
4
  import { buildAdminNav } from './nav.js';
5
- function NavItem({ item, currentPath, depth = 0 }) {
5
+ import { KywiLogo, KywiLogoDark } from './kywi-logo.js';
6
+ /** localStorage key persisting per-group expand/collapse overrides. */
7
+ const NAV_COLLAPSE_KEY = 'kywi-admin-nav-groups';
8
+ /**
9
+ * Does `currentPath` fall inside this group — either under the group's own href
10
+ * or under any of its child hrefs (some children, e.g. Settings → Content Types,
11
+ * live outside the group's href prefix)? Drives the active-group-expanded default.
12
+ */
13
+ function isGroupActive(item, currentPath) {
14
+ const within = (href) => currentPath === href || currentPath.startsWith(href + '/');
15
+ if (within(item.href))
16
+ return true;
17
+ return (item.children ?? []).some(c => within(c.href));
18
+ }
19
+ /** Down-chevron disclosure glyph; rotates via CSS from the group's data-expanded. */
20
+ function NavChevron() {
21
+ return (_jsx("svg", { className: "kywi-nav-chevron", width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M4 6l4 4 4-4" }) }));
22
+ }
23
+ function NavItem({ item, currentPath, depth = 0, expanded, onToggle, }) {
6
24
  const isActive = currentPath === item.href || currentPath.startsWith(item.href + '/');
7
- return (_jsxs("li", { className: "kywi-nav-item", "data-active": isActive, children: [_jsx("a", { href: item.href, className: `kywi-nav-link ${isActive ? 'kywi-nav-active' : ''}`, style: { paddingLeft: `${(depth + 1) * 16}px` }, children: item.label }), item.children && item.children.length > 0 && (_jsx("ul", { className: "kywi-nav-children", children: item.children.map(child => (_jsx(NavItem, { item: child, currentPath: currentPath, depth: depth + 1 }, child.href))) }))] }));
25
+ const hasChildren = Array.isArray(item.children) && item.children.length > 0;
26
+ // Only top-level groups (depth 0) with children AND a toggle handler collapse.
27
+ const collapsible = depth === 0 && hasChildren && typeof onToggle === 'function';
28
+ const isExpanded = collapsible ? expanded !== false : true;
29
+ const childrenId = collapsible
30
+ ? `kywi-nav-group-${item.href.replace(/[^a-z0-9]+/gi, '-').replace(/^-+|-+$/g, '')}`
31
+ : undefined;
32
+ const link = (_jsx("a", { href: item.href, className: `kywi-nav-link ${isActive ? 'kywi-nav-active' : ''}`, style: { paddingLeft: `${(depth + 1) * 16}px` }, children: item.label }));
33
+ return (_jsxs("li", { className: `kywi-nav-item${collapsible ? ' kywi-nav-group' : ''}`, "data-active": isActive, ...(collapsible ? { 'data-expanded': isExpanded } : {}), children: [collapsible ? (_jsxs("div", { className: "kywi-nav-group-row", children: [link, _jsx("button", { type: "button", className: "kywi-nav-toggle", "aria-expanded": isExpanded, "aria-controls": childrenId, "aria-label": `${isExpanded ? 'Collapse' : 'Expand'} ${item.label}`, onClick: () => onToggle(item), children: _jsx(NavChevron, {}) })] })) : (link), hasChildren && (_jsx("div", { className: "kywi-nav-children-wrap", children: _jsx("ul", { id: childrenId, className: "kywi-nav-children", ...(collapsible ? { 'aria-hidden': !isExpanded } : {}), children: item.children.map(child => (_jsx(NavItem, { item: child, currentPath: currentPath, depth: depth + 1 }, child.href))) }) }))] }));
8
34
  }
9
35
  export function AdminShell({ config, role, flags, pluginNav, currentPath, children }) {
10
36
  // Role/flags (when provided) narrow the derived tree beyond the config ceiling.
@@ -19,6 +45,39 @@ export function AdminShell({ config, role, flags, pluginNav, currentPath, childr
19
45
  // sidebar is always visible. Close the drawer whenever the route changes.
20
46
  const [sidebarOpen, setSidebarOpen] = useState(false);
21
47
  useEffect(() => { setSidebarOpen(false); }, [currentPath]);
22
- return (_jsxs("div", { className: "kywi-admin-shell", "data-sidebar-open": sidebarOpen ? 'true' : 'false', children: [_jsx("button", { type: "button", className: "kywi-admin-scrim", "aria-label": "Close navigation", tabIndex: sidebarOpen ? 0 : -1, onClick: () => setSidebarOpen(false) }), _jsx("aside", { id: "kywi-admin-sidebar", className: "kywi-admin-sidebar", children: _jsxs("div", { className: "kywi-admin-sidebar-sticky", children: [_jsx("div", { className: "kywi-admin-logo", children: _jsx("a", { href: "/admin/dashboard", children: "Kywi Admin" }) }), _jsxs("nav", { className: "kywi-admin-nav", children: [_jsx("ul", { children: nav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) }), pluginNav && pluginNav.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "kywi-admin-nav-section-label", children: "Plugins" }), _jsx("ul", { children: pluginNav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) })] }))] })] }) }), _jsxs("main", { className: "kywi-admin-main", children: [_jsxs("div", { className: "kywi-admin-mobile-bar", children: [_jsxs("button", { type: "button", className: "kywi-admin-hamburger", "aria-label": "Open navigation", "aria-controls": "kywi-admin-sidebar", "aria-expanded": sidebarOpen, onClick: () => setSidebarOpen(open => !open), children: [_jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" })] }), _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-mobile-brand", children: "Kywi Admin" })] }), children] })] }));
48
+ // Per-group expand/collapse overrides (href user's explicit choice). Empty
49
+ // until hydrated from localStorage so the server render and the first client
50
+ // render agree (both fall back to the active-group-expanded default); the
51
+ // effect then applies any persisted choices. A group with no override follows
52
+ // the default, so navigating auto-expands the newly-active section.
53
+ const [overrides, setOverrides] = useState({});
54
+ useEffect(() => {
55
+ try {
56
+ const raw = window.localStorage.getItem(NAV_COLLAPSE_KEY);
57
+ if (raw) {
58
+ const parsed = JSON.parse(raw);
59
+ if (parsed && typeof parsed === 'object')
60
+ setOverrides(parsed);
61
+ }
62
+ }
63
+ catch {
64
+ // Best-effort: a storage hiccup just leaves the active-default layout.
65
+ }
66
+ }, []);
67
+ const isExpanded = (item) => item.href in overrides ? overrides[item.href] : isGroupActive(item, currentPath);
68
+ const toggleGroup = (item) => {
69
+ setOverrides(prev => {
70
+ const current = item.href in prev ? prev[item.href] : isGroupActive(item, currentPath);
71
+ const next = { ...prev, [item.href]: !current };
72
+ try {
73
+ window.localStorage.setItem(NAV_COLLAPSE_KEY, JSON.stringify(next));
74
+ }
75
+ catch {
76
+ // Non-fatal: the toggle still takes effect for this session.
77
+ }
78
+ return next;
79
+ });
80
+ };
81
+ return (_jsxs("div", { className: "kywi-admin-shell", "data-sidebar-open": sidebarOpen ? 'true' : 'false', children: [_jsx("button", { type: "button", className: "kywi-admin-scrim", "aria-label": "Close navigation", tabIndex: sidebarOpen ? 0 : -1, onClick: () => setSidebarOpen(false) }), _jsx("aside", { id: "kywi-admin-sidebar", className: "kywi-admin-sidebar", children: _jsxs("div", { className: "kywi-admin-sidebar-sticky", children: [_jsx("div", { className: "kywi-admin-logo", children: _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-logo-link", "aria-label": "Kywi \u2014 go to dashboard", children: _jsx(KywiLogo, { className: "kywi-admin-logo-mark" }) }) }), _jsxs("nav", { className: "kywi-admin-nav", children: [_jsx("ul", { children: nav.map(item => (_jsx(NavItem, { item: item, currentPath: currentPath, expanded: isExpanded(item), onToggle: toggleGroup }, item.href))) }), pluginNav && pluginNav.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "kywi-admin-nav-section-label", children: "Plugins" }), _jsx("ul", { children: pluginNav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) })] }))] })] }) }), _jsxs("main", { className: "kywi-admin-main", children: [_jsxs("div", { className: "kywi-admin-mobile-bar", children: [_jsxs("button", { type: "button", className: "kywi-admin-hamburger", "aria-label": "Open navigation", "aria-controls": "kywi-admin-sidebar", "aria-expanded": sidebarOpen, onClick: () => setSidebarOpen(open => !open), children: [_jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" })] }), _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-mobile-brand", "aria-label": "Kywi \u2014 go to dashboard", children: _jsx(KywiLogoDark, { className: "kywi-admin-mobile-logo" }) })] }), children] })] }));
23
82
  }
24
83
  //# sourceMappingURL=shell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"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"}
@@ -287,29 +287,32 @@
287
287
  }
288
288
  .kywi-admin-sidebar-sticky::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.16); background-clip: content-box; }
289
289
 
290
+ /* ---- Brand mark ------------------------------------------------------- */
291
+ /* The wordmark sits directly on the dark sidebar (no plate). Its type inherits
292
+ `currentColor`, which we drive to the muted nav-link colour so the wordmark
293
+ reads uniformly muted — exactly like the nav text beside it — while the kiwi
294
+ icon keeps its lime/cream accent as the single pop of colour. */
290
295
  .kywi-admin-logo {
291
296
  padding: var(--kywi-space-2) var(--kywi-space-5) var(--kywi-space-5);
292
297
  margin-bottom: var(--kywi-space-2);
293
298
  }
294
- .kywi-admin-logo a {
299
+ .kywi-admin-sidebar .kywi-admin-logo-link {
295
300
  display: inline-flex;
296
301
  align-items: center;
297
- gap: var(--kywi-space-2);
298
- color: #fff;
299
- font-size: var(--kywi-text-md);
300
- font-weight: var(--kywi-weight-bold);
301
- letter-spacing: var(--kywi-tracking-tight);
302
+ color: var(--kywi-sidebar-fg-muted);
302
303
  text-decoration: none;
304
+ transition: color var(--kywi-dur) var(--kywi-ease), opacity var(--kywi-dur) var(--kywi-ease);
303
305
  }
304
- .kywi-admin-logo a::before {
305
- content: "";
306
- width: 10px;
307
- height: 10px;
308
- border-radius: var(--kywi-radius-pill);
309
- background: var(--kywi-sidebar-accent);
310
- box-shadow: 0 0 0 3px rgba(87, 201, 156, 0.22);
311
- flex-shrink: 0;
306
+ .kywi-admin-sidebar .kywi-admin-logo-link:hover {
307
+ text-decoration: none;
308
+ color: var(--kywi-sidebar-fg);
312
309
  }
310
+ .kywi-admin-logo-mark {
311
+ display: block;
312
+ width: 156px;
313
+ aspect-ratio: 1638 / 382;
314
+ }
315
+ .kywi-admin-logo-mark > svg { display: block; width: 100%; height: 100%; }
313
316
 
314
317
  .kywi-admin-nav ul { list-style: none; margin: 0; padding: 0; }
315
318
  .kywi-admin-nav > ul { padding: 0 var(--kywi-space-3); }
@@ -362,6 +365,61 @@
362
365
  .kywi-admin-sidebar .kywi-nav-children .kywi-nav-link { font-size: var(--kywi-text-xs); padding-top: 5px; padding-bottom: 5px; }
363
366
  .kywi-admin-sidebar :focus-visible { box-shadow: 0 0 0 2px var(--kywi-sidebar-accent); }
364
367
 
368
+ /* ---- Collapsible groups ----------------------------------------------- */
369
+ /* A group row = the label link (navigates to group.href) + a chevron button
370
+ that toggles its children. Keeping the label a real link preserves keyboard
371
+ access to the group landing page; the separate button owns the disclosure. */
372
+ .kywi-admin-sidebar .kywi-nav-group-row { display: flex; align-items: center; gap: 2px; }
373
+ .kywi-admin-sidebar .kywi-nav-group-row .kywi-nav-link { flex: 1 1 auto; min-width: 0; }
374
+ .kywi-admin-sidebar .kywi-nav-toggle {
375
+ display: inline-flex;
376
+ align-items: center;
377
+ justify-content: center;
378
+ flex: 0 0 auto;
379
+ width: 28px;
380
+ height: 28px;
381
+ padding: 0;
382
+ margin: 0;
383
+ background: transparent;
384
+ border: 0;
385
+ border-radius: var(--kywi-radius);
386
+ color: var(--kywi-sidebar-fg-muted);
387
+ cursor: pointer;
388
+ transition: background var(--kywi-dur) var(--kywi-ease), color var(--kywi-dur) var(--kywi-ease);
389
+ }
390
+ .kywi-admin-sidebar .kywi-nav-toggle:hover {
391
+ background: var(--kywi-sidebar-hover-bg);
392
+ color: var(--kywi-sidebar-fg);
393
+ }
394
+ .kywi-admin-sidebar .kywi-nav-chevron {
395
+ display: block;
396
+ transition: transform var(--kywi-dur) var(--kywi-ease);
397
+ }
398
+ /* Chevron points down when open, rotates to point right when collapsed. */
399
+ .kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-chevron { transform: rotate(-90deg); }
400
+
401
+ /* Children collapse via an animatable grid row (0fr → 1fr) so variable-height
402
+ groups slide cleanly; `overflow:hidden` on the list clips them at 0 height.
403
+ The section-8 prefers-reduced-motion block already zeroes these transitions. */
404
+ .kywi-admin-sidebar .kywi-nav-children-wrap {
405
+ display: grid;
406
+ grid-template-rows: 1fr;
407
+ transition: grid-template-rows var(--kywi-dur-slow) var(--kywi-ease);
408
+ }
409
+ .kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-children-wrap { grid-template-rows: 0fr; }
410
+ .kywi-admin-sidebar .kywi-nav-children-wrap > .kywi-nav-children { overflow: hidden; min-height: 0; }
411
+ /* When collapsed, drop the children from the tab order + a11y tree (kept in the
412
+ DOM and query-able). Delay hiding until the collapse animation finishes;
413
+ reveal immediately on expand. */
414
+ .kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-children {
415
+ visibility: hidden;
416
+ transition: visibility 0s linear var(--kywi-dur-slow);
417
+ }
418
+ .kywi-admin-sidebar .kywi-nav-group[data-expanded="true"] .kywi-nav-children {
419
+ visibility: visible;
420
+ transition: visibility 0s;
421
+ }
422
+
365
423
  /* ---- Main + topbar ---------------------------------------------------- */
366
424
  .kywi-admin-main {
367
425
  flex: 1;
@@ -467,13 +525,15 @@
467
525
  justify-content: center;
468
526
  gap: var(--kywi-space-2);
469
527
  }
470
- .kywi-admin-shell .kywi-admin-login-dot {
471
- width: 10px;
472
- height: 10px;
473
- border-radius: var(--kywi-radius-pill);
474
- background: var(--kywi-accent);
475
- box-shadow: 0 0 0 3px var(--kywi-ring-color);
528
+ /* The login card is the hero of the sign-in screen, on a light surface — the
529
+ dark-inked wordmark reads as-is, sized a touch larger than the sidebar. */
530
+ .kywi-admin-shell .kywi-admin-login-logo {
531
+ display: block;
532
+ width: 200px;
533
+ max-width: 72%;
534
+ aspect-ratio: 1638 / 382;
476
535
  }
536
+ .kywi-admin-shell .kywi-admin-login-logo > svg { display: block; width: 100%; height: 100%; }
477
537
  .kywi-admin-shell .kywi-admin-login-subtitle {
478
538
  margin: calc(var(--kywi-space-2) * -1) 0 var(--kywi-space-2);
479
539
  text-align: center;
@@ -507,6 +567,7 @@
507
567
  .kywi-admin-extension-header,
508
568
  .kywi-admin-oauth-header,
509
569
  .kywi-admin-apikey-header,
570
+ .kywi-admin-webhook-header,
510
571
  .kywi-form-builder-header,
511
572
  .kywi-feed-builder-actions,
512
573
  .kywi-changeset-detail-header,
@@ -929,6 +990,7 @@
929
990
  .kywi-admin-shell .kywi-admin-extension-title,
930
991
  .kywi-admin-shell .kywi-admin-oauth-title,
931
992
  .kywi-admin-shell .kywi-admin-apikey-title,
993
+ .kywi-admin-shell .kywi-admin-webhook-title,
932
994
  .kywi-admin-shell .kywi-form-builder-title,
933
995
  .kywi-admin-shell .kywi-feed-builder-title,
934
996
  .kywi-admin-shell .kywi-form-builder-palette-title,
@@ -948,6 +1010,7 @@
948
1010
  .kywi-admin-shell .kywi-admin-form-actions,
949
1011
  .kywi-admin-shell .kywi-admin-oauth-form-actions,
950
1012
  .kywi-admin-shell .kywi-admin-apikey-form-actions,
1013
+ .kywi-admin-shell .kywi-admin-webhook-form-actions,
951
1014
  .kywi-admin-shell .kywi-changeset-actions,
952
1015
  .kywi-admin-shell .kywi-approval-actions,
953
1016
  .kywi-admin-shell .kywi-approval-buttons,
@@ -982,6 +1045,8 @@
982
1045
  .kywi-admin-shell .kywi-version-table,
983
1046
  .kywi-admin-shell .kywi-admin-oauth-table,
984
1047
  .kywi-admin-shell .kywi-admin-apikey-table,
1048
+ .kywi-admin-shell .kywi-admin-webhook-table,
1049
+ .kywi-admin-shell .kywi-admin-webhook-deliveries-table,
985
1050
  .kywi-admin-shell .kywi-permissions-matrix,
986
1051
  .kywi-admin-shell .kywi-site-tree-table {
987
1052
  width: 100%;
@@ -1005,7 +1070,9 @@
1005
1070
  .kywi-admin-shell .kywi-submission-table thead th,
1006
1071
  .kywi-admin-shell .kywi-version-table thead th,
1007
1072
  .kywi-admin-shell .kywi-admin-oauth-table thead th,
1008
- .kywi-admin-shell .kywi-admin-apikey-table thead th {
1073
+ .kywi-admin-shell .kywi-admin-apikey-table thead th,
1074
+ .kywi-admin-shell .kywi-admin-webhook-table thead th,
1075
+ .kywi-admin-shell .kywi-admin-webhook-deliveries-table thead th {
1009
1076
  padding: 10px var(--kywi-space-4);
1010
1077
  text-align: left;
1011
1078
  background: var(--kywi-surface-2);
@@ -1032,7 +1099,9 @@
1032
1099
  .kywi-admin-shell .kywi-submission-table tbody td,
1033
1100
  .kywi-admin-shell .kywi-version-table tbody td,
1034
1101
  .kywi-admin-shell .kywi-admin-oauth-table tbody td,
1035
- .kywi-admin-shell .kywi-admin-apikey-table tbody td {
1102
+ .kywi-admin-shell .kywi-admin-apikey-table tbody td,
1103
+ .kywi-admin-shell .kywi-admin-webhook-table tbody td,
1104
+ .kywi-admin-shell .kywi-admin-webhook-deliveries-table tbody td {
1036
1105
  padding: 11px var(--kywi-space-4);
1037
1106
  border-bottom: 1px solid var(--kywi-border);
1038
1107
  color: var(--kywi-text);
@@ -1259,6 +1328,7 @@
1259
1328
  .kywi-admin-shell .kywi-admin-extension-empty,
1260
1329
  .kywi-admin-shell .kywi-admin-oauth-empty,
1261
1330
  .kywi-admin-shell .kywi-admin-apikey-empty,
1331
+ .kywi-admin-shell .kywi-admin-webhook-empty,
1262
1332
  .kywi-admin-shell .kywi-admin-plugin-empty,
1263
1333
  .kywi-admin-shell .kywi-admin-picker-empty,
1264
1334
  .kywi-admin-shell .kywi-admin-empty-conditions,
@@ -1906,7 +1976,8 @@
1906
1976
  .kywi-admin-shell .kywi-admin-extension-attribute,
1907
1977
  .kywi-admin-shell .kywi-admin-extension-set,
1908
1978
  .kywi-admin-shell .kywi-admin-oauth-scope-label,
1909
- .kywi-admin-shell .kywi-admin-apikey-scope-label {
1979
+ .kywi-admin-shell .kywi-admin-apikey-scope-label,
1980
+ .kywi-admin-shell .kywi-admin-webhook-event-label {
1910
1981
  display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px;
1911
1982
  background: var(--kywi-surface-sunken); border: 1px solid var(--kywi-border);
1912
1983
  border-radius: var(--kywi-radius-sm); font-size: var(--kywi-text-xs); color: var(--kywi-text-muted);
@@ -1921,7 +1992,8 @@
1921
1992
  .kywi-admin-shell .kywi-admin-extension-subtype-name,
1922
1993
  .kywi-admin-shell .kywi-admin-audience-name,
1923
1994
  .kywi-admin-shell .kywi-admin-oauth-count,
1924
- .kywi-admin-shell .kywi-admin-apikey-count { font-weight: var(--kywi-weight-semibold); }
1995
+ .kywi-admin-shell .kywi-admin-apikey-count,
1996
+ .kywi-admin-shell .kywi-admin-webhook-count { font-weight: var(--kywi-weight-semibold); }
1925
1997
  .kywi-admin-shell .kywi-admin-plugin-count,
1926
1998
  .kywi-admin-shell .kywi-admin-extension-count,
1927
1999
  .kywi-admin-shell .kywi-admin-condition-count { font-size: var(--kywi-text-xs); color: var(--kywi-text-muted); }
@@ -2638,12 +2710,18 @@
2638
2710
  background: var(--kywi-text);
2639
2711
  border-radius: 2px;
2640
2712
  }
2713
+ /* On the light mobile bar the wordmark reads directly — no chip needed. */
2641
2714
  .kywi-admin-shell .kywi-admin-mobile-brand {
2642
- font-weight: var(--kywi-weight-bold);
2643
- color: var(--kywi-text);
2644
- letter-spacing: var(--kywi-tracking-tight);
2715
+ display: inline-flex;
2716
+ align-items: center;
2645
2717
  text-decoration: none;
2646
2718
  }
2719
+ .kywi-admin-shell .kywi-admin-mobile-logo {
2720
+ display: block;
2721
+ width: 128px;
2722
+ aspect-ratio: 1638 / 382;
2723
+ }
2724
+ .kywi-admin-shell .kywi-admin-mobile-logo > svg { display: block; width: 100%; height: 100%; }
2647
2725
 
2648
2726
  /* Full-width content column with tighter gutters. */
2649
2727
  .kywi-admin-shell .kywi-admin-main {
@@ -32,6 +32,33 @@ export declare function isSurfaceEnabled(surface: AdminSurface, adminConfig?: Ad
32
32
  * denylist (escape hatch) — only the master `enabled: false` switch can 404 it.
33
33
  */
34
34
  export declare function resolveSurface(segments: string[], adminConfig?: AdminConfigCeiling): SurfaceMatch | null;
35
+ /**
36
+ * Three-state resolution that distinguishes a genuinely UNKNOWN admin path from
37
+ * a KNOWN surface held off by the config ceiling (#58). `resolveSurface` folds
38
+ * both into `null`, which is why the host page's `resolveSurface(...) === null →
39
+ * notFound()` pre-check turned a config-disabled surface into a hard Next 404
40
+ * while a merely runtime-disabled surface got the soft in-shell "disabled"
41
+ * message — same user intent, two different outcomes.
42
+ *
43
+ * With this, the host 404s ONLY `'not-found'` (a real unknown route) and lets a
44
+ * `'config-disabled'` surface fall through to `KywiAdminApp`, which renders the
45
+ * same in-shell message a runtime-disabled surface gets — so both disable paths
46
+ * present consistently in the admin shell. The config ceiling stays a hard
47
+ * ceiling everywhere else: the surface is still hidden from nav, still refuses to
48
+ * mount, and the PUT /admin-features API still rejects re-enabling it.
49
+ */
50
+ export type SurfaceResolution = {
51
+ status: 'ok';
52
+ surface: AdminSurface;
53
+ params: Record<string, string>;
54
+ } | {
55
+ status: 'config-disabled';
56
+ surface: AdminSurface;
57
+ params: Record<string, string>;
58
+ } | {
59
+ status: 'not-found';
60
+ };
61
+ export declare function resolveSurfaceState(segments: string[], adminConfig?: AdminConfigCeiling): SurfaceResolution;
35
62
  /**
36
63
  * The visibility gate used by BOTH the nav derivation (`buildAdminNav`) and the
37
64
  * router's client-side surface gate (`KywiAdminApp`): identical to
@@ -1 +1 @@
1
- {"version":3,"file":"surface-matcher.d.ts","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AA+EtB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CASpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAeT;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CASxG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAOT"}
1
+ {"version":3,"file":"surface-matcher.d.ts","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AA+EtB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CASpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAeT;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CASxG;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACvE;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACpF;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAA;AAE3B,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,CAAC,EAAE,kBAAkB,GAC/B,iBAAiB,CAWnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAOT"}
@@ -153,6 +153,17 @@ export function resolveSurface(segments, adminConfig) {
153
153
  return null;
154
154
  return match;
155
155
  }
156
+ export function resolveSurfaceState(segments, adminConfig) {
157
+ const match = matchSurface(segments);
158
+ if (!match)
159
+ return { status: 'not-found' };
160
+ const gated = isAdminFeaturesSurface(match.surface)
161
+ ? adminConfig?.enabled !== false // escape hatch: only the master switch removes it
162
+ : isSurfaceEnabled(match.surface, adminConfig);
163
+ return gated
164
+ ? { status: 'ok', surface: match.surface, params: match.params }
165
+ : { status: 'config-disabled', surface: match.surface, params: match.params };
166
+ }
156
167
  /**
157
168
  * The visibility gate used by BOTH the nav derivation (`buildAdminNav`) and the
158
169
  * router's client-side surface gate (`KywiAdminApp`): identical to
@@ -1 +1 @@
1
- {"version":3,"file":"surface-matcher.js","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"surface-matcher.js","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,37 @@
1
1
  import type { ApprovalQueueItem } from '../../approval-queue.js';
2
- /** A queue item plus the content-type name needed to build the transition URL. */
2
+ /** A single field-level change shown in the queue's diff view. */
3
+ export interface DiffField {
4
+ field: string;
5
+ oldValue: unknown;
6
+ newValue: unknown;
7
+ }
8
+ /**
9
+ * A queue item plus the routing metadata the actions need. `revisionVersionId`
10
+ * distinguishes a pending revision (applies to a live page) from a plain draft
11
+ * submission; `changedFields`, when present, is the ready-to-render diff.
12
+ */
3
13
  export interface ApprovalItem extends ApprovalQueueItem {
4
14
  contentTypeName: string;
15
+ /** Real content id (for a revision the queue `id` is composite, so keep this). */
16
+ contentId: string;
17
+ /** Present iff this row is a pending revision of published content. */
18
+ revisionVersionId?: string;
19
+ /** Field-level diff (proposed vs current) — inline for revisions. */
20
+ changedFields?: DiffField[];
5
21
  }
6
22
  /**
7
- * Load the pending queue. Submitter ids and the site id are resolved to human
8
- * names via the users/sites lists when available; a failed/forbidden lookup
9
- * degrades to the raw id so the queue still renders. (The Site column value
10
- * doubles as its filter key, so resolving it in place keeps the filter human.)
23
+ * Load the review queue: draft submissions and pending revisions, resolved to
24
+ * human names where possible (a failed lookup degrades to the raw id).
11
25
  */
12
26
  export declare function loadApprovals(): Promise<ApprovalItem[]>;
13
- /** Approve a submission: version + publish it via the engine workflow. */
14
- export declare function approveSubmission(contentTypeName: string, id: string, comment?: string): Promise<void>;
15
- /** Reject a submission back to draft, recording the comment as the reason. */
16
- export declare function rejectSubmission(contentTypeName: string, id: string, comment?: string): Promise<void>;
27
+ /**
28
+ * Load the field-level diff for a plain draft submission on demand — the two
29
+ * most recent versions (submitted state vs the prior one). Returns [] when there
30
+ * is nothing to compare (a first submission with a single version).
31
+ */
32
+ export declare function loadSubmissionDiff(contentTypeName: string, contentId: string): Promise<DiffField[]>;
33
+ /** Approve an item: apply the revision, or version+publish the draft submission. */
34
+ export declare function approveSubmission(item: ApprovalItem, comment?: string): Promise<void>;
35
+ /** Reject an item, recording the comment as the reason the editor will see. */
36
+ export declare function rejectSubmission(item: ApprovalItem, comment?: string): Promise<void>;
17
37
  //# sourceMappingURL=approvals-data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"approvals-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAehE,kFAAkF;AAClF,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,eAAe,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAoB7D;AAED,0EAA0E;AAC1E,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,8EAA8E;AAC9E,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf"}
1
+ {"version":3,"file":"approvals-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAkCD;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,eAAe,EAAE,MAAM,CAAA;IACvB,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qEAAqE;IACrE,aAAa,CAAC,EAAE,SAAS,EAAE,CAAA;CAC5B;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CA4C7D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,EAAE,CAAC,CAWtB;AAED,oFAAoF;AACpF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3F;AAED,+EAA+E;AAC/E,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F"}
@@ -1,34 +1,38 @@
1
1
  /**
2
- * Data helpers for the Approvals surface (`/admin/approvals`) — 0.2.0 T6
3
- * migration.
2
+ * Data helpers for the Approvals surface (`/admin/approvals`).
4
3
  *
5
- * Ported verbatim from `apps/reference/app/admin/approvals/approvals-data.ts`;
6
- * only the import source changes: `getJson`/`sendJson`/`loadUserDisplayMap`/
7
- * `loadSiteDisplayMap` now come directly from `@kywi-software/core/host-client`
8
- * instead of the app's `lib/admin-api` re-export shim.
4
+ * The queue has two sources, both editor+:
5
+ * - GET /content/pending draft content submitted for review (draft→pending).
6
+ * - GET /content/revisions/pending pending REVISIONS of already-published
7
+ * content (#42): the live page keeps serving while the proposed edit waits
8
+ * here. Each revision carries the field-level diff (proposed vs live) so the
9
+ * approver is never approving blind (#45.1).
9
10
  *
10
- * Pending submissions come from GET /content/pending (editor+). Approving from
11
- * the queue publishes in one engine transition (approve route with
12
- * `{ publish: true }`) so the content is both versioned and made live.
13
- * Rejecting sends it back to draft with the comment as the reason.
11
+ * Approving a draft submission publishes it in one engine transition (approve
12
+ * with `{ publish: true }`); approving a revision applies its snapshot to the
13
+ * live content. Rejecting either records the comment as the reason the editor
14
+ * then sees on the edit screen (#45.2).
14
15
  */
15
16
  import { getJson, sendJson, loadUserDisplayMap, loadSiteDisplayMap } from '../../../host-client/index.js';
16
17
  /**
17
- * Load the pending queue. Submitter ids and the site id are resolved to human
18
- * names via the users/sites lists when available; a failed/forbidden lookup
19
- * degrades to the raw id so the queue still renders. (The Site column value
20
- * doubles as its filter key, so resolving it in place keeps the filter human.)
18
+ * Load the review queue: draft submissions and pending revisions, resolved to
19
+ * human names where possible (a failed lookup degrades to the raw id).
21
20
  */
22
21
  export async function loadApprovals() {
23
- const [rows, userMap, siteMap] = await Promise.all([
22
+ const [rows, revisions, userMap, siteMap] = await Promise.all([
23
+ // The draft-submission source drives the surface's error state (unchanged);
24
+ // the revisions source degrades to empty so an unavailable endpoint (older
25
+ // host, forbidden) never blanks the whole queue.
24
26
  getJson('/api/v1/content/pending'),
27
+ getJson('/api/v1/content/revisions/pending').catch(() => []),
25
28
  loadUserDisplayMap(),
26
29
  loadSiteDisplayMap(),
27
30
  ]);
28
- return rows.map(row => {
31
+ const drafts = rows.map(row => {
29
32
  const submitterId = row.updatedBy ?? row.createdBy ?? '';
30
33
  return {
31
34
  id: row.id,
35
+ contentId: row.id,
32
36
  title: row.title,
33
37
  contentType: row.contentTypeName,
34
38
  contentTypeName: row.contentTypeName,
@@ -38,17 +42,56 @@ export async function loadApprovals() {
38
42
  status: 'pending',
39
43
  };
40
44
  });
45
+ const revs = revisions.map(rev => {
46
+ const submitterId = rev.submittedBy ?? '';
47
+ return {
48
+ id: `rev:${rev.versionId}`,
49
+ contentId: rev.contentId,
50
+ title: `${rev.title} (revision)`,
51
+ contentType: rev.contentTypeName,
52
+ contentTypeName: rev.contentTypeName,
53
+ siteId: siteMap.get(rev.siteId) ?? rev.siteId,
54
+ submittedBy: userMap.get(submitterId) ?? submitterId,
55
+ submittedAt: rev.submittedAt,
56
+ status: 'pending',
57
+ revisionVersionId: rev.versionId,
58
+ changedFields: rev.changedFields ?? [],
59
+ };
60
+ });
61
+ return [...revs, ...drafts];
62
+ }
63
+ /**
64
+ * Load the field-level diff for a plain draft submission on demand — the two
65
+ * most recent versions (submitted state vs the prior one). Returns [] when there
66
+ * is nothing to compare (a first submission with a single version).
67
+ */
68
+ export async function loadSubmissionDiff(contentTypeName, contentId) {
69
+ const versions = await getJson(`/api/v1/content/${contentTypeName}/${contentId}/versions`).catch(() => []);
70
+ if (versions.length < 2)
71
+ return [];
72
+ const sorted = [...versions].sort((a, b) => b.version - a.version);
73
+ const to = sorted[0].version;
74
+ const from = sorted[1].version;
75
+ return getJson(`/api/v1/content/${contentTypeName}/${contentId}/versions/diff?from=${from}&to=${to}`).catch(() => []);
41
76
  }
42
- /** Approve a submission: version + publish it via the engine workflow. */
43
- export async function approveSubmission(contentTypeName, id, comment) {
44
- await sendJson(`/api/v1/content/${contentTypeName}/${id}/approve`, 'POST', {
77
+ /** Approve an item: apply the revision, or version+publish the draft submission. */
78
+ export async function approveSubmission(item, comment) {
79
+ if (item.revisionVersionId) {
80
+ await sendJson(`/api/v1/content/${item.contentTypeName}/${item.contentId}/revisions/${item.revisionVersionId}/approve`, 'POST', {});
81
+ return;
82
+ }
83
+ await sendJson(`/api/v1/content/${item.contentTypeName}/${item.contentId}/approve`, 'POST', {
45
84
  publish: true,
46
85
  ...(comment ? { comment } : {}),
47
86
  });
48
87
  }
49
- /** Reject a submission back to draft, recording the comment as the reason. */
50
- export async function rejectSubmission(contentTypeName, id, comment) {
51
- await sendJson(`/api/v1/content/${contentTypeName}/${id}/reject`, 'POST', {
88
+ /** Reject an item, recording the comment as the reason the editor will see. */
89
+ export async function rejectSubmission(item, comment) {
90
+ if (item.revisionVersionId) {
91
+ await sendJson(`/api/v1/content/${item.contentTypeName}/${item.contentId}/revisions/${item.revisionVersionId}/reject`, 'POST', { ...(comment ? { reason: comment } : {}) });
92
+ return;
93
+ }
94
+ await sendJson(`/api/v1/content/${item.contentTypeName}/${item.contentId}/reject`, 'POST', {
52
95
  ...(comment ? { reason: comment } : {}),
53
96
  });
54
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"approvals-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAqBzG;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,OAAO,CAAsB,yBAAyB,CAAC;QACvD,kBAAkB,EAAE;QACpB,kBAAkB,EAAE;KACrB,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACpB,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAA;QACxD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,eAAe;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM;YAC7C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW;YACpD,WAAW,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS;YAC3C,MAAM,EAAE,SAAkB;SAC3B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,eAAuB,EACvB,EAAU,EACV,OAAgB;IAEhB,MAAM,QAAQ,CAAC,mBAAmB,eAAe,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE;QACzE,OAAO,EAAE,IAAI;QACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,eAAuB,EACvB,EAAU,EACV,OAAgB;IAEhB,MAAM,QAAQ,CAAC,mBAAmB,eAAe,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE;QACxE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"approvals-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"approvals-index.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-index.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,MAAM,EAAE,YAAY,2CAsFjE"}
1
+ {"version":3,"file":"approvals-index.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AA6BrD,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,MAAM,EAAE,YAAY,2CA2KjE"}