7k-design-system 1.0.0-alpha.1
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/CHANGELOG.md +45 -0
- package/CONSUMER_GUIDE.md +471 -0
- package/DESIGN.md +1207 -0
- package/LICENSE +21 -0
- package/README.md +192 -0
- package/SKILL.md +252 -0
- package/build/icon.svg +10 -0
- package/build/logo-7k-light.svg +10 -0
- package/build/logo-7k.svg +10 -0
- package/dist/7k-design-system.css +1 -0
- package/dist/animations.css +1 -0
- package/dist/build/icon.svg +10 -0
- package/dist/build/logo-7k-light.svg +10 -0
- package/dist/build/logo-7k.svg +10 -0
- package/dist/components.css +1 -0
- package/dist/fonts/GeistPixel-Circle.ttf +0 -0
- package/dist/fonts/GeistPixel-Grid.ttf +0 -0
- package/dist/fonts/GeistPixel-Line.ttf +0 -0
- package/dist/fonts/GeistPixel-Square.ttf +0 -0
- package/dist/fonts/GeistPixel-Triangle.ttf +0 -0
- package/dist/preview/brand-assets.html +83 -0
- package/dist/preview/brand-assets.html.artifact.json +19 -0
- package/dist/preview/colors-primary.html +101 -0
- package/dist/preview/colors-primary.html.artifact.json +19 -0
- package/dist/preview/components-buttons.html +84 -0
- package/dist/preview/components-buttons.html.artifact.json +19 -0
- package/dist/preview/spacing-tokens.html +79 -0
- package/dist/preview/spacing-tokens.html.artifact.json +19 -0
- package/dist/preview/textures-backgrounds.html +102 -0
- package/dist/preview/textures-backgrounds.html.artifact.json +19 -0
- package/dist/preview/typography-specimens.html +73 -0
- package/dist/preview/typography-specimens.html.artifact.json +19 -0
- package/dist/react/index.cjs +1 -0
- package/dist/react/index.js +129 -0
- package/dist/react/react/components/Badge.d.ts +3 -0
- package/dist/react/react/components/Badge.d.ts.map +1 -0
- package/dist/react/react/components/Badge.stories.d.ts +12 -0
- package/dist/react/react/components/Badge.stories.d.ts.map +1 -0
- package/dist/react/react/components/Button.d.ts +3 -0
- package/dist/react/react/components/Button.d.ts.map +1 -0
- package/dist/react/react/components/Button.stories.d.ts +16 -0
- package/dist/react/react/components/Button.stories.d.ts.map +1 -0
- package/dist/react/react/components/Input.d.ts +3 -0
- package/dist/react/react/components/Input.d.ts.map +1 -0
- package/dist/react/react/components/Input.stories.d.ts +11 -0
- package/dist/react/react/components/Input.stories.d.ts.map +1 -0
- package/dist/react/react/components/ThemeToggle.d.ts +4 -0
- package/dist/react/react/components/ThemeToggle.d.ts.map +1 -0
- package/dist/react/react/components/ThemeToggle.stories.d.ts +7 -0
- package/dist/react/react/components/ThemeToggle.stories.d.ts.map +1 -0
- package/dist/react/react/hooks/useTheme.d.ts +11 -0
- package/dist/react/react/hooks/useTheme.d.ts.map +1 -0
- package/dist/react/react/index.d.ts +8 -0
- package/dist/react/react/index.d.ts.map +1 -0
- package/dist/react/react/theme/ThemeContext.d.ts +3 -0
- package/dist/react/react/theme/ThemeProvider.d.ts +9 -0
- package/dist/react/react/theme/useTheme.d.ts +3 -0
- package/dist/react/react/types.d.ts +33 -0
- package/dist/react/react/types.d.ts.map +1 -0
- package/dist/react/stories/Button.d.ts +17 -0
- package/dist/react/stories/Button.d.ts.map +1 -0
- package/dist/react/stories/Button.stories.d.ts +25 -0
- package/dist/react/stories/Button.stories.d.ts.map +1 -0
- package/dist/react/stories/Components.stories.d.ts +10 -0
- package/dist/react/stories/Components.stories.d.ts.map +1 -0
- package/dist/react/stories/Header.d.ts +14 -0
- package/dist/react/stories/Header.d.ts.map +1 -0
- package/dist/react/stories/Header.stories.d.ts +20 -0
- package/dist/react/stories/Header.stories.d.ts.map +1 -0
- package/dist/react/stories/Page.d.ts +4 -0
- package/dist/react/stories/Page.d.ts.map +1 -0
- package/dist/react/stories/Page.stories.d.ts +14 -0
- package/dist/react/stories/Page.stories.d.ts.map +1 -0
- package/dist/react/stories/Textures.stories.d.ts +11 -0
- package/dist/react/stories/Textures.stories.d.ts.map +1 -0
- package/dist/textures.css +1 -0
- package/dist/tokens.css +1 -0
- package/fonts/GeistPixel-Circle.ttf +0 -0
- package/fonts/GeistPixel-Grid.ttf +0 -0
- package/fonts/GeistPixel-Line.ttf +0 -0
- package/fonts/GeistPixel-Square.ttf +0 -0
- package/fonts/GeistPixel-Triangle.ttf +0 -0
- package/package.json +147 -0
- package/preview/brand-assets.html +83 -0
- package/preview/colors-primary.html +101 -0
- package/preview/components-buttons.html +84 -0
- package/preview/spacing-tokens.html +79 -0
- package/preview/textures-backgrounds.html +102 -0
- package/preview/typography-specimens.html +73 -0
package/DESIGN.md
ADDED
|
@@ -0,0 +1,1207 @@
|
|
|
1
|
+
# 7k-design-system
|
|
2
|
+
|
|
3
|
+
> Version: 1.0.0-alpha.1 (production-ready)
|
|
4
|
+
> Category: Custom · Surface: web, mobile, desktop
|
|
5
|
+
> Font: Geist + Geist Mono + Geist Pixel · Brand color: #FF0FF · Logo: 7K · Theme: Dark-first
|
|
6
|
+
> 1-bit textures: 10 patterns · 1-bit components: 40+ · 1-bit animations: 20+ keyframes
|
|
7
|
+
> React UI kit: Button, Input, Badge, ThemeToggle, ThemeProvider, useTheme
|
|
8
|
+
> Build: Vite + PostCSS + TypeScript · Test: Vitest + Testing Library · Docs: Storybook
|
|
9
|
+
|
|
10
|
+
## Source context
|
|
11
|
+
|
|
12
|
+
Dark-first dual-theme design system for a tech holding. One parent brand (7K · magenta) with five sub-projects each defined by the pairing of one Geist Pixel variant with one brand color ramp. Engineering-blueprint aesthetic; mono labels as connective tissue; magenta strictly rationed.
|
|
13
|
+
|
|
14
|
+
The brand brief specifies: "We only have 1 font and it's Geist. Our logo is just '7K' and our main brand color is #FF0FF. We are a tech company with different projects and we're open on an approach to differentiate brand wise the 'main company' with the other projects. We want to use inspiration from Tokyo's neon atmosphere and Manga-influenced 1-bit using black and white as well as abstract 1-bit animations. We're using a dark theme for websites."
|
|
15
|
+
|
|
16
|
+
Key constraints derived from the source:
|
|
17
|
+
- **Three-font system** → Geist (sans-serif) for body and headings, Geist Mono for labels, code, and tabular data, Geist Pixel (5 geometric variants: Square, Circle, Grid, Line, Triangle) for ornamental and pixel-constrained display use.
|
|
18
|
+
- **Single brand color** → #FF0FF (vivid magenta) as the sole brand accent. No secondary brand color.
|
|
19
|
+
- **Logo** → Star-burst pattern logo in `build/logo-7k.svg`: a geometric radial pattern with #FF0FF brand accent tones. Light variant at `build/logo-7k-light.svg` (black polygons for light backgrounds). App icon at `build/icon.svg`.
|
|
20
|
+
- **Dark theme** → All surfaces start from near-black. Light theme is opt-in only.
|
|
21
|
+
- **Project differentiation** → Child projects get their own accent (solar, cyan, acid, ember) on the same dark base. Parent 7K retains magenta. Each Geist Pixel geometric variant pairs with one accent: Square=magenta, Circle=cyan, Grid=acid, Line=ember, Triangle=solar.
|
|
22
|
+
- **Tokyo neon** → High contrast, nocturnal canvas, electric accents, no warm/beige tones.
|
|
23
|
+
- **1-bit manga influence** → 10-texture background pattern library (scanline, halftone, dot matrix, stripes, crosshatch, checkerboard, noise, vignette). All textures are CSS gradients — no images, no SVG humans.
|
|
24
|
+
- **Abstract 1-bit animations** → 20+ animation keyframes organized as ambient (continuous) and trigger (burst) categories. Step timing for retro feel, reduced-motion collapse.
|
|
25
|
+
- **1-bit component system** → 40+ components with zero radius, 2px white borders, invert hover state. Unified black/white visual language with thin accent layer modifiers for color moments.
|
|
26
|
+
- **React UI kit** → TypeScript React components (Button, Input, Badge, ThemeToggle) with ThemeProvider + useTheme hook for theme management.
|
|
27
|
+
- **Modular CSS** → 10 source files in `src/css/` compiled into `dist/7k-design-system.css`.
|
|
28
|
+
|
|
29
|
+
## Package Structure
|
|
30
|
+
|
|
31
|
+
The design system is distributed as an npm package with dual entry points: CSS-only and React.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
7k-design-system/
|
|
35
|
+
├── src/
|
|
36
|
+
│ ├── css/ # Modular CSS source (10 files)
|
|
37
|
+
│ │ ├── index.css # Entry point: imports all modules
|
|
38
|
+
│ │ ├── fonts.css # @font-face declarations (Geist + Geist Pixel)
|
|
39
|
+
│ │ ├── tokens.css # All design tokens (colors, type, spacing, motion)
|
|
40
|
+
│ │ ├── themes.css # Dark default + light theme overrides
|
|
41
|
+
│ │ ├── base.css # Reset, body, html base styles
|
|
42
|
+
│ │ ├── textures.css # 10 texture pattern categories
|
|
43
|
+
│ │ ├── isometric.css # CSS-only 3D isometric patterns
|
|
44
|
+
│ │ ├── components.css # 40+ 1-bit component classes
|
|
45
|
+
│ │ ├── modifiers.css # Accent layer modifiers
|
|
46
|
+
│ │ ├── animations.css # 20+ keyframe animations
|
|
47
|
+
│ │ └── accessibility.css # Reduced motion, focus-visible, a11y
|
|
48
|
+
│ ├── react/ # React TypeScript components
|
|
49
|
+
│ │ ├── index.ts # Public API exports
|
|
50
|
+
│ │ ├── types.ts # Shared TypeScript interfaces
|
|
51
|
+
│ │ ├── components/
|
|
52
|
+
│ │ │ ├── Button.tsx # Button with variant/size props
|
|
53
|
+
│ │ │ ├── Input.tsx # Controlled input wrapper
|
|
54
|
+
│ │ │ ├── Badge.tsx # Status badge with variants
|
|
55
|
+
│ │ │ └── ThemeToggle.tsx # Dark/light toggle button
|
|
56
|
+
│ │ └── theme/
|
|
57
|
+
│ │ ├── ThemeProvider.tsx # Context provider + persistence
|
|
58
|
+
│ │ ├── ThemeContext.ts # React context definition
|
|
59
|
+
│ │ └── useTheme.ts # useContext hook
|
|
60
|
+
│ └── stories/ # Storybook documentation
|
|
61
|
+
│ ├── Overview.mdx
|
|
62
|
+
│ ├── Tokens.mdx
|
|
63
|
+
│ ├── Components.stories.tsx
|
|
64
|
+
│ └── Textures.stories.tsx
|
|
65
|
+
├── tests/ # Vitest test suite
|
|
66
|
+
│ ├── Button.test.tsx
|
|
67
|
+
│ ├── Input.test.tsx
|
|
68
|
+
│ ├── Badge.test.tsx
|
|
69
|
+
│ ├── ThemeProvider.test.tsx
|
|
70
|
+
│ ├── ThemeToggle.test.tsx
|
|
71
|
+
│ └── a11y.test.tsx
|
|
72
|
+
├── preview/ # 6 HTML review cards
|
|
73
|
+
│ ├── colors-primary.html
|
|
74
|
+
│ ├── typography-specimens.html
|
|
75
|
+
│ ├── spacing-tokens.html
|
|
76
|
+
│ ├── components-buttons.html
|
|
77
|
+
│ ├── textures-backgrounds.html
|
|
78
|
+
│ └── brand-assets.html
|
|
79
|
+
├── build/ # Brand assets
|
|
80
|
+
│ ├── logo-7k.svg
|
|
81
|
+
│ ├── logo-7k-light.svg
|
|
82
|
+
│ └── icon.svg
|
|
83
|
+
├── fonts/ # Geist Pixel TTFs (5 variants)
|
|
84
|
+
├── examples/legacy/ui_kits/app/ # Legacy landing page kit (plain JS React)
|
|
85
|
+
├── dist/ # Build outputs
|
|
86
|
+
│ ├── 7k-design-system.css # Compiled CSS bundle
|
|
87
|
+
│ ├── tokens.css # Standalone tokens
|
|
88
|
+
│ ├── components.css # Standalone components
|
|
89
|
+
│ ├── textures.css # Standalone textures
|
|
90
|
+
│ ├── animations.css # Standalone animations
|
|
91
|
+
│ └── react/ # Compiled React bundle
|
|
92
|
+
│ ├── index.js # ESM build
|
|
93
|
+
│ ├── index.cjs # CJS build
|
|
94
|
+
│ └── index.d.ts # TypeScript declarations
|
|
95
|
+
├── package.json
|
|
96
|
+
├── DESIGN.md # This file — canonical design documentation
|
|
97
|
+
├── SKILL.md # AI agent usage guide
|
|
98
|
+
├── CONSUMER_GUIDE.md # End-user integration guide
|
|
99
|
+
├── vite.css.config.ts # Vite build config for CSS
|
|
100
|
+
├── vite.react.config.ts # Vite build config for React
|
|
101
|
+
└── postcss.config.cjs # PostCSS pipeline (import, nesting, autoprefixer)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### npm Package Exports
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"exports": {
|
|
109
|
+
".": "./dist/7k-design-system.css",
|
|
110
|
+
"./css": "./dist/7k-design-system.css",
|
|
111
|
+
"./css/tokens": "./dist/tokens.css",
|
|
112
|
+
"./css/components": "./dist/components.css",
|
|
113
|
+
"./css/textures": "./dist/textures.css",
|
|
114
|
+
"./css/animations": "./dist/animations.css",
|
|
115
|
+
"./react": {
|
|
116
|
+
"import": "./dist/react/index.js",
|
|
117
|
+
"require": "./dist/react/index.cjs",
|
|
118
|
+
"types": "./dist/react/index.d.ts"
|
|
119
|
+
},
|
|
120
|
+
"./fonts/*": "./fonts/*",
|
|
121
|
+
"./build/*": "./build/*"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**CSS-only usage:**
|
|
127
|
+
```typescript
|
|
128
|
+
import '7k-design-system/css'; // Full bundle
|
|
129
|
+
import '7k-design-system/css/tokens'; // Tokens only
|
|
130
|
+
import '7k-design-system/css/components'; // Components only
|
|
131
|
+
import '7k-design-system/css/textures'; // Textures only
|
|
132
|
+
import '7k-design-system/css/animations'; // Animations only
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**React usage:**
|
|
136
|
+
```typescript
|
|
137
|
+
import { Button, Input, Badge, ThemeToggle, ThemeProvider, useTheme } from '7k-design-system/react';
|
|
138
|
+
import '7k-design-system/css';
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Build System
|
|
142
|
+
|
|
143
|
+
- **CSS build:** `vite build --config vite.css.config.ts` — compiles `src/css/index.css` into `dist/7k-design-system.css` with PostCSS pipeline (postcss-import, postcss-nesting, autoprefixer, cssnano)
|
|
144
|
+
- **React build:** `vite build --config vite.react.config.ts` — compiles TypeScript React components into ESM + CJS bundles with `.d.ts` declarations via vite-plugin-dts
|
|
145
|
+
- **Asset copy:** `node scripts/copy-assets.js` — copies preview/, fonts/, build/ to dist/
|
|
146
|
+
- **Development:** `npm run dev` — Vite dev server; `npm run storybook` — Storybook at port 6006
|
|
147
|
+
- **Testing:** `npm test` — Vitest + jsdom + @testing-library/react; `npm run test:a11y` — axe-core accessibility tests
|
|
148
|
+
- **Linting:** `npm run lint` — ESLint (TS/TSX) + Stylelint (CSS); `npm run typecheck` — `tsc --noEmit`
|
|
149
|
+
|
|
150
|
+
## 1. Visual Theme & Atmosphere
|
|
151
|
+
|
|
152
|
+
**Source context reference:** The brand brief specifies "Tokyo's neon atmosphere and Manga-influenced 1-bit using black and white as well as abstract 1-bit animations" and "We're using a dark theme for websites." These three constraints — neon, 1-bit, dark — define the entire visual posture below.
|
|
153
|
+
|
|
154
|
+
Tokyo neon meets manga-influenced 1-bit. The canvas is deep near-black, with sharp white text, electric magenta (`#FF0FF`) as the primary brand accent, and cyan as a secondary project accent. Black-and-white 1-bit textures — scanline overlays, halftone dot noise, glitch keyframes — provide rhythm and atmosphere. The mood is nocturnal, high-contrast, and unapologetically digital.
|
|
155
|
+
|
|
156
|
+
Company/project differentiation: the parent 7K brand uses vivid magenta (`--brand-primary`). Child projects adopt their own accent (solar, cyan, acid, ember) on the same dark base. Same system, distinct at a glance.
|
|
157
|
+
|
|
158
|
+
**Logo:** Star-burst pattern logo in `build/logo-7k.svg` — a geometric radial pattern with #FF0FF brand accent tones. Light variant at `build/logo-7k-light.svg` (light backgrounds). App icon at `build/icon.svg`.
|
|
159
|
+
|
|
160
|
+
**1-bit texture primitives (background patterns):**
|
|
161
|
+
- **Scanline**: `repeating-linear-gradient(0deg, transparent 2px, rgba(255,255,255,0.03) 2px)` — horizontal scan lines, scroll-animated. Two speeds: slow (8s) and fast (3s).
|
|
162
|
+
- **Halftone dots**: `radial-gradient(color 1px, transparent 1px)` at 4px/6px/10px spacing — manga screentone at three densities (sm/md/lg). Accent-tinted variant uses magenta dots.
|
|
163
|
+
- **Dot matrix**: Uniform dot grid at 3px (dense), 6px (standard), or 12px (sparse) spacing for texture depth.
|
|
164
|
+
- **Diagonal stripes**: 45° hatch lines at 7px or 4px pitch. Negative variant overlays pure white-on-black for high-contrast sections.
|
|
165
|
+
- **Horizontal / vertical stripes**: Linear parallel lines at 9px or 5px pitch for directional motion cues.
|
|
166
|
+
- **Crosshatch**: Dual-angle hatch (45° + -45°) for dense shading in manga panel style. Standard and dense variants.
|
|
167
|
+
- **Checkerboard**: 12px alternating squares for pixel-art motifs. One-bit variant uses pure black/white for retro game sections.
|
|
168
|
+
- **Noise**: SVG fractal noise overlay at 128px tile, 4%–12% opacity for analog CRT grain. Animatable with translate keyframes.
|
|
169
|
+
- **Vignette**: Radial gradient from transparent center to black edge. Sharp variant clips tighter for manga panel corner fade.
|
|
170
|
+
|
|
171
|
+
**Glitch primitives:**
|
|
172
|
+
- Basic glitch: 5-frame translate jitter, 0.3s, 3 iterations
|
|
173
|
+
- Complex glitch: multi-axis + skew + clip-path splits, 0.8s, 2 iterations
|
|
174
|
+
- Invert flash: full-screen filter inversion, 0.15s burst
|
|
175
|
+
|
|
176
|
+
## 1b. Background Design — 1-bit Texture System
|
|
177
|
+
|
|
178
|
+
**Source context reference:** The brief's "Manga-influenced 1-bit using black and white as well as abstract 1-bit animations" requires a structured texture system. Every background pattern below is a standalone CSS class in `src/css/textures.css` that can be applied directly or composed via `::before`/`::after` pseudo-elements.
|
|
179
|
+
|
|
180
|
+
### Texture categories
|
|
181
|
+
|
|
182
|
+
| Category | Classes | Density variants | Use case |
|
|
183
|
+
|----------|---------|------------------|----------|
|
|
184
|
+
| Scanline | `.scanline`, `.scanline-fast` | slow (8s), fast (3s) | Hero sections, full-bleed walls |
|
|
185
|
+
| Halftone dots | `.halftone-sm`, `.halftone-md`, `.halftone-lg`, `.halftone-accent` | 4px/6px/10px grid, accent-tinted | Manga panel backgrounds, card surfaces |
|
|
186
|
+
| Dot matrix | `.dot-matrix-dense`, `.dot-matrix`, `.dot-matrix-sparse` | 3px/6px/12px grid | Texture depth behind text, dividers |
|
|
187
|
+
| Diagonal stripes | `.diagonal-stripes`, `.diagonal-stripes-dense`, `.diagonal-stripes-negative` | 7px/4px pitch, pure B/W | Directional cues, loading areas |
|
|
188
|
+
| Horizontal stripes | `.stripes-h`, `.stripes-h-dense` | 9px/5px pitch | Section rhythm, horizontal dividers |
|
|
189
|
+
| Vertical stripes | `.stripes-v`, `.stripes-v-dense` | 9px/5px pitch | Sidebar textures, column dividers |
|
|
190
|
+
| Crosshatch | `.crosshatch`, `.crosshatch-dense` | 7px/4px dual-angle | Dense manga shading, error states |
|
|
191
|
+
| Checkerboard | `.checkerboard`, `.checkerboard-onebit` | 12px/16px grid, pure B/W | Retro sections, QR motifs |
|
|
192
|
+
| Noise | `.noise`, `.noise-heavy`, `.noise-animated` | 4%/12% opacity, SVG fractal | CRT grain, analog texture |
|
|
193
|
+
| Vignette | `.vignette-onebit`, `.vignette-onebit-sharp` | Soft/sharp radial fade | Panel corner fade, hero-edge vignette |
|
|
194
|
+
|
|
195
|
+
### Texture composition rules
|
|
196
|
+
|
|
197
|
+
1. **One texture per section layer.** Apply at most one texture on the background layer and one on the overlay layer (`::after`). Scanline + halftone is the default pair for hero sections.
|
|
198
|
+
2. **Opacity scales with section density.** Hero/landing sections use lighter textures (5–10% opacity). Data-dense utility sections use stronger textures (10–15% opacity) or none.
|
|
199
|
+
3. **No texture on interactive surfaces.** Cards, buttons, inputs, and form controls must not carry background textures that interfere with legibility. Use solid `--bg-elevated` instead.
|
|
200
|
+
4. **Texture as section separator.** When transitioning between full-bleed sections, add a `.separator-onebit` or `.stripes-h` band (40–80px tall) as a visual break — never use shadow or blur transitions.
|
|
201
|
+
5. **Layering order:** Base color → texture background → content container → optional scanline overlay. The overlay must have `pointer-events: none` and `z-index: 1` so it does not block interaction.
|
|
202
|
+
6. **Full-bleed hero walls** use scanline + vignette simultaneously: scanline on `::after` for the line pattern, vignette on `::before` for the edge fade. Both get `pointer-events: none`.
|
|
203
|
+
|
|
204
|
+
### Section rhythm (background arc)
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
Section 1 (hero) — Scanline overlay + noise grain, full-bleed
|
|
208
|
+
↓ separator-onebit
|
|
209
|
+
Section 2 (content) — Solid surface, no texture (reading zone)
|
|
210
|
+
↓ separator-onebit
|
|
211
|
+
Section 3 (stats) — Halftone-md background with accent tint
|
|
212
|
+
↓ separator-onebit
|
|
213
|
+
Section 4 (cta) — Scanline-fast overlay, invert section if 1-bit
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 1-bit section variants
|
|
217
|
+
|
|
218
|
+
- **Full invert section**: swap `--bg-base` with `--onebit-white`, `--text-primary` with `--onebit-black`. Used for CTAs, callout panels, or manga-style splash panels. Add `.diagonal-stripes-negative` for max contrast.
|
|
219
|
+
- **Scanline hero**: dark canvas, scanline overlay, accent headline with glow. The scanline `::after` sits above the background but below all content (`z-index: 1`). Content gets `position: relative; z-index: 2`.
|
|
220
|
+
- **Halftone card wall**: grid of cards with `.halftone-sm` or `.halftone-md` on the section container. Each card has solid `.card` background that breaks the texture — texture only lives between cards.
|
|
221
|
+
- **Noise backdrop**: `.noise` on full-page backgrounds for analog feel. Use `.noise-heavy` only on splash/loading screens where content density is low.
|
|
222
|
+
- **Vignette frame**: `.vignette-onebit` on slide/scene containers to draw the eye center. Used in intro animations and splash panels.
|
|
223
|
+
|
|
224
|
+
## 1c. Isometric Backgrounds — CSS-only 3D Perspective Patterns
|
|
225
|
+
|
|
226
|
+
**Source context reference:** The brief's "Manga-influenced 1-bit" and "Tokyo's neon atmosphere" extend naturally into isometric perspective. These patterns use CSS gradients at 30°/-30°/150°/60° angles to create the illusion of 3D space — diamond grids, cube walls, pyramid steps, honeycomb hex grids, pipe tunnels, and multi-layer terrain — all rendered in pure CSS with no images.
|
|
227
|
+
|
|
228
|
+
### Isometric pattern library
|
|
229
|
+
|
|
230
|
+
| Class | Description | Technique |
|
|
231
|
+
|-------|-------------|-----------|
|
|
232
|
+
| `.isometric-grid` | Diamond tiling from dual 30°/-30° hatch lines at 24px pitch | `repeating-linear-gradient(30deg)` + `(-30deg)` |
|
|
233
|
+
| `.isometric-grid-dense` | Tighter 12px diamond grid | Same technique, denser pitch |
|
|
234
|
+
| `.isometric-grid-accent` | Magenta-tinted 24px diamond grid | Same, with `--magenta-500 / 0.12` stroke |
|
|
235
|
+
| `.isometric-cubes` | 3-face cube wall: right (150°), top (-30°), left (30°) faces at 40px | 3 `repeating-linear-gradient` layers with face-specific opacity |
|
|
236
|
+
| `.isometric-cubes-dense` | 20px cube wall | Same, finer resolution |
|
|
237
|
+
| `.isometric-cubes-accent` | Magenta-tinted cube wall | Same, with accent hue fills |
|
|
238
|
+
| `.isometric-pyramid` | Ascending zigzag steps: 150° + -30° gradients | Dual gradient with offset phase |
|
|
239
|
+
| `.isometric-hex` | Honeycomb hex grid from 60°/-60°/0° overlapping | 3 `repeating-linear-gradient` layers |
|
|
240
|
+
| `.isometric-pipes` | Converging tunnel perspective: left/right walls (30°/-30°) + floor (0°) | 3-gradient tunnel simulation |
|
|
241
|
+
| `.isometric-pipes-fast` | Denser tunnel, 8px walls | Same, tighter spacing |
|
|
242
|
+
| `.isometric-terrain` | Multi-layer depth: horizontal + 30° + -30° zigzag | 3-layer parallax-ready composition |
|
|
243
|
+
|
|
244
|
+
### Composition rules
|
|
245
|
+
|
|
246
|
+
1. **One isometric pattern per section.** Apply at most one isometric gradient per container. Stack with scanline overlay via class stacking.
|
|
247
|
+
2. **No texture on interactive surfaces.** Cards, buttons, inputs, and form controls must not carry isometric backgrounds — use solid `--bg-elevated` instead.
|
|
248
|
+
3. **Animate with animation classes.** Combine with `.iso-grid-scroll` for diagonal grid movement, `.iso-terrain-shift` for parallax depth layers.
|
|
249
|
+
4. **Reduced motion:** All isometric animations collapse at `prefers-reduced-motion: reduce`.
|
|
250
|
+
|
|
251
|
+
## 2. Color
|
|
252
|
+
|
|
253
|
+
**Source context reference:** The brand hex #FF0FF is the single brand color. All color tokens use hex values mapped through CSS custom properties.
|
|
254
|
+
|
|
255
|
+
The color system has three strict layers:
|
|
256
|
+
|
|
257
|
+
1. **Raw ramps** — 11-step scales (50–950) for Neutral, Magenta, Solar, Cyan, Acid, Ember, plus extended below-ramp values (1000, void) and 4 semantic ramps (Success, Warning, Danger, Info). Never reference these directly in components.
|
|
258
|
+
2. **Theme role mapping** — `--bg-*`, `--text-*`, `--border-*`, `--brand-*`, `--status-*`, `--accent-*` tokens that map ramp values to functional roles. Remap per dark/light theme. This is the only layer components touch.
|
|
259
|
+
3. **Semantic colors** — `--status-success/warning/danger/info` tokens bound by **meaning, not decoration**. Use only for actual machine-state indication (badges, toasts, validation). Never use for decorative borders, accent accents, or non-status backgrounds.
|
|
260
|
+
|
|
261
|
+
> See `preview/colors-theme-dark.html` for the default theme or `preview/colors-theme-light.html` for the opt-in light theme.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
### Layer 1 — Raw Color Ramps
|
|
265
|
+
|
|
266
|
+
All ramps follow the same 11-step pattern (50 = lightest, 950 = darkest). Two extra steps exist below the ramp for true backgrounds.
|
|
267
|
+
|
|
268
|
+
#### Neutral ramp (slight cool cast, hue ~330)
|
|
269
|
+
|
|
270
|
+
| Token | Hex | Dark role | Light role |
|
|
271
|
+
|-------|-----|-----------|------------|
|
|
272
|
+
| `--neutral-50` | `#FAFAFB` | — | `--bg-base`, `--bg-void` |
|
|
273
|
+
| `--neutral-100` | `#EEEEF1` | — | `--bg-elevated` |
|
|
274
|
+
| `--neutral-200` | `#D7D7DC` | — | `--bg-raised`, `--status-neutral-bg` |
|
|
275
|
+
| `--neutral-300` | `#B0B0B8` | `--text-secondary` | `--bg-overlay`, `--text-disabled`, `--status-neutral-fg` |
|
|
276
|
+
| `--neutral-400` | `#82828A` | `--status-neutral` | `--bg-pressed`, `--text-tertiary`, `--text-placeholder` |
|
|
277
|
+
| `--neutral-500` | `#6B6B72` | `--text-tertiary`, `--text-placeholder` | `--text-secondary` |
|
|
278
|
+
| `--neutral-600` | `#50505A` | `--text-disabled` | — |
|
|
279
|
+
| `--neutral-700` | `#3A3A42` | `--bg-pressed` | — |
|
|
280
|
+
| `--neutral-800` | `#26262B` | `--bg-overlay`, `--status-neutral-bg` | — |
|
|
281
|
+
| `--neutral-900` | `#1C1C22` | `--bg-raised` | `--text-primary` |
|
|
282
|
+
| `--neutral-950` | `#131318` | `--bg-elevated` | — |
|
|
283
|
+
| `--neutral-1000` | `#0A0A0D` | `--bg-base` | — |
|
|
284
|
+
| `--neutral-void` | `#000000` | `--bg-void`, `--text-on-brand`, `--text-inverse` | — |
|
|
285
|
+
|
|
286
|
+
**Usage rule:** Components reference the *role* tokens (e.g. `var(--bg-elevated)`), never the raw ramp tokens (e.g. `var(--neutral-950)`). The ramp table above documents what each step maps to — not what you should write.
|
|
287
|
+
|
|
288
|
+
#### Brand ramp — Magenta (hue ~330)
|
|
289
|
+
|
|
290
|
+
| Token | Hex | Dark role | Light role |
|
|
291
|
+
|-------|-----|-----------|------------|
|
|
292
|
+
| `--magenta-50` | `#FFE5FF` | `--brand-primary-subtle` (dark) | — |
|
|
293
|
+
| `--magenta-100` | `#FFC2FF` | — | `--brand-primary-subtle` (light) |
|
|
294
|
+
| `--magenta-200` | `#FF99FF` | — | `--brand-primary-muted` (light) |
|
|
295
|
+
| `--magenta-300` | `#FF66FF` | — | — |
|
|
296
|
+
| `--magenta-400` | `#FF33FF` | `--brand-primary-hover` (dark) | — |
|
|
297
|
+
| `--magenta-500` | `#FF00FF` | `--brand-primary` · `--border-focus` · `--border-brand` · `--accent-square` | same across themes |
|
|
298
|
+
| `--magenta-600` | `#D600D6` | `--brand-primary-active` (dark) | `--brand-primary-hover` (light) |
|
|
299
|
+
| `--magenta-700` | `#A800A8` | — | `--brand-primary-active` (light) |
|
|
300
|
+
| `--magenta-800` | `#800080` | `--brand-primary-muted` (dark) | — |
|
|
301
|
+
| `--magenta-900` | `#570057` | — | — |
|
|
302
|
+
| `--magenta-950` | `#330033` | `--brand-primary-subtle` (dark) | — |
|
|
303
|
+
|
|
304
|
+
#### Project accent ramps — Solar / Cyan / Acid / Ember
|
|
305
|
+
|
|
306
|
+
Each child project gets a single accent hue. Same 11-step structure; only the base (--500) and the theme-mapped hover (--600 in light) differ.
|
|
307
|
+
|
|
308
|
+
**Solar — Triangle (hue ~50)**
|
|
309
|
+
|
|
310
|
+
`--solar-50: #FFFCE5` → `--solar-500: #FFD60A` → `--solar-950: #332B02`.
|
|
311
|
+
Accent token: `--accent-triangle`. Dark: `var(--solar-500)`, Light: `var(--solar-600)`.
|
|
312
|
+
|
|
313
|
+
**Cyan — Circle (hue ~190)**
|
|
314
|
+
|
|
315
|
+
`--cyan-50: #E5FBFF` → `--cyan-500: #00E5FF` → `--cyan-950: #002A2E`.
|
|
316
|
+
Accent token: `--accent-circle`. Dark: `var(--cyan-500)`, Light: `var(--cyan-600)`.
|
|
317
|
+
|
|
318
|
+
**Acid — Grid (hue ~105)**
|
|
319
|
+
|
|
320
|
+
`--acid-50: #F2FFE5` → `--acid-500: #7CFF00` → `--acid-950: #172E00`.
|
|
321
|
+
Accent token: `--accent-grid`. Dark: `var(--acid-500)`, Light: `var(--acid-600)`.
|
|
322
|
+
|
|
323
|
+
**Ember — Line (hue ~15)**
|
|
324
|
+
|
|
325
|
+
`--ember-50: #FFEEE5` → `--ember-500: #FF6B35` → `--ember-950: #331205`.
|
|
326
|
+
Accent token: `--accent-line`. Dark: `var(--ember-500)`, Light: `var(--ember-600)`.
|
|
327
|
+
|
|
328
|
+
#### Semantic ramps (raw)
|
|
329
|
+
|
|
330
|
+
Each has a full 11-step scale (50–950). Never use directly — always go through `--status-{name}`, `--status-{name}-bg`, or `--status-{name}-fg`.
|
|
331
|
+
|
|
332
|
+
| Ramp | 50 | 100 | 300 | 500 (base) | 700 | 950 |
|
|
333
|
+
|------|----|-----|-----|------------|-----|-----|
|
|
334
|
+
| Success | `#E5FCEF` | `#B8F5D2` | `#5CE69A` | `#00E676` | `#008A46` | `#002915` |
|
|
335
|
+
| Warning | `#FFF8E5` | `#FFEAB8` | `#FFCE5C` | `#FFB300` | `#A87600` | `#332400` |
|
|
336
|
+
| Danger | `#FFE5EB` | `#FFB8C5` | `#FF5C7A` | `#FF3B5C` | `#A82338` | `#330A10` |
|
|
337
|
+
| Info | `#E5EFFF` | `#B8D2FF` | `#5C99FF` | `#3F8EFF` | `#1F58A8` | `#091A33` |
|
|
338
|
+
|
|
339
|
+
#### 1-bit primitives
|
|
340
|
+
|
|
341
|
+
- `--onebit-black: #000000` (`oklch(0% 0 0)`)
|
|
342
|
+
- `--onebit-white: #FFFFFF` (`oklch(100% 0 0)`)
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
### Layer 2 — Theme Role Mapping
|
|
346
|
+
|
|
347
|
+
**Dark is the default.** Light is opt-in via `@media (prefers-color-scheme: light)` or `html[data-theme="light"` (set by `ThemeToggle` component in `src/react/components/ThemeToggle.tsx`). The same ramp primitives are used by both themes — only the role-to-ramp mapping changes.
|
|
348
|
+
|
|
349
|
+
#### Surface ladder — backgrounds
|
|
350
|
+
|
|
351
|
+
| Token | Dark value | Light value | Usage rule |
|
|
352
|
+
|-------|-----------|-------------|------------|
|
|
353
|
+
| `--bg-void` | `--neutral-void` | `--neutral-50` | Page background only. Outermost canvas. |
|
|
354
|
+
| `--bg-base` | `--neutral-1000` | `--neutral-50` | Default surface. Most common container. |
|
|
355
|
+
| `--bg-elevated` | `--neutral-950` | `--neutral-100` | Cards, panels, section backgrounds. |
|
|
356
|
+
| `--bg-raised` | `--neutral-900` | `--neutral-200` | Modals, dropdowns, popovers, inputs. |
|
|
357
|
+
| `--bg-overlay` | `--neutral-800` | `--neutral-300` | Hover surfaces, tooltip backgrounds. |
|
|
358
|
+
| `--bg-pressed` | `--neutral-700` | `--neutral-400` | Active/pressed state. |
|
|
359
|
+
| `--bg-translucent` | `rgba(255,255,255,0.04)` | `rgba(0,0,0,0.04)` | Subtle backdrop overlay. |
|
|
360
|
+
|
|
361
|
+
**Ladder rule:** Step one level for each layer of depth. Never skip from `--bg-void` to `--bg-raised`.
|
|
362
|
+
`void → base → elevated → raised → overlay → pressed`
|
|
363
|
+
|
|
364
|
+
#### Text ladder
|
|
365
|
+
|
|
366
|
+
| Token | Dark value | Light value | Usage rule |
|
|
367
|
+
|-------|-----------|-------------|------------|
|
|
368
|
+
| `--text-primary` | `--neutral-50` | `--neutral-900` | Headlines, body paragraphs, labels. |
|
|
369
|
+
| `--text-secondary` | `--neutral-300` | `--neutral-500` | Lede, card body, subtle headings. |
|
|
370
|
+
| `--text-tertiary` | `--neutral-500` | `--neutral-400` | Captions, mono labels, metadata. |
|
|
371
|
+
| `--text-placeholder` | `--neutral-500` | `--neutral-400` | Form field hints and placeholders. |
|
|
372
|
+
| `--text-disabled` | `--neutral-600` | `--neutral-300` | Truly inactive elements. |
|
|
373
|
+
| `--text-inverse` | `--neutral-void` | `--neutral-50` | Text on inverted/dark surfaces. |
|
|
374
|
+
|
|
375
|
+
#### Border ladder
|
|
376
|
+
|
|
377
|
+
| Token | Dark value | Light value | Usage rule |
|
|
378
|
+
|-------|-----------|-------------|------------|
|
|
379
|
+
| `--border-subtle` | `rgba(255,255,255,0.06)` | `rgba(0,0,0,0.06)` | Internal dividers, hr rules. |
|
|
380
|
+
| `--border-default` | `rgba(255,255,255,0.10)` | `rgba(0,0,0,0.10)` | Cards, inputs, container strokes. |
|
|
381
|
+
| `--border-strong` | `rgba(255,255,255,0.18)` | `rgba(0,0,0,0.18)` | Hover emphasis, focus rings. |
|
|
382
|
+
| `--border-focus` | `--magenta-500` | `--magenta-500` | Form focus rings (brand). |
|
|
383
|
+
| `--border-brand` | `--magenta-500` | `--magenta-500` | Decorative brand border. |
|
|
384
|
+
|
|
385
|
+
**Ladder rule:** `subtle → default → strong → focus/brand`. Use `--border-subtle` for separators, `--border-default` for card outlines.
|
|
386
|
+
|
|
387
|
+
#### Brand tokens
|
|
388
|
+
|
|
389
|
+
| Token | Dark value | Light value | Usage rule |
|
|
390
|
+
|-------|-----------|-------------|------------|
|
|
391
|
+
| `--brand-primary` | `--magenta-500` | `--magenta-500` | CTAs, focus rings, active nav, brand text. |
|
|
392
|
+
| `--brand-primary-hover` | `--magenta-400` | `--magenta-600` | Accent hover state. |
|
|
393
|
+
| `--brand-primary-active` | `--magenta-600` | `--magenta-700` | Accent pressed state. |
|
|
394
|
+
| `--brand-primary-muted` | `--magenta-800` | `--magenta-200` | Muted brand backgrounds. |
|
|
395
|
+
| `--brand-primary-subtle` | `--magenta-950` | `--magenta-100` | Subtle brand surfaces. |
|
|
396
|
+
| `--brand-primary-glow` | `color-mix(in srgb, var(--magenta-500) 25%, transparent)` | `color-mix(in srgb, var(--magenta-500) 15%, transparent)` | Glow shadow source. |
|
|
397
|
+
| `--text-on-brand` | `--neutral-void` | `--neutral-void` | Text on brand-colored fills. |
|
|
398
|
+
|
|
399
|
+
#### Status tokens
|
|
400
|
+
|
|
401
|
+
| Token | Dark value | Light value | Usage rule |
|
|
402
|
+
|-------|-----------|-------------|------------|
|
|
403
|
+
| `--status-success` | `--success-500` | `--success-500` | Positive outcome / online. |
|
|
404
|
+
| `--status-success-bg` | `--success-950` | `--success-100` | Background for success badges. |
|
|
405
|
+
| `--status-success-fg` | `--success-300` | `--success-700` | Foreground for success badges. |
|
|
406
|
+
| `--status-warning` | `--warning-500` | `--warning-500` | Attention needed. |
|
|
407
|
+
| `--status-warning-bg` | `--warning-950` | `--warning-100` | Background for warning badges. |
|
|
408
|
+
| `--status-warning-fg` | `--warning-300` | `--warning-700` | Foreground for warning badges. |
|
|
409
|
+
| `--status-danger` | `--danger-500` | `--danger-500` | Error / destructive. |
|
|
410
|
+
| `--status-danger-bg` | `--danger-950` | `--danger-100` | Background for danger badges. |
|
|
411
|
+
| `--status-danger-fg` | `--danger-300` | `--danger-700` | Foreground for danger badges. |
|
|
412
|
+
| `--status-info` | `--info-500` | `--info-500` | Informational. |
|
|
413
|
+
| `--status-info-bg` | `--info-950` | `--info-100` | Background for info badges. |
|
|
414
|
+
| `--status-info-fg` | `--info-300` | `--info-700` | Foreground for info badges. |
|
|
415
|
+
| `--status-neutral` | `--neutral-400` | `--neutral-400` | Default / inactive. |
|
|
416
|
+
| `--status-neutral-bg` | `--neutral-900` | `--neutral-200` | Background for neutral badges. |
|
|
417
|
+
| `--status-neutral-fg` | `--neutral-300` | `--neutral-700` | Foreground for neutral badges. |
|
|
418
|
+
|
|
419
|
+
**Rule:** Status bg/fg tokens are 5-step deep from the base (dark: base+450, light: base−400 for bg; dark: base−200, light: base+200 for fg). This gives tinted backgrounds in light mode and deep backgrounds in dark mode — always translucent-feeling without alpha.
|
|
420
|
+
|
|
421
|
+
#### Project accent tokens
|
|
422
|
+
|
|
423
|
+
| Token | Dark base | Light base | Project |
|
|
424
|
+
|-------|-----------|------------|---------|
|
|
425
|
+
| `--accent-square` | `--magenta-500` | `--magenta-500` | 7K parent |
|
|
426
|
+
| `--accent-triangle` | `--solar-500` | `--solar-600` | Triangle |
|
|
427
|
+
| `--accent-circle` | `--cyan-500` | `--cyan-600` | Circle |
|
|
428
|
+
| `--accent-grid` | `--acid-500` | `--acid-600` | Grid |
|
|
429
|
+
| `--accent-line` | `--ember-500` | `--ember-600` | Line |
|
|
430
|
+
|
|
431
|
+
Light theme shifts project accents one step darker (500→600) to maintain contrast against the brighter background.
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
### Layer 3 — Semantic Colors: Meaning, Not Decoration
|
|
435
|
+
|
|
436
|
+
Semantic colors exist **only** for status indication. Each maps to exactly one meaning.
|
|
437
|
+
|
|
438
|
+
| Match | Token | Example |
|
|
439
|
+
|-------|-------|---------|
|
|
440
|
+
| Positive outcome / online | `--status-success` + `--status-success-bg` | Badge: "Online" in green |
|
|
441
|
+
| Attention needed | `--status-warning` + `--status-warning-bg` | Badge: "Pending" in amber |
|
|
442
|
+
| Error / destructive | `--status-danger` + `--status-danger-bg` | Badge: "Error" in red |
|
|
443
|
+
| Informational | `--status-info` + `--status-info-bg` | Badge: "Info" in blue |
|
|
444
|
+
| Default / inactive | `--status-neutral` + `--status-neutral-bg` | Badge: "Offline" in grey |
|
|
445
|
+
|
|
446
|
+
**Do not use semantic colors for:**
|
|
447
|
+
- Decorative borders on cards
|
|
448
|
+
- Accent accent headers
|
|
449
|
+
- Non-status icon fills
|
|
450
|
+
- Background washes for sections
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
### Usage rules
|
|
454
|
+
|
|
455
|
+
1. **Neutral ladder** — Step one surface layer per depth level: `void → base → elevated → raised → overlay → pressed`. Never skip a level for visual emphasis.
|
|
456
|
+
2. **Accent on action, not surface** — Brand appears on primary CTAs, focus rings, active borders, brand typography. Never as a full surface background fill.
|
|
457
|
+
3. **Semantic = meaning only** — Status hues exist for machine-state communication (badge bg, toast icon, validation message, online/offline dot). If it doesn't communicate a machine state, use the raw ramps instead.
|
|
458
|
+
4. **Status bg uses `--*-bg`** — Status badges and pills use the `--status-*-bg` token, never the solid `--*-500` as a fill.
|
|
459
|
+
5. **Project scoping** — Parent 7K uses `--accent-square` (magenta). Child projects swap `--accent-*` for their own hue. The neutral ramp stays unchanged.
|
|
460
|
+
6. **No raw ramp references in components** — Always reference role tokens (`--bg-elevated`, `--text-primary`, `--border-default`), never raw ramp tokens (`--neutral-950`, `--neutral-50`, etc.). This is how theme switching works.
|
|
461
|
+
7. **Dark is default, light is opt-in** — `:root` holds dark token mappings. `@media (prefers-color-scheme: light)` overrides only the role tokens. Primitive ramps are shared and unchanged.
|
|
462
|
+
|
|
463
|
+
## 3. Typography
|
|
464
|
+
|
|
465
|
+
**Source context reference:** The brand brief says "We only have 1 font and it's Geist." The system interprets this as the **Geist superfamily**: Geist (sans-serif) for body and headings, Geist Mono for labels/code/tabular data, and Geist Pixel (5 geometric variants) for ornamental display moments. Mono labels serve as the "connective tissue" — the engineering-blueprint aesthetic comes from seeing mono metadata everywhere.
|
|
466
|
+
|
|
467
|
+
### Three-font system
|
|
468
|
+
|
|
469
|
+
| Family | Role | Weight range | Source |
|
|
470
|
+
|--------|------|-------------|--------|
|
|
471
|
+
| **Geist** (sans) | Display, headings, body, UI text | 100–900 | CDN (`geist` npm package) |
|
|
472
|
+
| **Geist Mono** | Labels, code, tabular data, metadata | 400, 500 | CDN (`geist` npm package) |
|
|
473
|
+
| **Geist Pixel** (5 variants) | Ornamental display, pixel-constrained surfaces, hero wordmarks | 400–800 (one per variant) | Local `fonts/` TTFs |
|
|
474
|
+
|
|
475
|
+
### Geist Pixel variant → project accent pairing
|
|
476
|
+
|
|
477
|
+
| Variant | Weight | Pairs with | Best for |
|
|
478
|
+
|---------|--------|------------|----------|
|
|
479
|
+
| **Square** | 400 (Regular) | Magenta (7K parent) | Body-sized pixel text, data displays |
|
|
480
|
+
| **Circle** | 500 (Medium) | Cyan | Buttons, badges, navigation |
|
|
481
|
+
| **Grid** | 600 (SemiBold) | Acid (Grid project) | Section titles, stat values |
|
|
482
|
+
| **Line** | 700 (Bold) | Ember (Line project) | Display headlines, hero text |
|
|
483
|
+
| **Triangle** | 800 (ExtraBold) | Solar (Triangle project) | Hero wordmarks, giant headlines |
|
|
484
|
+
|
|
485
|
+
### Font stacks
|
|
486
|
+
```
|
|
487
|
+
--font-sans: 'Geist', system-ui, -apple-system, sans-serif;
|
|
488
|
+
--font-mono: 'Geist Mono', ui-monospace, 'SF Mono', Menlo, monospace;
|
|
489
|
+
--font-pixel: 'Geist Pixel', monospace;
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
### Type scale — engineering blueprint
|
|
493
|
+
|
|
494
|
+
| Token | Size | Family / Weight | Usage |
|
|
495
|
+
|-------|------|----------------|-------|
|
|
496
|
+
| `--text-display` | `clamp(48px, 8vw, 160px)` | Geist 900 -0.04em | Hero numerals, giant headlines |
|
|
497
|
+
| `--text-h1` | 4rem (64px) | Geist 700 -0.04em | Page titles |
|
|
498
|
+
| `--text-h2` | 3rem (48px) | Geist 700 -0.03em | Section titles |
|
|
499
|
+
| `--text-h3` | 2rem (32px) | Geist 600 -0.02em | Sub-section headers |
|
|
500
|
+
| `--text-h4` | 1.5rem (24px) | Geist 600 -0.02em | Card titles |
|
|
501
|
+
| `--text-body-lg` | 1.125rem (18px) | Geist 400 -0.01em | Larger body / lede |
|
|
502
|
+
| `--text-body` | 1rem (16px) | Geist 400 -0.01em | Body paragraphs |
|
|
503
|
+
| `--text-body-sm` | 0.875rem (14px) | Geist 400 -0.01em | Secondary text |
|
|
504
|
+
| `--text-caption` | 0.75rem (12px) | Geist 500 | Metadata, timestamps |
|
|
505
|
+
| `--text-mono-label` | 0.6875rem (11px) | Geist Mono 500 0.12em uppercase | Labels, badges, form labels — the "connective tissue" |
|
|
506
|
+
| `--text-mono-body` | 0.8125rem (13px) | Geist Mono 400 | Code blocks, tabular data |
|
|
507
|
+
|
|
508
|
+
### Legacy alignment tokens (deprecated but kept for compatibility)
|
|
509
|
+
```
|
|
510
|
+
--text-7xl 7.5rem (120px) --text-6xl 5.5rem (88px)
|
|
511
|
+
--text-5xl 4rem (64px) --text-4xl 3rem (48px)
|
|
512
|
+
--text-3xl 2.25rem (36px) --text-2xl 1.75rem (28px)
|
|
513
|
+
--text-xl 1.375rem (22px) --text-lg 1.125rem (18px)
|
|
514
|
+
--text-base 1rem (16px) --text-sm 0.875rem (14px)
|
|
515
|
+
--text-xs 0.75rem (12px) --text-2xs 0.625rem (10px)
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### Weight scale
|
|
519
|
+
```
|
|
520
|
+
--weight-thin: 100 --weight-extralight: 200 --weight-light: 300
|
|
521
|
+
--weight-regular: 400 --weight-medium: 500 --weight-semibold: 600
|
|
522
|
+
--weight-bold: 700 --weight-extrabold: 800 --weight-black: 900
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### Line heights
|
|
526
|
+
```
|
|
527
|
+
--leading-none: 1 --leading-tight: 1.15
|
|
528
|
+
--leading-snug: 1.3 --leading-normal: 1.5
|
|
529
|
+
--leading-relaxed: 1.65
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### Letter spacing
|
|
533
|
+
```
|
|
534
|
+
--tracking-tightest: -0.04em --tracking-tighter: -0.02em
|
|
535
|
+
--tracking-tight: -0.01em --tracking-normal: 0
|
|
536
|
+
--tracking-wide: 0.02em --tracking-wider: 0.06em
|
|
537
|
+
--tracking-widest: 0.14em
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### Mono-label language — "connective tissue"
|
|
541
|
+
Every label, badge, form label, tab, breadcrumb, and status indicator uses `--text-mono-label` (Geist Mono, 11px, 500 weight, 0.12em uppercase). This creates the engineering-blueprint aesthetic: the reader always knows which layer they are looking at because the meta-information reads like a schematic.
|
|
542
|
+
|
|
543
|
+
### Numerics
|
|
544
|
+
- All data / metrics use `font-family: var(--font-mono)` with `font-variant-numeric: tabular-nums`
|
|
545
|
+
- Display: -0.04em, h1: -0.04em, h2: -0.03em, h3: -0.02em, h4: -0.02em
|
|
546
|
+
|
|
547
|
+
## 4. Spacing
|
|
548
|
+
|
|
549
|
+
**Source context reference:** The brief calls for "a very complete and detailed design system" without specifying spacing units. A 4px baseline grid is chosen as industry standard for web-scale systems, with 14 steps to cover micro-spacing through section gaps.
|
|
550
|
+
|
|
551
|
+
### Scale (4px grid, rem values)
|
|
552
|
+
|
|
553
|
+
```
|
|
554
|
+
--space-0 0 --space-1 0.25rem (4px) --space-2 0.5rem (8px)
|
|
555
|
+
--space-3 0.75rem (12px) --space-4 1rem (16px) --space-5 1.25rem (20px)
|
|
556
|
+
--space-6 1.5rem (24px) --space-8 2rem (32px) --space-10 2.5rem (40px)
|
|
557
|
+
--space-12 3rem (48px) --space-16 4rem (64px) --space-20 5rem (80px)
|
|
558
|
+
--space-24 6rem (96px) --space-32 8rem (128px)
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
### Radius
|
|
562
|
+
|
|
563
|
+
```
|
|
564
|
+
--radius-none 0 --radius-xs 2px --radius-sm 4px
|
|
565
|
+
--radius-md 8px --radius-lg 12px --radius-xl 16px
|
|
566
|
+
--radius-2xl 24px --radius-full 9999px
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
Sharp (0px) and subtle (2–4px) are preferred for 1-bit elements. 8–12px for interactive cards and dialogs.
|
|
570
|
+
|
|
571
|
+
### Shadows
|
|
572
|
+
|
|
573
|
+
```
|
|
574
|
+
--shadow-sm: 0 1px 2px rgba(0,0,0,0.4)
|
|
575
|
+
--shadow-md: 0 4px 12px rgba(0,0,0,0.5)
|
|
576
|
+
--shadow-lg: 0 12px 32px rgba(0,0,0,0.6)
|
|
577
|
+
--shadow-xl: 0 24px 64px rgba(0,0,0,0.7)
|
|
578
|
+
--shadow-glow: 0 0 0 1px var(--brand-primary), 0 0 24px var(--brand-primary-glow)
|
|
579
|
+
--shadow-inset: inset 0 1px 0 rgba(255,255,255,0.04)
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
### Motion
|
|
583
|
+
|
|
584
|
+
```
|
|
585
|
+
--ease-out: cubic-bezier(0.16, 1, 0.3, 1)
|
|
586
|
+
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1)
|
|
587
|
+
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1)
|
|
588
|
+
--duration-instant: 80ms
|
|
589
|
+
--duration-fast: 150ms
|
|
590
|
+
--duration-base: 240ms
|
|
591
|
+
--duration-slow: 400ms
|
|
592
|
+
--duration-slower: 640ms
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
## 5. Layout & Composition
|
|
596
|
+
|
|
597
|
+
**Source context reference:** The brief's "tech company with different projects" suggests a dashboard/app-shell layout pattern. The 12-column grid supports both marketing pages and data-dense project dashboards.
|
|
598
|
+
|
|
599
|
+
### Container widths
|
|
600
|
+
```
|
|
601
|
+
--container-sm: 640px
|
|
602
|
+
--container-md: 960px
|
|
603
|
+
--container-lg: 1200px
|
|
604
|
+
--container-xl: 1440px
|
|
605
|
+
--grid-gutter: var(--space-6)
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
### Z-index scale
|
|
609
|
+
```
|
|
610
|
+
--z-base: 0
|
|
611
|
+
--z-raised: 10
|
|
612
|
+
--z-sticky: 100
|
|
613
|
+
--z-overlay: 200
|
|
614
|
+
--z-modal: 300
|
|
615
|
+
--z-toast: 400
|
|
616
|
+
--z-max: 999
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
### Grid
|
|
620
|
+
- 12-column responsive grid, `--grid-gutter` (24px) gutter
|
|
621
|
+
- Breakpoints: 480px (mobile), 768px (tablet), 1024px (desktop), 1440px (wide)
|
|
622
|
+
- Max content width: 1280px, centered
|
|
623
|
+
|
|
624
|
+
### Navigation
|
|
625
|
+
- Sticky top nav (frosted glass) on dark bg
|
|
626
|
+
- Bottom tab bar on mobile, side nav for app shells
|
|
627
|
+
- Active nav item: accent dot indicator
|
|
628
|
+
|
|
629
|
+
### 1-bit section rhythm
|
|
630
|
+
- Scanline overlay on hero / full-bleed sections
|
|
631
|
+
- Halftone dot separators between content blocks
|
|
632
|
+
- Full-bleed sections use `.separator-onebit` (2px white line at 25% opacity) as rhythm breaks
|
|
633
|
+
- Texture shift between sections: scanline → solid → halftone → solid → scanline. Never two textured sections adjacent.
|
|
634
|
+
- Manga panel composition: content is the "panel" (solid black border), background is the "page" (noise or scanline). Each panel gets a `.vignette-onebit` edge fade.
|
|
635
|
+
|
|
636
|
+
### Product shell layout
|
|
637
|
+
```
|
|
638
|
+
┌──────────────────────────────────────────┐
|
|
639
|
+
│ Sidebar (240px) │ Main content area │
|
|
640
|
+
│ ┌──────────────┐ │ ┌──────────────────┐ │
|
|
641
|
+
│ │ 7K logo │ │ │ Page heading │ │
|
|
642
|
+
│ │ │ │ │ Stat grid (4×) │ │
|
|
643
|
+
│ ├──────────────┤ │ │ Module cards (4×)│ │
|
|
644
|
+
│ │ Nav items │ │ │ │ │
|
|
645
|
+
│ │ ● Dashboard │ │ └──────────────────┘ │
|
|
646
|
+
│ │ ● Projects │ │ ┌──────────────────┐ │
|
|
647
|
+
│ │ ● Analytics │ │ │ Command input │ │
|
|
648
|
+
│ │ ● Settings │ │ └──────────────────┘ │
|
|
649
|
+
│ └──────────────┘ │ │
|
|
650
|
+
└──────────────────────────────────────────┘
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
## 6. Components
|
|
654
|
+
|
|
655
|
+
**Source context reference:** The 7K design system uses a **unified 1-bit component library**. All components share pure black backgrounds (`#000000`), pure white foreground (`#FFFFFF`), zero-radius corners, 2px white borders, and invert-on-hover interaction. Thin accent layer modifiers add color to specific components without breaking the 1-bit feel.
|
|
656
|
+
|
|
657
|
+
### 6a. Button system
|
|
658
|
+
|
|
659
|
+
**Modern neon** — the only button system. All buttons use `mono-label` typography (Geist Mono, 11px, 500 weight, 0.12em uppercase) and 4px border-radius. Accent fills use the brand-primary ramp (500→hover:400→active:600). Button groups, split buttons, and loading state are built on the same base.
|
|
660
|
+
|
|
661
|
+
| Class | Description |
|
|
662
|
+
|-------|-------------|
|
|
663
|
+
| `.btn-modern` | Base: mono-label typography, 12px/20px padding, `rounded.sm` (4px) |
|
|
664
|
+
| `.btn-modern-primary` | `--brand-primary` (`--magenta-500`) fill, `--brand-primary-hover` on hover + glow shadow |
|
|
665
|
+
| `.btn-modern-secondary` | `--bg-raised` fill, `--bg-overlay` on hover |
|
|
666
|
+
| `.btn-modern-ghost` | Transparent, `--text-secondary` text, subtle bg on hover |
|
|
667
|
+
| `.btn-modern-glow` | `--magenta-500` fill + neon glow, `--magenta-400` on hover |
|
|
668
|
+
| `.btn-modern-glow-cyan` | `--cyan-500` fill + cyan glow, `--cyan-400` on hover |
|
|
669
|
+
| `.btn-modern-glow-grid` | `--acid-500` fill + acid glow, `--acid-400` on hover |
|
|
670
|
+
| `.btn-modern-danger` | Transparent + danger border, danger fill on hover |
|
|
671
|
+
| `.btn-modern-sm/lg` | Size variants (8px/16px small, 16px/28px large) |
|
|
672
|
+
| `.btn-modern-icon` | 40×40 square icon button |
|
|
673
|
+
| `.btn-modern-lg-icon` | 52×52 large icon button |
|
|
674
|
+
| `.btn-modern-loading` | Loading state — `onebit-spin` replaces icon |
|
|
675
|
+
| `.btn-group` | Inline flex container for grouped buttons (adjacent borders merge) |
|
|
676
|
+
| `.btn-split` | Split button trigger — last child gets narrower padding + left border |
|
|
677
|
+
|
|
678
|
+
All variants use standard CSS transitions for interaction states:
|
|
679
|
+
- **`:hover`** → fill shifts to `--brand-primary-hover` (`--magenta-400`), optional glow shadow intensifies
|
|
680
|
+
- **`:focus-visible`** → outline ring
|
|
681
|
+
- **`:active`** → fill shifts to `--brand-primary-active` (`--magenta-600`)
|
|
682
|
+
- **`Loading`** → `onebit-spin` (0.6s steps(4) infinite — square frame rotation)
|
|
683
|
+
|
|
684
|
+
### 6b. Form controls
|
|
685
|
+
|
|
686
|
+
| Class | Description |
|
|
687
|
+
|-------|-------------|
|
|
688
|
+
| `.input` | Text input: black bg, 2px white border, accent glow on focus |
|
|
689
|
+
| `.textarea` | Multi-line input, same tokens |
|
|
690
|
+
| `.select-native` | Custom dropdown, SVG chevron |
|
|
691
|
+
| `.checkbox` | 16px square, checked fills white (`.checkbox-accent`: fills magenta) |
|
|
692
|
+
| `.radio` | 16px square, selected fills white (`.radio-accent`: fills magenta) |
|
|
693
|
+
| `.toggle` | 36x18 switch, on state fills white (`.toggle-accent`: fills magenta) |
|
|
694
|
+
| `.range` | 6px track, 16px square thumb |
|
|
695
|
+
| `.form-group` | Flex column with gap |
|
|
696
|
+
| `.form-label` | Mono uppercase label, 11px |
|
|
697
|
+
| `.field-error` | Red mono error text |
|
|
698
|
+
| `.input-group` | Inline input + addon |
|
|
699
|
+
| `.input-addon` | Prefix/suffix decoration |
|
|
700
|
+
| `.color-swatch` | 32px square, accent shadow on selected |
|
|
701
|
+
|
|
702
|
+
### 6c. Navigation
|
|
703
|
+
|
|
704
|
+
| Class | Description |
|
|
705
|
+
|-------|-------------|
|
|
706
|
+
| `.nav` | Vertical nav container |
|
|
707
|
+
| `.nav-item` | Nav link with optional bullet, invert on active |
|
|
708
|
+
| `.nav-item-accent` | Magenta border on active |
|
|
709
|
+
| `.tabs` | Horizontal tab bar, 2px bottom border |
|
|
710
|
+
| `.tab` | Mono uppercase tab, white underline on active |
|
|
711
|
+
| `.tab-accent` | Magenta underline on active |
|
|
712
|
+
| `.pagination` | Inline page button group |
|
|
713
|
+
| `.page-btn` | 32px square, invert on active |
|
|
714
|
+
| `.breadcrumb` | Mono slash-separated trail |
|
|
715
|
+
| `.stepper` | Numbered step indicator with connecting line |
|
|
716
|
+
|
|
717
|
+
### 6d. Data display
|
|
718
|
+
|
|
719
|
+
| Class | Description |
|
|
720
|
+
|-------|-------------|
|
|
721
|
+
| `.table` | Collapsed table, 2px header border, mono uppercase headers |
|
|
722
|
+
| `.badge` | Inline uppercase label, 11px, 1px border |
|
|
723
|
+
| `.badge-inverted` | White bg, black text |
|
|
724
|
+
| `.badge-accent` / `.badge-success` / `.badge-warning` / `.badge-danger` | Colored border variants |
|
|
725
|
+
| `.tag` | 11px uppercase inline, 3 variants (default, outlined, inverted) |
|
|
726
|
+
| `.chip` | Removable inline tag with close button |
|
|
727
|
+
| `.chip-accent` | Magenta border variant |
|
|
728
|
+
| `.avatar` | 32x32 square, 2px border, mono initial |
|
|
729
|
+
| `.avatar-sm` / `.avatar-lg` / `.avatar-group` | Size + overlap group |
|
|
730
|
+
| `.stat` | Value + label vertical pair |
|
|
731
|
+
| `.stat-accent` | Magenta value color |
|
|
732
|
+
| `.kbd` | Keyboard key with 3px bottom border weight |
|
|
733
|
+
| `.code-block` | Pre block, 2px border, 13px mono |
|
|
734
|
+
| `.code-inline` | Inline code snippet |
|
|
735
|
+
| `.link` | Underlined white text, thicker hover |
|
|
736
|
+
| `.link-accent` | Magenta colored link |
|
|
737
|
+
| `.list` | Bordered list group with 2px border |
|
|
738
|
+
| `.list-item` | 13px item with hover/active states |
|
|
739
|
+
| `.tree` | Nested tree with lines |
|
|
740
|
+
| `.tree-item` | Indented with left border, accent on active |
|
|
741
|
+
|
|
742
|
+
### 6e. Overlays
|
|
743
|
+
|
|
744
|
+
| Class | Description |
|
|
745
|
+
|-------|-------------|
|
|
746
|
+
| `.modal` | Black bg, 2px border, 8px hard offset shadow |
|
|
747
|
+
| `.drawer` | Side panel, 300-480px width |
|
|
748
|
+
| `.toast` | Notification with 4px hard offset shadow, slide-up animation |
|
|
749
|
+
| `.toast-success` / `.toast-error` / `.toast-warning` | Colored icon variants |
|
|
750
|
+
| `.tooltip` | Positioned label on hover |
|
|
751
|
+
| `.alert` | Inline message with icon |
|
|
752
|
+
| `.alert-success` / `.alert-error` / `.alert-warning` | Colored border variants |
|
|
753
|
+
|
|
754
|
+
### 6f. Feedback
|
|
755
|
+
|
|
756
|
+
| Class | Description |
|
|
757
|
+
|-------|-------------|
|
|
758
|
+
| `.progress` | 12px bar, 2px border |
|
|
759
|
+
| `.progress-accent` | Magenta fill |
|
|
760
|
+
| `.progress-indeterminate` | Scanning bar animation |
|
|
761
|
+
| `.progress-striped` | Striped fill overlay |
|
|
762
|
+
| `.spinner` | 20px square rotating frame, 90° steps |
|
|
763
|
+
| `.spinner-accent` / `.spinner-cyan` | Colored border variants |
|
|
764
|
+
| `.skeleton` | Loading placeholder, opacity pulse |
|
|
765
|
+
| `.empty` | Dashed border placeholder, centered content |
|
|
766
|
+
| `.loading-screen` | Full block loading with blinking label |
|
|
767
|
+
| `.banner` | Full-width colored message bar |
|
|
768
|
+
|
|
769
|
+
### 6g. Media & Layout
|
|
770
|
+
|
|
771
|
+
| Class | Description |
|
|
772
|
+
|-------|-------------|
|
|
773
|
+
| `.image-frame` | 2px border placeholder |
|
|
774
|
+
| `.video-frame` | 16:9 frame with play button + timeline |
|
|
775
|
+
| `.icon-box` | 40x40 square icon container |
|
|
776
|
+
| `.icon-box-sm` / `.icon-box-lg` / `.icon-box-accent` / `.icon-box-cyan` | Variants |
|
|
777
|
+
| `.container` | 1280px centered max-width |
|
|
778
|
+
| `.grid` / `.grid-2` / `.grid-3` / `.grid-4` | Grid with 24px gap |
|
|
779
|
+
| `.hr` / `.hr-thick` | Horizontal rules |
|
|
780
|
+
|
|
781
|
+
### 6h. Misc
|
|
782
|
+
|
|
783
|
+
| Class | Description |
|
|
784
|
+
|-------|-------------|
|
|
785
|
+
| `.menu` | Dropdown menu list |
|
|
786
|
+
| `.menu-item` | Menu entry with divider support |
|
|
787
|
+
| `.toolbar` | Icon button row with separators |
|
|
788
|
+
| `.status-dot` | 8px square dot (live/away/busy/offline) |
|
|
789
|
+
| `.timeline` | Vertical timeline with dots + lines |
|
|
790
|
+
| `.countdown` | Tabular numeric countdown with labels |
|
|
791
|
+
| `.rating` | 5-star rating, 20px squares, accent on hover |
|
|
792
|
+
| `.combobox` | Searchable select with dropdown menu |
|
|
793
|
+
| `.date-input` | Date field with segmented parts |
|
|
794
|
+
|
|
795
|
+
### 6i. Accent layer modifiers
|
|
796
|
+
|
|
797
|
+
These classes add thin color to any 1-bit component without breaking the black/white base. Apply alongside the component class.
|
|
798
|
+
|
|
799
|
+
| Class | Effect |
|
|
800
|
+
|-------|--------|
|
|
801
|
+
| `.accent-border-top` / `.accent-border-left` / `.accent-border-bottom` | 3px magenta border on one edge |
|
|
802
|
+
| `.cyan-border-top` / `.grid-border-top` / `.line-border-top` | 3px colored top border |
|
|
803
|
+
| `.accent-underline` / `.cyan-underline` | Colored underline on text |
|
|
804
|
+
| `.accent-dot` / `.cyan-dot` / `.grid-dot` | Small colored dot after element |
|
|
805
|
+
| `.accent-bar` / `.cyan-bar` / `.grid-bar` / `.line-bar` | Thin colored bar across top |
|
|
806
|
+
| `.glow-mod` / `.glow-mod-cyan` | Colored glow shadow |
|
|
807
|
+
| `.border-mod-accent` / `.border-mod-cyan` | Border color override |
|
|
808
|
+
| `.accent-corner` / `.cyan-corner` | Small colored corner badge |
|
|
809
|
+
|
|
810
|
+
### 1-bit composition rules
|
|
811
|
+
- **No radii.** Every 1-bit component uses `border-radius: 0`. Sharp corners are part of the identity.
|
|
812
|
+
- **No blur shadows.** Only hard offset shadows (`box-shadow: 8px 8px 0 #FFFFFF`) on modal and toast.
|
|
813
|
+
- **2px borders.** All bordered 1-bit components use 2px `solid` white borders unless specified.
|
|
814
|
+
- **Invert interaction.** The primary hover/focus state is inversion — white bg, black text.
|
|
815
|
+
- **Mono for data.** All numeric, code, and pagination elements use `Geist Pixel`. Labels and body use `Geist Pixel`.
|
|
816
|
+
- **Uppercase label language.** Tags, badges, breadcrumbs, form labels default to uppercase with letter-spacing.
|
|
817
|
+
- **Accent is thin.** Color enters components through edges (3px top border), dots (6px), glows (shadow), or hover fills — never as full surface backgrounds.
|
|
818
|
+
- **Empty = dashed border.** Empty states use a 2px dashed white border at 25% opacity — never grey placeholders.
|
|
819
|
+
|
|
820
|
+
## 7. Motion & Interaction
|
|
821
|
+
|
|
822
|
+
**Source context reference:** The brief's "abstract 1-bit animations" directly motivates the scanline-scroll, glitch, and halftone keyframe primitives. Reduced-motion support is a standard accessibility requirement.
|
|
823
|
+
|
|
824
|
+
### Durations & easing
|
|
825
|
+
```
|
|
826
|
+
--ease-out: cubic-bezier(0.16, 1, 0.3, 1)
|
|
827
|
+
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1)
|
|
828
|
+
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1)
|
|
829
|
+
--duration-instant: 80ms
|
|
830
|
+
--duration-fast: 150ms
|
|
831
|
+
--duration-base: 240ms
|
|
832
|
+
--duration-slow: 400ms
|
|
833
|
+
--duration-slower: 640ms
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
### Full 1-bit Animation Library
|
|
837
|
+
|
|
838
|
+
| Animation | Class | Duration | Type | Description |
|
|
839
|
+
|-----------|-------|----------|------|-------------|
|
|
840
|
+
| Scanline scroll | `.scanline` (::after) | 8s linear infinite | Ambient | Horizontal lines scroll down — signature 7K texture |
|
|
841
|
+
| Scanline fast | `.scanline-fast` (::after) | 3s linear infinite | Ambient | Faster variant for high-energy sections |
|
|
842
|
+
| Basic glitch | `.glitch` | 0.3s, 3 iterations | Trigger | Translate jitter on 5 random frames |
|
|
843
|
+
| Complex glitch | `.glitch-complex` | 0.8s, 2 iterations | Trigger | Multi-axis + skew + clip-path splits |
|
|
844
|
+
| Glitch accent | `.glitch-accent` | 0.4s, 2 iterations | Trigger | Glitch with magenta glow trail |
|
|
845
|
+
| CRT flicker | `.flicker` / `.flicker-fast` | 4s / 1.5s infinite | Ambient | Opacity stutter at irregular intervals |
|
|
846
|
+
| Binary blink | `.blink` / `.blink-fast` | 1s / 0.4s step-end | Ambient | Sharp on/off toggle |
|
|
847
|
+
| Typewriter | `.typewriter` | 1.5s (30 steps) | Trigger | Text reveal from left |
|
|
848
|
+
| Neon pulse | `.neon-pulse` / `.neon-pulse-cyan` | 2s ease-in-out | Ambient | Accent glow oscillation |
|
|
849
|
+
| Noise shift | `.noise-animated` | 0.5s, steps(5) | Ambient | SVG noise translates in discrete positions |
|
|
850
|
+
| Scan reveal | `.scan-reveal` | 2s, 1 iteration | Trigger | White bar sweeps down |
|
|
851
|
+
| Pixel fade-in | `.pixel-fade-in` | 0.6s, steps(8) | Trigger | Left-to-right reveal in pixel steps |
|
|
852
|
+
| Invert flash | `.invert-flash` | 0.15s, 2 iterations | Trigger | Full filter inversion burst |
|
|
853
|
+
| Pixel dots | `.pixel-dots` / `.pixel-dots-fast` | 0.3s, steps(4), 2 iterations | Trigger | Small black squares scatter at random positions — 1-bit corruption effect |
|
|
854
|
+
| Progress scan | `.progress-indeterminate` | 1.5s | Loading | Bar sweeps left-to-right |
|
|
855
|
+
| Skeleton pulse | `.skeleton` | 1.2s ease-in-out | Loading | Opacity pulse |
|
|
856
|
+
| Slide-up reveal | `.slide-up-reveal` | 0.5s ease-out | Trigger | Content rises with clip-path |
|
|
857
|
+
| Shimmer sweep | `.shimmer` | 2s linear infinite | Loading | Horizontal gradient sweep |
|
|
858
|
+
| Frame step | `.frame-step` (::after) | 0.8s steps(1) | Ambient | Binary character cycle (▌▐█▀) |
|
|
859
|
+
| One-bit spin | `.spinner` | 0.6s linear | Loading | Square frame in 90° increments |
|
|
860
|
+
| Matrix rain | `.matrix-rain-char` | 2s linear infinite | Ambient | Falling character column |
|
|
861
|
+
| Accent flicker | `.accent-flicker` | 1.8s step-end infinite | Ambient | Blinking accent color text |
|
|
862
|
+
|
|
863
|
+
### Isometric Animation Library
|
|
864
|
+
|
|
865
|
+
| Animation | Class | Duration | Type | Description |
|
|
866
|
+
|-----------|-------|----------|------|-------------|
|
|
867
|
+
| Isometric float | `.iso-float` | 3s ease-in-out infinite | Ambient | Block bobs up/down with subtle scale depth shift |
|
|
868
|
+
| Float + spin | `.iso-float-spin` | 4s ease-in-out infinite | Ambient | Float + slow Y-axis rotation (90° steps) |
|
|
869
|
+
| Grid scroll | `.iso-grid-scroll` | 4s linear infinite | Ambient | Isometric diamond grid scrolls diagonally |
|
|
870
|
+
| Terrain shift | `.iso-terrain-shift` | 6s linear infinite | Ambient | 3 parallax layers move at different speeds |
|
|
871
|
+
| Rotate cube | `.iso-rotate-cube` | 6s linear infinite | Ambient | Full 3D cube rotation in isometric space |
|
|
872
|
+
| Assemble blocks | `.iso-assemble` | 0.8s ease-out forwards | Trigger | Blocks rise from below into position (5 delay variants: `.iso-assemble-2` through `-5`) |
|
|
873
|
+
| Perspective dolly | `.iso-perspective-dolly` | 1s ease-out forwards | Trigger | Content zooms toward viewer with blur-in |
|
|
874
|
+
| Step build | `.iso-step-build` | 0.4s steps(6) forwards | Trigger | Square reveals in pixel-step sequence |
|
|
875
|
+
|
|
876
|
+
### Animation composition rules
|
|
877
|
+
|
|
878
|
+
1. **One ambient + one trigger.** At most one ambient animation (scanline, noise, flicker, shimmer, iso-grid-scroll) runs continuously. Triggered animations (glitch, invert-flash, scan-reveal, iso-assemble, iso-perspective-dolly) fire on interaction.
|
|
879
|
+
2. **Glitch is a burst, not a loop.** Basic glitch runs exactly 3 iterations (0.9s total) on the class utility. Pixel-dots runs 2 iterations (0.6s) for a quick corruption scatter. Never loop glitch infinitely.
|
|
880
|
+
3. **Scanline is the default ambient.** Every hero/full-bleed section should evaluate whether `.scanline` adds atmosphere. UI content sections (dashboard, settings) must not use ambient animation.
|
|
881
|
+
4. **Cascade: reduced-motion wins.** All animations collapse to 0.01ms at `prefers-reduced-motion: reduce`. No exceptions.
|
|
882
|
+
5. **Step timing for pixel-perfect animation.** Keyframes that simulate digital/retro effects use `steps()` timing instead of `ease`. This preserves sharp on/off quality.
|
|
883
|
+
6. **Overlay animations must have `pointer-events: none`.** Scanline, vignette, noise, and scan-reveal use `::before`/`::after` pseudo-elements.
|
|
884
|
+
|
|
885
|
+
### Animation timing — when 1-bit animations apply
|
|
886
|
+
|
|
887
|
+
| Surface | Ambient animation | Trigger animation |
|
|
888
|
+
|---------|-------------------|-------------------|
|
|
889
|
+
| Landing / marketing hero | `.scanline` (8s) | `.scan-reveal` on load |
|
|
890
|
+
| Dashboard / app shell | None | `.glitch` on filter change |
|
|
891
|
+
| Loading state | `.skeleton` or `.shimmer` | None |
|
|
892
|
+
| Error state | None | `.glitch-complex` on container |
|
|
893
|
+
| 1-bit splash / manga panel | `.scanline-fast` (3s) | `.invert-flash` on page enter |
|
|
894
|
+
| Toast / notification | None | `.slide-up-reveal` on mount |
|
|
895
|
+
| Button (accent) | None | Color transition on hover |
|
|
896
|
+
| Accent text | `.accent-flicker` | None |
|
|
897
|
+
|
|
898
|
+
## 8. React UI Kit
|
|
899
|
+
|
|
900
|
+
The React UI kit provides TypeScript components that wrap the CSS component classes. All components are thin wrappers — they apply the correct CSS classes and forward refs. No inline styles beyond what the CSS system provides.
|
|
901
|
+
|
|
902
|
+
### Installation
|
|
903
|
+
|
|
904
|
+
```bash
|
|
905
|
+
npm install 7k-design-system
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
```typescript
|
|
909
|
+
// App entry point
|
|
910
|
+
import '7k-design-system/css';
|
|
911
|
+
import { ThemeProvider } from '7k-design-system/react';
|
|
912
|
+
|
|
913
|
+
function App() {
|
|
914
|
+
return (
|
|
915
|
+
<ThemeProvider defaultTheme="dark">
|
|
916
|
+
<YourApp />
|
|
917
|
+
</ThemeProvider>
|
|
918
|
+
);
|
|
919
|
+
}
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
### Button
|
|
923
|
+
|
|
924
|
+
```typescript
|
|
925
|
+
import { Button } from '7k-design-system/react';
|
|
926
|
+
|
|
927
|
+
<Button
|
|
928
|
+
variant="primary" // 'primary' | 'secondary' | 'ghost' | 'glow' | 'glow-cyan' | 'glow-grid' | 'danger'
|
|
929
|
+
size="md" // 'sm' | 'md' | 'lg'
|
|
930
|
+
disabled={false}
|
|
931
|
+
onClick={() => {}}
|
|
932
|
+
type="button" // 'button' | 'submit' | 'reset'
|
|
933
|
+
className=""
|
|
934
|
+
>
|
|
935
|
+
Click me
|
|
936
|
+
</Button>
|
|
937
|
+
```
|
|
938
|
+
|
|
939
|
+
**CSS classes applied:**
|
|
940
|
+
- Base: `.btn-modern`
|
|
941
|
+
- Variant: `.btn-modern-{variant}` (e.g., `.btn-modern-primary`)
|
|
942
|
+
- Size: `.btn-modern-sm` | `.btn-modern-lg` (md applies no extra class)
|
|
943
|
+
|
|
944
|
+
**Behavior:** Forwards ref to `<button>`. Combines `className` prop with generated classes.
|
|
945
|
+
|
|
946
|
+
### Input
|
|
947
|
+
|
|
948
|
+
```typescript
|
|
949
|
+
import { Input } from '7k-design-system/react';
|
|
950
|
+
|
|
951
|
+
<Input
|
|
952
|
+
type="text"
|
|
953
|
+
placeholder="Hint text"
|
|
954
|
+
disabled={false}
|
|
955
|
+
value={value}
|
|
956
|
+
onChange={(value) => setValue(value)} // string callback, not event
|
|
957
|
+
className=""
|
|
958
|
+
/>
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
**CSS class applied:** `.input`
|
|
962
|
+
|
|
963
|
+
**Behavior:** Forwards ref to `<input>`. `onChange` receives the raw string value (not an event). All standard HTML input props pass through.
|
|
964
|
+
|
|
965
|
+
### Badge
|
|
966
|
+
|
|
967
|
+
```typescript
|
|
968
|
+
import { Badge } from '7k-design-system/react';
|
|
969
|
+
|
|
970
|
+
<Badge variant="default"> // 'default' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'
|
|
971
|
+
Status
|
|
972
|
+
</Badge>
|
|
973
|
+
```
|
|
974
|
+
|
|
975
|
+
**CSS classes applied:**
|
|
976
|
+
- Base: `.badge`
|
|
977
|
+
- Variant: `.badge-{variant}` (e.g., `.badge-success`)
|
|
978
|
+
|
|
979
|
+
**Behavior:** Forwards ref to `<span>`. Children render as text content.
|
|
980
|
+
|
|
981
|
+
### ThemeToggle
|
|
982
|
+
|
|
983
|
+
```typescript
|
|
984
|
+
import { ThemeToggle } from '7k-design-system/react';
|
|
985
|
+
|
|
986
|
+
<ThemeToggle className="" />
|
|
987
|
+
```
|
|
988
|
+
|
|
989
|
+
**Behavior:** Renders a 32×32 square button with `☀` / `☾` icon. Uses `useTheme()` internally. Calls `toggleTheme()` on click. Sets `data-theme` attribute on `<html>` and persists to `localStorage` under key `7k-theme`.
|
|
990
|
+
|
|
991
|
+
### ThemeProvider
|
|
992
|
+
|
|
993
|
+
```typescript
|
|
994
|
+
import { ThemeProvider } from '7k-design-system/react';
|
|
995
|
+
|
|
996
|
+
<ThemeProvider
|
|
997
|
+
defaultTheme="dark" // 'dark' | 'light'
|
|
998
|
+
storageKey="7k-theme" // localStorage key
|
|
999
|
+
>
|
|
1000
|
+
{children}
|
|
1001
|
+
</ThemeProvider>
|
|
1002
|
+
```
|
|
1003
|
+
|
|
1004
|
+
**Behavior:**
|
|
1005
|
+
- On mount: reads `localStorage` for stored theme, falls back to `defaultTheme`
|
|
1006
|
+
- On theme change: sets `document.documentElement.setAttribute('data-theme', theme)` and writes to `localStorage`
|
|
1007
|
+
- Exposes context value: `{ theme, toggleTheme, setTheme }`
|
|
1008
|
+
|
|
1009
|
+
### useTheme
|
|
1010
|
+
|
|
1011
|
+
```typescript
|
|
1012
|
+
import { useTheme } from '7k-design-system/react';
|
|
1013
|
+
|
|
1014
|
+
const { theme, toggleTheme, setTheme } = useTheme();
|
|
1015
|
+
```
|
|
1016
|
+
|
|
1017
|
+
**Returns:**
|
|
1018
|
+
- `theme: 'dark' | 'light'` — current active theme
|
|
1019
|
+
- `toggleTheme: () => void` — flips dark ↔ light
|
|
1020
|
+
- `setTheme: (theme: 'dark' | 'light') => void` — sets explicit theme
|
|
1021
|
+
|
|
1022
|
+
**Error:** Throws if called outside a `ThemeProvider`.
|
|
1023
|
+
|
|
1024
|
+
### TypeScript Types
|
|
1025
|
+
|
|
1026
|
+
```typescript
|
|
1027
|
+
// src/react/types.ts
|
|
1028
|
+
interface BaseProps {
|
|
1029
|
+
className?: string;
|
|
1030
|
+
style?: CSSProperties;
|
|
1031
|
+
children?: ReactNode;
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'glow' | 'glow-cyan' | 'glow-grid' | 'danger';
|
|
1035
|
+
type ButtonSize = 'sm' | 'md' | 'lg';
|
|
1036
|
+
interface ButtonProps extends BaseProps {
|
|
1037
|
+
variant?: ButtonVariant;
|
|
1038
|
+
size?: ButtonSize;
|
|
1039
|
+
disabled?: boolean;
|
|
1040
|
+
onClick?: () => void;
|
|
1041
|
+
type?: 'button' | 'submit' | 'reset';
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
type BadgeVariant = 'default' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';
|
|
1045
|
+
interface BadgeProps extends BaseProps {
|
|
1046
|
+
variant?: BadgeVariant;
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
interface InputProps extends BaseProps {
|
|
1050
|
+
type?: string;
|
|
1051
|
+
placeholder?: string;
|
|
1052
|
+
disabled?: boolean;
|
|
1053
|
+
value?: string;
|
|
1054
|
+
onChange?: (value: string) => void;
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
type Theme = 'dark' | 'light';
|
|
1058
|
+
interface ThemeContextValue {
|
|
1059
|
+
theme: Theme;
|
|
1060
|
+
toggleTheme: () => void;
|
|
1061
|
+
setTheme: (theme: Theme) => void;
|
|
1062
|
+
}
|
|
1063
|
+
```
|
|
1064
|
+
|
|
1065
|
+
## 9. Modular CSS Architecture
|
|
1066
|
+
|
|
1067
|
+
The CSS is split into 10 source files under `src/css/`, compiled into `dist/7k-design-system.css`. Each file has a single responsibility. Import `src/css/index.css` to load all modules, or import individual modules for tree-shaking.
|
|
1068
|
+
|
|
1069
|
+
| File | Size | Responsibility |
|
|
1070
|
+
|------|------|---------------|
|
|
1071
|
+
| `fonts.css` | ~1.7KB | `@font-face` for Geist Pixel 5 variants; CDN imports for Geist Sans/Mono |
|
|
1072
|
+
| `tokens.css` | ~12.5KB | All design tokens: color ramps, semantic roles, typography, spacing, radii, shadows, motion, layout, z-index |
|
|
1073
|
+
| `themes.css` | ~7.2KB | Dark default in `:root`; light overrides in `@media (prefers-color-scheme: light)` and `html[data-theme="light"]` |
|
|
1074
|
+
| `base.css` | ~7.6KB | CSS reset, body/html base styles, `.mono-label` utility, `.display`/`.h1`–`.h4`/`.body` type utilities |
|
|
1075
|
+
| `textures.css` | ~12.4KB | 10 texture categories: scanline, halftone, dot matrix, stripes, crosshatch, checkerboard, noise, vignette |
|
|
1076
|
+
| `isometric.css` | ~12.5KB | 11 isometric patterns: grid, cubes, pyramid, hex, pipes, terrain + animation variants |
|
|
1077
|
+
| `components.css` | ~36KB | 40+ component classes: buttons, forms, nav, data display, overlays, feedback, media, misc |
|
|
1078
|
+
| `modifiers.css` | ~2.2KB | Accent layer modifiers: border-top, underline, dot, bar, glow, corner |
|
|
1079
|
+
| `animations.css` | ~15.8KB | 20+ keyframe animations: glitch, flicker, blink, typewriter, neon-pulse, scan-reveal, pixel-fade, iso-float |
|
|
1080
|
+
| `accessibility.css` | ~0.6KB | `prefers-reduced-motion` collapse, `:focus-visible` rings, `prefers-contrast` support, screen-reader utilities |
|
|
1081
|
+
|
|
1082
|
+
### PostCSS Pipeline
|
|
1083
|
+
|
|
1084
|
+
```
|
|
1085
|
+
src/css/index.css
|
|
1086
|
+
→ postcss-import (inline @import)
|
|
1087
|
+
→ postcss-nesting (native CSS nesting)
|
|
1088
|
+
→ autoprefixer (vendor prefixes)
|
|
1089
|
+
→ cssnano (minification for production)
|
|
1090
|
+
→ dist/7k-design-system.css
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
### Standalone CSS Exports
|
|
1094
|
+
|
|
1095
|
+
```typescript
|
|
1096
|
+
import '7k-design-system/css'; // Full bundle (~115KB)
|
|
1097
|
+
import '7k-design-system/css/tokens'; // Tokens only (~12KB)
|
|
1098
|
+
import '7k-design-system/css/components'; // Components only (~36KB)
|
|
1099
|
+
import '7k-design-system/css/textures'; // Textures only (~12KB)
|
|
1100
|
+
import '7k-design-system/css/animations'; // Animations only (~16KB)
|
|
1101
|
+
```
|
|
1102
|
+
|
|
1103
|
+
### Build Commands
|
|
1104
|
+
|
|
1105
|
+
```bash
|
|
1106
|
+
npm run build:css # Compile CSS bundle + standalone modules
|
|
1107
|
+
npm run build:react # Compile React ESM + CJS + .d.ts
|
|
1108
|
+
npm run build:copy-assets # Copy preview/, fonts/, build/ to dist/
|
|
1109
|
+
npm run build # Run all three build steps
|
|
1110
|
+
```
|
|
1111
|
+
|
|
1112
|
+
## 10. Testing & Documentation
|
|
1113
|
+
|
|
1114
|
+
### Test Suite (Vitest)
|
|
1115
|
+
|
|
1116
|
+
Location: `tests/`
|
|
1117
|
+
Runner: Vitest + jsdom + @testing-library/react + jest-axe
|
|
1118
|
+
|
|
1119
|
+
| File | Coverage |
|
|
1120
|
+
|------|----------|
|
|
1121
|
+
| `Button.test.tsx` | Rendering, variant/size classes, click handler, disabled state |
|
|
1122
|
+
| `Input.test.tsx` | Rendering, value/onChange callback, disabled state, placeholder |
|
|
1123
|
+
| `Badge.test.tsx` | Rendering, variant classes, children content |
|
|
1124
|
+
| `ThemeProvider.test.tsx` | Default theme, localStorage persistence, `data-theme` attribute |
|
|
1125
|
+
| `ThemeToggle.test.tsx` | Click toggles theme, icon changes, aria-label updates |
|
|
1126
|
+
| `a11y.test.tsx` | axe-core accessibility checks on Button, Input, Badge |
|
|
1127
|
+
|
|
1128
|
+
**Run tests:**
|
|
1129
|
+
```bash
|
|
1130
|
+
npm test # Unit tests
|
|
1131
|
+
npm run test:a11y # Accessibility tests
|
|
1132
|
+
npm run test:watch # Watch mode
|
|
1133
|
+
```
|
|
1134
|
+
|
|
1135
|
+
### Storybook
|
|
1136
|
+
|
|
1137
|
+
Location: `src/stories/`
|
|
1138
|
+
Port: 6006
|
|
1139
|
+
|
|
1140
|
+
| Story | Content |
|
|
1141
|
+
|-------|---------|
|
|
1142
|
+
| `Design System/Overview` (`Overview.mdx`) | Design principles, color palette, usage examples |
|
|
1143
|
+
| `Design System/Tokens` (`Tokens.mdx`) | Token reference tables |
|
|
1144
|
+
| `Components/Button` (`Components.stories.tsx`) | All Button variants and sizes |
|
|
1145
|
+
| `Components/Input` (`Components.stories.tsx`) | Input states |
|
|
1146
|
+
| `Components/Badge` (`Components.stories.tsx`) | Badge variants |
|
|
1147
|
+
| `Components/ThemeToggle` (`Components.stories.tsx`) | Theme toggle button |
|
|
1148
|
+
| `Textures/All` (`Textures.stories.tsx`) | All 10 texture patterns |
|
|
1149
|
+
| `Textures/Isometric` (`Textures.stories.tsx`) | All 11 isometric patterns |
|
|
1150
|
+
|
|
1151
|
+
**Run Storybook:**
|
|
1152
|
+
```bash
|
|
1153
|
+
npm run storybook # Dev server at http://localhost:6006
|
|
1154
|
+
npm run build-storybook # Static build for deployment
|
|
1155
|
+
npm run chromatic # Visual regression testing
|
|
1156
|
+
```
|
|
1157
|
+
|
|
1158
|
+
### Preview HTML Cards
|
|
1159
|
+
|
|
1160
|
+
Location: `preview/` (copied to `dist/preview/` on build)
|
|
1161
|
+
|
|
1162
|
+
| File | Purpose |
|
|
1163
|
+
|------|---------|
|
|
1164
|
+
| `colors-primary.html` | Accent swatches, ramps, project overrides |
|
|
1165
|
+
| `typography-specimens.html` | Type scale + weights + pixel variants |
|
|
1166
|
+
| `spacing-tokens.html` | 4px grid, radii, shadows |
|
|
1167
|
+
| `components-buttons.html` | Product component states |
|
|
1168
|
+
| `textures-backgrounds.html` | 10 background texture categories with composition demos |
|
|
1169
|
+
| `brand-assets.html` | Logo variants + brand in context |
|
|
1170
|
+
|
|
1171
|
+
## 11. Voice & Brand
|
|
1172
|
+
|
|
1173
|
+
**Source context reference:** The brief's "our logo is just '7K'" and "tech company with different projects" inform the minimal brand identity. The logo is a geometric polygon SVG — dark (#111) background polygons frame the "7K" letterforms as clear white polygon shapes with thin #FF0FF accent shapes. Sub-projects differentiate by accent hue while keeping the wordmark structure.
|
|
1174
|
+
|
|
1175
|
+
- **Tone**: Direct, technical, slightly playful. "Built for midnight."
|
|
1176
|
+
- **Capitalization**: Sentence case for headings, uppercase only for kickers/labels
|
|
1177
|
+
- **Company**: 7K (always uppercase with the numeral). Child projects: "7K Project Neon"
|
|
1178
|
+
- **Logo**: Star-burst pattern SVG in `build/logo-7k.svg` with #FF0FF brand accent tones. Light variant at `build/logo-7k-light.svg` (black polygons for light backgrounds). App icon at `build/icon.svg`.
|
|
1179
|
+
- **Terminology**: "Surface" for pages, "module" for components, "canvas" for background
|
|
1180
|
+
- **No filler**: never use "streamlined", "innovative", "leveraging" unless literal
|
|
1181
|
+
- **Error messages**: direct, no "oops". "Connection failed. Retry." not "Something went wrong."
|
|
1182
|
+
|
|
1183
|
+
## 12. Anti-patterns
|
|
1184
|
+
|
|
1185
|
+
**Source context reference:** Each anti-pattern below derives from a specific brief constraint: dark theme (no warm backgrounds), three-font system kept to Geist family only, 1-bit influence (no rounded corners on 1-bit elements), neon Tokyo (no generic purple gradients), brand-color-only accent (no color proliferation).
|
|
1186
|
+
|
|
1187
|
+
| Anti-pattern | Why |
|
|
1188
|
+
|---|---|
|
|
1189
|
+
| Warm beige/cream/peach backgrounds | System is dark-first; light theme is precise white |
|
|
1190
|
+
| Multiple font families outside the system | Three fonts only: Geist (sans), Geist Mono, Geist Pixel (5 variants). No other families. |
|
|
1191
|
+
| Over-rounded everything | Sharp 0px or subtle 4px preferred |
|
|
1192
|
+
| Gradient overload | Max one gradient per page; no full-page gradient backgrounds |
|
|
1193
|
+
| Emoji iconography | Use CSS/SVG instead |
|
|
1194
|
+
| Drop shadows on text | Use high-contrast fg instead |
|
|
1195
|
+
| Stock photography | Use 1-bit halftone texture library |
|
|
1196
|
+
| Generic purple/violet gradients | Accent is magenta (#FF0FF), not purple |
|
|
1197
|
+
| Invented metrics/fake stats | Use real data or grey stubs |
|
|
1198
|
+
| Circular spinners on 1-bit elements | Spinner is square — never mix circular |
|
|
1199
|
+
| Rounded checkboxes/radios | One-bit form controls are square |
|
|
1200
|
+
| Blurred drop shadows on 1-bit components | Shadow is a hard offset, not a blur |
|
|
1201
|
+
| SVG humans / scenery / illustrations | 1-bit means abstract texture, not hand-drawn |
|
|
1202
|
+
| Glitch as a continuous loop | Glitch is a 2–3 iteration burst |
|
|
1203
|
+
| Warm/beige tones anywhere | System is nocturnal dark + neon |
|
|
1204
|
+
| Multiple textures on the same section layer | Max one background + one overlay per section |
|
|
1205
|
+
| Continuous animation on UI surfaces | Ambient animations are for hero/landing sections only |
|
|
1206
|
+
| Isometric animation on interactive UI | Isometric bg + motion is for hero/splash sections only; never on cards, buttons, or form controls |
|
|
1207
|
+
| Mixing 1-bit button patterns into product surfaces | Use the modern button system (.btn-modern*) for all product surfaces. 1-bit button classes (.btn, .btn-primary, .btn-accent) are removed — do not reintroduce raw invert-hover buttons in place of modern neon buttons. |
|