@aphexcms/cms-core 0.1.3 → 0.1.5

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 (280) hide show
  1. package/dist/api/assets.d.ts +48 -0
  2. package/dist/api/assets.d.ts.map +1 -0
  3. package/dist/api/assets.js +52 -0
  4. package/dist/api/client.d.ts +37 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +125 -0
  7. package/dist/api/documents.d.ts +56 -0
  8. package/dist/api/documents.d.ts.map +1 -0
  9. package/dist/api/documents.js +77 -0
  10. package/dist/api/index.d.ts +7 -0
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/index.js +5 -0
  13. package/dist/api/organizations.d.ts +101 -0
  14. package/dist/api/organizations.d.ts.map +1 -0
  15. package/dist/api/organizations.js +92 -0
  16. package/dist/api/types.d.ts +23 -0
  17. package/dist/api/types.d.ts.map +1 -0
  18. package/dist/api/types.js +1 -0
  19. package/dist/app.d.ts +19 -0
  20. package/dist/auth/MULTI_TENANCY_PLAN.md +1183 -0
  21. package/dist/auth/auth-errors.d.ts +7 -0
  22. package/dist/auth/auth-errors.d.ts.map +1 -0
  23. package/dist/auth/auth-errors.js +13 -0
  24. package/dist/auth/auth-hooks.d.ts +6 -0
  25. package/dist/auth/auth-hooks.d.ts.map +1 -0
  26. package/dist/auth/auth-hooks.js +108 -0
  27. package/dist/auth/provider.d.ts +17 -0
  28. package/dist/auth/provider.d.ts.map +1 -0
  29. package/dist/auth/provider.js +1 -0
  30. package/dist/client/index.d.ts +24 -0
  31. package/dist/client/index.d.ts.map +1 -0
  32. package/dist/client/index.js +31 -0
  33. package/dist/components/AdminApp.svelte +1077 -0
  34. package/dist/components/AdminApp.svelte.d.ts +24 -0
  35. package/dist/components/AdminApp.svelte.d.ts.map +1 -0
  36. package/dist/components/admin/AdminLayout.svelte +115 -0
  37. package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
  38. package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
  39. package/dist/components/admin/DocumentEditor.svelte +795 -0
  40. package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
  41. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
  42. package/dist/components/admin/DocumentTypesList.svelte +97 -0
  43. package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
  44. package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
  45. package/dist/components/admin/ObjectModal.svelte +135 -0
  46. package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
  47. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
  48. package/dist/components/admin/SchemaField.svelte +171 -0
  49. package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
  50. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
  51. package/dist/components/admin/fields/ArrayField.svelte +266 -0
  52. package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
  53. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
  54. package/dist/components/admin/fields/BooleanField.svelte +35 -0
  55. package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
  56. package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
  57. package/dist/components/admin/fields/ImageField.svelte +284 -0
  58. package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
  59. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
  60. package/dist/components/admin/fields/NumberField.svelte +82 -0
  61. package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
  62. package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
  63. package/dist/components/admin/fields/ReferenceField.svelte +260 -0
  64. package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
  65. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
  66. package/dist/components/admin/fields/SlugField.svelte +74 -0
  67. package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
  68. package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
  69. package/dist/components/admin/fields/StringField.svelte +40 -0
  70. package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
  71. package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
  72. package/dist/components/admin/fields/TextareaField.svelte +40 -0
  73. package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
  74. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
  75. package/dist/components/fields/index.d.ts +9 -0
  76. package/dist/components/fields/index.d.ts.map +1 -0
  77. package/dist/components/fields/index.js +9 -0
  78. package/dist/components/index.d.ts +7 -0
  79. package/dist/components/index.d.ts.map +1 -0
  80. package/dist/components/index.js +12 -0
  81. package/dist/components/layout/OrganizationSwitcher.svelte +218 -0
  82. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
  83. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
  84. package/dist/components/layout/Sidebar.svelte +88 -0
  85. package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
  86. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
  87. package/dist/components/layout/sidebar/AppSidebar.svelte +63 -0
  88. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +11 -0
  89. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
  90. package/dist/components/layout/sidebar/NavMain.svelte +95 -0
  91. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
  92. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
  93. package/dist/components/layout/sidebar/NavSecondary.svelte +69 -0
  94. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
  95. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
  96. package/dist/components/layout/sidebar/NavUser.svelte +85 -0
  97. package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
  98. package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
  99. package/dist/config.d.ts +3 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +15 -0
  102. package/dist/db/adapters/index.d.ts +1 -0
  103. package/dist/db/adapters/index.d.ts.map +1 -0
  104. package/dist/db/adapters/index.js +4 -0
  105. package/dist/db/index.d.ts +2 -0
  106. package/dist/db/index.d.ts.map +1 -0
  107. package/dist/db/index.js +4 -0
  108. package/dist/db/interfaces/asset.d.ts +51 -0
  109. package/dist/db/interfaces/asset.d.ts.map +1 -0
  110. package/dist/db/interfaces/asset.js +1 -0
  111. package/dist/db/interfaces/document.d.ts +36 -0
  112. package/dist/db/interfaces/document.d.ts.map +1 -0
  113. package/dist/db/interfaces/document.js +1 -0
  114. package/dist/db/interfaces/index.d.ts +73 -0
  115. package/dist/db/interfaces/index.d.ts.map +1 -0
  116. package/dist/db/interfaces/index.js +1 -0
  117. package/dist/db/interfaces/organization.d.ts +27 -0
  118. package/dist/db/interfaces/organization.d.ts.map +1 -0
  119. package/dist/db/interfaces/organization.js +1 -0
  120. package/dist/db/interfaces/schema.d.ts +21 -0
  121. package/dist/db/interfaces/schema.d.ts.map +1 -0
  122. package/dist/db/interfaces/schema.js +1 -0
  123. package/dist/db/interfaces/user.d.ts +15 -0
  124. package/dist/db/interfaces/user.d.ts.map +1 -0
  125. package/dist/db/interfaces/user.js +1 -0
  126. package/dist/db/utils/reference-resolver.d.ts +18 -0
  127. package/dist/db/utils/reference-resolver.d.ts.map +1 -0
  128. package/dist/db/utils/reference-resolver.js +80 -0
  129. package/dist/define.d.ts +3 -0
  130. package/dist/define.d.ts.map +1 -0
  131. package/dist/define.js +4 -0
  132. package/dist/email/index.d.ts +2 -0
  133. package/dist/email/index.d.ts.map +1 -0
  134. package/dist/email/index.js +4 -0
  135. package/dist/email/interfaces/email.d.ts +42 -0
  136. package/dist/email/interfaces/email.d.ts.map +1 -0
  137. package/dist/email/interfaces/email.js +1 -0
  138. package/dist/engine.d.ts +26 -0
  139. package/dist/engine.d.ts.map +1 -0
  140. package/dist/engine.js +66 -0
  141. package/dist/field-validation/rule.d.ts +51 -0
  142. package/dist/field-validation/rule.d.ts.map +1 -0
  143. package/dist/field-validation/rule.js +221 -0
  144. package/dist/field-validation/utils.d.ts +21 -0
  145. package/dist/field-validation/utils.d.ts.map +1 -0
  146. package/dist/field-validation/utils.js +66 -0
  147. package/dist/hooks.d.ts +23 -0
  148. package/dist/hooks.d.ts.map +1 -0
  149. package/dist/hooks.js +96 -0
  150. package/dist/index.d.ts +2 -0
  151. package/dist/index.d.ts.map +1 -0
  152. package/dist/index.js +4 -0
  153. package/dist/plugins/README.md +154 -0
  154. package/dist/routes/assets-by-id.d.ts +5 -0
  155. package/dist/routes/assets-by-id.d.ts.map +1 -0
  156. package/dist/routes/assets-by-id.js +138 -0
  157. package/dist/routes/assets-cdn.d.ts +3 -0
  158. package/dist/routes/assets-cdn.d.ts.map +1 -0
  159. package/dist/routes/assets-cdn.js +155 -0
  160. package/dist/routes/assets.d.ts +4 -0
  161. package/dist/routes/assets.d.ts.map +1 -0
  162. package/dist/routes/assets.js +94 -0
  163. package/dist/routes/documents-by-id.d.ts +5 -0
  164. package/dist/routes/documents-by-id.d.ts.map +1 -0
  165. package/dist/routes/documents-by-id.js +142 -0
  166. package/dist/routes/documents-publish.d.ts +4 -0
  167. package/dist/routes/documents-publish.d.ts.map +1 -0
  168. package/dist/routes/documents-publish.js +151 -0
  169. package/dist/routes/documents.d.ts +4 -0
  170. package/dist/routes/documents.d.ts.map +1 -0
  171. package/dist/routes/documents.js +131 -0
  172. package/dist/routes/index.d.ts +6 -0
  173. package/dist/routes/index.d.ts.map +1 -0
  174. package/dist/routes/index.js +10 -0
  175. package/dist/routes/organizations-by-id.d.ts +5 -0
  176. package/dist/routes/organizations-by-id.d.ts.map +1 -0
  177. package/dist/routes/organizations-by-id.js +187 -0
  178. package/dist/routes/organizations-invitations.d.ts +4 -0
  179. package/dist/routes/organizations-invitations.d.ts.map +1 -0
  180. package/dist/routes/organizations-invitations.js +125 -0
  181. package/dist/routes/organizations-members.d.ts +5 -0
  182. package/dist/routes/organizations-members.d.ts.map +1 -0
  183. package/dist/routes/organizations-members.js +206 -0
  184. package/dist/routes/organizations-switch.d.ts +3 -0
  185. package/dist/routes/organizations-switch.d.ts.map +1 -0
  186. package/dist/routes/organizations-switch.js +53 -0
  187. package/dist/routes/organizations.d.ts +4 -0
  188. package/dist/routes/organizations.d.ts.map +1 -0
  189. package/dist/routes/organizations.js +108 -0
  190. package/dist/routes/schemas-by-type.d.ts +3 -0
  191. package/dist/routes/schemas-by-type.d.ts.map +1 -0
  192. package/dist/routes/schemas-by-type.js +25 -0
  193. package/dist/routes/schemas.d.ts +3 -0
  194. package/dist/routes/schemas.d.ts.map +1 -0
  195. package/dist/routes/schemas.js +11 -0
  196. package/dist/routes-exports.d.ts +14 -0
  197. package/dist/routes-exports.d.ts.map +1 -0
  198. package/dist/routes-exports.js +19 -0
  199. package/dist/schema-context.svelte.d.ts +10 -0
  200. package/dist/schema-context.svelte.d.ts.map +1 -0
  201. package/dist/schema-context.svelte.js +18 -0
  202. package/dist/schema-utils/cleanup.d.ts +21 -0
  203. package/dist/schema-utils/cleanup.d.ts.map +1 -0
  204. package/dist/schema-utils/cleanup.js +80 -0
  205. package/dist/schema-utils/index.d.ts +4 -0
  206. package/dist/schema-utils/index.d.ts.map +1 -0
  207. package/dist/schema-utils/index.js +4 -0
  208. package/dist/schema-utils/utils.d.ts +30 -0
  209. package/dist/schema-utils/utils.d.ts.map +1 -0
  210. package/dist/schema-utils/utils.js +37 -0
  211. package/dist/schema-utils/validator.d.ts +6 -0
  212. package/dist/schema-utils/validator.d.ts.map +1 -0
  213. package/dist/schema-utils/validator.js +45 -0
  214. package/dist/server/index.d.ts +16 -0
  215. package/dist/server/index.d.ts.map +1 -0
  216. package/dist/server/index.js +28 -0
  217. package/dist/services/asset-service.d.ts +86 -0
  218. package/dist/services/asset-service.d.ts.map +1 -0
  219. package/dist/services/asset-service.js +187 -0
  220. package/dist/services/index.d.ts +3 -0
  221. package/dist/services/index.d.ts.map +1 -0
  222. package/dist/services/index.js +4 -0
  223. package/dist/storage/adapters/index.d.ts +2 -0
  224. package/dist/storage/adapters/index.d.ts.map +1 -0
  225. package/dist/storage/adapters/index.js +2 -0
  226. package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
  227. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
  228. package/dist/storage/adapters/local-storage-adapter.js +187 -0
  229. package/dist/storage/index.d.ts +3 -0
  230. package/dist/storage/index.d.ts.map +1 -0
  231. package/dist/storage/index.js +6 -0
  232. package/dist/storage/interfaces/index.d.ts +2 -0
  233. package/dist/storage/interfaces/index.d.ts.map +1 -0
  234. package/dist/storage/interfaces/index.js +2 -0
  235. package/dist/storage/interfaces/storage.d.ts +91 -0
  236. package/dist/storage/interfaces/storage.d.ts.map +1 -0
  237. package/dist/storage/interfaces/storage.js +1 -0
  238. package/dist/storage/providers/storage.d.ts +43 -0
  239. package/dist/storage/providers/storage.d.ts.map +1 -0
  240. package/dist/storage/providers/storage.js +64 -0
  241. package/dist/types/asset.d.ts +73 -0
  242. package/dist/types/asset.d.ts.map +1 -0
  243. package/dist/types/asset.js +2 -0
  244. package/dist/types/auth.d.ts +50 -0
  245. package/dist/types/auth.d.ts.map +1 -0
  246. package/dist/types/auth.js +41 -0
  247. package/dist/types/config.d.ts +47 -0
  248. package/dist/types/config.d.ts.map +1 -0
  249. package/dist/types/config.js +1 -0
  250. package/dist/types/document.d.ts +34 -0
  251. package/dist/types/document.d.ts.map +1 -0
  252. package/dist/types/document.js +1 -0
  253. package/dist/types/index.d.ts +9 -0
  254. package/dist/types/index.d.ts.map +1 -0
  255. package/dist/types/index.js +8 -0
  256. package/dist/types/organization.d.ts +105 -0
  257. package/dist/types/organization.d.ts.map +1 -0
  258. package/dist/types/organization.js +3 -0
  259. package/dist/types/schemas.d.ts +114 -0
  260. package/dist/types/schemas.d.ts.map +1 -0
  261. package/dist/types/schemas.js +1 -0
  262. package/dist/types/sidebar.d.ts +33 -0
  263. package/dist/types/sidebar.d.ts.map +1 -0
  264. package/dist/types/sidebar.js +1 -0
  265. package/dist/types/user.d.ts +14 -0
  266. package/dist/types/user.d.ts.map +1 -0
  267. package/dist/types/user.js +1 -0
  268. package/dist/utils/content-hash.d.ts +22 -0
  269. package/dist/utils/content-hash.d.ts.map +1 -0
  270. package/dist/utils/content-hash.js +67 -0
  271. package/dist/utils/image-url.d.ts +88 -0
  272. package/dist/utils/image-url.d.ts.map +1 -0
  273. package/dist/utils/image-url.js +165 -0
  274. package/dist/utils/index.d.ts +6 -0
  275. package/dist/utils/index.d.ts.map +1 -0
  276. package/dist/utils/index.js +9 -0
  277. package/dist/utils/slug.d.ts +13 -0
  278. package/dist/utils/slug.d.ts.map +1 -0
  279. package/dist/utils/slug.js +30 -0
  280. package/package.json +11 -41
@@ -0,0 +1,18 @@
1
+ import type { SchemaType } from 'src/types/schemas.js';
2
+ interface Props {
3
+ schemas: SchemaType[];
4
+ documentType: string;
5
+ documentId?: string | null;
6
+ isCreating: boolean;
7
+ onBack: () => void;
8
+ onSaved?: (documentId: string) => void;
9
+ onAutoSaved?: (documentId: string, title: string) => void;
10
+ onDeleted?: () => void;
11
+ onPublished?: (documentId: string) => void;
12
+ onOpenReference?: (documentId: string, documentType: string) => void;
13
+ isReadOnly?: boolean;
14
+ }
15
+ declare const DocumentEditor: import("svelte").Component<Props, {}, "">;
16
+ type DocumentEditor = ReturnType<typeof DocumentEditor>;
17
+ export default DocumentEditor;
18
+ //# sourceMappingURL=DocumentEditor.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMtD,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,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAwsBF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,97 @@
1
+ <script lang="ts">
2
+ import { Badge } from '@aphexcms/ui/shadcn/badge';
3
+ import {
4
+ SidebarGroup,
5
+ SidebarGroupLabel,
6
+ SidebarGroupContent,
7
+ SidebarMenu,
8
+ SidebarMenuItem,
9
+ SidebarMenuButton
10
+ } from '@aphexcms/ui/shadcn/sidebar';
11
+ import { page } from '$app/state';
12
+
13
+ interface DocumentType {
14
+ name: string;
15
+ title: string;
16
+ description?: string;
17
+ documentCount?: number;
18
+ }
19
+
20
+ interface Props {
21
+ documentTypes: DocumentType[];
22
+ objectTypes: DocumentType[];
23
+ }
24
+
25
+ let { documentTypes, objectTypes }: Props = $props();
26
+
27
+ const currentPath = $derived(page.url.pathname);
28
+ </script>
29
+
30
+ <!-- Document Types Section -->
31
+ {#if documentTypes.length > 0}
32
+ <SidebarGroup class="max-w-[350px]">
33
+ <SidebarGroupLabel class="flex items-center justify-between">
34
+ <span class="flex items-center gap-2">
35
+ <span>📄</span>
36
+ Content
37
+ </span>
38
+ <Badge variant="secondary" class="text-xs">{documentTypes.length}</Badge>
39
+ </SidebarGroupLabel>
40
+
41
+ <SidebarGroupContent>
42
+ <SidebarMenu>
43
+ {#each documentTypes as docType, index (index)}
44
+ <SidebarMenuItem>
45
+ <SidebarMenuButton
46
+ onclick={goto(`/admin/documents/${docType.name}`)}
47
+ isActive={currentPath.includes(`/documents/${docType.name}`)}
48
+ class="group"
49
+ >
50
+ <div class="flex min-w-0 flex-1 items-center gap-2">
51
+ <div
52
+ class="flex h-5 w-5 flex-shrink-0 items-center justify-center rounded bg-blue-100 dark:bg-blue-900/20"
53
+ >
54
+ <span class="text-xs text-blue-600 dark:text-blue-400">📄</span>
55
+ </div>
56
+ <div class="min-w-0 flex-1">
57
+ <div class="truncate text-sm font-medium">{docType.title}</div>
58
+ {#if docType.description}
59
+ <div class="text-muted-foreground truncate text-xs">{docType.description}</div>
60
+ {/if}
61
+ </div>
62
+ </div>
63
+ </SidebarMenuButton>
64
+ </SidebarMenuItem>
65
+ {/each}
66
+ </SidebarMenu>
67
+ </SidebarGroupContent>
68
+ </SidebarGroup>
69
+ {/if}
70
+
71
+ <!-- Object Types Section -->
72
+ {#if objectTypes.length > 0}
73
+ <SidebarGroup>
74
+ <SidebarGroupLabel class="flex items-center justify-between">
75
+ <span class="flex items-center gap-2">
76
+ <span>🧩</span>
77
+ Object Types
78
+ </span>
79
+ <Badge variant="secondary" class="text-xs">{objectTypes.length}</Badge>
80
+ </SidebarGroupLabel>
81
+ </SidebarGroup>
82
+ {/if}
83
+
84
+ <!-- Empty state -->
85
+ {#if documentTypes.length === 0 && objectTypes.length === 0}
86
+ <SidebarGroup>
87
+ <SidebarGroupContent>
88
+ <div class="text-muted-foreground space-y-2 py-6 text-center">
89
+ <div class="text-2xl">📄</div>
90
+ <div>
91
+ <p class="text-sm">No content types found</p>
92
+ <p class="text-xs">Define schemas in schemaTypes/</p>
93
+ </div>
94
+ </div>
95
+ </SidebarGroupContent>
96
+ </SidebarGroup>
97
+ {/if}
@@ -0,0 +1,14 @@
1
+ interface DocumentType {
2
+ name: string;
3
+ title: string;
4
+ description?: string;
5
+ documentCount?: number;
6
+ }
7
+ interface Props {
8
+ documentTypes: DocumentType[];
9
+ objectTypes: DocumentType[];
10
+ }
11
+ declare const DocumentTypesList: import("svelte").Component<Props, {}, "">;
12
+ type DocumentTypesList = ReturnType<typeof DocumentTypesList>;
13
+ export default DocumentTypesList;
14
+ //# sourceMappingURL=DocumentTypesList.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentTypesList.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentTypesList.svelte.ts"],"names":[],"mappings":"AAeC,UAAU,YAAY;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,KAAK;IACd,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,EAAE,YAAY,EAAE,CAAC;CAC5B;AA8EF,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,135 @@
1
+ <script lang="ts">
2
+ import { Button } from '@aphexcms/ui/shadcn/button';
3
+ import * as Card from '@aphexcms/ui/shadcn/card';
4
+ import type { SchemaType } from 'src/types/schemas.js';
5
+ import SchemaField from './SchemaField.svelte';
6
+
7
+ interface Props {
8
+ open: boolean;
9
+ schema: SchemaType;
10
+ value: Record<string, any>;
11
+ onClose: () => void;
12
+ onSave: (value: Record<string, any>) => void;
13
+ onUpdate?: (value: Record<string, any>) => void; // For real-time updates
14
+ onOpenReference?: (documentId: string, documentType: string) => void;
15
+ readonly?: boolean;
16
+ }
17
+
18
+ // TODO: add onUpdate to auto save
19
+ let {
20
+ open,
21
+ schema,
22
+ value,
23
+ onClose,
24
+ onSave,
25
+ onUpdate,
26
+ onOpenReference,
27
+ readonly = false
28
+ }: Props = $props();
29
+
30
+ // Initialize editing data with defaults and existing values
31
+ function initializeData() {
32
+ const initialData: Record<string, any> = {};
33
+
34
+ if (schema?.fields) {
35
+ schema.fields.forEach((field) => {
36
+ if (field.type === 'boolean' && 'initialValue' in field) {
37
+ initialData[field.name] = field.initialValue;
38
+ } else {
39
+ initialData[field.name] = '';
40
+ }
41
+ });
42
+ }
43
+
44
+ return { ...initialData, ...value };
45
+ }
46
+
47
+ // Local state for editing
48
+ let editingData = $state<Record<string, any>>(initializeData());
49
+
50
+ function handleSave() {
51
+ onSave(editingData);
52
+ onClose();
53
+ }
54
+
55
+ function handleCancel() {
56
+ onClose();
57
+ }
58
+
59
+ // Handle backdrop click
60
+ function handleBackdropClick(e: MouseEvent) {
61
+ if (e.target === e.currentTarget) {
62
+ onClose();
63
+ }
64
+ }
65
+
66
+ // Handle escape key
67
+ function handleKeydown(e: KeyboardEvent) {
68
+ if (e.key === 'Escape') {
69
+ onClose();
70
+ }
71
+ }
72
+ </script>
73
+
74
+ {#if open}
75
+ <!-- Backdrop - fixed to viewport on mobile (below navbar), relative to parent on desktop -->
76
+ <div
77
+ class="bg-background/80 fixed bottom-0 left-0 right-0 top-12 z-[100] flex items-center justify-center p-6 backdrop-blur-sm sm:absolute sm:top-0 sm:p-4"
78
+ onclick={handleBackdropClick}
79
+ onkeydown={handleKeydown}
80
+ role="button"
81
+ tabindex="-1"
82
+ >
83
+ <!-- Modal Content -->
84
+ <Card.Root class="flex max-h-[85vh] w-full max-w-2xl flex-col overflow-hidden shadow-lg">
85
+ <Card.Header class="border-b">
86
+ <div class="flex items-center justify-between">
87
+ <div>
88
+ <Card.Title>{schema.title}</Card.Title>
89
+ {#if schema.description}
90
+ <Card.Description>{schema.description}</Card.Description>
91
+ {/if}
92
+ </div>
93
+ <Button variant="ghost" size="icon" onclick={onClose}>
94
+ <svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
95
+ <path
96
+ stroke-linecap="round"
97
+ stroke-linejoin="round"
98
+ stroke-width="2"
99
+ d="M6 18L18 6M6 6l12 12"
100
+ />
101
+ </svg>
102
+ </Button>
103
+ </div>
104
+ </Card.Header>
105
+
106
+ <Card.Content class="flex-1 overflow-auto p-6">
107
+ <div class="space-y-4">
108
+ {#if schema.fields}
109
+ {#each schema.fields as field, index (index)}
110
+ <SchemaField
111
+ {field}
112
+ value={editingData[field.name]}
113
+ documentData={editingData}
114
+ onUpdate={(newValue) => {
115
+ editingData = { ...editingData, [field.name]: newValue };
116
+ }}
117
+ {onOpenReference}
118
+ {readonly}
119
+ />
120
+ {/each}
121
+ {/if}
122
+ </div>
123
+ </Card.Content>
124
+
125
+ <Card.Footer class="flex justify-end gap-2 border-t">
126
+ {#if readonly}
127
+ <Button onclick={onClose}>Close</Button>
128
+ {:else}
129
+ <Button variant="outline" onclick={handleCancel}>Cancel</Button>
130
+ <Button onclick={handleSave}>Save Changes</Button>
131
+ {/if}
132
+ </Card.Footer>
133
+ </Card.Root>
134
+ </div>
135
+ {/if}
@@ -0,0 +1,15 @@
1
+ import type { SchemaType } from 'src/types/schemas.js';
2
+ interface Props {
3
+ open: boolean;
4
+ schema: SchemaType;
5
+ value: Record<string, any>;
6
+ onClose: () => void;
7
+ onSave: (value: Record<string, any>) => void;
8
+ onUpdate?: (value: Record<string, any>) => void;
9
+ onOpenReference?: (documentId: string, documentType: string) => void;
10
+ readonly?: boolean;
11
+ }
12
+ declare const ObjectModal: import("svelte").Component<Props, {}, "">;
13
+ type ObjectModal = ReturnType<typeof ObjectModal>;
14
+ export default ObjectModal;
15
+ //# sourceMappingURL=ObjectModal.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/ObjectModal.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAItD,UAAU,KAAK;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAChD,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA+GF,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,171 @@
1
+ <script lang="ts">
2
+ import { Label } from '@aphexcms/ui/shadcn/label';
3
+ import { Badge } from '@aphexcms/ui/shadcn/badge';
4
+ import * as Alert from '@aphexcms/ui/shadcn/alert';
5
+ import type { Field } from 'src/types/schemas.js';
6
+ import {
7
+ isFieldRequired,
8
+ validateField,
9
+ getValidationClasses,
10
+ type ValidationError
11
+ } from '../../field-validation/utils.js';
12
+
13
+ // Import individual field components
14
+ import StringField from './fields/StringField.svelte';
15
+ import SlugField from './fields/SlugField.svelte';
16
+ import TextareaField from './fields/TextareaField.svelte';
17
+ import NumberField from './fields/NumberField.svelte';
18
+ import BooleanField from './fields/BooleanField.svelte';
19
+ import ImageField from './fields/ImageField.svelte';
20
+ import ArrayField from './fields/ArrayField.svelte';
21
+ import ReferenceField from './fields/ReferenceField.svelte';
22
+ import SchemaField from './SchemaField.svelte';
23
+
24
+ interface Props {
25
+ field: Field;
26
+ value: any;
27
+ documentData?: Record<string, any>;
28
+ onUpdate: (value: any) => void;
29
+ onOpenReference?: (documentId: string, documentType: string) => void;
30
+ doValidation?: () => void;
31
+ schemaType?: string; // Document type
32
+ parentPath?: string; // Parent field path for nested fields
33
+ readonly?: boolean; // Read-only mode for viewers
34
+ }
35
+
36
+ let {
37
+ field,
38
+ value,
39
+ documentData,
40
+ onUpdate,
41
+ onOpenReference,
42
+ doValidation,
43
+ schemaType,
44
+ parentPath,
45
+ readonly = false
46
+ }: Props = $props();
47
+
48
+ // Build full field path
49
+ const fieldPath = parentPath ? `${parentPath}.${field.name}` : field.name;
50
+
51
+ // Validation state for the wrapper (displays errors and status)
52
+ let validationErrors = $state<ValidationError[]>([]);
53
+
54
+ // Real-time validation for wrapper display
55
+ export async function performValidation(currentValue: any, context: any = {}) {
56
+ validationErrors = []; // Clear previous errors
57
+ const result = await validateField(field, currentValue, context);
58
+ validationErrors = result.errors;
59
+ }
60
+ // Computed values
61
+ const hasErrors = $derived(validationErrors.filter((e) => e.level === 'error').length > 0);
62
+ const validationClasses = $derived(getValidationClasses(hasErrors));
63
+ </script>
64
+
65
+ <div class="space-y-2">
66
+ <div class="flex items-center justify-between">
67
+ <Label for={field.name}>
68
+ {field.title}
69
+ {#if isFieldRequired(field)}
70
+ <span class="text-destructive">*</span>
71
+ {/if}
72
+ </Label>
73
+
74
+ <div class="flex items-center gap-2">
75
+ {#if hasErrors}
76
+ <span class="text-destructive text-sm">🚨</span>
77
+ {/if}
78
+
79
+ {#if field.type}
80
+ <Badge variant="outline" class="text-xs">
81
+ {field.type}
82
+ </Badge>
83
+ {/if}
84
+ </div>
85
+ </div>
86
+
87
+ {#if field.description}
88
+ <p class="text-muted-foreground text-sm">{field.description}</p>
89
+ {/if}
90
+
91
+ <!-- Validation errors display -->
92
+ {#if validationErrors.length > 0}
93
+ <div class="space-y-2">
94
+ {#each validationErrors as error, index (index)}
95
+ <Alert.Root
96
+ variant={error.level === 'error'
97
+ ? 'destructive'
98
+ : error.level === 'warning'
99
+ ? 'default'
100
+ : 'default'}
101
+ >
102
+ <Alert.Description class="text-xs">
103
+ {error.message}
104
+ </Alert.Description>
105
+ </Alert.Root>
106
+ {/each}
107
+ </div>
108
+ {/if}
109
+
110
+ <!-- Field type routing to individual components -->
111
+ {#if field.type === 'string'}
112
+ <StringField {field} {value} {onUpdate} {validationClasses} {readonly} />
113
+ {:else if field.type === 'text'}
114
+ <TextareaField {field} {value} {onUpdate} {validationClasses} {readonly} />
115
+ {:else if field.type === 'slug'}
116
+ <SlugField {field} {value} {documentData} {onUpdate} {validationClasses} {readonly} />
117
+ {:else if field.type === 'number'}
118
+ <NumberField {field} {value} {onUpdate} {validationClasses} {readonly} />
119
+ {:else if field.type === 'boolean'}
120
+ <BooleanField {field} {value} {onUpdate} {validationClasses} {readonly} />
121
+
122
+ <!-- Image Field -->
123
+ {:else if field.type === 'image'}
124
+ <ImageField
125
+ {field}
126
+ {value}
127
+ {onUpdate}
128
+ {validationClasses}
129
+ {schemaType}
130
+ {fieldPath}
131
+ {readonly}
132
+ />
133
+
134
+ <!-- Object Field -->
135
+ {:else if field.type === 'object' && field.fields}
136
+ <div class="border-border space-y-4 rounded-md border p-4">
137
+ <h4 class="text-sm font-medium">{field.title}</h4>
138
+ {#each field.fields as subField, index (index)}
139
+ <SchemaField
140
+ field={subField}
141
+ value={value?.[subField.name]}
142
+ {documentData}
143
+ onUpdate={(subValue) => onUpdate({ ...value, [subField.name]: subValue })}
144
+ {doValidation}
145
+ {schemaType}
146
+ parentPath={fieldPath}
147
+ {readonly}
148
+ />
149
+ {/each}
150
+ </div>
151
+
152
+ <!-- Array Field -->
153
+ {:else if field.type === 'array' && field.of}
154
+ <ArrayField {field} {value} {onUpdate} {onOpenReference} {readonly} />
155
+
156
+ <!-- Reference Field -->
157
+ {:else if field.type === 'reference' && field.to}
158
+ <ReferenceField {field} {value} {onUpdate} {onOpenReference} {readonly} />
159
+
160
+ <!-- Unknown field type -->
161
+ {:else}
162
+ <div class="border-muted-foreground/30 rounded-md border border-dashed p-4 text-center">
163
+ <p class="text-muted-foreground text-sm">
164
+ Field type "{field.type}" not yet supported
165
+ </p>
166
+ <p class="text-muted-foreground mt-1 text-xs">
167
+ Raw value: {JSON.stringify(value)}
168
+ </p>
169
+ </div>
170
+ {/if}
171
+ </div>
@@ -0,0 +1,19 @@
1
+ import type { Field } from 'src/types/schemas.js';
2
+ import SchemaField from './SchemaField.svelte';
3
+ interface Props {
4
+ field: Field;
5
+ value: any;
6
+ documentData?: Record<string, any>;
7
+ onUpdate: (value: any) => void;
8
+ onOpenReference?: (documentId: string, documentType: string) => void;
9
+ doValidation?: () => void;
10
+ schemaType?: string;
11
+ parentPath?: string;
12
+ readonly?: boolean;
13
+ }
14
+ declare const SchemaField: import("svelte").Component<Props, {
15
+ performValidation: (currentValue: any, context?: any) => Promise<void>;
16
+ }, "">;
17
+ type SchemaField = ReturnType<typeof SchemaField>;
18
+ export default SchemaField;
19
+ //# sourceMappingURL=SchemaField.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaField.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/SchemaField.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAgBlD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAG9C,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA4IF,QAAA,MAAM,WAAW;sCArGgC,GAAG,YAAW,GAAG;MAqGT,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}