@aphexcms/cms-core 8.1.0 → 9.1.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 (290) hide show
  1. package/dist/api/api-keys.d.ts +8 -3
  2. package/dist/api/api-keys.d.ts.map +1 -1
  3. package/dist/api/schemas/assets.js +1 -1
  4. package/dist/api/schemas/documents.d.ts +0 -2
  5. package/dist/api/schemas/documents.d.ts.map +1 -1
  6. package/dist/api/schemas/documents.js +2 -8
  7. package/dist/api/schemas/instance.d.ts +6 -0
  8. package/dist/api/schemas/instance.d.ts.map +1 -0
  9. package/dist/api/schemas/instance.js +7 -0
  10. package/dist/api/schemas/user.js +1 -1
  11. package/dist/auth/auth-hooks.d.ts.map +1 -1
  12. package/dist/auth/auth-hooks.js +9 -3
  13. package/dist/cli/generate-types.d.ts.map +1 -1
  14. package/dist/cli/generate-types.js +198 -11
  15. package/dist/cli/generate-types.js.map +1 -1
  16. package/dist/components/AdminApp.svelte +55 -149
  17. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  18. package/dist/components/admin/DocumentEditor.svelte +282 -253
  19. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  20. package/dist/components/admin/DocumentVersionPanel.svelte +3 -2
  21. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  22. package/dist/components/admin/MediaBrowser.svelte +29 -11
  23. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  24. package/dist/components/admin/ObjectModal.svelte +62 -75
  25. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
  26. package/dist/components/admin/SchemaField.svelte +2 -2
  27. package/dist/components/admin/fields/ArrayField.svelte +13 -3
  28. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
  29. package/dist/components/admin/fields/FileField.svelte +1 -1
  30. package/dist/components/admin/fields/ImageField.svelte +1 -1
  31. package/dist/components/admin/fields/ReferenceField.svelte +42 -11
  32. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
  33. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +116 -0
  34. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts +12 -0
  35. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts.map +1 -0
  36. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte +111 -0
  37. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte.d.ts +12 -0
  38. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte.d.ts.map +1 -0
  39. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte +67 -0
  40. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts +12 -0
  41. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts.map +1 -0
  42. package/dist/components/admin/fields/richtext/RichtextField.svelte +1296 -0
  43. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts +15 -0
  44. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -0
  45. package/dist/components/admin/fields/richtext/custom-annotation-mark.d.ts +7 -0
  46. package/dist/components/admin/fields/richtext/custom-annotation-mark.d.ts.map +1 -0
  47. package/dist/components/admin/fields/richtext/custom-annotation-mark.js +33 -0
  48. package/dist/components/admin/fields/richtext/portable-text-inline-object.d.ts +11 -0
  49. package/dist/components/admin/fields/richtext/portable-text-inline-object.d.ts.map +1 -0
  50. package/dist/components/admin/fields/richtext/portable-text-inline-object.js +31 -0
  51. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts +11 -0
  52. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -0
  53. package/dist/components/admin/fields/richtext/portable-text-object-node.js +31 -0
  54. package/dist/components/admin/fields/richtext/portable-text-serializer.d.ts +38 -0
  55. package/dist/components/admin/fields/richtext/portable-text-serializer.d.ts.map +1 -0
  56. package/dist/components/admin/fields/richtext/portable-text-serializer.js +297 -0
  57. package/dist/components/admin/fields/richtext/svelte-inline-node-view.d.ts +8 -0
  58. package/dist/components/admin/fields/richtext/svelte-inline-node-view.d.ts.map +1 -0
  59. package/dist/components/admin/fields/richtext/svelte-inline-node-view.js +67 -0
  60. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts +8 -0
  61. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -0
  62. package/dist/components/admin/fields/richtext/svelte-node-view.js +63 -0
  63. package/dist/components/layout/OrganizationSwitcher.svelte +1 -1
  64. package/dist/components/layout/sidebar/NavMain.svelte +9 -1
  65. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -1
  66. package/dist/db/interfaces/asset.d.ts +2 -4
  67. package/dist/db/interfaces/asset.d.ts.map +1 -1
  68. package/dist/db/interfaces/document.d.ts +8 -2
  69. package/dist/db/interfaces/document.d.ts.map +1 -1
  70. package/dist/db/interfaces/organization.d.ts +1 -1
  71. package/dist/db/interfaces/organization.d.ts.map +1 -1
  72. package/dist/field-access.d.ts.map +1 -1
  73. package/dist/field-access.js +5 -1
  74. package/dist/graphql/depth-limit.d.ts +8 -0
  75. package/dist/graphql/depth-limit.d.ts.map +1 -0
  76. package/dist/graphql/depth-limit.js +79 -0
  77. package/dist/graphql/index.d.ts.map +1 -1
  78. package/dist/graphql/index.js +12 -1
  79. package/dist/graphql/resolvers.d.ts.map +1 -1
  80. package/dist/graphql/resolvers.js +22 -22
  81. package/dist/graphql/schema.d.ts.map +1 -1
  82. package/dist/graphql/schema.js +7 -3
  83. package/dist/hooks.d.ts +2 -0
  84. package/dist/hooks.d.ts.map +1 -1
  85. package/dist/hooks.js +5 -2
  86. package/dist/lib/api/api-keys.d.ts +8 -3
  87. package/dist/lib/api/api-keys.d.ts.map +1 -1
  88. package/dist/lib/api/api-keys.js.map +1 -1
  89. package/dist/lib/api/schemas/assets.js +1 -1
  90. package/dist/lib/api/schemas/assets.js.map +1 -1
  91. package/dist/lib/api/schemas/documents.d.ts +0 -2
  92. package/dist/lib/api/schemas/documents.d.ts.map +1 -1
  93. package/dist/lib/api/schemas/documents.js +2 -8
  94. package/dist/lib/api/schemas/documents.js.map +1 -1
  95. package/dist/lib/api/schemas/instance.d.ts +6 -0
  96. package/dist/lib/api/schemas/instance.d.ts.map +1 -0
  97. package/dist/lib/api/schemas/instance.js +8 -0
  98. package/dist/lib/api/schemas/instance.js.map +1 -0
  99. package/dist/lib/api/schemas/user.js +1 -1
  100. package/dist/lib/auth/auth-hooks.d.ts.map +1 -1
  101. package/dist/lib/auth/auth-hooks.js +9 -3
  102. package/dist/lib/auth/auth-hooks.js.map +1 -1
  103. package/dist/lib/components/admin/fields/richtext/custom-annotation-mark.d.ts +7 -0
  104. package/dist/lib/components/admin/fields/richtext/custom-annotation-mark.d.ts.map +1 -0
  105. package/dist/lib/components/admin/fields/richtext/custom-annotation-mark.js +34 -0
  106. package/dist/lib/components/admin/fields/richtext/custom-annotation-mark.js.map +1 -0
  107. package/dist/lib/components/admin/fields/richtext/portable-text-inline-object.d.ts +11 -0
  108. package/dist/lib/components/admin/fields/richtext/portable-text-inline-object.d.ts.map +1 -0
  109. package/dist/lib/components/admin/fields/richtext/portable-text-inline-object.js +32 -0
  110. package/dist/lib/components/admin/fields/richtext/portable-text-inline-object.js.map +1 -0
  111. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts +11 -0
  112. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -0
  113. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js +32 -0
  114. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js.map +1 -0
  115. package/dist/lib/components/admin/fields/richtext/portable-text-serializer.d.ts +38 -0
  116. package/dist/lib/components/admin/fields/richtext/portable-text-serializer.d.ts.map +1 -0
  117. package/dist/lib/components/admin/fields/richtext/portable-text-serializer.js +298 -0
  118. package/dist/lib/components/admin/fields/richtext/portable-text-serializer.js.map +1 -0
  119. package/dist/lib/components/admin/fields/richtext/svelte-inline-node-view.d.ts +8 -0
  120. package/dist/lib/components/admin/fields/richtext/svelte-inline-node-view.d.ts.map +1 -0
  121. package/dist/lib/components/admin/fields/richtext/svelte-inline-node-view.js +68 -0
  122. package/dist/lib/components/admin/fields/richtext/svelte-inline-node-view.js.map +1 -0
  123. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts +8 -0
  124. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -0
  125. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js +64 -0
  126. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js.map +1 -0
  127. package/dist/lib/db/interfaces/asset.d.ts +2 -4
  128. package/dist/lib/db/interfaces/asset.d.ts.map +1 -1
  129. package/dist/lib/db/interfaces/document.d.ts +8 -2
  130. package/dist/lib/db/interfaces/document.d.ts.map +1 -1
  131. package/dist/lib/db/interfaces/organization.d.ts +1 -1
  132. package/dist/lib/db/interfaces/organization.d.ts.map +1 -1
  133. package/dist/lib/field-access.d.ts.map +1 -1
  134. package/dist/lib/field-access.js +5 -1
  135. package/dist/lib/field-access.js.map +1 -1
  136. package/dist/lib/graphql/depth-limit.d.ts +8 -0
  137. package/dist/lib/graphql/depth-limit.d.ts.map +1 -0
  138. package/dist/lib/graphql/depth-limit.js +80 -0
  139. package/dist/lib/graphql/depth-limit.js.map +1 -0
  140. package/dist/lib/graphql/index.d.ts.map +1 -1
  141. package/dist/lib/graphql/index.js +12 -1
  142. package/dist/lib/graphql/index.js.map +1 -1
  143. package/dist/lib/graphql/resolvers.d.ts.map +1 -1
  144. package/dist/lib/graphql/resolvers.js +22 -22
  145. package/dist/lib/graphql/resolvers.js.map +1 -1
  146. package/dist/lib/graphql/schema.d.ts.map +1 -1
  147. package/dist/lib/graphql/schema.js +7 -3
  148. package/dist/lib/graphql/schema.js.map +1 -1
  149. package/dist/lib/hooks.d.ts +2 -0
  150. package/dist/lib/hooks.d.ts.map +1 -1
  151. package/dist/lib/hooks.js +5 -2
  152. package/dist/lib/hooks.js.map +1 -1
  153. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  154. package/dist/lib/local-api/collection-api.js +14 -9
  155. package/dist/lib/local-api/collection-api.js.map +1 -1
  156. package/dist/lib/local-api/index.d.ts +5 -1
  157. package/dist/lib/local-api/index.d.ts.map +1 -1
  158. package/dist/lib/local-api/index.js +12 -4
  159. package/dist/lib/local-api/index.js.map +1 -1
  160. package/dist/lib/routes/assets-cdn.d.ts.map +1 -1
  161. package/dist/lib/routes/assets-cdn.js +8 -3
  162. package/dist/lib/routes/assets-cdn.js.map +1 -1
  163. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  164. package/dist/lib/schema-utils/validator.js +5 -1
  165. package/dist/lib/schema-utils/validator.js.map +1 -1
  166. package/dist/lib/server/api/index.d.ts.map +1 -1
  167. package/dist/lib/server/api/index.js +18 -0
  168. package/dist/lib/server/api/index.js.map +1 -1
  169. package/dist/lib/server/api/routes/assets-bulk.d.ts.map +1 -1
  170. package/dist/lib/server/api/routes/assets-bulk.js +4 -0
  171. package/dist/lib/server/api/routes/assets-bulk.js.map +1 -1
  172. package/dist/lib/server/api/routes/assets-by-id.d.ts.map +1 -1
  173. package/dist/lib/server/api/routes/assets-by-id.js +17 -2
  174. package/dist/lib/server/api/routes/assets-by-id.js.map +1 -1
  175. package/dist/lib/server/api/routes/assets-references.d.ts.map +1 -1
  176. package/dist/lib/server/api/routes/assets-references.js +6 -4
  177. package/dist/lib/server/api/routes/assets-references.js.map +1 -1
  178. package/dist/lib/server/api/routes/assets.d.ts.map +1 -1
  179. package/dist/lib/server/api/routes/assets.js +18 -9
  180. package/dist/lib/server/api/routes/assets.js.map +1 -1
  181. package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -1
  182. package/dist/lib/server/api/routes/document-versions.js +8 -0
  183. package/dist/lib/server/api/routes/document-versions.js.map +1 -1
  184. package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -1
  185. package/dist/lib/server/api/routes/documents-by-id.js +3 -3
  186. package/dist/lib/server/api/routes/documents-by-id.js.map +1 -1
  187. package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -1
  188. package/dist/lib/server/api/routes/documents-publish.js +2 -2
  189. package/dist/lib/server/api/routes/documents-publish.js.map +1 -1
  190. package/dist/lib/server/api/routes/documents-query.d.ts.map +1 -1
  191. package/dist/lib/server/api/routes/documents-query.js +2 -3
  192. package/dist/lib/server/api/routes/documents-query.js.map +1 -1
  193. package/dist/lib/server/api/routes/documents.d.ts.map +1 -1
  194. package/dist/lib/server/api/routes/documents.js +3 -5
  195. package/dist/lib/server/api/routes/documents.js.map +1 -1
  196. package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -1
  197. package/dist/lib/server/api/routes/organizations-invitations.js +1 -1
  198. package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -1
  199. package/dist/lib/server/api/routes/organizations-members.d.ts.map +1 -1
  200. package/dist/lib/server/api/routes/organizations-members.js.map +1 -1
  201. package/dist/lib/server/index.d.ts +1 -0
  202. package/dist/lib/server/index.d.ts.map +1 -1
  203. package/dist/lib/server/index.js +2 -0
  204. package/dist/lib/server/index.js.map +1 -1
  205. package/dist/lib/services/asset-service.d.ts.map +1 -1
  206. package/dist/lib/services/asset-service.js +4 -2
  207. package/dist/lib/services/asset-service.js.map +1 -1
  208. package/dist/lib/services/references-service.d.ts.map +1 -1
  209. package/dist/lib/services/references-service.js.map +1 -1
  210. package/dist/lib/storage/adapters/local-storage-adapter.d.ts +4 -0
  211. package/dist/lib/storage/adapters/local-storage-adapter.d.ts.map +1 -1
  212. package/dist/lib/storage/adapters/local-storage-adapter.js +28 -6
  213. package/dist/lib/storage/adapters/local-storage-adapter.js.map +1 -1
  214. package/dist/lib/types/capabilities.d.ts +1 -0
  215. package/dist/lib/types/capabilities.d.ts.map +1 -1
  216. package/dist/lib/types/capabilities.js +3 -0
  217. package/dist/lib/types/capabilities.js.map +1 -1
  218. package/dist/lib/types/config.d.ts +16 -1
  219. package/dist/lib/types/config.d.ts.map +1 -1
  220. package/dist/lib/types/schemas.d.ts +27 -0
  221. package/dist/lib/types/schemas.d.ts.map +1 -1
  222. package/dist/lib/types/schemas.js +3 -1
  223. package/dist/lib/types/schemas.js.map +1 -1
  224. package/dist/lib/utils/logger.d.ts +8 -6
  225. package/dist/lib/utils/logger.d.ts.map +1 -1
  226. package/dist/lib/utils/logger.js +11 -2
  227. package/dist/lib/utils/logger.js.map +1 -1
  228. package/dist/lib/utils/mime-detect.d.ts.map +1 -1
  229. package/dist/lib/utils/mime-detect.js +21 -6
  230. package/dist/lib/utils/mime-detect.js.map +1 -1
  231. package/dist/lib/vite/index.d.ts.map +1 -1
  232. package/dist/lib/vite/index.js +4 -5
  233. package/dist/lib/vite/index.js.map +1 -1
  234. package/dist/local-api/collection-api.d.ts.map +1 -1
  235. package/dist/local-api/collection-api.js +14 -9
  236. package/dist/local-api/index.d.ts +5 -1
  237. package/dist/local-api/index.d.ts.map +1 -1
  238. package/dist/local-api/index.js +12 -4
  239. package/dist/routes/assets-cdn.d.ts.map +1 -1
  240. package/dist/routes/assets-cdn.js +8 -3
  241. package/dist/schema-utils/validator.d.ts.map +1 -1
  242. package/dist/schema-utils/validator.js +5 -1
  243. package/dist/server/api/index.d.ts.map +1 -1
  244. package/dist/server/api/index.js +18 -0
  245. package/dist/server/api/routes/assets-bulk.d.ts.map +1 -1
  246. package/dist/server/api/routes/assets-bulk.js +4 -0
  247. package/dist/server/api/routes/assets-by-id.d.ts.map +1 -1
  248. package/dist/server/api/routes/assets-by-id.js +17 -2
  249. package/dist/server/api/routes/assets-references.d.ts.map +1 -1
  250. package/dist/server/api/routes/assets-references.js +6 -4
  251. package/dist/server/api/routes/assets.d.ts.map +1 -1
  252. package/dist/server/api/routes/assets.js +18 -9
  253. package/dist/server/api/routes/document-versions.d.ts.map +1 -1
  254. package/dist/server/api/routes/document-versions.js +8 -0
  255. package/dist/server/api/routes/documents-by-id.d.ts.map +1 -1
  256. package/dist/server/api/routes/documents-by-id.js +3 -3
  257. package/dist/server/api/routes/documents-publish.d.ts.map +1 -1
  258. package/dist/server/api/routes/documents-publish.js +2 -2
  259. package/dist/server/api/routes/documents-query.d.ts.map +1 -1
  260. package/dist/server/api/routes/documents-query.js +2 -3
  261. package/dist/server/api/routes/documents.d.ts.map +1 -1
  262. package/dist/server/api/routes/documents.js +3 -5
  263. package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -1
  264. package/dist/server/api/routes/organizations-invitations.js +1 -1
  265. package/dist/server/api/routes/organizations-members.d.ts.map +1 -1
  266. package/dist/server/index.d.ts +1 -0
  267. package/dist/server/index.d.ts.map +1 -1
  268. package/dist/server/index.js +2 -0
  269. package/dist/services/asset-service.d.ts.map +1 -1
  270. package/dist/services/asset-service.js +4 -2
  271. package/dist/services/references-service.d.ts.map +1 -1
  272. package/dist/storage/adapters/local-storage-adapter.d.ts +4 -0
  273. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -1
  274. package/dist/storage/adapters/local-storage-adapter.js +28 -6
  275. package/dist/types/capabilities.d.ts +1 -0
  276. package/dist/types/capabilities.d.ts.map +1 -1
  277. package/dist/types/capabilities.js +3 -0
  278. package/dist/types/config.d.ts +16 -1
  279. package/dist/types/config.d.ts.map +1 -1
  280. package/dist/types/schemas.d.ts +27 -0
  281. package/dist/types/schemas.d.ts.map +1 -1
  282. package/dist/types/schemas.js +3 -1
  283. package/dist/utils/logger.d.ts +8 -6
  284. package/dist/utils/logger.d.ts.map +1 -1
  285. package/dist/utils/logger.js +11 -2
  286. package/dist/utils/mime-detect.d.ts.map +1 -1
  287. package/dist/utils/mime-detect.js +21 -6
  288. package/dist/vite/index.d.ts.map +1 -1
  289. package/dist/vite/index.js +4 -5
  290. package/package.json +9 -5
@@ -68,6 +68,7 @@
68
68
  }: Props = $props();
69
69
 
70
70
  // Set schema context for child components (ArrayField, etc.)
71
+ // svelte-ignore state_referenced_locally
71
72
  setSchemaContext(schemas);
72
73
 
73
74
  // Read permissions from the AdminApp context for per-action gating.
@@ -181,6 +182,7 @@
181
182
  return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
182
183
  }
183
184
  let inspectTab = $state<'parsed' | 'raw'>('parsed');
185
+ let inspectPerspective = $state<'draft' | 'published'>('draft');
184
186
 
185
187
  // Header options dropdown
186
188
  let showHeaderMenu = $state(false);
@@ -476,7 +478,7 @@
476
478
  if (typeof field.initialValue === 'function') {
477
479
  try {
478
480
  initialData[field.name] = await field.initialValue();
479
- } catch (error) {
481
+ } catch {
480
482
  toast.error(`Failed to resolve initial value for "${field.name}"`);
481
483
  // Fall back to default value for the field type
482
484
  initialData[field.name] = getDefaultValueForFieldType(field.type);
@@ -516,7 +518,7 @@
516
518
  function hasChangesFromSaved(): boolean {
517
519
  const baseline = fullDocument
518
520
  ? (() => {
519
- const { id, _meta, ...savedData } = fullDocument;
521
+ const { id: _id, _meta, ...savedData } = fullDocument;
520
522
  return savedData;
521
523
  })()
522
524
  : initialDocumentData;
@@ -734,9 +736,7 @@
734
736
  }
735
737
  const fetchedById = new Map(fetched.map((d) => [d.id, d]));
736
738
  const checks = refIds.map((id) => ({ id, doc: fetchedById.get(id) ?? null }));
737
- const blockers = checks.filter(
738
- (c) => !c.doc || (c.doc as any)._meta?.status !== 'published'
739
- );
739
+ const blockers = checks.filter((c) => !c.doc || (c.doc as any)._meta?.status !== 'published');
740
740
  if (blockers.length > 0) {
741
741
  const titles = blockers
742
742
  .slice(0, 3)
@@ -921,7 +921,7 @@
921
921
  messages
922
922
  );
923
923
  }
924
- } catch (error) {
924
+ } catch {
925
925
  invalid.push({
926
926
  name: field.name,
927
927
  title: field.title ?? field.name,
@@ -1029,7 +1029,7 @@
1029
1029
  <div class="relative flex h-full w-full min-w-0 flex-col overflow-hidden">
1030
1030
  <!-- Hero Header -->
1031
1031
  <div class="bg-background w-full min-w-0 overflow-x-clip px-4 pt-4 pb-5 lg:px-6 lg:pt-5">
1032
- <div class="mx-auto w-full max-w-3xl">
1032
+ <div class="w-full">
1033
1033
  <!-- Top row: breadcrumb + actions -->
1034
1034
  <div class="mb-4 flex items-center justify-between gap-3">
1035
1035
  <div
@@ -1123,7 +1123,7 @@
1123
1123
  </Button>
1124
1124
  {#if showHeaderMenu}
1125
1125
  <div
1126
- class="bg-background border-rule absolute top-full right-0 z-50 mt-1 min-w-[160px] rounded-md border py-1 shadow-lg"
1126
+ class="bg-background border-rule absolute top-full right-0 z-[60] mt-1 min-w-[160px] rounded-md border py-1 shadow-lg"
1127
1127
  >
1128
1128
  <button
1129
1129
  onclick={() => {
@@ -1148,7 +1148,9 @@
1148
1148
  <Code class="h-3.5 w-3.5" /> Inspect
1149
1149
  </button>
1150
1150
  </div>
1151
- <div class="fixed inset-0 z-40" onclick={() => (showHeaderMenu = false)}></div>
1151
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
1152
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
1153
+ <div class="fixed inset-0 z-[55]" onclick={() => (showHeaderMenu = false)}></div>
1152
1154
  {/if}
1153
1155
  </div>
1154
1156
  {/if}
@@ -1233,181 +1235,184 @@
1233
1235
  </div>
1234
1236
 
1235
1237
  <!-- Content Form -->
1236
- <div class="flex-1 overflow-auto p-4 lg:p-6">
1237
- <div class="mx-auto w-full max-w-3xl space-y-4 lg:space-y-6">
1238
- {#if saveError}
1239
- <div class="bg-destructive/10 border-destructive/20 rounded-md border p-3">
1240
- <p class="text-destructive text-sm">{saveError}</p>
1241
- </div>
1242
- {/if}
1238
+ <div data-document-editor class="relative flex min-h-0 flex-1 flex-col">
1239
+ <div class="flex flex-1 flex-col overflow-auto p-4 lg:p-6">
1240
+ <div class="flex w-full flex-1 flex-col gap-4 lg:gap-6">
1241
+ {#if saveError}
1242
+ <div class="bg-destructive/10 border-destructive/20 rounded-md border p-3">
1243
+ <p class="text-destructive text-sm">{saveError}</p>
1244
+ </div>
1245
+ {/if}
1243
1246
 
1244
- {#if schemaError}
1245
- <div class="bg-destructive/10 border-destructive/20 rounded-md border p-3">
1246
- <p class="text-destructive text-sm">Schema Error: {schemaError}</p>
1247
- </div>
1248
- {:else if schemaLoading}
1249
- <div class="p-6 text-center">
1250
- <div class="text-muted-foreground text-sm">Loading schema...</div>
1251
- </div>
1252
- {:else if schema}
1253
- <!-- Orphaned Fields Warning -->
1254
- {#if showOrphanedFields && orphanedFields.length > 0}
1255
- <div class="space-y-3 rounded-md border border-orange-200 bg-orange-50 p-4">
1256
- <div class="flex items-center gap-2">
1257
- <svg
1258
- class="h-5 w-5 text-orange-600"
1259
- fill="none"
1260
- viewBox="0 0 24 24"
1261
- stroke="currentColor"
1262
- >
1263
- <path
1264
- stroke-linecap="round"
1265
- stroke-linejoin="round"
1266
- stroke-width="2"
1267
- d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L5.081 16.5c-.77.833.192 2.5 1.732 2.5z"
1268
- />
1269
- </svg>
1270
- <h4 class="text-sm font-medium text-orange-800">
1271
- {orphanedFields.length} orphaned field{orphanedFields.length === 1 ? '' : 's'} detected
1272
- </h4>
1273
- </div>
1247
+ {#if schemaError}
1248
+ <div class="bg-destructive/10 border-destructive/20 rounded-md border p-3">
1249
+ <p class="text-destructive text-sm">Schema Error: {schemaError}</p>
1250
+ </div>
1251
+ {:else if schemaLoading}
1252
+ <div class="p-6 text-center">
1253
+ <div class="text-muted-foreground text-sm">Loading schema...</div>
1254
+ </div>
1255
+ {:else if schema}
1256
+ <!-- Orphaned Fields Warning -->
1257
+ {#if showOrphanedFields && orphanedFields.length > 0}
1258
+ <div class="space-y-3 rounded-md border border-orange-200 bg-orange-50 p-4">
1259
+ <div class="flex items-center gap-2">
1260
+ <svg
1261
+ class="h-5 w-5 text-orange-600"
1262
+ fill="none"
1263
+ viewBox="0 0 24 24"
1264
+ stroke="currentColor"
1265
+ >
1266
+ <path
1267
+ stroke-linecap="round"
1268
+ stroke-linejoin="round"
1269
+ stroke-width="2"
1270
+ d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L5.081 16.5c-.77.833.192 2.5 1.732 2.5z"
1271
+ />
1272
+ </svg>
1273
+ <h4 class="text-sm font-medium text-orange-800">
1274
+ {orphanedFields.length} orphaned field{orphanedFields.length === 1 ? '' : 's'} detected
1275
+ </h4>
1276
+ </div>
1274
1277
 
1275
- <p class="text-sm text-orange-700">
1276
- These fields exist in your document but are no longer defined in the schema:
1277
- </p>
1278
+ <p class="text-sm text-orange-700">
1279
+ These fields exist in your document but are no longer defined in the schema:
1280
+ </p>
1278
1281
 
1279
- <div class="space-y-2">
1280
- {#each orphanedFields as field, index (index)}
1281
- <div
1282
- class="flex items-center justify-between rounded border border-orange-200 bg-white p-3"
1283
- >
1284
- <div class="flex-1">
1285
- <div class="font-mono text-sm font-medium text-orange-800">
1286
- {field.path || field.key}
1287
- </div>
1288
- <div class="mt-1 text-xs text-orange-600">
1289
- <code class="rounded bg-orange-100 px-1">{JSON.stringify(field.value)}</code>
1282
+ <div class="space-y-2">
1283
+ {#each orphanedFields as field, index (index)}
1284
+ <div
1285
+ class="flex items-center justify-between rounded border border-orange-200 bg-white p-3"
1286
+ >
1287
+ <div class="flex-1">
1288
+ <div class="font-mono text-sm font-medium text-orange-800">
1289
+ {field.path || field.key}
1290
+ </div>
1291
+ <div class="mt-1 text-xs text-orange-600">
1292
+ <code class="rounded bg-orange-100 px-1">{JSON.stringify(field.value)}</code
1293
+ >
1294
+ </div>
1290
1295
  </div>
1296
+ <Button
1297
+ size="sm"
1298
+ variant="outline"
1299
+ onclick={() => removeOrphanedField(field)}
1300
+ class="ml-3 h-8 border-red-200 px-3 text-red-600 hover:border-red-300 hover:bg-red-50"
1301
+ >
1302
+ Remove
1303
+ </Button>
1291
1304
  </div>
1292
- <Button
1293
- size="sm"
1294
- variant="outline"
1295
- onclick={() => removeOrphanedField(field)}
1296
- class="ml-3 h-8 border-red-200 px-3 text-red-600 hover:border-red-300 hover:bg-red-50"
1297
- >
1298
- Remove
1299
- </Button>
1300
- </div>
1301
- {/each}
1302
- </div>
1305
+ {/each}
1306
+ </div>
1303
1307
 
1304
- <div class="flex gap-2 border-t border-orange-200 pt-2">
1305
- <Button
1306
- size="sm"
1307
- variant="outline"
1308
- onclick={cleanupAllOrphanedFields}
1309
- class="border-orange-600 bg-orange-600 text-white hover:bg-orange-700"
1310
- >
1311
- Remove All
1312
- </Button>
1313
- <Button
1314
- size="sm"
1315
- variant="ghost"
1316
- onclick={dismissOrphanedFields}
1317
- class="text-orange-700 hover:text-orange-800"
1318
- >
1319
- Dismiss
1320
- </Button>
1308
+ <div class="flex gap-2 border-t border-orange-200 pt-2">
1309
+ <Button
1310
+ size="sm"
1311
+ variant="outline"
1312
+ onclick={cleanupAllOrphanedFields}
1313
+ class="border-orange-600 bg-orange-600 text-white hover:bg-orange-700"
1314
+ >
1315
+ Remove All
1316
+ </Button>
1317
+ <Button
1318
+ size="sm"
1319
+ variant="ghost"
1320
+ onclick={dismissOrphanedFields}
1321
+ class="text-orange-700 hover:text-orange-800"
1322
+ >
1323
+ Dismiss
1324
+ </Button>
1325
+ </div>
1321
1326
  </div>
1322
- </div>
1323
- {/if}
1327
+ {/if}
1324
1328
 
1325
- <!-- Field Group Tabs -->
1326
- {#if schema.groups && schema.groups.length > 0}
1327
- {@const visibleGroups = schema.groups.filter((g) => !g.hidden)}
1328
- <div class="mb-4 flex items-center gap-1 overflow-x-auto py-1">
1329
- <button
1330
- type="button"
1331
- onclick={() => (activeGroup = 'all')}
1332
- class="cursor-pointer rounded-md px-3 py-1.5 text-sm font-medium whitespace-nowrap transition-colors {activeGroup ===
1333
- 'all'
1334
- ? 'bg-muted text-foreground'
1335
- : 'text-muted-foreground hover:text-foreground'}"
1336
- >
1337
- All fields
1338
- </button>
1339
- {#each visibleGroups as group (group.name)}
1329
+ <!-- Field Group Tabs -->
1330
+ {#if schema.groups && schema.groups.length > 0}
1331
+ {@const visibleGroups = schema.groups.filter((g) => !g.hidden)}
1332
+ <div class="mb-4 flex items-center gap-1 overflow-x-auto py-1">
1340
1333
  <button
1341
1334
  type="button"
1342
- onclick={() => (activeGroup = group.name)}
1343
- class="flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium whitespace-nowrap transition-colors {activeGroup ===
1344
- group.name
1335
+ onclick={() => (activeGroup = 'all')}
1336
+ class="cursor-pointer rounded-md px-3 py-1.5 text-sm font-medium whitespace-nowrap transition-colors {activeGroup ===
1337
+ 'all'
1345
1338
  ? 'bg-muted text-foreground'
1346
1339
  : 'text-muted-foreground hover:text-foreground'}"
1347
1340
  >
1348
- {#if group.icon}
1349
- {@const Icon = group.icon}
1350
- <Icon class="h-4 w-4" />
1351
- {/if}
1352
- {group.title}
1341
+ All fields
1353
1342
  </button>
1343
+ {#each visibleGroups as group (group.name)}
1344
+ <button
1345
+ type="button"
1346
+ onclick={() => (activeGroup = group.name)}
1347
+ class="flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium whitespace-nowrap transition-colors {activeGroup ===
1348
+ group.name
1349
+ ? 'bg-muted text-foreground'
1350
+ : 'text-muted-foreground hover:text-foreground'}"
1351
+ >
1352
+ {#if group.icon}
1353
+ {@const Icon = group.icon}
1354
+ <Icon class="h-4 w-4" />
1355
+ {/if}
1356
+ {group.title}
1357
+ </button>
1358
+ {/each}
1359
+ </div>
1360
+ {/if}
1361
+
1362
+ <!-- Dynamic Schema Fields -->
1363
+ <svelte:boundary
1364
+ onerror={(error) =>
1365
+ cmsLogger.error('[DocumentEditor]', 'Error in editor content:', error)}
1366
+ >
1367
+ {#each schema.fields.filter((f) => fieldInGroup(f, activeGroup) && !hiddenFieldNames.has(f.name)) as field (field.name)}
1368
+ {@const viewData =
1369
+ isPreviewingVersion && activePreview
1370
+ ? activePreview.data
1371
+ : isViewingPublished && publishedData
1372
+ ? publishedData
1373
+ : documentData}
1374
+ <SchemaField
1375
+ {field}
1376
+ value={viewData[field.name]}
1377
+ documentData={viewData}
1378
+ onUpdate={(newValue) => {
1379
+ if (isViewingPublished) return;
1380
+ documentData = { ...documentData, [field.name]: newValue };
1381
+ hasUnsavedChanges = true;
1382
+ }}
1383
+ {onOpenReference}
1384
+ schemaType={documentType}
1385
+ readonly={isReadOnly ||
1386
+ isViewingPublished ||
1387
+ isPreviewingVersion ||
1388
+ isFieldReadonly(field.name)}
1389
+ organizationId={fullDocument?._meta?.organizationId}
1390
+ />
1354
1391
  {/each}
1392
+
1393
+ {#snippet failed(error, reset)}
1394
+ <div class="border-destructive/30 bg-destructive/5 rounded-md border p-4 text-center">
1395
+ <p class="text-destructive font-medium">Document editor encountered an error</p>
1396
+ <p class="text-muted-foreground mt-1 text-sm">
1397
+ {error instanceof Error ? error.message : 'Unknown error'}
1398
+ </p>
1399
+ <button
1400
+ class="bg-primary text-primary-foreground mt-3 rounded px-4 py-2 text-sm"
1401
+ onclick={reset}
1402
+ >
1403
+ Reload editor
1404
+ </button>
1405
+ </div>
1406
+ {/snippet}
1407
+ </svelte:boundary>
1408
+ {:else}
1409
+ <div class="border-muted-foreground/30 rounded-md border border-dashed p-4">
1410
+ <p class="text-muted-foreground text-center text-sm">
1411
+ No schema found for document type: {documentType}
1412
+ </p>
1355
1413
  </div>
1356
1414
  {/if}
1357
-
1358
- <!-- Dynamic Schema Fields -->
1359
- <svelte:boundary
1360
- onerror={(error) =>
1361
- cmsLogger.error('[DocumentEditor]', 'Error in editor content:', error)}
1362
- >
1363
- {#each schema.fields.filter((f) => fieldInGroup(f, activeGroup) && !hiddenFieldNames.has(f.name)) as field (field.name)}
1364
- {@const viewData =
1365
- isPreviewingVersion && activePreview
1366
- ? activePreview.data
1367
- : isViewingPublished && publishedData
1368
- ? publishedData
1369
- : documentData}
1370
- <SchemaField
1371
- {field}
1372
- value={viewData[field.name]}
1373
- documentData={viewData}
1374
- onUpdate={(newValue) => {
1375
- if (isViewingPublished) return;
1376
- documentData = { ...documentData, [field.name]: newValue };
1377
- hasUnsavedChanges = true;
1378
- }}
1379
- {onOpenReference}
1380
- schemaType={documentType}
1381
- readonly={isReadOnly ||
1382
- isViewingPublished ||
1383
- isPreviewingVersion ||
1384
- isFieldReadonly(field.name)}
1385
- organizationId={fullDocument?._meta?.organizationId}
1386
- />
1387
- {/each}
1388
-
1389
- {#snippet failed(error, reset)}
1390
- <div class="border-destructive/30 bg-destructive/5 rounded-md border p-4 text-center">
1391
- <p class="text-destructive font-medium">Document editor encountered an error</p>
1392
- <p class="text-muted-foreground mt-1 text-sm">
1393
- {error instanceof Error ? error.message : 'Unknown error'}
1394
- </p>
1395
- <button
1396
- class="bg-primary text-primary-foreground mt-3 rounded px-4 py-2 text-sm"
1397
- onclick={reset}
1398
- >
1399
- Reload editor
1400
- </button>
1401
- </div>
1402
- {/snippet}
1403
- </svelte:boundary>
1404
- {:else}
1405
- <div class="border-muted-foreground/30 rounded-md border border-dashed p-4">
1406
- <p class="text-muted-foreground text-center text-sm">
1407
- No schema found for document type: {documentType}
1408
- </p>
1409
- </div>
1410
- {/if}
1415
+ </div>
1411
1416
  </div>
1412
1417
  </div>
1413
1418
 
@@ -1549,6 +1554,7 @@
1549
1554
  showVersionHistory = false;
1550
1555
  previewingVersion = null;
1551
1556
  }}
1557
+ aria-label="Close version history"
1552
1558
  ></button>
1553
1559
  <!-- Panel -->
1554
1560
  <div class="bg-background border-rule flex w-80 flex-col border-l shadow-lg">
@@ -1560,6 +1566,7 @@
1560
1566
  showVersionHistory = false;
1561
1567
  previewingVersion = null;
1562
1568
  }}
1569
+ aria-label="Close version history"
1563
1570
  >
1564
1571
  <svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
1565
1572
  <path
@@ -1583,50 +1590,50 @@
1583
1590
  {:else if versionsList.length > 0}
1584
1591
  <div class="divide-y">
1585
1592
  {#each versionsList as version}
1586
- <button
1587
- class="hover:bg-muted w-full space-y-1 px-4 py-3 text-left transition-colors {previewingVersion?.versionNumber ===
1588
- version.versionNumber
1589
- ? 'bg-muted border-l-primary border-l-2'
1590
- : ''}"
1591
- onclick={async () => {
1592
- try {
1593
- const res = await documents.getVersion(documentId, version.versionNumber);
1594
- if (res.success && res.data) {
1595
- previewingVersion = {
1596
- versionNumber: version.versionNumber,
1597
- data: res.data.data ?? {},
1598
- eventType: version.eventType
1599
- };
1600
- }
1601
- } catch {
1602
- toast.error('Failed to load version');
1593
+ <button
1594
+ class="hover:bg-muted w-full space-y-1 px-4 py-3 text-left transition-colors {previewingVersion?.versionNumber ===
1595
+ version.versionNumber
1596
+ ? 'bg-muted border-l-primary border-l-2'
1597
+ : ''}"
1598
+ onclick={async () => {
1599
+ try {
1600
+ const res = await documents.getVersion(documentId, version.versionNumber);
1601
+ if (res.success && res.data) {
1602
+ previewingVersion = {
1603
+ versionNumber: version.versionNumber,
1604
+ data: res.data.data ?? {},
1605
+ eventType: version.eventType
1606
+ };
1603
1607
  }
1604
- }}
1605
- >
1606
- <div class="flex items-center gap-2">
1607
- <span class="text-xs font-medium">v{version.versionNumber}</span>
1608
- <Badge
1609
- variant={version.eventType === 'publish'
1610
- ? 'default'
1611
- : version.eventType === 'restore'
1612
- ? 'outline'
1613
- : 'secondary'}
1614
- class="text-[10px]"
1615
- >
1616
- {version.eventType}
1617
- </Badge>
1618
- </div>
1619
- <p class="text-muted-foreground text-[11px]">
1620
- {version.createdAt ? new Date(version.createdAt).toLocaleString() : ''}
1621
- </p>
1622
- </button>
1623
- {/each}
1624
- </div>
1625
- {:else}
1626
- <div class="p-4 text-center">
1627
- <span class="text-muted-foreground text-sm">No versions yet</span>
1628
- </div>
1629
- {/if}
1608
+ } catch {
1609
+ toast.error('Failed to load version');
1610
+ }
1611
+ }}
1612
+ >
1613
+ <div class="flex items-center gap-2">
1614
+ <span class="text-xs font-medium">v{version.versionNumber}</span>
1615
+ <Badge
1616
+ variant={version.eventType === 'publish'
1617
+ ? 'default'
1618
+ : version.eventType === 'restore'
1619
+ ? 'outline'
1620
+ : 'secondary'}
1621
+ class="text-[10px]"
1622
+ >
1623
+ {version.eventType}
1624
+ </Badge>
1625
+ </div>
1626
+ <p class="text-muted-foreground text-[11px]">
1627
+ {version.createdAt ? new Date(version.createdAt).toLocaleString() : ''}
1628
+ </p>
1629
+ </button>
1630
+ {/each}
1631
+ </div>
1632
+ {:else}
1633
+ <div class="p-4 text-center">
1634
+ <span class="text-muted-foreground text-sm">No versions yet</span>
1635
+ </div>
1636
+ {/if}
1630
1637
  </div>
1631
1638
  </div>
1632
1639
  </div>
@@ -1660,54 +1667,76 @@
1660
1667
  </div>
1661
1668
 
1662
1669
  <!-- Tabs -->
1663
- <div class="flex border-b">
1664
- <button
1665
- class="px-4 py-2 text-sm font-medium transition-colors {inspectTab === 'parsed'
1666
- ? 'border-primary text-foreground border-b-2'
1667
- : 'text-muted-foreground hover:text-foreground'}"
1668
- onclick={() => (inspectTab = 'parsed')}
1669
- >
1670
- Parsed
1671
- </button>
1672
- <button
1673
- class="px-4 py-2 text-sm font-medium transition-colors {inspectTab === 'raw'
1674
- ? 'border-primary text-foreground border-b-2'
1675
- : 'text-muted-foreground hover:text-foreground'}"
1676
- onclick={() => (inspectTab = 'raw')}
1677
- >
1678
- Raw JSON
1679
- </button>
1670
+ <div class="flex items-center justify-between border-b">
1671
+ <div class="flex">
1672
+ <button
1673
+ class="px-4 py-2 text-sm font-medium transition-colors {inspectTab === 'parsed'
1674
+ ? 'border-primary text-foreground border-b-2'
1675
+ : 'text-muted-foreground hover:text-foreground'}"
1676
+ onclick={() => (inspectTab = 'parsed')}
1677
+ >
1678
+ Parsed
1679
+ </button>
1680
+ <button
1681
+ class="px-4 py-2 text-sm font-medium transition-colors {inspectTab === 'raw'
1682
+ ? 'border-primary text-foreground border-b-2'
1683
+ : 'text-muted-foreground hover:text-foreground'}"
1684
+ onclick={() => (inspectTab = 'raw')}
1685
+ >
1686
+ Raw JSON
1687
+ </button>
1688
+ </div>
1689
+ <div class="flex gap-1 pr-2">
1690
+ <button
1691
+ class="rounded px-2 py-1 text-xs font-medium transition-colors {inspectPerspective ===
1692
+ 'draft'
1693
+ ? 'bg-muted text-foreground'
1694
+ : 'text-muted-foreground hover:text-foreground'}"
1695
+ onclick={() => (inspectPerspective = 'draft')}
1696
+ >
1697
+ Draft
1698
+ </button>
1699
+ <button
1700
+ class="rounded px-2 py-1 text-xs font-medium transition-colors {inspectPerspective ===
1701
+ 'published'
1702
+ ? 'bg-muted text-foreground'
1703
+ : 'text-muted-foreground hover:text-foreground'}"
1704
+ onclick={() => (inspectPerspective = 'published')}
1705
+ >
1706
+ Published
1707
+ </button>
1708
+ </div>
1680
1709
  </div>
1681
1710
 
1682
1711
  <!-- Content -->
1683
1712
  <div class="flex-1 overflow-auto p-4 font-mono text-sm">
1684
- {#if inspectTab === 'raw'}
1685
- <pre
1686
- class="text-xs break-all whitespace-pre-wrap select-text"
1687
- tabindex="0"
1688
- onkeydown={(e) => {
1689
- if ((e.metaKey || e.ctrlKey) && e.key === 'a') {
1690
- e.preventDefault();
1691
- e.stopPropagation();
1692
- const sel = window.getSelection();
1693
- const range = document.createRange();
1694
- range.selectNodeContents(e.currentTarget);
1695
- sel?.removeAllRanges();
1696
- sel?.addRange(range);
1697
- }
1698
- }}>{@html syntaxHighlightJson(
1699
- JSON.stringify(
1700
- { id: documentId, _meta: fullDocument?._meta, ...documentData },
1701
- null,
1702
- 2
1703
- )
1704
- )}</pre>
1713
+ {#if inspectPerspective === 'published' && !publishedData}
1714
+ <p class="text-muted-foreground text-sm">No published data available.</p>
1705
1715
  {:else}
1706
- {@render parsedValue(
1707
- null,
1708
- { id: documentId, _meta: fullDocument?._meta, ...documentData },
1709
- 0
1710
- )}
1716
+ {@const inspectData =
1717
+ inspectPerspective === 'published' && publishedData
1718
+ ? { id: documentId, _meta: fullDocument?._meta, ...publishedData }
1719
+ : { id: documentId, _meta: fullDocument?._meta, ...documentData }}
1720
+ {#if inspectTab === 'raw'}
1721
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
1722
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
1723
+ <pre
1724
+ class="text-xs break-all whitespace-pre-wrap select-text"
1725
+ tabindex="0"
1726
+ onkeydown={(e) => {
1727
+ if ((e.metaKey || e.ctrlKey) && e.key === 'a') {
1728
+ e.preventDefault();
1729
+ e.stopPropagation();
1730
+ const sel = window.getSelection();
1731
+ const range = document.createRange();
1732
+ range.selectNodeContents(e.currentTarget);
1733
+ sel?.removeAllRanges();
1734
+ sel?.addRange(range);
1735
+ }
1736
+ }}>{@html syntaxHighlightJson(JSON.stringify(inspectData, null, 2))}</pre>
1737
+ {:else}
1738
+ {@render parsedValue(null, inspectData, 0)}
1739
+ {/if}
1711
1740
  {/if}
1712
1741
  </div>
1713
1742
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAexD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAkiDF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAexD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAsjDF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}