@commonpub/schema 0.16.0 → 0.17.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.
package/dist/layout.js ADDED
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Layout engine schema — four tables for the page composition system.
3
+ * Spec: `docs/plans/layout-and-pages.md` §3.3 + §4.
4
+ *
5
+ * Layered shape: zone → row → section.
6
+ * - A `layouts` row exists per route, virtual key, or custom page.
7
+ * - Each layout has rows grouped by zone; each row has sections.
8
+ * - On publish, the entire layout is snapshotted into `layout_versions`.
9
+ *
10
+ * Why normalised tables (vs JSON-in-settings): reorders + section-level
11
+ * RLS + per-section-type schema migrations are all cheap. See §4.2.
12
+ */
13
+ import { pgTable, uuid, varchar, integer, boolean, jsonb, timestamp, index, unique, check } from 'drizzle-orm/pg-core';
14
+ import { sql } from 'drizzle-orm';
15
+ import { relations } from 'drizzle-orm';
16
+ import { users } from './auth.js';
17
+ // --- Tables --------------------------------------------------------------
18
+ /**
19
+ * One layout per scope. `scope_type + scope_key` is the unique addressing
20
+ * key — e.g. `('route', '/')` for the homepage, `('custom-page', '/about')`
21
+ * for a DB-stored page, `('virtual', '__footer')` for the site footer.
22
+ */
23
+ export const layouts = pgTable('layouts', {
24
+ id: uuid('id').defaultRandom().primaryKey(),
25
+ /** 'route' | 'virtual' | 'custom-page' — enforced in Zod, kept flexible at SQL layer */
26
+ scopeType: varchar('scope_type', { length: 32 }).notNull(),
27
+ /** Path for route/custom-page, virtual key for virtual */
28
+ scopeKey: varchar('scope_key', { length: 512 }).notNull(),
29
+ name: varchar('name', { length: 256 }).notNull(),
30
+ /** PageMeta — title, description, ogImage, frame, access, etc. Required for custom-page. */
31
+ pageMeta: jsonb('page_meta'),
32
+ /** 'draft' | 'published' — drafts are still resolvable for preview, only published serve public traffic */
33
+ state: varchar('state', { length: 16 }).notNull().default('draft'),
34
+ /**
35
+ * Pointer to the version snapshot currently serving traffic. null = no
36
+ * published version yet.
37
+ *
38
+ * **Soft FK by design**: a real FK to `layout_versions(id)` would create
39
+ * a circular dependency (layouts.published_version_id → layout_versions →
40
+ * layouts), forcing deferred constraints + chicken-and-egg inserts. The
41
+ * server CRUD validates this id exists at write time + tolerates a stale
42
+ * id at read time (treats it as "no published version" and falls back
43
+ * to the latest version row).
44
+ */
45
+ publishedVersionId: uuid('published_version_id'),
46
+ createdBy: uuid('created_by').references(() => users.id, { onDelete: 'set null' }),
47
+ updatedBy: uuid('updated_by').references(() => users.id, { onDelete: 'set null' }),
48
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
49
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
50
+ }, (t) => [
51
+ unique('layouts_scope_unique').on(t.scopeType, t.scopeKey),
52
+ index('idx_layouts_scope').on(t.scopeType, t.scopeKey),
53
+ ]);
54
+ /**
55
+ * A row groups sections horizontally inside a zone. The 12-column grid
56
+ * (see plan §3.6) divides the row's width; each section's `colSpan`
57
+ * determines how many of the 12 it occupies. Row-level styling (gap,
58
+ * align, background, padding) lives in `config`.
59
+ */
60
+ export const layoutRows = pgTable('layout_rows', {
61
+ id: uuid('id').defaultRandom().primaryKey(),
62
+ layoutId: uuid('layout_id')
63
+ .notNull()
64
+ .references(() => layouts.id, { onDelete: 'cascade' }),
65
+ /** Zone slug — must match a `<LayoutSlot zone>` declared by the page */
66
+ zone: varchar('zone', { length: 64 }).notNull(),
67
+ /** Order within zone; renumbered to {0..n} on every write */
68
+ position: integer('position').notNull(),
69
+ /** Row config — { gap?, align?, background?, paddingY? } */
70
+ config: jsonb('config'),
71
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
72
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
73
+ }, (t) => [
74
+ unique('layout_rows_position_unique').on(t.layoutId, t.zone, t.position),
75
+ index('idx_layout_rows_layout').on(t.layoutId, t.zone, t.position),
76
+ ]);
77
+ /**
78
+ * A section lives in exactly one row. `col_span` is the design-time width
79
+ * (1–12); `responsive` overrides per breakpoint. `schema_version` drives
80
+ * lazy per-type config migrations on read (see plan §10.6.1).
81
+ */
82
+ export const layoutSections = pgTable('layout_sections', {
83
+ id: uuid('id').defaultRandom().primaryKey(),
84
+ rowId: uuid('row_id')
85
+ .notNull()
86
+ .references(() => layoutRows.id, { onDelete: 'cascade' }),
87
+ /** Position within row, left-to-right; renumbered on write */
88
+ position: integer('position').notNull(),
89
+ /** Admin can disable a section without deleting (preserves config) */
90
+ enabled: boolean('enabled').notNull().default(true),
91
+ /** Section-type slug — resolves in the SECTION_REGISTRY */
92
+ type: varchar('type', { length: 128 }).notNull(),
93
+ /** Per-type config blob — validated against the section's Zod schema before save */
94
+ config: jsonb('config').notNull().default({}),
95
+ /** 1–12; check constraint mirrors the Zod invariant for defence-in-depth */
96
+ colSpan: integer('col_span').notNull().default(12),
97
+ /** { sm?: 1-12, md?: 1-12, lg?: 1-12 } — falls through lg ↦ md ↦ sm ↦ colSpan */
98
+ responsive: jsonb('responsive'),
99
+ /** { roles?, features?, hideAt? } */
100
+ visibility: jsonb('visibility'),
101
+ /** Per-section-type config schema version; bumped when the type changes shape */
102
+ schemaVersion: integer('schema_version').notNull().default(1),
103
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
104
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
105
+ }, (t) => [
106
+ unique('layout_sections_position_unique').on(t.rowId, t.position),
107
+ index('idx_layout_sections_row').on(t.rowId, t.position),
108
+ index('idx_layout_sections_type').on(t.type),
109
+ check('layout_sections_col_span_check', sql `${t.colSpan} between 1 and 12`),
110
+ ]);
111
+ /**
112
+ * Immutable snapshot — published once, never updated. Revert restores the
113
+ * snapshot's data into the draft, leaving the original version row intact.
114
+ */
115
+ export const layoutVersions = pgTable('layout_versions', {
116
+ id: uuid('id').defaultRandom().primaryKey(),
117
+ layoutId: uuid('layout_id')
118
+ .notNull()
119
+ .references(() => layouts.id, { onDelete: 'cascade' }),
120
+ /** Monotonically increasing version number per layout */
121
+ version: integer('version').notNull(),
122
+ /** Full nested Layout object captured at publish time */
123
+ snapshot: jsonb('snapshot').notNull(),
124
+ publishedBy: uuid('published_by').references(() => users.id, { onDelete: 'set null' }),
125
+ publishedAt: timestamp('published_at', { withTimezone: true }).defaultNow().notNull(),
126
+ }, (t) => [
127
+ unique('layout_versions_version_unique').on(t.layoutId, t.version),
128
+ index('idx_layout_versions_layout').on(t.layoutId, t.version),
129
+ ]);
130
+ // --- Relations -----------------------------------------------------------
131
+ export const layoutsRelations = relations(layouts, ({ many, one }) => ({
132
+ rows: many(layoutRows),
133
+ versions: many(layoutVersions),
134
+ creator: one(users, { fields: [layouts.createdBy], references: [users.id], relationName: 'layoutCreator' }),
135
+ updater: one(users, { fields: [layouts.updatedBy], references: [users.id], relationName: 'layoutUpdater' }),
136
+ }));
137
+ export const layoutRowsRelations = relations(layoutRows, ({ one, many }) => ({
138
+ layout: one(layouts, { fields: [layoutRows.layoutId], references: [layouts.id] }),
139
+ sections: many(layoutSections),
140
+ }));
141
+ export const layoutSectionsRelations = relations(layoutSections, ({ one }) => ({
142
+ row: one(layoutRows, { fields: [layoutSections.rowId], references: [layoutRows.id] }),
143
+ }));
144
+ export const layoutVersionsRelations = relations(layoutVersions, ({ one }) => ({
145
+ layout: one(layouts, { fields: [layoutVersions.layoutId], references: [layouts.id] }),
146
+ publisher: one(users, { fields: [layoutVersions.publishedBy], references: [users.id] }),
147
+ }));
148
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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"}
@@ -925,4 +925,511 @@ export declare const createApiKeySchema: z.ZodObject<{
925
925
  allowedOrigins: z.ZodNullable<z.ZodOptional<z.ZodArray<z.ZodString>>>;
926
926
  }, z.core.$strip>;
927
927
  export type CreateApiKeyInput = z.infer<typeof createApiKeySchema>;
928
+ /** Slug for a custom theme ID — kebab/snake, lowercase, used in data-theme attr. */
929
+ export declare const customThemeIdSchema: z.ZodString;
930
+ /** Token name (without leading `--`). Permissive — we accept any kebab key
931
+ * so custom themes can introduce brand tokens (e.g. `deveco-portal-purple`)
932
+ * on top of the canonical TOKEN_NAMES list. */
933
+ export declare const themeTokenKeySchema: z.ZodString;
934
+ /** Token value — any CSS value, length-capped to keep the JSON sane. */
935
+ export declare const themeTokenValueSchema: z.ZodString;
936
+ export declare const themeTokenMapSchema: z.ZodRecord<z.ZodString, z.ZodString>;
937
+ export type ThemeTokenMap = z.infer<typeof themeTokenMapSchema>;
938
+ export declare const customThemeSchema: z.ZodObject<{
939
+ id: z.ZodString;
940
+ name: z.ZodString;
941
+ description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
942
+ family: z.ZodString;
943
+ isDark: z.ZodBoolean;
944
+ pairId: z.ZodOptional<z.ZodString>;
945
+ parentTheme: z.ZodDefault<z.ZodString>;
946
+ tokens: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
947
+ createdAt: z.ZodOptional<z.ZodString>;
948
+ updatedAt: z.ZodOptional<z.ZodString>;
949
+ }, z.core.$strip>;
950
+ export type CustomThemeInput = z.infer<typeof customThemeSchema>;
951
+ /** PUT body — accepts partial updates. */
952
+ export declare const customThemeUpdateSchema: z.ZodObject<{
953
+ id: z.ZodNonOptional<z.ZodOptional<z.ZodString>>;
954
+ name: z.ZodOptional<z.ZodString>;
955
+ description: z.ZodOptional<z.ZodDefault<z.ZodOptional<z.ZodString>>>;
956
+ family: z.ZodOptional<z.ZodString>;
957
+ isDark: z.ZodOptional<z.ZodBoolean>;
958
+ pairId: z.ZodOptional<z.ZodOptional<z.ZodString>>;
959
+ parentTheme: z.ZodOptional<z.ZodDefault<z.ZodString>>;
960
+ tokens: z.ZodOptional<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>>;
961
+ createdAt: z.ZodOptional<z.ZodOptional<z.ZodString>>;
962
+ updatedAt: z.ZodOptional<z.ZodOptional<z.ZodString>>;
963
+ }, z.core.$strip>;
964
+ /** Exported theme file format. Version bumped when the schema breaks. */
965
+ export declare const themeExportSchema: z.ZodObject<{
966
+ formatVersion: z.ZodLiteral<1>;
967
+ exportedAt: z.ZodString;
968
+ theme: z.ZodObject<{
969
+ id: z.ZodString;
970
+ name: z.ZodString;
971
+ description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
972
+ family: z.ZodString;
973
+ isDark: z.ZodBoolean;
974
+ pairId: z.ZodOptional<z.ZodString>;
975
+ parentTheme: z.ZodDefault<z.ZodString>;
976
+ tokens: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
977
+ createdAt: z.ZodOptional<z.ZodString>;
978
+ updatedAt: z.ZodOptional<z.ZodString>;
979
+ }, z.core.$strip>;
980
+ }, z.core.$strip>;
981
+ export type ThemeExport = z.infer<typeof themeExportSchema>;
982
+ /** Layout scope — one row per scope key. */
983
+ export declare const layoutScopeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
984
+ type: z.ZodLiteral<"route">;
985
+ path: z.ZodString;
986
+ }, z.core.$strip>, z.ZodObject<{
987
+ type: z.ZodLiteral<"virtual">;
988
+ key: z.ZodEnum<{
989
+ __footer: "__footer";
990
+ "__not-found": "__not-found";
991
+ __error: "__error";
992
+ }>;
993
+ }, z.core.$strip>, z.ZodObject<{
994
+ type: z.ZodLiteral<"custom-page">;
995
+ path: z.ZodString;
996
+ }, z.core.$strip>], "type">;
997
+ export type LayoutScope = z.infer<typeof layoutScopeSchema>;
998
+ /** Per-page SEO + access metadata. Required for custom-page scope. */
999
+ export declare const pageMetaSchema: z.ZodObject<{
1000
+ title: z.ZodString;
1001
+ description: z.ZodOptional<z.ZodString>;
1002
+ ogImage: z.ZodOptional<z.ZodString>;
1003
+ noindex: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
1004
+ ogType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1005
+ article: "article";
1006
+ website: "website";
1007
+ profile: "profile";
1008
+ }>>>;
1009
+ access: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1010
+ admin: "admin";
1011
+ public: "public";
1012
+ members: "members";
1013
+ }>>>;
1014
+ frame: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1015
+ narrow: "narrow";
1016
+ wide: "wide";
1017
+ "two-column": "two-column";
1018
+ "three-column": "three-column";
1019
+ "sidebar-left": "sidebar-left";
1020
+ "sidebar-right": "sidebar-right";
1021
+ }>>>;
1022
+ }, z.core.$strip>;
1023
+ export type PageMetaInput = z.infer<typeof pageMetaSchema>;
1024
+ /** Per-section conditional visibility. */
1025
+ export declare const sectionVisibilitySchema: z.ZodObject<{
1026
+ roles: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1027
+ member: "member";
1028
+ pro: "pro";
1029
+ verified: "verified";
1030
+ staff: "staff";
1031
+ admin: "admin";
1032
+ anonymous: "anonymous";
1033
+ }>>>;
1034
+ features: z.ZodOptional<z.ZodArray<z.ZodString>>;
1035
+ hideAt: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1036
+ sm: "sm";
1037
+ md: "md";
1038
+ lg: "lg";
1039
+ }>>>;
1040
+ }, z.core.$strip>;
1041
+ export type SectionVisibility = z.infer<typeof sectionVisibilitySchema>;
1042
+ /** Responsive colSpan overrides — lg ↦ md ↦ sm ↦ base colSpan. */
1043
+ export declare const sectionResponsiveSchema: z.ZodObject<{
1044
+ sm: z.ZodOptional<z.ZodNumber>;
1045
+ md: z.ZodOptional<z.ZodNumber>;
1046
+ lg: z.ZodOptional<z.ZodNumber>;
1047
+ }, z.core.$strip>;
1048
+ export type SectionResponsive = z.infer<typeof sectionResponsiveSchema>;
1049
+ /** A single section — placed in a row, occupies `colSpan` of 12. */
1050
+ export declare const layoutSectionSchema: z.ZodObject<{
1051
+ id: z.ZodString;
1052
+ order: z.ZodNumber;
1053
+ type: z.ZodString;
1054
+ config: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1055
+ colSpan: z.ZodDefault<z.ZodNumber>;
1056
+ responsive: z.ZodOptional<z.ZodObject<{
1057
+ sm: z.ZodOptional<z.ZodNumber>;
1058
+ md: z.ZodOptional<z.ZodNumber>;
1059
+ lg: z.ZodOptional<z.ZodNumber>;
1060
+ }, z.core.$strip>>;
1061
+ enabled: z.ZodDefault<z.ZodBoolean>;
1062
+ visibility: z.ZodOptional<z.ZodObject<{
1063
+ roles: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1064
+ member: "member";
1065
+ pro: "pro";
1066
+ verified: "verified";
1067
+ staff: "staff";
1068
+ admin: "admin";
1069
+ anonymous: "anonymous";
1070
+ }>>>;
1071
+ features: z.ZodOptional<z.ZodArray<z.ZodString>>;
1072
+ hideAt: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1073
+ sm: "sm";
1074
+ md: "md";
1075
+ lg: "lg";
1076
+ }>>>;
1077
+ }, z.core.$strip>>;
1078
+ schemaVersion: z.ZodDefault<z.ZodNumber>;
1079
+ }, z.core.$strip>;
1080
+ export type LayoutSectionInput = z.infer<typeof layoutSectionSchema>;
1081
+ /** Row-level styling (gap, alignment, background, vertical padding). */
1082
+ export declare const layoutRowConfigSchema: z.ZodObject<{
1083
+ gap: z.ZodOptional<z.ZodEnum<{
1084
+ none: "none";
1085
+ sm: "sm";
1086
+ md: "md";
1087
+ lg: "lg";
1088
+ }>>;
1089
+ align: z.ZodOptional<z.ZodEnum<{
1090
+ start: "start";
1091
+ center: "center";
1092
+ stretch: "stretch";
1093
+ }>>;
1094
+ background: z.ZodOptional<z.ZodString>;
1095
+ paddingY: z.ZodOptional<z.ZodEnum<{
1096
+ none: "none";
1097
+ sm: "sm";
1098
+ md: "md";
1099
+ lg: "lg";
1100
+ xl: "xl";
1101
+ }>>;
1102
+ }, z.core.$strip>;
1103
+ export type LayoutRowConfig = z.infer<typeof layoutRowConfigSchema>;
1104
+ /** A row groups sections horizontally; sum of colSpans must be ≤ 12. */
1105
+ export declare const layoutRowSchema: z.ZodObject<{
1106
+ id: z.ZodString;
1107
+ order: z.ZodNumber;
1108
+ config: z.ZodOptional<z.ZodObject<{
1109
+ gap: z.ZodOptional<z.ZodEnum<{
1110
+ none: "none";
1111
+ sm: "sm";
1112
+ md: "md";
1113
+ lg: "lg";
1114
+ }>>;
1115
+ align: z.ZodOptional<z.ZodEnum<{
1116
+ start: "start";
1117
+ center: "center";
1118
+ stretch: "stretch";
1119
+ }>>;
1120
+ background: z.ZodOptional<z.ZodString>;
1121
+ paddingY: z.ZodOptional<z.ZodEnum<{
1122
+ none: "none";
1123
+ sm: "sm";
1124
+ md: "md";
1125
+ lg: "lg";
1126
+ xl: "xl";
1127
+ }>>;
1128
+ }, z.core.$strip>>;
1129
+ sections: z.ZodDefault<z.ZodArray<z.ZodObject<{
1130
+ id: z.ZodString;
1131
+ order: z.ZodNumber;
1132
+ type: z.ZodString;
1133
+ config: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1134
+ colSpan: z.ZodDefault<z.ZodNumber>;
1135
+ responsive: z.ZodOptional<z.ZodObject<{
1136
+ sm: z.ZodOptional<z.ZodNumber>;
1137
+ md: z.ZodOptional<z.ZodNumber>;
1138
+ lg: z.ZodOptional<z.ZodNumber>;
1139
+ }, z.core.$strip>>;
1140
+ enabled: z.ZodDefault<z.ZodBoolean>;
1141
+ visibility: z.ZodOptional<z.ZodObject<{
1142
+ roles: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1143
+ member: "member";
1144
+ pro: "pro";
1145
+ verified: "verified";
1146
+ staff: "staff";
1147
+ admin: "admin";
1148
+ anonymous: "anonymous";
1149
+ }>>>;
1150
+ features: z.ZodOptional<z.ZodArray<z.ZodString>>;
1151
+ hideAt: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1152
+ sm: "sm";
1153
+ md: "md";
1154
+ lg: "lg";
1155
+ }>>>;
1156
+ }, z.core.$strip>>;
1157
+ schemaVersion: z.ZodDefault<z.ZodNumber>;
1158
+ }, z.core.$strip>>>;
1159
+ }, z.core.$strip>;
1160
+ export type LayoutRowInput = z.infer<typeof layoutRowSchema>;
1161
+ /** A zone holds an ordered list of rows. */
1162
+ export declare const layoutZoneSchema: z.ZodObject<{
1163
+ zone: z.ZodString;
1164
+ rows: z.ZodDefault<z.ZodArray<z.ZodObject<{
1165
+ id: z.ZodString;
1166
+ order: z.ZodNumber;
1167
+ config: z.ZodOptional<z.ZodObject<{
1168
+ gap: z.ZodOptional<z.ZodEnum<{
1169
+ none: "none";
1170
+ sm: "sm";
1171
+ md: "md";
1172
+ lg: "lg";
1173
+ }>>;
1174
+ align: z.ZodOptional<z.ZodEnum<{
1175
+ start: "start";
1176
+ center: "center";
1177
+ stretch: "stretch";
1178
+ }>>;
1179
+ background: z.ZodOptional<z.ZodString>;
1180
+ paddingY: z.ZodOptional<z.ZodEnum<{
1181
+ none: "none";
1182
+ sm: "sm";
1183
+ md: "md";
1184
+ lg: "lg";
1185
+ xl: "xl";
1186
+ }>>;
1187
+ }, z.core.$strip>>;
1188
+ sections: z.ZodDefault<z.ZodArray<z.ZodObject<{
1189
+ id: z.ZodString;
1190
+ order: z.ZodNumber;
1191
+ type: z.ZodString;
1192
+ config: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1193
+ colSpan: z.ZodDefault<z.ZodNumber>;
1194
+ responsive: z.ZodOptional<z.ZodObject<{
1195
+ sm: z.ZodOptional<z.ZodNumber>;
1196
+ md: z.ZodOptional<z.ZodNumber>;
1197
+ lg: z.ZodOptional<z.ZodNumber>;
1198
+ }, z.core.$strip>>;
1199
+ enabled: z.ZodDefault<z.ZodBoolean>;
1200
+ visibility: z.ZodOptional<z.ZodObject<{
1201
+ roles: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1202
+ member: "member";
1203
+ pro: "pro";
1204
+ verified: "verified";
1205
+ staff: "staff";
1206
+ admin: "admin";
1207
+ anonymous: "anonymous";
1208
+ }>>>;
1209
+ features: z.ZodOptional<z.ZodArray<z.ZodString>>;
1210
+ hideAt: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1211
+ sm: "sm";
1212
+ md: "md";
1213
+ lg: "lg";
1214
+ }>>>;
1215
+ }, z.core.$strip>>;
1216
+ schemaVersion: z.ZodDefault<z.ZodNumber>;
1217
+ }, z.core.$strip>>>;
1218
+ }, z.core.$strip>>>;
1219
+ }, z.core.$strip>;
1220
+ export type LayoutZoneInput = z.infer<typeof layoutZoneSchema>;
1221
+ /** The full layout payload (read-side — includes server fields). */
1222
+ export declare const layoutSchema: z.ZodObject<{
1223
+ id: z.ZodOptional<z.ZodString>;
1224
+ scope: z.ZodDiscriminatedUnion<[z.ZodObject<{
1225
+ type: z.ZodLiteral<"route">;
1226
+ path: z.ZodString;
1227
+ }, z.core.$strip>, z.ZodObject<{
1228
+ type: z.ZodLiteral<"virtual">;
1229
+ key: z.ZodEnum<{
1230
+ __footer: "__footer";
1231
+ "__not-found": "__not-found";
1232
+ __error: "__error";
1233
+ }>;
1234
+ }, z.core.$strip>, z.ZodObject<{
1235
+ type: z.ZodLiteral<"custom-page">;
1236
+ path: z.ZodString;
1237
+ }, z.core.$strip>], "type">;
1238
+ name: z.ZodString;
1239
+ pageMeta: z.ZodOptional<z.ZodObject<{
1240
+ title: z.ZodString;
1241
+ description: z.ZodOptional<z.ZodString>;
1242
+ ogImage: z.ZodOptional<z.ZodString>;
1243
+ noindex: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
1244
+ ogType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1245
+ article: "article";
1246
+ website: "website";
1247
+ profile: "profile";
1248
+ }>>>;
1249
+ access: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1250
+ admin: "admin";
1251
+ public: "public";
1252
+ members: "members";
1253
+ }>>>;
1254
+ frame: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1255
+ narrow: "narrow";
1256
+ wide: "wide";
1257
+ "two-column": "two-column";
1258
+ "three-column": "three-column";
1259
+ "sidebar-left": "sidebar-left";
1260
+ "sidebar-right": "sidebar-right";
1261
+ }>>>;
1262
+ }, z.core.$strip>>;
1263
+ zones: z.ZodDefault<z.ZodArray<z.ZodObject<{
1264
+ zone: z.ZodString;
1265
+ rows: z.ZodDefault<z.ZodArray<z.ZodObject<{
1266
+ id: z.ZodString;
1267
+ order: z.ZodNumber;
1268
+ config: z.ZodOptional<z.ZodObject<{
1269
+ gap: z.ZodOptional<z.ZodEnum<{
1270
+ none: "none";
1271
+ sm: "sm";
1272
+ md: "md";
1273
+ lg: "lg";
1274
+ }>>;
1275
+ align: z.ZodOptional<z.ZodEnum<{
1276
+ start: "start";
1277
+ center: "center";
1278
+ stretch: "stretch";
1279
+ }>>;
1280
+ background: z.ZodOptional<z.ZodString>;
1281
+ paddingY: z.ZodOptional<z.ZodEnum<{
1282
+ none: "none";
1283
+ sm: "sm";
1284
+ md: "md";
1285
+ lg: "lg";
1286
+ xl: "xl";
1287
+ }>>;
1288
+ }, z.core.$strip>>;
1289
+ sections: z.ZodDefault<z.ZodArray<z.ZodObject<{
1290
+ id: z.ZodString;
1291
+ order: z.ZodNumber;
1292
+ type: z.ZodString;
1293
+ config: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1294
+ colSpan: z.ZodDefault<z.ZodNumber>;
1295
+ responsive: z.ZodOptional<z.ZodObject<{
1296
+ sm: z.ZodOptional<z.ZodNumber>;
1297
+ md: z.ZodOptional<z.ZodNumber>;
1298
+ lg: z.ZodOptional<z.ZodNumber>;
1299
+ }, z.core.$strip>>;
1300
+ enabled: z.ZodDefault<z.ZodBoolean>;
1301
+ visibility: z.ZodOptional<z.ZodObject<{
1302
+ roles: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1303
+ member: "member";
1304
+ pro: "pro";
1305
+ verified: "verified";
1306
+ staff: "staff";
1307
+ admin: "admin";
1308
+ anonymous: "anonymous";
1309
+ }>>>;
1310
+ features: z.ZodOptional<z.ZodArray<z.ZodString>>;
1311
+ hideAt: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1312
+ sm: "sm";
1313
+ md: "md";
1314
+ lg: "lg";
1315
+ }>>>;
1316
+ }, z.core.$strip>>;
1317
+ schemaVersion: z.ZodDefault<z.ZodNumber>;
1318
+ }, z.core.$strip>>>;
1319
+ }, z.core.$strip>>>;
1320
+ }, z.core.$strip>>>;
1321
+ state: z.ZodDefault<z.ZodEnum<{
1322
+ draft: "draft";
1323
+ published: "published";
1324
+ }>>;
1325
+ publishedVersionId: z.ZodOptional<z.ZodString>;
1326
+ createdAt: z.ZodOptional<z.ZodString>;
1327
+ updatedAt: z.ZodOptional<z.ZodString>;
1328
+ }, z.core.$strip>;
1329
+ export type LayoutInput = z.infer<typeof layoutSchema>;
1330
+ /** Body shape for POST/PUT — server generates UUIDs + renumbers positions + sets timestamps. */
1331
+ export declare const layoutCreateSchema: z.ZodObject<{
1332
+ name: z.ZodString;
1333
+ pageMeta: z.ZodOptional<z.ZodObject<{
1334
+ title: z.ZodString;
1335
+ description: z.ZodOptional<z.ZodString>;
1336
+ ogImage: z.ZodOptional<z.ZodString>;
1337
+ noindex: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
1338
+ ogType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1339
+ article: "article";
1340
+ website: "website";
1341
+ profile: "profile";
1342
+ }>>>;
1343
+ access: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1344
+ admin: "admin";
1345
+ public: "public";
1346
+ members: "members";
1347
+ }>>>;
1348
+ frame: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
1349
+ narrow: "narrow";
1350
+ wide: "wide";
1351
+ "two-column": "two-column";
1352
+ "three-column": "three-column";
1353
+ "sidebar-left": "sidebar-left";
1354
+ "sidebar-right": "sidebar-right";
1355
+ }>>>;
1356
+ }, z.core.$strip>>;
1357
+ state: z.ZodDefault<z.ZodEnum<{
1358
+ draft: "draft";
1359
+ published: "published";
1360
+ }>>;
1361
+ scope: z.ZodDiscriminatedUnion<[z.ZodObject<{
1362
+ type: z.ZodLiteral<"route">;
1363
+ path: z.ZodString;
1364
+ }, z.core.$strip>, z.ZodObject<{
1365
+ type: z.ZodLiteral<"virtual">;
1366
+ key: z.ZodEnum<{
1367
+ __footer: "__footer";
1368
+ "__not-found": "__not-found";
1369
+ __error: "__error";
1370
+ }>;
1371
+ }, z.core.$strip>, z.ZodObject<{
1372
+ type: z.ZodLiteral<"custom-page">;
1373
+ path: z.ZodString;
1374
+ }, z.core.$strip>], "type">;
1375
+ zones: z.ZodDefault<z.ZodArray<z.ZodObject<{
1376
+ zone: z.ZodString;
1377
+ rows: z.ZodDefault<z.ZodArray<z.ZodObject<{
1378
+ id: z.ZodString;
1379
+ order: z.ZodNumber;
1380
+ config: z.ZodOptional<z.ZodObject<{
1381
+ gap: z.ZodOptional<z.ZodEnum<{
1382
+ none: "none";
1383
+ sm: "sm";
1384
+ md: "md";
1385
+ lg: "lg";
1386
+ }>>;
1387
+ align: z.ZodOptional<z.ZodEnum<{
1388
+ start: "start";
1389
+ center: "center";
1390
+ stretch: "stretch";
1391
+ }>>;
1392
+ background: z.ZodOptional<z.ZodString>;
1393
+ paddingY: z.ZodOptional<z.ZodEnum<{
1394
+ none: "none";
1395
+ sm: "sm";
1396
+ md: "md";
1397
+ lg: "lg";
1398
+ xl: "xl";
1399
+ }>>;
1400
+ }, z.core.$strip>>;
1401
+ sections: z.ZodDefault<z.ZodArray<z.ZodObject<{
1402
+ id: z.ZodString;
1403
+ order: z.ZodNumber;
1404
+ type: z.ZodString;
1405
+ config: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1406
+ colSpan: z.ZodDefault<z.ZodNumber>;
1407
+ responsive: z.ZodOptional<z.ZodObject<{
1408
+ sm: z.ZodOptional<z.ZodNumber>;
1409
+ md: z.ZodOptional<z.ZodNumber>;
1410
+ lg: z.ZodOptional<z.ZodNumber>;
1411
+ }, z.core.$strip>>;
1412
+ enabled: z.ZodDefault<z.ZodBoolean>;
1413
+ visibility: z.ZodOptional<z.ZodObject<{
1414
+ roles: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1415
+ member: "member";
1416
+ pro: "pro";
1417
+ verified: "verified";
1418
+ staff: "staff";
1419
+ admin: "admin";
1420
+ anonymous: "anonymous";
1421
+ }>>>;
1422
+ features: z.ZodOptional<z.ZodArray<z.ZodString>>;
1423
+ hideAt: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1424
+ sm: "sm";
1425
+ md: "md";
1426
+ lg: "lg";
1427
+ }>>>;
1428
+ }, z.core.$strip>>;
1429
+ schemaVersion: z.ZodDefault<z.ZodNumber>;
1430
+ }, z.core.$strip>>>;
1431
+ }, z.core.$strip>>>;
1432
+ }, z.core.$strip>>>;
1433
+ }, z.core.$strip>;
1434
+ export type LayoutCreateInput = z.infer<typeof layoutCreateSchema>;
928
1435
  //# sourceMappingURL=validators.d.ts.map