@jaimevalasek/aioson 1.5.1 → 1.6.0
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/README.md +6 -0
- package/docs/design-previews/aurora-command-ui-website.html +884 -0
- package/docs/design-previews/aurora-command-ui.html +682 -0
- package/docs/design-previews/bold-editorial-ui-website.html +658 -0
- package/docs/design-previews/bold-editorial-ui.html +717 -0
- package/docs/design-previews/clean-saas-ui-website.html +1202 -0
- package/docs/design-previews/clean-saas-ui.html +549 -0
- package/docs/design-previews/cognitive-core-ui-website.html +1009 -0
- package/docs/design-previews/cognitive-core-ui.html +463 -0
- package/docs/design-previews/glassmorphism-ui-website.html +572 -0
- package/docs/design-previews/glassmorphism-ui.html +886 -0
- package/docs/design-previews/index.html +699 -0
- package/docs/design-previews/interface-design-website.html +1187 -0
- package/docs/design-previews/interface-design.html +513 -0
- package/docs/design-previews/neo-brutalist-ui-website.html +621 -0
- package/docs/design-previews/neo-brutalist-ui.html +797 -0
- package/docs/design-previews/premium-command-center-ui-website.html +1217 -0
- package/docs/design-previews/premium-command-center-ui.html +552 -0
- package/docs/design-previews/warm-craft-ui-website.html +684 -0
- package/docs/design-previews/warm-craft-ui.html +739 -0
- package/docs/en/cli-reference.md +20 -9
- package/docs/pt/README.md +7 -0
- package/docs/pt/agent-sharding.md +132 -0
- package/docs/pt/agentes.md +8 -2
- package/docs/pt/busca-de-contexto.md +129 -0
- package/docs/pt/cache-de-contexto.md +156 -0
- package/docs/pt/comandos-cli.md +28 -0
- package/docs/pt/design-hybrid-forge.md +107 -0
- package/docs/pt/inicio-rapido.md +54 -3
- package/docs/pt/inteligencia-adaptativa.md +324 -0
- package/docs/pt/monitor-de-contexto.md +104 -0
- package/docs/pt/recuperacao-de-sessao.md +125 -0
- package/docs/pt/sandbox.md +125 -0
- package/docs/pt/skills.md +98 -6
- package/package.json +1 -1
- package/src/agent-loader.js +280 -0
- package/src/cli.js +94 -0
- package/src/commands/agent-loader.js +85 -0
- package/src/commands/context-cache.js +90 -0
- package/src/commands/context-monitor.js +92 -0
- package/src/commands/context-search.js +66 -0
- package/src/commands/design-hybrid-options.js +385 -0
- package/src/commands/health.js +214 -0
- package/src/commands/init.js +54 -13
- package/src/commands/install.js +52 -13
- package/src/commands/learning-evolve.js +355 -0
- package/src/commands/live.js +34 -0
- package/src/commands/recovery.js +43 -0
- package/src/commands/sandbox.js +37 -0
- package/src/commands/setup-context.js +22 -2
- package/src/commands/setup.js +178 -0
- package/src/commands/skill.js +79 -32
- package/src/commands/tool-registry-cmd.js +232 -0
- package/src/commands/update.js +7 -0
- package/src/constants.js +9 -0
- package/src/context-cache.js +159 -0
- package/src/context-search.js +326 -0
- package/src/design-variation-catalog.js +503 -0
- package/src/i18n/messages/en.js +32 -2
- package/src/i18n/messages/es.js +30 -2
- package/src/i18n/messages/fr.js +30 -2
- package/src/i18n/messages/pt-BR.js +32 -2
- package/src/install-animation.js +260 -0
- package/src/install-profile.js +143 -0
- package/src/install-wizard.js +474 -0
- package/src/installer.js +38 -10
- package/src/parser.js +7 -1
- package/src/recovery-context-session.js +154 -0
- package/src/runtime-store.js +97 -1
- package/src/sandbox.js +177 -0
- package/src/tool-executor.js +94 -0
- package/src/updater.js +11 -3
- package/template/.aioson/agents/analyst.md +58 -3
- package/template/.aioson/agents/architect.md +38 -0
- package/template/.aioson/agents/design-hybrid-forge.md +127 -0
- package/template/.aioson/agents/dev.md +103 -0
- package/template/.aioson/agents/deyvin.md +57 -0
- package/template/.aioson/agents/pm.md +58 -0
- package/template/.aioson/agents/product.md +28 -0
- package/template/.aioson/agents/qa.md +79 -0
- package/template/.aioson/agents/setup.md +65 -3
- package/template/.aioson/agents/sheldon.md +107 -6
- package/template/.aioson/agents/tester.md +156 -0
- package/template/.aioson/config.md +15 -0
- package/template/.aioson/context/forensics/.gitkeep +0 -0
- package/template/.aioson/context/seeds/seed-example.md +27 -0
- package/template/.aioson/context/user-profile.md +42 -0
- package/template/.aioson/locales/en/agents/setup.md +33 -1
- package/template/.aioson/locales/es/agents/setup.md +33 -1
- package/template/.aioson/locales/fr/agents/setup.md +33 -1
- package/template/.aioson/locales/pt-BR/agents/setup.md +33 -1
- package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +243 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +482 -0
- package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +387 -0
- package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +222 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -0
- package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +213 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -0
- package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -0
- package/template/.aioson/skills/process/aioson-spec-driven/SKILL.md +45 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/approval-gates.md +109 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/artifact-map.md +44 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/classification-map.md +37 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/hardening-lane.md +49 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/maintenance-and-state.md +66 -0
- package/template/.aioson/skills/process/aioson-spec-driven/references/ui-language.md +75 -0
- package/template/.aioson/skills/process/design-hybrid-forge/SKILL.md +144 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/crossover-protocol.md +221 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/naming-registry.md +88 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/output-contract.md +291 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/pair-compatibility.md +117 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/quality-gates.md +188 -0
- package/template/.aioson/skills/process/design-hybrid-forge/references/variation-library.md +125 -0
- package/template/AGENTS.md +23 -1
- package/template/CLAUDE.md +1 -0
|
@@ -0,0 +1,827 @@
|
|
|
1
|
+
# Components — Aurora Command UI
|
|
2
|
+
|
|
3
|
+
Read after `design-tokens.md`. All components use CSS variables and adapt to dark/light themes automatically. Every container-type component is a glass surface.
|
|
4
|
+
|
|
5
|
+
Code examples use JSX inline style notation as **design specifications** — read property-value pairs as spec, then adapt syntax to the active stack (HTML, Vue, Blade, etc.). The shorthand `TG` means `{ transition: 'var(--transition-glass)' }`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Glass Rules (read first)
|
|
10
|
+
|
|
11
|
+
Before building any component:
|
|
12
|
+
|
|
13
|
+
1. **Substrate required**: glass only works over the aurora gradient background. Confirm `body` or root container has `background: var(--bg-gradient); background-attachment: fixed` before building.
|
|
14
|
+
2. **Top reflection on every glass container**: every glass card must have `::before` with `var(--glass-highlight)`. This is what makes the glass feel real.
|
|
15
|
+
3. **Minimum 2 depth layers**: never place a glass card directly adjacent to another glass card of the same opacity without context differentiation.
|
|
16
|
+
4. **@supports fallback**: every glass surface must degrade gracefully when `backdrop-filter` is unsupported.
|
|
17
|
+
5. **Text contrast over dark glass**: dark glass can make text illegible. Verify WCAG AA — increase `--glass-surface` alpha toward `--glass-elevated` if needed.
|
|
18
|
+
6. **Mono rails are section structure** — not component decoration. Use them in section headers, stat labels, and metadata zones only.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 1. Glass Card (fundamental component)
|
|
23
|
+
|
|
24
|
+
Every container-type component inherits from this. It is the atomic building block of the system.
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Structure:
|
|
28
|
+
position: relative
|
|
29
|
+
overflow: hidden
|
|
30
|
+
background: var(--glass-surface)
|
|
31
|
+
backdrop-filter: var(--glass-blur-md)
|
|
32
|
+
border: 1px solid var(--glass-border)
|
|
33
|
+
border-radius: var(--radius-xl)
|
|
34
|
+
box-shadow: var(--shadow-md), var(--shadow-inner)
|
|
35
|
+
padding: var(--space-5)
|
|
36
|
+
|
|
37
|
+
::before (top reflection):
|
|
38
|
+
content: ''
|
|
39
|
+
position: absolute
|
|
40
|
+
top: 0; left: 0; right: 0
|
|
41
|
+
height: 50%
|
|
42
|
+
background: var(--glass-highlight)
|
|
43
|
+
pointer-events: none
|
|
44
|
+
border-radius: inherit
|
|
45
|
+
|
|
46
|
+
Hover:
|
|
47
|
+
background: var(--glass-elevated)
|
|
48
|
+
box-shadow: var(--shadow-glow), var(--shadow-inner)
|
|
49
|
+
transition: var(--transition-glass)
|
|
50
|
+
|
|
51
|
+
@supports (backdrop-filter: blur(1px)):
|
|
52
|
+
background: var(--glass-surface)
|
|
53
|
+
backdrop-filter: var(--glass-blur-md)
|
|
54
|
+
Fallback (no @supports):
|
|
55
|
+
background: var(--glass-fallback)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Variants:
|
|
59
|
+
- `glass-card--sm`: `padding: var(--space-4)`, `border-radius: var(--radius-lg)`
|
|
60
|
+
- `glass-card--lg`: `padding: var(--space-8)`, `border-radius: var(--radius-2xl)`, `backdrop-filter: var(--glass-blur-lg)`
|
|
61
|
+
- `glass-card--hero`: `padding: var(--space-10)`, `border-radius: var(--radius-3xl)`, `backdrop-filter: var(--glass-blur-lg)`
|
|
62
|
+
- `glass-card--featured`: adds `box-shadow: var(--shadow-glow-strong)` + `border: 1px solid var(--glass-border-accent)`
|
|
63
|
+
- `glass-card--shell`: uses `var(--glass-shell)` + `var(--glass-blur-lg)` — for sidebar and top bar surfaces
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 2. Glass Top Navigation Bar
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
71
|
+
│ [Logo] AppName Link Link Link [Theme ☀] [Avatar] │
|
|
72
|
+
└──────────────────────────────────────────────────────────────┘
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```css
|
|
76
|
+
.top-bar {
|
|
77
|
+
position: sticky;
|
|
78
|
+
top: 0;
|
|
79
|
+
z-index: var(--z-sticky);
|
|
80
|
+
height: var(--nav-height);
|
|
81
|
+
background: var(--glass-shell);
|
|
82
|
+
backdrop-filter: var(--glass-blur-lg);
|
|
83
|
+
border-bottom: 1px solid var(--glass-border);
|
|
84
|
+
}
|
|
85
|
+
@supports (backdrop-filter: blur(1px)) {
|
|
86
|
+
.top-bar {
|
|
87
|
+
background: var(--glass-shell);
|
|
88
|
+
backdrop-filter: var(--glass-blur-lg);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- Logo: 32px square, `background: var(--accent-primary-dim)`, `border: 1px solid var(--glass-border-accent)`, `border-radius: var(--radius-md)`, icon in `var(--accent-primary)`
|
|
94
|
+
- Brand name: `font-family: var(--font-mono)`, `--weight-bold`, `--text-base`, `--text-heading`, `letter-spacing: var(--tracking-wide)`
|
|
95
|
+
- Nav links: `--text-base`, `color: var(--text-secondary)`. Hover: `var(--text-primary)`. Active: `var(--text-accent)`.
|
|
96
|
+
- Theme toggle: see Component 16.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 3. Stat Card
|
|
101
|
+
|
|
102
|
+
Glass card with mono label + large number. The primary KPI component.
|
|
103
|
+
|
|
104
|
+
```jsx
|
|
105
|
+
<div style={{
|
|
106
|
+
background: 'var(--glass-surface)',
|
|
107
|
+
backdropFilter: 'var(--glass-blur-md)',
|
|
108
|
+
border: '1px solid var(--glass-border)',
|
|
109
|
+
borderRadius: 'var(--radius-xl)',
|
|
110
|
+
padding: 'var(--space-4) var(--space-5)',
|
|
111
|
+
boxShadow: 'var(--shadow-md), var(--shadow-inner)',
|
|
112
|
+
minWidth: 140, flex: 1, position: 'relative', overflow: 'hidden',
|
|
113
|
+
...TG,
|
|
114
|
+
}}>
|
|
115
|
+
{/* ::before reflection in CSS */}
|
|
116
|
+
<div style={{
|
|
117
|
+
fontFamily: 'var(--font-mono)', fontSize: 'var(--text-xs)',
|
|
118
|
+
color: 'var(--text-muted)', letterSpacing: 'var(--tracking-widest)',
|
|
119
|
+
textTransform: 'uppercase', fontWeight: 600, marginBottom: 'var(--space-1)'
|
|
120
|
+
}}>LABEL</div>
|
|
121
|
+
<div style={{ display: 'flex', alignItems: 'baseline', gap: 4 }}>
|
|
122
|
+
<span style={{
|
|
123
|
+
fontFamily: 'var(--font-display)', fontSize: 'var(--text-4xl)', fontWeight: 700,
|
|
124
|
+
color: 'var(--text-heading)', lineHeight: 1, fontVariantNumeric: 'tabular-nums'
|
|
125
|
+
}}>42</span>
|
|
126
|
+
<span style={{ fontSize: 'var(--text-lg)', color: 'var(--text-muted)' }}>/100</span>
|
|
127
|
+
</div>
|
|
128
|
+
<div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 'var(--space-1)' }}>
|
|
129
|
+
subtitle text
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Hero variant** (gradient stat number — use only once per viewport):
|
|
135
|
+
```css
|
|
136
|
+
.stat-number--hero {
|
|
137
|
+
background: var(--accent-gradient);
|
|
138
|
+
-webkit-background-clip: text;
|
|
139
|
+
-webkit-text-fill-color: transparent;
|
|
140
|
+
background-clip: text;
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Semantic variants**: replace number color with `var(--semantic-green)`, `var(--semantic-red)`, or `var(--semantic-amber)`.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 4. Glass Sidebar
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
┌───────────────────┐
|
|
152
|
+
│ SECTION LABEL │ ← mono rail
|
|
153
|
+
│ ● Item Active │ ← glass-elevated + border-left accent
|
|
154
|
+
│ ○ Item │ ← text-secondary
|
|
155
|
+
│ │
|
|
156
|
+
│ SECTION LABEL │
|
|
157
|
+
│ ○ Item │
|
|
158
|
+
└───────────────────┘
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```css
|
|
162
|
+
.sidebar {
|
|
163
|
+
width: var(--sidebar-width); /* 210px */
|
|
164
|
+
height: 100vh;
|
|
165
|
+
position: fixed;
|
|
166
|
+
top: 0; left: 0;
|
|
167
|
+
background: var(--glass-shell);
|
|
168
|
+
backdrop-filter: var(--glass-blur-lg);
|
|
169
|
+
border-right: 1px solid var(--glass-border);
|
|
170
|
+
padding: var(--space-6) 0;
|
|
171
|
+
overflow-y: auto;
|
|
172
|
+
}
|
|
173
|
+
@supports (backdrop-filter: blur(1px)) {
|
|
174
|
+
.sidebar { background: var(--glass-shell); backdrop-filter: var(--glass-blur-lg); }
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.sidebar-section-label {
|
|
178
|
+
font-family: var(--font-mono);
|
|
179
|
+
font-size: var(--text-xs);
|
|
180
|
+
font-weight: var(--weight-semibold);
|
|
181
|
+
letter-spacing: var(--tracking-widest);
|
|
182
|
+
text-transform: uppercase;
|
|
183
|
+
color: var(--text-muted);
|
|
184
|
+
padding: var(--space-2) var(--space-4);
|
|
185
|
+
margin-top: var(--space-4);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.sidebar-item {
|
|
189
|
+
display: flex;
|
|
190
|
+
align-items: center;
|
|
191
|
+
gap: var(--space-3);
|
|
192
|
+
padding: var(--space-2) var(--space-4);
|
|
193
|
+
border-radius: var(--radius-md);
|
|
194
|
+
font-size: var(--text-base);
|
|
195
|
+
color: var(--text-secondary);
|
|
196
|
+
cursor: pointer;
|
|
197
|
+
transition: var(--transition-glass);
|
|
198
|
+
margin: 0 var(--space-2);
|
|
199
|
+
}
|
|
200
|
+
.sidebar-item:hover {
|
|
201
|
+
background: var(--glass-elevated);
|
|
202
|
+
color: var(--text-primary);
|
|
203
|
+
}
|
|
204
|
+
.sidebar-item.active {
|
|
205
|
+
background: var(--glass-elevated);
|
|
206
|
+
border-left: 3px solid var(--accent-primary);
|
|
207
|
+
color: var(--text-heading);
|
|
208
|
+
padding-left: calc(var(--space-4) - 3px);
|
|
209
|
+
}
|
|
210
|
+
.sidebar-item.active .sidebar-icon {
|
|
211
|
+
color: var(--accent-primary);
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 5. Section Header (mono rail)
|
|
218
|
+
|
|
219
|
+
The structural backbone. Every content zone begins with one.
|
|
220
|
+
|
|
221
|
+
```jsx
|
|
222
|
+
<div style={{
|
|
223
|
+
display: 'flex', alignItems: 'center', gap: 'var(--space-3)',
|
|
224
|
+
padding: 'var(--space-6) 0 var(--space-3)',
|
|
225
|
+
}}>
|
|
226
|
+
<span style={{ color: 'var(--accent-primary)', fontSize: 'var(--text-lg)' }}>⚡</span>
|
|
227
|
+
<div>
|
|
228
|
+
<div style={{
|
|
229
|
+
fontFamily: 'var(--font-mono)', fontSize: 'var(--text-xs)', fontWeight: 600,
|
|
230
|
+
letterSpacing: 'var(--tracking-widest)', textTransform: 'uppercase',
|
|
231
|
+
color: 'var(--text-muted)',
|
|
232
|
+
}}>SECTION LABEL</div>
|
|
233
|
+
<div style={{
|
|
234
|
+
fontFamily: 'var(--font-display)', fontSize: 'var(--text-xl)', fontWeight: 700,
|
|
235
|
+
color: 'var(--text-heading)', letterSpacing: 'var(--tracking-tight)',
|
|
236
|
+
}}>Section Title</div>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Simple variant (mono-only, no title — for dense dashboards):
|
|
242
|
+
```jsx
|
|
243
|
+
<div style={{
|
|
244
|
+
fontFamily: 'var(--font-mono)', fontSize: 'var(--text-xs)', fontWeight: 600,
|
|
245
|
+
letterSpacing: 'var(--tracking-widest)', textTransform: 'uppercase',
|
|
246
|
+
color: 'var(--text-muted)',
|
|
247
|
+
padding: 'var(--space-4) 0 var(--space-2)',
|
|
248
|
+
display: 'flex', alignItems: 'center', gap: 'var(--space-2)',
|
|
249
|
+
}}>
|
|
250
|
+
<span>—</span> SECTION NAME
|
|
251
|
+
</div>
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 6. Tab Navigation
|
|
257
|
+
|
|
258
|
+
```jsx
|
|
259
|
+
<div style={{
|
|
260
|
+
display: 'flex',
|
|
261
|
+
background: 'var(--glass-shell)',
|
|
262
|
+
backdropFilter: 'var(--glass-blur-md)',
|
|
263
|
+
borderBottom: '1px solid var(--glass-border)',
|
|
264
|
+
padding: '0 var(--space-6)',
|
|
265
|
+
overflowX: 'auto',
|
|
266
|
+
}}>
|
|
267
|
+
<button style={{
|
|
268
|
+
fontFamily: 'var(--font-body)', fontSize: 'var(--text-base)',
|
|
269
|
+
color: isActive ? 'var(--text-accent)' : 'var(--text-secondary)',
|
|
270
|
+
background: 'none', border: 'none',
|
|
271
|
+
padding: 'var(--space-3) var(--space-4)',
|
|
272
|
+
borderBottom: `3px solid ${isActive ? 'var(--accent-primary)' : 'transparent'}`,
|
|
273
|
+
cursor: 'pointer',
|
|
274
|
+
transition: 'color 150ms ease, border-color 150ms ease',
|
|
275
|
+
display: 'flex', alignItems: 'center', gap: 'var(--space-2)',
|
|
276
|
+
}}>
|
|
277
|
+
<span>icon</span> Label
|
|
278
|
+
</button>
|
|
279
|
+
</div>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Hover (non-active): `background: var(--glass-elevated)`, `border-radius: var(--radius-md) var(--radius-md) 0 0`.
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 7. Badge / Chip
|
|
287
|
+
|
|
288
|
+
Three variants — mono font, uppercase, `letter-spacing: var(--tracking-wider)`, `font-size: var(--text-xs)`.
|
|
289
|
+
|
|
290
|
+
**Accent badge** (active, primary, teal):
|
|
291
|
+
```jsx
|
|
292
|
+
{
|
|
293
|
+
background: 'var(--accent-primary-dim)',
|
|
294
|
+
color: 'var(--accent-primary)',
|
|
295
|
+
border: '1px solid var(--glass-border-accent)',
|
|
296
|
+
fontFamily: 'var(--font-mono)', fontSize: 'var(--text-xs)', fontWeight: 600,
|
|
297
|
+
letterSpacing: 'var(--tracking-wider)', textTransform: 'uppercase',
|
|
298
|
+
padding: '2px 10px', borderRadius: 'var(--radius-sm)',
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Violet badge** (CTA, highlight, escalation):
|
|
303
|
+
```jsx
|
|
304
|
+
{
|
|
305
|
+
background: 'var(--accent-violet-dim)',
|
|
306
|
+
color: 'var(--accent-violet)',
|
|
307
|
+
border: '1px solid rgba(124,58,237,0.30)',
|
|
308
|
+
/* same font styles as accent */
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Glass badge** (neutral tag):
|
|
313
|
+
```jsx
|
|
314
|
+
{
|
|
315
|
+
background: 'var(--glass-surface)',
|
|
316
|
+
backdropFilter: 'var(--glass-blur-sm)',
|
|
317
|
+
color: 'var(--text-secondary)',
|
|
318
|
+
border: '1px solid var(--glass-border)',
|
|
319
|
+
/* same font styles */
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**Semantic badges** (status):
|
|
324
|
+
```
|
|
325
|
+
Success: background var(--semantic-green-dim), color var(--semantic-green)
|
|
326
|
+
Danger: background var(--semantic-red-dim), color var(--semantic-red)
|
|
327
|
+
Warning: background var(--semantic-amber-dim), color var(--semantic-amber)
|
|
328
|
+
Info: background var(--semantic-blue-dim), color var(--semantic-blue)
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Status dot: `5px × 5px`, `border-radius: 50%`, `background: currentColor`, `display: inline-block`, `margin-right: 5px`.
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## 8. Progress Bar
|
|
336
|
+
|
|
337
|
+
Standard (command fill):
|
|
338
|
+
```jsx
|
|
339
|
+
<div style={{
|
|
340
|
+
height: 5, background: 'var(--glass-border)',
|
|
341
|
+
borderRadius: 'var(--radius-full)', overflow: 'hidden',
|
|
342
|
+
}}>
|
|
343
|
+
<div style={{
|
|
344
|
+
height: '100%', borderRadius: 'var(--radius-full)',
|
|
345
|
+
background: 'var(--accent-primary)', width: `${pct}%`,
|
|
346
|
+
transition: 'width 400ms cubic-bezier(0.16, 1, 0.3, 1)',
|
|
347
|
+
}} />
|
|
348
|
+
</div>
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Gradient fill** (hero metric bar — use once per panel):
|
|
352
|
+
```css
|
|
353
|
+
background: var(--accent-gradient);
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**Semantic fills**: `var(--semantic-green)`, `var(--semantic-red)`, `var(--semantic-amber)`.
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## 9. Data Table (glass container)
|
|
361
|
+
|
|
362
|
+
```
|
|
363
|
+
┌───────────────────────────────────────────────────┐ ← glass card
|
|
364
|
+
│ NAME ▲ CATEGORY STOCK STATUS PRICE │ ← mono header
|
|
365
|
+
├───────────────────────────────────────────────────┤
|
|
366
|
+
│ Product Laptops 23 [●OK] $12,000 │
|
|
367
|
+
│ Product Phones 5 [●Low] $8,000 │
|
|
368
|
+
└───────────────────────────────────────────────────┘
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
The table lives inside a Glass Card container:
|
|
372
|
+
|
|
373
|
+
```css
|
|
374
|
+
.table-container {
|
|
375
|
+
background: var(--glass-surface);
|
|
376
|
+
backdrop-filter: var(--glass-blur-md);
|
|
377
|
+
border: 1px solid var(--glass-border);
|
|
378
|
+
border-radius: var(--radius-xl);
|
|
379
|
+
overflow: hidden;
|
|
380
|
+
position: relative;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
table {
|
|
384
|
+
width: 100%;
|
|
385
|
+
border-collapse: separate;
|
|
386
|
+
border-spacing: 0 2px;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
thead th {
|
|
390
|
+
padding: 12px 16px;
|
|
391
|
+
font-family: var(--font-mono);
|
|
392
|
+
font-size: var(--text-xs);
|
|
393
|
+
letter-spacing: var(--tracking-widest);
|
|
394
|
+
text-transform: uppercase;
|
|
395
|
+
color: var(--text-muted);
|
|
396
|
+
text-align: left;
|
|
397
|
+
font-weight: 600;
|
|
398
|
+
background: var(--glass-shell);
|
|
399
|
+
border-bottom: 1px solid var(--glass-border);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
tbody td {
|
|
403
|
+
padding: 12px 16px;
|
|
404
|
+
background: transparent;
|
|
405
|
+
border-bottom: 1px solid var(--glass-border);
|
|
406
|
+
color: var(--text-primary);
|
|
407
|
+
font-size: var(--text-base);
|
|
408
|
+
font-variant-numeric: tabular-nums;
|
|
409
|
+
transition: var(--transition-glass);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
tbody tr:hover td {
|
|
413
|
+
background: var(--glass-elevated);
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Rules: never `border-collapse: collapse` with `tr` backgrounds — use `td` surfaces. Numbers must have `font-variant-numeric: tabular-nums`.
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## 10. Modal / Detail Overlay
|
|
422
|
+
|
|
423
|
+
```
|
|
424
|
+
┌─────── backdrop (glass-overlay blur, z-modal) ───────┐
|
|
425
|
+
│ │
|
|
426
|
+
│ ┌─ Glass Card max-w: 640px ───────────────────┐ │
|
|
427
|
+
│ │ ::before top reflection │ │
|
|
428
|
+
│ │ HEADER: mono label + title + close │ │
|
|
429
|
+
│ │ ───────────────────────── │ │
|
|
430
|
+
│ │ BODY: stat cards, progress, badges, etc. │ │
|
|
431
|
+
│ └─────────────────────────────────────────────┘ │
|
|
432
|
+
│ │
|
|
433
|
+
└────────────────────────────────────────────────────────┘
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
```css
|
|
437
|
+
.modal-backdrop {
|
|
438
|
+
position: fixed; inset: 0;
|
|
439
|
+
background: rgba(4, 6, 9, 0.70);
|
|
440
|
+
backdrop-filter: var(--glass-blur-sm);
|
|
441
|
+
z-index: var(--z-modal);
|
|
442
|
+
display: flex; align-items: center; justify-content: center;
|
|
443
|
+
}
|
|
444
|
+
.modal-content {
|
|
445
|
+
background: var(--glass-overlay);
|
|
446
|
+
backdrop-filter: var(--glass-blur-lg);
|
|
447
|
+
border: 1px solid var(--glass-border-strong);
|
|
448
|
+
border-radius: var(--radius-2xl);
|
|
449
|
+
box-shadow: var(--shadow-glow);
|
|
450
|
+
max-width: 640px; width: calc(100% - 32px);
|
|
451
|
+
position: relative; overflow: hidden;
|
|
452
|
+
padding: var(--space-8);
|
|
453
|
+
z-index: calc(var(--z-modal) + 1);
|
|
454
|
+
}
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
Animation: `scale-materialize` from `motion.md`.
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## 11. Form Elements
|
|
462
|
+
|
|
463
|
+
**Input:**
|
|
464
|
+
```css
|
|
465
|
+
.glass-input {
|
|
466
|
+
height: var(--control-md);
|
|
467
|
+
padding: 0 var(--space-3);
|
|
468
|
+
background: var(--glass-surface);
|
|
469
|
+
backdrop-filter: var(--glass-blur-sm);
|
|
470
|
+
border: 1px solid var(--glass-border);
|
|
471
|
+
border-radius: var(--radius-md);
|
|
472
|
+
color: var(--text-primary);
|
|
473
|
+
font-size: var(--text-sm);
|
|
474
|
+
font-family: var(--font-body);
|
|
475
|
+
outline: none;
|
|
476
|
+
transition: var(--transition-glass);
|
|
477
|
+
}
|
|
478
|
+
.glass-input:focus {
|
|
479
|
+
border-color: var(--glass-border-accent);
|
|
480
|
+
box-shadow: 0 0 0 3px var(--accent-primary-dim);
|
|
481
|
+
}
|
|
482
|
+
.glass-input::placeholder { color: var(--text-muted); }
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
**Label:** mono rail style (xs, muted, uppercase, tracking-widest). `margin-bottom: var(--space-1)`.
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## 12. Button — Primary (gradient)
|
|
490
|
+
|
|
491
|
+
```css
|
|
492
|
+
.btn-primary {
|
|
493
|
+
height: var(--control-lg);
|
|
494
|
+
padding: 0 var(--space-6);
|
|
495
|
+
background: var(--accent-gradient);
|
|
496
|
+
color: var(--accent-contrast);
|
|
497
|
+
border: none;
|
|
498
|
+
border-radius: var(--radius-md);
|
|
499
|
+
font-family: var(--font-body);
|
|
500
|
+
font-size: var(--text-sm);
|
|
501
|
+
font-weight: var(--weight-semibold);
|
|
502
|
+
letter-spacing: var(--tracking-wide);
|
|
503
|
+
cursor: pointer;
|
|
504
|
+
box-shadow: var(--shadow-glow);
|
|
505
|
+
transition: var(--transition-base), filter 120ms ease, transform 120ms ease;
|
|
506
|
+
}
|
|
507
|
+
.btn-primary:hover {
|
|
508
|
+
filter: brightness(1.08);
|
|
509
|
+
box-shadow: var(--shadow-glow-strong);
|
|
510
|
+
transform: translateY(-1px);
|
|
511
|
+
}
|
|
512
|
+
.btn-primary:active { filter: brightness(0.95); transform: translateY(0); }
|
|
513
|
+
.btn-primary:focus-visible {
|
|
514
|
+
outline: var(--focus-ring-width) solid var(--accent-primary);
|
|
515
|
+
outline-offset: var(--focus-ring-offset);
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
---
|
|
520
|
+
|
|
521
|
+
## 13. Button — Glass (secondary)
|
|
522
|
+
|
|
523
|
+
```css
|
|
524
|
+
.btn-glass {
|
|
525
|
+
height: var(--control-lg);
|
|
526
|
+
padding: 0 var(--space-5);
|
|
527
|
+
background: var(--glass-surface);
|
|
528
|
+
backdrop-filter: var(--glass-blur-sm);
|
|
529
|
+
border: 1px solid var(--glass-border);
|
|
530
|
+
border-radius: var(--radius-md);
|
|
531
|
+
color: var(--text-primary);
|
|
532
|
+
font-family: var(--font-body);
|
|
533
|
+
font-size: var(--text-sm);
|
|
534
|
+
font-weight: var(--weight-medium);
|
|
535
|
+
cursor: pointer;
|
|
536
|
+
transition: var(--transition-glass);
|
|
537
|
+
}
|
|
538
|
+
.btn-glass:hover {
|
|
539
|
+
background: var(--glass-elevated);
|
|
540
|
+
border-color: var(--glass-border-strong);
|
|
541
|
+
}
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
---
|
|
545
|
+
|
|
546
|
+
## 14. Button — Ghost
|
|
547
|
+
|
|
548
|
+
```css
|
|
549
|
+
.btn-ghost {
|
|
550
|
+
height: var(--control-md);
|
|
551
|
+
padding: 0 var(--space-4);
|
|
552
|
+
background: transparent;
|
|
553
|
+
border: none;
|
|
554
|
+
border-radius: var(--radius-md);
|
|
555
|
+
color: var(--text-secondary);
|
|
556
|
+
font-family: var(--font-body);
|
|
557
|
+
font-size: var(--text-sm);
|
|
558
|
+
cursor: pointer;
|
|
559
|
+
transition: background var(--transition-fast), color var(--transition-fast);
|
|
560
|
+
}
|
|
561
|
+
.btn-ghost:hover {
|
|
562
|
+
background: var(--glass-surface);
|
|
563
|
+
color: var(--text-primary);
|
|
564
|
+
}
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
## 15. Toggle Switch
|
|
570
|
+
|
|
571
|
+
```css
|
|
572
|
+
.toggle {
|
|
573
|
+
width: 44px; height: 24px;
|
|
574
|
+
background: var(--glass-border);
|
|
575
|
+
border-radius: var(--radius-full);
|
|
576
|
+
position: relative;
|
|
577
|
+
cursor: pointer;
|
|
578
|
+
transition: background var(--transition-base);
|
|
579
|
+
}
|
|
580
|
+
.toggle.checked { background: var(--accent-gradient); }
|
|
581
|
+
.toggle-thumb {
|
|
582
|
+
width: 18px; height: 18px;
|
|
583
|
+
background: white;
|
|
584
|
+
border-radius: var(--radius-full);
|
|
585
|
+
box-shadow: var(--shadow-sm);
|
|
586
|
+
position: absolute; top: 3px; left: 3px;
|
|
587
|
+
transition: transform var(--transition-base);
|
|
588
|
+
}
|
|
589
|
+
.toggle.checked .toggle-thumb { transform: translateX(20px); }
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
## 16. Theme Toggle
|
|
595
|
+
|
|
596
|
+
```jsx
|
|
597
|
+
<button style={{
|
|
598
|
+
width: 36, height: 36,
|
|
599
|
+
borderRadius: 'var(--radius-md)',
|
|
600
|
+
border: '1px solid var(--glass-border)',
|
|
601
|
+
background: 'var(--glass-surface)',
|
|
602
|
+
backdropFilter: 'var(--glass-blur-sm)',
|
|
603
|
+
color: 'var(--text-secondary)',
|
|
604
|
+
cursor: 'pointer',
|
|
605
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
606
|
+
fontSize: '1rem',
|
|
607
|
+
transition: 'var(--transition-glass)',
|
|
608
|
+
}}>
|
|
609
|
+
{theme === 'dark' ? '☀' : '☾'}
|
|
610
|
+
</button>
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
Hover: `background: var(--glass-elevated)`, `border-color: var(--glass-border-accent)`, `color: var(--accent-primary)`.
|
|
614
|
+
|
|
615
|
+
---
|
|
616
|
+
|
|
617
|
+
## 17. Profile Header Card
|
|
618
|
+
|
|
619
|
+
```
|
|
620
|
+
┌───────────────────────────────────────────────────────────┐ ← glass-card--lg
|
|
621
|
+
│ ::before reflection │
|
|
622
|
+
│ [Avatar 96px] ENTITY NAME [Badge][Badge] │
|
|
623
|
+
│ Role (italic, accent) │
|
|
624
|
+
│ ✦ TAGLINE (mono, xs, muted) │
|
|
625
|
+
│ │
|
|
626
|
+
│ [StatCard] [StatCard] [StatCard] │
|
|
627
|
+
└───────────────────────────────────────────────────────────┘
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
- Avatar: `96px`, `border-radius: var(--radius-lg)`, `border: 2px solid var(--glass-border-strong)`
|
|
631
|
+
- Name: `--text-3xl`, `--weight-bold`, `--tracking-tight`, gradient text on the name if it is the identity hero
|
|
632
|
+
- Role: `color: var(--text-accent)`, `font-style: italic`, `--text-lg`
|
|
633
|
+
- Tagline: mono rail style, `--text-xs`, `--text-muted`, uppercase, `--tracking-widest`
|
|
634
|
+
- Stats: Stat Card components, `min-width: 130px`
|
|
635
|
+
|
|
636
|
+
---
|
|
637
|
+
|
|
638
|
+
## 18. DNA / Trait Panel
|
|
639
|
+
|
|
640
|
+
The identity card for any entity — labeled progress bars with color semantic fills + tag cluster.
|
|
641
|
+
|
|
642
|
+
```
|
|
643
|
+
┌─────────────────────────────────────────┐ ← glass card
|
|
644
|
+
│ ✦ TRAIT ANALYSIS │ ← mono section label
|
|
645
|
+
│ │
|
|
646
|
+
│ DIMENSION ████████████████░░░░ 80% │ ← progress row
|
|
647
|
+
│ DIMENSION ██████████░░░░░░░░░ 52% │
|
|
648
|
+
│ DIMENSION █████████████░░░░░░ 68% │
|
|
649
|
+
│ │
|
|
650
|
+
│ [Badge] [Badge] [Badge] [Badge] │ ← glass chips
|
|
651
|
+
└─────────────────────────────────────────┘
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
Label: `min-width: 90px`, mono rail style. Bar: `flex: 1`, Progress Bar component. Value: mono, `--text-sm`, `--text-secondary`, `min-width: 40px; text-align: right`. Tags: `flex-wrap`, `gap: var(--space-2)`.
|
|
655
|
+
|
|
656
|
+
---
|
|
657
|
+
|
|
658
|
+
## 19. Alert / Signal Chip
|
|
659
|
+
|
|
660
|
+
Operational signals for dashboards. Always inline with status dot.
|
|
661
|
+
|
|
662
|
+
```css
|
|
663
|
+
.alert-chip {
|
|
664
|
+
display: inline-flex;
|
|
665
|
+
align-items: center;
|
|
666
|
+
gap: var(--space-2);
|
|
667
|
+
padding: 4px 10px;
|
|
668
|
+
background: var(--glass-surface);
|
|
669
|
+
backdrop-filter: var(--glass-blur-sm);
|
|
670
|
+
border: 1px solid var(--glass-border);
|
|
671
|
+
border-radius: var(--radius-full);
|
|
672
|
+
font-family: var(--font-mono);
|
|
673
|
+
font-size: var(--text-xs);
|
|
674
|
+
font-weight: 600;
|
|
675
|
+
letter-spacing: var(--tracking-wider);
|
|
676
|
+
text-transform: uppercase;
|
|
677
|
+
}
|
|
678
|
+
/* Critical: border-color var(--semantic-red), color var(--semantic-red) */
|
|
679
|
+
/* Warning: border-color var(--semantic-amber), color var(--semantic-amber) */
|
|
680
|
+
/* Active: border-color var(--glass-border-accent), color var(--accent-primary) */
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
---
|
|
684
|
+
|
|
685
|
+
## 20. Status Tape
|
|
686
|
+
|
|
687
|
+
A full-width operational status strip placed above the main dashboard content. Signals at a glance.
|
|
688
|
+
|
|
689
|
+
```
|
|
690
|
+
┌── glass-shell, full width ──────────────────────────────────────┐
|
|
691
|
+
│ SYSTEM STATUS: ● OPERATIONAL │ [●ALERT 3] [●WARN 12] [●OK 47]│
|
|
692
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
```css
|
|
696
|
+
.status-tape {
|
|
697
|
+
width: 100%;
|
|
698
|
+
display: flex;
|
|
699
|
+
align-items: center;
|
|
700
|
+
gap: var(--space-4);
|
|
701
|
+
padding: var(--space-2) var(--space-6);
|
|
702
|
+
background: var(--glass-shell);
|
|
703
|
+
backdrop-filter: var(--glass-blur-md);
|
|
704
|
+
border-bottom: 1px solid var(--glass-border);
|
|
705
|
+
font-family: var(--font-mono);
|
|
706
|
+
font-size: var(--text-xs);
|
|
707
|
+
font-weight: 600;
|
|
708
|
+
letter-spacing: var(--tracking-wider);
|
|
709
|
+
text-transform: uppercase;
|
|
710
|
+
color: var(--text-muted);
|
|
711
|
+
}
|
|
712
|
+
.status-tape .divider {
|
|
713
|
+
width: 1px; height: 16px;
|
|
714
|
+
background: var(--glass-border);
|
|
715
|
+
}
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
---
|
|
719
|
+
|
|
720
|
+
## 21. Toast / Notification
|
|
721
|
+
|
|
722
|
+
Auto-dismissing glass notification at bottom-right.
|
|
723
|
+
|
|
724
|
+
```css
|
|
725
|
+
.toast {
|
|
726
|
+
background: var(--glass-overlay);
|
|
727
|
+
backdrop-filter: var(--glass-blur-lg);
|
|
728
|
+
border: 1px solid var(--glass-border-strong);
|
|
729
|
+
border-radius: var(--radius-xl);
|
|
730
|
+
box-shadow: var(--shadow-glow);
|
|
731
|
+
padding: var(--space-4) var(--space-5);
|
|
732
|
+
display: flex; align-items: center; gap: var(--space-3);
|
|
733
|
+
border-left: 3px solid; /* color from severity */
|
|
734
|
+
min-width: 280px; max-width: 400px;
|
|
735
|
+
position: fixed;
|
|
736
|
+
bottom: var(--space-6); right: var(--space-6);
|
|
737
|
+
z-index: var(--z-toast);
|
|
738
|
+
}
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
---
|
|
742
|
+
|
|
743
|
+
## 22. Empty State
|
|
744
|
+
|
|
745
|
+
```css
|
|
746
|
+
.empty-state {
|
|
747
|
+
display: flex; flex-direction: column; align-items: center;
|
|
748
|
+
gap: var(--space-4); padding: var(--space-16) var(--space-6);
|
|
749
|
+
text-align: center;
|
|
750
|
+
}
|
|
751
|
+
.empty-icon-area {
|
|
752
|
+
width: 80px; height: 80px;
|
|
753
|
+
background: var(--glass-surface);
|
|
754
|
+
backdrop-filter: var(--glass-blur-sm);
|
|
755
|
+
border: 1px solid var(--glass-border);
|
|
756
|
+
border-radius: var(--radius-2xl);
|
|
757
|
+
display: flex; align-items: center; justify-content: center;
|
|
758
|
+
font-size: 2rem;
|
|
759
|
+
position: relative; overflow: hidden;
|
|
760
|
+
}
|
|
761
|
+
.empty-title {
|
|
762
|
+
font-size: var(--text-base);
|
|
763
|
+
font-weight: var(--weight-semibold);
|
|
764
|
+
color: var(--text-heading);
|
|
765
|
+
}
|
|
766
|
+
.empty-description {
|
|
767
|
+
font-size: var(--text-sm);
|
|
768
|
+
color: var(--text-secondary);
|
|
769
|
+
max-width: 280px;
|
|
770
|
+
line-height: var(--leading-relaxed);
|
|
771
|
+
}
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
---
|
|
775
|
+
|
|
776
|
+
## 23. Skeleton Loader
|
|
777
|
+
|
|
778
|
+
Glass surface with aurora shimmer — matches the dark glass environment.
|
|
779
|
+
|
|
780
|
+
```css
|
|
781
|
+
.skeleton {
|
|
782
|
+
position: relative;
|
|
783
|
+
overflow: hidden;
|
|
784
|
+
background: var(--glass-surface);
|
|
785
|
+
border-radius: var(--radius-md);
|
|
786
|
+
}
|
|
787
|
+
.skeleton::after {
|
|
788
|
+
content: '';
|
|
789
|
+
position: absolute; inset: 0;
|
|
790
|
+
background: linear-gradient(
|
|
791
|
+
90deg,
|
|
792
|
+
transparent 0%,
|
|
793
|
+
rgba(0, 200, 232, 0.06) 50%,
|
|
794
|
+
transparent 100%
|
|
795
|
+
);
|
|
796
|
+
transform: translateX(-100%);
|
|
797
|
+
animation: aurora-shimmer 1.5s infinite;
|
|
798
|
+
}
|
|
799
|
+
@keyframes aurora-shimmer {
|
|
800
|
+
to { transform: translateX(100%); }
|
|
801
|
+
}
|
|
802
|
+
@media (prefers-reduced-motion: reduce) {
|
|
803
|
+
.skeleton::after { animation: none; }
|
|
804
|
+
}
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
---
|
|
808
|
+
|
|
809
|
+
## 24. Tooltip
|
|
810
|
+
|
|
811
|
+
Small glass bubble on hover.
|
|
812
|
+
|
|
813
|
+
```css
|
|
814
|
+
.tooltip {
|
|
815
|
+
background: var(--glass-overlay);
|
|
816
|
+
backdrop-filter: var(--glass-blur-md);
|
|
817
|
+
border: 1px solid var(--glass-border-strong);
|
|
818
|
+
border-radius: var(--radius-md);
|
|
819
|
+
padding: var(--space-2) var(--space-3);
|
|
820
|
+
font-size: var(--text-xs);
|
|
821
|
+
color: var(--text-primary);
|
|
822
|
+
box-shadow: var(--shadow-md);
|
|
823
|
+
pointer-events: none;
|
|
824
|
+
z-index: var(--z-toast);
|
|
825
|
+
white-space: nowrap;
|
|
826
|
+
}
|
|
827
|
+
```
|