@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
@@ -0,0 +1,109 @@
1
+ <script lang="ts">
2
+ // The shared input resolver: given a field, pick the right control — a plugin
3
+ // widget (field.input → aphex/field/component) first, else the built-in renderer
4
+ // for the field type. Used by SchemaField (for leaf/reference fields) AND by
5
+ // ArrayField (per primitive/reference item), so a custom or rich input resolves
6
+ // uniformly everywhere, the way Sanity's form builder does — no array-item gap.
7
+ //
8
+ // Object and array containers are NOT handled here; those recurse through
9
+ // SchemaField / ArrayField, which fall back to this component for their leaves.
10
+ import type { Field } from '../../../types/schemas';
11
+ import { useFieldComponents } from '../../../admin/field-components.svelte';
12
+ import StringField from './StringField.svelte';
13
+ import TextareaField from './TextareaField.svelte';
14
+ import NumberField from './NumberField.svelte';
15
+ import BooleanField from './BooleanField.svelte';
16
+ import SlugField from './SlugField.svelte';
17
+ import URLField from './URLField.svelte';
18
+ import DateField from './DateField.svelte';
19
+ import DateTimeField from './DateTimeField.svelte';
20
+ import ImageField from './ImageField.svelte';
21
+ import FileField from './FileField.svelte';
22
+ import ReferenceField from './ReferenceField.svelte';
23
+
24
+ interface Props {
25
+ field: Field;
26
+ value: any;
27
+ onUpdate: (value: any) => void;
28
+ readonly?: boolean;
29
+ validationClasses?: string;
30
+ documentData?: Record<string, any>;
31
+ schemaType?: string;
32
+ fieldPath?: string;
33
+ organizationId?: string;
34
+ onOpenReference?: (documentId: string, documentType: string) => void;
35
+ }
36
+
37
+ let {
38
+ field,
39
+ value,
40
+ onUpdate,
41
+ readonly = false,
42
+ validationClasses,
43
+ documentData,
44
+ schemaType,
45
+ fieldPath,
46
+ organizationId,
47
+ onOpenReference
48
+ }: Props = $props();
49
+
50
+ const fieldComponents = useFieldComponents();
51
+ const CustomInput = $derived(field.input ? fieldComponents(field.input) : undefined);
52
+ </script>
53
+
54
+ {#if CustomInput}
55
+ <CustomInput
56
+ {field}
57
+ {value}
58
+ {onUpdate}
59
+ {validationClasses}
60
+ {readonly}
61
+ {documentData}
62
+ {schemaType}
63
+ />
64
+ {:else if field.type === 'string'}
65
+ <StringField {field} {value} {documentData} {onUpdate} {validationClasses} {readonly} />
66
+ {:else if field.type === 'text'}
67
+ <TextareaField {field} {value} {onUpdate} {validationClasses} {readonly} />
68
+ {:else if field.type === 'slug'}
69
+ <SlugField {field} {value} {documentData} {onUpdate} {validationClasses} {readonly} />
70
+ {:else if field.type === 'url'}
71
+ <URLField {field} {value} {onUpdate} {validationClasses} {readonly} />
72
+ {:else if field.type === 'number'}
73
+ <NumberField {field} {value} {onUpdate} {validationClasses} {readonly} />
74
+ {:else if field.type === 'boolean'}
75
+ <BooleanField {field} {value} {onUpdate} {validationClasses} {readonly} />
76
+ {:else if field.type === 'date'}
77
+ <DateField {field} {value} {onUpdate} {validationClasses} {readonly} />
78
+ {:else if field.type === 'datetime'}
79
+ <DateTimeField {field} {value} {onUpdate} {validationClasses} {readonly} />
80
+ {:else if field.type === 'image'}
81
+ <ImageField
82
+ {field}
83
+ {value}
84
+ {onUpdate}
85
+ {validationClasses}
86
+ {schemaType}
87
+ {fieldPath}
88
+ {readonly}
89
+ {organizationId}
90
+ />
91
+ {:else if field.type === 'file'}
92
+ <FileField
93
+ {field}
94
+ {value}
95
+ {onUpdate}
96
+ {validationClasses}
97
+ {schemaType}
98
+ {fieldPath}
99
+ {readonly}
100
+ {organizationId}
101
+ />
102
+ {:else if field.type === 'reference' && field.to}
103
+ <ReferenceField {field} {value} {onUpdate} {onOpenReference} {readonly} />
104
+ {:else}
105
+ <div class="border-muted-foreground/30 rounded-md border border-dashed p-4 text-center">
106
+ <p class="text-muted-foreground text-sm">Field type "{field.type}" not yet supported</p>
107
+ <p class="text-muted-foreground mt-1 text-xs">Raw value: {JSON.stringify(value)}</p>
108
+ </div>
109
+ {/if}
@@ -0,0 +1,17 @@
1
+ import type { Field } from '../../../types/schemas.js';
2
+ interface Props {
3
+ field: Field;
4
+ value: any;
5
+ onUpdate: (value: any) => void;
6
+ readonly?: boolean;
7
+ validationClasses?: string;
8
+ documentData?: Record<string, any>;
9
+ schemaType?: string;
10
+ fieldPath?: string;
11
+ organizationId?: string;
12
+ onOpenReference?: (documentId: string, documentType: string) => void;
13
+ }
14
+ declare const FieldInput: import("svelte").Component<Props, {}, "">;
15
+ type FieldInput = ReturnType<typeof FieldInput>;
16
+ export default FieldInput;
17
+ //# sourceMappingURL=FieldInput.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldInput.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/FieldInput.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAenD,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AA2EF,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -1,20 +1,13 @@
1
1
  <script lang="ts">
2
2
  import { Trash2, Image as ImageIcon } from '@lucide/svelte';
3
3
  import { assets } from '../../../../api/assets';
4
+ import type { BlockPreviewProps } from '../../../../admin/block-previews.svelte';
4
5
 
5
- interface Props {
6
- type: string;
7
- nodeKey: string;
8
- data: Record<string, unknown>;
9
- selected?: boolean;
10
- onEdit: () => void;
11
- onDelete: () => void;
12
- }
13
-
14
- // `type`/`nodeKey` are passed by the ProseMirror node view (svelte-node-view.ts) for
15
- // contract parity across block views; this image view doesn't render them.
6
+ // Shares the block-preview contract with app-registered previews, so the node view
7
+ // can mount either through one type. `type`/`nodeKey`/`schema` are passed for parity
8
+ // but this image view doesn't render them.
16
9
  // eslint-disable-next-line svelte/no-unused-props
17
- let { data, selected = false, onEdit, onDelete }: Props = $props();
10
+ let { data, selected = false, onEdit, onDelete }: BlockPreviewProps = $props();
18
11
 
19
12
  const assetRef = $derived((data?.asset as any)?._ref as string | undefined);
20
13
  const assetPromise = $derived(assetRef ? assets.getById(assetRef) : null);
@@ -1,12 +1,5 @@
1
- interface Props {
2
- type: string;
3
- nodeKey: string;
4
- data: Record<string, unknown>;
5
- selected?: boolean;
6
- onEdit: () => void;
7
- onDelete: () => void;
8
- }
9
- declare const PortableTextImageView: import("svelte").Component<Props, {}, "">;
1
+ import type { BlockPreviewProps } from '../../../../admin/block-previews.svelte.js';
2
+ declare const PortableTextImageView: import("svelte").Component<BlockPreviewProps, {}, "">;
10
3
  type PortableTextImageView = ReturnType<typeof PortableTextImageView>;
11
4
  export default PortableTextImageView;
12
5
  //# sourceMappingURL=PortableTextImageView.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PortableTextImageView.svelte.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/PortableTextImageView.svelte.ts"],"names":[],"mappings":"AAOC,UAAU,KAAK;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AA2DF,QAAA,MAAM,qBAAqB,2CAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"PortableTextImageView.svelte.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/PortableTextImageView.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AA6DjF,QAAA,MAAM,qBAAqB,uDAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
@@ -1,32 +1,33 @@
1
1
  <script lang="ts">
2
2
  import { Pencil, Trash2 } from '@lucide/svelte';
3
+ import { resolvePreviewTitle, resolvePreviewSubtitle } from '../../../../utils/preview';
4
+ import type { BlockPreviewProps } from '../../../../admin/block-previews.svelte';
3
5
 
4
- interface Props {
5
- type: string;
6
- nodeKey: string;
7
- data: Record<string, unknown>;
8
- selected?: boolean;
9
- onEdit: () => void;
10
- onDelete: () => void;
11
- }
12
-
13
- // `nodeKey` is passed by the ProseMirror node view (svelte-node-view.ts) for contract
14
- // parity across block views but isn't needed here.
6
+ // Shares the block-preview contract with app-registered previews, so the node view
7
+ // can mount either through one type. `nodeKey` is passed for parity but unused here.
15
8
  // eslint-disable-next-line svelte/no-unused-props
16
- let { type, data, selected = false, onEdit, onDelete }: Props = $props();
9
+ let { type, data, schema, selected = false, onEdit, onDelete }: BlockPreviewProps = $props();
17
10
 
18
- const title = $derived((data.title as string) || (data.name as string) || type);
11
+ // Honour the block type's `preview` config (the same resolver array rows and
12
+ // document lists use), so a schema can say what its card reads. `resolvePreviewTitle`
13
+ // already falls back to conventional field names (title/heading/name/label) → the
14
+ // schema's title → the type name.
15
+ const title = $derived(resolvePreviewTitle(data, schema, type));
19
16
 
20
17
  const subtitle = $derived.by(() => {
21
- const preview: string[] = [];
18
+ const configured = resolvePreviewSubtitle(data, schema);
19
+ if (configured) return configured;
20
+ // No `preview.select.subtitle` — fall back to scraping the first couple of
21
+ // non-empty string fields so an unconfigured block still says something.
22
+ const parts: string[] = [];
22
23
  for (const [key, val] of Object.entries(data)) {
23
24
  if (key.startsWith('_') || key === 'title' || key === 'name') continue;
24
25
  if (typeof val === 'string' && val.length > 0) {
25
- preview.push(val.length > 40 ? val.slice(0, 40) + '...' : val);
26
- if (preview.length >= 2) break;
26
+ parts.push(val.length > 40 ? val.slice(0, 40) + '...' : val);
27
+ if (parts.length >= 2) break;
27
28
  }
28
29
  }
29
- return preview.join(' - ');
30
+ return parts.join(' - ');
30
31
  });
31
32
  </script>
32
33
 
@@ -1,12 +1,5 @@
1
- interface Props {
2
- type: string;
3
- nodeKey: string;
4
- data: Record<string, unknown>;
5
- selected?: boolean;
6
- onEdit: () => void;
7
- onDelete: () => void;
8
- }
9
- declare const PortableTextObjectView: import("svelte").Component<Props, {}, "">;
1
+ import type { BlockPreviewProps } from '../../../../admin/block-previews.svelte.js';
2
+ declare const PortableTextObjectView: import("svelte").Component<BlockPreviewProps, {}, "">;
10
3
  type PortableTextObjectView = ReturnType<typeof PortableTextObjectView>;
11
4
  export default PortableTextObjectView;
12
5
  //# sourceMappingURL=PortableTextObjectView.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PortableTextObjectView.svelte.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/PortableTextObjectView.svelte.ts"],"names":[],"mappings":"AAMC,UAAU,KAAK;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACrB;AAkDF,QAAA,MAAM,sBAAsB,2CAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"PortableTextObjectView.svelte.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/PortableTextObjectView.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AA4DjF,QAAA,MAAM,sBAAsB,uDAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
@@ -40,6 +40,7 @@
40
40
  import type { ArrayField as ArrayFieldType, SchemaType } from '../../../../types/schemas';
41
41
  import { getSchemaContext } from '../../../../schema-context.svelte';
42
42
  import { getSchemaByName } from '../../../../schema-utils/utils';
43
+ import { useBlockPreviews } from '../../../../admin/block-previews.svelte';
43
44
  import { getRichtextEditorRegistry } from '../../../../richtext-context.svelte.js';
44
45
  import ObjectModal from '../../ObjectModal.svelte';
45
46
  import ImageBlockModal from './ImageBlockModal.svelte';
@@ -86,6 +87,9 @@
86
87
  let editingNodeKey = $state<string | null>(null);
87
88
  let editingIsInline = $state(false);
88
89
 
90
+ // App-registered inline previews for custom block types (see setBlockPreviews).
91
+ const blockPreviews = useBlockPreviews();
92
+
89
93
  const blockDef = $derived(field.of.find((ref) => ref.type === 'block'));
90
94
  const styles = $derived(blockDef?.styles?.map((s) => s.value) ?? DEFAULT_BLOCK_STYLES);
91
95
  const decorators = $derived(
@@ -429,6 +433,40 @@
429
433
  return found;
430
434
  }
431
435
 
436
+ /**
437
+ * Clean externally-pasted HTML before ProseMirror parses it. Word and Google
438
+ * Docs inject heavy inline `style`/`class` bloat and wrapper spans; we keep the
439
+ * structural tags (headings, lists, bold/italic, links) and drop everything the
440
+ * editor doesn't model, so paste produces clean Portable Text instead of noise.
441
+ */
442
+ function sanitizePastedHTML(html: string): string {
443
+ if (typeof window === 'undefined' || !html) return html;
444
+ const doc = new DOMParser().parseFromString(html, 'text/html');
445
+
446
+ // Google Docs wraps an entire copied selection in <b style="font-weight:normal">,
447
+ // which would otherwise make every pasted word bold. Unwrap those.
448
+ doc.body.querySelectorAll('b, strong').forEach((el) => {
449
+ if (/font-weight:\s*(normal|400)/i.test(el.getAttribute('style') ?? '')) {
450
+ el.replaceWith(...el.childNodes);
451
+ }
452
+ });
453
+
454
+ // Elements that never carry editorial content.
455
+ doc.querySelectorAll('script, style, link, meta, title, noscript').forEach((el) => el.remove());
456
+
457
+ // Strip presentational and unsafe attributes everywhere, keeping only the few
458
+ // the editor actually reads (href on links, src/alt on images).
459
+ const KEEP: Record<string, string[]> = { A: ['href'], IMG: ['src', 'alt'] };
460
+ doc.body.querySelectorAll('*').forEach((el) => {
461
+ const keep = KEEP[el.tagName] ?? [];
462
+ for (const attr of [...el.attributes]) {
463
+ if (!keep.includes(attr.name.toLowerCase())) el.removeAttribute(attr.name);
464
+ }
465
+ });
466
+
467
+ return doc.body.innerHTML;
468
+ }
469
+
432
470
  function createEditor() {
433
471
  editor?.destroy();
434
472
  if (!element) return;
@@ -464,7 +502,13 @@
464
502
  ? [
465
503
  PortableTextObject.configure({
466
504
  onEdit: handleEditBlock,
467
- onDelete: handleDeleteBlock
505
+ onDelete: handleDeleteBlock,
506
+ // Let each block's card read its own type's `preview` config
507
+ // (falls back to the registered schema's, for named object types).
508
+ resolveSchema: (type: string) =>
509
+ field.of.find((ref) => ref.type === type) ?? getSchemaByName(schemas, type),
510
+ // An app-registered preview renders the real block inline instead.
511
+ resolveComponent: (type: string) => blockPreviews(type)
468
512
  })
469
513
  ]
470
514
  : []),
@@ -487,6 +531,9 @@
487
531
  editable: !readonly,
488
532
  extensions,
489
533
  content: tiptapDoc,
534
+ editorProps: {
535
+ transformPastedHTML: sanitizePastedHTML
536
+ },
490
537
  onUpdate: ({ editor: e }) => {
491
538
  if (isSyncingFromParent) return;
492
539
  internalVersion++;
@@ -907,8 +954,14 @@
907
954
  {#if editor && !readonly}
908
955
  <!-- svelte-ignore a11y_no_static_element_interactions -->
909
956
  <Tooltip.Provider>
957
+ <!--
958
+ Sticky within `.richtext-editor` (which is `overflow: visible`), so the toolbar
959
+ follows you down a long document but releases at the field's bottom edge — it
960
+ never floats over the next field. Opaque background: a translucent one would let
961
+ the scrolling text bleed through once it's pinned.
962
+ -->
910
963
  <div
911
- class="border-rule bg-muted/30 flex flex-wrap items-center gap-0.5 border-b px-2 py-1.5"
964
+ class="border-rule bg-muted sticky top-0 z-10 flex flex-wrap items-center gap-0.5 border-b px-2 py-1.5"
912
965
  onmousedown={(e) => e.preventDefault()}
913
966
  >
914
967
  {#if styles.length > 1}
@@ -1 +1 @@
1
- {"version":3,"file":"RichtextField.svelte.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/RichtextField.svelte.ts"],"names":[],"mappings":"AA4BA,OAAO,EAGL,KAAK,iBAAiB,EACtB,MAAM,4BAA4B,CAAC;AASrC,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAc,MAAM,2BAA2B,CAAC;AAWzF,UAAU,KAAK;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AA+lCF,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"RichtextField.svelte.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/RichtextField.svelte.ts"],"names":[],"mappings":"AA4BA,OAAO,EAGL,KAAK,iBAAiB,EACtB,MAAM,4BAA4B,CAAC;AASrC,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAc,MAAM,2BAA2B,CAAC;AAYzF,UAAU,KAAK;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AA+oCF,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -1,4 +1,7 @@
1
1
  import { Node } from '@tiptap/core';
2
+ import type { Component } from 'svelte';
3
+ import type { PreviewSource } from '../../../../utils/preview.js';
4
+ import type { BlockPreviewProps } from '../../../../admin/block-previews.svelte.js';
2
5
  export interface PortableTextObjectOptions {
3
6
  onEdit: (attrs: {
4
7
  _type: string;
@@ -6,6 +9,10 @@ export interface PortableTextObjectOptions {
6
9
  data: Record<string, unknown>;
7
10
  }) => void;
8
11
  onDelete: (key: string) => void;
12
+ /** Resolve a block type's schema so its card can honour the type's `preview` config. */
13
+ resolveSchema?: (type: string) => PreviewSource;
14
+ /** Resolve a custom preview component, rendered inline instead of the generic card. */
15
+ resolveComponent?: (type: string) => Component<BlockPreviewProps> | undefined;
9
16
  }
10
17
  export declare const PortableTextObject: Node<PortableTextObjectOptions, any>;
11
18
  //# sourceMappingURL=portable-text-object-node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"portable-text-object-node.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/portable-text-object-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AAGrD,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IACxF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,kBAAkB,sCAiC7B,CAAC"}
1
+ {"version":3,"file":"portable-text-object-node.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/portable-text-object-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAEjF,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IACxF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,wFAAwF;IACxF,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC;IAChD,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;CAC9E;AAED,eAAO,MAAM,kBAAkB,sCAwC7B,CAAC"}
@@ -9,7 +9,9 @@ export const PortableTextObject = Node.create({
9
9
  addOptions() {
10
10
  return {
11
11
  onEdit: () => { },
12
- onDelete: () => { }
12
+ onDelete: () => { },
13
+ resolveSchema: undefined,
14
+ resolveComponent: undefined
13
15
  };
14
16
  },
15
17
  addAttributes() {
@@ -26,6 +28,6 @@ export const PortableTextObject = Node.create({
26
28
  return ['div', mergeAttributes(HTMLAttributes, { 'data-portable-text-object': '' }), 0];
27
29
  },
28
30
  addNodeView() {
29
- return SvelteNodeViewRenderer(this.options.onEdit, this.options.onDelete);
31
+ return SvelteNodeViewRenderer(this.options.onEdit, this.options.onDelete, this.options.resolveSchema, this.options.resolveComponent);
30
32
  }
31
33
  });
@@ -1,8 +1,23 @@
1
1
  import type { NodeViewRendererProps } from '@tiptap/core';
2
2
  import type { NodeView as ProseMirrorNodeView } from '@tiptap/pm/view';
3
+ import type { Component } from 'svelte';
4
+ import type { PreviewSource } from '../../../../utils/preview.js';
5
+ import type { BlockPreviewProps } from '../../../../admin/block-previews.svelte.js';
3
6
  export declare function SvelteNodeViewRenderer(onEdit: (attrs: {
4
7
  _type: string;
5
8
  _key: string;
6
9
  data: Record<string, unknown>;
7
- }) => void, onDelete: (key: string) => void): (props: NodeViewRendererProps) => ProseMirrorNodeView;
10
+ }) => void, onDelete: (key: string) => void,
11
+ /**
12
+ * Look up a block type's schema (its entry in the field's `of`) so the card can
13
+ * honour that type's `preview` config instead of guessing a title/subtitle from
14
+ * the raw data. Optional — without it the card falls back to the old heuristic.
15
+ */
16
+ resolveSchema?: (type: string) => PreviewSource,
17
+ /**
18
+ * Resolve a custom preview component for a block type. When one exists it's mounted
19
+ * instead of the generic card, so the author sees the real block inline. It receives
20
+ * the same props (including `onEdit`/`onDelete`), so editing still works.
21
+ */
22
+ resolveComponent?: (type: string) => Component<BlockPreviewProps> | undefined): (props: NodeViewRendererProps) => ProseMirrorNodeView;
8
23
  //# sourceMappingURL=svelte-node-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"svelte-node-view.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/svelte-node-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAKvE,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KAAK,IAAI,EACvF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,IAEvB,OAAO,qBAAqB,KAAG,mBAAmB,CAyE1D"}
1
+ {"version":3,"file":"svelte-node-view.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/admin/fields/richtext/svelte-node-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAIvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAEjF,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KAAK,IAAI,EACvF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;AAC/B;;;;GAIG;AACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa;AAC/C;;;;GAIG;AACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,iBAAiB,CAAC,GAAG,SAAS,IAErE,OAAO,qBAAqB,KAAG,mBAAmB,CA+E1D"}
@@ -1,14 +1,32 @@
1
1
  import { mount, unmount } from 'svelte';
2
2
  import PortableTextObjectView from './PortableTextObjectView.svelte';
3
3
  import PortableTextImageView from './PortableTextImageView.svelte';
4
- export function SvelteNodeViewRenderer(onEdit, onDelete) {
4
+ export function SvelteNodeViewRenderer(onEdit, onDelete,
5
+ /**
6
+ * Look up a block type's schema (its entry in the field's `of`) so the card can
7
+ * honour that type's `preview` config instead of guessing a title/subtitle from
8
+ * the raw data. Optional — without it the card falls back to the old heuristic.
9
+ */
10
+ resolveSchema,
11
+ /**
12
+ * Resolve a custom preview component for a block type. When one exists it's mounted
13
+ * instead of the generic card, so the author sees the real block inline. It receives
14
+ * the same props (including `onEdit`/`onDelete`), so editing still works.
15
+ */
16
+ resolveComponent) {
5
17
  return (props) => {
6
18
  const wrapper = document.createElement('div');
7
19
  wrapper.setAttribute('data-portable-text-object', '');
8
20
  wrapper.setAttribute('data-node-view-wrapper', '');
9
21
  wrapper.contentEditable = 'false';
10
22
  let nodeAttrs = props.node.attrs;
23
+ // Built-ins and app-registered previews share BlockPreviewProps, so all three
24
+ // mount through one call site.
11
25
  function getViewComponent() {
26
+ // An app-registered preview wins — it renders the real block inline.
27
+ const custom = resolveComponent?.(nodeAttrs._type);
28
+ if (custom)
29
+ return custom;
12
30
  return nodeAttrs._type === 'image' ? PortableTextImageView : PortableTextObjectView;
13
31
  }
14
32
  function mountView() {
@@ -18,6 +36,7 @@ export function SvelteNodeViewRenderer(onEdit, onDelete) {
18
36
  type: nodeAttrs._type,
19
37
  nodeKey: nodeAttrs._key,
20
38
  data: nodeAttrs.data,
39
+ schema: resolveSchema?.(nodeAttrs._type),
21
40
  selected: false,
22
41
  onEdit: () => {
23
42
  onEdit({
@@ -90,6 +90,11 @@
90
90
  function getRoleLabel(role: string): string {
91
91
  return role.charAt(0).toUpperCase() + role.slice(1);
92
92
  }
93
+
94
+ function getOrganizationLogo(org: SidebarOrganization | undefined): string | null {
95
+ const logo = org?.metadata?.logo;
96
+ return typeof logo === 'string' && logo.length > 0 ? logo : null;
97
+ }
93
98
  </script>
94
99
 
95
100
  <SidebarMenu>
@@ -110,11 +115,19 @@
110
115
  disabled={isSwitching}
111
116
  >
112
117
  {#if activeOrganization}
113
- <div
114
- class="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg text-sm font-semibold"
115
- >
116
- {getOrganizationInitials(activeOrganization.name)}
117
- </div>
118
+ {#if getOrganizationLogo(activeOrganization)}
119
+ <img
120
+ src={getOrganizationLogo(activeOrganization)!}
121
+ alt={activeOrganization.name}
122
+ class="aspect-square size-8 rounded-lg object-cover"
123
+ />
124
+ {:else}
125
+ <div
126
+ class="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg text-sm font-semibold"
127
+ >
128
+ {getOrganizationInitials(activeOrganization.name)}
129
+ </div>
130
+ {/if}
118
131
  <div class="grid flex-1 text-left text-sm leading-tight">
119
132
  <span class="truncate font-medium">
120
133
  {activeOrganization.name}
@@ -164,11 +177,19 @@
164
177
  onclick={() => handleSwitchOrganization(org)}
165
178
  disabled={isSwitching}
166
179
  >
167
- <div
168
- class="bg-primary text-primary-foreground flex size-8 shrink-0 items-center justify-center rounded-md text-xs font-semibold"
169
- >
170
- {getOrganizationInitials(org.name)}
171
- </div>
180
+ {#if getOrganizationLogo(org)}
181
+ <img
182
+ src={getOrganizationLogo(org)!}
183
+ alt={org.name}
184
+ class="size-8 shrink-0 rounded-md object-cover"
185
+ />
186
+ {:else}
187
+ <div
188
+ class="bg-primary text-primary-foreground flex size-8 shrink-0 items-center justify-center rounded-md text-xs font-semibold"
189
+ >
190
+ {getOrganizationInitials(org.name)}
191
+ </div>
192
+ {/if}
172
193
  <div class="min-w-0 flex-1">
173
194
  <div class="flex items-center justify-between">
174
195
  <p class="truncate font-medium">{org.name}</p>
@@ -1 +1 @@
1
- {"version":3,"file":"OrganizationSwitcher.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/layout/OrganizationSwitcher.svelte.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI9D,KAAK,KAAK,GAAG;IACZ,aAAa,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACtC,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAyKH,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"OrganizationSwitcher.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/layout/OrganizationSwitcher.svelte.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI9D,KAAK,KAAK,GAAG;IACZ,aAAa,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACtC,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAsLH,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}