code-abyss 1.6.16 → 1.7.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/README.md +8 -6
- package/bin/install.js +59 -163
- package/bin/lib/ccline.js +82 -0
- package/bin/lib/utils.js +61 -0
- package/package.json +5 -2
- package/skills/SKILL.md +24 -16
- package/skills/domains/ai/SKILL.md +2 -2
- package/skills/domains/ai/prompt-and-eval.md +279 -0
- package/skills/domains/architecture/SKILL.md +2 -3
- package/skills/domains/architecture/security-arch.md +87 -0
- package/skills/domains/data-engineering/SKILL.md +188 -26
- package/skills/domains/development/SKILL.md +1 -4
- package/skills/domains/devops/SKILL.md +3 -5
- package/skills/domains/devops/performance.md +63 -0
- package/skills/domains/devops/testing.md +97 -0
- package/skills/domains/frontend-design/SKILL.md +12 -3
- package/skills/domains/frontend-design/claymorphism/SKILL.md +117 -0
- package/skills/domains/frontend-design/claymorphism/references/tokens.css +52 -0
- package/skills/domains/frontend-design/engineering.md +287 -0
- package/skills/domains/frontend-design/glassmorphism/SKILL.md +138 -0
- package/skills/domains/frontend-design/glassmorphism/references/tokens.css +32 -0
- package/skills/domains/frontend-design/liquid-glass/SKILL.md +135 -0
- package/skills/domains/frontend-design/liquid-glass/references/tokens.css +81 -0
- package/skills/domains/frontend-design/neubrutalism/SKILL.md +141 -0
- package/skills/domains/frontend-design/neubrutalism/references/tokens.css +44 -0
- package/skills/domains/infrastructure/SKILL.md +174 -34
- package/skills/domains/mobile/SKILL.md +211 -21
- package/skills/domains/orchestration/SKILL.md +1 -0
- package/skills/domains/security/SKILL.md +4 -6
- package/skills/domains/security/blue-team.md +57 -0
- package/skills/domains/security/red-team.md +54 -0
- package/skills/domains/security/threat-intel.md +50 -0
- package/skills/orchestration/multi-agent/SKILL.md +195 -46
- package/skills/run_skill.js +139 -0
- package/skills/tools/gen-docs/SKILL.md +6 -4
- package/skills/tools/gen-docs/scripts/doc_generator.js +363 -0
- package/skills/tools/lib/shared.js +98 -0
- package/skills/tools/verify-change/SKILL.md +8 -6
- package/skills/tools/verify-change/scripts/change_analyzer.js +289 -0
- package/skills/tools/verify-module/SKILL.md +6 -4
- package/skills/tools/verify-module/scripts/module_scanner.js +171 -0
- package/skills/tools/verify-quality/SKILL.md +5 -3
- package/skills/tools/verify-quality/scripts/quality_checker.js +337 -0
- package/skills/tools/verify-security/SKILL.md +7 -5
- package/skills/tools/verify-security/scripts/security_scanner.js +283 -0
- package/skills/__pycache__/run_skill.cpython-312.pyc +0 -0
- package/skills/domains/COVERAGE_PLAN.md +0 -232
- package/skills/domains/ai/model-evaluation.md +0 -790
- package/skills/domains/ai/prompt-engineering.md +0 -703
- package/skills/domains/architecture/compliance.md +0 -299
- package/skills/domains/architecture/data-security.md +0 -184
- package/skills/domains/data-engineering/data-pipeline.md +0 -762
- package/skills/domains/data-engineering/data-quality.md +0 -894
- package/skills/domains/data-engineering/stream-processing.md +0 -791
- package/skills/domains/development/dart.md +0 -963
- package/skills/domains/development/kotlin.md +0 -834
- package/skills/domains/development/php.md +0 -659
- package/skills/domains/development/swift.md +0 -755
- package/skills/domains/devops/e2e-testing.md +0 -914
- package/skills/domains/devops/performance-testing.md +0 -734
- package/skills/domains/devops/testing-strategy.md +0 -667
- package/skills/domains/frontend-design/build-tools.md +0 -743
- package/skills/domains/frontend-design/performance.md +0 -734
- package/skills/domains/frontend-design/testing.md +0 -699
- package/skills/domains/infrastructure/gitops.md +0 -735
- package/skills/domains/infrastructure/iac.md +0 -855
- package/skills/domains/infrastructure/kubernetes.md +0 -1018
- package/skills/domains/mobile/android-dev.md +0 -979
- package/skills/domains/mobile/cross-platform.md +0 -795
- package/skills/domains/mobile/ios-dev.md +0 -931
- package/skills/domains/security/secrets-management.md +0 -834
- package/skills/domains/security/supply-chain.md +0 -931
- package/skills/domains/security/threat-modeling.md +0 -828
- package/skills/run_skill.py +0 -153
- package/skills/tests/README.md +0 -225
- package/skills/tests/SUMMARY.md +0 -362
- package/skills/tests/__init__.py +0 -3
- package/skills/tests/__pycache__/test_change_analyzer.cpython-312.pyc +0 -0
- package/skills/tests/__pycache__/test_doc_generator.cpython-312.pyc +0 -0
- package/skills/tests/__pycache__/test_module_scanner.cpython-312.pyc +0 -0
- package/skills/tests/__pycache__/test_quality_checker.cpython-312.pyc +0 -0
- package/skills/tests/__pycache__/test_security_scanner.cpython-312.pyc +0 -0
- package/skills/tests/test_change_analyzer.py +0 -558
- package/skills/tests/test_doc_generator.py +0 -538
- package/skills/tests/test_module_scanner.py +0 -376
- package/skills/tests/test_quality_checker.py +0 -516
- package/skills/tests/test_security_scanner.py +0 -426
- package/skills/tools/gen-docs/scripts/__pycache__/doc_generator.cpython-312.pyc +0 -0
- package/skills/tools/gen-docs/scripts/doc_generator.py +0 -520
- package/skills/tools/verify-change/scripts/__pycache__/change_analyzer.cpython-312.pyc +0 -0
- package/skills/tools/verify-change/scripts/change_analyzer.py +0 -529
- package/skills/tools/verify-module/scripts/__pycache__/module_scanner.cpython-312.pyc +0 -0
- package/skills/tools/verify-module/scripts/module_scanner.py +0 -321
- package/skills/tools/verify-quality/scripts/__pycache__/quality_checker.cpython-312.pyc +0 -0
- package/skills/tools/verify-quality/scripts/quality_checker.py +0 -481
- package/skills/tools/verify-security/scripts/__pycache__/security_scanner.cpython-312.pyc +0 -0
- package/skills/tools/verify-security/scripts/security_scanner.py +0 -374
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: glassmorphism
|
|
3
|
+
description: Glassmorphism design system skill. Use when building frosted-glass UI components with blur, transparency, and layered depth effects.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Glassmorphism Design Spec
|
|
8
|
+
|
|
9
|
+
## 4 Core Elements
|
|
10
|
+
|
|
11
|
+
1. **Transparency** — Semi-transparent backgrounds using `rgba()` or `hsla()` with alpha `0.05–0.4`
|
|
12
|
+
2. **Blur** — `backdrop-filter: blur()` ranging 8–40px for frosted-glass effect
|
|
13
|
+
3. **Border** — Subtle semi-transparent borders (`1px solid rgba(255,255,255,0.18)`) to define edges
|
|
14
|
+
4. **Shadow** — Soft layered `box-shadow` for depth separation from background
|
|
15
|
+
|
|
16
|
+
## CSS Tokens
|
|
17
|
+
|
|
18
|
+
Reference: [references/tokens.css](references/tokens.css)
|
|
19
|
+
|
|
20
|
+
Use CSS custom properties from `tokens.css` for consistent theming:
|
|
21
|
+
|
|
22
|
+
```css
|
|
23
|
+
@import 'references/tokens.css';
|
|
24
|
+
|
|
25
|
+
.glass-card {
|
|
26
|
+
background: var(--glass-bg);
|
|
27
|
+
backdrop-filter: var(--glass-blur);
|
|
28
|
+
-webkit-backdrop-filter: var(--glass-blur);
|
|
29
|
+
border: var(--glass-border);
|
|
30
|
+
border-radius: var(--glass-radius);
|
|
31
|
+
box-shadow: var(--glass-shadow);
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Component Examples
|
|
36
|
+
|
|
37
|
+
### Card
|
|
38
|
+
```css
|
|
39
|
+
.glass-card {
|
|
40
|
+
background: var(--glass-bg);
|
|
41
|
+
backdrop-filter: var(--glass-blur);
|
|
42
|
+
-webkit-backdrop-filter: var(--glass-blur);
|
|
43
|
+
border: var(--glass-border);
|
|
44
|
+
border-radius: var(--glass-radius);
|
|
45
|
+
box-shadow: var(--glass-shadow);
|
|
46
|
+
padding: 1.5rem;
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Navbar
|
|
51
|
+
```css
|
|
52
|
+
.glass-nav {
|
|
53
|
+
background: var(--glass-bg-heavy);
|
|
54
|
+
backdrop-filter: var(--glass-blur-strong);
|
|
55
|
+
-webkit-backdrop-filter: var(--glass-blur-strong);
|
|
56
|
+
border-bottom: var(--glass-border);
|
|
57
|
+
box-shadow: var(--glass-shadow);
|
|
58
|
+
position: sticky;
|
|
59
|
+
top: 0;
|
|
60
|
+
z-index: 100;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Modal Overlay
|
|
65
|
+
```css
|
|
66
|
+
.glass-modal-backdrop {
|
|
67
|
+
background: rgba(0, 0, 0, 0.4);
|
|
68
|
+
backdrop-filter: blur(4px);
|
|
69
|
+
}
|
|
70
|
+
.glass-modal {
|
|
71
|
+
background: var(--glass-bg-heavy);
|
|
72
|
+
backdrop-filter: var(--glass-blur-strong);
|
|
73
|
+
-webkit-backdrop-filter: var(--glass-blur-strong);
|
|
74
|
+
border: var(--glass-border);
|
|
75
|
+
border-radius: var(--glass-radius-lg);
|
|
76
|
+
box-shadow: var(--glass-shadow-elevated);
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Button
|
|
81
|
+
```css
|
|
82
|
+
.glass-btn {
|
|
83
|
+
background: var(--glass-bg-light);
|
|
84
|
+
backdrop-filter: var(--glass-blur-light);
|
|
85
|
+
-webkit-backdrop-filter: var(--glass-blur-light);
|
|
86
|
+
border: var(--glass-border);
|
|
87
|
+
border-radius: var(--glass-radius);
|
|
88
|
+
transition: background 0.2s;
|
|
89
|
+
}
|
|
90
|
+
.glass-btn:hover {
|
|
91
|
+
background: var(--glass-bg);
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Browser Compatibility
|
|
96
|
+
|
|
97
|
+
| Feature | Chrome | Firefox | Safari | Edge |
|
|
98
|
+
|---------|--------|---------|--------|------|
|
|
99
|
+
| `backdrop-filter` | 76+ | 103+ | 9+ (`-webkit-`) | 79+ |
|
|
100
|
+
| `rgba()` backgrounds | All | All | All | All |
|
|
101
|
+
|
|
102
|
+
- Always include `-webkit-backdrop-filter` for Safari support
|
|
103
|
+
- Firefox <103: use `@supports` fallback with solid semi-transparent bg
|
|
104
|
+
- Fallback pattern:
|
|
105
|
+
|
|
106
|
+
```css
|
|
107
|
+
.glass-card {
|
|
108
|
+
background: rgba(255, 255, 255, 0.85); /* fallback */
|
|
109
|
+
}
|
|
110
|
+
@supports (backdrop-filter: blur(1px)) {
|
|
111
|
+
.glass-card {
|
|
112
|
+
background: var(--glass-bg);
|
|
113
|
+
backdrop-filter: var(--glass-blur);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Accessibility Notes
|
|
119
|
+
|
|
120
|
+
- Ensure **contrast ratio ≥ 4.5:1** for text over glass surfaces — test against all possible backgrounds
|
|
121
|
+
- Provide `prefers-reduced-transparency` media query to disable blur/transparency for users who need it
|
|
122
|
+
- Avoid placing critical text on highly transparent surfaces without a fallback
|
|
123
|
+
- Use `prefers-contrast: more` to increase border opacity and reduce transparency
|
|
124
|
+
|
|
125
|
+
```css
|
|
126
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
127
|
+
.glass-card {
|
|
128
|
+
background: rgba(255, 255, 255, 0.92);
|
|
129
|
+
backdrop-filter: none;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
@media (prefers-contrast: more) {
|
|
133
|
+
.glass-card {
|
|
134
|
+
background: rgba(255, 255, 255, 0.85);
|
|
135
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
/* Backgrounds */
|
|
3
|
+
--glass-bg-light: rgba(255, 255, 255, 0.08);
|
|
4
|
+
--glass-bg: rgba(255, 255, 255, 0.15);
|
|
5
|
+
--glass-bg-heavy: rgba(255, 255, 255, 0.25);
|
|
6
|
+
|
|
7
|
+
/* Blur */
|
|
8
|
+
--glass-blur-light: blur(8px);
|
|
9
|
+
--glass-blur: blur(16px);
|
|
10
|
+
--glass-blur-strong: blur(32px);
|
|
11
|
+
|
|
12
|
+
/* Border */
|
|
13
|
+
--glass-border: 1px solid rgba(255, 255, 255, 0.18);
|
|
14
|
+
|
|
15
|
+
/* Radius */
|
|
16
|
+
--glass-radius: 12px;
|
|
17
|
+
--glass-radius-lg: 20px;
|
|
18
|
+
|
|
19
|
+
/* Shadow */
|
|
20
|
+
--glass-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
|
|
21
|
+
--glass-shadow-elevated: 0 8px 40px rgba(0, 0, 0, 0.15);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Dark theme overrides */
|
|
25
|
+
[data-theme="dark"] {
|
|
26
|
+
--glass-bg-light: rgba(255, 255, 255, 0.04);
|
|
27
|
+
--glass-bg: rgba(255, 255, 255, 0.08);
|
|
28
|
+
--glass-bg-heavy: rgba(255, 255, 255, 0.14);
|
|
29
|
+
--glass-border: 1px solid rgba(255, 255, 255, 0.12);
|
|
30
|
+
--glass-shadow: 0 4px 30px rgba(0, 0, 0, 0.3);
|
|
31
|
+
--glass-shadow-elevated: 0 8px 40px rgba(0, 0, 0, 0.4);
|
|
32
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: liquid-glass
|
|
3
|
+
description: Apple Liquid Glass design system. Use when building UI with translucent, depth-aware glass morphism following Apple's design language. Provides CSS tokens, component patterns, dark/light mode, and animation specs.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Liquid Glass Design System
|
|
8
|
+
|
|
9
|
+
Apple-inspired translucent glass UI with depth, refraction, and ambient light response.
|
|
10
|
+
|
|
11
|
+
## Core Principles
|
|
12
|
+
|
|
13
|
+
1. **Translucency** — Surfaces reveal layered content beneath via backdrop blur
|
|
14
|
+
2. **Depth** — Elements float on distinct z-layers with realistic shadows
|
|
15
|
+
3. **Ambient Response** — Glass tints shift based on underlying content color
|
|
16
|
+
4. **Minimal Chrome** — Borders are subtle; shape and blur define boundaries
|
|
17
|
+
5. **Motion** — Transitions feel physical: spring-based, with inertia
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
Import the token file in your CSS:
|
|
22
|
+
|
|
23
|
+
```css
|
|
24
|
+
@import 'references/tokens.css';
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## CSS Tokens Reference
|
|
28
|
+
|
|
29
|
+
All tokens are defined in `references/tokens.css`. Key categories:
|
|
30
|
+
|
|
31
|
+
| Category | Prefix | Example |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| Glass backgrounds | `--lg-bg-*` | `--lg-bg-primary` |
|
|
34
|
+
| Blur | `--lg-blur-*` | `--lg-blur-md` |
|
|
35
|
+
| Borders | `--lg-border-*` | `--lg-border-color` |
|
|
36
|
+
| Shadows | `--lg-shadow-*` | `--lg-shadow-elevated` |
|
|
37
|
+
| Radius | `--lg-radius-*` | `--lg-radius-lg` |
|
|
38
|
+
| Animation | `--lg-duration-*` | `--lg-duration-normal` |
|
|
39
|
+
|
|
40
|
+
## Component Patterns
|
|
41
|
+
|
|
42
|
+
### Glass Card
|
|
43
|
+
|
|
44
|
+
```css
|
|
45
|
+
.glass-card {
|
|
46
|
+
background: var(--lg-bg-primary);
|
|
47
|
+
backdrop-filter: blur(var(--lg-blur-md));
|
|
48
|
+
-webkit-backdrop-filter: blur(var(--lg-blur-md));
|
|
49
|
+
border: 1px solid var(--lg-border-color);
|
|
50
|
+
border-radius: var(--lg-radius-lg);
|
|
51
|
+
box-shadow: var(--lg-shadow-elevated);
|
|
52
|
+
transition: transform var(--lg-duration-normal) var(--lg-easing-spring);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.glass-card:hover {
|
|
56
|
+
transform: translateY(-2px);
|
|
57
|
+
box-shadow: var(--lg-shadow-high);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Glass Toolbar
|
|
62
|
+
|
|
63
|
+
```css
|
|
64
|
+
.glass-toolbar {
|
|
65
|
+
background: var(--lg-bg-toolbar);
|
|
66
|
+
backdrop-filter: blur(var(--lg-blur-lg)) saturate(var(--lg-saturate));
|
|
67
|
+
-webkit-backdrop-filter: blur(var(--lg-blur-lg)) saturate(var(--lg-saturate));
|
|
68
|
+
border-bottom: 1px solid var(--lg-border-subtle);
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Glass Button
|
|
73
|
+
|
|
74
|
+
```css
|
|
75
|
+
.glass-btn {
|
|
76
|
+
background: var(--lg-bg-interactive);
|
|
77
|
+
backdrop-filter: blur(var(--lg-blur-sm));
|
|
78
|
+
border: 1px solid var(--lg-border-color);
|
|
79
|
+
border-radius: var(--lg-radius-md);
|
|
80
|
+
transition: all var(--lg-duration-fast) var(--lg-easing-spring);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.glass-btn:active {
|
|
84
|
+
transform: scale(0.97);
|
|
85
|
+
background: var(--lg-bg-pressed);
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Glass Modal Overlay
|
|
90
|
+
|
|
91
|
+
```css
|
|
92
|
+
.glass-overlay {
|
|
93
|
+
background: var(--lg-bg-scrim);
|
|
94
|
+
backdrop-filter: blur(var(--lg-blur-xl));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.glass-modal {
|
|
98
|
+
background: var(--lg-bg-elevated);
|
|
99
|
+
border: 1px solid var(--lg-border-color);
|
|
100
|
+
border-radius: var(--lg-radius-xl);
|
|
101
|
+
box-shadow: var(--lg-shadow-high);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Dark / Light Mode
|
|
106
|
+
|
|
107
|
+
Tokens auto-switch via `prefers-color-scheme`. Light mode uses white-tinted glass; dark mode uses dark-tinted glass with higher blur to maintain readability.
|
|
108
|
+
|
|
109
|
+
```css
|
|
110
|
+
/* Force a mode on a subtree */
|
|
111
|
+
.light-glass { color-scheme: light; }
|
|
112
|
+
.dark-glass { color-scheme: dark; }
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Animations
|
|
116
|
+
|
|
117
|
+
Use spring-based easing for physical feel:
|
|
118
|
+
|
|
119
|
+
```css
|
|
120
|
+
/* Entry */
|
|
121
|
+
@keyframes glass-enter {
|
|
122
|
+
from { opacity: 0; transform: scale(0.95) translateY(8px); }
|
|
123
|
+
to { opacity: 1; transform: scale(1) translateY(0); }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.glass-animate-in {
|
|
127
|
+
animation: glass-enter var(--lg-duration-normal) var(--lg-easing-spring) both;
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Accessibility
|
|
132
|
+
|
|
133
|
+
- Ensure `contrast-ratio ≥ 4.5:1` for text over glass surfaces
|
|
134
|
+
- Respect `prefers-reduced-motion` — disable blur animations, use opacity-only transitions
|
|
135
|
+
- Provide `prefers-contrast: high` overrides that replace translucent backgrounds with solid ones
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* Liquid Glass Design Tokens */
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
color-scheme: light dark;
|
|
5
|
+
|
|
6
|
+
/* Blur */
|
|
7
|
+
--lg-blur-sm: 8px;
|
|
8
|
+
--lg-blur-md: 16px;
|
|
9
|
+
--lg-blur-lg: 32px;
|
|
10
|
+
--lg-blur-xl: 48px;
|
|
11
|
+
|
|
12
|
+
/* Saturation */
|
|
13
|
+
--lg-saturate: 1.8;
|
|
14
|
+
|
|
15
|
+
/* Radius */
|
|
16
|
+
--lg-radius-sm: 8px;
|
|
17
|
+
--lg-radius-md: 12px;
|
|
18
|
+
--lg-radius-lg: 16px;
|
|
19
|
+
--lg-radius-xl: 24px;
|
|
20
|
+
|
|
21
|
+
/* Shadows */
|
|
22
|
+
--lg-shadow-subtle: 0 1px 3px rgba(0,0,0,0.08);
|
|
23
|
+
--lg-shadow-elevated: 0 4px 16px rgba(0,0,0,0.1);
|
|
24
|
+
--lg-shadow-high: 0 8px 32px rgba(0,0,0,0.15);
|
|
25
|
+
|
|
26
|
+
/* Animation */
|
|
27
|
+
--lg-duration-fast: 150ms;
|
|
28
|
+
--lg-duration-normal: 300ms;
|
|
29
|
+
--lg-duration-slow: 500ms;
|
|
30
|
+
--lg-easing-spring: cubic-bezier(0.22, 1, 0.36, 1);
|
|
31
|
+
|
|
32
|
+
/* Light mode (default) */
|
|
33
|
+
--lg-bg-primary: rgba(255,255,255,0.72);
|
|
34
|
+
--lg-bg-elevated: rgba(255,255,255,0.82);
|
|
35
|
+
--lg-bg-toolbar: rgba(255,255,255,0.65);
|
|
36
|
+
--lg-bg-interactive: rgba(255,255,255,0.5);
|
|
37
|
+
--lg-bg-pressed: rgba(255,255,255,0.35);
|
|
38
|
+
--lg-bg-scrim: rgba(0,0,0,0.25);
|
|
39
|
+
--lg-border-color: rgba(255,255,255,0.45);
|
|
40
|
+
--lg-border-subtle: rgba(0,0,0,0.06);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@media (prefers-color-scheme: dark) {
|
|
44
|
+
:root {
|
|
45
|
+
--lg-bg-primary: rgba(30,30,30,0.65);
|
|
46
|
+
--lg-bg-elevated: rgba(40,40,40,0.75);
|
|
47
|
+
--lg-bg-toolbar: rgba(25,25,25,0.6);
|
|
48
|
+
--lg-bg-interactive: rgba(255,255,255,0.1);
|
|
49
|
+
--lg-bg-pressed: rgba(255,255,255,0.06);
|
|
50
|
+
--lg-bg-scrim: rgba(0,0,0,0.5);
|
|
51
|
+
--lg-border-color: rgba(255,255,255,0.12);
|
|
52
|
+
--lg-border-subtle: rgba(255,255,255,0.06);
|
|
53
|
+
--lg-shadow-subtle: 0 1px 3px rgba(0,0,0,0.3);
|
|
54
|
+
--lg-shadow-elevated: 0 4px 16px rgba(0,0,0,0.4);
|
|
55
|
+
--lg-shadow-high: 0 8px 32px rgba(0,0,0,0.5);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@media (prefers-contrast: high) {
|
|
60
|
+
:root {
|
|
61
|
+
--lg-bg-primary: rgba(255,255,255,0.95);
|
|
62
|
+
--lg-bg-elevated: rgba(255,255,255,0.98);
|
|
63
|
+
--lg-border-color: rgba(0,0,0,0.3);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@media (prefers-contrast: high) and (prefers-color-scheme: dark) {
|
|
68
|
+
:root {
|
|
69
|
+
--lg-bg-primary: rgba(20,20,20,0.95);
|
|
70
|
+
--lg-bg-elevated: rgba(25,25,25,0.98);
|
|
71
|
+
--lg-border-color: rgba(255,255,255,0.3);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@media (prefers-reduced-motion: reduce) {
|
|
76
|
+
:root {
|
|
77
|
+
--lg-duration-fast: 0ms;
|
|
78
|
+
--lg-duration-normal: 0ms;
|
|
79
|
+
--lg-duration-slow: 0ms;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: neubrutalism
|
|
3
|
+
description: Neubrutalism design system skill. Use when building bold UI with thick borders, offset solid shadows, high saturation colors, and minimal border radius.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Neubrutalism Design Spec
|
|
8
|
+
|
|
9
|
+
## Core Principles
|
|
10
|
+
|
|
11
|
+
1. **Thick Borders** — Bold `3–5px solid` black outlines on all elements
|
|
12
|
+
2. **Offset Solid Shadows** — Hard-edge `box-shadow` with zero blur (e.g. `5px 5px 0 #000`)
|
|
13
|
+
3. **High Saturation Colors** — Vivid, punchy fills: pinks, yellows, blues, greens
|
|
14
|
+
4. **Minimal Radius** — `0–8px` border-radius; sharp or barely rounded corners
|
|
15
|
+
5. **Flat Aesthetic** — No gradients, no blur, no transparency
|
|
16
|
+
|
|
17
|
+
## CSS Tokens
|
|
18
|
+
|
|
19
|
+
Reference: [references/tokens.css](references/tokens.css)
|
|
20
|
+
|
|
21
|
+
```css
|
|
22
|
+
@import 'references/tokens.css';
|
|
23
|
+
|
|
24
|
+
.nb-card {
|
|
25
|
+
background: var(--nb-yellow);
|
|
26
|
+
border: var(--nb-border-thick);
|
|
27
|
+
border-radius: var(--nb-radius);
|
|
28
|
+
box-shadow: var(--nb-shadow);
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Component Examples
|
|
33
|
+
|
|
34
|
+
### Card
|
|
35
|
+
```css
|
|
36
|
+
.nb-card {
|
|
37
|
+
background: var(--nb-white);
|
|
38
|
+
border: var(--nb-border-thick);
|
|
39
|
+
border-radius: var(--nb-radius);
|
|
40
|
+
box-shadow: var(--nb-shadow);
|
|
41
|
+
padding: 1.5rem;
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Button
|
|
46
|
+
```css
|
|
47
|
+
.nb-btn {
|
|
48
|
+
background: var(--nb-yellow);
|
|
49
|
+
border: var(--nb-border);
|
|
50
|
+
border-radius: var(--nb-radius);
|
|
51
|
+
box-shadow: var(--nb-shadow-sm);
|
|
52
|
+
padding: 0.6rem 1.4rem;
|
|
53
|
+
font-family: var(--nb-font);
|
|
54
|
+
font-weight: var(--nb-font-weight);
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
transition: transform 0.1s, box-shadow 0.1s;
|
|
57
|
+
}
|
|
58
|
+
.nb-btn:hover {
|
|
59
|
+
transform: translate(-2px, -2px);
|
|
60
|
+
box-shadow: var(--nb-shadow);
|
|
61
|
+
}
|
|
62
|
+
.nb-btn:active {
|
|
63
|
+
transform: translate(3px, 3px);
|
|
64
|
+
box-shadow: none;
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Navbar
|
|
69
|
+
```css
|
|
70
|
+
.nb-nav {
|
|
71
|
+
background: var(--nb-bg);
|
|
72
|
+
border-bottom: var(--nb-border-thick);
|
|
73
|
+
padding: 1rem 2rem;
|
|
74
|
+
position: sticky;
|
|
75
|
+
top: 0;
|
|
76
|
+
z-index: 100;
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Input
|
|
81
|
+
```css
|
|
82
|
+
.nb-input {
|
|
83
|
+
background: var(--nb-white);
|
|
84
|
+
border: var(--nb-border);
|
|
85
|
+
border-radius: var(--nb-radius);
|
|
86
|
+
box-shadow: var(--nb-shadow-sm);
|
|
87
|
+
padding: 0.6rem 1rem;
|
|
88
|
+
font-family: var(--nb-font);
|
|
89
|
+
font-weight: var(--nb-font-weight-body);
|
|
90
|
+
}
|
|
91
|
+
.nb-input:focus {
|
|
92
|
+
outline: none;
|
|
93
|
+
box-shadow: var(--nb-shadow);
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Badge
|
|
98
|
+
```css
|
|
99
|
+
.nb-badge {
|
|
100
|
+
background: var(--nb-pink);
|
|
101
|
+
border: var(--nb-border);
|
|
102
|
+
border-radius: var(--nb-radius);
|
|
103
|
+
padding: 0.2rem 0.8rem;
|
|
104
|
+
font-family: var(--nb-font);
|
|
105
|
+
font-weight: var(--nb-font-weight);
|
|
106
|
+
font-size: 0.85rem;
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Typography
|
|
111
|
+
|
|
112
|
+
- Use bold, geometric sans-serif fonts (Space Grotesk, Inter, etc.)
|
|
113
|
+
- Headings: `font-weight: 700`, `letter-spacing: -0.02em`
|
|
114
|
+
- Body: `font-weight: 500`
|
|
115
|
+
- Uppercase sparingly for labels/badges
|
|
116
|
+
|
|
117
|
+
```css
|
|
118
|
+
h1, h2, h3 {
|
|
119
|
+
font-family: var(--nb-font-heading);
|
|
120
|
+
font-weight: var(--nb-font-weight);
|
|
121
|
+
letter-spacing: var(--nb-letter-spacing);
|
|
122
|
+
}
|
|
123
|
+
body {
|
|
124
|
+
font-family: var(--nb-font);
|
|
125
|
+
font-weight: var(--nb-font-weight-body);
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Accessibility Notes
|
|
130
|
+
|
|
131
|
+
- Thick borders provide strong visual boundaries — good for low-vision users
|
|
132
|
+
- Ensure color contrast ≥ 4.5:1 for text on colored backgrounds
|
|
133
|
+
- Active/hover states use `transform` shifts — provide `prefers-reduced-motion` fallback
|
|
134
|
+
|
|
135
|
+
```css
|
|
136
|
+
@media (prefers-reduced-motion: reduce) {
|
|
137
|
+
.nb-btn:hover, .nb-btn:active {
|
|
138
|
+
transform: none;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
/* Borders */
|
|
3
|
+
--nb-border: 3px solid #000;
|
|
4
|
+
--nb-border-thick: 5px solid #000;
|
|
5
|
+
|
|
6
|
+
/* Shadows (offset solid, no blur) */
|
|
7
|
+
--nb-shadow-sm: 3px 3px 0 #000;
|
|
8
|
+
--nb-shadow: 5px 5px 0 #000;
|
|
9
|
+
--nb-shadow-lg: 8px 8px 0 #000;
|
|
10
|
+
|
|
11
|
+
/* Radius */
|
|
12
|
+
--nb-radius: 4px;
|
|
13
|
+
--nb-radius-lg: 8px;
|
|
14
|
+
|
|
15
|
+
/* Colors — high saturation */
|
|
16
|
+
--nb-pink: #ff6b9d;
|
|
17
|
+
--nb-yellow: #ffd43b;
|
|
18
|
+
--nb-blue: #4dabf7;
|
|
19
|
+
--nb-green: #51cf66;
|
|
20
|
+
--nb-orange: #ff922b;
|
|
21
|
+
--nb-purple: #cc5de8;
|
|
22
|
+
--nb-red: #ff6b6b;
|
|
23
|
+
--nb-white: #fff;
|
|
24
|
+
--nb-black: #000;
|
|
25
|
+
--nb-bg: #f5f0e8;
|
|
26
|
+
|
|
27
|
+
/* Typography */
|
|
28
|
+
--nb-font: 'Space Grotesk', 'Inter', system-ui, sans-serif;
|
|
29
|
+
--nb-font-heading: 'Space Grotesk', 'Inter', system-ui, sans-serif;
|
|
30
|
+
--nb-font-weight: 700;
|
|
31
|
+
--nb-font-weight-body: 500;
|
|
32
|
+
--nb-letter-spacing: -0.02em;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
[data-theme="dark"] {
|
|
36
|
+
--nb-border: 3px solid #fff;
|
|
37
|
+
--nb-border-thick: 5px solid #fff;
|
|
38
|
+
--nb-shadow-sm: 3px 3px 0 #fff;
|
|
39
|
+
--nb-shadow: 5px 5px 0 #fff;
|
|
40
|
+
--nb-shadow-lg: 8px 8px 0 #fff;
|
|
41
|
+
--nb-bg: #1a1a2e;
|
|
42
|
+
--nb-black: #fff;
|
|
43
|
+
--nb-white: #1a1a2e;
|
|
44
|
+
}
|