@cyber-dash-tech/revela 0.18.15 → 0.18.16

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.
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Lucent Design System — Preview</title>
6
+ <title>Lucent Design System — Contract Preview</title>
7
7
  <script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
8
8
  <style>
9
9
  :root {
@@ -24,485 +24,400 @@
24
24
  --accent-coral: #f06370;
25
25
  --accent-soft: #dbe8ff;
26
26
  --shadow-soft: rgba(30, 65, 130, 0.13);
27
- --font-display: DengXian, 'Microsoft YaHei', 'PingFang SC', Arial, ui-sans-serif, sans-serif;
28
- --font-body: DengXian, 'Microsoft YaHei', 'PingFang SC', Arial, ui-sans-serif, sans-serif;
29
- --asset-root: '../';
27
+ --font-display: DengXian, "Microsoft YaHei", "PingFang SC", Arial, ui-sans-serif, sans-serif;
28
+ --font-body: DengXian, "Microsoft YaHei", "PingFang SC", Arial, ui-sans-serif, sans-serif;
29
+ --grid-margin-x: 72px;
30
+ --grid-margin-y: 56px;
31
+ --grid-columns: 12;
32
+ --grid-gutter: 24px;
33
+ --grid-safe-top: 56px;
34
+ --grid-safe-bottom: 64px;
35
+ --space-1: 8px;
36
+ --space-2: 16px;
37
+ --space-3: 24px;
38
+ --space-4: 32px;
39
+ --space-5: 48px;
40
+ --space-6: 72px;
41
+ --font-size-caption: 16px;
42
+ --font-size-body-small: 18px;
43
+ --font-size-body: 22px;
44
+ --font-size-h3: 31px;
45
+ --font-size-h2: 52px;
46
+ --font-size-hero: 104px;
47
+ --surface-radius: 8px;
48
+ --surface-radius-large: 12px;
30
49
  }
50
+
31
51
  * { box-sizing: border-box; margin: 0; padding: 0; }
32
52
  html { height: 100%; overflow-y: scroll; scroll-snap-type: y mandatory; }
33
- body { height: 100%; background: var(--bg-frame); color: var(--text-primary); font-family: var(--font-body); -webkit-font-smoothing: antialiased; }
53
+ body { min-height: 100%; background: var(--bg-frame); color: var(--text-primary); font-family: var(--font-body); -webkit-font-smoothing: antialiased; }
34
54
  .slide { min-height: 100dvh; scroll-snap-align: start; display: flex; align-items: center; justify-content: center; overflow: hidden; background: var(--bg-frame); }
35
55
  .slide-canvas { width: 1920px; height: 1080px; flex-shrink: 0; transform-origin: center center; position: relative; overflow: hidden; padding: 0; }
36
56
  .page { position: relative; width: 100%; height: 100%; overflow: hidden; background: var(--bg-page); color: var(--text-primary); box-shadow: 0 24px 80px var(--shadow-soft); }
37
- .report-page { padding: 56px 72px 64px; background: radial-gradient(circle at 92% 12%, rgba(24,168,216,.105), rgba(247,249,252,0) 25%), radial-gradient(circle at 7% 84%, rgba(110,93,246,.095), rgba(247,249,252,0) 28%), radial-gradient(circle at 74% 88%, rgba(240,99,112,.055), rgba(247,249,252,0) 24%), var(--bg-page); }
38
- .report-page::before { content: ''; position: absolute; right: -180px; top: -140px; width: 680px; height: 680px; border-radius: 999px; background: radial-gradient(circle, rgba(49,94,234,.28), rgba(24,168,216,.14) 40%, rgba(247,249,252,0) 72%); pointer-events: none; }
39
- .report-page::after { content: ''; position: absolute; left: -210px; bottom: -210px; width: 720px; height: 720px; border-radius: 999px; background: radial-gradient(circle, rgba(110,93,246,.20), rgba(240,99,112,.105) 36%, rgba(247,249,252,0) 72%); pointer-events: none; }
40
- .page.light-text { color: #fff; }
41
- .reveal { opacity: 0; transform: translateY(18px); transition: opacity .55s cubic-bezier(.22,1,.36,1), transform .55s cubic-bezier(.22,1,.36,1); }
42
- .reveal.visible { opacity: 1; transform: translateY(0); }
57
+ .page.report { padding: var(--grid-margin-y) var(--grid-margin-x) var(--grid-safe-bottom); background: radial-gradient(circle at 94% 8%, rgba(24,168,216,.11), rgba(247,249,252,0) 26%), radial-gradient(circle at 5% 88%, rgba(110,93,246,.10), rgba(247,249,252,0) 28%), var(--bg-page); }
58
+ .page.alt { background: var(--bg-page-alt); }
59
+ .grid-page { display: grid; grid-template-rows: 192px minmax(0, 1fr) 24px; gap: var(--space-4); }
60
+ .slide-grid { position: relative; display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--grid-gutter); height: 100%; min-height: 0; }
61
+ .grid-overlay { position: absolute; inset: var(--grid-margin-y) var(--grid-margin-x) var(--grid-safe-bottom); display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--grid-gutter); pointer-events: none; opacity: .18; }
62
+ .grid-overlay span { border-left: 1px solid rgba(49,94,234,.28); border-right: 1px solid rgba(49,94,234,.10); background: rgba(49,94,234,.025); }
63
+ .preview-label { position: absolute; left: var(--grid-margin-x); top: 24px; z-index: 20; font-size: 12px; letter-spacing: .14em; text-transform: uppercase; color: rgba(123,138,160,.72); }
43
64
  h1, h2, h3, h4 { font-family: var(--font-display); color: var(--text-primary); letter-spacing: 0; }
44
- h1 { font-size: 104px; line-height: .98; font-weight: 700; }
45
- h2 { font-size: 52px; line-height: 1.18; font-weight: 700; }
46
- h3 { font-size: 31px; line-height: 1.24; font-weight: 700; }
47
- h4 { font-size: 28px; line-height: 1.28; font-weight: 700; }
48
- p, li { font-size: 22px; line-height: 1.58; color: var(--text-secondary); }
49
- .eyebrow, .meta, .caption { font-size: 16px; line-height: 1.42; letter-spacing: .12em; text-transform: uppercase; color: var(--text-muted); }
50
- .source-note { font-family: 'Times New Roman', Times, serif; font-size: 16px; line-height: 1.45; color: var(--text-muted); }
51
- .hero { position: relative; width: 100%; height: 100%; overflow: hidden; background: #0b1630; }
52
- .hero-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
53
- .hero-shade { position: absolute; inset: 0; background: linear-gradient(90deg, rgba(7,17,31,.66) 0%, rgba(7,17,31,.25) 44%, rgba(7,17,31,.08) 100%); }
54
- .hero-shade.soft { background: linear-gradient(90deg, rgba(247,249,252,.92) 0%, rgba(247,249,252,.68) 40%, rgba(247,249,252,.12) 100%); }
55
- .hero-content { position: relative; z-index: 2; height: 100%; padding: 74px 86px 76px; display: flex; flex-direction: column; justify-content: space-between; align-items: flex-start; }
56
- .hero-logo { align-self: flex-start; width: auto; max-width: 380px; height: 52px; object-fit: contain; }
57
- .hero-title { max-width: 970px; }
58
- .hero-title h1 { color: #fff; max-width: 900px; line-height: 1.08; }
59
- .hero-title p { margin-top: 28px; max-width: 620px; color: rgba(255,255,255,.78); font-size: 22px; line-height: 1.5; }
60
- .slide[data-slide-index="1"] .hero-content { justify-content: flex-end; padding: 0 86px 132px; }
61
- .slide[data-slide-index="1"] .hero-title { max-width: 1040px; }
62
- .slide[data-slide-index="1"] .hero-title h1 { max-width: 960px; }
63
- .slide[data-slide-index="1"] .hero-title p { max-width: 700px; }
64
- .hero-meta { display: flex; gap: 28px; color: rgba(255,255,255,.72); font-size: 15px; letter-spacing: .08em; text-transform: uppercase; }
65
- .report-header { position: relative; height: 164px; border-bottom: 1px solid var(--line); }
66
- .chapter-label { font-size: 26px; letter-spacing: .11em; text-transform: uppercase; color: var(--accent-primary); font-weight: 700; }
67
- .report-title { margin-top: 32px; max-width: 1776px; }
68
- .report-title h2 { font-size: 43px; line-height: 1.18; }
69
- .pnp-logo { position: absolute; top: 0; right: 0; width: auto; height: 32px; object-fit: contain; }
70
- .content { position: absolute; left: 72px; right: 72px; top: 256px; height: 740px; }
65
+ h1 { font-size: 88px; line-height: 1.22; font-weight: 700; padding: 14px 0; }
66
+ h2 { font-size: 46px; line-height: 1.22; font-weight: 700; padding: 4px 0; }
67
+ h3 { font-size: var(--font-size-h3); line-height: 1.22; font-weight: 700; }
68
+ h4 { font-size: 25px; line-height: 1.26; font-weight: 700; }
69
+ p, li { font-size: var(--font-size-body); line-height: 1.56; color: var(--text-secondary); }
70
+ .eyebrow, .meta, .caption { font-size: var(--font-size-caption); line-height: 1.42; letter-spacing: .12em; text-transform: uppercase; color: var(--text-muted); }
71
+ .source-note { font-family: "Times New Roman", Times, serif; font-size: 16px; line-height: 1.42; color: var(--text-muted); letter-spacing: 0; text-transform: none; }
72
+ .report-header { grid-row: 1; display: grid; grid-template-columns: minmax(0, 1fr) 220px; gap: var(--space-4); align-items: start; border-bottom: 1px solid var(--line); padding-bottom: var(--space-3); overflow: visible; }
73
+ .report-title { max-width: 1280px; }
74
+ .report-title h2 { margin-top: var(--space-2); }
75
+ .brand-watermark { justify-self: end; width: 172px; height: 34px; object-fit: contain; opacity: .9; }
71
76
  .page-number { position: absolute; right: 34px; bottom: 26px; z-index: 10; font-size: 12px; letter-spacing: .14em; color: var(--text-muted); }
72
77
  .page-number.light { color: rgba(255,255,255,.72); }
73
- .toc-wrap { display: grid; grid-template-columns: 520px 1fr; gap: 72px; height: 100%; padding: 88px 96px 76px; }
74
- .toc-title { display: flex; flex-direction: column; justify-content: space-between; border-right: 1px solid var(--line); padding-right: 64px; }
75
- .toc-title h2 { font-size: 60px; line-height: 1.16; }
76
- .toc-list { list-style: none; display: flex; flex-direction: column; justify-content: center; gap: 20px; }
77
- .toc-list li { display: grid; grid-template-columns: 86px 1fr; align-items: baseline; gap: 28px; padding-bottom: 16px; border-bottom: 1px solid var(--line); }
78
- .toc-list li:nth-child(4) { grid-template-columns: 98px 1fr; padding-bottom: 20px; }
79
- .toc-list span { font-size: 40px; color: var(--accent-secondary); font-weight: 700; font-variant-numeric: tabular-nums; }
80
- .toc-list li:nth-child(4) span { font-size: 48px; }
78
+ .reveal { opacity: 1; transform: none; }
79
+
80
+ .hero { position: relative; width: 100%; height: 100%; overflow: hidden; background: #0b1630; }
81
+ .hero-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
82
+ .hero-shade { position: absolute; inset: 0; background: linear-gradient(90deg, rgba(7,17,31,.70) 0%, rgba(7,17,31,.34) 46%, rgba(7,17,31,.12) 100%); }
83
+ .hero-shade.light { background: linear-gradient(90deg, rgba(247,249,252,.94) 0%, rgba(247,249,252,.72) 44%, rgba(247,249,252,.20) 100%); }
84
+ .hero-content { position: relative; z-index: 2; height: 100%; padding: 86px; display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--grid-gutter); align-content: end; }
85
+ .hero-title { grid-column: 1 / span 8; padding-bottom: 44px; overflow: visible; }
86
+ .hero-title h1 { display: block; overflow: visible; }
87
+ .hero-title h1 { color: #fff; max-width: 920px; }
88
+ .hero-title p { margin-top: var(--space-3); max-width: 720px; color: rgba(255,255,255,.78); }
89
+ .hero-meta { position: absolute; left: 86px; top: 76px; display: flex; gap: 28px; color: rgba(255,255,255,.74); font-size: 15px; letter-spacing: .10em; text-transform: uppercase; }
90
+ .hero.light .hero-title h1 { color: var(--text-primary); }
91
+ .hero.light .hero-title p { color: var(--text-secondary); }
92
+
93
+ .toc-wrap { height: 100%; padding: 88px 96px 76px; display: grid; grid-template-columns: 4fr 8fr; column-gap: var(--space-6); align-items: stretch; background: var(--bg-page); }
94
+ .toc-title { border-right: 1px solid var(--line); padding-right: var(--space-5); display: flex; flex-direction: column; justify-content: space-between; }
95
+ .toc-title h2 { font-size: 54px; line-height: 1.24; padding: 4px 0; }
96
+ .toc-title p { max-width: 360px; }
97
+ .toc-list { list-style: none; display: flex; flex-direction: column; justify-content: center; gap: var(--space-3); }
98
+ .toc-list li { display: grid; grid-template-columns: 92px minmax(0, 1fr); gap: var(--space-4); align-items: baseline; padding-bottom: var(--space-2); border-bottom: 1px solid var(--line); }
99
+ .toc-list span { display: block; font-size: 36px; line-height: 1.28; padding: 2px 0; color: var(--accent-secondary); font-weight: 700; font-variant-numeric: tabular-nums; }
81
100
  .toc-list strong { font-size: 34px; color: var(--text-primary); font-weight: 700; }
82
- .toc-list li:nth-child(4) strong { font-size: 42px; }
83
- .toc-list em { display: block; margin-top: 10px; font-style: normal; font-size: 24px; line-height: 1.28; color: var(--text-muted); }
84
- .toc-list li:nth-child(4) em { font-size: 28px; }
85
- .toc-orb { position: absolute; right: -145px; bottom: -205px; width: 920px; opacity: .68; mix-blend-mode: multiply; filter: saturate(1.45) contrast(1.08); pointer-events: none; }
86
- .section-kicker { color: rgba(255,255,255,.72); font-size: 15px; letter-spacing: .14em; text-transform: uppercase; font-weight: 700; }
87
- .section-title { max-width: 920px; }
88
- .section-title h1 { margin-top: 22px; color: #fff; font-size: 94px; line-height: 1.08; }
89
- .section-title p { margin-top: 26px; color: rgba(255,255,255,.78); font-size: 22px; max-width: 650px; }
90
- .two-col { display: grid; grid-template-columns: 600px 1fr; gap: 52px; height: 100%; }
91
- .lead-panel { padding: 32px 34px; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; box-shadow: 0 18px 48px rgba(30,65,130,.08); }
92
- .lead-panel h3 { margin-bottom: 18px; }
93
- .lead-panel p { font-size: 27px; line-height: 1.52; }
94
- .bullet-list { list-style: none; display: flex; flex-direction: column; gap: 14px; margin-top: 24px; }
95
- .bullet-list li { position: relative; padding-left: 22px; }
96
- .bullet-list li::before { content: ''; position: absolute; left: 0; top: 10px; width: 7px; height: 7px; background: var(--accent-primary); border-radius: 999px; }
97
- .evidence-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 22px; }
98
- .evidence-grid .box:first-child { grid-row: span 2; background: linear-gradient(135deg, #edf4ff 0%, rgba(255,255,255,.92) 74%); border-color: rgba(49,94,234,.24); }
99
- .evidence-grid .box:nth-child(4) { background: var(--surface-blue); border-color: rgba(24,168,216,.24); }
100
- .box, .insight-card { background: rgba(255,255,255,.86); border: 1px solid var(--line); border-radius: 8px; padding: 26px 28px; box-shadow: 0 14px 38px rgba(30,65,130,.07); }
101
- .box h4, .insight-card h3 { margin-bottom: 12px; }
102
- .box p, .insight-card p { font-size: 21px; line-height: 1.42; }
103
- .insight-card h3 { font-size: 26px; line-height: 1.18; }
104
- .insight-card p { font-size: 17px; line-height: 1.34; }
105
- .card-grid { display: grid; grid-template-columns: 1.18fr .92fr .92fr; gap: 28px; height: 100%; }
106
- .insight-card { position: relative; display: flex; flex-direction: column; justify-content: flex-start; gap: 22px; min-height: 0; overflow: visible; }
107
- .insight-card:first-child { background: linear-gradient(145deg, rgba(255,255,255,.56) 0%, rgba(237,244,255,.72) 100%), var(--card-bg, none) center / cover no-repeat; border-color: rgba(49,94,234,.26); }
108
- .insight-card:nth-child(2) { background: linear-gradient(145deg, rgba(238,241,255,.70), rgba(238,241,255,.84)), var(--card-bg, none) center / cover no-repeat; }
109
- .insight-card:nth-child(3) { background: linear-gradient(160deg, #ffffff 0%, #fff2f4 100%); border-top: 5px solid var(--accent-coral); }
110
- .insight-card.featured > * { position: relative; z-index: 1; }
111
- .insight-card.lensed { background: #eef1ff; border-color: rgba(110,93,246,.34); }
112
- .insight-card.lensed::after { content: ''; position: absolute; left: 28px; right: 28px; bottom: 24px; height: 1px; background: linear-gradient(90deg, rgba(49,94,234,.0), rgba(49,94,234,.46), rgba(240,99,112,.0)); }
113
- .asset-lens { display: none; position: absolute; width: 300px; height: auto; opacity: .34; pointer-events: none; object-fit: contain; }
114
- .asset-lens--card { right: 18px; bottom: 24px; }
115
- .asset-lens--top { right: -18px; top: -36px; width: 260px; opacity: .30; transform: rotate(-9deg); }
116
- .mini-mosaic { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 24px; }
117
- .mini-chip { border: 1px solid rgba(49,94,234,.20); background: rgba(255,255,255,.62); border-radius: 999px; padding: 8px 12px; color: var(--text-primary); font-size: 15px; font-weight: 700; text-align: center; }
118
- .card-num { font-size: 54px; line-height: 1; color: var(--accent-secondary); font-weight: 700; }
119
- .card-tag { margin-top: 30px; color: var(--accent-primary); font-size: 16px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; }
120
- .stat-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: auto; position: relative; z-index: 1; }
121
- .stat-card { padding: 18px 18px; background: rgba(255,255,255,.78); border: 1px solid var(--line); border-radius: 8px; }
122
- .stat-value { font-size: 42px; line-height: .95; font-weight: 700; color: var(--accent-primary); font-variant-numeric: tabular-nums; }
123
- .stat-card p { margin-top: 8px; font-size: 15px; }
124
- .slide[data-slide-index="4"] .insight-card > div:first-child > p:not(.card-tag) { font-size: 24px; line-height: 1.38; }
125
- .slide[data-slide-index="4"] .mini-chip { font-size: 19px; line-height: 1.15; padding: 10px 14px; }
126
- .slide[data-slide-index="4"] .stat-card p { font-size: 20px; line-height: 1.34; }
127
- .slide[data-slide-index="6"] .insight-card { padding: 34px 36px; gap: 28px; }
128
- .slide[data-slide-index="6"] .card-num { font-size: 72px; }
129
- .slide[data-slide-index="6"] .card-tag { margin-top: 34px; font-size: 22px; line-height: 1.2; letter-spacing: .10em; }
130
- .slide[data-slide-index="6"] .insight-card h3 { font-size: 36px; line-height: 1.15; margin-bottom: 18px; }
131
- .slide[data-slide-index="6"] .insight-card p:not(.card-tag) { font-size: 27px; line-height: 1.34; }
132
- .slide[data-slide-index="6"] .mini-mosaic { gap: 16px; margin-top: 34px; }
133
- .slide[data-slide-index="6"] .mini-chip { font-size: 24px; line-height: 1.15; padding: 16px 18px; }
134
- .slide[data-slide-index="6"] .stat-value { font-size: 62px; }
135
- .slide[data-slide-index="6"] .stat-card { padding: 24px 26px; }
136
- .slide[data-slide-index="6"] .stat-card p { font-size: 24px; line-height: 1.28; }
137
- .chart-layout { display: grid; grid-template-columns: 1fr 420px; gap: 36px; height: 100%; }
138
- .sankey-layout { display: grid; grid-template-columns: 1fr 470px; gap: 34px; height: 746px; }
139
- .echart-panel { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; padding: 28px 32px; display: flex; flex-direction: column; min-height: 0; }
140
- .chart-header { padding-bottom: 16px; border-bottom: 1px solid var(--line); margin-bottom: 18px; }
141
- .chart-header p { margin-top: 4px; font-size: 18px; color: var(--text-muted); }
101
+ .toc-list em { display: block; margin-top: var(--space-1); font-style: normal; font-size: 21px; line-height: 1.35; color: var(--text-muted); }
102
+ .toc-orb { position: absolute; right: 24px; bottom: 16px; width: 420px; opacity: .30; mix-blend-mode: multiply; pointer-events: none; }
103
+
104
+ .box, .insight-card, .rec-panel, .stat-card, .echart-panel, .table-panel, .media-frame, .text-panel { border: 1px solid var(--line); border-radius: var(--surface-radius); background: rgba(255,255,255,.88); box-shadow: 0 14px 38px rgba(30,65,130,.07); }
105
+ .box, .text-panel { padding: var(--space-4); }
106
+ .box h3, .box h4, .text-panel h3 { margin-bottom: var(--space-2); }
107
+ .box p, .text-panel p { font-size: 21px; }
108
+ .text-panel .source-note { margin-top: var(--space-3); }
109
+ .media-frame { overflow: hidden; min-height: 0; }
110
+ .media-frame img { width: 100%; height: 100%; display: block; object-fit: cover; }
111
+ .media-caption { margin-top: var(--space-2); }
112
+ .stat-card { padding: var(--space-3); }
113
+ .stat-value { font-size: 54px; line-height: 1.12; color: var(--accent-primary); font-weight: 700; font-variant-numeric: tabular-nums; }
114
+ .stat-card p { margin-top: var(--space-1); font-size: 17px; line-height: 1.36; }
115
+
116
+ .report-story-grid { grid-column: 1 / -1; display: grid; grid-template-columns: 5fr 7fr; column-gap: var(--space-5); height: 100%; min-height: 0; }
117
+ .story-copy { align-self: stretch; }
118
+ .story-media { display: grid; grid-template-rows: minmax(0, 1fr) auto; gap: var(--space-2); min-height: 0; }
119
+ .story-media .media-frame { height: 100%; }
120
+ .story-media .source-note { padding-left: var(--space-1); }
121
+
122
+ .card-grid { grid-column: 1 / -1; display: grid; grid-template-columns: 1.18fr .92fr .92fr; gap: var(--space-4); height: 100%; min-height: 0; }
123
+ .insight-card { padding: var(--space-4); display: flex; flex-direction: column; min-height: 0; }
124
+ .insight-card.featured { background: linear-gradient(145deg, rgba(255,255,255,.72), rgba(231,240,251,.86)), url("assets/card-lens.jpg") center / cover no-repeat; border-color: rgba(49,94,234,.24); }
125
+ .insight-card h3 { margin: var(--space-2) 0; }
126
+ .card-num { display: block; font-size: 52px; line-height: 1.28; padding: 2px 0; color: var(--accent-secondary); font-weight: 700; }
127
+ .chip-row { display: flex; flex-wrap: wrap; gap: var(--space-1); margin-top: auto; padding-top: var(--space-3); }
128
+ .chip { border: 1px solid rgba(49,94,234,.20); background: rgba(255,255,255,.68); border-radius: 999px; padding: 8px 12px; color: var(--text-primary); font-size: 15px; font-weight: 700; }
129
+
130
+ .chart-layout { grid-column: 1 / -1; display: grid; grid-template-columns: 8fr 4fr; gap: var(--space-4); height: 100%; min-height: 0; }
131
+ .sankey-layout { grid-column: 1 / -1; display: grid; grid-template-columns: 8fr 4fr; gap: var(--space-4); height: 100%; min-height: 0; }
132
+ .echart-panel { padding: var(--space-4); display: flex; flex-direction: column; min-height: 0; }
133
+ .chart-header { padding-bottom: var(--space-2); margin-bottom: var(--space-3); border-bottom: 1px solid var(--line); }
134
+ .chart-header p { font-size: 18px; color: var(--text-muted); }
142
135
  .echart-container { flex: 1; min-height: 0; }
143
- .takeaway-col { display: flex; flex-direction: column; gap: 18px; }
144
- .takeaway { border-left: 4px solid var(--accent-primary); background: var(--surface-tint); padding: 22px 24px; border-radius: 0 8px 8px 0; }
136
+ .takeaway-col { display: flex; flex-direction: column; gap: var(--space-3); min-height: 0; }
137
+ .takeaway { padding: var(--space-3); border-left: 4px solid var(--accent-primary); border-radius: 0 var(--surface-radius) var(--surface-radius) 0; background: var(--surface-tint); }
145
138
  .takeaway.coral { border-left-color: var(--accent-coral); }
146
- .takeaway.glass { border: 1px solid rgba(110,93,246,.22); border-left: 4px solid var(--accent-secondary); background: linear-gradient(145deg, rgba(255,255,255,.78), rgba(231,240,251,.76)); box-shadow: 0 18px 52px rgba(49,94,234,.10); }
147
- .table-panel { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; padding: 30px 34px; height: 100%; display: flex; flex-direction: column; }
148
- table { width: 100%; border-collapse: collapse; font-size: 25px; line-height: 1.42; font-variant-numeric: tabular-nums; }
149
- th { text-align: left; padding: 0 16px 16px 0; border-bottom: 1.5px solid var(--line-strong); font-size: 16px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-muted); }
150
- td { padding: 17px 16px 17px 0; border-bottom: 1px solid var(--line); color: var(--text-secondary); }
139
+ .takeaway p { font-size: 19px; line-height: 1.42; }
140
+
141
+ .table-panel { grid-column: 1 / -1; padding: var(--space-4); display: grid; grid-template-rows: auto minmax(0, 1fr) auto; gap: var(--space-3); min-height: 0; }
142
+ table { width: 100%; border-collapse: collapse; font-size: 23px; line-height: 1.42; font-variant-numeric: tabular-nums; }
143
+ th { text-align: left; padding: 0 16px 16px 0; border-bottom: 1.5px solid var(--line-strong); font-size: 15px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-muted); }
144
+ td { padding: 16px 16px 16px 0; border-bottom: 1px solid var(--line); color: var(--text-secondary); }
151
145
  th:not(:first-child), td:not(:first-child) { text-align: right; }
152
146
  .positive { color: var(--accent-primary); font-weight: 700; }
153
147
  .warning { color: var(--accent-coral); font-weight: 700; }
154
- .roadmap { position: relative; height: 100%; border-radius: 12px; overflow: hidden; background: linear-gradient(135deg, rgba(255,255,255,.86), rgba(231,240,251,.74)); border: 1px solid rgba(49,94,234,.16); box-shadow: 0 22px 60px rgba(30,65,130,.10); }
155
- .roadmap::after { content: ''; position: absolute; left: 126px; right: 126px; top: 380px; height: 18px; border-radius: 999px; background: linear-gradient(90deg, rgba(49,94,234,.18), rgba(110,93,246,.44), rgba(240,99,112,.38)); box-shadow: 0 0 0 1px rgba(255,255,255,.55), 0 22px 60px rgba(49,94,234,.18); z-index: 1; }
156
- .roadmap-asset { position: absolute; left: 720px; top: 238px; width: 260px; opacity: .08; filter: saturate(1.1); pointer-events: none; }
157
- .roadmap-item { position: absolute; width: 340px; padding: 26px 28px; border: 1px solid rgba(49,94,234,.18); background: rgba(255,255,255,.78); backdrop-filter: blur(8px); border-radius: 10px; box-shadow: 0 18px 48px rgba(30,65,130,.11); z-index: 2; }
158
- .roadmap-item:nth-child(1) { left: 84px; top: 92px; }
159
- .roadmap-item:nth-child(2) { left: 492px; top: 470px; }
160
- .roadmap-item:nth-child(3) { left: 900px; top: 92px; }
161
- .roadmap-item:nth-child(4) { right: 84px; top: 470px; }
162
- .roadmap-dot { position: absolute; left: 28px; top: 283px; width: 28px; height: 28px; border-radius: 999px; background: var(--accent-primary); box-shadow: 0 0 0 10px rgba(49,94,234,.12), 0 10px 30px rgba(49,94,234,.28); z-index: 2; }
163
- .roadmap-item:nth-child(2) .roadmap-dot { background: var(--accent-cyan); top: -95px; }
164
- .roadmap-item:nth-child(3) .roadmap-dot { background: var(--accent-secondary); }
165
- .roadmap-item:nth-child(4) .roadmap-dot { background: var(--accent-coral); top: -95px; }
166
- .roadmap-item h3 { margin-bottom: 14px; }
167
- .roadmap-item p { font-size: 17px; line-height: 1.38; }
168
- .recommendation-layout { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 28px; height: 100%; }
169
- .content.two-col, .content.card-grid, .content.chart-layout, .content.recommendation-layout { height: 740px; }
170
- .content.card-grid { top: 232px; height: 812px; }
171
- .story-layout { display: grid; grid-template-columns: 660px 1fr; gap: 42px; height: 740px; }
172
- .story-copy { position: relative; z-index: 1; background: rgba(255,255,255,.76); border: 1px solid rgba(49,94,234,.16); border-radius: 10px; padding: 36px 38px; box-shadow: 0 18px 52px rgba(30,65,130,.10); }
173
- .story-copy p { font-size: 24px; line-height: 1.56; }
174
- .story-copy .bullet-list li { font-size: 22px; line-height: 1.45; }
175
- .story-media { position: relative; z-index: 1; border-radius: 12px; overflow: hidden; border: 1px solid rgba(49,94,234,.18); box-shadow: 0 24px 70px rgba(30,65,130,.14); background: #dbe8ff; }
176
- .story-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
177
- .layer-split { display: grid; grid-template-columns: 780px 1fr; gap: 52px; height: 740px; }
178
- .layer-map { position: relative; z-index: 1; height: 100%; border-radius: 12px; background: linear-gradient(145deg, rgba(255,255,255,.78), rgba(231,240,251,.66)); border: 1px solid rgba(49,94,234,.16); box-shadow: 0 22px 62px rgba(30,65,130,.10); overflow: hidden; }
179
- .layer-map::before { content: ''; position: absolute; left: 360px; top: 54px; bottom: 54px; width: 8px; border-radius: 999px; background: linear-gradient(180deg, rgba(49,94,234,.25), rgba(24,168,216,.36), rgba(240,99,112,.34)); }
180
- .layer-node { position: absolute; width: 310px; }
181
- .layer-node.left { text-align: right; left: 32px; }
182
- .layer-node.right { left: 430px; }
183
- .layer-node:nth-child(1) { top: 64px; }
184
- .layer-node:nth-child(2) { top: 190px; }
185
- .layer-node:nth-child(3) { top: 320px; }
186
- .layer-node:nth-child(4) { top: 450px; }
187
- .layer-node:nth-child(5) { top: 580px; }
188
- .layer-node::after { content: ''; position: absolute; top: 28px; width: 78px; height: 2px; background: rgba(49,94,234,.20); }
189
- .layer-node.left::after { right: -88px; }
190
- .layer-node.right::after { left: -88px; }
191
- .layer-dot { position: absolute; top: 20px; width: 16px; height: 16px; border-radius: 999px; background: var(--layer-color, var(--accent-primary)); box-shadow: 0 0 0 7px rgba(49,94,234,.10); }
192
- .layer-node.left .layer-dot { right: -116px; }
193
- .layer-node.right .layer-dot { left: -116px; }
194
- .layer-node .meta { color: var(--layer-color, var(--accent-primary)); font-weight: 700; }
195
- .layer-node h3 { margin-top: 4px; font-size: 30px; line-height: 1.08; }
196
- .layer-node p { margin-top: 12px; font-size: 17px; line-height: 1.35; }
197
- .layer-table { position: relative; z-index: 1; padding: 30px 34px; border-radius: 12px; background: rgba(255,255,255,.76); border: 1px solid rgba(49,94,234,.16); box-shadow: 0 22px 62px rgba(30,65,130,.10); }
198
- .layer-table h3 { font-size: 36px; margin-bottom: 18px; }
199
- .layer-table p { font-size: 20px; line-height: 1.48; margin-bottom: 26px; }
200
- .layer-table table { font-size: 20px; }
201
- .layer-table th { font-size: 14px; padding-bottom: 12px; }
202
- .layer-table td { padding: 14px 14px 14px 0; }
203
- .layer-full { position: absolute; inset: 0; display: grid; grid-template-columns: 46% 54%; height: 100%; }
204
- .layer-brand { position: absolute; left: 42px; top: 42px; width: auto; height: 32px; object-fit: contain; z-index: 4; }
205
- .layer-full .layer-map { border-radius: 0; border: 0; border-right: 1px solid rgba(49,94,234,.14); box-shadow: none; background: linear-gradient(145deg, rgba(255,255,255,.72), rgba(231,240,251,.78)); }
206
- .layer-full .layer-map::before { left: 50%; top: 142px; bottom: 42px; width: 7px; transform: translateX(-50%); }
207
- .layer-full .layer-node { width: 330px; }
208
- .layer-full .layer-node.left { left: 54px; }
209
- .layer-full .layer-node.right { left: calc(50% + 88px); }
210
- .layer-full .layer-node:nth-of-type(1) { top: 205px; }
211
- .layer-full .layer-node:nth-of-type(2) { top: 390px; }
212
- .layer-full .layer-node:nth-of-type(3) { top: 575px; }
213
- .layer-full .layer-node:nth-of-type(4) { top: 760px; }
214
- .layer-full .layer-node::after { top: 27px; }
215
- .layer-full .layer-node.left::after { left: 100%; width: 112px; transform: translateX(0); }
216
- .layer-full .layer-node.right::after { right: 100%; width: 88px; transform: translateX(0); }
217
- .layer-full .layer-node.left .layer-dot { right: auto; left: 374px; top: 14px; width: 28px; height: 28px; z-index: 3; }
218
- .layer-full .layer-node.right .layer-dot { left: -102px; top: 14px; width: 28px; height: 28px; z-index: 3; }
219
- .layer-full .layer-node h3 { font-size: 34px; }
220
- .layer-full .layer-node p:not(.meta) { font-size: 19px; }
221
- .layer-right { position: relative; padding: 78px 92px 72px 74px; background: rgba(255,255,255,.74); }
222
- .layer-right .chapter-label { font-size: 26px; letter-spacing: .11em; text-transform: uppercase; color: var(--accent-primary); font-weight: 700; }
223
- .layer-right h2 { margin-top: 32px; font-size: 43px; line-height: 1.18; max-width: 840px; }
224
- .layer-right-copy { margin-top: 30px; max-width: 820px; font-size: 22px; line-height: 1.55; }
225
- .layer-right .layer-table { margin-top: 54px; box-shadow: none; background: transparent; border: 0; border-radius: 0; padding: 0; }
226
- .layer-right .layer-table table { font-size: 23px; }
227
- .layer-right .layer-table th { font-size: 17px; }
228
- .layer-right .layer-table td { padding: 18px 16px 18px 0; }
229
- .content.narrative-page { position: absolute; top: 214px; height: 812px; z-index: 1; display: grid; grid-template-rows: 112px 1fr; gap: 18px; }
230
- .narrative-page { z-index: 1; }
231
- .narrative-intro { display: flex; align-items: center; padding: 0 28px; border-radius: 12px; background: rgba(255,255,255,.80); border: 1px solid rgba(49,94,234,.16); box-shadow: 0 18px 42px rgba(30,65,130,.09); }
232
- .narrative-intro p { font-size: 27px; line-height: 1.36; max-width: 1520px; }
233
- .module-board { display: grid; grid-template-columns: 410px 1fr; gap: 24px; min-height: 0; }
234
- .setup-stack { display: flex; flex-direction: column; gap: 12px; }
235
- .setup-card { padding: 16px 18px; border-radius: 10px; border: 1px solid rgba(49,94,234,.14); background: rgba(255,255,255,.72); }
236
- .setup-card h4 { color: var(--accent-primary); font-size: 20px; letter-spacing: .08em; text-transform: uppercase; margin-bottom: 10px; }
237
- .setup-card p { font-size: 23px; line-height: 1.34; }
238
- .process-panel { padding: 18px 20px; border-radius: 12px; border: 1px solid rgba(49,94,234,.16); background: linear-gradient(145deg, rgba(255,255,255,.80), rgba(231,240,251,.68)); }
239
- .process-panel h3 { font-size: 38px; margin-bottom: 14px; }
240
- .process-panel > p { margin: -2px 0 18px; max-width: 1140px; font-size: 25px; line-height: 1.36; color: var(--text-secondary); }
241
- .process-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; }
242
- .process-card { min-height: 276px; padding: 20px 18px; border: 1px solid rgba(49,94,234,.15); background: rgba(255,255,255,.62); border-radius: 8px; }
243
- .process-card:nth-child(2) { background: rgba(219,232,255,.58); }
244
- .process-card:nth-child(4) { background: rgba(255,231,235,.62); border-color: rgba(240,99,112,.20); }
245
- .process-card .meta { color: var(--step-color, var(--accent-primary)); font-size: 19px; font-weight: 700; }
246
- .process-card h4 { font-size: 25px; margin: 12px 0 10px; line-height: 1.12; }
247
- .process-card p { font-size: 21px; line-height: 1.34; }
248
- .takeaway-band { margin-top: 14px; padding: 15px 18px; border-radius: 8px; background: rgba(255,255,255,.75); border: 1px solid rgba(49,94,234,.14); font-size: 23px; color: var(--text-primary); }
249
- .rec-panel { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; padding: 32px; display: flex; flex-direction: column; justify-content: space-between; }
250
- .rec-panel.primary { background: linear-gradient(135deg, #edf4ff 0%, #ffffff 70%); border-color: rgba(49,94,234,.28); }
251
- .rec-label { font-size: 16px; letter-spacing: .12em; text-transform: uppercase; color: var(--accent-primary); font-weight: 700; }
252
- .steps { list-style: none; display: flex; flex-direction: column; gap: 18px; margin-top: 22px; }
253
- .steps li { display: grid; grid-template-columns: 34px 1fr; gap: 14px; align-items: start; }
254
- .steps span { width: 34px; height: 34px; border-radius: 999px; background: var(--accent-soft); color: var(--accent-primary); display: flex; align-items: center; justify-content: center; font-weight: 700; }
255
- .soft-texture { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: .28; pointer-events: none; }
256
- .closing h1 { color: #fff; font-size: 90px; line-height: 1.08; }
257
- .closing p { color: rgba(255,255,255,.78); font-size: 22px; margin-top: 22px; }
148
+
149
+ .roadmap { grid-column: 1 / -1; position: relative; height: 100%; border-radius: var(--surface-radius-large); overflow: hidden; background: linear-gradient(135deg, rgba(255,255,255,.88), rgba(231,240,251,.78)); border: 1px solid rgba(49,94,234,.16); box-shadow: 0 22px 60px rgba(30,65,130,.10); }
150
+ .roadmap::after { content: ""; position: absolute; left: 126px; right: 126px; top: 352px; height: 16px; border-radius: 999px; background: linear-gradient(90deg, rgba(49,94,234,.18), rgba(110,93,246,.44), rgba(240,99,112,.38)); z-index: 1; }
151
+ .roadmap-item { position: absolute; z-index: 2; width: 370px; min-height: 150px; padding: 22px var(--space-3) var(--space-3); border: 1px solid rgba(49,94,234,.18); background: rgba(255,255,255,.82); border-radius: 10px; box-shadow: 0 18px 48px rgba(30,65,130,.10); overflow: visible; }
152
+ .roadmap-item:nth-child(1) { left: 84px; top: 84px; }
153
+ .roadmap-item:nth-child(2) { left: 492px; top: 430px; }
154
+ .roadmap-item:nth-child(3) { left: 900px; top: 84px; }
155
+ .roadmap-item:nth-child(4) { right: 84px; top: 430px; }
156
+ .roadmap-connector { position: absolute; z-index: 1; width: 1px; background: rgba(49,94,234,.26); transform: translateX(-50%); }
157
+ .roadmap-connector--1 { left: 269px; top: 234px; height: 126px; }
158
+ .roadmap-connector--2 { left: 677px; top: 360px; height: 70px; }
159
+ .roadmap-connector--3 { left: 1085px; top: 234px; height: 126px; }
160
+ .roadmap-connector--4 { left: 1505px; top: 360px; height: 70px; }
161
+ .roadmap-dot { position: absolute; z-index: 3; top: 360px; width: 22px; height: 22px; border-radius: 999px; background: var(--accent-primary); box-shadow: 0 0 0 8px rgba(49,94,234,.12); transform: translate(-50%, -50%); }
162
+ .roadmap-dot--1 { left: 269px; }
163
+ .roadmap-dot--2 { left: 677px; background: var(--accent-cyan); }
164
+ .roadmap-dot--3 { left: 1085px; background: var(--accent-secondary); }
165
+ .roadmap-dot--4 { left: 1505px; background: var(--accent-coral); }
166
+ .roadmap-item p { font-size: 16px; line-height: 1.45; }
167
+
168
+ .recommendation-layout { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-4); height: 100%; min-height: 0; }
169
+ .rec-panel { padding: var(--space-4); display: flex; flex-direction: column; min-height: 0; }
170
+ .rec-panel.primary { background: linear-gradient(145deg, rgba(49,94,234,.08), rgba(255,255,255,.9)); border-color: rgba(49,94,234,.26); }
171
+ .rec-label { font-size: 14px; letter-spacing: .14em; text-transform: uppercase; color: var(--accent-primary); font-weight: 700; }
172
+ .steps { margin-top: var(--space-3); list-style: none; display: flex; flex-direction: column; gap: var(--space-2); }
173
+ .steps li { display: grid; grid-template-columns: 34px minmax(0, 1fr); gap: var(--space-2); align-items: start; }
174
+ .steps span { width: 34px; height: 34px; border-radius: 999px; display: inline-grid; place-items: center; background: var(--accent-primary); color: #fff; font-size: 16px; font-weight: 700; }
175
+ .steps p { font-size: 19px; line-height: 1.42; }
258
176
  </style>
259
177
  </head>
260
178
  <body>
261
- <section class="slide" slide-qa="false" data-slide-index="1" data-slide-role="cover">
179
+ <section class="slide" slide-qa="false" data-slide-index="1" data-slide-role="cover" data-preview-layout="cover">
262
180
  <div class="slide-canvas">
263
- <div class="page">
264
- <div class="hero" data-preview-component="hero">
265
- <img class="hero-bg" src="assets/cover-background.jpg" alt="Lucent blue glass background">
266
- <div class="hero-shade"></div>
267
- <div class="hero-content">
268
- <div class="hero-title reveal">
269
- <div class="hero-meta"><span>Client Strategy Report</span><span>2026</span><span>Confidential</span></div>
270
- <h1>Lucent Template</h1>
271
- <p style="width: 638px; max-width: 638px">一套用于客户诊断、策略建议、项目交付和商业分析的可复用报告模板。</p>
272
- </div>
181
+ <div class="hero" data-preview-component="hero">
182
+ <img class="hero-bg" src="assets/cover-background.jpg" alt="Lucent cover background">
183
+ <div class="hero-shade"></div>
184
+ <div class="hero-meta"><span>Lucent Design System</span><span>Contract Preview</span></div>
185
+ <div class="hero-content">
186
+ <div class="hero-title">
187
+ <h1>明亮、可读、证据优先的报告型 deck</h1>
188
+ <p>Preview now demonstrates grid rails, stable layout slots, component states, chart containers, and source-note behavior.</p>
273
189
  </div>
274
- <div class="page-number light" data-preview-component="page-number">01</div>
275
190
  </div>
191
+ <div class="page-number light" data-preview-component="page-number">01</div>
276
192
  </div>
277
193
  </div>
278
194
  </section>
279
195
 
280
- <section class="slide" slide-qa="false" data-slide-index="2">
196
+ <section class="slide" slide-qa="false" data-slide-index="2" data-preview-layout="toc">
281
197
  <div class="slide-canvas">
282
- <div class="page">
283
- <img class="soft-texture" src="assets/soft-texture.jpg" alt="subtle report texture">
284
- <img class="toc-orb" src="assets/toc-orb.png" alt="Lucent glass orb element">
285
- <div class="toc-wrap" data-preview-component="toc">
286
- <div class="toc-title reveal">
287
- <div><p class="chapter-label">Lucent</p><h2>目录结构<br>Table of Contents</h2></div>
288
- <p class="source-note">Template preview only. Replace chapter names with client report structure.</p>
198
+ <p class="preview-label">layout fixture / toc</p>
199
+ <div class="toc-wrap" data-preview-component="toc">
200
+ <div class="toc-title">
201
+ <div>
202
+ <p class="eyebrow">Agenda</p>
203
+ <h2>从叙事到证据,再到行动</h2>
289
204
  </div>
290
- <ol class="toc-list reveal">
291
- <li><span>01</span><strong>Executive Summary<em>关键结论与管理层摘要</em></strong></li>
292
- <li><span>02</span><strong>Diagnosis<em>现状、问题与机会判断</em></strong></li>
293
- <li><span>03</span><strong>Evidence &amp; Options<em>数据、方案与优先级</em></strong></li>
294
- <li><span>04</span><strong>Roadmap<em>实施路径与下一步行动</em></strong></li>
295
- </ol>
205
+ <p>TOC uses a two-zone rail: title and numbered agenda stay aligned to the same report rhythm.</p>
296
206
  </div>
297
- <div class="page-number">02</div>
207
+ <ol class="toc-list">
208
+ <li><span>01</span><div><strong>Context</strong><em>为什么现在需要重建增长叙事</em></div></li>
209
+ <li><span>02</span><div><strong>Evidence</strong><em>哪些信号支持优先级变化</em></div></li>
210
+ <li><span>03</span><div><strong>Decision</strong><em>试点路径、指标和下一步</em></div></li>
211
+ </ol>
212
+ <img class="toc-orb" src="assets/toc-orb.png" alt="">
298
213
  </div>
214
+ <div class="page-number">02</div>
299
215
  </div>
300
216
  </section>
301
217
 
302
- <section class="slide" slide-qa="true" data-slide-index="3">
218
+ <section class="slide" slide-qa="true" data-slide-index="3" data-preview-layout="report-story">
303
219
  <div class="slide-canvas">
304
- <div class="page report-page">
305
- <div class="report-header">
306
- <p class="chapter-label">02 / Market Diagnosis</p>
307
- <div class="report-title"><h2>增长问题不是单点流量,而是认知、渠道与转化链路同时失衡</h2></div>
308
- </div>
309
- <div class="content story-layout">
310
- <div class="story-copy reveal" data-preview-component="text-panel">
311
- <h3>核心判断</h3>
312
- <p>这类正文页用于放一段完整的说明文字,配合 bullet points 和右侧图片。背景仍然保持白色阅读底,但边角加入光斑,让页面不再像空白文档。</p>
313
- <ul class="bullet-list">
314
- <li>正文可以承载客户背景、诊断解释或方法说明。</li>
315
- <li>bullet point 用来提炼关键动作、证据或约束。</li>
316
- <li>图片区域可以放素材图、项目截图、案例图或客户材料。</li>
317
- </ul>
318
- </div>
319
- <div class="story-media reveal" data-preview-component="media">
320
- <img src="assets/report-visual.jpg" alt="PNP report visual" data-preview-component="brand-watermark">
220
+ <div class="page report grid-page">
221
+ <p class="preview-label">layout fixture / report-story</p>
222
+ <div class="grid-overlay" aria-hidden="true"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div>
223
+ <header class="report-header">
224
+ <div class="report-title"><p class="eyebrow">Mixed-language narrative</p><h2>核心判断必须先被读懂,证据视觉随后解释边界</h2></div>
225
+ <img class="brand-watermark" src="assets/report-visual.jpg" alt="Lucent mark" data-preview-component="brand-watermark">
226
+ </header>
227
+ <main class="slide-grid">
228
+ <div class="report-story-grid">
229
+ <div class="text-panel story-copy" data-preview-component="text-panel">
230
+ <h3>Slide-level claim remains outside the card</h3>
231
+ <p>Lucent keeps the page claim in the header, while body modules explain context, caveats, and implications. 中文段落与 English body copy share the same line-height and spacing rhythm.</p>
232
+ <ul class="steps" style="margin-top:24px;">
233
+ <li><span>1</span><p>Use the left slot for reasoning and caveats.</p></li>
234
+ <li><span>2</span><p>Use the right slot for readable evidence media.</p></li>
235
+ </ul>
236
+ <p class="source-note">Source note: preview fixture only; source text remains small, readable, and inside the safe area.</p>
237
+ </div>
238
+ <div class="story-media" data-preview-component="media">
239
+ <div class="media-frame"><img src="assets/report-visual.jpg" alt="Report visual sample"></div>
240
+ <p class="source-note">Media usage: supporting image, screenshot, or report visual; not a decorative hero.</p>
241
+ </div>
321
242
  </div>
322
- </div>
243
+ </main>
323
244
  <div class="page-number">03</div>
324
245
  </div>
325
246
  </div>
326
247
  </section>
327
248
 
328
- <section class="slide" slide-qa="false" data-slide-index="4">
249
+ <section class="slide" slide-qa="true" data-slide-index="4" data-preview-layout="card-grid">
329
250
  <div class="slide-canvas">
330
- <div class="page">
331
- <div class="layer-full">
332
- <div class="layer-map reveal">
333
- <div class="layer-node left" style="--layer-color:#315eea;"><span class="layer-dot"></span><p class="meta">01 / Perception</p><h3>Sense</h3><p>通过可信信号看见客户、渠道、流程与环境。</p></div>
334
- <div class="layer-node right" style="--layer-color:#18a8d8;"><span class="layer-dot"></span><p class="meta">02 / Data Context</p><h3>Contextualize</h3><p>把分散数据放回业务对象、约束与决策场景。</p></div>
335
- <div class="layer-node left" style="--layer-color:#6e5df6;"><span class="layer-dot"></span><p class="meta">03 / Decision</p><h3>Decide</h3><p>把预测、诊断和约束转成可讨论的判断选项。</p></div>
336
- <div class="layer-node right" style="--layer-color:#f06370;"><span class="layer-dot"></span><p class="meta">04 / Execution</p><h3>Act</h3><p>让系统、人员和资源围绕同一个动作协同。</p></div>
337
- </div>
338
- <div class="layer-right reveal">
339
- <p class="chapter-label">02 / Reality Map</p>
340
- <h2>Five-layer logic pages do not need a standard top title bar</h2>
341
- <p class="layer-right-copy">这类页面把框架图本身当成主角。左侧纵轴图占满页面,右侧承担标题、解释和表格,整体比标准正文页更自由,也更像一张真正的咨询报告章节页。</p>
342
- <div class="layer-table">
343
- <table>
344
- <thead><tr><th>Layer</th><th>Current-State Question</th></tr></thead>
345
- <tbody>
346
- <tr><td class="positive">Sense</td><td>客户现实是否能变成可信信号?</td></tr>
347
- <tr><td>Contextualize</td><td>数据是否承载共同业务含义?</td></tr>
348
- <tr><td>Decide</td><td>洞察是否能变成管理选择?</td></tr>
349
- <tr><td class="warning">Act</td><td>决策是否能进入协同执行?</td></tr>
350
- <tr><td>Learn</td><td>结果是否能改进下一轮行动?</td></tr>
351
- </tbody>
352
- </table>
353
- </div>
251
+ <div class="page report grid-page">
252
+ <p class="preview-label">layout fixture / card-grid + dense state</p>
253
+ <header class="report-header">
254
+ <div class="report-title"><p class="eyebrow">Dense synthesis</p><h2>三张卡片表达一组洞察,而不是三个互不相干的装饰块</h2></div>
255
+ <img class="brand-watermark" src="assets/report-visual.jpg" alt="Lucent mark">
256
+ </header>
257
+ <main class="slide-grid">
258
+ <div class="card-grid">
259
+ <article class="insight-card featured" data-preview-component="box">
260
+ <div class="card-num">01</div>
261
+ <h3>Strategic signal</h3>
262
+ <p>购买理由从“功能兴趣”转向“路径、收益、风险”的组合判断。</p>
263
+ <div class="chip-row"><span class="chip">ICP fit</span><span class="chip">90d pilot</span><span class="chip">Proof gap</span></div>
264
+ </article>
265
+ <article class="insight-card">
266
+ <div class="card-num">02</div>
267
+ <h3>Operating gap</h3>
268
+ <p>现有内容资产不足以支撑复杂购买委员会的连续评估。</p>
269
+ <div class="stat-card" data-preview-component="stat-card"><div class="stat-value">3x</div><p>More proof points needed per buyer role.</p></div>
270
+ </article>
271
+ <article class="insight-card">
272
+ <div class="card-num">03</div>
273
+ <h3>Priority move</h3>
274
+ <p>先统一叙事主线,再重排渠道资源,避免把症状当成策略。</p>
275
+ <div class="chip-row"><span class="chip">Narrative</span><span class="chip">Evidence</span><span class="chip">Channel</span></div>
276
+ </article>
354
277
  </div>
355
- </div>
278
+ </main>
356
279
  <div class="page-number">04</div>
357
280
  </div>
358
281
  </div>
359
282
  </section>
360
283
 
361
- <section class="slide" slide-qa="false" data-slide-index="5">
284
+ <section class="slide" slide-qa="true" data-slide-index="5" data-preview-layout="chart-with-takeaways">
362
285
  <div class="slide-canvas">
363
- <div class="page report-page">
364
- <div class="report-header">
365
- <p class="chapter-label">02 / Narrative System</p>
366
- <div class="report-title"><h2>先讲清业务场景,再拆解响应机制与管理动作</h2></div>
367
- </div>
368
- <div class="content narrative-page">
369
- <div class="narrative-intro reveal">
370
- <p>当一个业务机会同时牵动交付、质量和资源约束时,报告页需要先把冲突讲清楚,再把系统响应、管理判断和后续动作拆成可执行的模块。</p>
286
+ <div class="page report grid-page">
287
+ <p class="preview-label">layout fixture / chart-with-takeaways</p>
288
+ <header class="report-header">
289
+ <div class="report-title"><p class="eyebrow">Chart container</p><h2>数据图表占据稳定区域,解释卡片承接读法和决策含义</h2></div>
290
+ <img class="brand-watermark" src="assets/report-visual.jpg" alt="Lucent mark">
291
+ </header>
292
+ <main class="slide-grid">
293
+ <div class="chart-layout">
294
+ <section class="echart-panel" data-preview-component="echart-panel">
295
+ <div class="chart-header"><h3>Pipeline quality index</h3><p>Transparent chart background, explicit axis colors, fixed container height.</p></div>
296
+ <div id="channelChart" class="echart-container"></div>
297
+ </section>
298
+ <aside class="takeaway-col">
299
+ <div class="takeaway"><h4>Read first</h4><p>New-channel quality improves only after proof assets are introduced.</p></div>
300
+ <div class="takeaway coral"><h4>Watch-out</h4><p>CAC pressure rises before conversion lift appears, so the pilot needs guardrail metrics.</p></div>
301
+ <p class="source-note">Source note: example data for design preview, not user evidence.</p>
302
+ </aside>
371
303
  </div>
372
- <div class="module-board reveal">
373
- <div class="setup-stack">
374
- <div class="setup-card"><h4>Story setup</h4><p>一个高优先级机会出现,但组织同时面对时间、质量和资源约束。</p></div>
375
- <div class="setup-card"><h4>Operational conflict</h4><p>理想路径被占用,关键材料延迟,改序可能带来额外风险。</p></div>
376
- <div class="setup-card"><h4>Management trade-off</h4><p>机会是否值得重排资源,需要被快速解释和批准。</p></div>
377
- </div>
378
- <div class="process-panel">
379
- <h3>How the Response Works</h3>
380
- <p>中间流程先交代响应逻辑:从信号进入系统,到形成选项、派发动作,再把执行结果沉淀为下一轮规则。</p>
381
- <div class="process-grid">
382
- <div class="process-card" style="--step-color:#315eea;"><p class="meta">1 / Sense</p><h4>Signals captured</h4><p>订单、库存、交付和约束被看见。</p></div>
383
- <div class="process-card" style="--step-color:#18a8d8;"><p class="meta">2 / Context</p><h4>Context built</h4><p>把信号连接到客户、产品和资源。</p></div>
384
- <div class="process-card" style="--step-color:#18a8d8;"><p class="meta">3 / Decide</p><h4>Options simulated</h4><p>比较收益、风险和执行成本。</p></div>
385
- <div class="process-card" style="--step-color:#f06370;"><p class="meta">4 / Act</p><h4>Work routed</h4><p>触发责任人、系统任务和审批。</p></div>
386
- <div class="process-card" style="--step-color:#6e5df6;"><p class="meta">5 / Learn</p><h4>Loop improves</h4><p>反馈进入下一轮规则和模型。</p></div>
387
- </div>
388
- <div class="takeaway-band"><strong>Simple takeaway:</strong> 人判断例外,系统协调响应,组织从结果中学习。</div>
389
- </div>
390
- </div>
391
- </div>
304
+ </main>
392
305
  <div class="page-number">05</div>
393
306
  </div>
394
307
  </div>
395
308
  </section>
396
309
 
397
- <section class="slide" slide-qa="false" data-slide-index="6">
310
+ <section class="slide" slide-qa="true" data-slide-index="6" data-preview-layout="sankey">
398
311
  <div class="slide-canvas">
399
- <div class="page report-page">
400
- <div class="report-header">
401
- <p class="chapter-label">02 / Insight Cards</p>
402
- <div class="report-title"><h2>三类洞察卡片用于承载判断、证据与管理动作</h2></div>
403
- </div>
404
- <div class="content card-grid">
405
- <div class="insight-card featured reveal" data-preview-component="box" style="--card-bg: url('assets/card-lens.jpg');"><div><div class="card-num">01</div><p class="card-tag">Strategic signal</p><h3>购买理由更具体</h3><p>收益、风险、路径。</p></div><div class="mini-mosaic"><span class="mini-chip">3x questions</span><span class="mini-chip">90d pilot</span></div></div>
406
- <div class="insight-card lensed reveal" data-preview-component="media" style="--card-bg: url('assets/card-lens.jpg');"><div><div class="card-num">02</div><p class="card-tag">Operating gap</p><h3>内容资产不足</h3></div><div class="mini-mosaic"><span class="mini-chip">Role</span><span class="mini-chip">Scene</span><span class="mini-chip">Proof</span><span class="mini-chip">Action</span></div></div>
407
- <div class="insight-card reveal"><div><div class="card-num">03</div><p class="card-tag">Priority move</p><h3>统一叙事主线</h3><p>再重排渠道资源。</p></div><div class="stat-card" data-preview-component="stat-card"><div class="stat-value" style="color:var(--accent-coral);">90d</div><p>第一轮验证周期。</p></div></div>
408
- </div>
312
+ <div class="page report grid-page">
313
+ <p class="preview-label">layout fixture / sankey</p>
314
+ <header class="report-header">
315
+ <div class="report-title"><p class="eyebrow">Flow evidence</p><h2>Sankey 保持宽图区域,右侧只解释路径含义和 caveat</h2></div>
316
+ <img class="brand-watermark" src="assets/report-visual.jpg" alt="Lucent mark">
317
+ </header>
318
+ <main class="slide-grid">
319
+ <div class="sankey-layout">
320
+ <section class="echart-panel">
321
+ <div class="chart-header"><h3>Audience path map</h3><p>Use ECharts for flow diagrams; do not fake data flow with CSS divs.</p></div>
322
+ <div id="sankeyChart" class="echart-container"></div>
323
+ </section>
324
+ <aside class="takeaway-col">
325
+ <div class="takeaway"><h4>Implication</h4><p>Most evaluation friction sits between initial interest and proof review.</p></div>
326
+ <div class="takeaway"><h4>Boundary</h4><p>Preview labels are illustrative; real decks must preserve source and unsupported scope.</p></div>
327
+ </aside>
328
+ </div>
329
+ </main>
409
330
  <div class="page-number">06</div>
410
331
  </div>
411
332
  </div>
412
333
  </section>
413
334
 
414
- <section class="slide" slide-qa="true" data-slide-index="7">
335
+ <section class="slide" slide-qa="true" data-slide-index="7" data-preview-layout="table">
415
336
  <div class="slide-canvas">
416
- <div class="page report-page">
417
- <div class="report-header">
418
- <p class="chapter-label">03 / Evidence</p>
419
- <div class="report-title"><h2>图表页把趋势留给图,把结论留给右侧解释栏</h2></div>
420
- </div>
421
- <div class="content chart-layout">
422
- <div class="echart-panel reveal" data-preview-component="echart-panel">
423
- <div class="chart-header"><h3>Channel Contribution Index</h3><p>Indexed performance by channel, 2024-2026</p></div>
424
- <div id="channelChart" class="echart-container"></div>
425
- <p class="source-note">Source: illustrative template data; replace with client source notes.</p>
426
- </div>
427
- <div class="takeaway-col reveal">
428
- <div class="takeaway"><h4>核心渠道仍然有效</h4><p>主渠道增长放缓但没有失效,问题更多来自新增触点与转化内容之间的断层。</p></div>
429
- <div class="takeaway"><h4>新增渠道需要证据资产</h4><p>渠道投入要和场景化材料同步设计,否则流量质量难以转化为销售机会。</p></div>
430
- <div class="takeaway coral"><h4>风险提示</h4><p>如果继续只优化投放,不重建叙事和证据,获客成本可能继续抬升。</p></div>
431
- </div>
432
- </div>
337
+ <div class="page report grid-page">
338
+ <p class="preview-label">layout fixture / table</p>
339
+ <header class="report-header">
340
+ <div class="report-title"><p class="eyebrow">Tabular evidence</p><h2>表格页优先保证列对齐、数字可读和 source note 不被挤出安全区</h2></div>
341
+ <img class="brand-watermark" src="assets/report-visual.jpg" alt="Lucent mark">
342
+ </header>
343
+ <main class="slide-grid">
344
+ <section class="table-panel" data-preview-component="data-table">
345
+ <h3>Pilot scorecard fixture</h3>
346
+ <table>
347
+ <thead><tr><th>Workstream</th><th>Baseline</th><th>Target</th><th>Risk</th></tr></thead>
348
+ <tbody>
349
+ <tr><td>核心客群叙事</td><td>Fragmented</td><td class="positive">One story spine</td><td>Message drift</td></tr>
350
+ <tr><td>Evidence asset depth</td><td>4 proof points</td><td class="positive">12 proof points</td><td>Source gaps</td></tr>
351
+ <tr><td>Channel test rhythm</td><td>Monthly</td><td>Biweekly</td><td class="warning">Ops load</td></tr>
352
+ <tr><td>Decision review</td><td>Ad hoc</td><td class="positive">90d gate</td><td>Metric noise</td></tr>
353
+ </tbody>
354
+ </table>
355
+ <p class="source-note">Source note: dense tables keep numeric columns right-aligned and notes inside the grid-safe footer.</p>
356
+ </section>
357
+ </main>
433
358
  <div class="page-number">07</div>
434
359
  </div>
435
360
  </div>
436
361
  </section>
437
362
 
438
- <section class="slide" slide-qa="true" data-slide-index="8">
363
+ <section class="slide" slide-qa="true" data-slide-index="8" data-preview-layout="roadmap">
439
364
  <div class="slide-canvas">
440
- <div class="page report-page">
441
- <img class="soft-texture" src="assets/soft-texture.jpg" alt="subtle report texture">
442
- <div class="report-header">
443
- <p class="chapter-label">03 / Sankey Flow</p>
444
- <div class="report-title"><h2>Sankey 图适合展示线索、预算、内容或用户路径如何在系统中流动</h2></div>
445
- </div>
446
- <div class="content sankey-layout">
447
- <div class="echart-panel reveal" data-preview-component="echart-panel">
448
- <div class="chart-header"><h3>Demand-to-Revenue Flow</h3><p>Illustrative Sankey structure for report templates</p></div>
449
- <div id="sankeyChart" class="echart-container"></div>
450
- <p class="source-note">Source: illustrative template data; replace with client funnel, budget, or journey data.</p>
451
- </div>
452
- <div class="takeaway-col reveal">
453
- <div class="takeaway glass"><h4>看清流量不是终点</h4><p>同样的输入会在不同解释、内容和销售节点发生损耗,Sankey 能把损耗位置讲清楚。</p></div>
454
- <div class="takeaway glass"><h4>适合多元报告场景</h4><p>可以改成预算流、线索流、用户旅程、组织协作流或内容分发路径。</p></div>
455
- <div class="takeaway coral"><h4>设计重点</h4><p>右侧保留解释栏,避免图本身太复杂而失去管理含义。</p></div>
456
- </div>
457
- </div>
365
+ <div class="page report grid-page">
366
+ <p class="preview-label">layout fixture / roadmap</p>
367
+ <header class="report-header">
368
+ <div class="report-title"><p class="eyebrow">Operating sequence</p><h2>路线图使用横向时间轴,阶段卡片交替但仍保持统一基线节奏</h2></div>
369
+ <img class="brand-watermark" src="assets/report-visual.jpg" alt="Lucent mark">
370
+ </header>
371
+ <main class="slide-grid">
372
+ <section class="roadmap" data-preview-component="roadmap-horizontal">
373
+ <article class="roadmap-item"><h3>Week 1-2</h3><p>Define ICP, audience, and success metrics.</p></article>
374
+ <article class="roadmap-item"><h3>Week 3-5</h3><p>Build proof assets and map unsupported claims.</p></article>
375
+ <article class="roadmap-item"><h3>Week 6-9</h3><p>Run channel tests with sourced messaging.</p></article>
376
+ <article class="roadmap-item"><h3>Week 10-12</h3><p>Review evidence, decide whether to scale.</p></article>
377
+ <span class="roadmap-connector roadmap-connector--1" aria-hidden="true"></span>
378
+ <span class="roadmap-connector roadmap-connector--2" aria-hidden="true"></span>
379
+ <span class="roadmap-connector roadmap-connector--3" aria-hidden="true"></span>
380
+ <span class="roadmap-connector roadmap-connector--4" aria-hidden="true"></span>
381
+ <span class="roadmap-dot roadmap-dot--1" aria-hidden="true"></span>
382
+ <span class="roadmap-dot roadmap-dot--2" aria-hidden="true"></span>
383
+ <span class="roadmap-dot roadmap-dot--3" aria-hidden="true"></span>
384
+ <span class="roadmap-dot roadmap-dot--4" aria-hidden="true"></span>
385
+ </section>
386
+ </main>
458
387
  <div class="page-number">08</div>
459
388
  </div>
460
389
  </div>
461
390
  </section>
462
391
 
463
- <section class="slide" slide-qa="true" data-slide-index="9">
392
+ <section class="slide" slide-qa="true" data-slide-index="9" data-preview-layout="recommendation">
464
393
  <div class="slide-canvas">
465
- <div class="page report-page">
466
- <div class="report-header">
467
- <p class="chapter-label">03 / Data Table</p>
468
- <div class="report-title"><h2>表格页适合把判断拆成指标、状态与管理含义</h2></div>
469
- </div>
470
- <div class="content">
471
- <div class="table-panel reveal" data-preview-component="data-table">
472
- <table>
473
- <thead><tr><th>Workstream</th><th>Current</th><th>Target</th><th>Gap</th><th>Priority</th></tr></thead>
474
- <tbody>
475
- <tr><td>Value proposition clarity</td><td>Medium</td><td>High</td><td class="warning">Large</td><td class="positive">P1</td></tr>
476
- <tr><td>Channel efficiency</td><td>Stable</td><td>Improving</td><td>Medium</td><td>P2</td></tr>
477
- <tr><td>Sales evidence assets</td><td>Low</td><td>High</td><td class="warning">Large</td><td class="positive">P1</td></tr>
478
- <tr><td>Operating feedback loop</td><td>Slow</td><td>Bi-weekly</td><td>Medium</td><td>P2</td></tr>
479
- <tr><td>Executive reporting cadence</td><td>Ad hoc</td><td>Monthly</td><td>Small</td><td>P3</td></tr>
480
- </tbody>
481
- </table>
482
- <div style="margin-top:auto; display:grid; grid-template-columns: 1fr 1fr; gap:28px; padding-top:30px;">
483
- <div class="box"><h4>读取方式</h4><p>表格不是堆数据,而是把每一项转成可以管理的差距和优先级。</p></div>
484
- <p class="source-note">Note: This table uses illustrative values for template demonstration. Replace rows, metric definitions, and source notes in real reports.</p>
485
- </div>
394
+ <div class="page report grid-page">
395
+ <p class="preview-label">layout fixture / recommendation</p>
396
+ <header class="report-header">
397
+ <div class="report-title"><p class="eyebrow">Decision ask</p><h2>建议页把 recommendation、rationale、next steps 明确分栏</h2></div>
398
+ <img class="brand-watermark" src="assets/report-visual.jpg" alt="Lucent mark">
399
+ </header>
400
+ <main class="slide-grid">
401
+ <div class="recommendation-layout">
402
+ <section class="rec-panel primary"><p class="rec-label">Recommendation</p><h3>启动 90 天叙事与证据重建试点</h3><p>选择一个重点客群和两个渠道作为验证范围,避免一次性重构全部市场动作。</p><div class="stat-card" style="margin-top:auto;"><div class="stat-value">90</div><p>days to validate the first operating loop.</p></div></section>
403
+ <section class="rec-panel"><p class="rec-label">Rationale</p><h3>为什么先试点</h3><p>当前最大风险不是渠道不足,而是价值叙事和证据链无法支撑复杂购买决策。</p><p class="source-note" style="margin-top:auto;">Decision boundary: preview content only.</p></section>
404
+ <section class="rec-panel" data-preview-component="steps"><p class="rec-label">Next steps</p><h3>下一步动作</h3><ol class="steps"><li><span>1</span><p>确认试点客群和 guardrail metrics。</p></li><li><span>2</span><p>梳理 claim、evidence、gap 和 source notes。</p></li><li><span>3</span><p>启动双周复盘并准备 scale/no-scale decision。</p></li></ol></section>
486
405
  </div>
487
- </div>
406
+ </main>
488
407
  <div class="page-number">09</div>
489
408
  </div>
490
409
  </div>
491
410
  </section>
492
411
 
493
- <section class="slide" slide-qa="true" data-slide-index="10">
412
+ <section class="slide" slide-qa="false" data-slide-index="10" data-slide-role="closing" data-preview-layout="closing">
494
413
  <div class="slide-canvas">
495
- <div class="page report-page">
496
- <div class="report-header">
497
- <p class="chapter-label">04 / Roadmap</p>
498
- <div class="report-title"><h2>路线图页用阶段推进代替复杂流程图</h2></div>
499
- </div>
500
- <div class="content">
501
- <div class="roadmap reveal" data-preview-component="roadmap-horizontal">
502
- <div class="roadmap-item"><div class="roadmap-dot"></div><p class="meta">Phase 01 / Weeks 1-2</p><h3>统一诊断口径</h3><p>整理客户目标、业务约束、核心假设和现有证据,形成问题地图。</p></div>
503
- <div class="roadmap-item"><div class="roadmap-dot"></div><p class="meta">Phase 02 / Weeks 3-5</p><h3>重建价值叙事</h3><p>拆解角色、场景和购买理由,定义统一但可分发的内容模块。</p></div>
504
- <div class="roadmap-item"><div class="roadmap-dot"></div><p class="meta">Phase 03 / Weeks 6-9</p><h3>渠道试点验证</h3><p>选择两个重点渠道,测试新叙事、新证据和转化动作的组合效果。</p></div>
505
- <div class="roadmap-item"><div class="roadmap-dot"></div><p class="meta">Phase 04 / Weeks 10-12</p><h3>复盘与扩展</h3><p>把验证结果转成组织节奏、指标看板和下一轮资源配置建议。</p></div>
414
+ <div class="hero light" data-preview-component="hero">
415
+ <img class="hero-bg" src="assets/closing-background.jpg" alt="Lucent closing background">
416
+ <div class="hero-shade light"></div>
417
+ <div class="hero-content">
418
+ <div class="hero-title">
419
+ <h1>Design contract first. Visual polish follows.</h1>
420
+ <p>Lucent remains luminous, but the preview now proves layout, component, and evidence-reading behavior.</p>
506
421
  </div>
507
422
  </div>
508
423
  <div class="page-number">10</div>
@@ -510,103 +425,105 @@
510
425
  </div>
511
426
  </section>
512
427
 
513
- <section class="slide" slide-qa="true" data-slide-index="11">
514
- <div class="slide-canvas">
515
- <div class="page report-page">
516
- <img class="soft-texture" src="assets/soft-texture.jpg" alt="subtle report texture">
517
- <div class="report-header">
518
- <p class="chapter-label">04 / Recommendation</p>
519
- <div class="report-title"><h2>建议页把结论、理由和下一步动作放在同一张页面上</h2></div>
520
- </div>
521
- <div class="content recommendation-layout">
522
- <div class="rec-panel primary reveal" data-preview-component="box"><div><p class="rec-label">Recommendation</p><h3>先做 90 天叙事与证据重建试点</h3><p>以一个重点客群和两个重点渠道作为验证范围,避免一次性重构所有市场动作。</p></div><div class="stat-card"><div class="stat-value">90</div><p>days to validate first operating loop</p></div></div>
523
- <div class="rec-panel reveal"><div><p class="rec-label">Rationale</p><h3>投入前先降低策略不确定性</h3><p>当前最大风险不是单个渠道选择,而是购买理由和证据资产不匹配。</p></div><ul class="bullet-list"><li>减少无效投放。</li><li>提升销售解释效率。</li><li>建立可复用内容模块。</li></ul></div>
524
- <div class="rec-panel reveal" data-preview-component="steps"><div><p class="rec-label">Next Steps</p><h3>下一步动作</h3></div><ol class="steps"><li><span>1</span><p>确认试点客群和成功指标。</p></li><li><span>2</span><p>完成价值主张与证据资产梳理。</p></li><li><span>3</span><p>启动渠道测试并按双周复盘。</p></li></ol></div>
525
- </div>
526
- <div class="page-number">11</div>
527
- </div>
528
- </div>
529
- </section>
530
-
531
- <section class="slide" slide-qa="false" data-slide-index="12" data-slide-role="closing">
532
- <div class="slide-canvas">
533
- <div class="page">
534
- <div class="hero closing">
535
- <img class="hero-bg" src="assets/closing-background.jpg" alt="closing background">
536
- <div class="hero-shade"></div>
537
- <div class="hero-content">
538
- <div class="hero-title reveal"><h1>Thank you</h1><p>Lucent keeps the report clear, structured, and quietly branded.</p></div>
539
- </div>
540
- <div class="page-number light">12</div>
541
- </div>
542
- </div>
543
- </div>
544
- </section>
545
-
546
428
  <script>
547
429
  class SlidePresentation {
548
- constructor() { this.slides = document.querySelectorAll('.slide'); this.currentSlide = 0; this.setupScaling(); this.setupIntersectionObserver(); this.setupKeyboardNav(); this.setupTouchNav(); this.setupMouseWheel(); this.setupCharts(); }
549
- setupScaling() { const canvases = document.querySelectorAll('.slide-canvas'); const update = () => { const scale = Math.min(window.innerWidth / 1920, window.innerHeight / 1080); canvases.forEach((canvas) => { canvas.style.transform = `scale(${scale})`; }); }; window.addEventListener('resize', update); update(); }
550
- setupIntersectionObserver() { const observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) entry.target.querySelectorAll('.reveal').forEach((el) => el.classList.add('visible')); }); }, { threshold: .2 }); this.slides.forEach((slide) => observer.observe(slide)); }
551
- setupKeyboardNav() { document.addEventListener('keydown', (event) => { if (['ArrowDown','ArrowRight',' ','PageDown'].includes(event.key)) { event.preventDefault(); this.goTo(this.currentSlide + 1); } else if (['ArrowUp','ArrowLeft','PageUp'].includes(event.key)) { event.preventDefault(); this.goTo(this.currentSlide - 1); } }); }
552
- setupTouchNav() { let startY = 0; document.addEventListener('touchstart', (event) => { startY = event.touches[0].clientY; }, { passive: true }); document.addEventListener('touchend', (event) => { const deltaY = startY - event.changedTouches[0].clientY; if (Math.abs(deltaY) > 40) this.goTo(this.currentSlide + (deltaY > 0 ? 1 : -1)); }, { passive: true }); }
553
- setupMouseWheel() { let last = 0; document.addEventListener('wheel', (event) => { const now = Date.now(); if (now - last < 800) return; last = now; this.goTo(this.currentSlide + (event.deltaY > 0 ? 1 : -1)); }, { passive: true }); }
554
- goTo(index) { const clamped = Math.max(0, Math.min(this.slides.length - 1, index)); this.slides[clamped].scrollIntoView({ behavior: 'smooth' }); this.currentSlide = clamped; }
555
- setupCharts() {
556
- if (!window.echarts) return;
557
- const charts = [];
558
- const channelEl = document.getElementById('channelChart');
559
- if (channelEl) {
560
- const channelChart = echarts.init(channelEl, null, { renderer: 'svg' });
561
- channelChart.setOption({ color: ['#315eea', '#6e5df6', '#f06370'], grid: { left: 54, right: 24, top: 34, bottom: 44 }, tooltip: { trigger: 'axis' }, legend: { bottom: 0, textStyle: { color: '#42526a', fontSize: 16 } }, xAxis: { type: 'category', data: ['Q1','Q2','Q3','Q4','Q5','Q6'], axisLine: { lineStyle: { color: 'rgba(44,70,108,.24)' } }, axisLabel: { color: '#7b8aa0', fontSize: 15 } }, yAxis: { type: 'value', axisLine: { show: false }, splitLine: { lineStyle: { color: 'rgba(44,70,108,.12)' } }, axisLabel: { color: '#7b8aa0', fontSize: 15 } }, series: [{ name: 'Core channel', type: 'line', smooth: true, data: [100,108,116,119,121,124], lineStyle: { width: 5 }, symbolSize: 9 }, { name: 'New channel', type: 'line', smooth: true, data: [100,96,102,112,130,148], lineStyle: { width: 5 }, symbolSize: 9 }, { name: 'CAC pressure', type: 'bar', data: [100,112,126,139,144,151], barWidth: 34 }] });
562
- charts.push(channelChart);
563
- }
564
- const sankeyEl = document.getElementById('sankeyChart');
565
- if (sankeyEl) {
566
- const sankeyChart = echarts.init(sankeyEl, null, { renderer: 'svg' });
567
- sankeyChart.setOption({
568
- color: ['#315eea', '#6e5df6', '#18a8d8', '#f06370', '#8aa4ff', '#9edcf0'],
569
- tooltip: { trigger: 'item', triggerOn: 'mousemove' },
570
- series: [{
571
- type: 'sankey',
572
- left: 22,
573
- right: 150,
574
- top: 28,
575
- bottom: 24,
576
- nodeWidth: 22,
577
- nodeGap: 18,
578
- draggable: false,
579
- emphasis: { focus: 'adjacency' },
580
- label: { color: '#101a2b', fontSize: 17, fontWeight: 700 },
581
- lineStyle: { color: 'gradient', curveness: .54, opacity: .42 },
582
- data: [
583
- { name: 'Awareness' }, { name: 'Organic' }, { name: 'Paid' }, { name: 'Events' },
584
- { name: 'Qualified demand' }, { name: 'Sales proof' }, { name: 'Pilot' },
585
- { name: 'Revenue' }, { name: 'Lost / delay' }
586
- ],
587
- links: [
588
- { source: 'Awareness', target: 'Organic', value: 32 },
589
- { source: 'Awareness', target: 'Paid', value: 26 },
590
- { source: 'Awareness', target: 'Events', value: 18 },
591
- { source: 'Organic', target: 'Qualified demand', value: 22 },
592
- { source: 'Paid', target: 'Qualified demand', value: 14 },
593
- { source: 'Events', target: 'Qualified demand', value: 12 },
594
- { source: 'Paid', target: 'Lost / delay', value: 12 },
595
- { source: 'Qualified demand', target: 'Sales proof', value: 33 },
596
- { source: 'Qualified demand', target: 'Lost / delay', value: 15 },
597
- { source: 'Sales proof', target: 'Pilot', value: 24 },
598
- { source: 'Sales proof', target: 'Lost / delay', value: 9 },
599
- { source: 'Pilot', target: 'Revenue', value: 18 },
600
- { source: 'Pilot', target: 'Lost / delay', value: 6 }
601
- ]
602
- }]
603
- });
604
- charts.push(sankeyChart);
605
- }
606
- window.addEventListener('resize', () => charts.forEach((chart) => chart.resize()));
430
+ constructor() {
431
+ this.slides = document.querySelectorAll(".slide");
432
+ this.currentSlide = 0;
433
+ this.setupScaling();
434
+ this.setupKeyboardNav();
435
+ }
436
+ setupScaling() {
437
+ const canvases = document.querySelectorAll(".slide-canvas");
438
+ const update = () => {
439
+ const scale = Math.min(window.innerWidth / 1920, window.innerHeight / 1080);
440
+ canvases.forEach((canvas) => { canvas.style.transform = `scale(${scale})`; });
441
+ };
442
+ window.addEventListener("resize", update);
443
+ update();
444
+ }
445
+ setupKeyboardNav() {
446
+ document.addEventListener("keydown", (event) => {
447
+ if (["ArrowDown", "ArrowRight", " ", "PageDown"].includes(event.key)) {
448
+ event.preventDefault();
449
+ this.goTo(this.currentSlide + 1);
450
+ } else if (["ArrowUp", "ArrowLeft", "PageUp"].includes(event.key)) {
451
+ event.preventDefault();
452
+ this.goTo(this.currentSlide - 1);
453
+ }
454
+ });
455
+ }
456
+ goTo(index) {
457
+ const clamped = Math.max(0, Math.min(this.slides.length - 1, index));
458
+ this.slides[clamped].scrollIntoView({ behavior: "smooth" });
459
+ this.currentSlide = clamped;
607
460
  }
608
461
  }
609
- new SlidePresentation();
462
+
463
+ function initCharts() {
464
+ if (!window.echarts) return;
465
+ const axis = "#7b8aa0";
466
+ const grid = "rgba(44,70,108,.12)";
467
+ const channelEl = document.getElementById("channelChart");
468
+ if (channelEl) {
469
+ const chart = echarts.init(channelEl);
470
+ chart.setOption({
471
+ color: ["#315eea", "#6e5df6", "#f06370"],
472
+ backgroundColor: "transparent",
473
+ tooltip: { trigger: "axis" },
474
+ legend: { bottom: 0, textStyle: { color: axis, fontSize: 16 } },
475
+ grid: { left: 54, right: 24, top: 34, bottom: 56, containLabel: true },
476
+ xAxis: { type: "category", data: ["Q1","Q2","Q3","Q4","Q5","Q6"], axisLine: { lineStyle: { color: "rgba(44,70,108,.24)" } }, axisLabel: { color: axis, fontSize: 15 } },
477
+ yAxis: { type: "value", axisLine: { show: false }, splitLine: { lineStyle: { color: grid } }, axisLabel: { color: axis, fontSize: 15 } },
478
+ series: [
479
+ { name: "Core channel", type: "line", smooth: true, data: [100,108,116,119,121,124], lineStyle: { width: 5 }, symbolSize: 9 },
480
+ { name: "New channel", type: "line", smooth: true, data: [100,96,102,112,130,148], lineStyle: { width: 5 }, symbolSize: 9 },
481
+ { name: "CAC pressure", type: "bar", data: [100,112,126,139,144,151], barWidth: 34 }
482
+ ]
483
+ });
484
+ }
485
+ const sankeyEl = document.getElementById("sankeyChart");
486
+ if (sankeyEl) {
487
+ const chart = echarts.init(sankeyEl);
488
+ chart.setOption({
489
+ color: ["#315eea", "#6e5df6", "#18a8d8", "#f06370"],
490
+ backgroundColor: "transparent",
491
+ tooltip: { trigger: "item" },
492
+ series: [{
493
+ type: "sankey",
494
+ left: 18,
495
+ right: 28,
496
+ top: 24,
497
+ bottom: 24,
498
+ nodeGap: 18,
499
+ nodeWidth: 18,
500
+ lineStyle: { color: "gradient", curveness: .42, opacity: .28 },
501
+ label: { color: "#42526a", fontSize: 15 },
502
+ data: [
503
+ { name: "Awareness" }, { name: "Problem fit" }, { name: "Proof review" }, { name: "Security" }, { name: "Decision" }
504
+ ],
505
+ links: [
506
+ { source: "Awareness", target: "Problem fit", value: 64 },
507
+ { source: "Problem fit", target: "Proof review", value: 42 },
508
+ { source: "Proof review", target: "Security", value: 24 },
509
+ { source: "Proof review", target: "Decision", value: 18 },
510
+ { source: "Security", target: "Decision", value: 15 }
511
+ ]
512
+ }]
513
+ });
514
+ }
515
+ window.addEventListener("resize", () => {
516
+ document.querySelectorAll(".echart-container").forEach((el) => {
517
+ const instance = echarts.getInstanceByDom(el);
518
+ if (instance) instance.resize();
519
+ });
520
+ });
521
+ }
522
+
523
+ window.addEventListener("DOMContentLoaded", () => {
524
+ new SlidePresentation();
525
+ initCharts();
526
+ });
610
527
  </script>
611
528
  </body>
612
529
  </html>