@jaimevalasek/aioson 1.30.0 → 1.30.2
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 +18 -0
- package/docs/design-previews/cognitive-core-ui-auth.html +95 -0
- package/docs/design-previews/cognitive-core-ui-kanban.html +231 -0
- package/docs/design-previews/cognitive-core-ui-list-detail.html +174 -0
- package/docs/design-previews/cognitive-core-ui-preview.css +1315 -0
- package/docs/design-previews/cognitive-core-ui-settings.html +142 -0
- package/docs/design-previews/cognitive-core-ui-website.html +190 -1009
- package/docs/design-previews/cognitive-core-ui.html +281 -463
- package/docs/design-previews/index.html +83 -31
- package/package.json +1 -1
- package/src/constants.js +578 -514
- package/template/.aioson/docs/integrations/dashboard-app-form-publish-mapping.md +183 -0
- package/template/.aioson/docs/play/README.md +74 -0
- package/template/.aioson/docs/play/agent-usage-guide.md +112 -0
- package/template/.aioson/docs/play/app-compatibility-guide.md +117 -0
- package/template/.aioson/docs/play/auth-services-and-testing.md +235 -0
- package/template/.aioson/docs/play/llm-data-and-bindings.md +238 -0
- package/template/.aioson/docs/play/manifest-and-runtime.md +267 -0
- package/template/.aioson/docs/play/source-map.md +104 -0
- package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
- package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
- package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
- package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
- package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
- package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
- package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
- package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
- package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
- package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
- package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
- package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
- package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
- package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
- package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
- package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
- package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
- package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
- package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
- package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
- package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
- package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
- package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
- package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
- package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
- package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
- package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
- package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
- package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
- package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
- package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
- package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
- package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
- package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
- package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
- package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
- package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
- package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
- package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
- package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
- package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
- package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
- package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
- package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
- package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
- package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
- package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
- package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
- package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
- package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
- package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
- package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
- package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
- package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
- package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
- package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
- package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
- package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
- package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
- package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
- package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
- package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
- package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
- package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
- package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
- package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
- package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
- package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
- package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
- package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
- package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
- package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
- package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
- package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -289
|
@@ -1,458 +1,458 @@
|
|
|
1
|
-
# Patterns — Neo-Brutalist UI
|
|
2
|
-
|
|
3
|
-
Page-level compositions and app shell. All layouts use thick borders as structural dividers — no subtle separators.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## App Shell
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
┌──────────────────────────────────────────────────────────────┐
|
|
11
|
-
│ SIDEBAR (240px) │ TOP BAR (56px) │
|
|
12
|
-
│ border-right: 3px solid │ border-bottom: 3px solid │
|
|
13
|
-
│ bg-surface │ bg-surface │
|
|
14
|
-
│ ├───────────────────────────────────┤
|
|
15
|
-
│ Logo (top, bold/mono) │ CONTENT AREA │
|
|
16
|
-
│ │ bg-base (cream off-white) │
|
|
17
|
-
│ NAV ITEMS │ padding: 24px │
|
|
18
|
-
│ font-mono, text-sm │ │
|
|
19
|
-
│ Active: bg-accent │ │
|
|
20
|
-
│ color: black │ │
|
|
21
|
-
│ font-bold │ │
|
|
22
|
-
│ │ │
|
|
23
|
-
│ (no left-border active │ │
|
|
24
|
-
│ — full bg fill instead)│ │
|
|
25
|
-
│ │ │
|
|
26
|
-
│ FOOTER: user profile │ │
|
|
27
|
-
│ border-top: 2px solid │ │
|
|
28
|
-
└──────────────────────────┴───────────────────────────────────┘
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Sidebar spec
|
|
32
|
-
|
|
33
|
-
```css
|
|
34
|
-
.sidebar {
|
|
35
|
-
width: 240px;
|
|
36
|
-
background: var(--bg-surface);
|
|
37
|
-
border-right: var(--border-thicker);
|
|
38
|
-
height: 100vh;
|
|
39
|
-
display: flex;
|
|
40
|
-
flex-direction: column;
|
|
41
|
-
flex-shrink: 0;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
.sidebar__logo {
|
|
45
|
-
padding: var(--space-5) var(--space-6);
|
|
46
|
-
border-bottom: var(--border-thick);
|
|
47
|
-
font-family: var(--font-display);
|
|
48
|
-
font-weight: var(--weight-extrabold);
|
|
49
|
-
font-size: var(--text-lg);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.sidebar__nav {
|
|
53
|
-
flex: 1;
|
|
54
|
-
padding: var(--space-4) var(--space-3);
|
|
55
|
-
display: flex;
|
|
56
|
-
flex-direction: column;
|
|
57
|
-
gap: var(--space-1);
|
|
58
|
-
overflow-y: auto;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.nav-item {
|
|
62
|
-
display: flex;
|
|
63
|
-
align-items: center;
|
|
64
|
-
gap: var(--space-3);
|
|
65
|
-
padding: var(--space-2) var(--space-3);
|
|
66
|
-
font-family: var(--font-mono);
|
|
67
|
-
font-size: var(--text-sm);
|
|
68
|
-
color: var(--text-secondary);
|
|
69
|
-
text-decoration: none;
|
|
70
|
-
border-radius: var(--radius-none);
|
|
71
|
-
border: var(--border-subtle);
|
|
72
|
-
border-color: transparent;
|
|
73
|
-
transition: background var(--transition-fast), color var(--transition-fast);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
.nav-item:hover {
|
|
77
|
-
background: var(--bg-elevated);
|
|
78
|
-
color: var(--text-heading);
|
|
79
|
-
border-color: var(--border-color);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/* Active: full accent fill — not a left border indicator */
|
|
83
|
-
.nav-item--active {
|
|
84
|
-
background: var(--accent);
|
|
85
|
-
color: var(--accent-contrast);
|
|
86
|
-
font-weight: var(--weight-bold);
|
|
87
|
-
border-color: var(--border-color);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
.sidebar__section-label {
|
|
91
|
-
font-family: var(--font-mono);
|
|
92
|
-
font-size: var(--text-xs);
|
|
93
|
-
text-transform: uppercase;
|
|
94
|
-
letter-spacing: var(--tracking-wider);
|
|
95
|
-
color: var(--text-muted);
|
|
96
|
-
padding: var(--space-4) var(--space-3) var(--space-2);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
.sidebar__footer {
|
|
100
|
-
border-top: var(--border-thick);
|
|
101
|
-
padding: var(--space-4) var(--space-6);
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### Top bar spec
|
|
106
|
-
|
|
107
|
-
```css
|
|
108
|
-
.topbar {
|
|
109
|
-
height: 56px;
|
|
110
|
-
background: var(--bg-surface);
|
|
111
|
-
border-bottom: var(--border-thicker);
|
|
112
|
-
display: flex;
|
|
113
|
-
align-items: center;
|
|
114
|
-
padding: 0 var(--space-6);
|
|
115
|
-
gap: var(--space-4);
|
|
116
|
-
justify-content: space-between;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
.topbar__breadcrumb {
|
|
120
|
-
font-family: var(--font-mono);
|
|
121
|
-
font-size: var(--text-sm);
|
|
122
|
-
color: var(--text-secondary);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.topbar__actions {
|
|
126
|
-
display: flex;
|
|
127
|
-
align-items: center;
|
|
128
|
-
gap: var(--space-3);
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Content area
|
|
133
|
-
|
|
134
|
-
```css
|
|
135
|
-
.content-area {
|
|
136
|
-
flex: 1;
|
|
137
|
-
background: var(--bg-base);
|
|
138
|
-
padding: var(--space-6);
|
|
139
|
-
overflow-y: auto;
|
|
140
|
-
min-height: 0;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.page-header {
|
|
144
|
-
margin-bottom: var(--space-6);
|
|
145
|
-
display: flex;
|
|
146
|
-
align-items: flex-start;
|
|
147
|
-
justify-content: space-between;
|
|
148
|
-
gap: var(--space-4);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
.page-title {
|
|
152
|
-
font-family: var(--font-display);
|
|
153
|
-
font-size: var(--text-2xl);
|
|
154
|
-
font-weight: var(--weight-extrabold);
|
|
155
|
-
color: var(--text-heading);
|
|
156
|
-
letter-spacing: var(--tracking-tight);
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
## Page Patterns
|
|
163
|
-
|
|
164
|
-
### 1. Dashboard Page
|
|
165
|
-
|
|
166
|
-
```
|
|
167
|
-
[STICKER BADGE: Overview]
|
|
168
|
-
[Page title] + [Date range selector]
|
|
169
|
-
|
|
170
|
-
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
|
|
171
|
-
│ STAT │ │ STAT │ │ STAT │ │ STAT │
|
|
172
|
-
│ CARD │ │ CARD │ │ CARD │ │ CARD │
|
|
173
|
-
└────────┘ └────────┘ └────────┘ └────────┘
|
|
174
|
-
|
|
175
|
-
┌──────────────────────────────────────────┐
|
|
176
|
-
│ CHART CARD (full width, brutalist card) │
|
|
177
|
-
│ border-thicker, shadow-md │
|
|
178
|
-
└──────────────────────────────────────────┘
|
|
179
|
-
|
|
180
|
-
┌────────────────────────┐ ┌──────────────┐
|
|
181
|
-
│ TABLE (full grid) │ │ ACTIVITY LOG │
|
|
182
|
-
│ border on every cell │ │ mono, times │
|
|
183
|
-
└────────────────────────┘ └──────────────┘
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
Composition rules:
|
|
187
|
-
- Stat cards: 3–4 column grid, each with hard shadow, border-thicker
|
|
188
|
-
- Charts: always in a brutalist card, never floating
|
|
189
|
-
- Tables: full-grid border (every cell), not minimal
|
|
190
|
-
- Activity log: mono font, timestamps left-aligned, severity badges
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
### 2. List Page
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
[Page title bold] [+ NEW sticker button: right]
|
|
198
|
-
|
|
199
|
-
[FILTER BAR: brutalist inputs inline, border-thick, shadow-sm]
|
|
200
|
-
|
|
201
|
-
┌────────────────────────────────────────────────┐
|
|
202
|
-
│ TABLE │
|
|
203
|
-
│ header: mono uppercase, bg-elevated │
|
|
204
|
-
│ all cells: border-subtle │
|
|
205
|
-
│ hover row: bg-elevated │
|
|
206
|
-
│ action column: inline icons on hover │
|
|
207
|
-
└────────────────────────────────────────────────┘
|
|
208
|
-
|
|
209
|
-
[PAGINATION: brutalist buttons, arrow + page numbers]
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
The "+ NEW" button in the page header should use `btn-primary` or a `.sticker` style button to maintain the brutalist feel.
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
### 3. Detail Page
|
|
217
|
-
|
|
218
|
-
```
|
|
219
|
-
┌──────────────────────────────────────────────┐
|
|
220
|
-
│ HEADER CARD │
|
|
221
|
-
│ title text-2xl bold + badges row │
|
|
222
|
-
│ metadata row: mono text (id, date, author) │
|
|
223
|
-
│ action buttons: right-aligned │
|
|
224
|
-
│ border-thicker, shadow-md │
|
|
225
|
-
└──────────────────────────────────────────────┘
|
|
226
|
-
|
|
227
|
-
[TAB BAR: border-bottom thick, active tab bg-accent]
|
|
228
|
-
|
|
229
|
-
┌──────────────────┐ ┌────────────────────────┐
|
|
230
|
-
│ CONTENT SECTION │ │ SIDE PANEL │
|
|
231
|
-
│ brutalist cards │ │ brutalist cards │
|
|
232
|
-
│ padding space-6 │ │ metadata, links, etc. │
|
|
233
|
-
└──────────────────┘ └────────────────────────┘
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
Tab bar:
|
|
237
|
-
```css
|
|
238
|
-
.tab-bar {
|
|
239
|
-
display: flex;
|
|
240
|
-
border-bottom: var(--border-thicker);
|
|
241
|
-
gap: 0;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
.tab {
|
|
245
|
-
padding: var(--space-3) var(--space-5);
|
|
246
|
-
font-family: var(--font-mono);
|
|
247
|
-
font-size: var(--text-sm);
|
|
248
|
-
font-weight: var(--weight-medium);
|
|
249
|
-
color: var(--text-secondary);
|
|
250
|
-
border: var(--border-thick);
|
|
251
|
-
border-bottom: none;
|
|
252
|
-
border-right: none;
|
|
253
|
-
cursor: pointer;
|
|
254
|
-
background: var(--bg-surface);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
.tab:first-child { border-left: var(--border-thick); }
|
|
258
|
-
.tab:hover { background: var(--bg-elevated); color: var(--text-heading); }
|
|
259
|
-
|
|
260
|
-
.tab--active {
|
|
261
|
-
background: var(--accent);
|
|
262
|
-
color: var(--accent-contrast);
|
|
263
|
-
font-weight: var(--weight-bold);
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
### 4. Settings Page
|
|
270
|
-
|
|
271
|
-
```
|
|
272
|
-
┌──────────────────┬─────────────────────────────┐
|
|
273
|
-
│ SETTINGS NAV │ SETTINGS FORM │
|
|
274
|
-
│ (left, vertical) │ │
|
|
275
|
-
│ 200px │ [Section Title — mono caps] │
|
|
276
|
-
│ border-right: │ ┌───────────────────────┐ │
|
|
277
|
-
│ 3px solid │ │ SETTINGS CARD │ │
|
|
278
|
-
│ │ │ form fields inside │ │
|
|
279
|
-
│ nav items: │ │ border-thicker │ │
|
|
280
|
-
│ .nav-item style │ └───────────────────────┘ │
|
|
281
|
-
│ │ │
|
|
282
|
-
│ │ [Section Title] │
|
|
283
|
-
│ │ ┌───────────────────────┐ │
|
|
284
|
-
│ │ │ SETTINGS CARD │ │
|
|
285
|
-
│ │ └───────────────────────┘ │
|
|
286
|
-
└──────────────────┴─────────────────────────────┘
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
Section title style:
|
|
290
|
-
```css
|
|
291
|
-
.settings-section-title {
|
|
292
|
-
font-family: var(--font-mono);
|
|
293
|
-
font-size: var(--text-xs);
|
|
294
|
-
font-weight: var(--weight-bold);
|
|
295
|
-
text-transform: uppercase;
|
|
296
|
-
letter-spacing: var(--tracking-wider);
|
|
297
|
-
color: var(--text-secondary);
|
|
298
|
-
margin-bottom: var(--space-4);
|
|
299
|
-
padding-bottom: var(--space-2);
|
|
300
|
-
border-bottom: var(--border-thick);
|
|
301
|
-
}
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
---
|
|
305
|
-
|
|
306
|
-
### 5. Auth Page
|
|
307
|
-
|
|
308
|
-
```
|
|
309
|
-
bg-void (or pattern-dots)
|
|
310
|
-
|
|
311
|
-
┌──────────────────────────┐
|
|
312
|
-
│ AUTH CARD │
|
|
313
|
-
│ border-thicker │
|
|
314
|
-
│ shadow-xl │
|
|
315
|
-
│ max-width: 400px │
|
|
316
|
-
│ │
|
|
317
|
-
│ [Logo or product name] │
|
|
318
|
-
│ [Heading text-xl bold] │
|
|
319
|
-
│ │
|
|
320
|
-
│ [Input: email] │
|
|
321
|
-
│ [Input: password] │
|
|
322
|
-
│ │
|
|
323
|
-
│ [CTA Button full width] │
|
|
324
|
-
│ │
|
|
325
|
-
│ [Secondary link — mono] │
|
|
326
|
-
└──────────────────────────┘
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
```css
|
|
330
|
-
.auth-page {
|
|
331
|
-
min-height: 100vh;
|
|
332
|
-
background: var(--bg-void);
|
|
333
|
-
display: flex;
|
|
334
|
-
align-items: center;
|
|
335
|
-
justify-content: center;
|
|
336
|
-
padding: var(--space-6);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
.auth-card {
|
|
340
|
-
background: var(--bg-surface);
|
|
341
|
-
border: var(--border-thicker);
|
|
342
|
-
box-shadow: var(--shadow-xl);
|
|
343
|
-
padding: var(--space-10);
|
|
344
|
-
width: 100%;
|
|
345
|
-
max-width: 400px;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
.auth-card__heading {
|
|
349
|
-
font-family: var(--font-display);
|
|
350
|
-
font-size: var(--text-xl);
|
|
351
|
-
font-weight: var(--weight-extrabold);
|
|
352
|
-
margin-bottom: var(--space-8);
|
|
353
|
-
}
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
### 6. Onboarding
|
|
359
|
-
|
|
360
|
-
```
|
|
361
|
-
bg-base
|
|
362
|
-
|
|
363
|
-
[Step counter badge: "[1/4]" — mono, bordered]
|
|
364
|
-
|
|
365
|
-
┌──────────────────────────────────────┐
|
|
366
|
-
│ STEP CARD │
|
|
367
|
-
│ border-thicker, shadow-xl │
|
|
368
|
-
│ max-width: 540px │
|
|
369
|
-
│ │
|
|
370
|
-
│ Step heading + description │
|
|
371
|
-
│ │
|
|
372
|
-
│ [Progress bar — thick, 12px] │
|
|
373
|
-
│ │
|
|
374
|
-
│ Step content (input/choice/action) │
|
|
375
|
-
│ │
|
|
376
|
-
│ [BACK btn secondary] [NEXT btn CTA] │
|
|
377
|
-
└──────────────────────────────────────┘
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
Step counter badge:
|
|
381
|
-
```css
|
|
382
|
-
.step-counter {
|
|
383
|
-
display: inline-block;
|
|
384
|
-
font-family: var(--font-mono);
|
|
385
|
-
font-size: var(--text-sm);
|
|
386
|
-
font-weight: var(--weight-bold);
|
|
387
|
-
background: var(--bg-surface);
|
|
388
|
-
border: var(--border-thick);
|
|
389
|
-
box-shadow: var(--shadow-sm);
|
|
390
|
-
padding: var(--space-1) var(--space-3);
|
|
391
|
-
border-radius: var(--radius-none);
|
|
392
|
-
margin-bottom: var(--space-6);
|
|
393
|
-
}
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
---
|
|
397
|
-
|
|
398
|
-
## Responsive Behavior
|
|
399
|
-
|
|
400
|
-
### Breakpoints
|
|
401
|
-
- `< 1024px`: sidebar collapses to hamburger menu
|
|
402
|
-
- `< 768px`: single column stack for all card grids
|
|
403
|
-
- `< 640px`: full-width content, padding reduces to `space-4`
|
|
404
|
-
|
|
405
|
-
### Sidebar collapse
|
|
406
|
-
```css
|
|
407
|
-
@media (max-width: 1023px) {
|
|
408
|
-
.sidebar {
|
|
409
|
-
position: fixed;
|
|
410
|
-
left: -240px;
|
|
411
|
-
top: 0;
|
|
412
|
-
z-index: var(--z-modal);
|
|
413
|
-
transition: left var(--transition-base);
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
.sidebar--open {
|
|
417
|
-
left: 0;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
/* Hamburger trigger */
|
|
421
|
-
.hamburger {
|
|
422
|
-
display: flex;
|
|
423
|
-
flex-direction: column;
|
|
424
|
-
gap: 5px;
|
|
425
|
-
width: 36px;
|
|
426
|
-
height: 36px;
|
|
427
|
-
border: var(--border-thick);
|
|
428
|
-
background: none;
|
|
429
|
-
padding: var(--space-2);
|
|
430
|
-
cursor: pointer;
|
|
431
|
-
justify-content: center;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
.hamburger__line {
|
|
435
|
-
height: 2px;
|
|
436
|
-
background: var(--text-heading);
|
|
437
|
-
width: 100%;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
### Tables on mobile
|
|
443
|
-
Tables always scroll horizontally — never stack to card layout:
|
|
444
|
-
```css
|
|
445
|
-
.table-container {
|
|
446
|
-
overflow-x: auto;
|
|
447
|
-
-webkit-overflow-scrolling: touch;
|
|
448
|
-
}
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
### Shadows on mobile
|
|
452
|
-
Hard shadows reduce to `--shadow-sm` (2px offset) on touch targets to avoid layout overflow:
|
|
453
|
-
```css
|
|
454
|
-
@media (max-width: 639px) {
|
|
455
|
-
.card { box-shadow: var(--shadow-sm); }
|
|
456
|
-
.btn-primary { box-shadow: var(--shadow-sm); }
|
|
457
|
-
}
|
|
458
|
-
```
|
|
1
|
+
# Patterns — Neo-Brutalist UI
|
|
2
|
+
|
|
3
|
+
Page-level compositions and app shell. All layouts use thick borders as structural dividers — no subtle separators.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## App Shell
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
11
|
+
│ SIDEBAR (240px) │ TOP BAR (56px) │
|
|
12
|
+
│ border-right: 3px solid │ border-bottom: 3px solid │
|
|
13
|
+
│ bg-surface │ bg-surface │
|
|
14
|
+
│ ├───────────────────────────────────┤
|
|
15
|
+
│ Logo (top, bold/mono) │ CONTENT AREA │
|
|
16
|
+
│ │ bg-base (cream off-white) │
|
|
17
|
+
│ NAV ITEMS │ padding: 24px │
|
|
18
|
+
│ font-mono, text-sm │ │
|
|
19
|
+
│ Active: bg-accent │ │
|
|
20
|
+
│ color: black │ │
|
|
21
|
+
│ font-bold │ │
|
|
22
|
+
│ │ │
|
|
23
|
+
│ (no left-border active │ │
|
|
24
|
+
│ — full bg fill instead)│ │
|
|
25
|
+
│ │ │
|
|
26
|
+
│ FOOTER: user profile │ │
|
|
27
|
+
│ border-top: 2px solid │ │
|
|
28
|
+
└──────────────────────────┴───────────────────────────────────┘
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Sidebar spec
|
|
32
|
+
|
|
33
|
+
```css
|
|
34
|
+
.sidebar {
|
|
35
|
+
width: 240px;
|
|
36
|
+
background: var(--bg-surface);
|
|
37
|
+
border-right: var(--border-thicker);
|
|
38
|
+
height: 100vh;
|
|
39
|
+
display: flex;
|
|
40
|
+
flex-direction: column;
|
|
41
|
+
flex-shrink: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.sidebar__logo {
|
|
45
|
+
padding: var(--space-5) var(--space-6);
|
|
46
|
+
border-bottom: var(--border-thick);
|
|
47
|
+
font-family: var(--font-display);
|
|
48
|
+
font-weight: var(--weight-extrabold);
|
|
49
|
+
font-size: var(--text-lg);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.sidebar__nav {
|
|
53
|
+
flex: 1;
|
|
54
|
+
padding: var(--space-4) var(--space-3);
|
|
55
|
+
display: flex;
|
|
56
|
+
flex-direction: column;
|
|
57
|
+
gap: var(--space-1);
|
|
58
|
+
overflow-y: auto;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.nav-item {
|
|
62
|
+
display: flex;
|
|
63
|
+
align-items: center;
|
|
64
|
+
gap: var(--space-3);
|
|
65
|
+
padding: var(--space-2) var(--space-3);
|
|
66
|
+
font-family: var(--font-mono);
|
|
67
|
+
font-size: var(--text-sm);
|
|
68
|
+
color: var(--text-secondary);
|
|
69
|
+
text-decoration: none;
|
|
70
|
+
border-radius: var(--radius-none);
|
|
71
|
+
border: var(--border-subtle);
|
|
72
|
+
border-color: transparent;
|
|
73
|
+
transition: background var(--transition-fast), color var(--transition-fast);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.nav-item:hover {
|
|
77
|
+
background: var(--bg-elevated);
|
|
78
|
+
color: var(--text-heading);
|
|
79
|
+
border-color: var(--border-color);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Active: full accent fill — not a left border indicator */
|
|
83
|
+
.nav-item--active {
|
|
84
|
+
background: var(--accent);
|
|
85
|
+
color: var(--accent-contrast);
|
|
86
|
+
font-weight: var(--weight-bold);
|
|
87
|
+
border-color: var(--border-color);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.sidebar__section-label {
|
|
91
|
+
font-family: var(--font-mono);
|
|
92
|
+
font-size: var(--text-xs);
|
|
93
|
+
text-transform: uppercase;
|
|
94
|
+
letter-spacing: var(--tracking-wider);
|
|
95
|
+
color: var(--text-muted);
|
|
96
|
+
padding: var(--space-4) var(--space-3) var(--space-2);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.sidebar__footer {
|
|
100
|
+
border-top: var(--border-thick);
|
|
101
|
+
padding: var(--space-4) var(--space-6);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Top bar spec
|
|
106
|
+
|
|
107
|
+
```css
|
|
108
|
+
.topbar {
|
|
109
|
+
height: 56px;
|
|
110
|
+
background: var(--bg-surface);
|
|
111
|
+
border-bottom: var(--border-thicker);
|
|
112
|
+
display: flex;
|
|
113
|
+
align-items: center;
|
|
114
|
+
padding: 0 var(--space-6);
|
|
115
|
+
gap: var(--space-4);
|
|
116
|
+
justify-content: space-between;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.topbar__breadcrumb {
|
|
120
|
+
font-family: var(--font-mono);
|
|
121
|
+
font-size: var(--text-sm);
|
|
122
|
+
color: var(--text-secondary);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.topbar__actions {
|
|
126
|
+
display: flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
gap: var(--space-3);
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Content area
|
|
133
|
+
|
|
134
|
+
```css
|
|
135
|
+
.content-area {
|
|
136
|
+
flex: 1;
|
|
137
|
+
background: var(--bg-base);
|
|
138
|
+
padding: var(--space-6);
|
|
139
|
+
overflow-y: auto;
|
|
140
|
+
min-height: 0;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.page-header {
|
|
144
|
+
margin-bottom: var(--space-6);
|
|
145
|
+
display: flex;
|
|
146
|
+
align-items: flex-start;
|
|
147
|
+
justify-content: space-between;
|
|
148
|
+
gap: var(--space-4);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.page-title {
|
|
152
|
+
font-family: var(--font-display);
|
|
153
|
+
font-size: var(--text-2xl);
|
|
154
|
+
font-weight: var(--weight-extrabold);
|
|
155
|
+
color: var(--text-heading);
|
|
156
|
+
letter-spacing: var(--tracking-tight);
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Page Patterns
|
|
163
|
+
|
|
164
|
+
### 1. Dashboard Page
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
[STICKER BADGE: Overview]
|
|
168
|
+
[Page title] + [Date range selector]
|
|
169
|
+
|
|
170
|
+
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
|
|
171
|
+
│ STAT │ │ STAT │ │ STAT │ │ STAT │
|
|
172
|
+
│ CARD │ │ CARD │ │ CARD │ │ CARD │
|
|
173
|
+
└────────┘ └────────┘ └────────┘ └────────┘
|
|
174
|
+
|
|
175
|
+
┌──────────────────────────────────────────┐
|
|
176
|
+
│ CHART CARD (full width, brutalist card) │
|
|
177
|
+
│ border-thicker, shadow-md │
|
|
178
|
+
└──────────────────────────────────────────┘
|
|
179
|
+
|
|
180
|
+
┌────────────────────────┐ ┌──────────────┐
|
|
181
|
+
│ TABLE (full grid) │ │ ACTIVITY LOG │
|
|
182
|
+
│ border on every cell │ │ mono, times │
|
|
183
|
+
└────────────────────────┘ └──────────────┘
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Composition rules:
|
|
187
|
+
- Stat cards: 3–4 column grid, each with hard shadow, border-thicker
|
|
188
|
+
- Charts: always in a brutalist card, never floating
|
|
189
|
+
- Tables: full-grid border (every cell), not minimal
|
|
190
|
+
- Activity log: mono font, timestamps left-aligned, severity badges
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### 2. List Page
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
[Page title bold] [+ NEW sticker button: right]
|
|
198
|
+
|
|
199
|
+
[FILTER BAR: brutalist inputs inline, border-thick, shadow-sm]
|
|
200
|
+
|
|
201
|
+
┌────────────────────────────────────────────────┐
|
|
202
|
+
│ TABLE │
|
|
203
|
+
│ header: mono uppercase, bg-elevated │
|
|
204
|
+
│ all cells: border-subtle │
|
|
205
|
+
│ hover row: bg-elevated │
|
|
206
|
+
│ action column: inline icons on hover │
|
|
207
|
+
└────────────────────────────────────────────────┘
|
|
208
|
+
|
|
209
|
+
[PAGINATION: brutalist buttons, arrow + page numbers]
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
The "+ NEW" button in the page header should use `btn-primary` or a `.sticker` style button to maintain the brutalist feel.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
### 3. Detail Page
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
┌──────────────────────────────────────────────┐
|
|
220
|
+
│ HEADER CARD │
|
|
221
|
+
│ title text-2xl bold + badges row │
|
|
222
|
+
│ metadata row: mono text (id, date, author) │
|
|
223
|
+
│ action buttons: right-aligned │
|
|
224
|
+
│ border-thicker, shadow-md │
|
|
225
|
+
└──────────────────────────────────────────────┘
|
|
226
|
+
|
|
227
|
+
[TAB BAR: border-bottom thick, active tab bg-accent]
|
|
228
|
+
|
|
229
|
+
┌──────────────────┐ ┌────────────────────────┐
|
|
230
|
+
│ CONTENT SECTION │ │ SIDE PANEL │
|
|
231
|
+
│ brutalist cards │ │ brutalist cards │
|
|
232
|
+
│ padding space-6 │ │ metadata, links, etc. │
|
|
233
|
+
└──────────────────┘ └────────────────────────┘
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Tab bar:
|
|
237
|
+
```css
|
|
238
|
+
.tab-bar {
|
|
239
|
+
display: flex;
|
|
240
|
+
border-bottom: var(--border-thicker);
|
|
241
|
+
gap: 0;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.tab {
|
|
245
|
+
padding: var(--space-3) var(--space-5);
|
|
246
|
+
font-family: var(--font-mono);
|
|
247
|
+
font-size: var(--text-sm);
|
|
248
|
+
font-weight: var(--weight-medium);
|
|
249
|
+
color: var(--text-secondary);
|
|
250
|
+
border: var(--border-thick);
|
|
251
|
+
border-bottom: none;
|
|
252
|
+
border-right: none;
|
|
253
|
+
cursor: pointer;
|
|
254
|
+
background: var(--bg-surface);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.tab:first-child { border-left: var(--border-thick); }
|
|
258
|
+
.tab:hover { background: var(--bg-elevated); color: var(--text-heading); }
|
|
259
|
+
|
|
260
|
+
.tab--active {
|
|
261
|
+
background: var(--accent);
|
|
262
|
+
color: var(--accent-contrast);
|
|
263
|
+
font-weight: var(--weight-bold);
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### 4. Settings Page
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
┌──────────────────┬─────────────────────────────┐
|
|
273
|
+
│ SETTINGS NAV │ SETTINGS FORM │
|
|
274
|
+
│ (left, vertical) │ │
|
|
275
|
+
│ 200px │ [Section Title — mono caps] │
|
|
276
|
+
│ border-right: │ ┌───────────────────────┐ │
|
|
277
|
+
│ 3px solid │ │ SETTINGS CARD │ │
|
|
278
|
+
│ │ │ form fields inside │ │
|
|
279
|
+
│ nav items: │ │ border-thicker │ │
|
|
280
|
+
│ .nav-item style │ └───────────────────────┘ │
|
|
281
|
+
│ │ │
|
|
282
|
+
│ │ [Section Title] │
|
|
283
|
+
│ │ ┌───────────────────────┐ │
|
|
284
|
+
│ │ │ SETTINGS CARD │ │
|
|
285
|
+
│ │ └───────────────────────┘ │
|
|
286
|
+
└──────────────────┴─────────────────────────────┘
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Section title style:
|
|
290
|
+
```css
|
|
291
|
+
.settings-section-title {
|
|
292
|
+
font-family: var(--font-mono);
|
|
293
|
+
font-size: var(--text-xs);
|
|
294
|
+
font-weight: var(--weight-bold);
|
|
295
|
+
text-transform: uppercase;
|
|
296
|
+
letter-spacing: var(--tracking-wider);
|
|
297
|
+
color: var(--text-secondary);
|
|
298
|
+
margin-bottom: var(--space-4);
|
|
299
|
+
padding-bottom: var(--space-2);
|
|
300
|
+
border-bottom: var(--border-thick);
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
### 5. Auth Page
|
|
307
|
+
|
|
308
|
+
```
|
|
309
|
+
bg-void (or pattern-dots)
|
|
310
|
+
|
|
311
|
+
┌──────────────────────────┐
|
|
312
|
+
│ AUTH CARD │
|
|
313
|
+
│ border-thicker │
|
|
314
|
+
│ shadow-xl │
|
|
315
|
+
│ max-width: 400px │
|
|
316
|
+
│ │
|
|
317
|
+
│ [Logo or product name] │
|
|
318
|
+
│ [Heading text-xl bold] │
|
|
319
|
+
│ │
|
|
320
|
+
│ [Input: email] │
|
|
321
|
+
│ [Input: password] │
|
|
322
|
+
│ │
|
|
323
|
+
│ [CTA Button full width] │
|
|
324
|
+
│ │
|
|
325
|
+
│ [Secondary link — mono] │
|
|
326
|
+
└──────────────────────────┘
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
```css
|
|
330
|
+
.auth-page {
|
|
331
|
+
min-height: 100vh;
|
|
332
|
+
background: var(--bg-void);
|
|
333
|
+
display: flex;
|
|
334
|
+
align-items: center;
|
|
335
|
+
justify-content: center;
|
|
336
|
+
padding: var(--space-6);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.auth-card {
|
|
340
|
+
background: var(--bg-surface);
|
|
341
|
+
border: var(--border-thicker);
|
|
342
|
+
box-shadow: var(--shadow-xl);
|
|
343
|
+
padding: var(--space-10);
|
|
344
|
+
width: 100%;
|
|
345
|
+
max-width: 400px;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.auth-card__heading {
|
|
349
|
+
font-family: var(--font-display);
|
|
350
|
+
font-size: var(--text-xl);
|
|
351
|
+
font-weight: var(--weight-extrabold);
|
|
352
|
+
margin-bottom: var(--space-8);
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
### 6. Onboarding
|
|
359
|
+
|
|
360
|
+
```
|
|
361
|
+
bg-base
|
|
362
|
+
|
|
363
|
+
[Step counter badge: "[1/4]" — mono, bordered]
|
|
364
|
+
|
|
365
|
+
┌──────────────────────────────────────┐
|
|
366
|
+
│ STEP CARD │
|
|
367
|
+
│ border-thicker, shadow-xl │
|
|
368
|
+
│ max-width: 540px │
|
|
369
|
+
│ │
|
|
370
|
+
│ Step heading + description │
|
|
371
|
+
│ │
|
|
372
|
+
│ [Progress bar — thick, 12px] │
|
|
373
|
+
│ │
|
|
374
|
+
│ Step content (input/choice/action) │
|
|
375
|
+
│ │
|
|
376
|
+
│ [BACK btn secondary] [NEXT btn CTA] │
|
|
377
|
+
└──────────────────────────────────────┘
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
Step counter badge:
|
|
381
|
+
```css
|
|
382
|
+
.step-counter {
|
|
383
|
+
display: inline-block;
|
|
384
|
+
font-family: var(--font-mono);
|
|
385
|
+
font-size: var(--text-sm);
|
|
386
|
+
font-weight: var(--weight-bold);
|
|
387
|
+
background: var(--bg-surface);
|
|
388
|
+
border: var(--border-thick);
|
|
389
|
+
box-shadow: var(--shadow-sm);
|
|
390
|
+
padding: var(--space-1) var(--space-3);
|
|
391
|
+
border-radius: var(--radius-none);
|
|
392
|
+
margin-bottom: var(--space-6);
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## Responsive Behavior
|
|
399
|
+
|
|
400
|
+
### Breakpoints
|
|
401
|
+
- `< 1024px`: sidebar collapses to hamburger menu
|
|
402
|
+
- `< 768px`: single column stack for all card grids
|
|
403
|
+
- `< 640px`: full-width content, padding reduces to `space-4`
|
|
404
|
+
|
|
405
|
+
### Sidebar collapse
|
|
406
|
+
```css
|
|
407
|
+
@media (max-width: 1023px) {
|
|
408
|
+
.sidebar {
|
|
409
|
+
position: fixed;
|
|
410
|
+
left: -240px;
|
|
411
|
+
top: 0;
|
|
412
|
+
z-index: var(--z-modal);
|
|
413
|
+
transition: left var(--transition-base);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.sidebar--open {
|
|
417
|
+
left: 0;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/* Hamburger trigger */
|
|
421
|
+
.hamburger {
|
|
422
|
+
display: flex;
|
|
423
|
+
flex-direction: column;
|
|
424
|
+
gap: 5px;
|
|
425
|
+
width: 36px;
|
|
426
|
+
height: 36px;
|
|
427
|
+
border: var(--border-thick);
|
|
428
|
+
background: none;
|
|
429
|
+
padding: var(--space-2);
|
|
430
|
+
cursor: pointer;
|
|
431
|
+
justify-content: center;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.hamburger__line {
|
|
435
|
+
height: 2px;
|
|
436
|
+
background: var(--text-heading);
|
|
437
|
+
width: 100%;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### Tables on mobile
|
|
443
|
+
Tables always scroll horizontally — never stack to card layout:
|
|
444
|
+
```css
|
|
445
|
+
.table-container {
|
|
446
|
+
overflow-x: auto;
|
|
447
|
+
-webkit-overflow-scrolling: touch;
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Shadows on mobile
|
|
452
|
+
Hard shadows reduce to `--shadow-sm` (2px offset) on touch targets to avoid layout overflow:
|
|
453
|
+
```css
|
|
454
|
+
@media (max-width: 639px) {
|
|
455
|
+
.card { box-shadow: var(--shadow-sm); }
|
|
456
|
+
.btn-primary { box-shadow: var(--shadow-sm); }
|
|
457
|
+
}
|
|
458
|
+
```
|