@aphexcms/cms-core 9.3.0 → 9.5.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 (431) hide show
  1. package/dist/admin/block-previews.svelte.d.ts +46 -0
  2. package/dist/admin/block-previews.svelte.d.ts.map +1 -0
  3. package/dist/admin/block-previews.svelte.js +26 -0
  4. package/dist/admin/field-components.svelte.d.ts +16 -0
  5. package/dist/admin/field-components.svelte.d.ts.map +1 -0
  6. package/dist/admin/field-components.svelte.js +18 -0
  7. package/dist/admin/nav.svelte.d.ts +34 -0
  8. package/dist/admin/nav.svelte.d.ts.map +1 -0
  9. package/dist/admin/nav.svelte.js +78 -0
  10. package/dist/admin/slots.svelte.d.ts +50 -0
  11. package/dist/admin/slots.svelte.d.ts.map +1 -0
  12. package/dist/admin/slots.svelte.js +67 -0
  13. package/dist/admin/types.d.ts +7 -0
  14. package/dist/admin/types.d.ts.map +1 -0
  15. package/dist/admin/types.js +1 -0
  16. package/dist/api/schemas/api-keys.d.ts +4 -37
  17. package/dist/api/schemas/api-keys.d.ts.map +1 -1
  18. package/dist/api/schemas/api-keys.js +5 -2
  19. package/dist/api/schemas/assets.d.ts +4 -0
  20. package/dist/api/schemas/assets.d.ts.map +1 -1
  21. package/dist/api/schemas/assets.js +3 -0
  22. package/dist/api/schemas/plugin-settings.d.ts +6 -0
  23. package/dist/api/schemas/plugin-settings.d.ts.map +1 -0
  24. package/dist/api/schemas/plugin-settings.js +8 -0
  25. package/dist/api/schemas/roles.d.ts +7 -56
  26. package/dist/api/schemas/roles.d.ts.map +1 -1
  27. package/dist/api/schemas/roles.js +11 -6
  28. package/dist/api/schemas/user.d.ts +2 -1
  29. package/dist/api/schemas/user.d.ts.map +1 -1
  30. package/dist/api/schemas/user.js +7 -2
  31. package/dist/app-augment.d.ts +11 -0
  32. package/dist/app-augment.d.ts.map +1 -1
  33. package/dist/app.d.ts +2 -0
  34. package/dist/auth/provider.d.ts +3 -0
  35. package/dist/auth/provider.d.ts.map +1 -1
  36. package/dist/cli/generate-types.d.ts +10 -5
  37. package/dist/cli/generate-types.d.ts.map +1 -1
  38. package/dist/cli/generate-types.js +117 -77
  39. package/dist/cli/generate-types.js.map +1 -1
  40. package/dist/cli/index.js +5 -5
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/cli/migrate.d.ts +1 -1
  43. package/dist/cli/migrate.d.ts.map +1 -1
  44. package/dist/cli/migrate.js +27 -2
  45. package/dist/cli/migrate.js.map +1 -1
  46. package/dist/client/index.d.ts +6 -0
  47. package/dist/client/index.d.ts.map +1 -1
  48. package/dist/client/index.js +9 -0
  49. package/dist/components/AdminApp.svelte +271 -113
  50. package/dist/components/AdminApp.svelte.d.ts +18 -2
  51. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  52. package/dist/components/admin/AdminSlot.svelte +18 -0
  53. package/dist/components/admin/AdminSlot.svelte.d.ts +12 -0
  54. package/dist/components/admin/AdminSlot.svelte.d.ts.map +1 -0
  55. package/dist/components/admin/DocumentEditor.svelte +646 -385
  56. package/dist/components/admin/DocumentEditor.svelte.d.ts +13 -0
  57. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  58. package/dist/components/admin/MediaBrowser.svelte +13 -3
  59. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  60. package/dist/components/admin/PluginSettingsPanel.svelte +231 -0
  61. package/dist/components/admin/PluginSettingsPanel.svelte.d.ts +8 -0
  62. package/dist/components/admin/PluginSettingsPanel.svelte.d.ts.map +1 -0
  63. package/dist/components/admin/SchemaField.svelte +76 -95
  64. package/dist/components/admin/SchemaField.svelte.d.ts +7 -0
  65. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
  66. package/dist/components/admin/fields/ArrayField.svelte +24 -2
  67. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
  68. package/dist/components/admin/fields/FieldInput.svelte +109 -0
  69. package/dist/components/admin/fields/FieldInput.svelte.d.ts +17 -0
  70. package/dist/components/admin/fields/FieldInput.svelte.d.ts.map +1 -0
  71. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +5 -12
  72. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts +2 -9
  73. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts.map +1 -1
  74. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte +18 -17
  75. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts +2 -9
  76. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts.map +1 -1
  77. package/dist/components/admin/fields/richtext/RichtextField.svelte +55 -2
  78. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -1
  79. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts +7 -0
  80. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -1
  81. package/dist/components/admin/fields/richtext/portable-text-object-node.js +4 -2
  82. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts +16 -1
  83. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
  84. package/dist/components/admin/fields/richtext/svelte-node-view.js +20 -1
  85. package/dist/components/layout/OrganizationSwitcher.svelte +31 -10
  86. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -1
  87. package/dist/components/layout/Sidebar.svelte +49 -11
  88. package/dist/components/layout/Sidebar.svelte.d.ts +5 -1
  89. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
  90. package/dist/components/layout/sidebar/AppSidebar.svelte +66 -3
  91. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +5 -0
  92. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -1
  93. package/dist/components/layout/sidebar/NavMain.svelte +3 -2
  94. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +4 -3
  95. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -1
  96. package/dist/components/layout/sidebar/NavUser.svelte +5 -1
  97. package/dist/config.d.ts.map +1 -1
  98. package/dist/config.js +11 -0
  99. package/dist/db/interfaces/asset.d.ts +1 -0
  100. package/dist/db/interfaces/asset.d.ts.map +1 -1
  101. package/dist/db/interfaces/index.d.ts +3 -1
  102. package/dist/db/interfaces/index.d.ts.map +1 -1
  103. package/dist/db/interfaces/plugin-settings.d.ts +23 -0
  104. package/dist/db/interfaces/plugin-settings.d.ts.map +1 -0
  105. package/dist/db/interfaces/plugin-settings.js +13 -0
  106. package/dist/db/interfaces/role.d.ts +14 -5
  107. package/dist/db/interfaces/role.d.ts.map +1 -1
  108. package/dist/engine.d.ts +28 -0
  109. package/dist/engine.d.ts.map +1 -1
  110. package/dist/engine.js +44 -0
  111. package/dist/field-validation/utils.d.ts +15 -0
  112. package/dist/field-validation/utils.d.ts.map +1 -1
  113. package/dist/field-validation/utils.js +74 -0
  114. package/dist/graphql/resolvers.d.ts.map +1 -1
  115. package/dist/graphql/resolvers.js +9 -10
  116. package/dist/graphql/schema.d.ts.map +1 -1
  117. package/dist/graphql/schema.js +18 -19
  118. package/dist/hooks.d.ts +6 -0
  119. package/dist/hooks.d.ts.map +1 -1
  120. package/dist/hooks.js +59 -2
  121. package/dist/index.d.ts +2 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +5 -0
  124. package/dist/lib/admin/block-previews.svelte.d.ts +46 -0
  125. package/dist/lib/admin/block-previews.svelte.d.ts.map +1 -0
  126. package/dist/lib/admin/block-previews.svelte.js +27 -0
  127. package/dist/lib/admin/block-previews.svelte.js.map +1 -0
  128. package/dist/lib/admin/field-components.svelte.d.ts +16 -0
  129. package/dist/lib/admin/field-components.svelte.d.ts.map +1 -0
  130. package/dist/lib/admin/field-components.svelte.js +19 -0
  131. package/dist/lib/admin/field-components.svelte.js.map +1 -0
  132. package/dist/lib/admin/nav.svelte.d.ts +34 -0
  133. package/dist/lib/admin/nav.svelte.d.ts.map +1 -0
  134. package/dist/lib/admin/nav.svelte.js +79 -0
  135. package/dist/lib/admin/nav.svelte.js.map +1 -0
  136. package/dist/lib/admin/slots.svelte.d.ts +50 -0
  137. package/dist/lib/admin/slots.svelte.d.ts.map +1 -0
  138. package/dist/lib/admin/slots.svelte.js +68 -0
  139. package/dist/lib/admin/slots.svelte.js.map +1 -0
  140. package/dist/lib/admin/types.d.ts +7 -0
  141. package/dist/lib/admin/types.d.ts.map +1 -0
  142. package/dist/lib/admin/types.js +2 -0
  143. package/dist/lib/admin/types.js.map +1 -0
  144. package/dist/lib/api/schemas/api-keys.d.ts +4 -37
  145. package/dist/lib/api/schemas/api-keys.d.ts.map +1 -1
  146. package/dist/lib/api/schemas/api-keys.js +5 -2
  147. package/dist/lib/api/schemas/api-keys.js.map +1 -1
  148. package/dist/lib/api/schemas/assets.d.ts +4 -0
  149. package/dist/lib/api/schemas/assets.d.ts.map +1 -1
  150. package/dist/lib/api/schemas/assets.js +3 -0
  151. package/dist/lib/api/schemas/assets.js.map +1 -1
  152. package/dist/lib/api/schemas/plugin-settings.d.ts +6 -0
  153. package/dist/lib/api/schemas/plugin-settings.d.ts.map +1 -0
  154. package/dist/lib/api/schemas/plugin-settings.js +9 -0
  155. package/dist/lib/api/schemas/plugin-settings.js.map +1 -0
  156. package/dist/lib/api/schemas/roles.d.ts +7 -56
  157. package/dist/lib/api/schemas/roles.d.ts.map +1 -1
  158. package/dist/lib/api/schemas/roles.js +11 -6
  159. package/dist/lib/api/schemas/roles.js.map +1 -1
  160. package/dist/lib/api/schemas/user.d.ts +2 -1
  161. package/dist/lib/api/schemas/user.d.ts.map +1 -1
  162. package/dist/lib/api/schemas/user.js +7 -2
  163. package/dist/lib/api/schemas/user.js.map +1 -1
  164. package/dist/lib/app-augment.d.ts +11 -0
  165. package/dist/lib/app-augment.d.ts.map +1 -1
  166. package/dist/lib/auth/provider.d.ts +3 -0
  167. package/dist/lib/auth/provider.d.ts.map +1 -1
  168. package/dist/lib/client/index.d.ts +6 -0
  169. package/dist/lib/client/index.d.ts.map +1 -1
  170. package/dist/lib/client/index.js +9 -0
  171. package/dist/lib/client/index.js.map +1 -1
  172. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts +7 -0
  173. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -1
  174. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js +4 -2
  175. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js.map +1 -1
  176. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts +16 -1
  177. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -1
  178. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js +20 -1
  179. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js.map +1 -1
  180. package/dist/lib/config.d.ts.map +1 -1
  181. package/dist/lib/config.js +11 -0
  182. package/dist/lib/config.js.map +1 -1
  183. package/dist/lib/db/interfaces/asset.d.ts +1 -0
  184. package/dist/lib/db/interfaces/asset.d.ts.map +1 -1
  185. package/dist/lib/db/interfaces/index.d.ts +3 -1
  186. package/dist/lib/db/interfaces/index.d.ts.map +1 -1
  187. package/dist/lib/db/interfaces/plugin-settings.d.ts +23 -0
  188. package/dist/lib/db/interfaces/plugin-settings.d.ts.map +1 -0
  189. package/dist/lib/db/interfaces/plugin-settings.js +14 -0
  190. package/dist/lib/db/interfaces/plugin-settings.js.map +1 -0
  191. package/dist/lib/db/interfaces/role.d.ts +14 -5
  192. package/dist/lib/db/interfaces/role.d.ts.map +1 -1
  193. package/dist/lib/engine.d.ts +28 -0
  194. package/dist/lib/engine.d.ts.map +1 -1
  195. package/dist/lib/engine.js +44 -0
  196. package/dist/lib/engine.js.map +1 -1
  197. package/dist/lib/field-validation/utils.d.ts +15 -0
  198. package/dist/lib/field-validation/utils.d.ts.map +1 -1
  199. package/dist/lib/field-validation/utils.js +74 -0
  200. package/dist/lib/field-validation/utils.js.map +1 -1
  201. package/dist/lib/graphql/resolvers.d.ts.map +1 -1
  202. package/dist/lib/graphql/resolvers.js +9 -10
  203. package/dist/lib/graphql/resolvers.js.map +1 -1
  204. package/dist/lib/graphql/schema.d.ts.map +1 -1
  205. package/dist/lib/graphql/schema.js +18 -19
  206. package/dist/lib/graphql/schema.js.map +1 -1
  207. package/dist/lib/hooks.d.ts +6 -0
  208. package/dist/lib/hooks.d.ts.map +1 -1
  209. package/dist/lib/hooks.js +59 -2
  210. package/dist/lib/hooks.js.map +1 -1
  211. package/dist/lib/index.d.ts +2 -0
  212. package/dist/lib/index.d.ts.map +1 -1
  213. package/dist/lib/index.js +5 -0
  214. package/dist/lib/index.js.map +1 -1
  215. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  216. package/dist/lib/local-api/collection-api.js +4 -2
  217. package/dist/lib/local-api/collection-api.js.map +1 -1
  218. package/dist/lib/local-api/types.d.ts +8 -0
  219. package/dist/lib/local-api/types.d.ts.map +1 -1
  220. package/dist/lib/mcp/tools.d.ts.map +1 -1
  221. package/dist/lib/mcp/tools.js +110 -1
  222. package/dist/lib/mcp/tools.js.map +1 -1
  223. package/dist/lib/permissions-context.svelte.d.ts +7 -4
  224. package/dist/lib/permissions-context.svelte.d.ts.map +1 -1
  225. package/dist/lib/permissions-context.svelte.js.map +1 -1
  226. package/dist/lib/plugins/index.d.ts +3 -0
  227. package/dist/lib/plugins/index.d.ts.map +1 -0
  228. package/dist/lib/plugins/index.js +3 -0
  229. package/dist/lib/plugins/index.js.map +1 -0
  230. package/dist/lib/plugins/resolver.d.ts +49 -0
  231. package/dist/lib/plugins/resolver.d.ts.map +1 -0
  232. package/dist/lib/plugins/resolver.js +66 -0
  233. package/dist/lib/plugins/resolver.js.map +1 -0
  234. package/dist/lib/plugins/types.d.ts +233 -0
  235. package/dist/lib/plugins/types.d.ts.map +1 -0
  236. package/dist/lib/plugins/types.js +9 -0
  237. package/dist/lib/plugins/types.js.map +1 -0
  238. package/dist/lib/schema-utils/desugar.d.ts +27 -0
  239. package/dist/lib/schema-utils/desugar.d.ts.map +1 -0
  240. package/dist/lib/schema-utils/desugar.js +102 -0
  241. package/dist/lib/schema-utils/desugar.js.map +1 -0
  242. package/dist/lib/schema-utils/index.d.ts +2 -0
  243. package/dist/lib/schema-utils/index.d.ts.map +1 -1
  244. package/dist/lib/schema-utils/index.js +2 -0
  245. package/dist/lib/schema-utils/index.js.map +1 -1
  246. package/dist/lib/schema-utils/settings.d.ts +17 -0
  247. package/dist/lib/schema-utils/settings.d.ts.map +1 -0
  248. package/dist/lib/schema-utils/settings.js +23 -0
  249. package/dist/lib/schema-utils/settings.js.map +1 -0
  250. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  251. package/dist/lib/schema-utils/validator.js +11 -0
  252. package/dist/lib/schema-utils/validator.js.map +1 -1
  253. package/dist/lib/security/secret-crypto.d.ts +18 -0
  254. package/dist/lib/security/secret-crypto.d.ts.map +1 -0
  255. package/dist/lib/security/secret-crypto.js +71 -0
  256. package/dist/lib/security/secret-crypto.js.map +1 -0
  257. package/dist/lib/server/api/index.d.ts.map +1 -1
  258. package/dist/lib/server/api/index.js +3 -0
  259. package/dist/lib/server/api/index.js.map +1 -1
  260. package/dist/lib/server/api/routes/assets.d.ts.map +1 -1
  261. package/dist/lib/server/api/routes/assets.js +8 -2
  262. package/dist/lib/server/api/routes/assets.js.map +1 -1
  263. package/dist/lib/server/api/routes/organizations.d.ts.map +1 -1
  264. package/dist/lib/server/api/routes/organizations.js +4 -1
  265. package/dist/lib/server/api/routes/organizations.js.map +1 -1
  266. package/dist/lib/server/api/routes/plugin-settings.d.ts +4 -0
  267. package/dist/lib/server/api/routes/plugin-settings.d.ts.map +1 -0
  268. package/dist/lib/server/api/routes/plugin-settings.js +109 -0
  269. package/dist/lib/server/api/routes/plugin-settings.js.map +1 -0
  270. package/dist/lib/server/api/routes/roles.d.ts.map +1 -1
  271. package/dist/lib/server/api/routes/roles.js +37 -0
  272. package/dist/lib/server/api/routes/roles.js.map +1 -1
  273. package/dist/lib/server/api/routes/user.d.ts.map +1 -1
  274. package/dist/lib/server/api/routes/user.js +14 -3
  275. package/dist/lib/server/api/routes/user.js.map +1 -1
  276. package/dist/lib/services/asset-service.d.ts +1 -0
  277. package/dist/lib/services/asset-service.d.ts.map +1 -1
  278. package/dist/lib/services/asset-service.js.map +1 -1
  279. package/dist/lib/services/index.d.ts +2 -0
  280. package/dist/lib/services/index.d.ts.map +1 -1
  281. package/dist/lib/services/index.js +1 -0
  282. package/dist/lib/services/index.js.map +1 -1
  283. package/dist/lib/services/plugin-settings-service.d.ts +76 -0
  284. package/dist/lib/services/plugin-settings-service.d.ts.map +1 -0
  285. package/dist/lib/services/plugin-settings-service.js +236 -0
  286. package/dist/lib/services/plugin-settings-service.js.map +1 -0
  287. package/dist/lib/services/roles-service.d.ts +2 -2
  288. package/dist/lib/services/roles-service.d.ts.map +1 -1
  289. package/dist/lib/services/roles-service.js.map +1 -1
  290. package/dist/lib/theme/css.d.ts +30 -0
  291. package/dist/lib/theme/css.d.ts.map +1 -0
  292. package/dist/lib/theme/css.js +54 -0
  293. package/dist/lib/theme/css.js.map +1 -0
  294. package/dist/lib/theme/derive.d.ts +27 -0
  295. package/dist/lib/theme/derive.d.ts.map +1 -0
  296. package/dist/lib/theme/derive.js +108 -0
  297. package/dist/lib/theme/derive.js.map +1 -0
  298. package/dist/lib/theme/index.d.ts +5 -0
  299. package/dist/lib/theme/index.d.ts.map +1 -0
  300. package/dist/lib/theme/index.js +5 -0
  301. package/dist/lib/theme/index.js.map +1 -0
  302. package/dist/lib/theme/schemes.d.ts +60 -0
  303. package/dist/lib/theme/schemes.d.ts.map +1 -0
  304. package/dist/lib/theme/schemes.js +150 -0
  305. package/dist/lib/theme/schemes.js.map +1 -0
  306. package/dist/lib/theme/tokens.d.ts +57 -0
  307. package/dist/lib/theme/tokens.d.ts.map +1 -0
  308. package/dist/lib/theme/tokens.js +11 -0
  309. package/dist/lib/theme/tokens.js.map +1 -0
  310. package/dist/lib/types/auth.d.ts +10 -10
  311. package/dist/lib/types/auth.d.ts.map +1 -1
  312. package/dist/lib/types/capabilities.d.ts +50 -9
  313. package/dist/lib/types/capabilities.d.ts.map +1 -1
  314. package/dist/lib/types/capabilities.js +147 -5
  315. package/dist/lib/types/capabilities.js.map +1 -1
  316. package/dist/lib/types/config.d.ts +30 -1
  317. package/dist/lib/types/config.d.ts.map +1 -1
  318. package/dist/lib/types/schemas.d.ts +90 -2
  319. package/dist/lib/types/schemas.d.ts.map +1 -1
  320. package/dist/lib/types/schemas.js.map +1 -1
  321. package/dist/lib/types/sidebar.d.ts +3 -1
  322. package/dist/lib/types/sidebar.d.ts.map +1 -1
  323. package/dist/lib/utils/index.d.ts +1 -0
  324. package/dist/lib/utils/index.d.ts.map +1 -1
  325. package/dist/lib/utils/index.js +1 -0
  326. package/dist/lib/utils/index.js.map +1 -1
  327. package/dist/lib/utils/preview.d.ts +16 -5
  328. package/dist/lib/utils/preview.d.ts.map +1 -1
  329. package/dist/lib/utils/preview.js +7 -2
  330. package/dist/lib/utils/preview.js.map +1 -1
  331. package/dist/lib/utils/string-case.d.ts +21 -0
  332. package/dist/lib/utils/string-case.d.ts.map +1 -0
  333. package/dist/lib/utils/string-case.js +26 -0
  334. package/dist/lib/utils/string-case.js.map +1 -0
  335. package/dist/lib/vite/index.d.ts +7 -0
  336. package/dist/lib/vite/index.d.ts.map +1 -1
  337. package/dist/lib/vite/index.js +37 -6
  338. package/dist/lib/vite/index.js.map +1 -1
  339. package/dist/local-api/collection-api.d.ts.map +1 -1
  340. package/dist/local-api/collection-api.js +4 -2
  341. package/dist/local-api/types.d.ts +8 -0
  342. package/dist/local-api/types.d.ts.map +1 -1
  343. package/dist/mcp/tools.d.ts.map +1 -1
  344. package/dist/mcp/tools.js +110 -1
  345. package/dist/permissions-context.svelte.d.ts +7 -4
  346. package/dist/permissions-context.svelte.d.ts.map +1 -1
  347. package/dist/plugins/index.d.ts +3 -0
  348. package/dist/plugins/index.d.ts.map +1 -0
  349. package/dist/plugins/index.js +2 -0
  350. package/dist/plugins/resolver.d.ts +49 -0
  351. package/dist/plugins/resolver.d.ts.map +1 -0
  352. package/dist/plugins/resolver.js +65 -0
  353. package/dist/plugins/types.d.ts +233 -0
  354. package/dist/plugins/types.d.ts.map +1 -0
  355. package/dist/plugins/types.js +8 -0
  356. package/dist/schema-utils/desugar.d.ts +27 -0
  357. package/dist/schema-utils/desugar.d.ts.map +1 -0
  358. package/dist/schema-utils/desugar.js +101 -0
  359. package/dist/schema-utils/index.d.ts +2 -0
  360. package/dist/schema-utils/index.d.ts.map +1 -1
  361. package/dist/schema-utils/index.js +2 -0
  362. package/dist/schema-utils/settings.d.ts +17 -0
  363. package/dist/schema-utils/settings.d.ts.map +1 -0
  364. package/dist/schema-utils/settings.js +22 -0
  365. package/dist/schema-utils/validator.d.ts.map +1 -1
  366. package/dist/schema-utils/validator.js +11 -0
  367. package/dist/security/secret-crypto.d.ts +18 -0
  368. package/dist/security/secret-crypto.d.ts.map +1 -0
  369. package/dist/security/secret-crypto.js +70 -0
  370. package/dist/server/api/index.d.ts.map +1 -1
  371. package/dist/server/api/index.js +3 -0
  372. package/dist/server/api/routes/assets.d.ts.map +1 -1
  373. package/dist/server/api/routes/assets.js +8 -2
  374. package/dist/server/api/routes/organizations.d.ts.map +1 -1
  375. package/dist/server/api/routes/organizations.js +4 -1
  376. package/dist/server/api/routes/plugin-settings.d.ts +4 -0
  377. package/dist/server/api/routes/plugin-settings.d.ts.map +1 -0
  378. package/dist/server/api/routes/plugin-settings.js +108 -0
  379. package/dist/server/api/routes/roles.d.ts.map +1 -1
  380. package/dist/server/api/routes/roles.js +37 -0
  381. package/dist/server/api/routes/user.d.ts.map +1 -1
  382. package/dist/server/api/routes/user.js +14 -3
  383. package/dist/services/asset-service.d.ts +1 -0
  384. package/dist/services/asset-service.d.ts.map +1 -1
  385. package/dist/services/index.d.ts +2 -0
  386. package/dist/services/index.d.ts.map +1 -1
  387. package/dist/services/index.js +1 -0
  388. package/dist/services/plugin-settings-service.d.ts +76 -0
  389. package/dist/services/plugin-settings-service.d.ts.map +1 -0
  390. package/dist/services/plugin-settings-service.js +235 -0
  391. package/dist/services/roles-service.d.ts +2 -2
  392. package/dist/services/roles-service.d.ts.map +1 -1
  393. package/dist/theme/css.d.ts +30 -0
  394. package/dist/theme/css.d.ts.map +1 -0
  395. package/dist/theme/css.js +53 -0
  396. package/dist/theme/derive.d.ts +27 -0
  397. package/dist/theme/derive.d.ts.map +1 -0
  398. package/dist/theme/derive.js +107 -0
  399. package/dist/theme/index.d.ts +5 -0
  400. package/dist/theme/index.d.ts.map +1 -0
  401. package/dist/theme/index.js +4 -0
  402. package/dist/theme/schemes.d.ts +60 -0
  403. package/dist/theme/schemes.d.ts.map +1 -0
  404. package/dist/theme/schemes.js +149 -0
  405. package/dist/theme/tokens.d.ts +57 -0
  406. package/dist/theme/tokens.d.ts.map +1 -0
  407. package/dist/theme/tokens.js +10 -0
  408. package/dist/types/auth.d.ts +10 -10
  409. package/dist/types/auth.d.ts.map +1 -1
  410. package/dist/types/capabilities.d.ts +50 -9
  411. package/dist/types/capabilities.d.ts.map +1 -1
  412. package/dist/types/capabilities.js +147 -5
  413. package/dist/types/config.d.ts +30 -1
  414. package/dist/types/config.d.ts.map +1 -1
  415. package/dist/types/schemas.d.ts +90 -2
  416. package/dist/types/schemas.d.ts.map +1 -1
  417. package/dist/types/sidebar.d.ts +3 -1
  418. package/dist/types/sidebar.d.ts.map +1 -1
  419. package/dist/utils/index.d.ts +1 -0
  420. package/dist/utils/index.d.ts.map +1 -1
  421. package/dist/utils/index.js +1 -0
  422. package/dist/utils/preview.d.ts +16 -5
  423. package/dist/utils/preview.d.ts.map +1 -1
  424. package/dist/utils/preview.js +7 -2
  425. package/dist/utils/string-case.d.ts +21 -0
  426. package/dist/utils/string-case.d.ts.map +1 -0
  427. package/dist/utils/string-case.js +25 -0
  428. package/dist/vite/index.d.ts +7 -0
  429. package/dist/vite/index.d.ts.map +1 -1
  430. package/dist/vite/index.js +37 -6
  431. package/package.json +6 -4
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,sFAAsF;AACtF,KAAK,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7F,OAAO,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,oGAAoG;AACpG,SAAS,kBAAkB;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC9D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAC5E,IAAI,OAAO,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;QACvC,OAAO,gBAAgB,OAAO,IAAI,MAAM,IAAI,WAAW,IAAI,kBAAkB,IAAI,OAAO,IAAI,WAAW,IAAI,OAAO,IAAI,MAAM,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;IAC1J,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAA0B,EAAE;IAC/D,4FAA4F;IAC5F,6FAA6F;IAC7F,mDAAmD;IACnD,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC/C,IAAI,CAAC;YACJ,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACR,+CAA+C;QAChD,CAAC;IACF,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,gBAAgB,IAAI,WAAW,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC/C,MAAM,SAAS,GACd,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IAEnF,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,IAAI,eAAe,CAAC,CAAC;QACjE,qFAAqF;QACrF,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,SAAS,CAAC,sBAAsB,CAAC,CAE1D,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,SAAS,CAAC,oBAAoB,CAAC,CAEzD,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,SAAS,CAAC,6BAA6B,CAAC,CAElE,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACd,uIAAuI,CACvI,CAAC;IACH,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,CAEzD,CAAC;IACF,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,SAAS,CAAC,yBAAyB,CAAC,CAE9D,CAAC;IACF,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,SAAS,CAAC,kCAAkC,CAAC,CAEvE,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC;QACJ,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACV,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;IAChE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,16 @@ export * from '../field-validation/rule.js';
4
4
  export * from '../field-validation/utils.js';
5
5
  export { createContentHash, hasUnpublishedChanges } from '../utils/content-hash.js';
6
6
  export { setSchemaContext, getSchemaContext } from '../schema-context.svelte.js';
7
+ export { AdminSlots, setAdminSlots, useAdminSlots, type AdminSlotName, type AdminSlotEntry } from '../admin/slots.svelte.js';
8
+ export type { AdminArea } from '../admin/types.js';
9
+ export { setFieldComponents, useFieldComponents, type FieldComponentLookup } from '../admin/field-components.svelte.js';
10
+ export { createAdminNav, setAdminNav, useAdminNav, type AdminNav, type AdminParam, type ParamPatch } from '../admin/nav.svelte.js';
7
11
  export { setPermissionsContext, usePermissions, type PermissionsContext } from '../permissions-context.svelte.js';
8
12
  export * from '../schema-utils/index.js';
9
13
  export { default as DocumentEditor } from '../components/admin/DocumentEditor.svelte';
10
14
  export { default as SchemaField } from '../components/admin/SchemaField.svelte';
15
+ export { default as PluginSettingsPanel } from '../components/admin/PluginSettingsPanel.svelte';
16
+ export { setBlockPreviews, useBlockPreviews, type BlockPreviewProps, type BlockPreviewLookup } from '../admin/block-previews.svelte.js';
11
17
  export { default as AdminApp } from '../components/AdminApp.svelte';
12
18
  export { default as Sidebar } from '../components/layout/Sidebar.svelte';
13
19
  export { default as PermissionsDebug } from '../components/admin/PermissionsDebug.svelte';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/client/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGlG,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EACN,qBAAqB,EACrB,cAAc,EACd,KAAK,kBAAkB,EACvB,MAAM,+BAA+B,CAAC;AAGvC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAG1F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kDAAkD,CAAC;AAG7F,cAAc,gBAAgB,CAAC;AAE/B,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EACN,aAAa,EACb,KAAK,oBAAoB,EACzB,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6DAA6D,CAAC;AAK3G,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/client/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGlG,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EACN,UAAU,EACV,aAAa,EACb,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EACN,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACN,cAAc,EACd,WAAW,EACX,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,UAAU,EACf,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACN,qBAAqB,EACrB,cAAc,EACd,KAAK,kBAAkB,EACvB,MAAM,+BAA+B,CAAC;AAGvC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAGhG,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAG1F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kDAAkD,CAAC;AAG7F,cAAc,gBAAgB,CAAC;AAE/B,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EACN,aAAa,EACb,KAAK,oBAAoB,EACzB,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6DAA6D,CAAC;AAK3G,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -9,6 +9,12 @@ export * from '../field-validation/utils.js';
9
9
  export { createContentHash, hasUnpublishedChanges } from '../utils/content-hash.js';
10
10
  // Schema context (for providing schemas to components)
11
11
  export { setSchemaContext, getSchemaContext } from '../schema-context.svelte.js';
12
+ // Admin extension slots — runtime UI registration primitive (plugin seam).
13
+ export { AdminSlots, setAdminSlots, useAdminSlots } from '../admin/slots.svelte.js';
14
+ // Field-input widgets — plugins register components for a field's `input` key.
15
+ export { setFieldComponents, useFieldComponents } from '../admin/field-components.svelte.js';
16
+ // Admin URL navigation — typed intents, shareable via context (plugin tools can navigate).
17
+ export { createAdminNav, setAdminNav, useAdminNav } from '../admin/nav.svelte.js';
12
18
  // Permissions context (for capability-based UI gating)
13
19
  export { setPermissionsContext, usePermissions } from '../permissions-context.svelte.js';
14
20
  // Schema utilities (for working with schemas)
@@ -16,6 +22,9 @@ export * from '../schema-utils/index.js';
16
22
  // Components (UI components for the admin interface)
17
23
  export { default as DocumentEditor } from '../components/admin/DocumentEditor.svelte';
18
24
  export { default as SchemaField } from '../components/admin/SchemaField.svelte';
25
+ export { default as PluginSettingsPanel } from '../components/admin/PluginSettingsPanel.svelte';
26
+ // Inline editor previews for custom rich-text block types (app-owned presentation).
27
+ export { setBlockPreviews, useBlockPreviews } from '../admin/block-previews.svelte.js';
19
28
  export { default as AdminApp } from '../components/AdminApp.svelte';
20
29
  export { default as Sidebar } from '../components/layout/Sidebar.svelte';
21
30
  // Debug helpers
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { Alert, AlertDescription, AlertTitle } from '@aphexcms/ui/shadcn/alert';
7
7
  import { Button } from '@aphexcms/ui/shadcn/button';
8
+ import { useSidebar } from '@aphexcms/ui/shadcn/sidebar';
8
9
  import * as Tabs from '@aphexcms/ui/shadcn/tabs';
9
10
  import * as Popover from '@aphexcms/ui/shadcn/popover';
10
11
  import * as Select from '@aphexcms/ui/shadcn/select';
@@ -12,6 +13,14 @@
12
13
  import { goto } from '$app/navigation';
13
14
  import { SvelteURLSearchParams } from 'svelte/reactivity';
14
15
  import type { SchemaType } from '../types/index';
16
+ import type { CMSPlugin, AdminToolProps } from '../plugins/types';
17
+ import { createPartResolver } from '../plugins/resolver';
18
+ import type { AdminArea } from '../admin/types';
19
+ import { setAdminNav } from '../admin/nav.svelte';
20
+ import type { Component } from 'svelte';
21
+ import { setFieldComponents } from '../admin/field-components.svelte';
22
+ import { setBlockPreviews, type BlockPreviewProps } from '../admin/block-previews.svelte';
23
+ import AdminSlot from './admin/AdminSlot.svelte';
15
24
  import type { UserSessionPreferences } from '../types/organization';
16
25
  import { resolvePreviewTitle, resolvePreviewSubtitle } from '../utils/preview';
17
26
  import DocumentEditor from './admin/DocumentEditor.svelte';
@@ -53,13 +62,25 @@
53
62
  capabilities?: string[];
54
63
  /** Effective organization role name, for role-list style checks. */
55
64
  rbacRole?: string | null;
56
- activeTab?: { value: 'structure' | 'vision' | 'media' };
65
+ activeTab?: { value: AdminArea };
57
66
  handleTabChange: (value: string) => void;
58
67
  userPreferences?: UserSessionPreferences | null;
68
+ /**
69
+ * Build-time plugins, imported client-side (component parts can't cross
70
+ * SvelteKit `load`). Their document-action parts render in the editor toolbar.
71
+ */
72
+ plugins?: CMSPlugin[];
73
+ /**
74
+ * Inline editor previews for custom rich-text block types, keyed by `_type`.
75
+ * Without one, a block renders as a generic card (title/subtitle from its
76
+ * `preview` config); with one, the real block renders inline as you write.
77
+ * App-owned on purpose — the app owns presentation.
78
+ */
79
+ blockPreviews?: Record<string, Component<BlockPreviewProps>>;
59
80
  }
60
81
 
61
82
  let {
62
- schemas,
83
+ schemas: appSchemas,
63
84
  documentTypes: documentTypesFromServer,
64
85
  schemaError = null,
65
86
  title = 'Aphex CMS',
@@ -67,11 +88,49 @@
67
88
  isReadOnly = false,
68
89
  capabilities = [],
69
90
  rbacRole = null,
70
- activeTab = { value: 'structure' } as { value: 'structure' | 'vision' | 'media' },
91
+ activeTab = { value: 'structure' } as { value: AdminArea },
71
92
  handleTabChange = () => {},
72
- userPreferences = null
93
+ userPreferences = null,
94
+ plugins = [],
95
+ blockPreviews = {}
73
96
  }: Props = $props();
74
97
 
98
+ // One resolver over the (client-side) plugins, reused for every part kind.
99
+ const partResolver = $derived(createPartResolver(plugins));
100
+
101
+ // Plugin-inclusive schema list: app schemas plus any `aphex/schema` parts, then
102
+ // any `aphex/schema/transform` parts applied — the same pipeline the server engine
103
+ // runs in createCMSConfig, so the editor and the engine agree. The plugins are
104
+ // already client-side here (we hold them for component parts), so the admin
105
+ // resolves this itself — no app wiring. Everything downstream references `schemas`.
106
+ const schemas = $derived(
107
+ partResolver.applySchemaTransforms([...appSchemas, ...partResolver.schemaTypes()])
108
+ );
109
+
110
+ // Publish plugin field-input widgets so SchemaField can swap them in for a
111
+ // field's `input` key (falling back to the built-in renderer).
112
+ setFieldComponents((input) => partResolver.fieldComponent(input)?.component);
113
+ // Inline block previews come from the app (presentation is app-owned).
114
+ setBlockPreviews((type) => blockPreviews[type]);
115
+
116
+ // Plane-split guard: a plugin's `aphex/schema` document types must also reach the
117
+ // server engine (register the plugin in aphex.config). If one is present on the
118
+ // client but absent from the server's document-type list, the editor would render
119
+ // a type the engine can't validate or persist — warn loudly in dev.
120
+ $effect(() => {
121
+ const serverTypes = new Set(documentTypesFromServer.map((t) => t.name));
122
+ for (const s of partResolver.schemaTypes()) {
123
+ if (s.type === 'document' && !serverTypes.has(s.name)) {
124
+ cmsLogger.warn(
125
+ '[plugins]',
126
+ `Schema type "${s.name}" is contributed by a plugin on the client, but the server ` +
127
+ `engine doesn't know it. Register the plugin in aphex.config.ts (plugins: [...]) too, ` +
128
+ `or documents of this type can't be validated or saved.`
129
+ );
130
+ }
131
+ }
132
+ });
133
+
75
134
  // Publish capabilities to every descendant (DocumentEditor, fields, etc)
76
135
  // via Svelte context. Using a getter closure so prop reactivity propagates:
77
136
  // if the parent swaps the capabilities array (e.g. role change mid-session)
@@ -81,9 +140,60 @@
81
140
  () => rbacRole
82
141
  );
83
142
 
143
+ // Plugin admin tools contributed by plugins. Capability-gated (privileged roles
144
+ // bypass). Each becomes a `plugin:<id>` area. `placement` decides where the
145
+ // trigger renders: `'tab'` (default) in the top tab strip, `'sidebar'` in the
146
+ // left sidebar nav — the latter keeps the tab strip short once several plugins
147
+ // are installed.
148
+ const adminTools = $derived(
149
+ partResolver.adminTools({
150
+ capabilities: [...capabilities],
151
+ overrideAccess: rbacRole === 'super_admin' || rbacRole === 'admin'
152
+ })
153
+ );
154
+ // Tab-placed tools render into the top strip here; sidebar-placed tools are
155
+ // rendered by AppSidebar from the plugin list (persistent across admin pages).
156
+ const tabTools = $derived(adminTools.filter((t) => (t.placement ?? 'tab') === 'tab'));
157
+ // Centralized admin URL navigation — intents own which params they set/clear.
158
+ // Published to descendants (editor, plugin tools) so they navigate the same way.
159
+ const nav = setAdminNav();
160
+
161
+ function openAdminTool(id: string) {
162
+ activeTab.value = `plugin:${id}`;
163
+ nav.openArea(`plugin:${id}`);
164
+ }
165
+
84
166
  // Keep a state of the organization id
85
167
  let currentOrgId = $state<string | null>(page.url.searchParams.get('orgId'));
86
168
 
169
+ // Stable context handed to every plugin admin-tool component.
170
+ const adminToolContext = $derived<AdminToolProps>({
171
+ organizationId: currentOrgId,
172
+ capabilities,
173
+ role: rbacRole,
174
+ can: (capability) =>
175
+ rbacRole === 'super_admin' || rbacRole === 'admin' || capabilities.includes(capability),
176
+ schemas,
177
+ navigate: (area) => {
178
+ activeTab.value = area;
179
+ },
180
+ openDocument: (documentType, documentId) => {
181
+ // Guard: without a type the editor can't resolve a schema ("No schema found").
182
+ if (!documentType || !documentId) {
183
+ cmsLogger.warn('[AdminApp]', 'openDocument called without type/id', {
184
+ documentType,
185
+ documentId
186
+ });
187
+ return;
188
+ }
189
+ // The editor lives in the structure area — switch to it first (like
190
+ // navigateToDocumentType does) so opening a doc from a plugin tab actually
191
+ // shows the editor instead of leaving state stranded on the plugin tab.
192
+ if (activeTab.value !== 'structure') handleTabChange('structure');
193
+ navigateToEditDocument(documentId, documentType);
194
+ }
195
+ });
196
+
87
197
  // Merge document types with schema icons (schemas have icons, server data doesn't),
88
198
  // then filter out any schemas the caller can't read. Mirrors the server check:
89
199
  // an `access.read` list on a schema is an allowlist of role names (built-in
@@ -166,21 +276,13 @@
166
276
 
167
277
  function toggleFocusMode() {
168
278
  focusModeOn = !focusModeOn;
169
- const params = new SvelteURLSearchParams(page.url.searchParams);
170
- if (focusModeOn) {
171
- params.set('focus', '1');
172
- } else {
173
- params.delete('focus');
174
- }
175
- goto(`/admin?${params.toString()}`, { replaceState: true });
279
+ nav.patch({ focus: focusModeOn ? '1' : null });
176
280
  }
177
281
 
178
282
  function exitFocusMode() {
179
283
  if (!focusModeOn) return;
180
284
  focusModeOn = false;
181
- const params = new SvelteURLSearchParams(page.url.searchParams);
182
- params.delete('focus');
183
- goto(`/admin?${params.toString()}`, { replaceState: true });
285
+ nav.patch({ focus: null });
184
286
  }
185
287
 
186
288
  // Sync focus state from URL — covers refresh, deep links, back button.
@@ -195,14 +297,32 @@
195
297
  // live preview iframe. Independent from focus mode; Esc also exits.
196
298
  let presentationModeOn = $state(false);
197
299
 
300
+ // Sidebar context (set by the SidebarProvider ancestor). Used to reclaim screen
301
+ // real estate for the preview canvas when presentation mode opens.
302
+ const sidebar = useSidebar();
303
+
198
304
  function togglePresentationMode() {
199
305
  presentationModeOn = !presentationModeOn;
306
+ // Entering presentation mode: collapse the nav rail so the preview gets the room.
307
+ if (presentationModeOn) sidebar?.setOpen(false);
200
308
  }
201
309
 
202
310
  function exitPresentationMode() {
203
311
  presentationModeOn = false;
204
312
  }
205
313
 
314
+ // Both modes hide the side panels and only make sense with an editor open.
315
+ // Leaving the editor through anything other than the back button (e.g. the
316
+ // sidebar "Studio" link keeps this component mounted while navigating to the
317
+ // structure view) must also exit them — otherwise the structure view renders
318
+ // with every panel hidden: a blank page.
319
+ $effect(() => {
320
+ if (currentView !== 'editor') {
321
+ if (presentationModeOn) presentationModeOn = false;
322
+ if (focusModeOn) focusModeOn = false;
323
+ }
324
+ });
325
+
206
326
  // Esc to exit focus mode.
207
327
  $effect(() => {
208
328
  if (typeof window === 'undefined') return;
@@ -283,6 +403,18 @@
283
403
  }
284
404
  let editorStack = $state<EditorStackItem[]>([]);
285
405
 
406
+ // Bumped to ask the base (primary) editor's preview to re-fetch — e.g. after a
407
+ // referenced doc autosaves, so the base preview reflects the change.
408
+ let baseRefreshToken = $state(0);
409
+
410
+ // Human label for a document type: the schema's `title` (e.g. "Blog Post"),
411
+ // falling back to a prettified name so `blog_post` never surfaces as "Blog_post".
412
+ function typeLabel(name: string | null | undefined): string {
413
+ if (!name) return '';
414
+ const title = schemas.find((s) => s.name === name)?.title;
415
+ return title ?? name.charAt(0).toUpperCase() + name.slice(1).replace(/_/g, ' ');
416
+ }
417
+
286
418
  // Track which editor is currently active/focused (0 = primary, 1+ = stacked)
287
419
  let activeEditorIndex = $state<number>(0);
288
420
 
@@ -615,35 +747,17 @@
615
747
  // at least sees an error surface rather than a stuck sidebar click.
616
748
  }
617
749
 
618
- const params = new SvelteURLSearchParams(page.url.searchParams);
619
- params.set('docType', docType);
620
- params.delete('docId');
621
- params.delete('action');
622
- params.delete('stack');
623
- params.delete('history');
624
- await goto(`/admin?${params.toString()}`, { replaceState: false });
750
+ await nav.openType(docType);
625
751
  mobileView = 'documents';
626
752
  }
627
753
 
628
754
  async function navigateToCreateDocument(docType: string) {
629
- const params = new SvelteURLSearchParams(page.url.searchParams);
630
- params.set('docType', docType);
631
- params.set('action', 'create');
632
- params.delete('docId');
633
- params.delete('stack');
634
- params.delete('history');
635
- await goto(`/admin?${params.toString()}`, { replaceState: false });
755
+ await nav.createDocument(docType);
636
756
  mobileView = 'editor';
637
757
  }
638
758
 
639
759
  async function navigateToEditDocument(docId: string, docType?: string, replace: boolean = false) {
640
- const params = new SvelteURLSearchParams(page.url.searchParams);
641
- params.set('docId', docId);
642
- if (docType) params.set('docType', docType);
643
- params.delete('action');
644
- params.delete('fromDocId');
645
- params.delete('fromDocType');
646
- await goto(`/admin?${params.toString()}`, { replaceState: replace });
760
+ await nav.openDocument(docId, docType, { replace });
647
761
  mobileView = 'editor';
648
762
  }
649
763
 
@@ -661,26 +775,12 @@
661
775
  // Navigate back to the document we came from
662
776
  await navigateToEditDocument(fromDocId, fromDocType, false);
663
777
  } else if (selectedDocumentType && !currentTypeIsSingleton) {
664
- // Navigate back to document list
665
- const params = new SvelteURLSearchParams(page.url.searchParams);
666
- params.set('docType', selectedDocumentType);
667
- params.delete('docId');
668
- params.delete('action');
669
- params.delete('stack');
670
- params.delete('focus');
671
- params.delete('history');
672
- await goto(`/admin?${params.toString()}`, { replaceState: false });
778
+ // Back to the document list for the current type
779
+ await nav.closeToType(selectedDocumentType);
673
780
  mobileView = 'documents';
674
781
  } else {
675
- // Navigate back to home
676
- const params = new SvelteURLSearchParams(page.url.searchParams);
677
- params.delete('docType');
678
- params.delete('docId');
679
- params.delete('action');
680
- params.delete('stack');
681
- params.delete('focus');
682
- params.delete('history');
683
- await goto(`/admin?${params.toString()}`, { replaceState: false });
782
+ // Back to the dashboard
783
+ await nav.goHome();
684
784
  mobileView = 'types';
685
785
  }
686
786
  }
@@ -688,18 +788,14 @@
688
788
  function handleOpenVersionHistory(docId: string) {
689
789
  showVersionPanel = true;
690
790
  versionPanelDocId = docId;
691
- const params = new SvelteURLSearchParams(page.url.searchParams);
692
- params.set('history', '1');
693
- goto(`/admin?${params.toString()}`, { replaceState: true });
791
+ nav.patch({ history: '1' });
694
792
  }
695
793
 
696
794
  function handleCloseVersionPanel() {
697
795
  showVersionPanel = false;
698
796
  versionPanelDocId = null;
699
797
  versionPreviewData = null;
700
- const params = new SvelteURLSearchParams(page.url.searchParams);
701
- params.delete('history');
702
- goto(`/admin?${params.toString()}`, { replaceState: true });
798
+ nav.patch({ history: null });
703
799
  }
704
800
 
705
801
  // Close version panel when navigating away
@@ -815,6 +911,11 @@
815
911
  if (showVersionPanel && versionPanelDocId === documentId) {
816
912
  versionPanelRef?.refresh();
817
913
  }
914
+ // A referenced doc (open in the reference panel) autosaved — nudge the base
915
+ // preview to re-fetch, so its server-loaded view (e.g. a list that includes
916
+ // this doc) reflects the edit. Not fired for the base doc itself, which already
917
+ // live-updates via the data push.
918
+ if (editorStack.some((e) => e.documentId === documentId)) baseRefreshToken++;
818
919
  }
819
920
 
820
921
  function handleDocumentPublished(documentId: string) {
@@ -851,6 +952,10 @@
851
952
  }
852
953
 
853
954
  async function fetchDocuments(docType: string) {
955
+ // No type = nothing to list (e.g. mid-navigation from a plugin tab before a
956
+ // type is selected). Bail quietly rather than hitting the API and toasting
957
+ // "Document type is required".
958
+ if (!docType) return;
854
959
  cmsLogger.debug('[AdminApp]', 'FETCHING DOCUMENTS', { sort: sortString });
855
960
  loading = true;
856
961
  error = null;
@@ -914,6 +1019,34 @@
914
1019
  }
915
1020
  </script>
916
1021
 
1022
+ <!-- Plugin admin-tool tabs (placement: 'tab') — registered into the Sidebar's tab strip. -->
1023
+ {#if tabTools.length > 0}
1024
+ <AdminSlot name="admin-tabs" id="plugin-admin-tools">
1025
+ {#each tabTools as tool (tool.id)}
1026
+ <button
1027
+ onclick={() => openAdminTool(tool.id)}
1028
+ class="{activeTab.value === `plugin:${tool.id}`
1029
+ ? 'bg-background text-foreground shadow'
1030
+ : 'text-muted-foreground'} ring-offset-background focus-visible:ring-ring inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md px-3 py-1 text-sm font-medium whitespace-nowrap transition-all focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none"
1031
+ >
1032
+ {#if tool.icon}
1033
+ {@const Icon = tool.icon}
1034
+ <Icon class="h-4 w-4" />
1035
+ {/if}
1036
+ {tool.title}
1037
+ </button>
1038
+ {/each}
1039
+ </AdminSlot>
1040
+ {/if}
1041
+
1042
+ <!--
1043
+ Sidebar-placed plugin tools (placement: 'sidebar') are rendered by AppSidebar
1044
+ directly from the plugin list, at the persistent layout level — not here — so
1045
+ the Tools nav survives on every admin page (settings included), where AdminApp
1046
+ isn't mounted. AdminApp still owns the tab-placed tools (above) and renders each
1047
+ tool's `plugin:<id>` content area (below).
1048
+ -->
1049
+
917
1050
  <svelte:head>
918
1051
  <title
919
1052
  >{activeTab.value === 'structure'
@@ -926,7 +1059,7 @@
926
1059
 
927
1060
  <div class="flex h-full flex-col overflow-hidden">
928
1061
  <!-- Breadcrumb navigation: mobile (< 620px) or focus mode on any width -->
929
- {#if (windowWidth < 620 || focusModeOn || presentationModeOn) && activeTab.value === 'structure'}
1062
+ {#if (windowWidth < 620 || focusModeOn) && activeTab.value === 'structure'}
930
1063
  <div class="border-border bg-background border-b">
931
1064
  <div class="flex h-12 items-center px-4">
932
1065
  {#if mobileView === 'documents' && selectedDocumentType}
@@ -1470,7 +1603,7 @@
1470
1603
  <!-- Primary Editor Panel -->
1471
1604
  {#if primaryEditorState.visible}
1472
1605
  <div
1473
- class="transition-all duration-200 {windowWidth < 620
1606
+ class="relative transition-all duration-200 {windowWidth < 620
1474
1607
  ? 'w-screen'
1475
1608
  : 'flex-1'} h-full overflow-x-hidden overflow-y-auto {primaryEditorState.expanded
1476
1609
  ? ''
@@ -1479,6 +1612,7 @@
1479
1612
  >
1480
1613
  <DocumentEditor
1481
1614
  {schemas}
1615
+ {plugins}
1482
1616
  documentType={selectedDocumentType!}
1483
1617
  documentId={editingDocumentId}
1484
1618
  isCreating={isCreatingDocument}
@@ -1486,6 +1620,7 @@
1486
1620
  onToggleFocus={toggleFocusMode}
1487
1621
  presentationMode={presentationModeOn}
1488
1622
  onTogglePresentation={togglePresentationMode}
1623
+ refreshToken={baseRefreshToken}
1489
1624
  organizationId={currentOrgId}
1490
1625
  onBack={navigateBack}
1491
1626
  onOpenReference={handleOpenReference}
@@ -1559,32 +1694,44 @@
1559
1694
  }}
1560
1695
  {isReadOnly}
1561
1696
  />
1697
+
1698
+ <!-- Presentation-mode reference: a left-anchored panel over the fields
1699
+ column only (no dimming backdrop), so the base editor's live
1700
+ preview stays fully visible and interactive on the right. Close
1701
+ with the panel's Back button. -->
1702
+ {#if presentationModeOn && editorStack.length > 0}
1703
+ {@const currentRef = editorStack[editorStack.length - 1]!}
1704
+ <div
1705
+ class="border-rule bg-background absolute inset-y-0 left-0 z-40 flex w-full max-w-[520px] flex-col border-r shadow-2xl"
1706
+ >
1707
+ {@render referenceEditorBody(currentRef)}
1708
+ </div>
1709
+ {/if}
1562
1710
  </div>
1563
1711
  {#if !primaryEditorState.expanded && !focusModeOn && !presentationModeOn}
1564
1712
  <!-- Collapsed Primary Editor Strip -->
1565
1713
  <button
1566
1714
  onclick={() => setActiveEditor(0)}
1567
1715
  class="border-rule hover:bg-muted/50 flex h-full w-[60px] cursor-pointer flex-col border-l transition-colors"
1568
- title="Click to expand {selectedDocumentType}"
1716
+ title="Click to expand {typeLabel(selectedDocumentType)}"
1569
1717
  >
1570
1718
  <div class="flex flex-1 items-start justify-center p-2 pt-8 text-left">
1571
1719
  <div
1572
1720
  class="text-foreground -mt-2 text-sm font-medium whitespace-nowrap [writing-mode:vertical-rl]"
1573
1721
  >
1574
- {selectedDocumentType
1575
- ? selectedDocumentType.charAt(0).toUpperCase() +
1576
- selectedDocumentType.slice(1)
1577
- : ''}
1722
+ {typeLabel(selectedDocumentType)}
1578
1723
  </div>
1579
1724
  </div>
1580
1725
  </button>
1581
1726
  {/if}
1582
1727
  {/if}
1583
1728
 
1584
- <!-- Stacked Reference Panel — only the last entry in the stack
1585
- is rendered. Back button pops the stack (walks back through
1586
- the ref chain); closing entirely on the last pop. -->
1587
- {#if editorStack.length > 0}
1729
+ <!-- Stacked Reference Panel — only the last entry in the stack is
1730
+ rendered. In presentation mode it opens as a modal over the
1731
+ current editor (so you stay anchored to the document + preview
1732
+ you were editing); otherwise it's a side panel. Back pops the
1733
+ stack (walks the ref chain); closing clears it. -->
1734
+ {#if editorStack.length > 0 && !presentationModeOn}
1588
1735
  {@const currentRef = editorStack[editorStack.length - 1]!}
1589
1736
  {@const isExpanded = focusModeOn
1590
1737
  ? activeEditorIndex === 1
@@ -1595,60 +1742,20 @@
1595
1742
  class="border-rule h-full flex-1 overflow-x-hidden overflow-y-auto border-l transition-all duration-200"
1596
1743
  style="min-width: 0;"
1597
1744
  >
1598
- <DocumentEditor
1599
- {schemas}
1600
- documentType={currentRef.documentType}
1601
- documentId={currentRef.documentId}
1602
- isCreating={currentRef.isCreating}
1603
- onBack={handleStackedEditorBack}
1604
- onOpenReference={handleOpenReference}
1605
- onOpenVersionHistory={handleOpenVersionHistory}
1606
- onToggleFocus={() => {
1607
- activeEditorIndex = 1;
1608
- toggleFocusMode();
1609
- }}
1610
- externalVersionPreview={versionPanelDocId === currentRef.documentId
1611
- ? versionPreviewData
1612
- : null}
1613
- onSaved={async () => {}}
1614
- onAutoSaved={handleAutoSave}
1615
- onPublished={async (docId) => {
1616
- handleDocumentPublished(docId);
1617
- if (selectedDocumentType) {
1618
- await fetchDocuments(selectedDocumentType);
1619
- }
1620
- }}
1621
- onUnpublished={async (docId) => {
1622
- handleDocumentPublished(docId);
1623
- if (selectedDocumentType) {
1624
- await fetchDocuments(selectedDocumentType);
1625
- }
1626
- }}
1627
- onRestored={async (docId) => {
1628
- handleDocumentPublished(docId);
1629
- if (selectedDocumentType) {
1630
- await fetchDocuments(selectedDocumentType);
1631
- }
1632
- }}
1633
- onDeleted={async () => {
1634
- handleCloseStackedEditor(0);
1635
- }}
1636
- {isReadOnly}
1637
- />
1745
+ {@render referenceEditorBody(currentRef)}
1638
1746
  </div>
1639
1747
  {:else if !focusModeOn}
1640
1748
  <!-- Collapsed Stacked Editor Strip -->
1641
1749
  <button
1642
1750
  onclick={() => setActiveEditor(1)}
1643
1751
  class="border-rule hover:bg-muted/50 flex h-full w-[60px] cursor-pointer flex-col border-l transition-colors"
1644
- title="Click to expand {currentRef.documentType}"
1752
+ title="Click to expand {typeLabel(currentRef.documentType)}"
1645
1753
  >
1646
1754
  <div class="flex h-full flex-1 items-start justify-center p-2 pt-8 text-left">
1647
1755
  <div
1648
1756
  class="text-foreground text-sm font-medium whitespace-nowrap [writing-mode:vertical-rl]"
1649
1757
  >
1650
- {currentRef.documentType.charAt(0).toUpperCase() +
1651
- currentRef.documentType.slice(1)}
1758
+ {typeLabel(currentRef.documentType)}
1652
1759
  </div>
1653
1760
  </div>
1654
1761
  </button>
@@ -1733,8 +1840,59 @@
1733
1840
  <Tabs.Content value="media" class="m-0 h-full p-0">
1734
1841
  <MediaBrowser active={activeTab.value === 'media'} />
1735
1842
  </Tabs.Content>
1843
+
1844
+ <!-- Plugin admin tools — each rendered as its own top-level area. -->
1845
+ {#each adminTools as tool (tool.id)}
1846
+ {@const Tool = tool.component}
1847
+ <Tabs.Content value={`plugin:${tool.id}`} class="m-0 h-full overflow-auto p-0">
1848
+ <Tool tool={adminToolContext} />
1849
+ </Tabs.Content>
1850
+ {/each}
1736
1851
  </Tabs.Root>
1737
1852
  </div>
1738
1853
  </div>
1739
1854
 
1740
1855
  <ConfirmDialogHost />
1856
+
1857
+ <!-- Shared body for a stacked reference editor — always form-only (no nested preview
1858
+ iframe). In presentation mode it renders inside a modal over the base editor, whose
1859
+ live preview stays visible behind it; otherwise it's the side panel. -->
1860
+ {#snippet referenceEditorBody(currentRef: EditorStackItem)}
1861
+ <DocumentEditor
1862
+ {schemas}
1863
+ {plugins}
1864
+ documentType={currentRef.documentType}
1865
+ documentId={currentRef.documentId}
1866
+ isCreating={currentRef.isCreating}
1867
+ organizationId={currentOrgId}
1868
+ onBack={handleStackedEditorBack}
1869
+ backLabel="Back"
1870
+ onOpenReference={handleOpenReference}
1871
+ onOpenVersionHistory={handleOpenVersionHistory}
1872
+ externalVersionPreview={versionPanelDocId === currentRef.documentId ? versionPreviewData : null}
1873
+ onSaved={async () => {}}
1874
+ onAutoSaved={handleAutoSave}
1875
+ onPublished={async (docId) => {
1876
+ handleDocumentPublished(docId);
1877
+ if (selectedDocumentType) {
1878
+ await fetchDocuments(selectedDocumentType);
1879
+ }
1880
+ }}
1881
+ onUnpublished={async (docId) => {
1882
+ handleDocumentPublished(docId);
1883
+ if (selectedDocumentType) {
1884
+ await fetchDocuments(selectedDocumentType);
1885
+ }
1886
+ }}
1887
+ onRestored={async (docId) => {
1888
+ handleDocumentPublished(docId);
1889
+ if (selectedDocumentType) {
1890
+ await fetchDocuments(selectedDocumentType);
1891
+ }
1892
+ }}
1893
+ onDeleted={async () => {
1894
+ handleCloseStackedEditor(0);
1895
+ }}
1896
+ {isReadOnly}
1897
+ />
1898
+ {/snippet}