@cyber-dash-tech/revela 0.18.16 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -31
- package/README.zh-CN.md +45 -31
- package/assets/img/lucent-01.jpg +0 -0
- package/assets/img/lucent-02.jpg +0 -0
- package/assets/img/lucent-03.jpg +0 -0
- package/assets/img/lucent-dark-01.jpg +0 -0
- package/assets/img/lucent-dark-02.jpg +0 -0
- package/assets/img/lucent-dark-03.jpg +0 -0
- package/assets/img/monet-01.jpg +0 -0
- package/assets/img/monet-02.jpg +0 -0
- package/assets/img/monet-03.jpg +0 -0
- package/assets/img/starter-01.jpg +0 -0
- package/assets/img/starter-02.jpg +0 -0
- package/assets/img/starter-03.jpg +0 -0
- package/assets/img/summit-01.jpg +0 -0
- package/assets/img/summit-02.jpg +0 -0
- package/assets/img/summit-03.jpg +0 -0
- package/designs/lucent/DESIGN.md +76 -0
- package/designs/lucent/design.css +283 -0
- package/designs/lucent-dark/DESIGN.md +278 -0
- package/designs/lucent-dark/assets/card-lens.jpg +0 -0
- package/designs/lucent-dark/assets/closing-background.jpg +0 -0
- package/designs/lucent-dark/assets/cover-background.jpg +0 -0
- package/designs/lucent-dark/assets/report-visual.jpg +0 -0
- package/designs/lucent-dark/assets/soft-texture.jpg +0 -0
- package/designs/lucent-dark/assets/toc-orb.png +0 -0
- package/designs/lucent-dark/design.css +417 -0
- package/designs/monet/DESIGN.md +14 -0
- package/designs/monet/assets/card-lens.jpg +0 -0
- package/designs/monet/assets/closing-background.jpg +0 -0
- package/designs/monet/assets/cover-background.jpg +0 -0
- package/designs/monet/assets/report-visual.jpg +0 -0
- package/designs/monet/assets/soft-texture.jpg +0 -0
- package/designs/monet/assets/toc-orb.png +0 -0
- package/designs/monet/design.css +340 -0
- package/designs/starter/DESIGN.md +14 -0
- package/designs/starter/assets/card-lens.jpg +0 -0
- package/designs/starter/assets/closing-background.jpg +0 -0
- package/designs/starter/assets/cover-background.jpg +0 -0
- package/designs/starter/assets/report-visual.jpg +0 -0
- package/designs/starter/assets/soft-texture.jpg +0 -0
- package/designs/starter/assets/toc-orb.png +0 -0
- package/designs/starter/design.css +322 -0
- package/designs/summit/DESIGN.md +18 -0
- package/designs/summit/assets/card-lens.jpg +0 -0
- package/designs/summit/assets/closing-background.jpg +0 -0
- package/designs/summit/assets/cover-background.jpg +0 -0
- package/designs/summit/assets/report-visual.jpg +0 -0
- package/designs/summit/assets/soft-texture.jpg +0 -0
- package/designs/summit/assets/toc-orb.png +0 -0
- package/designs/summit/design.css +334 -0
- package/lib/commands/designs-new.ts +13 -25
- package/lib/commands/designs-preview.ts +3 -8
- package/lib/deck-html/foundation.ts +8 -8
- package/lib/design/designs.ts +317 -14
- package/lib/narrative-state/deck-plan-artifact.ts +40 -3
- package/lib/page-templates/built-in-preview.html +373 -0
- package/lib/page-templates/contracts.ts +2 -0
- package/lib/page-templates/css.ts +2 -0
- package/lib/page-templates/foundation.ts +41 -0
- package/lib/page-templates/index.ts +6 -0
- package/lib/page-templates/registry.ts +3 -0
- package/lib/page-templates/render.ts +1202 -0
- package/lib/page-templates/templates/agenda.ts +4 -0
- package/lib/page-templates/templates/chart-takeaways.ts +4 -0
- package/lib/page-templates/templates/claim-supporting-visual.ts +4 -0
- package/lib/page-templates/templates/closing.ts +4 -0
- package/lib/page-templates/templates/cover.ts +4 -0
- package/lib/page-templates/templates/executive-summary.ts +4 -0
- package/lib/page-templates/templates/index.ts +19 -0
- package/lib/page-templates/templates/key-message-evidence.ts +4 -0
- package/lib/page-templates/templates/metric-highlight.ts +4 -0
- package/lib/page-templates/templates/problem-context.ts +4 -0
- package/lib/page-templates/templates/process-steps.ts +4 -0
- package/lib/page-templates/templates/recommendation-decision.ts +4 -0
- package/lib/page-templates/templates/risks-tradeoffs.ts +4 -0
- package/lib/page-templates/templates/section-divider.ts +4 -0
- package/lib/page-templates/templates/shared.ts +11 -0
- package/lib/page-templates/templates/table-comparison.ts +4 -0
- package/lib/page-templates/templates/timeline-roadmap.ts +4 -0
- package/lib/page-templates/vocabulary.ts +158 -0
- package/lib/prompt-builder.ts +5 -5
- package/lib/qa/artifact.ts +66 -1
- package/lib/qa/compliance.ts +5 -1
- package/lib/runtime/index.ts +99 -3
- package/package.json +7 -15
- package/plugins/revela/.codex-plugin/plugin.json +1 -1
- package/plugins/revela/hooks/revela_guard.ts +35 -0
- package/plugins/revela/hooks/revela_post_write_notice.ts +4 -4
- package/plugins/revela/mcp/revela-server.ts +104 -6
- package/plugins/revela/skills/revela/SKILL.md +1 -1
- package/plugins/revela/skills/revela-design/SKILL.md +22 -16
- package/plugins/revela/skills/revela-helper/SKILL.md +1 -1
- package/plugins/revela/skills/revela-make-deck/SKILL.md +25 -16
- package/designs/lucent/preview.html +0 -529
- package/designs/monet/preview.html +0 -190
- package/designs/starter/preview.html +0 -335
- package/designs/summit/preview.html +0 -186
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/* Lucent design CSS. Template HTML owns structure; this file owns visual treatment. */
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--bg-frame: #07111f;
|
|
5
|
+
--bg-page: #f7f9fc;
|
|
6
|
+
--bg-page-alt: #eef3f9;
|
|
7
|
+
--surface: #ffffff;
|
|
8
|
+
--surface-tint: #f1f6fc;
|
|
9
|
+
--surface-blue: #e7f0fb;
|
|
10
|
+
--text-primary: #101a2b;
|
|
11
|
+
--text-secondary: #42526a;
|
|
12
|
+
--text-muted: #7b8aa0;
|
|
13
|
+
--line: rgba(44, 70, 108, 0.14);
|
|
14
|
+
--line-strong: rgba(44, 70, 108, 0.28);
|
|
15
|
+
--accent-primary: #315eea;
|
|
16
|
+
--accent-secondary: #6e5df6;
|
|
17
|
+
--accent-cyan: #18a8d8;
|
|
18
|
+
--accent-coral: #f06370;
|
|
19
|
+
--accent-soft: #dbe8ff;
|
|
20
|
+
--shadow-soft: rgba(30, 65, 130, 0.13);
|
|
21
|
+
--font-display: DengXian, "Microsoft YaHei", "PingFang SC", Arial, ui-sans-serif, sans-serif;
|
|
22
|
+
--font-body: DengXian, "Microsoft YaHei", "PingFang SC", Arial, ui-sans-serif, sans-serif;
|
|
23
|
+
--grid-margin-x: 72px;
|
|
24
|
+
--grid-margin-y: 56px;
|
|
25
|
+
--grid-columns: 12;
|
|
26
|
+
--grid-gutter: 24px;
|
|
27
|
+
--grid-safe-top: 56px;
|
|
28
|
+
--grid-safe-bottom: 64px;
|
|
29
|
+
--space-1: 8px;
|
|
30
|
+
--space-2: 16px;
|
|
31
|
+
--space-3: 24px;
|
|
32
|
+
--space-4: 32px;
|
|
33
|
+
--space-5: 48px;
|
|
34
|
+
--space-6: 72px;
|
|
35
|
+
--font-size-caption: 16px;
|
|
36
|
+
--font-size-body: 22px;
|
|
37
|
+
--font-size-body-small: 18px;
|
|
38
|
+
--font-size-h3: 31px;
|
|
39
|
+
--font-size-h2: 52px;
|
|
40
|
+
--font-size-hero: 104px;
|
|
41
|
+
--surface-radius: 8px;
|
|
42
|
+
--surface-radius-large: 12px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
* { box-sizing: border-box; }
|
|
46
|
+
html { scroll-snap-type: y mandatory; overflow-y: scroll; height: 100%; }
|
|
47
|
+
body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primary, #101a2b); font-family: var(--font-body, Arial, sans-serif); -webkit-font-smoothing: antialiased; }
|
|
48
|
+
.slide { min-height: 100dvh; scroll-snap-align: start; display: flex; align-items: center; justify-content: center; overflow: hidden; background: var(--bg-frame, #07111f); }
|
|
49
|
+
.slide-canvas { width: 1920px; height: 1080px; flex-shrink: 0; transform-origin: center center; position: relative; overflow: hidden; }
|
|
50
|
+
.template-slide .slide-canvas {
|
|
51
|
+
background:
|
|
52
|
+
radial-gradient(circle at 82% 16%, rgba(49, 94, 234, 0.11), transparent 29%),
|
|
53
|
+
linear-gradient(135deg, var(--bg-page), var(--bg-page-alt));
|
|
54
|
+
color: var(--text-primary);
|
|
55
|
+
padding: 72px;
|
|
56
|
+
box-sizing: border-box;
|
|
57
|
+
}
|
|
58
|
+
.template-frame { width: 100%; height: 100%; display: flex; flex-direction: column; gap: 34px; }
|
|
59
|
+
.template-frame--catalog { gap: 26px; }
|
|
60
|
+
.template-eyebrow { margin: 0 0 14px; font-size: 16px; text-transform: uppercase; letter-spacing: 0.18em; color: var(--text-muted); font-weight: 700; }
|
|
61
|
+
.template-frame header { flex: 0 0 auto; padding-bottom: 8px; overflow: visible; }
|
|
62
|
+
.template-title { margin: 0; max-width: 1320px; font-family: var(--font-display); font-size: 62px; line-height: 1.22; color: var(--text-primary); padding-bottom: 6px; overflow: visible; }
|
|
63
|
+
.template-body { flex: 1; min-height: 0; }
|
|
64
|
+
.template-grid { display: grid; gap: 24px; height: 100%; }
|
|
65
|
+
.template-grid.cols-2 { grid-template-columns: 0.95fr 1.05fr; }
|
|
66
|
+
.template-grid.cols-3 { grid-template-columns: repeat(3, 1fr); }
|
|
67
|
+
.template-grid.cols-4 { grid-template-columns: repeat(4, 1fr); }
|
|
68
|
+
.template-chart-layout { grid-template-columns: 2fr 1fr; }
|
|
69
|
+
.template-card { background: rgba(255,255,255,0.82); border: 1px solid var(--line); border-radius: var(--surface-radius); padding: 28px; box-shadow: 0 18px 44px var(--shadow-soft); }
|
|
70
|
+
.template-card h2, .template-card h3 { margin: 0 0 12px; font-size: 28px; line-height: 1.32; padding-bottom: 4px; overflow: visible; }
|
|
71
|
+
.template-card p { margin: 10px 0; font-size: 21px; line-height: 1.42; color: var(--text-secondary); }
|
|
72
|
+
.template-key-message-panel { display: flex; flex-direction: column; justify-content: flex-start; gap: 24px; padding: 0; background: transparent; border-radius: 0; box-shadow: none; }
|
|
73
|
+
.template-key-message-kicker { margin: 0; max-width: 720px; font-size: 32px; line-height: 1.24; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent-primary); font-weight: 800; padding-bottom: 6px; overflow: visible; }
|
|
74
|
+
.template-key-message-panel p { margin: 0; max-width: 760px; font-size: 25px; line-height: 1.5; color: var(--text-secondary); }
|
|
75
|
+
.template-evidence-grid { display: grid; gap: 24px; min-height: 0; }
|
|
76
|
+
.template-evidence-card { min-height: 0; }
|
|
77
|
+
.template-claim-text-panel { min-height: 0; display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; gap: 18px; padding: 0; background: transparent; border: 0; border-radius: 0; box-shadow: none; }
|
|
78
|
+
.template-claim-text-title { margin: 0; max-width: 760px; font-size: 31px; line-height: 1.26; color: var(--text-primary); padding-bottom: 4px; overflow: visible; }
|
|
79
|
+
.template-claim-text-body { margin: 0; max-width: 760px; font-size: 22px; line-height: 1.48; color: var(--text-secondary); }
|
|
80
|
+
.template-claim-text-panel .template-list { margin-top: 4px; }
|
|
81
|
+
.template-list { display: grid; gap: 18px; margin: 0; padding: 0; list-style: none; }
|
|
82
|
+
.template-list li { position: relative; padding-left: 24px; font-size: 24px; line-height: 1.38; color: var(--text-secondary); }
|
|
83
|
+
.template-list li::before { content: ""; position: absolute; left: 0; top: 14px; width: 7px; height: 7px; background: var(--accent-primary); }
|
|
84
|
+
.template-hero { margin: 0; max-width: none; justify-content: center; align-items: flex-start; }
|
|
85
|
+
.template-hero > [data-template-slot="hero"] { width: 100%; }
|
|
86
|
+
.template-hero header { padding-bottom: 0; }
|
|
87
|
+
.template-hero-title { font-size: 120px; line-height: 1.18; color: white; font-weight: 800; opacity: 0.8; padding: 12px 0 20px; max-width: 1320px; }
|
|
88
|
+
.template-hero .template-eyebrow { color: rgba(255,255,255,0.78); }
|
|
89
|
+
.template-hero--cover, .template-hero--section-divider { justify-content: center; align-items: flex-start; }
|
|
90
|
+
.template-hero--closing { justify-content: flex-end; align-items: flex-end; }
|
|
91
|
+
.template-hero--closing > [data-template-slot="hero"] { display: flex; justify-content: flex-end; text-align: right; }
|
|
92
|
+
.template-hero--closing .template-hero-title { max-width: 1120px; }
|
|
93
|
+
.template-slide[data-template="agenda"] .template-frame { display: grid; grid-template-rows: 1fr auto; gap: 28px; }
|
|
94
|
+
.template-slide[data-template="cover"] .slide-canvas,
|
|
95
|
+
.template-slide[data-template="section-divider"] .slide-canvas,
|
|
96
|
+
.template-slide[data-template="closing"] .slide-canvas {
|
|
97
|
+
background:
|
|
98
|
+
radial-gradient(circle at 80% 14%, rgba(24,168,216,0.32), transparent 28%),
|
|
99
|
+
linear-gradient(135deg, #07111f, #101a2b 62%, #243a73);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.template-slide[data-design="lucent"][data-template="cover"] .slide-canvas {
|
|
103
|
+
background:
|
|
104
|
+
linear-gradient(90deg, rgba(7,17,31,0.82), rgba(7,17,31,0.42) 52%, rgba(7,17,31,0.24)),
|
|
105
|
+
url("./assets/cover-background.jpg") center center / cover no-repeat;
|
|
106
|
+
}
|
|
107
|
+
.template-slide[data-design="lucent"][data-template="agenda"] .slide-canvas {
|
|
108
|
+
background:
|
|
109
|
+
linear-gradient(90deg, rgba(7,17,31,0.86), rgba(7,17,31,0.58) 52%, rgba(7,17,31,0.32)),
|
|
110
|
+
url("./assets/cover-background.jpg") center center / cover no-repeat;
|
|
111
|
+
}
|
|
112
|
+
.template-slide[data-design="lucent"][data-template="section-divider"] .slide-canvas {
|
|
113
|
+
background:
|
|
114
|
+
linear-gradient(90deg, rgba(7,17,31,0.86), rgba(16,26,43,0.62) 58%, rgba(36,58,115,0.36)),
|
|
115
|
+
url("./assets/cover-background.jpg") center center / cover no-repeat;
|
|
116
|
+
}
|
|
117
|
+
.template-slide[data-template="closing"] .slide-canvas { background: linear-gradient(135deg, #07111f, #315eea 58%, #18a8d8); }
|
|
118
|
+
|
|
119
|
+
.template-slide[data-design="lucent"][data-template="closing"] .slide-canvas {
|
|
120
|
+
background:
|
|
121
|
+
linear-gradient(90deg, rgba(7,17,31,0.82), rgba(49,94,234,0.42) 58%, rgba(24,168,216,0.24)),
|
|
122
|
+
url("./assets/closing-background.jpg") center center / cover no-repeat;
|
|
123
|
+
}
|
|
124
|
+
.template-agenda-panel { height: 100%; min-height: 0; display: flex; overflow: hidden; color: white; }
|
|
125
|
+
.template-agenda-inner { width: 100%; display: grid; grid-template-columns: 37% minmax(0, 1fr); align-items: stretch; gap: 76px; }
|
|
126
|
+
.template-agenda-header { display: flex; flex-direction: column; min-height: 0; padding: 10px 0 0; }
|
|
127
|
+
.template-agenda-header .template-eyebrow { color: rgba(255,255,255,0.64); }
|
|
128
|
+
.template-agenda-header .template-title { max-width: 440px; font-size: 54px; line-height: 1.16; letter-spacing: 0; text-transform: uppercase; color: white; padding-bottom: 8px; overflow: visible; }
|
|
129
|
+
.template-agenda-footer { margin: auto 0 0; font-size: 13px; line-height: 1.4; letter-spacing: 0.12em; text-transform: uppercase; font-weight: 800; color: rgba(255,255,255,0.84); }
|
|
130
|
+
.template-agenda-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; justify-content: center; gap: 40px; height: 100%; }
|
|
131
|
+
.template-agenda-item { display: grid; grid-template-columns: 86px minmax(0, 1fr); gap: 44px; align-items: center; min-height: 58px; overflow: visible; }
|
|
132
|
+
.template-agenda-item span { font-family: var(--font-display); font-size: 44px; line-height: 1; letter-spacing: 0.03em; color: var(--accent-cyan, #18a8d8); font-weight: 800; font-variant-numeric: tabular-nums; }
|
|
133
|
+
.template-agenda-item strong { font-size: 18px; line-height: 1.45; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 700; color: rgba(255,255,255,0.92); }
|
|
134
|
+
.template-metric-layout { height: 100%; min-height: 0; display: grid; gap: 26px; }
|
|
135
|
+
.template-metric-layout--insight-top { grid-template-rows: auto minmax(0, 1fr); }
|
|
136
|
+
.template-metric-layout--insight-bottom { grid-template-rows: minmax(0, 1fr) auto; }
|
|
137
|
+
.template-stat-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; align-items: stretch; }
|
|
138
|
+
.template-stat-value { display: block; min-height: 96px; font-size: 58px; line-height: 1.42; color: var(--accent-primary); font-weight: 800; margin-bottom: 18px; padding-bottom: 14px; overflow: visible; }
|
|
139
|
+
.template-chart-panel { min-height: 520px; display: grid; place-items: center; border: 1px solid var(--line); background: rgba(255,255,255,0.72); }
|
|
140
|
+
.template-chart-placeholder { width: 76%; height: 56%; border-left: 2px solid var(--line-strong); border-bottom: 2px solid var(--line-strong); display: flex; align-items: end; gap: 28px; padding: 0 28px 24px; }
|
|
141
|
+
.template-visual-slot-panel { width: 100%; min-height: 520px; border: 1px dashed var(--line-strong); border-radius: var(--surface-radius); background: linear-gradient(135deg, rgba(49,94,234,0.08), rgba(24,168,216,0.08)); display: grid; place-items: center; padding: 0; }
|
|
142
|
+
.template-visual-slot-label { font-size: 13px; line-height: 1.35; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); font-weight: 800; }
|
|
143
|
+
.template-text-panel.template-chart-takeaway-panel { gap: 28px; background: linear-gradient(135deg, #5f82c8 0%, var(--accent-primary) 58%, #18a8d8 115%); color: white; box-shadow: 0 22px 56px rgba(49,94,234,0.24); }
|
|
144
|
+
.template-chart-takeaway-panel .template-text-panel-title { color: white; }
|
|
145
|
+
.template-chart-takeaway-list { display: grid; gap: 22px; width: 100%; }
|
|
146
|
+
.template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid rgba(255,255,255,0.24); }
|
|
147
|
+
.template-chart-takeaway-item:first-child { padding-top: 0; border-top: 0; }
|
|
148
|
+
.template-chart-takeaway-item h3 { margin: 0; font-size: 25px; line-height: 1.24; color: white; }
|
|
149
|
+
.template-chart-takeaway-item p { margin: 0; font-size: 20px; line-height: 1.46; color: rgba(255,255,255,0.78); }
|
|
150
|
+
.template-bar { flex: 1; background: linear-gradient(180deg, var(--accent-primary), var(--accent-cyan)); min-height: 80px; }
|
|
151
|
+
.template-table-wrap { display: grid; grid-template-rows: minmax(0, auto) auto; gap: 22px; height: 100%; align-content: start; }
|
|
152
|
+
.template-table { width: 100%; border-collapse: collapse; background: rgba(255,255,255,0.86); box-shadow: 0 18px 44px var(--shadow-soft); }
|
|
153
|
+
.template-table th, .template-table td { padding: 22px 24px; border-bottom: 1px solid var(--line); text-align: left; font-size: 21px; }
|
|
154
|
+
.template-table th { color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.12em; font-size: 15px; }
|
|
155
|
+
.template-text-panel { min-height: 0; display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; gap: 20px; background: rgba(255,255,255,0.74); border-radius: var(--surface-radius); padding: 42px; }
|
|
156
|
+
.template-text-panel-title { margin: 0; font-size: 34px; line-height: 1.28; color: var(--text-primary); padding-bottom: 4px; overflow: visible; }
|
|
157
|
+
.template-text-panel-body { margin: 0; font-size: 23px; line-height: 1.52; color: var(--text-secondary); }
|
|
158
|
+
.template-side-panel { align-self: stretch; }
|
|
159
|
+
.template-side-panel-title { margin: 0; }
|
|
160
|
+
.template-side-panel-body { margin: 0; }
|
|
161
|
+
.template-insight-panel { display: grid; gap: 10px; background: rgba(255,255,255,0.88); border: 1px solid var(--line); border-radius: var(--surface-radius); padding: 22px 24px; box-shadow: 0 14px 34px var(--shadow-soft); }
|
|
162
|
+
.template-insight-title { margin: 0; display: flex; align-items: center; gap: 12px; font-size: 24px; line-height: 1.24; color: var(--text-primary); }
|
|
163
|
+
.template-insight-icon { width: 24px; height: 24px; color: var(--accent-primary); stroke-width: 2.2; flex: 0 0 auto; }
|
|
164
|
+
.template-insight-body { margin: 0; font-size: 20px; line-height: 1.42; color: var(--text-secondary); }
|
|
165
|
+
.template-metric-layout .template-insight-panel { border: 0; box-shadow: none; background: rgba(255,255,255,0.74); padding: 24px 28px; }
|
|
166
|
+
.template-metric-layout .template-insight-title { font-size: 18px; line-height: 1.22; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-muted); }
|
|
167
|
+
.template-metric-layout .template-insight-icon { width: 20px; height: 20px; }
|
|
168
|
+
.template-metric-layout .template-insight-body { font-size: 24px; line-height: 1.42; color: var(--text-primary); }
|
|
169
|
+
.template-timeline { position: relative; height: 100%; display: grid; align-items: center; }
|
|
170
|
+
.template-timeline-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 34px; height: 100%; align-items: stretch; }
|
|
171
|
+
.template-timeline-layout--left { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); }
|
|
172
|
+
.template-timeline-layout--left .template-side-panel { grid-column: 1; grid-row: 1; }
|
|
173
|
+
.template-timeline-layout--left .template-timeline { grid-column: 2; grid-row: 1; }
|
|
174
|
+
.template-timeline-layout--right { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); }
|
|
175
|
+
.template-timeline-layout--right .template-timeline { grid-column: 1; grid-row: 1; }
|
|
176
|
+
.template-timeline-layout--right .template-side-panel { grid-column: 2; grid-row: 1; }
|
|
177
|
+
.template-timeline-layout .template-text-panel { background: linear-gradient(135deg, #7a7fe8 0%, #5f82c8 58%, #315eea 115%); color: white; box-shadow: 0 22px 56px rgba(49,94,234,0.22); }
|
|
178
|
+
.template-timeline-layout .template-text-panel-title { color: white; }
|
|
179
|
+
.template-timeline-layout .template-text-panel-body { color: rgba(255,255,255,0.78); }
|
|
180
|
+
.template-timeline--horizontal { grid-template-columns: repeat(var(--timeline-count), 1fr); column-gap: 18px; align-items: stretch; --timeline-axis-y: 86%; }
|
|
181
|
+
.template-timeline--horizontal::before { content: ""; position: absolute; left: 4%; right: 4%; top: var(--timeline-axis-y); border-top: 2px solid var(--line-strong); transform: translateY(-1px); }
|
|
182
|
+
.template-timeline-item { position: relative; min-height: 400px; display: grid; justify-items: center; align-items: center; }
|
|
183
|
+
.template-timeline--horizontal .template-timeline-item { grid-template-rows: minmax(0, 1fr) 42px 86px; align-items: stretch; }
|
|
184
|
+
.template-timeline-dot { z-index: 2; width: 22px; height: 22px; border-radius: 999px; background: var(--accent-primary); box-shadow: 0 0 0 8px rgba(49,94,234,0.12); }
|
|
185
|
+
.template-timeline-copy { z-index: 2; width: 86%; padding: 18px 4px; background: transparent; border: 0; box-shadow: none; }
|
|
186
|
+
.template-timeline--horizontal .template-timeline-copy.template-card { width: 94%; height: calc(100% - 55px); min-height: 254px; align-self: end; justify-self: center; display: flex; flex-direction: column; justify-content: flex-start; padding: 28px 24px 24px; margin-bottom: 22px; }
|
|
187
|
+
.template-timeline--horizontal .template-timeline-item--highlight .template-timeline-copy.template-card { height: calc(100% - 22px); min-height: 254px; }
|
|
188
|
+
.template-timeline--horizontal .template-insight-icon { width: 28px; height: 28px; margin: 0 auto 28px; color: var(--accent-primary); stroke-width: 2; flex: 0 0 auto; }
|
|
189
|
+
.template-timeline--horizontal .template-timeline-item--highlight .template-insight-icon { color: #f37021; }
|
|
190
|
+
.template-timeline--horizontal .template-timeline-item--highlight .template-timeline-copy h3 { color: #f37021; }
|
|
191
|
+
.template-timeline--horizontal .template-timeline-dot { grid-row: 2; align-self: center; justify-self: center; }
|
|
192
|
+
.template-timeline--horizontal .template-timeline-date { grid-row: 3; align-self: start; justify-self: center; margin: 8px 0 0; font-size: 38px; line-height: 1; font-weight: 300; letter-spacing: 0.03em; color: var(--text-muted); }
|
|
193
|
+
.template-timeline-date { margin: 0 0 8px; font-size: 15px; text-transform: uppercase; letter-spacing: 0.14em; color: var(--accent-primary); font-weight: 800; }
|
|
194
|
+
.template-timeline-copy h3 { margin: 0 0 8px; font-size: 27px; line-height: 1.28; padding-bottom: 4px; overflow: visible; }
|
|
195
|
+
.template-timeline-copy p:last-child { margin: 0; font-size: 19px; color: var(--text-secondary); }
|
|
196
|
+
.template-timeline--vertical { grid-template-columns: 1fr; align-items: stretch; padding: 18px 0; }
|
|
197
|
+
.template-timeline--vertical::before { content: ""; position: absolute; top: 0; bottom: 0; left: 50%; border-left: 2px solid var(--line-strong); }
|
|
198
|
+
.template-timeline--vertical .template-timeline-item { min-height: 128px; grid-template-columns: 1fr 56px 1fr; justify-items: stretch; }
|
|
199
|
+
.template-timeline--vertical .template-timeline-dot { grid-column: 2; grid-row: 1; justify-self: center; align-self: center; }
|
|
200
|
+
.template-timeline--vertical .template-timeline-copy { grid-row: 1; width: auto; align-self: center; background: transparent; border: 0; box-shadow: none; }
|
|
201
|
+
.template-timeline--vertical .template-timeline-item:nth-child(odd) .template-timeline-copy { grid-column: 1; text-align: right; align-self: center; }
|
|
202
|
+
.template-timeline--vertical .template-timeline-item:nth-child(even) .template-timeline-copy { grid-column: 3; text-align: left; align-self: center; }
|
|
203
|
+
.template-steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: 22px; }
|
|
204
|
+
.template-step-number { font-size: 48px; color: var(--accent-primary); font-weight: 800; margin-bottom: 30px; }
|
|
205
|
+
.template-image-card { width: 100%; margin: 18px 0 0; display: grid; gap: 8px; }
|
|
206
|
+
.template-image-frame { width: 100%; height: 128px; border-radius: var(--surface-radius); overflow: hidden; background: var(--surface-tint, #f1f6fc); border: 1px solid var(--line); }
|
|
207
|
+
.template-image-frame img { display: block; width: 100%; height: 100%; object-fit: cover; }
|
|
208
|
+
.template-image-caption { margin: 0; font-size: 13px; line-height: 1.35; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.08em; }
|
|
209
|
+
.template-visual-placeholder { width: 100%; margin: 18px 0 0; display: grid; gap: 8px; }
|
|
210
|
+
.template-visual-placeholder-frame { width: 100%; height: 148px; border-radius: var(--surface-radius); border: 1px dashed var(--line-strong); background: linear-gradient(135deg, rgba(49,94,234,0.08), rgba(24,168,216,0.08)); display: grid; place-items: center; }
|
|
211
|
+
.template-visual-placeholder-label { font-size: 13px; line-height: 1.35; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); font-weight: 800; }
|
|
212
|
+
.template-page-number { position: absolute; right: 72px; bottom: 52px; font-size: 15px; color: var(--text-muted); letter-spacing: 0.18em; }
|
|
213
|
+
.template-catalog-panel { flex: 0 0 auto; margin-top: auto; background: rgba(255,255,255,0.9); border: 1px solid var(--line); border-radius: var(--surface-radius); box-shadow: 0 18px 44px var(--shadow-soft); padding: 16px 22px; color: var(--text-primary); }
|
|
214
|
+
.template-hero .template-catalog-panel { background: rgba(247,249,252,0.92); }
|
|
215
|
+
.template-catalog-kicker { margin: 0 0 4px; font-size: 12px; text-transform: uppercase; letter-spacing: 0.16em; color: var(--accent-primary); font-weight: 800; }
|
|
216
|
+
.template-catalog-title { margin: 0 0 10px; font-size: 20px; line-height: 1.28; font-weight: 800; }
|
|
217
|
+
.template-catalog-grid { display: grid; grid-template-columns: 1.15fr 1fr 1fr; gap: 16px; }
|
|
218
|
+
.template-catalog-section { min-width: 0; }
|
|
219
|
+
.template-catalog-section h3 { margin: 0 0 6px; font-size: 13px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--text-muted); }
|
|
220
|
+
.template-catalog-section p { margin: 0; font-size: 15px; line-height: 1.36; color: var(--text-secondary); }
|
|
221
|
+
.template-catalog-list { margin: 0; padding-left: 16px; display: grid; gap: 2px; }
|
|
222
|
+
.template-catalog-list li { font-size: 14px; line-height: 1.3; color: var(--text-secondary); }
|
|
223
|
+
.template-frame--catalog .template-title { font-size: 52px; line-height: 1.18; }
|
|
224
|
+
.template-slide[data-template="agenda"] .template-frame--catalog .template-title { font-size: 54px; line-height: 1.04; }
|
|
225
|
+
.template-frame--catalog .template-card { padding: 22px; }
|
|
226
|
+
.template-frame--catalog .template-card h2,
|
|
227
|
+
.template-frame--catalog .template-card h3 { font-size: 24px; line-height: 1.22; margin-bottom: 8px; }
|
|
228
|
+
.template-frame--catalog .template-card p { font-size: 18px; line-height: 1.32; }
|
|
229
|
+
.template-frame--catalog .template-key-message-panel { gap: 16px; }
|
|
230
|
+
.template-frame--catalog .template-key-message-kicker { font-size: 23px; line-height: 1.2; }
|
|
231
|
+
.template-frame--catalog .template-key-message-panel p { font-size: 19px; line-height: 1.42; }
|
|
232
|
+
.template-frame--catalog .template-claim-text-panel { gap: 12px; }
|
|
233
|
+
.template-frame--catalog .template-claim-text-title { font-size: 24px; line-height: 1.24; }
|
|
234
|
+
.template-frame--catalog .template-claim-text-body { font-size: 18px; line-height: 1.36; }
|
|
235
|
+
.template-frame--catalog .template-evidence-grid { gap: 18px; }
|
|
236
|
+
.template-frame--catalog .template-list { gap: 12px; }
|
|
237
|
+
.template-frame--catalog .template-list li { font-size: 20px; line-height: 1.28; }
|
|
238
|
+
.template-frame--catalog .template-metric-layout { gap: 18px; }
|
|
239
|
+
.template-frame--catalog .template-metric-layout .template-card { padding: 20px; }
|
|
240
|
+
.template-frame--catalog .template-metric-layout .template-stat-value { min-height: 70px; font-size: 48px; line-height: 1.24; margin-bottom: 10px; padding-bottom: 8px; }
|
|
241
|
+
.template-frame--catalog .template-metric-layout .template-insight-panel { padding: 18px 22px; gap: 7px; }
|
|
242
|
+
.template-frame--catalog .template-metric-layout .template-insight-title { font-size: 13px; line-height: 1.22; }
|
|
243
|
+
.template-frame--catalog .template-metric-layout .template-insight-icon { width: 16px; height: 16px; }
|
|
244
|
+
.template-frame--catalog .template-metric-layout .template-insight-body { font-size: 19px; line-height: 1.34; }
|
|
245
|
+
.template-frame--catalog .template-chart-panel { min-height: 360px; }
|
|
246
|
+
.template-frame--catalog .template-visual-slot-panel { min-height: 360px; }
|
|
247
|
+
.template-frame--catalog .template-visual-slot-label { font-size: 11px; }
|
|
248
|
+
.template-frame--catalog .template-chart-takeaway-panel { padding: 24px; gap: 16px; }
|
|
249
|
+
.template-frame--catalog .template-chart-takeaway-list { gap: 13px; }
|
|
250
|
+
.template-frame--catalog .template-chart-takeaway-item { gap: 4px; padding-top: 11px; }
|
|
251
|
+
.template-frame--catalog .template-chart-takeaway-item h3 { font-size: 19px; line-height: 1.2; }
|
|
252
|
+
.template-frame--catalog .template-chart-takeaway-item p { font-size: 15px; line-height: 1.3; }
|
|
253
|
+
.template-frame--catalog .template-table-wrap { gap: 16px; }
|
|
254
|
+
.template-frame--catalog .template-table th,
|
|
255
|
+
.template-frame--catalog .template-table td { padding: 14px 18px; font-size: 17px; line-height: 1.32; }
|
|
256
|
+
.template-frame--catalog .template-table th { font-size: 12px; }
|
|
257
|
+
.template-frame--catalog .template-insight-panel { padding: 16px 18px; gap: 6px; }
|
|
258
|
+
.template-frame--catalog .template-insight-title { font-size: 20px; line-height: 1.2; }
|
|
259
|
+
.template-frame--catalog .template-insight-icon { width: 20px; height: 20px; }
|
|
260
|
+
.template-frame--catalog .template-insight-body { font-size: 16px; line-height: 1.32; }
|
|
261
|
+
.template-frame--catalog .template-timeline--vertical { padding: 6px 0; }
|
|
262
|
+
.template-frame--catalog .template-timeline--vertical .template-timeline-item { min-height: 96px; }
|
|
263
|
+
.template-frame--catalog .template-timeline-layout { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 22px; }
|
|
264
|
+
.template-frame--catalog .template-timeline-layout--left { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); }
|
|
265
|
+
.template-frame--catalog .template-timeline-layout--right { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); }
|
|
266
|
+
.template-frame--catalog .template-timeline-layout .template-text-panel { padding: 22px; gap: 10px; }
|
|
267
|
+
.template-frame--catalog .template-timeline-layout .template-text-panel-title { font-size: 25px; line-height: 1.3; }
|
|
268
|
+
.template-frame--catalog .template-timeline-layout .template-text-panel-body { font-size: 18px; line-height: 1.4; }
|
|
269
|
+
.template-frame--catalog .template-timeline--horizontal .template-timeline-item { grid-template-rows: minmax(0, 1fr) 32px 58px; min-height: 330px; }
|
|
270
|
+
.template-frame--catalog .template-timeline--horizontal .template-timeline-copy.template-card { height: calc(100% - 51px); min-height: 178px; padding: 20px 18px 18px; margin-bottom: 18px; }
|
|
271
|
+
.template-frame--catalog .template-timeline--horizontal .template-timeline-item--highlight .template-timeline-copy.template-card { height: calc(100% - 18px); min-height: 178px; }
|
|
272
|
+
.template-frame--catalog .template-timeline--horizontal .template-insight-icon { width: 22px; height: 22px; margin-bottom: 18px; }
|
|
273
|
+
.template-frame--catalog .template-timeline--horizontal .template-timeline-date { font-size: 28px; }
|
|
274
|
+
.template-frame--catalog .template-timeline-copy { padding: 8px 4px; }
|
|
275
|
+
.template-frame--catalog .template-timeline-copy h3 { font-size: 21px; line-height: 1.18; margin-bottom: 4px; }
|
|
276
|
+
.template-frame--catalog .template-timeline-date { font-size: 12px; margin-bottom: 4px; }
|
|
277
|
+
.template-frame--catalog .template-timeline-copy p:last-child { font-size: 15px; line-height: 1.24; }
|
|
278
|
+
.template-frame--catalog .template-steps { gap: 16px; }
|
|
279
|
+
.template-frame--catalog .template-step-number { font-size: 40px; margin-bottom: 20px; }
|
|
280
|
+
.template-frame--catalog .template-image-frame { height: 86px; }
|
|
281
|
+
.template-frame--catalog .template-image-caption { font-size: 11px; }
|
|
282
|
+
.template-frame--catalog .template-visual-placeholder-frame { height: 110px; }
|
|
283
|
+
.template-frame--catalog .template-visual-placeholder-label { font-size: 11px; }
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lucent-dark
|
|
3
|
+
description: Dark luminous report design with midnight analytical pages, blue-violet gradients, and high-contrast data-forward layouts
|
|
4
|
+
author: cyber-dash
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
preview:
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Visual Style - Lucent Dark
|
|
10
|
+
|
|
11
|
+
Lucent Dark is a high-contrast executive report design for analytical and strategic decks. It uses midnight pages, restrained glass textures, crisp Chinese/English typography, and blue-violet-cyan accent gradients. The design is optimized for source-backed narrative, charts, Sankey flows, tables, recommendation cards, and polished cover/closing moments.
|
|
12
|
+
|
|
13
|
+
<!-- @design:foundation:start -->
|
|
14
|
+
|
|
15
|
+
### Foundation
|
|
16
|
+
|
|
17
|
+
Use a fixed `1920px` x `1080px` `.slide-canvas` inside a dark navy browser frame. Scale the canvas with JavaScript transform on viewport resize. Keep all dimensions fixed in pixels; do not use viewport-scaled typography.
|
|
18
|
+
|
|
19
|
+
```css
|
|
20
|
+
:root {
|
|
21
|
+
--bg-frame: #07111f;
|
|
22
|
+
--bg-page: #f7f9fc;
|
|
23
|
+
--bg-page-alt: #eef3f9;
|
|
24
|
+
--surface: #ffffff;
|
|
25
|
+
--surface-tint: #f1f6fc;
|
|
26
|
+
--surface-blue: #e7f0fb;
|
|
27
|
+
--text-primary: #101a2b;
|
|
28
|
+
--text-secondary: #42526a;
|
|
29
|
+
--text-muted: #7b8aa0;
|
|
30
|
+
--line: rgba(44, 70, 108, 0.14);
|
|
31
|
+
--line-strong: rgba(44, 70, 108, 0.28);
|
|
32
|
+
--accent-primary: #315eea;
|
|
33
|
+
--accent-secondary: #6e5df6;
|
|
34
|
+
--accent-cyan: #18a8d8;
|
|
35
|
+
--accent-coral: #f06370;
|
|
36
|
+
--accent-soft: #dbe8ff;
|
|
37
|
+
--shadow-soft: rgba(30, 65, 130, 0.13);
|
|
38
|
+
--font-display: DengXian, "Microsoft YaHei", "PingFang SC", Arial, ui-sans-serif, sans-serif;
|
|
39
|
+
--font-body: DengXian, "Microsoft YaHei", "PingFang SC", Arial, ui-sans-serif, sans-serif;
|
|
40
|
+
--grid-margin-x: 72px;
|
|
41
|
+
--grid-margin-y: 56px;
|
|
42
|
+
--grid-columns: 12;
|
|
43
|
+
--grid-gutter: 24px;
|
|
44
|
+
--grid-safe-top: 56px;
|
|
45
|
+
--grid-safe-bottom: 64px;
|
|
46
|
+
--space-1: 8px;
|
|
47
|
+
--space-2: 16px;
|
|
48
|
+
--space-3: 24px;
|
|
49
|
+
--space-4: 32px;
|
|
50
|
+
--space-5: 48px;
|
|
51
|
+
--space-6: 72px;
|
|
52
|
+
--font-size-caption: 16px;
|
|
53
|
+
--font-size-body: 22px;
|
|
54
|
+
--font-size-body-small: 18px;
|
|
55
|
+
--font-size-h3: 31px;
|
|
56
|
+
--font-size-h2: 52px;
|
|
57
|
+
--font-size-hero: 104px;
|
|
58
|
+
--surface-radius: 8px;
|
|
59
|
+
--surface-radius-large: 12px;
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Design contract:
|
|
64
|
+
- Grid: content slides use a 12-column mental grid inside `--grid-margin-x` / `--grid-margin-y`; layout slots should align to declared grid rails or documented column ratios.
|
|
65
|
+
- Safe area: titles, body slots, source notes, page numbers, and logos stay inside the safe area unless a `hero` layout owns a full-bleed image.
|
|
66
|
+
- Spacing: use the `--space-*` scale and keep dense report pages on an 8px rhythm; do not hand-tune every card with unrelated gaps.
|
|
67
|
+
- Type scale: use the declared fixed-pixel type tokens for the 1920x1080 canvas; do not use `clamp()`, viewport units, or negative tracking.
|
|
68
|
+
- Surfaces: cards and panels use `--surface`, `--line`, `--shadow-soft`, and radius tokens; avoid new one-off glass/orb treatments outside Lucent's supplied assets.
|
|
69
|
+
- Chart tokens: ECharts use `--accent-primary`, `--accent-secondary`, `--accent-cyan`, `--accent-coral`, transparent backgrounds, muted axes, and explicit container heights.
|
|
70
|
+
|
|
71
|
+
Asset policy:
|
|
72
|
+
- Use `assets/cover-background.jpg` and `assets/closing-background.jpg` for full-bleed hero backgrounds.
|
|
73
|
+
- Use `assets/toc-orb.png` only when transparency is needed for the Lucent glass orb.
|
|
74
|
+
- Use `assets/soft-texture.jpg`, `assets/card-lens.jpg`, and `assets/report-visual.jpg` as subtle report accents; never inline base64 images in generated decks.
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
class SlidePresentation {
|
|
78
|
+
constructor() {
|
|
79
|
+
this.slides = document.querySelectorAll('.slide');
|
|
80
|
+
this.currentSlide = 0;
|
|
81
|
+
this.setupScaling();
|
|
82
|
+
this.setupIntersectionObserver();
|
|
83
|
+
this.setupKeyboardNav();
|
|
84
|
+
this.setupTouchNav();
|
|
85
|
+
this.setupMouseWheel();
|
|
86
|
+
}
|
|
87
|
+
setupScaling() {
|
|
88
|
+
const canvases = document.querySelectorAll('.slide-canvas');
|
|
89
|
+
const BASE_W = 1920;
|
|
90
|
+
const BASE_H = 1080;
|
|
91
|
+
const update = () => {
|
|
92
|
+
const scale = Math.min(window.innerWidth / BASE_W, window.innerHeight / BASE_H);
|
|
93
|
+
canvases.forEach((canvas) => { canvas.style.transform = `scale(${scale})`; });
|
|
94
|
+
};
|
|
95
|
+
window.addEventListener('resize', update);
|
|
96
|
+
update();
|
|
97
|
+
}
|
|
98
|
+
setupIntersectionObserver() {
|
|
99
|
+
const observer = new IntersectionObserver((entries) => {
|
|
100
|
+
entries.forEach((entry) => {
|
|
101
|
+
if (entry.isIntersecting) entry.target.querySelectorAll('.reveal').forEach((el) => el.classList.add('visible'));
|
|
102
|
+
});
|
|
103
|
+
}, { threshold: 0.2 });
|
|
104
|
+
this.slides.forEach((slide) => observer.observe(slide));
|
|
105
|
+
}
|
|
106
|
+
setupKeyboardNav() {
|
|
107
|
+
document.addEventListener('keydown', (event) => {
|
|
108
|
+
if (['ArrowDown', 'ArrowRight', ' ', 'PageDown'].includes(event.key)) { event.preventDefault(); this.goTo(this.currentSlide + 1); }
|
|
109
|
+
else if (['ArrowUp', 'ArrowLeft', 'PageUp'].includes(event.key)) { event.preventDefault(); this.goTo(this.currentSlide - 1); }
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
setupTouchNav() {
|
|
113
|
+
let startY = 0;
|
|
114
|
+
document.addEventListener('touchstart', (event) => { startY = event.touches[0].clientY; }, { passive: true });
|
|
115
|
+
document.addEventListener('touchend', (event) => {
|
|
116
|
+
const deltaY = startY - event.changedTouches[0].clientY;
|
|
117
|
+
if (Math.abs(deltaY) > 40) this.goTo(this.currentSlide + (deltaY > 0 ? 1 : -1));
|
|
118
|
+
}, { passive: true });
|
|
119
|
+
}
|
|
120
|
+
setupMouseWheel() {
|
|
121
|
+
let last = 0;
|
|
122
|
+
document.addEventListener('wheel', (event) => {
|
|
123
|
+
const now = Date.now();
|
|
124
|
+
if (now - last < 800) return;
|
|
125
|
+
last = now;
|
|
126
|
+
this.goTo(this.currentSlide + (event.deltaY > 0 ? 1 : -1));
|
|
127
|
+
}, { passive: true });
|
|
128
|
+
}
|
|
129
|
+
goTo(index) {
|
|
130
|
+
const clamped = Math.max(0, Math.min(this.slides.length - 1, index));
|
|
131
|
+
this.slides[clamped].scrollIntoView({ behavior: 'smooth' });
|
|
132
|
+
this.currentSlide = clamped;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
new SlidePresentation();
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
<!-- @design:foundation:end -->
|
|
139
|
+
|
|
140
|
+
<!-- @design:rules:start -->
|
|
141
|
+
|
|
142
|
+
### Rules
|
|
143
|
+
|
|
144
|
+
- Use Lucent for strategy, operating review, research synthesis, market diagnosis, and data-backed decision decks.
|
|
145
|
+
- Prefer bright report pages with subtle radial accents. Reserve dark full-bleed imagery for cover, section divider, and closing slides.
|
|
146
|
+
- Put the slide-level title in each layout's title slot or hero text area. Do not hide the main claim inside a card.
|
|
147
|
+
- Treat the design as a measurable report system: every content layout should expose clear grid rails, stable slot dimensions, and a visible reading order.
|
|
148
|
+
- Use declared spacing/type/surface tokens before adding local CSS. Local overrides should serve a documented state such as dense table, long title, or mixed-language body copy.
|
|
149
|
+
- Preview examples should mark every layout with `data-preview-layout="<layout-name>"` and every component with `data-preview-component="<component-name>"`.
|
|
150
|
+
- Use `box` for one idea, evidence item, operating gap, risk, or action. Use 2-4 boxes on dense synthesis slides.
|
|
151
|
+
- Use ECharts for all data charts, including Sankey. Do not fake charts with CSS shapes.
|
|
152
|
+
- Keep typography quiet and legible: large claim headings, compact metadata, and source notes in muted color.
|
|
153
|
+
- Avoid decorative orbs except the Lucent glass assets provided in `assets/`; do not create new gradient blobs.
|
|
154
|
+
- All image assets in design previews must be local package assets under `designs/lucent-dark/assets/`.
|
|
155
|
+
|
|
156
|
+
<!-- @design:rules:end -->
|
|
157
|
+
|
|
158
|
+
<!-- @design:layouts:start -->
|
|
159
|
+
|
|
160
|
+
<!-- @layout:cover:start qa=false -->
|
|
161
|
+
Full-bleed opening slide with one dominant background image, dark overlay, and bottom-left hero title. Slots: `hero`.
|
|
162
|
+
<!-- @layout:cover:end -->
|
|
163
|
+
|
|
164
|
+
<!-- @layout:toc:start qa=true -->
|
|
165
|
+
Two-column table of contents with a left title rail, right numbered agenda, and optional glass orb. Slots: `left`, `list`, `asset`.
|
|
166
|
+
<!-- @layout:toc:end -->
|
|
167
|
+
|
|
168
|
+
<!-- @layout:report-story:start qa=true -->
|
|
169
|
+
Report slide with top title block and a two-column body for narrative text plus supporting media or evidence. Slots: `title`, `left`, `right`.
|
|
170
|
+
<!-- @layout:report-story:end -->
|
|
171
|
+
|
|
172
|
+
<!-- @layout:card-grid:start qa=true -->
|
|
173
|
+
Top title block with three card columns. Use for insight clusters, operating gaps, or comparison. Slots: `title`, `cards`.
|
|
174
|
+
<!-- @layout:card-grid:end -->
|
|
175
|
+
|
|
176
|
+
<!-- @layout:chart-with-takeaways:start qa=true -->
|
|
177
|
+
Top title block with a dominant chart on the left and stacked takeaway cards on the right. Slots: `title`, `chart`, `takeaways`.
|
|
178
|
+
<!-- @layout:chart-with-takeaways:end -->
|
|
179
|
+
|
|
180
|
+
<!-- @layout:sankey:start qa=true -->
|
|
181
|
+
Top title block with a wide Sankey chart and a right explanation column. Slots: `title`, `sankey`, `takeaways`.
|
|
182
|
+
<!-- @layout:sankey:end -->
|
|
183
|
+
|
|
184
|
+
<!-- @layout:table:start qa=true -->
|
|
185
|
+
Top title block with one large table panel and explanatory reading notes. Slots: `title`, `table`.
|
|
186
|
+
<!-- @layout:table:end -->
|
|
187
|
+
|
|
188
|
+
<!-- @layout:roadmap:start qa=true -->
|
|
189
|
+
Top title block with a horizontal four-phase roadmap across the body. Slots: `title`, `roadmap`.
|
|
190
|
+
<!-- @layout:roadmap:end -->
|
|
191
|
+
|
|
192
|
+
<!-- @layout:recommendation:start qa=true -->
|
|
193
|
+
Three-column recommendation page with primary recommendation, reasoning, and next steps. Slots: `recommendation`, `rationale`, `steps`.
|
|
194
|
+
<!-- @layout:recommendation:end -->
|
|
195
|
+
|
|
196
|
+
<!-- @layout:closing:start qa=false -->
|
|
197
|
+
Full-bleed closing slide with a background image, soft overlay, and concise final title. Slots: `hero`.
|
|
198
|
+
<!-- @layout:closing:end -->
|
|
199
|
+
|
|
200
|
+
<!-- @design:layouts:end -->
|
|
201
|
+
|
|
202
|
+
<!-- @design:components:start -->
|
|
203
|
+
|
|
204
|
+
<!-- @component:hero:start -->
|
|
205
|
+
Full-canvas image-backed hero with `.hero`, `.hero-bg`, `.hero-shade`, and `.hero-title`. Use only for cover, section divider, and closing slides.
|
|
206
|
+
<!-- @component:hero:end -->
|
|
207
|
+
|
|
208
|
+
<!-- @component:toc:start -->
|
|
209
|
+
Lucent agenda component using `.toc-wrap`, `.toc-title`, `.toc-list`, and optional `.toc-orb`. Use for navigation, not for normal text-heavy content.
|
|
210
|
+
<!-- @component:toc:end -->
|
|
211
|
+
|
|
212
|
+
<!-- @component:text-panel:start -->
|
|
213
|
+
Focused text module for setup, reading guidance, and narrative explanation. Use inside report layouts or boxes.
|
|
214
|
+
<!-- @component:text-panel:end -->
|
|
215
|
+
|
|
216
|
+
<!-- @component:box:start -->
|
|
217
|
+
Card/group primitive for insights, evidence, operating gaps, recommendations, and rationale. Use `.box`, `.insight-card`, or `.rec-panel` depending on density.
|
|
218
|
+
<!-- @component:box:end -->
|
|
219
|
+
|
|
220
|
+
<!-- @component:media:start -->
|
|
221
|
+
Image frame for screenshots, report visuals, diagrams, and supporting photography. Use local assets and keep evidence visuals readable.
|
|
222
|
+
<!-- @component:media:end -->
|
|
223
|
+
|
|
224
|
+
<!-- @component:stat-card:start -->
|
|
225
|
+
Compact metric tile with `.stat-card` and `.stat-value`. Use for one number plus one interpretation line.
|
|
226
|
+
<!-- @component:stat-card:end -->
|
|
227
|
+
|
|
228
|
+
<!-- @component:echart-panel:start -->
|
|
229
|
+
Chart frame with `.echart-panel`, `.chart-header`, `.echart-container`, and caption/source text. Use ECharts after DOM initialization and call resize on viewport changes. Sankey charts are an `echart-panel` usage pattern, not a separate primary component; keep the chart wide, labels muted, and interpretation in the layout's takeaway slot.
|
|
230
|
+
<!-- @component:echart-panel:end -->
|
|
231
|
+
|
|
232
|
+
<!-- @component:data-table:start -->
|
|
233
|
+
Structured table component with `.table-panel`, tabular numbers, muted headers, and right-aligned numeric columns.
|
|
234
|
+
<!-- @component:data-table:end -->
|
|
235
|
+
|
|
236
|
+
<!-- @component:roadmap-horizontal:start -->
|
|
237
|
+
Four-phase horizontal roadmap with alternating cards around a gradient axis. Use for staged plans, milestones, or migration paths. The dot is the milestone marker, not card decoration: place each marker on the shared axis and connect the card back to that marker so the phase label, card, and axis read as one anchored event.
|
|
238
|
+
<!-- @component:roadmap-horizontal:end -->
|
|
239
|
+
|
|
240
|
+
<!-- @component:steps:start -->
|
|
241
|
+
Ordered action list for next steps. Keep it short: three to five steps, each with a number and one concise action.
|
|
242
|
+
<!-- @component:steps:end -->
|
|
243
|
+
|
|
244
|
+
<!-- @component:page-number:start -->
|
|
245
|
+
Small absolute page number utility. Use muted color on report pages and light color on dark hero pages.
|
|
246
|
+
<!-- @component:page-number:end -->
|
|
247
|
+
|
|
248
|
+
<!-- @component:brand-watermark:start -->
|
|
249
|
+
Small top-right logo or brand mark. Keep it clear, restrained, and never use logos as decorative backgrounds.
|
|
250
|
+
<!-- @component:brand-watermark:end -->
|
|
251
|
+
|
|
252
|
+
<!-- @design:components:end -->
|
|
253
|
+
|
|
254
|
+
<!-- @design:page-templates:start -->
|
|
255
|
+
|
|
256
|
+
### Page Template Mapping
|
|
257
|
+
|
|
258
|
+
Lucent skins Revela built-in page templates without owning their semantic structure. The template renderer owns required fields, DOM skeletons, and template QA; Lucent supplies bright report surfaces, blue-violet-cyan accents, fixed-pixel typography, and local assets.
|
|
259
|
+
|
|
260
|
+
- `cover`, `section-divider`, `closing`: use full-bleed hero treatment with Lucent package assets.
|
|
261
|
+
- `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use report-story/card-grid language with quiet surfaces.
|
|
262
|
+
- `metric-highlight`, `chart-takeaways`, `table-comparison`: use data-forward Lucent panels with explicit interpretation regions.
|
|
263
|
+
- `timeline-roadmap`: map to the roadmap visual system. Dots remain milestone anchors inside each timeline item; do not absolutely position detached decorative dots.
|
|
264
|
+
- `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use recommendation and steps surfaces with no nested card-in-card framing.
|
|
265
|
+
|
|
266
|
+
<!-- @design:page-templates:end -->
|
|
267
|
+
|
|
268
|
+
<!-- @design:chart-rules:start -->
|
|
269
|
+
|
|
270
|
+
### Chart Rules
|
|
271
|
+
|
|
272
|
+
- Use ECharts for line, bar, and Sankey charts.
|
|
273
|
+
- Initialize charts after `SlidePresentation` setup and resize them on `window.resize`.
|
|
274
|
+
- Use Lucent chart colors: `#315eea`, `#6e5df6`, `#18a8d8`, `#f06370`, and muted text `#7b8aa0`.
|
|
275
|
+
- Keep chart backgrounds transparent and place charts inside stable `.echart-container` regions with explicit height or flex sizing.
|
|
276
|
+
- Sankey charts inside `echart-panel` should use low-curvature links, restrained labels, and a separate takeaway column for interpretation.
|
|
277
|
+
|
|
278
|
+
<!-- @design:chart-rules:end -->
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|