@valencets/cms 0.1.1 → 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"admin-routes.d.ts","sourceRoot":"","sources":["../../src/admin/admin-routes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAiBxD,UAAU,YAAY;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAC3C;AAwCD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,kBAAkB,EAC/B,OAAO,GAAE,YAAiB,GACzB,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAkG7B"}
1
+ {"version":3,"file":"admin-routes.d.ts","sourceRoot":"","sources":["../../src/admin/admin-routes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAmBxD,UAAU,YAAY;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAC3C;AA2DD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,kBAAkB,EAC/B,OAAO,GAAE,YAAiB,GACzB,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAyL7B"}
@@ -7,9 +7,9 @@ import { createGlobalRegistry } from '../schema/registry.js';
7
7
  import { validateSession } from '../auth/session.js';
8
8
  import { parseCookie } from '../auth/cookie.js';
9
9
  import { generateCsrfToken, validateCsrfToken } from '../auth/csrf.js';
10
- import { escapeHtml } from './escape.js';
11
10
  import { readStringBody } from '../api/read-body.js';
12
- import { generateZodSchema } from '../validation/zod-generator.js';
11
+ import { generateZodSchema, generatePartialSchema } from '../validation/zod-generator.js';
12
+ import { setFlashCookie, readFlash, clearFlashCookie } from './flash.js';
13
13
  function wrapWithAuth(pool, handler) {
14
14
  return async (req, res, ctx) => {
15
15
  const cookieHeader = req.headers.cookie ?? '';
@@ -38,13 +38,20 @@ function safeReadFormBody(req) {
38
38
  return data;
39
39
  });
40
40
  }
41
+ /** Sends HTML using setHeader so previously set headers (e.g. Set-Cookie) are preserved. */
41
42
  function sendHtml(res, html, statusCode = 200) {
42
- res.writeHead(statusCode, {
43
- 'Content-Type': 'text/html; charset=utf-8',
44
- 'Content-Length': Buffer.byteLength(html)
45
- });
43
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
44
+ res.setHeader('Content-Length', Buffer.byteLength(html));
45
+ res.writeHead(statusCode);
46
46
  res.end(html);
47
47
  }
48
+ function renderErrorPage(col, allCollections, title, formData, csrfToken, toast) {
49
+ const docRow = Object.keys(formData).length > 0
50
+ ? formData
51
+ : null;
52
+ const content = renderEditView(col, docRow, csrfToken);
53
+ return renderLayout({ title, content, collections: allCollections, toast });
54
+ }
48
55
  export function createAdminRoutes(pool, collections, options = {}) {
49
56
  const wrap = options.requireAuth
50
57
  ? (handler) => wrapWithAuth(pool, handler)
@@ -72,6 +79,11 @@ export function createAdminRoutes(pool, collections, options = {}) {
72
79
  }
73
80
  return false;
74
81
  }
82
+ function freshCsrfToken() {
83
+ const token = generateCsrfToken();
84
+ csrfTokens.set(token, Date.now());
85
+ return token;
86
+ }
75
87
  routes.set('/admin', {
76
88
  GET: wrap(async (_req, res) => {
77
89
  const content = renderDashboard(allCollections);
@@ -81,22 +93,27 @@ export function createAdminRoutes(pool, collections, options = {}) {
81
93
  });
82
94
  for (const col of allCollections) {
83
95
  routes.set(`/admin/${col.slug}`, {
84
- GET: wrap(async (_req, res) => {
96
+ GET: wrap(async (req, res) => {
97
+ const cookieHeader = req.headers.cookie ?? '';
98
+ const flash = readFlash(cookieHeader);
99
+ const toast = flash ?? undefined;
100
+ if (flash)
101
+ clearFlashCookie(res);
85
102
  const result = await api.find({ collection: col.slug });
86
103
  const docs = result.match((rows) => rows, () => []);
87
104
  const content = renderListView(col, docs);
88
105
  const html = renderLayout({
89
106
  title: col.labels?.plural ?? col.slug,
90
107
  content,
91
- collections: allCollections
108
+ collections: allCollections,
109
+ toast
92
110
  });
93
111
  sendHtml(res, html);
94
112
  })
95
113
  });
96
114
  routes.set(`/admin/${col.slug}/new`, {
97
115
  GET: wrap(async (_req, res) => {
98
- const token = generateCsrfToken();
99
- csrfTokens.set(token, Date.now());
116
+ const token = freshCsrfToken();
100
117
  const content = renderEditView(col, null, token);
101
118
  const html = renderLayout({
102
119
  title: `New ${col.labels?.singular ?? col.slug}`,
@@ -108,29 +125,96 @@ export function createAdminRoutes(pool, collections, options = {}) {
108
125
  POST: wrap(async (req, res) => {
109
126
  const bodyResult = await safeReadFormBody(req);
110
127
  if (bodyResult.isErr()) {
111
- sendHtml(res, 'Bad request', 400);
128
+ const token = freshCsrfToken();
129
+ const html = renderErrorPage(col, allCollections, `New ${col.labels?.singular ?? col.slug}`, {}, token, { type: 'error', text: 'Bad request' });
130
+ sendHtml(res, html, 400);
112
131
  return;
113
132
  }
114
133
  const formData = bodyResult.value;
115
134
  const submittedToken = String(formData._csrf ?? '');
135
+ const { _csrf, ...data } = formData;
116
136
  if (!submittedToken || !validateCsrf(submittedToken)) {
117
- res.writeHead(403, { 'Content-Type': 'text/html; charset=utf-8' });
118
- res.end('Forbidden: invalid CSRF token');
137
+ const token = freshCsrfToken();
138
+ const html = renderErrorPage(col, allCollections, `New ${col.labels?.singular ?? col.slug}`, data, token, { type: 'error', text: 'Forbidden: invalid CSRF token' });
139
+ sendHtml(res, html, 403);
119
140
  return;
120
141
  }
121
- const { _csrf, ...data } = formData;
122
142
  const zodSchema = generateZodSchema(col.fields);
123
143
  const validation = zodSchema.safeParse(data);
124
144
  if (!validation.success) {
125
145
  const issues = validation.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
126
- sendHtml(res, `Validation failed: ${escapeHtml(issues)}`, 400);
146
+ const token = freshCsrfToken();
147
+ const html = renderErrorPage(col, allCollections, `New ${col.labels?.singular ?? col.slug}`, data, token, { type: 'error', text: `Validation failed: ${issues}` });
148
+ sendHtml(res, html, 400);
127
149
  return;
128
150
  }
129
- const result = await api.create({ collection: col.slug, data });
151
+ const result = await api.create({ collection: col.slug, data: validation.data });
130
152
  result.match(() => {
153
+ setFlashCookie(res, { type: 'success', text: `${col.labels?.singular ?? col.slug} created successfully` });
131
154
  res.writeHead(302, { Location: `/admin/${col.slug}` });
132
155
  res.end();
133
- }, (err) => sendHtml(res, `Error: ${escapeHtml(err.message)}`, 400));
156
+ }, (err) => {
157
+ const token = freshCsrfToken();
158
+ const html = renderErrorPage(col, allCollections, `New ${col.labels?.singular ?? col.slug}`, data, token, { type: 'error', text: `Error: ${err.message}` });
159
+ sendHtml(res, html, 400);
160
+ });
161
+ })
162
+ });
163
+ routes.set(`/admin/${col.slug}/:id/edit`, {
164
+ GET: wrap(async (req, res, ctx) => {
165
+ const id = ctx.id ?? '';
166
+ const docResult = await api.findByID({ collection: col.slug, id });
167
+ const doc = docResult.match((row) => row, () => null);
168
+ if (!doc) {
169
+ sendHtml(res, 'Not found', 404);
170
+ return;
171
+ }
172
+ const token = freshCsrfToken();
173
+ const content = renderEditView(col, doc, token);
174
+ const html = renderLayout({
175
+ title: `Edit ${col.labels?.singular ?? col.slug}`,
176
+ content,
177
+ collections: allCollections
178
+ });
179
+ sendHtml(res, html);
180
+ }),
181
+ POST: wrap(async (req, res, ctx) => {
182
+ const id = ctx.id ?? '';
183
+ const bodyResult = await safeReadFormBody(req);
184
+ if (bodyResult.isErr()) {
185
+ const token = freshCsrfToken();
186
+ const html = renderErrorPage(col, allCollections, `Edit ${col.labels?.singular ?? col.slug}`, { id }, token, { type: 'error', text: 'Bad request' });
187
+ sendHtml(res, html, 400);
188
+ return;
189
+ }
190
+ const formData = bodyResult.value;
191
+ const submittedToken = String(formData._csrf ?? '');
192
+ const { _csrf, ...data } = formData;
193
+ if (!submittedToken || !validateCsrf(submittedToken)) {
194
+ const token = freshCsrfToken();
195
+ const html = renderErrorPage(col, allCollections, `Edit ${col.labels?.singular ?? col.slug}`, { id, ...data }, token, { type: 'error', text: 'Forbidden: invalid CSRF token' });
196
+ sendHtml(res, html, 403);
197
+ return;
198
+ }
199
+ const zodSchema = generatePartialSchema(col.fields);
200
+ const validation = zodSchema.safeParse(data);
201
+ if (!validation.success) {
202
+ const issues = validation.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
203
+ const token = freshCsrfToken();
204
+ const html = renderErrorPage(col, allCollections, `Edit ${col.labels?.singular ?? col.slug}`, { id, ...data }, token, { type: 'error', text: `Validation failed: ${issues}` });
205
+ sendHtml(res, html, 400);
206
+ return;
207
+ }
208
+ const result = await api.update({ collection: col.slug, id, data: validation.data });
209
+ result.match(() => {
210
+ setFlashCookie(res, { type: 'success', text: `${col.labels?.singular ?? col.slug} updated successfully` });
211
+ res.writeHead(302, { Location: `/admin/${col.slug}` });
212
+ res.end();
213
+ }, (err) => {
214
+ const token = freshCsrfToken();
215
+ const html = renderErrorPage(col, allCollections, `Edit ${col.labels?.singular ?? col.slug}`, { id, ...data }, token, { type: 'error', text: `Error: ${err.message}` });
216
+ sendHtml(res, html, 400);
217
+ });
134
218
  })
135
219
  });
136
220
  }
@@ -1 +1 @@
1
- {"version":3,"file":"admin-routes.js","sourceRoot":"","sources":["../../src/admin/admin-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-routes.js","sourceRoot":"","sources":["../../src/admin/admin-routes.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { CollectionConfig } from '../schema/collection.js';
2
2
  interface DocRow {
3
3
  readonly id?: string | undefined;
4
- readonly [key: string]: string | number | boolean | null | undefined;
4
+ readonly [key: string]: string | number | boolean | Date | null | undefined;
5
5
  }
6
6
  export declare function renderEditView(col: CollectionConfig, doc: DocRow | null, csrfToken?: string): string;
7
7
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"edit-view.d.ts","sourceRoot":"","sources":["../../src/admin/edit-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAI/D,UAAU,MAAM;IACd,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAA;CACrE;AAED,wBAAgB,cAAc,CAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAoBzG"}
1
+ {"version":3,"file":"edit-view.d.ts","sourceRoot":"","sources":["../../src/admin/edit-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAI/D,UAAU,MAAM;IACd,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAA;CAC5E;AAED,wBAAgB,cAAc,CAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAsBzG"}
@@ -3,19 +3,21 @@ import { escapeHtml } from './escape.js';
3
3
  export function renderEditView(col, doc, csrfToken = '') {
4
4
  const isNew = doc === null;
5
5
  const action = isNew
6
- ? `/api/${escapeHtml(col.slug)}`
7
- : `/api/${escapeHtml(col.slug)}/${escapeHtml(String(doc.id ?? ''))}`;
8
- const method = isNew ? 'POST' : 'PATCH';
6
+ ? `/admin/${escapeHtml(col.slug)}/new`
7
+ : `/admin/${escapeHtml(col.slug)}/${escapeHtml(String(doc.id ?? ''))}/edit`;
9
8
  const fieldInputs = col.fields.map(f => {
10
- const value = doc ? String(doc[f.name] ?? '') : '';
9
+ const raw = doc ? doc[f.name] : null;
10
+ const value = raw instanceof Date
11
+ ? raw.toISOString().slice(0, 10)
12
+ : String(raw ?? '');
11
13
  return renderFieldInput(f, value);
12
14
  }).join('\n');
13
15
  const csrfField = csrfToken ? `<input type="hidden" name="_csrf" value="${escapeHtml(csrfToken)}">` : '';
14
16
  return `
15
- <form action="${action}" method="POST" data-method="${method}">
17
+ <form action="${action}" method="POST" class="admin-form">
16
18
  ${csrfField}
17
19
  ${fieldInputs}
18
- <button type="submit">${isNew ? 'Create' : 'Save'}</button>
20
+ <button type="submit" class="btn btn-primary">${isNew ? 'Create' : 'Save'}</button>
19
21
  </form>`;
20
22
  }
21
23
  //# sourceMappingURL=edit-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit-view.js","sourceRoot":"","sources":["../../src/admin/edit-view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOxC,MAAM,UAAU,cAAc,CAAE,GAAqB,EAAE,GAAkB,EAAE,YAAoB,EAAE;IAC/F,MAAM,KAAK,GAAG,GAAG,KAAK,IAAI,CAAA;IAC1B,MAAM,MAAM,GAAG,KAAK;QAClB,CAAC,CAAC,QAAQ,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAChC,CAAC,CAAC,QAAQ,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;IACtE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;IAEvC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACrC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAClD,OAAO,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACnC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,4CAA4C,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IAExG,OAAO;gBACO,MAAM,gCAAgC,MAAM;IACxD,SAAS;IACT,WAAW;0BACW,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;QAC3C,CAAA;AACR,CAAC"}
1
+ {"version":3,"file":"edit-view.js","sourceRoot":"","sources":["../../src/admin/edit-view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOxC,MAAM,UAAU,cAAc,CAAE,GAAqB,EAAE,GAAkB,EAAE,YAAoB,EAAE;IAC/F,MAAM,KAAK,GAAG,GAAG,KAAK,IAAI,CAAA;IAC1B,MAAM,MAAM,GAAG,KAAK;QAClB,CAAC,CAAC,UAAU,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM;QACtC,CAAC,CAAC,UAAU,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAA;IAE7E,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACpC,MAAM,KAAK,GAAG,GAAG,YAAY,IAAI;YAC/B,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAChC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;QACrB,OAAO,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACnC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,4CAA4C,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IAExG,OAAO;gBACO,MAAM;IAClB,SAAS;IACT,WAAW;kDACmC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;QACnE,CAAA;AACR,CAAC"}
@@ -13,11 +13,11 @@ const RENDERER_MAP = {
13
13
  };
14
14
  function renderTextInput(f, value) {
15
15
  const req = f.required ? ' required' : '';
16
- return `<label>${escapeHtml(f.label ?? f.name)}<input type="text" name="${escapeHtml(f.name)}" value="${escapeHtml(value)}"${req}></label>`;
16
+ return `<label class="form-field"><span>${escapeHtml(f.label ?? f.name)}</span><input class="form-input" type="text" name="${escapeHtml(f.name)}" value="${escapeHtml(value)}"${req}></label>`;
17
17
  }
18
18
  function renderTextarea(f, value) {
19
19
  const req = f.required ? ' required' : '';
20
- return `<label>${escapeHtml(f.label ?? f.name)}<textarea name="${escapeHtml(f.name)}"${req}>${escapeHtml(value)}</textarea></label>`;
20
+ return `<label class="form-field"><span>${escapeHtml(f.label ?? f.name)}</span><textarea class="form-textarea" name="${escapeHtml(f.name)}"${req}>${escapeHtml(value)}</textarea></label>`;
21
21
  }
22
22
  function renderNumberInput(f, value) {
23
23
  const req = f.required ? ' required' : '';
@@ -26,11 +26,11 @@ function renderNumberInput(f, value) {
26
26
  attrs += ` min="${escapeHtml(String(f.min))}"`;
27
27
  if ('max' in f && f.max !== undefined)
28
28
  attrs += ` max="${escapeHtml(String(f.max))}"`;
29
- return `<label>${escapeHtml(f.label ?? f.name)}<input type="number" name="${escapeHtml(f.name)}" value="${escapeHtml(value)}"${attrs}${req}></label>`;
29
+ return `<label class="form-field"><span>${escapeHtml(f.label ?? f.name)}</span><input class="form-input" type="number" name="${escapeHtml(f.name)}" value="${escapeHtml(value)}"${attrs}${req}></label>`;
30
30
  }
31
31
  function renderCheckbox(f, value) {
32
32
  const checked = value === 'true' ? ' checked' : '';
33
- return `<label><input type="checkbox" name="${escapeHtml(f.name)}" value="true"${checked}> ${escapeHtml(f.label ?? f.name)}</label>`;
33
+ return `<label class="form-checkbox"><input type="hidden" name="${escapeHtml(f.name)}" value="false"><input type="checkbox" name="${escapeHtml(f.name)}" value="true"${checked}> ${escapeHtml(f.label ?? f.name)}</label>`;
34
34
  }
35
35
  function renderSelect(f, value) {
36
36
  const options = 'options' in f
@@ -39,11 +39,11 @@ function renderSelect(f, value) {
39
39
  return `<option value="${escapeHtml(o.value)}"${sel}>${escapeHtml(o.label)}</option>`;
40
40
  }).join('')
41
41
  : '';
42
- return `<label>${escapeHtml(f.label ?? f.name)}<select name="${escapeHtml(f.name)}">${options}</select></label>`;
42
+ return `<label class="form-field"><span>${escapeHtml(f.label ?? f.name)}</span><select class="form-select" name="${escapeHtml(f.name)}">${options}</select></label>`;
43
43
  }
44
44
  function renderDateInput(f, value) {
45
45
  const req = f.required ? ' required' : '';
46
- return `<label>${escapeHtml(f.label ?? f.name)}<input type="date" name="${escapeHtml(f.name)}" value="${escapeHtml(value)}"${req}></label>`;
46
+ return `<label class="form-field"><span>${escapeHtml(f.label ?? f.name)}</span><input class="form-input" type="date" name="${escapeHtml(f.name)}" value="${escapeHtml(value)}"${req}></label>`;
47
47
  }
48
48
  function renderGroup(f, _value) {
49
49
  const inner = 'fields' in f
@@ -1 +1 @@
1
- {"version":3,"file":"field-renderers.js","sourceRoot":"","sources":["../../src/admin/field-renderers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"field-renderers.js","sourceRoot":"","sources":["../../src/admin/field-renderers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ServerResponse } from 'node:http';
2
+ interface FlashMessage {
3
+ readonly type: 'success' | 'error' | 'info';
4
+ readonly text: string;
5
+ }
6
+ declare function serializeFlash(msg: FlashMessage): string;
7
+ declare function parseFlash(encoded: string): FlashMessage | null;
8
+ declare function setFlashCookie(res: ServerResponse, msg: FlashMessage): void;
9
+ declare function clearFlashCookie(res: ServerResponse): void;
10
+ declare function readFlash(cookieHeader: string): FlashMessage | null;
11
+ export { serializeFlash, parseFlash, setFlashCookie, clearFlashCookie, readFlash };
12
+ export type { FlashMessage };
13
+ //# sourceMappingURL=flash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flash.d.ts","sourceRoot":"","sources":["../../src/admin/flash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAG/C,UAAU,YAAY;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,iBAAS,cAAc,CAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAGlD;AAED,iBAAS,UAAU,CAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAUzD;AAED,iBAAS,cAAc,CAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAGrE;AAED,iBAAS,gBAAgB,CAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAEpD;AAED,iBAAS,SAAS,CAAE,YAAY,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAI7D;AAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAA;AAClF,YAAY,EAAE,YAAY,EAAE,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { parseCookie } from '../auth/cookie.js';
2
+ function serializeFlash(msg) {
3
+ const json = JSON.stringify(msg);
4
+ return Buffer.from(json, 'utf-8').toString('base64url');
5
+ }
6
+ function parseFlash(encoded) {
7
+ try {
8
+ const json = Buffer.from(encoded, 'base64url').toString('utf-8');
9
+ const parsed = JSON.parse(json);
10
+ if (parsed.type !== 'success' && parsed.type !== 'error' && parsed.type !== 'info')
11
+ return null;
12
+ if (typeof parsed.text !== 'string')
13
+ return null;
14
+ return { type: parsed.type, text: parsed.text };
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ function setFlashCookie(res, msg) {
21
+ const value = serializeFlash(msg);
22
+ res.setHeader('Set-Cookie', `cms_flash=${value}; Path=/admin; HttpOnly; SameSite=Strict; Max-Age=30`);
23
+ }
24
+ function clearFlashCookie(res) {
25
+ res.setHeader('Set-Cookie', 'cms_flash=; Path=/admin; HttpOnly; SameSite=Strict; Max-Age=0');
26
+ }
27
+ function readFlash(cookieHeader) {
28
+ const raw = parseCookie(cookieHeader, 'cms_flash');
29
+ if (!raw)
30
+ return null;
31
+ return parseFlash(raw);
32
+ }
33
+ export { serializeFlash, parseFlash, setFlashCookie, clearFlashCookie, readFlash };
34
+ //# sourceMappingURL=flash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flash.js","sourceRoot":"","sources":["../../src/admin/flash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAO/C,SAAS,cAAc,CAAE,GAAiB;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACzD,CAAC;AAED,SAAS,UAAU,CAAE,OAAe;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmC,CAAA;QACjE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;QAC/F,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QAChD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAE,GAAmB,EAAE,GAAiB;IAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IACjC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,aAAa,KAAK,sDAAsD,CAAC,CAAA;AACvG,CAAC;AAED,SAAS,gBAAgB,CAAE,GAAmB;IAC5C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,+DAA+D,CAAC,CAAA;AAC9F,CAAC;AAED,SAAS,SAAS,CAAE,YAAoB;IACtC,MAAM,GAAG,GAAG,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;AACxB,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAA"}
@@ -1,8 +1,10 @@
1
1
  import type { CollectionConfig } from '../schema/collection.js';
2
+ import type { FlashMessage } from './flash.js';
2
3
  interface LayoutArgs {
3
4
  readonly title: string;
4
5
  readonly content: string;
5
6
  readonly collections: readonly CollectionConfig[];
7
+ readonly toast?: FlashMessage | undefined;
6
8
  }
7
9
  export declare function renderLayout(args: LayoutArgs): string;
8
10
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/admin/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAG/D,UAAU,UAAU;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAClD;AAED,wBAAgB,YAAY,CAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAoCtD"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/admin/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9C,UAAU,UAAU;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAA;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CAC1C;AAED,wBAAgB,YAAY,CAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CA8VtD"}
@@ -1,9 +1,11 @@
1
1
  import { escapeHtml } from './escape.js';
2
+ import { renderToast } from './toast.js';
2
3
  export function renderLayout(args) {
3
4
  const navItems = args.collections.map(c => {
4
5
  const label = escapeHtml(c.labels?.plural ?? c.slug);
5
6
  return `<li><a href="/admin/${escapeHtml(c.slug)}">${label}</a></li>`;
6
7
  }).join('\n');
8
+ const toastHtml = args.toast ? renderToast(args.toast) : '';
7
9
  return `<!DOCTYPE html>
8
10
  <html lang="en">
9
11
  <head>
@@ -11,27 +13,339 @@ export function renderLayout(args) {
11
13
  <meta name="viewport" content="width=device-width, initial-scale=1">
12
14
  <title>${escapeHtml(args.title)} — Valence CMS</title>
13
15
  <style>
16
+ /* --- Primitive tokens (inlined from @valencets/ui) --- */
17
+ :root {
18
+ --val-gray-50: oklch(0.9846 0.0017 247.84);
19
+ --val-gray-100: oklch(0.9670 0.0029 264.54);
20
+ --val-gray-200: oklch(0.9276 0.0058 264.53);
21
+ --val-gray-300: oklch(0.8717 0.0093 258.34);
22
+ --val-gray-400: oklch(0.7137 0.0192 261.32);
23
+ --val-gray-500: oklch(0.5510 0.0234 264.36);
24
+ --val-gray-600: oklch(0.4461 0.0263 256.80);
25
+ --val-gray-700: oklch(0.3729 0.0306 259.73);
26
+ --val-gray-800: oklch(0.2781 0.0296 256.85);
27
+ --val-gray-900: oklch(0.2101 0.0318 264.66);
28
+ --val-gray-950: oklch(0.1296 0.0274 261.69);
29
+ --val-blue-400: oklch(0.7137 0.1434 254.62);
30
+ --val-blue-500: oklch(0.6231 0.1880 259.81);
31
+ --val-blue-600: oklch(0.5461 0.2152 262.88);
32
+ --val-blue-700: oklch(0.4882 0.2172 264.38);
33
+ --val-red-500: oklch(0.6368 0.2078 25.33);
34
+ --val-green-500: oklch(0.7227 0.1920 149.58);
35
+ --val-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
36
+ --val-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
37
+ --val-text-xs: 0.75rem;
38
+ --val-text-sm: 0.875rem;
39
+ --val-text-base: 1rem;
40
+ --val-text-lg: 1.125rem;
41
+ --val-text-xl: 1.25rem;
42
+ --val-text-2xl: 1.5rem;
43
+ --val-leading-tight: 1.25;
44
+ --val-leading-normal: 1.5;
45
+ --val-weight-normal: 400;
46
+ --val-weight-medium: 500;
47
+ --val-weight-semibold: 600;
48
+ --val-weight-bold: 700;
49
+ --val-radius-sm: 0.25rem;
50
+ --val-radius-md: 0.375rem;
51
+ --val-radius-lg: 0.5rem;
52
+ --val-shadow-sm: 0 1px 2px 0 oklch(0 0 0 / 0.05);
53
+ --val-shadow-md: 0 4px 6px -1px oklch(0 0 0 / 0.1), 0 2px 4px -2px oklch(0 0 0 / 0.1);
54
+ --val-duration-fast: 100ms;
55
+ --val-duration-normal: 200ms;
56
+ --val-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
57
+ }
58
+
59
+ /* --- Semantic tokens (forced dark) --- */
60
+ :root {
61
+ --val-color-bg: var(--val-gray-950);
62
+ --val-color-bg-elevated: var(--val-gray-900);
63
+ --val-color-bg-muted: var(--val-gray-800);
64
+ --val-color-text: var(--val-gray-50);
65
+ --val-color-text-muted: var(--val-gray-400);
66
+ --val-color-primary: var(--val-blue-600);
67
+ --val-color-primary-hover: var(--val-blue-700);
68
+ --val-color-primary-text: oklch(1 0 0);
69
+ --val-color-border: var(--val-gray-700);
70
+ --val-color-border-focus: var(--val-blue-500);
71
+ --val-focus-ring: 0 0 0 2px var(--val-color-bg), 0 0 0 4px var(--val-color-border-focus);
72
+ --val-color-error: var(--val-red-500);
73
+ --val-color-success: var(--val-green-500);
74
+ }
75
+
76
+ /* --- Reset --- */
14
77
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
15
- body { font-family: system-ui, -apple-system, sans-serif; display: flex; min-height: 100vh; }
16
- nav { width: 240px; background: #1a1a2e; color: #eee; padding: 1rem; }
17
- nav a { color: #8ec5fc; text-decoration: none; display: block; padding: 0.5rem 0; }
18
- nav a:hover { color: #fff; }
19
- nav ul { list-style: none; }
20
- main { flex: 1; padding: 2rem; }
21
- h1 { margin-bottom: 1rem; }
78
+
79
+ /* --- Base --- */
80
+ body {
81
+ font-family: var(--val-font-sans);
82
+ font-size: var(--val-text-base);
83
+ line-height: var(--val-leading-normal);
84
+ color: var(--val-color-text);
85
+ background: var(--val-color-bg);
86
+ display: flex;
87
+ min-height: 100vh;
88
+ }
89
+
90
+ a { color: var(--val-blue-400); text-decoration: none; }
91
+ a:hover { color: var(--val-color-primary-text); }
92
+
93
+ /* --- Sidebar --- */
94
+ .sidebar {
95
+ width: 240px;
96
+ flex-shrink: 0;
97
+ background: var(--val-color-bg-elevated);
98
+ border-right: 1px solid var(--val-color-border);
99
+ padding: 1.5rem 1rem;
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: 1.5rem;
103
+ }
104
+
105
+ .sidebar-brand {
106
+ font-size: var(--val-text-lg);
107
+ font-weight: var(--val-weight-bold);
108
+ color: var(--val-color-text);
109
+ text-decoration: none;
110
+ letter-spacing: -0.02em;
111
+ }
112
+ .sidebar-brand:hover { color: var(--val-blue-400); }
113
+
114
+ .sidebar ul { list-style: none; display: flex; flex-direction: column; gap: 0.25rem; }
115
+
116
+ .sidebar a {
117
+ display: block;
118
+ padding: 0.5rem 0.75rem;
119
+ border-radius: var(--val-radius-md);
120
+ color: var(--val-color-text-muted);
121
+ font-size: var(--val-text-sm);
122
+ font-weight: var(--val-weight-medium);
123
+ transition: background var(--val-duration-fast) var(--val-ease-in-out),
124
+ color var(--val-duration-fast) var(--val-ease-in-out);
125
+ }
126
+ .sidebar a:hover {
127
+ background: var(--val-color-bg-muted);
128
+ color: var(--val-color-text);
129
+ }
130
+
131
+ /* --- Main --- */
132
+ .main {
133
+ flex: 1;
134
+ padding: 2rem 2.5rem;
135
+ min-width: 0;
136
+ }
137
+
138
+ .main > h1 {
139
+ font-size: var(--val-text-2xl);
140
+ font-weight: var(--val-weight-bold);
141
+ margin-bottom: 1.5rem;
142
+ letter-spacing: -0.02em;
143
+ }
144
+
145
+ /* --- Cards --- */
146
+ .dashboard { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 1rem; }
147
+ .card {
148
+ background: var(--val-color-bg-elevated);
149
+ border: 1px solid var(--val-color-border);
150
+ border-radius: var(--val-radius-lg);
151
+ padding: 1.25rem;
152
+ box-shadow: var(--val-shadow-sm);
153
+ transition: border-color var(--val-duration-fast) var(--val-ease-in-out),
154
+ box-shadow var(--val-duration-fast) var(--val-ease-in-out);
155
+ }
156
+ .card:hover { border-color: var(--val-blue-500); box-shadow: var(--val-shadow-md); }
157
+ .card a { color: var(--val-color-text); text-decoration: none; display: block; }
158
+ .card h3 { font-size: var(--val-text-lg); font-weight: var(--val-weight-semibold); }
159
+
160
+ /* --- Tables --- */
161
+ table {
162
+ width: 100%;
163
+ border-collapse: collapse;
164
+ font-size: var(--val-text-sm);
165
+ margin-top: 1rem;
166
+ }
167
+ th {
168
+ text-align: left;
169
+ padding: 0.625rem 0.75rem;
170
+ font-weight: var(--val-weight-semibold);
171
+ color: var(--val-color-text-muted);
172
+ font-size: var(--val-text-xs);
173
+ text-transform: uppercase;
174
+ letter-spacing: 0.05em;
175
+ border-bottom: 1px solid var(--val-color-border);
176
+ }
177
+ td {
178
+ padding: 0.625rem 0.75rem;
179
+ border-bottom: 1px solid var(--val-color-border);
180
+ }
181
+ tr:hover td { background: var(--val-color-bg-elevated); }
182
+
183
+ /* --- Forms --- */
184
+ .admin-form { max-width: 640px; display: flex; flex-direction: column; gap: 1.25rem; }
185
+
186
+ .form-field {
187
+ display: flex;
188
+ flex-direction: column;
189
+ gap: 0.375rem;
190
+ }
191
+ .form-field > span {
192
+ font-size: var(--val-text-sm);
193
+ font-weight: var(--val-weight-medium);
194
+ color: var(--val-color-text-muted);
195
+ }
196
+
197
+ .form-input, .form-select, .form-textarea {
198
+ background: var(--val-color-bg-muted);
199
+ border: 1px solid var(--val-color-border);
200
+ border-radius: var(--val-radius-md);
201
+ padding: 0.5rem 0.75rem;
202
+ color: var(--val-color-text);
203
+ font-family: var(--val-font-sans);
204
+ font-size: var(--val-text-sm);
205
+ transition: border-color var(--val-duration-fast) var(--val-ease-in-out),
206
+ box-shadow var(--val-duration-fast) var(--val-ease-in-out);
207
+ }
208
+ .form-input:focus, .form-select:focus, .form-textarea:focus {
209
+ outline: none;
210
+ border-color: var(--val-color-border-focus);
211
+ box-shadow: var(--val-focus-ring);
212
+ }
213
+ .form-textarea { min-height: 120px; resize: vertical; }
214
+ .form-select { appearance: none; cursor: pointer; }
215
+
216
+ .form-checkbox {
217
+ display: flex;
218
+ align-items: center;
219
+ gap: 0.5rem;
220
+ font-size: var(--val-text-sm);
221
+ color: var(--val-color-text);
222
+ cursor: pointer;
223
+ }
224
+ .form-checkbox input[type="checkbox"] {
225
+ width: 1rem;
226
+ height: 1rem;
227
+ accent-color: var(--val-color-primary);
228
+ cursor: pointer;
229
+ }
230
+
231
+ fieldset {
232
+ border: 1px solid var(--val-color-border);
233
+ border-radius: var(--val-radius-lg);
234
+ padding: 1rem;
235
+ display: flex;
236
+ flex-direction: column;
237
+ gap: 1rem;
238
+ }
239
+ fieldset legend {
240
+ font-size: var(--val-text-sm);
241
+ font-weight: var(--val-weight-semibold);
242
+ color: var(--val-color-text-muted);
243
+ padding: 0 0.5rem;
244
+ }
245
+
246
+ /* --- Buttons --- */
247
+ .btn {
248
+ display: inline-flex;
249
+ align-items: center;
250
+ justify-content: center;
251
+ padding: 0.5rem 1rem;
252
+ font-size: var(--val-text-sm);
253
+ font-weight: var(--val-weight-semibold);
254
+ font-family: var(--val-font-sans);
255
+ border-radius: var(--val-radius-md);
256
+ border: none;
257
+ cursor: pointer;
258
+ text-decoration: none;
259
+ transition: background var(--val-duration-fast) var(--val-ease-in-out);
260
+ }
261
+ .btn-primary {
262
+ background: var(--val-color-primary);
263
+ color: var(--val-color-primary-text);
264
+ }
265
+ .btn-primary:hover { background: var(--val-color-primary-hover); color: var(--val-color-primary-text); }
266
+
267
+ .empty-state {
268
+ color: var(--val-color-text-muted);
269
+ padding: 2rem 0;
270
+ }
271
+ .empty-state a { color: var(--val-blue-400); }
272
+
273
+ .list-header {
274
+ display: flex;
275
+ justify-content: space-between;
276
+ align-items: center;
277
+ }
278
+
279
+ /* --- Toast --- */
280
+ .toast {
281
+ position: fixed;
282
+ top: 1.5rem;
283
+ right: 1.5rem;
284
+ display: flex;
285
+ align-items: center;
286
+ gap: 0.75rem;
287
+ padding: 0.75rem 1rem;
288
+ border-radius: var(--val-radius-md);
289
+ box-shadow: var(--val-shadow-md);
290
+ font-size: var(--val-text-sm);
291
+ font-weight: var(--val-weight-medium);
292
+ color: var(--val-color-text);
293
+ z-index: 1000;
294
+ transition: opacity var(--val-duration-normal) var(--val-ease-in-out);
295
+ }
296
+ .toast-error { background: var(--val-color-error); }
297
+ .toast-success { background: var(--val-color-success); }
298
+ .toast-info { background: var(--val-blue-500); }
299
+ .toast-dismiss {
300
+ background: none;
301
+ border: none;
302
+ color: inherit;
303
+ font-size: var(--val-text-lg);
304
+ cursor: pointer;
305
+ padding: 0;
306
+ line-height: 1;
307
+ opacity: 0.8;
308
+ }
309
+ .toast-dismiss:hover { opacity: 1; }
310
+ .toast-fade { opacity: 0; }
311
+
312
+ /* --- Responsive --- */
313
+ @media (max-width: 768px) {
314
+ body { flex-direction: column; }
315
+ .sidebar {
316
+ width: 100%;
317
+ border-right: none;
318
+ border-bottom: 1px solid var(--val-color-border);
319
+ padding: 1rem;
320
+ }
321
+ .sidebar ul { flex-direction: row; flex-wrap: wrap; gap: 0.5rem; }
322
+ .main { padding: 1.5rem 1rem; }
323
+ }
22
324
  </style>
23
325
  </head>
24
326
  <body>
25
- <nav>
26
- <h2><a href="/admin">Valence CMS</a></h2>
327
+ <nav class="sidebar">
328
+ <a href="/admin" class="sidebar-brand">Valence CMS</a>
27
329
  <ul>
28
330
  ${navItems}
29
331
  </ul>
30
332
  </nav>
31
- <main>
333
+ <main class="main">
334
+ ${toastHtml}
32
335
  <h1>${escapeHtml(args.title)}</h1>
33
336
  ${args.content}
34
337
  </main>
338
+ ${toastHtml
339
+ ? `<script>
340
+ (function () {
341
+ var t = document.querySelector('.toast')
342
+ if (!t) return
343
+ var btn = t.querySelector('.toast-dismiss')
344
+ if (btn) btn.addEventListener('click', function () { t.classList.add('toast-fade'); setTimeout(function () { t.remove() }, 200) })
345
+ setTimeout(function () { t.classList.add('toast-fade'); setTimeout(function () { t.remove() }, 200) }, 5000)
346
+ })()
347
+ </script>`
348
+ : ''}
35
349
  </body>
36
350
  </html>`;
37
351
  }
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/admin/layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAQxC,MAAM,UAAU,YAAY,CAAE,IAAgB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAA;QACpD,OAAO,uBAAuB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,CAAA;IACvE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;;;;;WAKE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;EAgB/B,QAAQ;;;;UAIA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;MAC1B,IAAI,CAAC,OAAO;;;QAGV,CAAA;AACR,CAAC"}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/admin/layout.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AASxC,MAAM,UAAU,YAAY,CAAE,IAAgB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAA;QACpD,OAAO,uBAAuB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,CAAA;IACvE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAE3D,OAAO;;;;;WAKE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4T/B,QAAQ;;;;MAIJ,SAAS;UACL,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;MAC1B,IAAI,CAAC,OAAO;;IAEd,SAAS;QACT,CAAC,CAAC;;;;;;;;YAQM;QACR,CAAC,CAAC,EAAE;;QAEA,CAAA;AACR,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-view.d.ts","sourceRoot":"","sources":["../../src/admin/list-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAG/D,UAAU,MAAM;IACd,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;CACzD;AAED,wBAAgB,cAAc,CAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAqBtF"}
1
+ {"version":3,"file":"list-view.d.ts","sourceRoot":"","sources":["../../src/admin/list-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAG/D,UAAU,MAAM;IACd,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;CACzD;AAED,wBAAgB,cAAc,CAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAwBtF"}
@@ -2,7 +2,7 @@ import { escapeHtml } from './escape.js';
2
2
  export function renderListView(col, docs) {
3
3
  const label = escapeHtml(col.labels?.plural ?? col.slug);
4
4
  if (docs.length === 0) {
5
- return `<p>No ${label} found.</p><a href="/admin/${escapeHtml(col.slug)}/new">Create one</a>`;
5
+ return `<div class="empty-state"><p>No ${label} found.</p><a href="/admin/${escapeHtml(col.slug)}/new">Create one</a></div>`;
6
6
  }
7
7
  const displayFields = col.fields.slice(0, 3);
8
8
  const headerCells = displayFields.map(f => `<th>${escapeHtml(f.label ?? f.name)}</th>`).join('');
@@ -12,7 +12,10 @@ export function renderListView(col, docs) {
12
12
  return `<tr><td><a href="/admin/${escapeHtml(col.slug)}/${safeId}/edit">${safeId}</a></td>${cells}</tr>`;
13
13
  }).join('\n');
14
14
  return `
15
- <a href="/admin/${escapeHtml(col.slug)}/new">New ${escapeHtml(col.labels?.singular ?? col.slug)}</a>
15
+ <div class="list-header">
16
+ <span></span>
17
+ <a href="/admin/${escapeHtml(col.slug)}/new" class="btn btn-primary">New ${escapeHtml(col.labels?.singular ?? col.slug)}</a>
18
+ </div>
16
19
  <table>
17
20
  <thead><tr><th>ID</th>${headerCells}</tr></thead>
18
21
  <tbody>${rows}</tbody>
@@ -1 +1 @@
1
- {"version":3,"file":"list-view.js","sourceRoot":"","sources":["../../src/admin/list-view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOxC,MAAM,UAAU,cAAc,CAAE,GAAqB,EAAE,IAAuB;IAC5E,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;IAExD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,KAAK,8BAA8B,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAA;IAC/F,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC5C,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClG,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjC,OAAO,2BAA2B,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,UAAU,MAAM,YAAY,KAAK,OAAO,CAAA;IAC1G,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;kBACS,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC;;0BAErE,WAAW;WAC1B,IAAI;SACN,CAAA;AACT,CAAC"}
1
+ {"version":3,"file":"list-view.js","sourceRoot":"","sources":["../../src/admin/list-view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOxC,MAAM,UAAU,cAAc,CAAE,GAAqB,EAAE,IAAuB;IAC5E,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;IAExD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,kCAAkC,KAAK,8BAA8B,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAA;IAC9H,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC5C,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClG,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjC,OAAO,2BAA2B,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,UAAU,MAAM,YAAY,KAAK,OAAO,CAAA;IAC1G,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;;;oBAGW,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,qCAAqC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC;;;0BAG/F,WAAW;WAC1B,IAAI;SACN,CAAA;AACT,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FlashMessage } from './flash.js';
2
+ declare function renderToast(msg: FlashMessage): string;
3
+ export { renderToast };
4
+ //# sourceMappingURL=toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../src/admin/toast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,iBAAS,WAAW,CAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAM/C;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { escapeHtml } from './escape.js';
2
+ function renderToast(msg) {
3
+ const cls = `toast toast-${msg.type}`;
4
+ return `<div class="${cls}" role="alert" aria-live="polite">
5
+ <span class="toast-message">${escapeHtml(msg.text)}</span>
6
+ <button class="toast-dismiss" aria-label="Dismiss">&times;</button>
7
+ </div>`;
8
+ }
9
+ export { renderToast };
10
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","sourceRoot":"","sources":["../../src/admin/toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,SAAS,WAAW,CAAE,GAAiB;IACrC,MAAM,GAAG,GAAG,eAAe,GAAG,CAAC,IAAI,EAAE,CAAA;IACrC,OAAO,eAAe,GAAG;gCACK,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;;OAE7C,CAAA;AACP,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"zod-generator.d.ts","sourceRoot":"","sources":["../../src/validation/zod-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,KAAK,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAwF3D,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,CAE5E;AAED,wBAAgB,qBAAqB,CAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,CAEhF"}
1
+ {"version":3,"file":"zod-generator.d.ts","sourceRoot":"","sources":["../../src/validation/zod-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,KAAK,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAiG3D,wBAAgB,iBAAiB,CAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,CAE5E;AAED,wBAAgB,qBAAqB,CAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,CAEhF"}
@@ -22,7 +22,7 @@ function buildTextSchema(field) {
22
22
  return schema;
23
23
  }
24
24
  function buildNumberSchema(field) {
25
- let schema = z.number();
25
+ let schema = z.coerce.number();
26
26
  if ('min' in field && field.min !== undefined) {
27
27
  schema = schema.min(field.min);
28
28
  }
@@ -32,7 +32,7 @@ function buildNumberSchema(field) {
32
32
  return schema;
33
33
  }
34
34
  function buildBooleanSchema(_field) {
35
- return z.boolean();
35
+ return z.preprocess((val) => val === 'true' ? true : val === 'false' ? false : val, z.boolean());
36
36
  }
37
37
  function buildSelectSchema(field) {
38
38
  if ('options' in field && field.options.length > 0) {
@@ -45,8 +45,11 @@ function buildSelectSchema(field) {
45
45
  }
46
46
  return z.string();
47
47
  }
48
- function buildDateSchema(_field) {
49
- return z.string();
48
+ function buildDateSchema(field) {
49
+ if (field.required) {
50
+ return z.string().min(1);
51
+ }
52
+ return z.preprocess((val) => (typeof val === 'string' && val === '') ? undefined : val, z.string().optional());
50
53
  }
51
54
  function buildSlugSchema(_field) {
52
55
  return z.string();
@@ -1 +1 @@
1
- {"version":3,"file":"zod-generator.js","sourceRoot":"","sources":["../../src/validation/zod-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zod-generator.js","sourceRoot":"","sources":["../../src/validation/zod-generator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valencets/cms",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -24,8 +24,8 @@
24
24
  "neverthrow": "^8.2.0",
25
25
  "zod": "^4.3.6",
26
26
  "@valencets/core": "0.1.0",
27
- "@valencets/db": "0.1.0",
28
- "@valencets/ui": "0.1.0"
27
+ "@valencets/db": "0.1.2",
28
+ "@valencets/ui": "0.1.1"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^25.4.0",