@strategicnerds/slide-nerds 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/analytics.d.ts +6 -0
- package/dist/cli/commands/analytics.d.ts.map +1 -0
- package/dist/cli/commands/analytics.js +44 -0
- package/dist/cli/commands/analytics.js.map +1 -0
- package/dist/cli/commands/create.d.ts +4 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +87 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/export.d.ts +6 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +109 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +12 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/template-path.d.ts +4 -0
- package/dist/cli/template-path.d.ts.map +1 -0
- package/dist/cli/template-path.js +13 -0
- package/dist/cli/template-path.js.map +1 -0
- package/dist/runtime/export-api.d.ts +15 -0
- package/dist/runtime/export-api.d.ts.map +1 -0
- package/dist/runtime/export-api.js +21 -0
- package/dist/runtime/export-api.js.map +1 -0
- package/dist/runtime/index.d.ts +12 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/light-table.d.ts +8 -0
- package/dist/runtime/light-table.d.ts.map +1 -0
- package/dist/runtime/light-table.js +104 -0
- package/dist/runtime/light-table.js.map +1 -0
- package/dist/runtime/presenter-view.d.ts +7 -0
- package/dist/runtime/presenter-view.d.ts.map +1 -0
- package/dist/runtime/presenter-view.js +62 -0
- package/dist/runtime/presenter-view.js.map +1 -0
- package/dist/runtime/slide-context.d.ts +16 -0
- package/dist/runtime/slide-context.d.ts.map +1 -0
- package/dist/runtime/slide-context.js +18 -0
- package/dist/runtime/slide-context.js.map +1 -0
- package/dist/runtime/slide-controls.d.ts +3 -0
- package/dist/runtime/slide-controls.d.ts.map +1 -0
- package/dist/runtime/slide-controls.js +177 -0
- package/dist/runtime/slide-controls.js.map +1 -0
- package/dist/runtime/slide-dom.d.ts +17 -0
- package/dist/runtime/slide-dom.d.ts.map +1 -0
- package/dist/runtime/slide-dom.js +89 -0
- package/dist/runtime/slide-dom.js.map +1 -0
- package/dist/runtime/slide-runtime.d.ts +7 -0
- package/dist/runtime/slide-runtime.d.ts.map +1 -0
- package/dist/runtime/slide-runtime.js +125 -0
- package/dist/runtime/slide-runtime.js.map +1 -0
- package/dist/runtime/slide-shape.d.ts +21 -0
- package/dist/runtime/slide-shape.d.ts.map +1 -0
- package/dist/runtime/slide-shape.js +115 -0
- package/dist/runtime/slide-shape.js.map +1 -0
- package/dist/runtime/types.d.ts +150 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +38 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/use-presenter-mode.d.ts +14 -0
- package/dist/runtime/use-presenter-mode.d.ts.map +1 -0
- package/dist/runtime/use-presenter-mode.js +52 -0
- package/dist/runtime/use-presenter-mode.js.map +1 -0
- package/dist/runtime/use-slide-navigation.d.ts +13 -0
- package/dist/runtime/use-slide-navigation.d.ts.map +1 -0
- package/dist/runtime/use-slide-navigation.js +230 -0
- package/dist/runtime/use-slide-navigation.js.map +1 -0
- package/package.json +64 -0
- package/skills/accessibility/SKILL.md +236 -0
- package/skills/advanced-layouts/SKILL.md +429 -0
- package/skills/analytics/SKILL.md +97 -0
- package/skills/animation/SKILL.md +364 -0
- package/skills/brand/SKILL.md +200 -0
- package/skills/data-visualization/SKILL.md +533 -0
- package/skills/deck-templates/SKILL.md +93 -0
- package/skills/diagrams/SKILL.md +395 -0
- package/skills/export/SKILL.md +119 -0
- package/skills/interactive/SKILL.md +292 -0
- package/skills/layout/SKILL.md +178 -0
- package/skills/narrative-frameworks/SKILL.md +250 -0
- package/skills/react-component-embeds/SKILL.md +73 -0
- package/skills/slide-types/SKILL.md +384 -0
- package/skills/slidenerds-runtime/SKILL.md +163 -0
- package/skills/speaker-notes/SKILL.md +128 -0
- package/skills/strategic-frameworks/SKILL.md +392 -0
- package/skills/visual-design/SKILL.md +373 -0
- package/templates/analytics/custom.tsx.tmpl +20 -0
- package/templates/analytics/ga4.tsx.tmpl +15 -0
- package/templates/analytics/gtm.tsx.tmpl +9 -0
- package/templates/analytics/plausible.tsx.tmpl +10 -0
- package/templates/analytics/posthog.tsx.tmpl +14 -0
- package/templates/next-app/CLAUDE.md.tmpl +574 -0
- package/templates/next-app/README.md.tmpl +35 -0
- package/templates/next-app/app/globals.css.tmpl +274 -0
- package/templates/next-app/app/layout.tsx.tmpl +31 -0
- package/templates/next-app/app/page.tsx.tmpl +38 -0
- package/templates/next-app/brand.config.ts.tmpl +32 -0
- package/templates/next-app/package.json.tmpl +25 -0
- package/templates/next-app/postcss.config.mjs.tmpl +8 -0
- package/templates/next-app/tsconfig.json.tmpl +21 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: strategic-frameworks
|
|
3
|
+
description: SWOT, 2x2 matrix, TAM/SAM/SOM, pricing comparison, risk matrix, pyramid, and other consulting-style slide patterns
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Strategic frameworks skill
|
|
7
|
+
|
|
8
|
+
Use this skill when a slide needs a structured analytical framework. These are the standard visual formats used in consulting, board, strategy, and executive presentations. Each pattern here is a complete slide recipe using HTML/CSS and Tailwind.
|
|
9
|
+
|
|
10
|
+
## SWOT matrix
|
|
11
|
+
|
|
12
|
+
Use for: situational analysis, strategic planning, competitive assessment.
|
|
13
|
+
|
|
14
|
+
A 2x2 grid with color-coded quadrants. Strengths and opportunities are positive (accent). Weaknesses and threats are cautionary (muted).
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
<section data-slide="">
|
|
18
|
+
<div className="flex flex-col justify-center w-full min-h-screen"
|
|
19
|
+
style={{ padding: '4rem 6rem' }}>
|
|
20
|
+
<p className="section-label mb-3">Analysis</p>
|
|
21
|
+
<h2 className="text-[2.5rem] font-bold mb-10">SWOT analysis</h2>
|
|
22
|
+
<div className="grid grid-cols-2 gap-3" style={{ maxWidth: 900 }}>
|
|
23
|
+
{[
|
|
24
|
+
{ title: 'Strengths', items: ['5-minute deploys', 'Best-in-class API', '98% retention'], color: 'var(--color-accent)', bg: 'var(--color-accent-dim)' },
|
|
25
|
+
{ title: 'Weaknesses', items: ['Small sales team', 'No enterprise tier', 'US-only'], color: 'var(--color-text-secondary)', bg: 'var(--color-surface)' },
|
|
26
|
+
{ title: 'Opportunities', items: ['EU expansion', 'Partner channel', 'AI integration'], color: 'var(--color-accent)', bg: 'var(--color-accent-dim)' },
|
|
27
|
+
{ title: 'Threats', items: ['AWS building competitor', 'Price pressure', 'Talent market'], color: 'var(--color-text-secondary)', bg: 'var(--color-surface)' },
|
|
28
|
+
].map((q) => (
|
|
29
|
+
<div key={q.title} data-step="" className="step-fade rounded-xl p-5"
|
|
30
|
+
style={{ background: q.bg, border: '1px solid var(--color-border)' }}>
|
|
31
|
+
<p className="text-sm font-semibold mb-3" style={{ color: q.color }}>{q.title}</p>
|
|
32
|
+
<ul className="space-y-1.5">
|
|
33
|
+
{q.items.map((item) => (
|
|
34
|
+
<li key={item} className="text-sm" style={{ color: 'var(--color-text-secondary)' }}>
|
|
35
|
+
{item}
|
|
36
|
+
</li>
|
|
37
|
+
))}
|
|
38
|
+
</ul>
|
|
39
|
+
</div>
|
|
40
|
+
))}
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</section>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### SWOT rules
|
|
47
|
+
|
|
48
|
+
- 3-4 items per quadrant. More is noise.
|
|
49
|
+
- Strengths and Opportunities use accent color. Weaknesses and Threats use muted color.
|
|
50
|
+
- Reveal quadrants one at a time with `data-step`.
|
|
51
|
+
- Items are short phrases, not sentences.
|
|
52
|
+
|
|
53
|
+
## Generic 2x2 matrix
|
|
54
|
+
|
|
55
|
+
Use for: effort/impact analysis, urgency/importance, build vs buy.
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
<section data-slide="">
|
|
59
|
+
<div className="flex flex-col justify-center items-center w-full min-h-screen"
|
|
60
|
+
style={{ padding: '4rem 6rem' }}>
|
|
61
|
+
<h2 className="text-[2.5rem] font-bold mb-10">Prioritization matrix</h2>
|
|
62
|
+
<div className="relative" style={{ width: 600, height: 500 }}>
|
|
63
|
+
{/* Axis labels */}
|
|
64
|
+
<p className="absolute -left-16 top-1/2 -translate-y-1/2 -rotate-90 text-xs font-semibold tracking-[0.15em] uppercase"
|
|
65
|
+
style={{ color: 'var(--color-text-tertiary)' }}>Impact</p>
|
|
66
|
+
<p className="absolute bottom-[-2rem] left-1/2 -translate-x-1/2 text-xs font-semibold tracking-[0.15em] uppercase"
|
|
67
|
+
style={{ color: 'var(--color-text-tertiary)' }}>Effort</p>
|
|
68
|
+
|
|
69
|
+
{/* Grid lines */}
|
|
70
|
+
<div className="absolute left-1/2 top-0 bottom-0 w-px" style={{ background: 'var(--color-border)' }} />
|
|
71
|
+
<div className="absolute top-1/2 left-0 right-0 h-px" style={{ background: 'var(--color-border)' }} />
|
|
72
|
+
|
|
73
|
+
{/* Quadrant labels */}
|
|
74
|
+
<p className="absolute top-4 left-4 text-xs font-semibold"
|
|
75
|
+
style={{ color: 'var(--color-accent)' }}>Quick wins</p>
|
|
76
|
+
<p className="absolute top-4 right-4 text-xs font-semibold"
|
|
77
|
+
style={{ color: 'var(--color-text-tertiary)' }}>Big bets</p>
|
|
78
|
+
<p className="absolute bottom-4 left-4 text-xs font-semibold"
|
|
79
|
+
style={{ color: 'var(--color-text-tertiary)' }}>Fill-ins</p>
|
|
80
|
+
<p className="absolute bottom-4 right-4 text-xs font-semibold"
|
|
81
|
+
style={{ color: 'var(--color-text-tertiary)', opacity: 0.5 }}>Avoid</p>
|
|
82
|
+
|
|
83
|
+
{/* Positioned items */}
|
|
84
|
+
<div className="absolute" style={{ left: '15%', top: '15%' }}>
|
|
85
|
+
<div data-step="" className="step-scale-in card-surface px-3 py-1.5 text-xs font-medium"
|
|
86
|
+
style={{ border: '1px solid var(--color-accent)' }}>SSO integration</div>
|
|
87
|
+
</div>
|
|
88
|
+
<div className="absolute" style={{ left: '60%', top: '20%' }}>
|
|
89
|
+
<div data-step="" className="step-scale-in card-surface px-3 py-1.5 text-xs font-medium">EU expansion</div>
|
|
90
|
+
</div>
|
|
91
|
+
{/* More items positioned by their effort/impact coordinates */}
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</section>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 2x2 rules
|
|
98
|
+
|
|
99
|
+
- Position items as absolutely-placed elements using percentage coordinates.
|
|
100
|
+
- Use `card-surface` pills for item labels.
|
|
101
|
+
- Highlight the "Quick wins" quadrant with accent color.
|
|
102
|
+
- Axis labels on the outside edges.
|
|
103
|
+
- The quadrant lines use `var(--color-border)` at default opacity.
|
|
104
|
+
|
|
105
|
+
## TAM / SAM / SOM
|
|
106
|
+
|
|
107
|
+
Use for: market sizing in investor pitches and strategy decks.
|
|
108
|
+
|
|
109
|
+
Concentric circles with the largest (TAM) on the outside:
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
<section data-slide="">
|
|
113
|
+
<div className="flex items-center justify-center w-full min-h-screen"
|
|
114
|
+
style={{ padding: '4rem 6rem' }}>
|
|
115
|
+
<div className="flex items-center gap-16">
|
|
116
|
+
<div className="relative" style={{ width: 400, height: 400 }}>
|
|
117
|
+
{[
|
|
118
|
+
{ label: 'TAM', value: '$24B', size: 380, opacity: 0.08 },
|
|
119
|
+
{ label: 'SAM', value: '$4.8B', size: 260, opacity: 0.12 },
|
|
120
|
+
{ label: 'SOM', value: '$240M', size: 140, opacity: 0.2 },
|
|
121
|
+
].map((ring, i) => (
|
|
122
|
+
<div key={ring.label} data-step="" className="step-scale-in absolute rounded-full flex items-center justify-center"
|
|
123
|
+
style={{
|
|
124
|
+
width: ring.size,
|
|
125
|
+
height: ring.size,
|
|
126
|
+
top: (400 - ring.size) / 2,
|
|
127
|
+
left: (400 - ring.size) / 2,
|
|
128
|
+
background: `rgba(245,158,11,${ring.opacity})`,
|
|
129
|
+
border: '1px solid var(--color-accent)',
|
|
130
|
+
borderColor: `rgba(245,158,11,${ring.opacity + 0.15})`,
|
|
131
|
+
}}>
|
|
132
|
+
{i === 2 && (
|
|
133
|
+
<div className="text-center">
|
|
134
|
+
<p className="text-2xl font-bold" style={{ color: 'var(--color-accent)' }}>{ring.value}</p>
|
|
135
|
+
<p className="text-xs mt-1" style={{ color: 'var(--color-text-tertiary)' }}>{ring.label}</p>
|
|
136
|
+
</div>
|
|
137
|
+
)}
|
|
138
|
+
</div>
|
|
139
|
+
))}
|
|
140
|
+
</div>
|
|
141
|
+
<div className="space-y-6">
|
|
142
|
+
{[
|
|
143
|
+
{ label: 'TAM', value: '$24B', desc: 'Total developer tools market' },
|
|
144
|
+
{ label: 'SAM', value: '$4.8B', desc: 'Cloud deployment automation segment' },
|
|
145
|
+
{ label: 'SOM', value: '$240M', desc: 'SMB + mid-market, US + EU' },
|
|
146
|
+
].map((item) => (
|
|
147
|
+
<div key={item.label} data-step="" className="step-fade">
|
|
148
|
+
<p className="text-sm font-semibold" style={{ color: 'var(--color-accent)' }}>{item.label}: {item.value}</p>
|
|
149
|
+
<p className="text-sm" style={{ color: 'var(--color-text-secondary)' }}>{item.desc}</p>
|
|
150
|
+
</div>
|
|
151
|
+
))}
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
</section>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Pricing comparison (3-tier)
|
|
159
|
+
|
|
160
|
+
Use for: plan comparison, product editions, service tiers.
|
|
161
|
+
|
|
162
|
+
See the advanced-layouts skill for the full three-option comparison pattern. Key additions for pricing:
|
|
163
|
+
|
|
164
|
+
- Center column is taller and has an accent border.
|
|
165
|
+
- "Most popular" or "Recommended" badge on the center.
|
|
166
|
+
- Price is the largest text in each card.
|
|
167
|
+
- Feature list uses checkmarks in accent color.
|
|
168
|
+
- CTA button at the bottom of each card (optional for internal decks).
|
|
169
|
+
|
|
170
|
+
## Process chevrons
|
|
171
|
+
|
|
172
|
+
Use for: linear processes, sales stages, implementation phases.
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
<section data-slide="">
|
|
176
|
+
<div className="flex flex-col justify-center items-center w-full min-h-screen"
|
|
177
|
+
style={{ padding: '4rem 6rem' }}>
|
|
178
|
+
<h2 className="text-[2.5rem] font-bold mb-14">Sales process</h2>
|
|
179
|
+
<div className="flex items-center">
|
|
180
|
+
{['Prospect', 'Qualify', 'Demo', 'Proposal', 'Close'].map((stage, i) => (
|
|
181
|
+
<div key={stage} data-step="" className="step-fade flex items-center">
|
|
182
|
+
<div className="relative px-8 py-4 text-center"
|
|
183
|
+
style={{
|
|
184
|
+
background: i === 0 ? 'var(--color-accent)' : 'var(--color-surface)',
|
|
185
|
+
clipPath: 'polygon(0 0, calc(100% - 16px) 0, 100% 50%, calc(100% - 16px) 100%, 0 100%, 16px 50%)',
|
|
186
|
+
marginLeft: i === 0 ? 0 : -8,
|
|
187
|
+
color: i === 0 ? 'var(--color-primary)' : 'var(--color-text)',
|
|
188
|
+
}}>
|
|
189
|
+
<p className="text-sm font-semibold">{stage}</p>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
))}
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
</section>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
The first chevron is accent-colored (current stage). The rest are surface-colored. Use `clipPath: polygon()` to create the arrow shape.
|
|
199
|
+
|
|
200
|
+
## Pyramid / hierarchy
|
|
201
|
+
|
|
202
|
+
Use for: Maslow-style hierarchies, market tiers, brand pyramid.
|
|
203
|
+
|
|
204
|
+
```tsx
|
|
205
|
+
<div className="flex flex-col items-center gap-1">
|
|
206
|
+
{[
|
|
207
|
+
{ label: 'Enterprise', width: '30%' },
|
|
208
|
+
{ label: 'Mid-market', width: '50%' },
|
|
209
|
+
{ label: 'SMB', width: '70%' },
|
|
210
|
+
{ label: 'Self-serve', width: '90%' },
|
|
211
|
+
].map((tier, i) => (
|
|
212
|
+
<div key={tier.label} data-step="" className="step-fade text-center py-3 rounded-lg"
|
|
213
|
+
style={{
|
|
214
|
+
width: tier.width,
|
|
215
|
+
background: `rgba(245,158,11,${0.3 - i * 0.06})`,
|
|
216
|
+
border: '1px solid var(--color-border)',
|
|
217
|
+
}}>
|
|
218
|
+
<p className="text-sm font-semibold">{tier.label}</p>
|
|
219
|
+
</div>
|
|
220
|
+
))}
|
|
221
|
+
</div>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Pyramid rules
|
|
225
|
+
|
|
226
|
+
- 3-5 levels. More becomes illegible.
|
|
227
|
+
- Narrowest at top (highest value / smallest segment).
|
|
228
|
+
- Each level is a percentage width of its parent container.
|
|
229
|
+
- Use decreasing accent opacity from top (strongest) to bottom (lightest).
|
|
230
|
+
|
|
231
|
+
## Competitive positioning map
|
|
232
|
+
|
|
233
|
+
Use for: market positioning, competitive landscape, portfolio analysis.
|
|
234
|
+
|
|
235
|
+
This is a scatter plot on two strategic axes. Use the Recharts ScatterChart from the data-visualization skill, with custom labels for each competitor:
|
|
236
|
+
|
|
237
|
+
```tsx
|
|
238
|
+
const competitors = [
|
|
239
|
+
{ name: 'Acme', x: 85, y: 90, size: 16 },
|
|
240
|
+
{ name: 'Competitor A', x: 60, y: 40, size: 10 },
|
|
241
|
+
{ name: 'Competitor B', x: 30, y: 70, size: 10 },
|
|
242
|
+
{ name: 'Legacy', x: 20, y: 20, size: 8 },
|
|
243
|
+
]
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
- X-axis: one strategic dimension (e.g., "Ease of use").
|
|
247
|
+
- Y-axis: another strategic dimension (e.g., "Enterprise readiness").
|
|
248
|
+
- Acme is the largest dot, in accent color.
|
|
249
|
+
- Competitors are smaller, muted.
|
|
250
|
+
- Label each dot with the company name.
|
|
251
|
+
|
|
252
|
+
## Risk matrix
|
|
253
|
+
|
|
254
|
+
Use for: risk assessment, compliance review, project planning.
|
|
255
|
+
|
|
256
|
+
A 5x5 or 3x3 grid with color-coded cells (green = low, yellow = medium, red = high).
|
|
257
|
+
|
|
258
|
+
```tsx
|
|
259
|
+
<section data-slide="">
|
|
260
|
+
<div className="flex flex-col justify-center w-full min-h-screen"
|
|
261
|
+
style={{ padding: '4rem 6rem' }}>
|
|
262
|
+
<p className="section-label mb-3">Risk</p>
|
|
263
|
+
<h2 className="text-[2.5rem] font-bold mb-10">Risk assessment</h2>
|
|
264
|
+
<div className="card-surface overflow-hidden" style={{ maxWidth: 600 }}>
|
|
265
|
+
<div className="grid grid-cols-4 text-center text-xs">
|
|
266
|
+
<div className="p-2" />
|
|
267
|
+
<div className="p-2 font-semibold" style={{ color: 'var(--color-text-tertiary)' }}>Low impact</div>
|
|
268
|
+
<div className="p-2 font-semibold" style={{ color: 'var(--color-text-tertiary)' }}>Med impact</div>
|
|
269
|
+
<div className="p-2 font-semibold" style={{ color: 'var(--color-text-tertiary)' }}>High impact</div>
|
|
270
|
+
{['High likelihood', 'Med likelihood', 'Low likelihood'].map((row) => (
|
|
271
|
+
<React.Fragment key={row}>
|
|
272
|
+
<div className="p-2 font-semibold text-right pr-3" style={{ color: 'var(--color-text-tertiary)' }}>{row}</div>
|
|
273
|
+
{[
|
|
274
|
+
row === 'High likelihood' ? ['#f59e0b', '#ef4444', '#ef4444'] :
|
|
275
|
+
row === 'Med likelihood' ? ['#22c55e', '#f59e0b', '#ef4444'] :
|
|
276
|
+
['#22c55e', '#22c55e', '#f59e0b']
|
|
277
|
+
][0].map((color, i) => (
|
|
278
|
+
<div key={i} className="p-3 m-0.5 rounded"
|
|
279
|
+
style={{ background: color, opacity: 0.2 }} />
|
|
280
|
+
))}
|
|
281
|
+
</React.Fragment>
|
|
282
|
+
))}
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
</section>
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Place risk items as labels inside the relevant cells.
|
|
290
|
+
|
|
291
|
+
## Pros and cons
|
|
292
|
+
|
|
293
|
+
Use for: decision support, options analysis, trade-off visualization.
|
|
294
|
+
|
|
295
|
+
```tsx
|
|
296
|
+
<section data-slide="">
|
|
297
|
+
<div className="grid grid-cols-2 gap-8 items-start w-full min-h-screen"
|
|
298
|
+
style={{ padding: '4rem 6rem' }}>
|
|
299
|
+
<div>
|
|
300
|
+
<p className="text-sm font-semibold mb-6" style={{ color: '#22c55e' }}>Pros</p>
|
|
301
|
+
<ul className="space-y-3">
|
|
302
|
+
{['5x faster deploys', 'Zero-config scaling', '10x cost reduction'].map((item) => (
|
|
303
|
+
<li key={item} data-step="" className="step-fade flex items-start gap-3 text-base">
|
|
304
|
+
<span style={{ color: '#22c55e' }}>+</span>
|
|
305
|
+
<span>{item}</span>
|
|
306
|
+
</li>
|
|
307
|
+
))}
|
|
308
|
+
</ul>
|
|
309
|
+
</div>
|
|
310
|
+
<div>
|
|
311
|
+
<p className="text-sm font-semibold mb-6" style={{ color: '#ef4444' }}>Cons</p>
|
|
312
|
+
<ul className="space-y-3">
|
|
313
|
+
{['6-month migration', 'Team retraining', 'Vendor lock-in risk'].map((item) => (
|
|
314
|
+
<li key={item} data-step="" className="step-fade flex items-start gap-3 text-base">
|
|
315
|
+
<span style={{ color: '#ef4444' }}>-</span>
|
|
316
|
+
<span>{item}</span>
|
|
317
|
+
</li>
|
|
318
|
+
))}
|
|
319
|
+
</ul>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
</section>
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## Maturity model
|
|
326
|
+
|
|
327
|
+
Use for: capability assessment, digital transformation stages, process maturity.
|
|
328
|
+
|
|
329
|
+
```tsx
|
|
330
|
+
<div className="flex items-end gap-2">
|
|
331
|
+
{[
|
|
332
|
+
{ level: 1, label: 'Ad hoc', active: false },
|
|
333
|
+
{ level: 2, label: 'Defined', active: false },
|
|
334
|
+
{ level: 3, label: 'Managed', active: true },
|
|
335
|
+
{ level: 4, label: 'Measured', active: false },
|
|
336
|
+
{ level: 5, label: 'Optimized', active: false },
|
|
337
|
+
].map((stage) => (
|
|
338
|
+
<div key={stage.level} data-step="" className="step-move-up flex-1 text-center">
|
|
339
|
+
<div className="rounded-t-lg py-4"
|
|
340
|
+
style={{
|
|
341
|
+
height: 60 + stage.level * 30,
|
|
342
|
+
background: stage.active ? 'var(--color-accent)' : 'var(--color-surface)',
|
|
343
|
+
border: stage.active ? '2px solid var(--color-accent)' : '1px solid var(--color-border)',
|
|
344
|
+
display: 'flex',
|
|
345
|
+
alignItems: 'center',
|
|
346
|
+
justifyContent: 'center',
|
|
347
|
+
}}>
|
|
348
|
+
<p className="text-lg font-bold"
|
|
349
|
+
style={{ color: stage.active ? 'var(--color-primary)' : 'var(--color-text-tertiary)' }}>
|
|
350
|
+
{stage.level}
|
|
351
|
+
</p>
|
|
352
|
+
</div>
|
|
353
|
+
<p className="mt-2 text-xs font-semibold"
|
|
354
|
+
style={{ color: stage.active ? 'var(--color-accent)' : 'var(--color-text-tertiary)' }}>
|
|
355
|
+
{stage.label}
|
|
356
|
+
</p>
|
|
357
|
+
</div>
|
|
358
|
+
))}
|
|
359
|
+
</div>
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
The active stage is highlighted in accent color. Bars increase in height left to right.
|
|
363
|
+
|
|
364
|
+
## Concentric circles
|
|
365
|
+
|
|
366
|
+
Use for: ecosystem layers, strategic fit, layers of value.
|
|
367
|
+
|
|
368
|
+
Same technique as TAM/SAM/SOM but with different labels. Use absolutely-positioned circles within a relative container. Reveal from outside in (largest first) using `data-step`.
|
|
369
|
+
|
|
370
|
+
## Framework selection guide
|
|
371
|
+
|
|
372
|
+
| Framework | Use when |
|
|
373
|
+
|---|---|
|
|
374
|
+
| SWOT | Situational analysis, strategic review, competitive assessment |
|
|
375
|
+
| 2x2 matrix | Prioritizing options on two dimensions |
|
|
376
|
+
| TAM/SAM/SOM | Market sizing for investor decks |
|
|
377
|
+
| Process chevrons | Showing a linear workflow or sales stages |
|
|
378
|
+
| Pyramid | Showing hierarchy, market tiers, or value layers |
|
|
379
|
+
| Positioning map | Competitive landscape on two strategic axes |
|
|
380
|
+
| Risk matrix | Risk assessment with likelihood and impact |
|
|
381
|
+
| Pros/cons | Decision support, trade-off analysis |
|
|
382
|
+
| Pricing comparison | Plan/tier selection (see advanced-layouts skill) |
|
|
383
|
+
| Maturity model | Capability assessment, readiness scoring |
|
|
384
|
+
| Concentric circles | Ecosystem layers, strategic fit rings |
|
|
385
|
+
|
|
386
|
+
## Common mistakes
|
|
387
|
+
|
|
388
|
+
- Filling every cell of a SWOT with 8+ items. Keep it to 3-4 per quadrant.
|
|
389
|
+
- Centering items in a 2x2 instead of positioning them meaningfully by their coordinates.
|
|
390
|
+
- Using raw numbers for TAM without showing the methodology or source.
|
|
391
|
+
- Making all process chevrons the same color. Highlight the current or focus stage.
|
|
392
|
+
- Not revealing framework elements progressively. A full SWOT shown at once overwhelms.
|