Design system component catalog from the ds-bundle.
// ✅ Correct - Import from ui index
import { Button, Card, CardContent, Heading, Text } from "@/components/ui";
// ❌ Wrong - Direct imports
import Button from "@/components/ui/Button";// ✅ Correct <Button variant="primary" size="md" href="/path"> Click me </Button> // Variants: primary, secondary, destructive, outline, ghost, dark // Sizes: sm, md (default), lg, icon
// ✅ Correct
<Card variant="elevated">
<CardHeader>
<CardTitle>Title</CardTitle>
</CardHeader>
<CardContent>Content</CardContent>
</Card>
// Variants: default, light, elevated (default), bordered1. ❌ **Hardcoded colors** - Always use design tokens 2. ❌ **Inline styles** - Use Tailwind classes 3. ❌ **Wrong spacing values** - Use 8dp grid (multiples of 8px) 4. ❌ **Direct component imports** - Import from @/components/ui 5. ❌ **Using any type** - Use proper TypeScript types
globals.css--color-primary (#5C9000), Secondary --color-secondary (#007399), Accent --color-accent (#CC0058). Use vibrant aliases only when needed.--color-deep-space (#0d1117)--color-slate (#1c2128)--color-steel (#8b9aad) for secondary text--border-default or --border-subtle. Avoid 2px except focus rings. Prefer border border-[var(--border-default)].**Usage in Tailwind**:
// ✅ Correct
<div className="bg-primary text-white">
<div className="text-steel bg-slate">
<div className="bg-(--color-primary-alpha-10)"> // Opacity tokens
// ❌ Wrong
<div className="bg-primary">
<div style={{ color: '#8b9aad' }}>
<div className="bg-primary/10"> // Use opacity tokens instead**Opacity Tokens**:
--color-primary-alpha-10, --color-secondary-alpha-15, etc.--color-primary-rgb, --color-secondary-rgb, --color-accent-rgb**Shadow Tokens & Utilities**:
--shadow-primary-lg, --shadow-primary-hover, --shadow-accent-hovershadow-primary-lg, shadow-primary-hover, shadow-accent-hover// ✅ Correct
<div className="shadow-primary-lg">
<button className="shadow-accent-hover hover:shadow-primary-hover">
// ❌ Wrong
<div style={{ boxShadow: '0 12px 40px 0 rgba(115, 180, 0, 0.15)' }}>text-body (20px / 1.25rem)Heading component with level prop (1-6)--font-heading (Plus Jakarta Sans), --font-body (Plus Jakarta Sans), --font-mono (JetBrains Mono)**Usage**:
// ✅ Correct
<Heading level={1} gradient shimmer>Title</Heading>
<Text size="body" color="primary">Body text</Text>
// ❌ Wrong
<h1 className="text-4xl">Title</h1>
<p style={{ fontSize: '20px' }}>Body text</p>gap-xs (8px), gap-sm (16px), gap-md (24px), gap-lg (32px), gap-xl (40px)space-* utilities (space-2 = 8px, space-4 = 16px, etc.)**Usage**:
// ✅ Correct <div className="space-y-4 gap-md"> <div className="p-6"> // 24px = 3 * 8px // ❌ Wrong <div className="space-y-[13px]"> // Not a multiple of 8
https://www.reshapex.com/images/logos/reshape-logo.svg/images/logos/reshape-logo.svg (same asset).alt="ReshapeX" for accessibility.> **Roles**: Designer (owns locked Figma template layers) | Editor (changes text, swaps images, embeds video in Figma Slides)
---
Dark slides use the **marketing palette** (#73B400, #00D9FF, #FF006E). Light slides use the **enterprise palette** (#5C9000, #005C90, #90005C). Content type determines mode — editors do not choose.
**NEVER mix**: Marketing palette colors may not be used as accents on light slides. Enterprise palette colors may not be the primary accent on dark slides.
| Mode | HTML Background | Text Color | Palette | | ----- | --------------- | ---------- | ---------- | | Dark | transparent | #FFFFFF | Marketing | | Light | #FFFFFF | #0D1117 | Enterprise |
**Dark slide content types**: Title, section break, stat callout, quote, hero image, closing/Q&A, any brand or impact moment
**Light slide content types**: Dense data tables, financial charts, partner/customer logos, process diagrams, appendix slides
---
Every slide HTML fragment must:
1. **No wrappers** — never include <html>, <body>, <header>, <footer>, or <nav> tags 2. **Background** — dark slides: background: transparent | light slides: background: #FFFFFF 3. **Hex values only** — Figma does NOT resolve CSS custom properties; var(--color-primary) arrives as a literal string. Use hex values from the tables below. 4. **Canvas size** — content zone: width: 1920px; height: 900px (full slide is 1920×1080; template owns ~90px header + ~90px footer) 5. **Padding** — padding: 80px 120px; box-sizing: border-box 6. **Font** — font-family: Plus Jakarta Sans, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif 7. **px values** — use px for all type sizes, not rem or Tailwind classes (Figma import strips class names)
<!-- RESHAPE SLIDE CONTENT ZONE — 1920x900px --> <!-- DO NOT include <html>, <body>, <header>, <footer>, <nav> --> <div style=" width: 1920px; height: 900px; background: transparent; /* #FFFFFF for light slides */ padding: 80px 120px; box-sizing: border-box; font-family: Plus Jakarta Sans, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; color: #FFFFFF; /* #0D1117 for light slides */ position: relative; overflow: hidden; " > <!-- SLIDE CONTENT HERE --> </div>
---
| Token | Hex Value | | -------------- | ---------------------------------------------------------------------- | | background | transparent | | textPrimary | #FFFFFF | | textBody | #E5E9EC | | textSubtle | #A0AEB8 | | textMuted | #8B9AAD | | electricGreen | #73B400 | | cyberBlue | #00D9FF | | magenta | #FF006E | | voltYellow | #FFE500 | | divider | #1C2128 | | cardSurface | #1C2128 | | gradientHero | linear-gradient(135deg, #73B400 0%, #00D9FF 100%) | | gradientCyber | linear-gradient(135deg, #00D9FF 0%, #FF006E 100%) | | gradientNeural | linear-gradient(135deg, #73B400 0%, #FFE500 100%) | | gradientFull | linear-gradient(135deg, #73B400 0%, #00D9FF 50%, #FF006E 100%) | | imageOverlay | linear-gradient(to right, rgba(13,17,23,0.95) 40%, transparent 100%) |
| Token | Hex Value | | ----------------- | --------------------------------------------------- | | background | #FFFFFF | | textPrimary | #0D1117 | | textBody | #1C2128 | | textSubtle | #8B9AAD | | enterpriseGreen | #5C9000 | | enterpriseBlue | #005C90 | | enterpriseMagenta | #90005C | | enterpriseViolet | #340090 | | divider | #E5E9EC | | cardSurface | #F5F7FA | | gradientAccent | linear-gradient(135deg, #5C9000 0%, #005C90 100%) |
---
| Role | Size | Weight | Line Height | Letter Spacing | | --------- | ----- | ------ | ----------- | -------------- | | title | 88px | 800 | 1.05 | -0.02em | | subtitle | 36px | 400 | 1.30 | 0 | | h2 | 64px | 700 | 1.10 | -0.01em | | h3 | 44px | 700 | 1.15 | -0.01em | | body | 26px | 400 | 1.50 | 0 | | caption | 20px | 400 | 1.40 | 0.01em | | stat | 112px | 900 | 1.00 | -0.03em | | statLabel | 22px | 600 | 1.30 | 0.04em | | code | 22px | 400 | 1.60 | 0 | | eyebrow | 16px | 600 | 1.20 | 0.10em |
**Dark mode colors**: title #FFFFFF, body #E5E9EC, caption #A0AEB8, stat gradient or #00D9FF
**Light mode colors**: title #0D1117, body #1C2128, caption #8B9AAD, stat #005C90
---
Titles may use a **single** accent color on **1–3 words** that carry the semantic weight. Accents mark arguments, not style. Use hex inline styles — class names are stripped on Figma import.
<!-- Correct — accent marks the statistic (the argument) --> Your factory floor <span style="color: #73B400">wastes 23%</span> of capacity <!-- Wrong — decorative, no semantic reason --> <span>Your</span> factory <span>floor</span> wastes <span>23%</span> <!-- Wrong — two accent colors in one title --> <span style="color: #73B400">Faster</span> and <span style="color: #FF006E">Smarter</span> <!-- Wrong — marketing color on a light slide --> Revenue grew <span style="color: #73B400">40%</span> ← use #5C9000 on light slides
**Dark slides**: allowed accent colors #73B400, #00D9FF, #FF006E, or linear-gradient(135deg, #73B400, #00D9FF)
**Light slides**: allowed accent colors #5C9000, #005C90, #90005C
Non-accented title words: always #FFFFFF on dark, #0D1117 on light — never a lighter tint of the accent.
---
Canvas: 1920 × 1080px Content zone: 1920 × 900px (header 90px top, footer 90px bottom) Margin: 120px all sides Headline Y: 80px from content zone top Body Y: 240px from content zone top Stat center Y: 200px from content zone top Left column X: 120px Right column X: 1080px (two-column layouts)
---
| ID | Label | Default Mode | Supports Light | Editor Zones | | ------------------ | --------------------- | ------------ | -------------- | -------------------------------------------------- | | title | Title Slide | dark | No | presentation title, subtitle, date, presenter name | | content | Content Slide | dark | Yes | heading, body copy, image (swap), video embed | | stat-callout | Stat Callout | dark | No | stat number, stat label, context sentence | | icon-grid | Icon Grid | dark | Yes | icon (swap), label, description | | section-break | Section Break | dark | No | section title, section subtitle | | quote | Quote Slide | either | Yes | quote text, attribution name, attribution title | | two-column | Two-Column Content | either | Yes | heading, left body, right body, image (swap) | | data-viz | Data Visualization | light | Yes | heading, chart data, footnote | | hero-image | Full-Bleed Hero Image | dark | No | headline, subhead, image (swap) | | before-after | Before / After | either | Yes | heading, before/after labels and content | | process-timeline | Process / Timeline | either | Yes | heading, step labels ×4–6, step descriptions | | team | Team | dark | Yes | photo (swap), name, title, bio | | qa | Q&A / Closing | dark | No | heading, contact information |
Logo is always a locked designer layer in template header/footer — never in editor zones.
---
| Context | Type | Duration | | --------------------- | ------------- | ----------------- | | Default (all slides) | Dissolve | 300ms | | Into section break | Push (left) | 400ms | | Within-slide elements | Smart Animate | 200ms ease-in-out |
**Prohibited**: Cube, 3D flip, Zoom, Flip, Whirl
---
| Deck Section | Mode | Accent | | ------------ | ----- | -------------------------- | | Opening | Dark | #73B400 Electric Green | | Problem | Dark | #00D9FF Cyber Blue | | Solution | Dark | gradientHero AI Energy | | Proof | Light | #5C9000 Enterprise Green | | Closing | Dark | #FF006E Magenta |
Dark slides perform. Light slides prove.
---
**Dark slide series order**: #73B400 → #00D9FF → #5C9000 → #005C90
**Light slide series order**: #5C9000 → #005C90 → #340090 → #90005C
#FF006E (Magenta) is NEVER a data series — reads as alert/error.
Dark chart styling: grid lines #1C2128, axis labels #8B9AAD, data labels #FFFFFF
Light chart styling: grid lines #E5E9EC, axis labels #8B9AAD, data labels #0D1117
**Avoid**: 3D charts, pie charts (>2 segments), stacked area (>2 series), radar/spider
---
| Type | Max Words/Slide | Slide Count | Light Slide % | | ------------ | --------------- | ----------- | ------------- | | Sales | 30 | 10–18 | 20–30% | | Board | 50 | 12–20 | 40–60% | | Product Demo | 60 | 8–20 | 30–40% | | Conference | 15 | 20–50 | 0–10% | | Internal | 60 | 5–25 | 20–40% |
---
| Position | Role | Template | Mode | | -------- | ---------------- | ---------------- | ------ | | 1 | Opening | title | dark | | 2–3 | The problem | content | dark | | 4 | Cost of inaction | stat-callout | dark | | 5–7 | The solution | content | dark | | 8–9 | How it works | process-timeline | either | | 10–12 | Proof / results | data-viz | light | | 13 | Why us | content | dark | | 14 | Call to action | qa | dark | | 15+ | Appendix | content | light |
No deck shorter than 8 slides. No deck longer than 20 for a 30-minute meeting.
---
<header>, <footer>, <nav>, <html>, or <body> tags#0D1117 (must be transparent)transparent (must be #FFFFFF)#73B400, #00D9FF, #FF006E) used as accent on a light slidevar(--...)) used in slide HTML — must use hex values---
<header>, <footer>, or <nav> — Figma template owns thesevar(--...) CSS custom properties — Figma does not resolve them<html> or <body> tags — import_html expects a fragment#0D1117 background in dark slide HTML — template sets it#FF006E Magenta as a chart data series — reads as alertcn() utility for conditional classes// ✅ Correct
import { cn } from '@/lib/utils'
<div className={cn("bg-slate p-6", isActive && "border-primary")}>
// ❌ Wrong
<div className="bg-slate" style={{ padding: '24px' }}>