@cyber-dash-tech/revela 0.19.8 → 0.20.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.
@@ -2800,11 +2800,13 @@ Monet skins Revela built-in page templates with soft editorial rhythm, painterly
2800
2800
  - `cover`, `section-divider`, `closing`: use expressive title-led structural pages.
2801
2801
  - `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use soft narrative regions with no heavy outer box.
2802
2802
  - Agenda typography follows design tokens: title and numbers use `--font-display`; item labels and footer use `--font-body`.
2803
+ - `team`: use soft editorial portrait-led member cards with one photo, name, role, two concise highlights, and one education line. Prefer 3-4 members per page.
2803
2804
  - `metric-highlight`, `chart-takeaways`, `table`, `table-comparison`: use calm data surfaces and readable interpretation zones.
2804
2805
  - Text panels use explicit variants: `template-text-panel--clear` is transparent with no border or background, `template-text-panel--plain` is theme-neutral, and `template-text-panel--color` is the multicolor emphasis treatment used by chart and timeline reading panels.
2805
2806
  - `milestone`: dots remain milestone anchors inside each horizontal milestone item; do not position detached decorative markers.
2806
2807
  - `timeline`: dots remain event anchors inside each vertical timeline item; do not position detached decorative markers.
2807
2808
  - `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use quiet action and tradeoff panels.
2809
+ - `free`: use a plain title plus one semantic placeholder region; the agent may later replace that region with multiple images, charts, text blocks, tables, or mixed content.
2808
2810
 
2809
2811
  <!-- @design:page-templates:end -->
2810
2812
 
@@ -99,24 +99,24 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
99
99
  linear-gradient(135deg, #07111f, #101a2b 62%, #243a73);
100
100
  }
101
101
 
102
- .template-slide[data-design="monet"][data-template="cover"] .slide-canvas {
102
+ .template-slide[data-template="cover"] .slide-canvas {
103
103
  background:
104
104
  linear-gradient(90deg, rgba(7,17,31,0.82), rgba(7,17,31,0.42) 52%, rgba(7,17,31,0.24)),
105
105
  url("./assets/cover-background.jpg") center center / cover no-repeat;
106
106
  }
107
- .template-slide[data-design="monet"][data-template="agenda"] .slide-canvas {
107
+ .template-slide[data-template="agenda"] .slide-canvas {
108
108
  background:
109
109
  linear-gradient(90deg, rgba(7,17,31,0.86), rgba(7,17,31,0.58) 52%, rgba(7,17,31,0.32)),
110
110
  url("./assets/cover-background.jpg") center center / cover no-repeat;
111
111
  }
112
- .template-slide[data-design="monet"][data-template="section-divider"] .slide-canvas {
112
+ .template-slide[data-template="section-divider"] .slide-canvas {
113
113
  background:
114
114
  linear-gradient(90deg, rgba(7,17,31,0.86), rgba(16,26,43,0.62) 58%, rgba(36,58,115,0.36)),
115
115
  url("./assets/cover-background.jpg") center center / cover no-repeat;
116
116
  }
117
117
  .template-slide[data-template="closing"] .slide-canvas { background: linear-gradient(135deg, #07111f, #315eea 58%, #18a8d8); }
118
118
 
119
- .template-slide[data-design="monet"][data-template="closing"] .slide-canvas {
119
+ .template-slide[data-template="closing"] .slide-canvas {
120
120
  background:
121
121
  linear-gradient(90deg, rgba(7,17,31,0.82), rgba(49,94,234,0.42) 58%, rgba(24,168,216,0.24)),
122
122
  url("./assets/closing-background.jpg") center center / cover no-repeat;
@@ -162,10 +162,13 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
162
162
  .text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
163
163
  .text-panel-formula-caption { margin: 0; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
164
164
  .template-chart-takeaway-list { display: grid; gap: 22px; width: 100%; }
165
- .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid rgba(255,255,255,0.24); }
165
+ .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid var(--line); }
166
+ .template-text-panel--color .template-chart-takeaway-item { border-top-color: rgba(255,255,255,0.24); }
166
167
  .template-chart-takeaway-item:first-child { padding-top: 0; border-top: 0; }
167
- .template-chart-takeaway-item h3 { margin: 0; font-size: 25px; line-height: 1.24; color: white; }
168
- .template-chart-takeaway-item p { margin: 0; font-size: 20px; line-height: 1.46; color: rgba(255,255,255,0.78); }
168
+ .template-chart-takeaway-item h3 { margin: 0; font-size: 25px; line-height: 1.24; color: var(--text-primary); }
169
+ .template-text-panel--color .template-chart-takeaway-item h3 { color: white; }
170
+ .template-chart-takeaway-item p { margin: 0; font-size: 20px; line-height: 1.46; color: var(--text-secondary); }
171
+ .template-text-panel--color .template-chart-takeaway-item p { color: rgba(255,255,255,0.78); }
169
172
  .template-bar { flex: 1; background: linear-gradient(180deg, var(--accent-primary), var(--accent-cyan)); min-height: 80px; }
170
173
  .template-table-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 34px; height: 100%; align-items: stretch; }
171
174
  .template-table-layout .template-side-panel { grid-column: 1; grid-row: 1; }
@@ -223,6 +226,25 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
223
226
  .template-timeline--vertical .template-timeline-item:nth-child(even) .template-timeline-copy { grid-column: 3; text-align: left; align-self: center; }
224
227
  .template-steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: 22px; }
225
228
  .template-step-number { font-size: 48px; color: var(--accent-primary); font-weight: 800; margin-bottom: 30px; }
229
+ .template-team-grid { height: 100%; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; align-items: stretch; }
230
+ .template-team-card { min-width: 0; min-height: 0; display: grid; grid-template-rows: 330px minmax(0, 1fr); overflow: hidden; background: rgba(255,255,255,0.86); border: 1px solid var(--line); border-radius: var(--surface-radius); box-shadow: 0 18px 44px var(--shadow-soft); }
231
+ .template-team-photo { margin: 0; width: 100%; height: 100%; overflow: hidden; background: linear-gradient(135deg, var(--accent-soft), rgba(24,168,216,0.16)); display: grid; place-items: center; }
232
+ .template-team-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
233
+ .template-team-photo span { font-family: var(--font-display); font-size: 72px; line-height: 1; color: var(--accent-primary); font-weight: 800; }
234
+ .template-team-copy { min-height: 0; display: flex; flex-direction: column; gap: 12px; padding: 26px; }
235
+ .template-team-name { margin: 0; font-size: 30px; line-height: 1.18; color: var(--text-primary); padding-bottom: 3px; overflow: visible; }
236
+ .template-team-role { margin: 0; font-size: 15px; line-height: 1.35; letter-spacing: 0.1em; text-transform: uppercase; color: var(--accent-primary); font-weight: 800; }
237
+ .template-team-highlights { margin: 4px 0 0; padding: 0; list-style: none; display: grid; gap: 9px; }
238
+ .template-team-highlights li { position: relative; padding-left: 18px; font-size: 17px; line-height: 1.36; color: var(--text-secondary); }
239
+ .template-team-highlights li::before { content: ""; position: absolute; left: 0; top: 9px; width: 6px; height: 6px; background: var(--accent-primary); border-radius: 999px; }
240
+ .template-team-education { margin: auto 0 0; padding-top: 14px; border-top: 1px solid var(--line); font-size: 14px; line-height: 1.35; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); font-weight: 800; }
241
+ .template-free-stage { height: 100%; display: grid; grid-template-columns: minmax(0, 1fr); }
242
+ .template-free-placeholder { min-width: 0; min-height: 0; display: flex; flex-direction: column; justify-content: flex-end; gap: 16px; padding: 42px; border: 1px dashed var(--line-strong); border-radius: var(--surface-radius); background: linear-gradient(135deg, rgba(49,94,234,0.06), rgba(24,168,216,0.07)); overflow: hidden; }
243
+ .template-free-placeholder-label { align-self: flex-start; font-size: 13px; line-height: 1; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent-primary); font-weight: 800; }
244
+ .template-free-placeholder h2 { margin: 0; font-size: 38px; line-height: 1.18; color: var(--text-primary); padding-bottom: 4px; overflow: visible; }
245
+ .template-free-placeholder p { margin: 0; max-width: 980px; font-size: 23px; line-height: 1.42; color: var(--text-secondary); }
246
+ .template-free-placeholder-hints { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 6px; }
247
+ .template-free-placeholder-hint { display: inline-flex; align-items: center; min-height: 32px; padding: 7px 12px; border: 1px solid var(--line); border-radius: 999px; font-size: 13px; line-height: 1; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); font-weight: 800; background: rgba(255,255,255,0.58); }
226
248
  .template-image-card { width: 100%; margin: 18px 0 0; display: grid; gap: 8px; }
227
249
  .template-image-frame { width: 100%; height: 128px; border-radius: var(--surface-radius); overflow: hidden; background: var(--surface-tint, #f1f6fc); border: 1px solid var(--line); }
228
250
  .template-image-frame img { display: block; width: 100%; height: 100%; object-fit: cover; }
@@ -302,6 +324,20 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
302
324
  .template-frame--catalog .template-timeline-copy p:last-child { font-size: 15px; line-height: 1.24; }
303
325
  .template-frame--catalog .template-steps { gap: 16px; }
304
326
  .template-frame--catalog .template-step-number { font-size: 40px; margin-bottom: 20px; }
327
+ .template-frame--catalog .template-team-grid { gap: 16px; }
328
+ .template-frame--catalog .template-team-card { grid-template-rows: 230px minmax(0, 1fr); }
329
+ .template-frame--catalog .template-team-copy { padding: 18px; gap: 8px; }
330
+ .template-frame--catalog .template-team-name { font-size: 22px; line-height: 1.14; }
331
+ .template-frame--catalog .template-team-role { font-size: 11px; line-height: 1.25; }
332
+ .template-frame--catalog .template-team-highlights { gap: 6px; }
333
+ .template-frame--catalog .template-team-highlights li { font-size: 13px; line-height: 1.25; padding-left: 14px; }
334
+ .template-frame--catalog .template-team-highlights li::before { top: 7px; width: 5px; height: 5px; }
335
+ .template-frame--catalog .template-team-education { font-size: 10px; line-height: 1.25; padding-top: 9px; }
336
+ .template-frame--catalog .template-free-placeholder { padding: 28px; gap: 10px; }
337
+ .template-frame--catalog .template-free-placeholder-label { font-size: 10px; }
338
+ .template-frame--catalog .template-free-placeholder h2 { font-size: 28px; line-height: 1.16; }
339
+ .template-frame--catalog .template-free-placeholder p { font-size: 17px; line-height: 1.3; }
340
+ .template-frame--catalog .template-free-placeholder-hint { min-height: 26px; padding: 6px 9px; font-size: 10px; }
305
341
  .template-frame--catalog .template-image-frame { height: 86px; }
306
342
  .template-frame--catalog .template-image-caption { font-size: 11px; }
307
343
  .template-frame--catalog .template-visual-placeholder-frame { height: 110px; }
@@ -337,28 +373,58 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
337
373
  .template-card,
338
374
  .template-table,
339
375
  .template-insight-panel,
340
- .template-catalog-panel {
376
+ .template-catalog-panel,
377
+ .template-team-card {
341
378
  background: rgba(255, 250, 243, 0.84);
342
379
  border-color: var(--line);
343
380
  box-shadow: 0 20px 50px rgba(69, 53, 38, 0.09);
344
381
  }
382
+ .template-team-photo { background: linear-gradient(135deg, rgba(65,111,136,0.14), rgba(156,111,58,0.14)); }
383
+ .template-team-photo img { filter: saturate(0.78) contrast(1.02); }
384
+ .template-team-name { font-family: var(--font-display); font-size: 34px; font-weight: 700; }
385
+ .template-team-highlights li { font-size: 18px; }
386
+ .template-free-placeholder { background: linear-gradient(135deg, rgba(65,111,136,0.08), rgba(156,111,58,0.08)), rgba(255, 250, 243, 0.72); border-color: var(--line-strong); }
387
+ .template-free-placeholder-hint { background: rgba(255, 250, 243, 0.9); }
345
388
  .template-title { font-size: 68px; line-height: 1.12; }
346
389
  .template-card p,
347
390
  .template-text-panel-body,
348
391
  .template-claim-text-body,
349
392
  .template-insight-body { font-size: 24px; }
393
+ .template-agenda-item span {
394
+ color: #d8b36a;
395
+ text-shadow: 0 1px 0 rgba(21, 18, 15, 0.32), 0 0 18px rgba(216, 179, 106, 0.18);
396
+ }
350
397
  .template-text-panel--color,
351
398
  .template-timeline-layout .template-text-panel--color {
352
- background: linear-gradient(135deg, #416f88 0%, #5c948b 56%, #9c6f3a 118%);
399
+ background:
400
+ radial-gradient(circle at 18% 18%, rgba(92, 148, 139, 0.24), transparent 34%),
401
+ radial-gradient(circle at 86% 12%, rgba(176, 103, 86, 0.2), transparent 30%),
402
+ linear-gradient(135deg, rgba(255, 250, 243, 0.96) 0%, rgba(232, 238, 232, 0.9) 54%, rgba(228, 216, 200, 0.88) 118%);
403
+ color: var(--text-primary);
404
+ border: 1px solid rgba(82, 66, 48, 0.18);
405
+ box-shadow: 0 24px 58px rgba(69, 53, 38, 0.12);
406
+ }
407
+ .template-text-panel--color .template-text-panel-title,
408
+ .template-text-panel--color .template-chart-takeaway-item h3,
409
+ .template-timeline-layout .template-text-panel--color .template-text-panel-title {
410
+ color: var(--text-primary);
411
+ }
412
+ .template-text-panel--color .template-text-panel-body,
413
+ .template-text-panel--color .template-chart-takeaway-item p,
414
+ .template-timeline-layout .template-text-panel--color .template-text-panel-body {
415
+ color: var(--text-secondary);
416
+ }
417
+ .template-text-panel--color .template-chart-takeaway-item {
418
+ border-top-color: rgba(82, 66, 48, 0.16);
353
419
  }
354
- .template-slide[data-design="monet"][data-template="cover"] .slide-canvas,
355
- .template-slide[data-design="monet"][data-template="agenda"] .slide-canvas,
356
- .template-slide[data-design="monet"][data-template="section-divider"] .slide-canvas {
420
+ .template-slide[data-template="cover"] .slide-canvas,
421
+ .template-slide[data-template="agenda"] .slide-canvas,
422
+ .template-slide[data-template="section-divider"] .slide-canvas {
357
423
  background:
358
424
  linear-gradient(90deg, rgba(21,18,15,0.78), rgba(21,18,15,0.38) 52%, rgba(21,18,15,0.14)),
359
425
  url("./assets/cover-background.jpg") center center / cover no-repeat;
360
426
  }
361
- .template-slide[data-design="monet"][data-template="closing"] .slide-canvas {
427
+ .template-slide[data-template="closing"] .slide-canvas {
362
428
  background:
363
429
  linear-gradient(90deg, rgba(21,18,15,0.7), rgba(65,111,136,0.38) 58%, rgba(156,111,58,0.2)),
364
430
  url("./assets/closing-background.jpg") center center / cover no-repeat;
@@ -903,11 +903,13 @@ Starter skins Revela built-in page templates as a neutral authoring system. The
903
903
  - `cover`, `section-divider`, `closing`: use clear title-first structural pages.
904
904
  - `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use plain narrative and card-grid surfaces.
905
905
  - Agenda typography follows design tokens: title and numbers use `--font-display`; item labels and footer use `--font-body`.
906
+ - `team`: use portrait-led member cards with one photo, name, role, two concise highlights, and one education line. Prefer 3-4 members per page.
906
907
  - `metric-highlight`, `chart-takeaways`, `table`, `table-comparison`: use direct data panels with minimal decoration.
907
908
  - Text panels use explicit variants: `template-text-panel--clear` is transparent with no border or background, `template-text-panel--plain` is theme-neutral, and `template-text-panel--color` is the multicolor emphasis treatment used by chart and timeline reading panels.
908
909
  - `milestone`: dots remain milestone anchors inside each horizontal milestone item; do not position detached decorative markers.
909
910
  - `timeline`: dots remain event anchors inside each vertical timeline item; do not position detached decorative markers.
910
911
  - `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use simple step and decision panels.
912
+ - `free`: use a plain title plus one semantic placeholder region; the agent may later replace that region with multiple images, charts, text blocks, tables, or mixed content.
911
913
 
912
914
  <!-- @design:page-templates:end -->
913
915
 
@@ -99,24 +99,24 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
99
99
  linear-gradient(135deg, #07111f, #101a2b 62%, #243a73);
100
100
  }
101
101
 
102
- .template-slide[data-design="starter"][data-template="cover"] .slide-canvas {
102
+ .template-slide[data-template="cover"] .slide-canvas {
103
103
  background:
104
104
  linear-gradient(90deg, rgba(7,17,31,0.82), rgba(7,17,31,0.42) 52%, rgba(7,17,31,0.24)),
105
105
  url("./assets/cover-background.jpg") center center / cover no-repeat;
106
106
  }
107
- .template-slide[data-design="starter"][data-template="agenda"] .slide-canvas {
107
+ .template-slide[data-template="agenda"] .slide-canvas {
108
108
  background:
109
109
  linear-gradient(90deg, rgba(7,17,31,0.86), rgba(7,17,31,0.58) 52%, rgba(7,17,31,0.32)),
110
110
  url("./assets/cover-background.jpg") center center / cover no-repeat;
111
111
  }
112
- .template-slide[data-design="starter"][data-template="section-divider"] .slide-canvas {
112
+ .template-slide[data-template="section-divider"] .slide-canvas {
113
113
  background:
114
114
  linear-gradient(90deg, rgba(7,17,31,0.86), rgba(16,26,43,0.62) 58%, rgba(36,58,115,0.36)),
115
115
  url("./assets/cover-background.jpg") center center / cover no-repeat;
116
116
  }
117
117
  .template-slide[data-template="closing"] .slide-canvas { background: linear-gradient(135deg, #07111f, #315eea 58%, #18a8d8); }
118
118
 
119
- .template-slide[data-design="starter"][data-template="closing"] .slide-canvas {
119
+ .template-slide[data-template="closing"] .slide-canvas {
120
120
  background:
121
121
  linear-gradient(90deg, rgba(7,17,31,0.82), rgba(49,94,234,0.42) 58%, rgba(24,168,216,0.24)),
122
122
  url("./assets/closing-background.jpg") center center / cover no-repeat;
@@ -162,10 +162,13 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
162
162
  .text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
163
163
  .text-panel-formula-caption { margin: 0; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
164
164
  .template-chart-takeaway-list { display: grid; gap: 22px; width: 100%; }
165
- .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid rgba(255,255,255,0.24); }
165
+ .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid var(--line); }
166
+ .template-text-panel--color .template-chart-takeaway-item { border-top-color: rgba(255,255,255,0.24); }
166
167
  .template-chart-takeaway-item:first-child { padding-top: 0; border-top: 0; }
167
- .template-chart-takeaway-item h3 { margin: 0; font-size: 25px; line-height: 1.24; color: white; }
168
- .template-chart-takeaway-item p { margin: 0; font-size: 20px; line-height: 1.46; color: rgba(255,255,255,0.78); }
168
+ .template-chart-takeaway-item h3 { margin: 0; font-size: 25px; line-height: 1.24; color: var(--text-primary); }
169
+ .template-text-panel--color .template-chart-takeaway-item h3 { color: white; }
170
+ .template-chart-takeaway-item p { margin: 0; font-size: 20px; line-height: 1.46; color: var(--text-secondary); }
171
+ .template-text-panel--color .template-chart-takeaway-item p { color: rgba(255,255,255,0.78); }
169
172
  .template-bar { flex: 1; background: linear-gradient(180deg, var(--accent-primary), var(--accent-cyan)); min-height: 80px; }
170
173
  .template-table-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 34px; height: 100%; align-items: stretch; }
171
174
  .template-table-layout .template-side-panel { grid-column: 1; grid-row: 1; }
@@ -223,6 +226,25 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
223
226
  .template-timeline--vertical .template-timeline-item:nth-child(even) .template-timeline-copy { grid-column: 3; text-align: left; align-self: center; }
224
227
  .template-steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: 22px; }
225
228
  .template-step-number { font-size: 48px; color: var(--accent-primary); font-weight: 800; margin-bottom: 30px; }
229
+ .template-team-grid { height: 100%; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; align-items: stretch; }
230
+ .template-team-card { min-width: 0; min-height: 0; display: grid; grid-template-rows: 330px minmax(0, 1fr); overflow: hidden; background: rgba(255,255,255,0.86); border: 1px solid var(--line); border-radius: var(--surface-radius); box-shadow: 0 18px 44px var(--shadow-soft); }
231
+ .template-team-photo { margin: 0; width: 100%; height: 100%; overflow: hidden; background: linear-gradient(135deg, var(--accent-soft), rgba(24,168,216,0.16)); display: grid; place-items: center; }
232
+ .template-team-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
233
+ .template-team-photo span { font-family: var(--font-display); font-size: 72px; line-height: 1; color: var(--accent-primary); font-weight: 800; }
234
+ .template-team-copy { min-height: 0; display: flex; flex-direction: column; gap: 12px; padding: 26px; }
235
+ .template-team-name { margin: 0; font-size: 30px; line-height: 1.18; color: var(--text-primary); padding-bottom: 3px; overflow: visible; }
236
+ .template-team-role { margin: 0; font-size: 15px; line-height: 1.35; letter-spacing: 0.1em; text-transform: uppercase; color: var(--accent-primary); font-weight: 800; }
237
+ .template-team-highlights { margin: 4px 0 0; padding: 0; list-style: none; display: grid; gap: 9px; }
238
+ .template-team-highlights li { position: relative; padding-left: 18px; font-size: 17px; line-height: 1.36; color: var(--text-secondary); }
239
+ .template-team-highlights li::before { content: ""; position: absolute; left: 0; top: 9px; width: 6px; height: 6px; background: var(--accent-primary); border-radius: 999px; }
240
+ .template-team-education { margin: auto 0 0; padding-top: 14px; border-top: 1px solid var(--line); font-size: 14px; line-height: 1.35; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); font-weight: 800; }
241
+ .template-free-stage { height: 100%; display: grid; grid-template-columns: minmax(0, 1fr); }
242
+ .template-free-placeholder { min-width: 0; min-height: 0; display: flex; flex-direction: column; justify-content: flex-end; gap: 16px; padding: 42px; border: 1px dashed var(--line-strong); border-radius: var(--surface-radius); background: linear-gradient(135deg, rgba(49,94,234,0.06), rgba(24,168,216,0.07)); overflow: hidden; }
243
+ .template-free-placeholder-label { align-self: flex-start; font-size: 13px; line-height: 1; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent-primary); font-weight: 800; }
244
+ .template-free-placeholder h2 { margin: 0; font-size: 38px; line-height: 1.18; color: var(--text-primary); padding-bottom: 4px; overflow: visible; }
245
+ .template-free-placeholder p { margin: 0; max-width: 980px; font-size: 23px; line-height: 1.42; color: var(--text-secondary); }
246
+ .template-free-placeholder-hints { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 6px; }
247
+ .template-free-placeholder-hint { display: inline-flex; align-items: center; min-height: 32px; padding: 7px 12px; border: 1px solid var(--line); border-radius: 999px; font-size: 13px; line-height: 1; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); font-weight: 800; background: rgba(255,255,255,0.58); }
226
248
  .template-image-card { width: 100%; margin: 18px 0 0; display: grid; gap: 8px; }
227
249
  .template-image-frame { width: 100%; height: 128px; border-radius: var(--surface-radius); overflow: hidden; background: var(--surface-tint, #f1f6fc); border: 1px solid var(--line); }
228
250
  .template-image-frame img { display: block; width: 100%; height: 100%; object-fit: cover; }
@@ -302,6 +324,20 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
302
324
  .template-frame--catalog .template-timeline-copy p:last-child { font-size: 15px; line-height: 1.24; }
303
325
  .template-frame--catalog .template-steps { gap: 16px; }
304
326
  .template-frame--catalog .template-step-number { font-size: 40px; margin-bottom: 20px; }
327
+ .template-frame--catalog .template-team-grid { gap: 16px; }
328
+ .template-frame--catalog .template-team-card { grid-template-rows: 230px minmax(0, 1fr); }
329
+ .template-frame--catalog .template-team-copy { padding: 18px; gap: 8px; }
330
+ .template-frame--catalog .template-team-name { font-size: 22px; line-height: 1.14; }
331
+ .template-frame--catalog .template-team-role { font-size: 11px; line-height: 1.25; }
332
+ .template-frame--catalog .template-team-highlights { gap: 6px; }
333
+ .template-frame--catalog .template-team-highlights li { font-size: 13px; line-height: 1.25; padding-left: 14px; }
334
+ .template-frame--catalog .template-team-highlights li::before { top: 7px; width: 5px; height: 5px; }
335
+ .template-frame--catalog .template-team-education { font-size: 10px; line-height: 1.25; padding-top: 9px; }
336
+ .template-frame--catalog .template-free-placeholder { padding: 28px; gap: 10px; }
337
+ .template-frame--catalog .template-free-placeholder-label { font-size: 10px; }
338
+ .template-frame--catalog .template-free-placeholder h2 { font-size: 28px; line-height: 1.16; }
339
+ .template-frame--catalog .template-free-placeholder p { font-size: 17px; line-height: 1.3; }
340
+ .template-frame--catalog .template-free-placeholder-hint { min-height: 26px; padding: 6px 9px; font-size: 10px; }
305
341
  .template-frame--catalog .template-image-frame { height: 86px; }
306
342
  .template-frame--catalog .template-image-caption { font-size: 11px; }
307
343
  .template-frame--catalog .template-visual-placeholder-frame { height: 110px; }
@@ -332,15 +368,18 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
332
368
  .template-card,
333
369
  .template-table,
334
370
  .template-insight-panel,
335
- .template-catalog-panel { box-shadow: none; }
336
- .template-slide[data-design="starter"][data-template="cover"] .slide-canvas,
337
- .template-slide[data-design="starter"][data-template="agenda"] .slide-canvas,
338
- .template-slide[data-design="starter"][data-template="section-divider"] .slide-canvas {
371
+ .template-catalog-panel,
372
+ .template-team-card { box-shadow: none; }
373
+ .template-team-photo img { filter: saturate(0.92) contrast(1.04); }
374
+ .template-free-placeholder { box-shadow: none; }
375
+ .template-slide[data-template="cover"] .slide-canvas,
376
+ .template-slide[data-template="agenda"] .slide-canvas,
377
+ .template-slide[data-template="section-divider"] .slide-canvas {
339
378
  background:
340
379
  linear-gradient(90deg, rgba(16,19,22,0.82), rgba(16,19,22,0.42) 52%, rgba(16,19,22,0.18)),
341
380
  url("./assets/cover-background.jpg") center center / cover no-repeat;
342
381
  }
343
- .template-slide[data-design="starter"][data-template="closing"] .slide-canvas {
382
+ .template-slide[data-template="closing"] .slide-canvas {
344
383
  background:
345
384
  linear-gradient(90deg, rgba(16,19,22,0.72), rgba(47,115,218,0.34) 58%, rgba(43,159,195,0.22)),
346
385
  url("./assets/closing-background.jpg") center center / cover no-repeat;
@@ -2604,11 +2604,13 @@ Summit skins Revela built-in page templates with editorial hierarchy, broad whit
2604
2604
  - `cover`, `section-divider`, `closing`: use strong editorial title pages.
2605
2605
  - `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use borderless narrative groupings with clear hierarchy.
2606
2606
  - Agenda typography follows design tokens: title and numbers use `--font-display`; item labels and footer use `--font-body`.
2607
+ - `team`: use portrait-led member cards with one clear photo, name, role, two project/career highlights, and one highest-education line. Optimize for 3-4 members per page; 5-6 members require short copy and consistent portraits.
2607
2608
  - `metric-highlight`, `chart-takeaways`, `table`, `table-comparison`: use evidence-first data regions without outer container borders.
2608
2609
  - Text panels use explicit variants: `template-text-panel--clear` is transparent with no border or background, `template-text-panel--plain` is theme-neutral, and `template-text-panel--color` is the multicolor emphasis treatment used by chart and timeline reading panels.
2609
2610
  - `milestone`: dots remain milestone anchors inside each horizontal milestone item; do not position detached decorative markers.
2610
2611
  - `timeline`: dots remain event anchors inside each vertical timeline item; do not position detached decorative markers.
2611
2612
  - `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use decisive action panels with minimal framing.
2613
+ - `free`: use a plain title plus one semantic placeholder region. The agent may later replace that region with multiple images, charts, text blocks, tables, or mixed content; do not use it as raw arbitrary HTML.
2612
2614
 
2613
2615
  <!-- @design:page-templates:end -->
2614
2616
 
@@ -99,24 +99,24 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
99
99
  linear-gradient(135deg, #07111f, #101a2b 62%, #243a73);
100
100
  }
101
101
 
102
- .template-slide[data-design="summit"][data-template="cover"] .slide-canvas {
102
+ .template-slide[data-template="cover"] .slide-canvas {
103
103
  background:
104
104
  linear-gradient(90deg, rgba(7,17,31,0.82), rgba(7,17,31,0.42) 52%, rgba(7,17,31,0.24)),
105
105
  url("./assets/cover-background.jpg") center center / cover no-repeat;
106
106
  }
107
- .template-slide[data-design="summit"][data-template="agenda"] .slide-canvas {
107
+ .template-slide[data-template="agenda"] .slide-canvas {
108
108
  background:
109
109
  linear-gradient(90deg, rgba(7,17,31,0.86), rgba(7,17,31,0.58) 52%, rgba(7,17,31,0.32)),
110
110
  url("./assets/cover-background.jpg") center center / cover no-repeat;
111
111
  }
112
- .template-slide[data-design="summit"][data-template="section-divider"] .slide-canvas {
112
+ .template-slide[data-template="section-divider"] .slide-canvas {
113
113
  background:
114
114
  linear-gradient(90deg, rgba(7,17,31,0.86), rgba(16,26,43,0.62) 58%, rgba(36,58,115,0.36)),
115
115
  url("./assets/cover-background.jpg") center center / cover no-repeat;
116
116
  }
117
117
  .template-slide[data-template="closing"] .slide-canvas { background: linear-gradient(135deg, #07111f, #315eea 58%, #18a8d8); }
118
118
 
119
- .template-slide[data-design="summit"][data-template="closing"] .slide-canvas {
119
+ .template-slide[data-template="closing"] .slide-canvas {
120
120
  background:
121
121
  linear-gradient(90deg, rgba(7,17,31,0.82), rgba(49,94,234,0.42) 58%, rgba(24,168,216,0.24)),
122
122
  url("./assets/closing-background.jpg") center center / cover no-repeat;
@@ -162,10 +162,13 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
162
162
  .text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
163
163
  .text-panel-formula-caption { margin: 0; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
164
164
  .template-chart-takeaway-list { display: grid; gap: 22px; width: 100%; }
165
- .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid rgba(255,255,255,0.24); }
165
+ .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid var(--line); }
166
+ .template-text-panel--color .template-chart-takeaway-item { border-top-color: rgba(255,255,255,0.24); }
166
167
  .template-chart-takeaway-item:first-child { padding-top: 0; border-top: 0; }
167
- .template-chart-takeaway-item h3 { margin: 0; font-size: 25px; line-height: 1.24; color: white; }
168
- .template-chart-takeaway-item p { margin: 0; font-size: 20px; line-height: 1.46; color: rgba(255,255,255,0.78); }
168
+ .template-chart-takeaway-item h3 { margin: 0; font-size: 25px; line-height: 1.24; color: var(--text-primary); }
169
+ .template-text-panel--color .template-chart-takeaway-item h3 { color: white; }
170
+ .template-chart-takeaway-item p { margin: 0; font-size: 20px; line-height: 1.46; color: var(--text-secondary); }
171
+ .template-text-panel--color .template-chart-takeaway-item p { color: rgba(255,255,255,0.78); }
169
172
  .template-bar { flex: 1; background: linear-gradient(180deg, var(--accent-primary), var(--accent-cyan)); min-height: 80px; }
170
173
  .template-table-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 34px; height: 100%; align-items: stretch; }
171
174
  .template-table-layout .template-side-panel { grid-column: 1; grid-row: 1; }
@@ -223,6 +226,25 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
223
226
  .template-timeline--vertical .template-timeline-item:nth-child(even) .template-timeline-copy { grid-column: 3; text-align: left; align-self: center; }
224
227
  .template-steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: 22px; }
225
228
  .template-step-number { font-size: 48px; color: var(--accent-primary); font-weight: 800; margin-bottom: 30px; }
229
+ .template-team-grid { height: 100%; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; align-items: stretch; }
230
+ .template-team-card { min-width: 0; min-height: 0; display: grid; grid-template-rows: 330px minmax(0, 1fr); overflow: hidden; background: rgba(255,255,255,0.86); border: 1px solid var(--line); border-radius: var(--surface-radius); box-shadow: 0 18px 44px var(--shadow-soft); }
231
+ .template-team-photo { margin: 0; width: 100%; height: 100%; overflow: hidden; background: linear-gradient(135deg, var(--accent-soft), rgba(24,168,216,0.16)); display: grid; place-items: center; }
232
+ .template-team-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
233
+ .template-team-photo span { font-family: var(--font-display); font-size: 72px; line-height: 1; color: var(--accent-primary); font-weight: 800; }
234
+ .template-team-copy { min-height: 0; display: flex; flex-direction: column; gap: 12px; padding: 26px; }
235
+ .template-team-name { margin: 0; font-size: 30px; line-height: 1.18; color: var(--text-primary); padding-bottom: 3px; overflow: visible; }
236
+ .template-team-role { margin: 0; font-size: 15px; line-height: 1.35; letter-spacing: 0.1em; text-transform: uppercase; color: var(--accent-primary); font-weight: 800; }
237
+ .template-team-highlights { margin: 4px 0 0; padding: 0; list-style: none; display: grid; gap: 9px; }
238
+ .template-team-highlights li { position: relative; padding-left: 18px; font-size: 17px; line-height: 1.36; color: var(--text-secondary); }
239
+ .template-team-highlights li::before { content: ""; position: absolute; left: 0; top: 9px; width: 6px; height: 6px; background: var(--accent-primary); border-radius: 999px; }
240
+ .template-team-education { margin: auto 0 0; padding-top: 14px; border-top: 1px solid var(--line); font-size: 14px; line-height: 1.35; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); font-weight: 800; }
241
+ .template-free-stage { height: 100%; display: grid; grid-template-columns: minmax(0, 1fr); }
242
+ .template-free-placeholder { min-width: 0; min-height: 0; display: flex; flex-direction: column; justify-content: flex-end; gap: 16px; padding: 42px; border: 1px dashed var(--line-strong); border-radius: var(--surface-radius); background: linear-gradient(135deg, rgba(49,94,234,0.06), rgba(24,168,216,0.07)); overflow: hidden; }
243
+ .template-free-placeholder-label { align-self: flex-start; font-size: 13px; line-height: 1; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent-primary); font-weight: 800; }
244
+ .template-free-placeholder h2 { margin: 0; font-size: 38px; line-height: 1.18; color: var(--text-primary); padding-bottom: 4px; overflow: visible; }
245
+ .template-free-placeholder p { margin: 0; max-width: 980px; font-size: 23px; line-height: 1.42; color: var(--text-secondary); }
246
+ .template-free-placeholder-hints { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 6px; }
247
+ .template-free-placeholder-hint { display: inline-flex; align-items: center; min-height: 32px; padding: 7px 12px; border: 1px solid var(--line); border-radius: 999px; font-size: 13px; line-height: 1; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); font-weight: 800; background: rgba(255,255,255,0.58); }
226
248
  .template-image-card { width: 100%; margin: 18px 0 0; display: grid; gap: 8px; }
227
249
  .template-image-frame { width: 100%; height: 128px; border-radius: var(--surface-radius); overflow: hidden; background: var(--surface-tint, #f1f6fc); border: 1px solid var(--line); }
228
250
  .template-image-frame img { display: block; width: 100%; height: 100%; object-fit: cover; }
@@ -302,6 +324,20 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
302
324
  .template-frame--catalog .template-timeline-copy p:last-child { font-size: 15px; line-height: 1.24; }
303
325
  .template-frame--catalog .template-steps { gap: 16px; }
304
326
  .template-frame--catalog .template-step-number { font-size: 40px; margin-bottom: 20px; }
327
+ .template-frame--catalog .template-team-grid { gap: 16px; }
328
+ .template-frame--catalog .template-team-card { grid-template-rows: 230px minmax(0, 1fr); }
329
+ .template-frame--catalog .template-team-copy { padding: 18px; gap: 8px; }
330
+ .template-frame--catalog .template-team-name { font-size: 22px; line-height: 1.14; }
331
+ .template-frame--catalog .template-team-role { font-size: 11px; line-height: 1.25; }
332
+ .template-frame--catalog .template-team-highlights { gap: 6px; }
333
+ .template-frame--catalog .template-team-highlights li { font-size: 13px; line-height: 1.25; padding-left: 14px; }
334
+ .template-frame--catalog .template-team-highlights li::before { top: 7px; width: 5px; height: 5px; }
335
+ .template-frame--catalog .template-team-education { font-size: 10px; line-height: 1.25; padding-top: 9px; }
336
+ .template-frame--catalog .template-free-placeholder { padding: 28px; gap: 10px; }
337
+ .template-frame--catalog .template-free-placeholder-label { font-size: 10px; }
338
+ .template-frame--catalog .template-free-placeholder h2 { font-size: 28px; line-height: 1.16; }
339
+ .template-frame--catalog .template-free-placeholder p { font-size: 17px; line-height: 1.3; }
340
+ .template-frame--catalog .template-free-placeholder-hint { min-height: 26px; padding: 6px 9px; font-size: 10px; }
305
341
  .template-frame--catalog .template-image-frame { height: 86px; }
306
342
  .template-frame--catalog .template-image-caption { font-size: 11px; }
307
343
  .template-frame--catalog .template-visual-placeholder-frame { height: 110px; }
@@ -345,14 +381,42 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
345
381
  .template-timeline-layout .template-text-panel--color {
346
382
  background: linear-gradient(135deg, #176c63 0%, #2a8f84 54%, #b0822e 125%);
347
383
  }
348
- .template-slide[data-design="summit"][data-template="cover"] .slide-canvas,
349
- .template-slide[data-design="summit"][data-template="agenda"] .slide-canvas,
350
- .template-slide[data-design="summit"][data-template="section-divider"] .slide-canvas {
384
+ .template-team-card {
385
+ background: rgba(255,255,255,0.9);
386
+ border-color: transparent;
387
+ box-shadow: 0 24px 58px rgba(18, 37, 34, 0.11);
388
+ }
389
+ .template-team-photo {
390
+ background: linear-gradient(135deg, rgba(23,108,99,0.16), rgba(176,130,46,0.16));
391
+ }
392
+ .template-team-photo img { filter: saturate(0.92) contrast(1.04); }
393
+ .template-team-name { font-family: var(--font-display); font-weight: 600; }
394
+ .template-team-role,
395
+ .template-team-education,
396
+ .template-free-placeholder-label,
397
+ .template-free-placeholder-hint {
398
+ font-family: var(--font-body);
399
+ }
400
+ .template-team-role,
401
+ .template-team-highlights li::before,
402
+ .template-free-placeholder-label {
403
+ color: var(--accent-primary);
404
+ }
405
+ .template-free-placeholder {
406
+ background:
407
+ linear-gradient(135deg, rgba(10,16,16,0.08), rgba(23,108,99,0.09)),
408
+ rgba(255,255,255,0.68);
409
+ border-color: rgba(35, 53, 49, 0.22);
410
+ box-shadow: none;
411
+ }
412
+ .template-slide[data-template="cover"] .slide-canvas,
413
+ .template-slide[data-template="agenda"] .slide-canvas,
414
+ .template-slide[data-template="section-divider"] .slide-canvas {
351
415
  background:
352
416
  linear-gradient(90deg, rgba(10,16,16,0.84), rgba(10,16,16,0.46) 52%, rgba(10,16,16,0.18)),
353
417
  url("./assets/cover-background.jpg") center center / cover no-repeat;
354
418
  }
355
- .template-slide[data-design="summit"][data-template="closing"] .slide-canvas {
419
+ .template-slide[data-template="closing"] .slide-canvas {
356
420
  background:
357
421
  linear-gradient(90deg, rgba(10,16,16,0.78), rgba(23,108,99,0.4) 58%, rgba(176,130,46,0.22)),
358
422
  url("./assets/closing-background.jpg") center center / cover no-repeat;
@@ -1,5 +1,5 @@
1
1
  import { existsSync, mkdirSync, writeFileSync } from "fs"
2
- import { dirname, isAbsolute, normalize, resolve } from "path"
2
+ import { basename, dirname, isAbsolute, normalize, resolve } from "path"
3
3
  import { activeDesign, getDesignSection, materializeDesignCssSnapshot } from "../design/designs"
4
4
 
5
5
  export type DeckFoundationMode = "create" | "repair"
@@ -48,7 +48,12 @@ export function createDeckFoundation(input: CreateDeckFoundationInput): CreateDe
48
48
  const foundation = getDesignSection("foundation", design)
49
49
  const parts = parseFoundationParts(foundation)
50
50
  if (parts.scriptBlocks.length === 0) throw new Error(`Design '${design}' foundation does not include a SlidePresentation JavaScript code block.`)
51
- const snapshot = materializeDesignCssSnapshot({ workspaceRoot: input.workspaceRoot, outputPath, designName: design })
51
+ const snapshot = materializeDesignCssSnapshot({
52
+ workspaceRoot: input.workspaceRoot,
53
+ outputPath,
54
+ designName: design,
55
+ snapshotName: activeDesignSnapshotName(outputPath),
56
+ })
52
57
 
53
58
  const html = renderFoundationHtml({
54
59
  language: input.language || "en",
@@ -69,6 +74,7 @@ export function createDeckFoundation(input: CreateDeckFoundationInput): CreateDe
69
74
  "design:foundation",
70
75
  parts.fontLinks.length > 0 ? "foundation:font-links" : "foundation:font-links:none",
71
76
  snapshot.generatedFallback ? "design-css:fallback" : "design-css:snapshot",
77
+ `design-css:active-snapshot:${snapshot.snapshotName}`,
72
78
  snapshot.assetCount > 0 ? "design-assets:snapshot" : "design-assets:none",
73
79
  "foundation:SlidePresentation",
74
80
  ],
@@ -81,6 +87,14 @@ export function createDeckFoundation(input: CreateDeckFoundationInput): CreateDe
81
87
  }
82
88
  }
83
89
 
90
+ export function activeDesignSnapshotName(outputPath: string): string {
91
+ const stem = basename(normalizeOutputPath(outputPath), ".html")
92
+ .toLowerCase()
93
+ .replace(/[^a-z0-9-]+/g, "-")
94
+ .replace(/^-+|-+$/g, "")
95
+ return `${stem || "deck"}-active`
96
+ }
97
+
84
98
  export function normalizeOutputPath(outputPath: string): string {
85
99
  const trimmed = outputPath.trim()
86
100
  if (!trimmed) throw new Error("outputPath is required")
@@ -180,6 +180,7 @@ export interface MaterializeDesignPreviewResult {
180
180
  export interface DesignCssSnapshotResult {
181
181
  ok: true
182
182
  design: string
183
+ snapshotName: string
183
184
  sourcePath: string
184
185
  snapshotDir: string
185
186
  cssPath: string
@@ -425,11 +426,13 @@ export function materializeDesignCssSnapshot(input: {
425
426
  workspaceRoot: string
426
427
  outputPath: string
427
428
  designName?: string
429
+ snapshotName?: string
428
430
  }): DesignCssSnapshotResult {
429
431
  const designName = normalizeDesignName(input.designName || activeDesign())
432
+ const snapshotName = normalizeDesignSnapshotName(input.snapshotName || designName)
430
433
  const designDir = resolveDesignPackageDir(designName)
431
434
  const outputDir = dirname(normalize(input.outputPath))
432
- const snapshotRelDir = normalize(join(outputDir, "_revela-design", designName)).replace(/\\/g, "/")
435
+ const snapshotRelDir = normalize(join(outputDir, "_revela-design", snapshotName)).replace(/\\/g, "/")
433
436
  const snapshotDir = resolve(input.workspaceRoot, snapshotRelDir)
434
437
  const cssPath = join(snapshotDir, "design.css")
435
438
  const cssRead = readDesignCss(designName)
@@ -450,6 +453,7 @@ export function materializeDesignCssSnapshot(input: {
450
453
  return {
451
454
  ok: true,
452
455
  design: designName,
456
+ snapshotName,
453
457
  sourcePath: cssRead.path || join(designDir, "DESIGN.md"),
454
458
  snapshotDir,
455
459
  cssPath,
@@ -460,6 +464,14 @@ export function materializeDesignCssSnapshot(input: {
460
464
  }
461
465
  }
462
466
 
467
+ function normalizeDesignSnapshotName(name: string): string {
468
+ const normalized = name.trim().toLowerCase()
469
+ if (!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(normalized)) {
470
+ throw new Error("Design snapshot name must be kebab-case using lowercase letters, numbers, and hyphens")
471
+ }
472
+ return normalized
473
+ }
474
+
463
475
  /** Normalize and validate a design package name. */
464
476
  export function normalizeDesignName(name: string): string {
465
477
  const normalized = name.trim().toLowerCase()