Skip to content

Commit ccce5a8

Browse files
ofriwclaude
andcommitted
Implement marketingReality slide type with improved two-column layout
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 4babdac commit ccce5a8

File tree

2 files changed

+95
-1
lines changed

2 files changed

+95
-1
lines changed

website/src/components/PresentationMode/RevealSlideshow.module.css

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,69 @@
177177
color: #51cf66;
178178
}
179179

180+
/* Marketing vs Reality - Translation Pattern */
181+
.marketingReality {
182+
display: grid;
183+
grid-template-columns: 1fr 1fr;
184+
gap: clamp(1em, 2vw, 1.5em);
185+
margin: 1em 0;
186+
max-height: calc(100vh - 18rem);
187+
}
188+
189+
.metaphorColumn,
190+
.realityColumn {
191+
padding: clamp(0.7em, 1.5vw, 1em);
192+
border-radius: 8px;
193+
overflow-y: auto;
194+
}
195+
196+
.metaphorColumn {
197+
background: rgba(124, 58, 237, 0.1); /* --brand-primary with alpha */
198+
border: 2px solid rgba(124, 58, 237, 0.3);
199+
}
200+
201+
.realityColumn {
202+
background: rgba(109, 40, 217, 0.12); /* --brand-primary-dark with alpha */
203+
border: 2px solid rgba(109, 40, 217, 0.35);
204+
}
205+
206+
.metaphorHeading {
207+
color: #8b5cf6; /* --brand-primary-light */
208+
font-size: clamp(0.9rem, 1.8vw, 1em);
209+
margin-bottom: 0.3em;
210+
font-weight: 600;
211+
}
212+
213+
.realityHeading {
214+
color: #7c3aed; /* --brand-primary */
215+
font-size: clamp(0.9rem, 1.8vw, 1em);
216+
margin-bottom: 0.3em;
217+
font-weight: 600;
218+
}
219+
220+
.marketingReality ul {
221+
text-align: left;
222+
font-size: clamp(0.65rem, 1.3vw, 0.75em);
223+
list-style: none;
224+
padding: 0;
225+
}
226+
227+
.marketingReality li {
228+
margin: 0.35em 0;
229+
padding-left: 1.2em;
230+
position: relative;
231+
line-height: 1.4;
232+
}
233+
234+
.metaphorColumn li::before,
235+
.realityColumn li::before {
236+
content: "→";
237+
position: absolute;
238+
left: 0;
239+
color: #8b5cf6; /* --brand-primary-light */
240+
font-weight: 600;
241+
}
242+
180243
.visualContainer {
181244
margin: 2em 0;
182245
display: flex;

website/src/components/PresentationMode/RevealSlideshow.tsx

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ interface SpeakerNotes {
2020
}
2121

2222
interface Slide {
23-
type: 'title' | 'concept' | 'code' | 'comparison' | 'visual' | 'takeaway';
23+
type: 'title' | 'concept' | 'code' | 'comparison' | 'visual' | 'takeaway' | 'marketingReality';
2424
title: string;
2525
subtitle?: string;
2626
content?: string[];
@@ -30,6 +30,8 @@ interface Slide {
3030
component?: string;
3131
left?: { label: string; content: string[] };
3232
right?: { label: string; content: string[] };
33+
metaphor?: { label: string; content: string[] };
34+
reality?: { label: string; content: string[] };
3335
speakerNotes?: SpeakerNotes;
3436
}
3537

@@ -197,6 +199,35 @@ export default function RevealSlideshow({ presentation, onClose }: RevealSlidesh
197199
</section>
198200
);
199201

202+
case 'marketingReality':
203+
return (
204+
<section key={key} data-notes={formatSpeakerNotes(slide.speakerNotes)}>
205+
<h2>{slide.title}</h2>
206+
<div className={styles.marketingReality}>
207+
{slide.metaphor && (
208+
<div className={styles.metaphorColumn}>
209+
<h3 className={styles.metaphorHeading}>{slide.metaphor.label}</h3>
210+
<ul>
211+
{slide.metaphor.content.map((item, i) => (
212+
<li key={i} className="fragment" data-fragment-index={i * 2}>{item}</li>
213+
))}
214+
</ul>
215+
</div>
216+
)}
217+
{slide.reality && (
218+
<div className={styles.realityColumn}>
219+
<h3 className={styles.realityHeading}>{slide.reality.label}</h3>
220+
<ul>
221+
{slide.reality.content.map((item, i) => (
222+
<li key={i} className="fragment" data-fragment-index={i * 2 + 1}>{item}</li>
223+
))}
224+
</ul>
225+
</div>
226+
)}
227+
</div>
228+
</section>
229+
);
230+
200231
case 'visual':
201232
const VisualComponent = slide.component ? VISUAL_COMPONENTS[slide.component] : null;
202233
return (

0 commit comments

Comments
 (0)