Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/create-eikon-react/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ const VARIANT_CHOICES = {
'editorial',
'animal-crossing',
'evomap',
'pixel',
] as const,
layout: [
'stacked',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ translate them to OKLCH for perceptual-uniform contrast checking.
| `carbon` | IBM Carbon Design System | IBM Blue `#0F62FE` on layered grays | IBM Plex Sans | Dense (0.22rem) | Square corners, 2px focus, enterprise. |
| `editorial` | Broadsheet / magazine print | black ink `#262626` on white paper | Playfair Display / Georgia | Editorial (0.27rem) · 17px · 1.85 LH | Stark B&W serif, hairline rules, flat. |
| `animal-crossing` | [animal-island-ui] | mint teal `#19c8b9` + parchment `#f8f8f0`, brown ink `#794f27`, focus yellow `#ffcc00` | Baloo 2 / M PLUS Rounded 1c | Spacious (0.27rem) · chunky 12–24px radii | Cosy island; hard flat-bottom shadow, rounded gothic, bouncy easing. |
| `pixel` | Retro 8-bit / pixel-art (self-authored) | candy pastels — lavender `oklch(0.78 0.13 300)` + mint + pink + butter + sky on lavender-gray paper, ink-black outline | Press Start 2P (display) / Space Mono (body) | Standard (0.25rem) · tamed display scale | 8-bit pastel arcade; brutalist 3px ink borders + hard-offset shadows, zero radius, `image-rendering: pixelated`, pixel-dot field. Hover pops, active slams. |

[linear.app/brand]: https://linear.app/brand
[Anthropic brand guidelines]: https://github.com/anthropics/skills/blob/main/skills/brand-guidelines/SKILL.md
Expand Down
17 changes: 17 additions & 0 deletions packages/create-eikon-react/template/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,23 @@
rel="stylesheet"
/>
<!-- @eikon:variant(design=evomap) end -->
<!-- @eikon:variant(design=pixel) begin -->
<!--
Press Start 2P — the canonical bitmap pixel face — for headlines, over
Space Mono (retro monospace) for body / UI. Both are SIL OFL fonts on
Google Fonts; loaded eagerly because the pixel face defines the first
paint of every title. They fall back to ui-monospace / system mono on
networks that block Google Fonts — see --font-display / --font-sans in
src/styles/index.css. Each ships a single weight (Press Start 2P 400,
Space Mono 400/700), which is all the pixel preset asks for.
-->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Press+Start+2P&family=Space+Mono:wght@400;700&display=swap"
rel="stylesheet"
/>
<!-- @eikon:variant(design=pixel) end -->
<title>Eikon App</title>
<script>
(function () {
Expand Down
1 change: 0 additions & 1 deletion packages/create-eikon-react/template/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@
"@radix-ui/react-checkbox": "^1.1.4",
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-popover": "^1.1.6",
"@radix-ui/react-radio-group": "^1.2.3",
"@radix-ui/react-select": "^2.1.6",
Expand Down
265 changes: 265 additions & 0 deletions packages/create-eikon-react/template/src/styles/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -4301,6 +4301,271 @@
}
/* @eikon:variant(design=evomap) end */

/* @eikon:variant(design=pixel) begin */
/* Pixel Pop — 8-bit pastel arcade. The neo-brutalist hard-outline chassis
* (3px ink borders, hard-offset zero-blur shadows, zero radius) re-skinned
* in a soft CANDY palette — lavender / mint / pink / butter / sky — and
* crowned with a true bitmap pixel display face (Press Start 2P) over a
* retro monospace body (Space Mono). Reads like a friendly handheld /
* retro-computing UI rather than brutalism's raw zine: same hard depth,
* pastel mood. Cards/buttons stay sharp pixels; `rounded-full` badges stay
* candy pills. Hover POPS the shadow out; active SLAMS it flat. Dark mode is
* a deep arcade-night purple-black with light outlines + light cast shadows.
* Self-authored aesthetic — no third-party brand assets. Press Start 2P +
* Space Mono are SIL OFL fonts loaded in index.html behind the variant
* marker; both fall back to ui-monospace where Google Fonts is blocked. */
:root.design-pixel {
--color-background: oklch(0.95 0.005 300); /* soft lavender-gray paper */
--color-foreground: oklch(0.17 0.02 295); /* near-black violet ink */
--color-card: oklch(1 0 0);
--color-card-foreground: oklch(0.17 0.02 295);
--color-muted: oklch(0.93 0.008 300);
--color-muted-foreground: oklch(0.42 0.03 295);
--color-border: oklch(0.17 0.02 295); /* ink outline */
--color-input: oklch(0.17 0.02 295);
--color-primary: oklch(0.78 0.13 300); /* candy lavender */
--color-primary-foreground: oklch(0.17 0.02 295);
--color-secondary: oklch(0.87 0.11 165); /* mint */
--color-secondary-foreground: oklch(0.17 0.02 295);
/* Accent is the shadcn hover/highlighted-row tint — a pale pink WASH, not
* a fill (a saturated pink would flood the whole row on hover). The candy
* pop comes from primary/secondary fills + the hard shadow pop, not from
* accent. */
--color-accent: oklch(0.91 0.05 350); /* pale pink wash */
--color-accent-foreground: oklch(0.17 0.02 295);
--color-destructive: oklch(0.62 0.22 25);
--color-destructive-foreground: oklch(0.98 0 0);
--color-ring: oklch(0.6 0.2 300); /* vivid arcade violet — visible focus */

/* Zero radius — sharp pixels. `rounded-full` badge pills are a fixed
* utility (9999px), unaffected by these tokens, so candy pills stay round. */
--radius-lg: 0rem;
--radius-md: 0rem;
--radius-sm: 0rem;

/* Bitmap pixel headlines over a retro monospace body. Press Start 2P runs
* VERY large per glyph, so the display type-scale below is dialled down to
* keep titles from overflowing while still reading big and chunky.
*
* CJK fallback — Press Start 2P + Space Mono are Latin-only, so every stack
* ends with system CJK sans faces (PingFang / YaHei / Noto Sans SC) BEFORE
* the generic. Without them a Chinese/Japanese title drops to the browser's
* default serif and clashes with the bitmap Latin (e.g. a "大豆包" heading
* mixed with pixel ASCII). CJK ideographs are full-width, so they sit
* cleanly in the monospace rhythm. For TRUE pixel CJK, drop an open bitmap
* CJK webfont (Zpix / Fusion Pixel / Cubic 11) at the front of --font-display
* and load it in index.html behind the design=pixel variant marker. */
--font-sans:
'Space Mono', 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular,
Menlo, 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', monospace;
--font-mono:
'Space Mono', 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular,
Menlo, 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', monospace;
--font-display:
'Press Start 2P', 'Space Mono', ui-monospace, SFMono-Regular, Menlo,
'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', monospace;

/* Roomy arcade density; Space Mono ships only 400/700 so medium maps to
* 400 (avoid faux-bold mush) and semibold to 700. */
--spacing: 0.25rem;
--text-sm: 0.8125rem;
--text-sm--line-height: 1.2rem;
--text-base: 0.9375rem;
--text-base--line-height: 1.5rem;
--font-weight-medium: 400;
--font-weight-semibold: 700;
--tracking-tight: 0em;

/* Tamed display scale for the wide bitmap face + extra leading (pixel
* glyphs are tall and need vertical air). */
--text-3xl: 1.35rem;
--text-3xl--line-height: 1.9rem;
--text-4xl: 1.6rem;
--text-4xl--line-height: 2.1rem;
--text-5xl: 2rem;
--text-5xl--line-height: 1.2;
--text-6xl: 2.5rem;
--text-6xl--line-height: 1.2;

/* Hard-outline chassis: thick ink border, no backdrop/inset, hard-offset
* zero-blur shadows. Hover pops the offset OUT (lifts off the page),
* active slams it flat (presses in). */
--surface-border-width: 3px;
--surface-backdrop: none;
--surface-inset-shadow: none;
--surface-ring-width: 0px;
--surface-ring-color: transparent;
--surface-hover-shadow: 6px 6px 0 oklch(0.17 0.02 295);
--surface-active-shadow: 2px 2px 0 oklch(0.17 0.02 295);

--shadow-sm: 3px 3px 0 oklch(0.17 0.02 295);
--shadow-md: 5px 5px 0 oklch(0.17 0.02 295);
--shadow-lg: 8px 8px 0 oklch(0.17 0.02 295);
--shadow-xl: 10px 10px 0 oklch(0.17 0.02 295);

/* Snappy arcade motion — quick, no float. */
--duration-fast: 90ms;
--duration-normal: 140ms;
--duration-slow: 240ms;

--scrollbar-size: 14px;
--scrollbar-thumb: oklch(0.78 0.13 300);
--scrollbar-thumb-hover: oklch(0.6 0.2 300);
--scrollbar-thumb-radius: 0rem;
--scrollbar-thumb-border: 3px;

/* Sidebar — a flat candy-lavender block with the hard ink outline; the
* active item flips to ink with a mint label. */
--color-sidebar: oklch(0.78 0.13 300);
--color-sidebar-foreground: oklch(0.17 0.02 295);
--color-sidebar-primary: oklch(0.17 0.02 295);
--color-sidebar-primary-foreground: oklch(0.87 0.11 165);
--color-sidebar-accent: oklch(0.87 0.11 165);
--color-sidebar-accent-foreground: oklch(0.17 0.02 295);
--color-sidebar-border: oklch(0.17 0.02 295);

/* Chart — the five candy hues (lavender / mint / pink / butter / sky) as
* flat pixel blocks. */
--chart-1: oklch(0.78 0.13 300);
--chart-2: oklch(0.85 0.13 165);
--chart-3: oklch(0.78 0.14 350);
--chart-4: oklch(0.86 0.14 95);
--chart-5: oklch(0.78 0.12 235);

/* State colours — pastel candy fills with ink labels (no muted whispers;
* arcade UI shouts in colour). */
--color-success: oklch(0.8 0.15 160);
--color-success-foreground: oklch(0.17 0.02 295);
--color-warning: oklch(0.88 0.15 95);
--color-warning-foreground: oklch(0.17 0.02 295);
--color-info: oklch(0.8 0.12 235);
--color-info-foreground: oklch(0.17 0.02 295);

/* Focus halo — vivid violet, 3px (reads as an extra-thick pixel border)
* with a 2px paper gap. */
--ring-width: 3px;
--ring-offset-width: 2px;
--ring-offset-color: oklch(0.95 0.005 300);
}
.dark.design-pixel {
/* Arcade night — deep purple-black, never flat grey. Outlines + cast
* shadows flip to light so the hard-edge chassis still reads. */
--color-background: oklch(0.17 0.015 290);
--color-foreground: oklch(0.95 0.01 300);
--color-card: oklch(0.21 0.02 290);
--color-card-foreground: oklch(0.95 0.01 300);
--color-muted: oklch(0.26 0.02 290);
--color-muted-foreground: oklch(0.74 0.02 300);
--color-border: oklch(0.95 0.01 300);
--color-input: oklch(0.95 0.01 300);
--color-primary: oklch(0.8 0.13 300);
--color-primary-foreground: oklch(0.15 0.02 290);
--color-secondary: oklch(0.84 0.12 165);
--color-secondary-foreground: oklch(0.15 0.02 290);
--color-accent: oklch(0.34 0.06 350); /* deeper pink hover-row in the dark */
--color-accent-foreground: oklch(0.95 0.01 300);
--color-destructive: oklch(0.62 0.22 25);
--color-destructive-foreground: oklch(0.98 0 0);
--color-ring: oklch(0.8 0.13 300);

--color-success: oklch(0.82 0.15 160);
--color-success-foreground: oklch(0.15 0.02 290);
--color-warning: oklch(0.88 0.15 95);
--color-warning-foreground: oklch(0.15 0.02 290);
--color-info: oklch(0.8 0.12 235);
--color-info-foreground: oklch(0.15 0.02 290);

--surface-hover-shadow: 6px 6px 0 oklch(0.95 0.01 300);
--surface-active-shadow: 2px 2px 0 oklch(0.95 0.01 300);

--shadow-sm: 3px 3px 0 oklch(0.95 0.01 300);
--shadow-md: 5px 5px 0 oklch(0.95 0.01 300);
--shadow-lg: 8px 8px 0 oklch(0.95 0.01 300);
--shadow-xl: 10px 10px 0 oklch(0.95 0.01 300);

--scrollbar-thumb: oklch(0.78 0.13 300);
--scrollbar-thumb-hover: oklch(0.88 0.1 300);

--color-sidebar: oklch(0.21 0.02 290);
--color-sidebar-foreground: oklch(0.95 0.01 300);
--color-sidebar-primary: oklch(0.8 0.13 300);
--color-sidebar-primary-foreground: oklch(0.15 0.02 290);
--color-sidebar-accent: oklch(0.3 0.04 300);
--color-sidebar-accent-foreground: oklch(0.95 0.01 300);
--color-sidebar-border: oklch(0.95 0.01 300);

--ring-offset-color: oklch(0.17 0.015 290);
}

/* Pixel-dot field — a fine candy-dot grid evoking a low-res screen, low
* enough opacity that white cards + ink text stay crisp on top. */
:root.design-pixel body {
background-image: radial-gradient(
color-mix(in oklab, var(--color-primary) 24%, transparent) 1.5px,
transparent 1.5px
);
background-size: 16px 16px;
}
.dark.design-pixel body {
background-image: radial-gradient(
color-mix(in oklab, var(--color-foreground) 12%, transparent) 1.5px,
transparent 1.5px
);
background-size: 16px 16px;
}

/* Crunch raster images down to hard pixels — the whole point of the look,
* and what turns the avatar / agent icons into 8-bit sprites. Design-scoped
* + inside the marker, so it ships only when `pixel` survives stripping. */
:root.design-pixel img {
image-rendering: pixelated;
}

/* Hard-outline chrome + the pop/slam press, lifted from the brutalist
* chassis: thick ink borders on chrome/controls, hover lifts the surface up-
* left and grows the cast shadow, active presses it down-right onto a stub. */
:root.design-pixel .app-nav-shell,
:root.design-pixel .app-dropdown-trigger,
:root.design-pixel .app-dropdown-content {
background: var(--color-sidebar);
border-width: 3px;
border-color: var(--color-sidebar-border);
box-shadow: var(--shadow-md);
}
:root.design-pixel .app-nav-link,
:root.design-pixel .app-nav-action,
:root.design-pixel .app-bottom-nav-link,
:root.design-pixel button,
:root.design-pixel a[role='button'],
:root.design-pixel [role='button'],
:root.design-pixel input:not([type='checkbox']):not([type='radio']):not([type='range']),
:root.design-pixel textarea,
:root.design-pixel select {
border-width: 3px;
border-radius: 0;
}
:root.design-pixel .app-nav-link:hover,
:root.design-pixel .app-nav-action:hover,
:root.design-pixel .app-bottom-nav-link:hover,
:root.design-pixel button.shadow-sm:hover,
:root.design-pixel a.shadow-sm:hover {
opacity: 1;
transform: translate(-2px, -2px);
box-shadow: var(--surface-hover-shadow);
}
:root.design-pixel .app-nav-link-active,
:root.design-pixel .app-bottom-nav-link-active {
background: var(--color-sidebar-primary);
color: var(--color-sidebar-primary-foreground);
box-shadow: var(--shadow-sm);
}
:root.design-pixel button:active,
:root.design-pixel a[role='button']:active {
transform: translate(2px, 2px);
box-shadow: var(--surface-active-shadow);
}
/* @eikon:variant(design=pixel) end */

/* --- layout axis -----------------------------------------------------------
* Each layout (stacked / sidebar / topbar-sidebar / centered) is its own
* top-level component file under src/app/layouts/, so layout-specific
Expand Down
2 changes: 2 additions & 0 deletions packages/preview-site/src/lib/params-schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ export const PARAMS = [
'editorial',
'animal-crossing',
'evomap',
'pixel',
],
default: 'default',
cliFlag: 'design',
Expand All @@ -155,6 +156,7 @@ export const PARAMS = [
editorial: 'Editorial (black-and-white print)',
'animal-crossing': 'Animal Crossing (mint teal + parchment)',
evomap: 'EvoMap (agent economy cyan)',
pixel: 'Pixel Pop (8-bit pastel arcade)',
},
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ translate them to OKLCH for perceptual-uniform contrast checking.
| `carbon` | IBM Carbon Design System | IBM Blue `#0F62FE` on layered grays | IBM Plex Sans | Dense (0.22rem) | Square corners, 2px focus, enterprise. |
| `editorial` | Broadsheet / magazine print | black ink `#262626` on white paper | Playfair Display / Georgia | Editorial (0.27rem) · 17px · 1.85 LH | Stark B&W serif, hairline rules, flat. |
| `animal-crossing` | [animal-island-ui] | mint teal `#19c8b9` + parchment `#f8f8f0`, brown ink `#794f27`, focus yellow `#ffcc00` | Baloo 2 / M PLUS Rounded 1c | Spacious (0.27rem) · chunky 12–24px radii | Cosy island; hard flat-bottom shadow, rounded gothic, bouncy easing. |
| `pixel` | Retro 8-bit / pixel-art (self-authored) | candy pastels — lavender `oklch(0.78 0.13 300)` + mint + pink + butter + sky on lavender-gray paper, ink-black outline | Press Start 2P (display) / Space Mono (body) | Standard (0.25rem) · tamed display scale | 8-bit pastel arcade; brutalist 3px ink borders + hard-offset shadows, zero radius, `image-rendering: pixelated`, pixel-dot field. Hover pops, active slams. |

[linear.app/brand]: https://linear.app/brand
[Anthropic brand guidelines]: https://github.com/anthropics/skills/blob/main/skills/brand-guidelines/SKILL.md
Expand Down
17 changes: 17 additions & 0 deletions packages/template-react/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,23 @@
rel="stylesheet"
/>
<!-- @eikon:variant(design=evomap) end -->
<!-- @eikon:variant(design=pixel) begin -->
<!--
Press Start 2P — the canonical bitmap pixel face — for headlines, over
Space Mono (retro monospace) for body / UI. Both are SIL OFL fonts on
Google Fonts; loaded eagerly because the pixel face defines the first
paint of every title. They fall back to ui-monospace / system mono on
networks that block Google Fonts — see --font-display / --font-sans in
src/styles/index.css. Each ships a single weight (Press Start 2P 400,
Space Mono 400/700), which is all the pixel preset asks for.
-->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Press+Start+2P&family=Space+Mono:wght@400;700&display=swap"
rel="stylesheet"
/>
<!-- @eikon:variant(design=pixel) end -->
<title>Eikon App</title>
<script>
(function () {
Expand Down
Loading
Loading