@moshevents/tokens 0.1.0 → 0.3.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 +42 -3
- package/dist/theme.css +81 -25
- package/dist/tokens.css +88 -28
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -42,6 +42,32 @@ Then import the CSS once:
|
|
|
42
42
|
|
|
43
43
|
`npm update @moshevents/tokens` pulls new token values — no vendored copy to sync.
|
|
44
44
|
|
|
45
|
+
### Light + dark
|
|
46
|
+
|
|
47
|
+
**Light is the default everywhere; dark is opt-in** (Garrett, 2026-10-10). Semantic tokens
|
|
48
|
+
(`--color-bg`, `--surface-*`, `--text-*`, `--border-*`, `--fill-*`, `--shadow-*`,
|
|
49
|
+
`--gradient-surface`) carry **two values** in `tokens.json`
|
|
50
|
+
(`"$value": { "light": …, "dark": … }`). Brand and status hues are single-valued.
|
|
51
|
+
|
|
52
|
+
- **Website (`tokens.css`)** — `:root` is the **light** palette (the site is light-first).
|
|
53
|
+
A dark-by-design surface (event page, event builder, ticket modal) opts in with
|
|
54
|
+
`data-theme="dark"` on its root element and the semantic tokens flip underneath it.
|
|
55
|
+
Theme is attribute-driven, never `prefers-color-scheme` — resolve the preference in JS
|
|
56
|
+
and set the attribute (the venue dashboard already does this).
|
|
57
|
+
- **Admin (`theme.css`)** — `@theme` carries the **light** values too. The console keeps its
|
|
58
|
+
dark look by setting `data-theme="dark"` on `<html>`, which rebinds the same Tailwind
|
|
59
|
+
variables; remove the attribute and it is light.
|
|
60
|
+
- **iOS** — two-valued colors generate as dynamic `UIColor { trait in … }`, so they follow
|
|
61
|
+
the system appearance automatically; SwiftUI `Color` wraps the same UIColor.
|
|
62
|
+
|
|
63
|
+
**Role surfaces** (`--surface-canvas|card|field|inset|overlay`) say *what* a surface is; the
|
|
64
|
+
numbered ramp (`--surface-0…7`) says *how far off the canvas* it sits. New components should
|
|
65
|
+
read the role tokens — they are what make light and dark both look right (cards are white on
|
|
66
|
+
light but lifted on dark; the gray tint on light appears only in fields and insets).
|
|
67
|
+
|
|
68
|
+
Adding a two-valued token: give it `{ "light", "dark" }` and run `npm run build`; every
|
|
69
|
+
output picks up both. Everything else stays single-valued.
|
|
70
|
+
|
|
45
71
|
**iOS — SwiftPM `MoshTokens`.** Xcode → Add Package Dependencies →
|
|
46
72
|
`https://github.com/moshorg/mosh-tokens`, pin a version, then:
|
|
47
73
|
|
|
@@ -53,6 +79,18 @@ label.font = .systemFont(ofSize: MoshFontSize.textBase, weight: MoshWeight.semib
|
|
|
53
79
|
|
|
54
80
|
SwiftPM resolves straight from the git tag — no registry/publish needed.
|
|
55
81
|
|
|
82
|
+
### Secondary color — electric violet
|
|
83
|
+
|
|
84
|
+
**Violet marks content to notice; red marks the action to take. Never let the two trade jobs.**
|
|
85
|
+
(Garrett, 2026-10-15 — provisional, revisit any time.) `--color-secondary` (#6b46ff) is for
|
|
86
|
+
fills — public events on calendars and lists, the today marker, a featured highlight, selected
|
|
87
|
+
filter chips (violet outline + `rgba(var(--color-secondary-rgb), .10)` tint). Text on a violet
|
|
88
|
+
fill is always white. Violet text is `--color-secondary-strong` on white and
|
|
89
|
+
`--color-secondary-light` on dark — never slate ink on #6b46ff (3.35:1). Not for primary
|
|
90
|
+
buttons, errors, status meanings (success/warning/danger) or focus rings. One violet element
|
|
91
|
+
type per view, like one primary button per view. The dashboard slots `--vd-secondary` /
|
|
92
|
+
`--vd-secondary-text` live in the website's `packages/ui/base.css`.
|
|
93
|
+
|
|
56
94
|
## Releasing
|
|
57
95
|
|
|
58
96
|
Publishing is **Trusted Publishing (OIDC)** — no token or secret. One-time setup:
|
|
@@ -76,9 +114,10 @@ project is the rendered view of the same values. **One source, two audiences.**
|
|
|
76
114
|
|
|
77
115
|
## Notes / open decisions
|
|
78
116
|
|
|
79
|
-
- **
|
|
80
|
-
|
|
81
|
-
|
|
117
|
+
- **Light values are the neutral ramp** (matches iOS `Theme.swift` and the public website:
|
|
118
|
+
`#111111` text, `#f2f2f3` cards). The venue dashboard's light mode uses a *slate* ramp
|
|
119
|
+
(`#0f172a` text, slate alphas — Garrett, 2026-09-16) via its own `--vd-*` layer; whether
|
|
120
|
+
that becomes a token variant or stays a dashboard override is an open decision.
|
|
82
121
|
- **iOS dimension conversion** is `px → pt` 1:1 and `rem × 16`; revisit if the iOS type
|
|
83
122
|
scale should differ from web.
|
|
84
123
|
- **Gradients/shadows** generate for web (CSS) and admin (Tailwind) but are omitted from
|
package/dist/theme.css
CHANGED
|
@@ -9,31 +9,45 @@
|
|
|
9
9
|
--color-brand-soft: #ff3d3d;
|
|
10
10
|
--color-brand-deep: #b30000;
|
|
11
11
|
--color-accent-deep: #b30000;
|
|
12
|
-
--color-
|
|
13
|
-
--color-
|
|
14
|
-
--color-
|
|
15
|
-
--color-
|
|
16
|
-
--color-surface-
|
|
17
|
-
--color-surface-
|
|
18
|
-
--color-surface-
|
|
19
|
-
--color-surface-
|
|
20
|
-
--color-surface-
|
|
21
|
-
--color-
|
|
22
|
-
--color-
|
|
23
|
-
--color-
|
|
24
|
-
--color-
|
|
25
|
-
--color-
|
|
26
|
-
--color-
|
|
27
|
-
--color-
|
|
28
|
-
--color-
|
|
29
|
-
--color-
|
|
12
|
+
--color-secondary: #6b46ff;
|
|
13
|
+
--color-secondary-strong: #5530e0;
|
|
14
|
+
--color-secondary-light: #a996ff;
|
|
15
|
+
--color-bg: #ffffff;
|
|
16
|
+
--color-surface-0: #fafafa;
|
|
17
|
+
--color-surface-1: #f5f5f5;
|
|
18
|
+
--color-surface-2: #f2f2f3;
|
|
19
|
+
--color-surface-3: #ececee;
|
|
20
|
+
--color-surface-4: #e6e6e8;
|
|
21
|
+
--color-surface-5: #e0e0e2;
|
|
22
|
+
--color-surface-6: #d4d4d8;
|
|
23
|
+
--color-surface-7: #c4c4c8;
|
|
24
|
+
--color-surface-canvas: #ffffff;
|
|
25
|
+
--color-surface-card: #ffffff;
|
|
26
|
+
--color-surface-field: #f5f5f5;
|
|
27
|
+
--color-surface-inset: #f2f2f3;
|
|
28
|
+
--color-surface-overlay: #ffffff;
|
|
29
|
+
--color-text-primary: #111111;
|
|
30
|
+
--color-text-secondary: #555555;
|
|
31
|
+
--color-text-tertiary: #6e6e73;
|
|
32
|
+
--color-text-muted: #777777;
|
|
33
|
+
--color-text-faint: #9a9a9f;
|
|
34
|
+
--color-text-disabled: #a8a8ad;
|
|
35
|
+
--color-text-on-brand: #ffffff;
|
|
36
|
+
--color-text-brand: #ff2929;
|
|
37
|
+
--color-text-success: #15803d;
|
|
38
|
+
--color-text-warning: #b45309;
|
|
39
|
+
--color-text-danger: #dc2626;
|
|
40
|
+
--color-border-subtle: rgba(0, 0, 0, 0.06);
|
|
41
|
+
--color-border-default: rgba(0, 0, 0, 0.10);
|
|
42
|
+
--color-border-strong: rgba(0, 0, 0, 0.15);
|
|
30
43
|
--color-border-brand: rgba(255, 41, 41, 0.50);
|
|
31
|
-
--color-
|
|
32
|
-
--color-fill-
|
|
33
|
-
--color-fill-
|
|
44
|
+
--color-border-focus: rgba(0, 0, 0, 0.30);
|
|
45
|
+
--color-fill-ghost: rgba(0, 0, 0, 0.04);
|
|
46
|
+
--color-fill-hover: rgba(0, 0, 0, 0.08);
|
|
47
|
+
--color-fill-active: rgba(0, 0, 0, 0.12);
|
|
34
48
|
--color-scrim: rgba(0, 0, 0, 0.50);
|
|
35
49
|
--color-scrim-strong: rgba(0, 0, 0, 0.70);
|
|
36
|
-
--color-success: #
|
|
50
|
+
--color-success: #16a34a;
|
|
37
51
|
--color-success-bright: #4ade80;
|
|
38
52
|
--color-danger: #ef4444;
|
|
39
53
|
--color-danger-bright: #f87171;
|
|
@@ -42,7 +56,7 @@
|
|
|
42
56
|
--gradient-brand: linear-gradient(135deg, #ff2929, #b30000);
|
|
43
57
|
--gradient-red: linear-gradient(to top, #ff3d3d, #ff4d4d);
|
|
44
58
|
--gradient-warm: linear-gradient(135deg, #ff6b6b, #ff2929);
|
|
45
|
-
--gradient-surface: linear-gradient(145deg, #
|
|
59
|
+
--gradient-surface: linear-gradient(145deg, #ffffff, #f2f2f3);
|
|
46
60
|
--gradient-shimmer: linear-gradient(90deg, transparent, #ff4d4d, transparent);
|
|
47
61
|
--radius-xs: 4px;
|
|
48
62
|
--radius-sm: 6px;
|
|
@@ -79,16 +93,58 @@
|
|
|
79
93
|
--font-weight-semibold: 600;
|
|
80
94
|
--font-weight-bold: 700;
|
|
81
95
|
--font-weight-black: 900;
|
|
96
|
+
--shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
97
|
+
--shadow-md: 0 8px 24px rgba(0, 0, 0, 0.12);
|
|
98
|
+
--shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.16);
|
|
99
|
+
--shadow-glow-brand: 0 0 20px rgba(255, 41, 41, 0.5), 0 0 40px rgba(255, 41, 41, 0.2);
|
|
100
|
+
--shadow-glow-brand-soft: 0 0 24px rgba(255, 77, 77, 0.3);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Dark rebinding — opt in per subtree (or on <html>) with data-theme="dark". */
|
|
104
|
+
[data-theme="dark"] {
|
|
105
|
+
color-scheme: dark;
|
|
106
|
+
--color-bg: #000000;
|
|
107
|
+
--color-surface-0: #0a0a0a;
|
|
108
|
+
--color-surface-1: #121212;
|
|
109
|
+
--color-surface-2: #151515;
|
|
110
|
+
--color-surface-3: #1a1a1a;
|
|
111
|
+
--color-surface-4: #1f1f1f;
|
|
112
|
+
--color-surface-5: #252525;
|
|
113
|
+
--color-surface-6: #2a2a2a;
|
|
114
|
+
--color-surface-7: #3a3a3a;
|
|
115
|
+
--color-surface-canvas: #000000;
|
|
116
|
+
--color-surface-card: #1a1a1a;
|
|
117
|
+
--color-surface-field: #151515;
|
|
118
|
+
--color-surface-inset: #1f1f1f;
|
|
119
|
+
--color-surface-overlay: #151515;
|
|
120
|
+
--color-text-primary: #ffffff;
|
|
121
|
+
--color-text-secondary: #cccccc;
|
|
122
|
+
--color-text-tertiary: #aaaaaa;
|
|
123
|
+
--color-text-muted: #888888;
|
|
124
|
+
--color-text-faint: #666666;
|
|
125
|
+
--color-text-disabled: #555555;
|
|
126
|
+
--color-text-brand: #ff6b6b;
|
|
127
|
+
--color-text-success: #4ade80;
|
|
128
|
+
--color-text-warning: #fbbf24;
|
|
129
|
+
--color-text-danger: #f87171;
|
|
130
|
+
--color-border-subtle: rgba(255, 255, 255, 0.06);
|
|
131
|
+
--color-border-default: rgba(255, 255, 255, 0.10);
|
|
132
|
+
--color-border-strong: rgba(255, 255, 255, 0.15);
|
|
133
|
+
--color-border-focus: rgba(255, 255, 255, 0.30);
|
|
134
|
+
--color-fill-ghost: rgba(255, 255, 255, 0.04);
|
|
135
|
+
--color-fill-hover: rgba(255, 255, 255, 0.08);
|
|
136
|
+
--color-fill-active: rgba(255, 255, 255, 0.12);
|
|
137
|
+
--color-success: #22c55e;
|
|
138
|
+
--gradient-surface: linear-gradient(145deg, #2a2a2a, #1a1a1a);
|
|
82
139
|
--shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.5);
|
|
83
140
|
--shadow-md: 0 8px 24px rgba(0, 0, 0, 0.5);
|
|
84
141
|
--shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.6);
|
|
85
|
-
--shadow-glow-brand: 0 0 20px rgba(255, 41, 41, 0.5), 0 0 40px rgba(255, 41, 41, 0.2);
|
|
86
|
-
--shadow-glow-brand-soft: 0 0 24px rgba(255, 77, 77, 0.3);
|
|
87
142
|
}
|
|
88
143
|
|
|
89
144
|
/* Channel vars (rgba(var(--…), <alpha>)) — outside @theme on purpose. */
|
|
90
145
|
:root {
|
|
91
146
|
--color-brand-rgb: 255, 41, 41;
|
|
147
|
+
--color-secondary-rgb: 107, 70, 255;
|
|
92
148
|
--color-danger-rgb: 239, 68, 68;
|
|
93
149
|
--color-danger-bright-rgb: 248, 113, 113;
|
|
94
150
|
}
|
package/dist/tokens.css
CHANGED
|
@@ -1,38 +1,58 @@
|
|
|
1
1
|
/* AUTO-GENERATED from tokens.json by build.mjs — do not edit by hand. */
|
|
2
|
-
/* Mosh Design System — CSS custom properties (website).
|
|
2
|
+
/* Mosh Design System — CSS custom properties (website).
|
|
3
|
+
:root is the LIGHT palette (the site is light-first). Wrap a dark-by-design
|
|
4
|
+
surface in data-theme="dark" and the semantic tokens below flip; brand and
|
|
5
|
+
status hues stay put. Theme is attribute-driven, never prefers-color-scheme —
|
|
6
|
+
resolve the user's preference in JS and set the attribute. */
|
|
3
7
|
:root {
|
|
8
|
+
color-scheme: light;
|
|
4
9
|
--color-brand: #ff2929; /* primary brand red */
|
|
5
10
|
--color-brand-bright: #ff4d4d; /* brighter accent / hover */
|
|
6
11
|
--color-brand-light: #ff6b6b; /* light red, best for text on dark */
|
|
7
12
|
--color-brand-soft: #ff3d3d;
|
|
8
13
|
--color-brand-deep: #b30000; /* pressed / deep */
|
|
9
|
-
--color-accent-deep: #b30000; /*
|
|
14
|
+
--color-accent-deep: #b30000; /* deep-red accent that pairs with brand red (NOT the secondary color — that is color-secondary) */
|
|
10
15
|
--color-brand-rgb: 255, 41, 41; /* brand red channels — for rgba(var(--color-brand-rgb), <alpha>) */
|
|
11
|
-
--color-
|
|
12
|
-
--
|
|
13
|
-
--
|
|
14
|
-
--
|
|
15
|
-
--
|
|
16
|
-
--surface-
|
|
17
|
-
--surface-
|
|
18
|
-
--surface-
|
|
19
|
-
--surface-
|
|
20
|
-
--
|
|
21
|
-
--
|
|
22
|
-
--
|
|
23
|
-
--
|
|
24
|
-
--
|
|
25
|
-
--
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
-
--
|
|
16
|
+
--color-secondary: #6b46ff; /* SECONDARY electric violet (Garrett 2026-10-15, provisional) — content to notice, never an action or an error. Fills: event chips, today marker, swatches. Text on it is always white (5.32:1); never slate ink (3.35:1) */
|
|
17
|
+
--color-secondary-strong: #5530e0; /* violet text and icons on white (7.28:1) */
|
|
18
|
+
--color-secondary-light: #a996ff; /* violet text on dark surfaces (8.49:1 on #000, 7.58:1 on surface-1) */
|
|
19
|
+
--color-secondary-rgb: 107, 70, 255; /* violet channels — for rgba(var(--color-secondary-rgb), <alpha>), e.g. .10 for a selected chip tint */
|
|
20
|
+
--color-bg: #ffffff; /* app background */
|
|
21
|
+
--surface-0: #fafafa;
|
|
22
|
+
--surface-1: #f5f5f5;
|
|
23
|
+
--surface-2: #f2f2f3;
|
|
24
|
+
--surface-3: #ececee;
|
|
25
|
+
--surface-4: #e6e6e8;
|
|
26
|
+
--surface-5: #e0e0e2;
|
|
27
|
+
--surface-6: #d4d4d8;
|
|
28
|
+
--surface-7: #c4c4c8;
|
|
29
|
+
--surface-canvas: #ffffff; /* ROLE: page canvas (alias of color-bg) */
|
|
30
|
+
--surface-card: #ffffff; /* ROLE: cards/panels — white on light (borders carry separation), surface-3 on dark */
|
|
31
|
+
--surface-field: #f5f5f5; /* ROLE: text fields */
|
|
32
|
+
--surface-inset: #f2f2f3; /* ROLE: chips, banners, table headers — the only place the gray tint appears on light */
|
|
33
|
+
--surface-overlay: #ffffff; /* ROLE: modal cards, dropdown menus, popovers */
|
|
34
|
+
--text-primary: #111111;
|
|
35
|
+
--text-secondary: #555555;
|
|
36
|
+
--text-tertiary: #6e6e73;
|
|
37
|
+
--text-muted: #777777;
|
|
38
|
+
--text-faint: #9a9a9f;
|
|
39
|
+
--text-disabled: #a8a8ad;
|
|
40
|
+
--text-on-brand: #ffffff; /* text/icon on a brand-red fill */
|
|
41
|
+
--text-brand: #ff2929; /* brand-colored text (selected nav, links) — full red vibrates on black, so dark uses the light red */
|
|
42
|
+
--text-success: #15803d; /* status text; light value darkened for contrast on white */
|
|
43
|
+
--text-warning: #b45309;
|
|
44
|
+
--text-danger: #dc2626;
|
|
45
|
+
--border-subtle: rgba(0, 0, 0, 0.06);
|
|
46
|
+
--border-default: rgba(0, 0, 0, 0.10);
|
|
47
|
+
--border-strong: rgba(0, 0, 0, 0.15);
|
|
29
48
|
--border-brand: rgba(255, 41, 41, 0.50);
|
|
30
|
-
--
|
|
31
|
-
--fill-
|
|
32
|
-
--fill-
|
|
49
|
+
--border-focus: rgba(0, 0, 0, 0.30); /* field focus ring — neutral, never brand red (red focus reads as a validation error) */
|
|
50
|
+
--fill-ghost: rgba(0, 0, 0, 0.04);
|
|
51
|
+
--fill-hover: rgba(0, 0, 0, 0.08);
|
|
52
|
+
--fill-active: rgba(0, 0, 0, 0.12);
|
|
33
53
|
--scrim: rgba(0, 0, 0, 0.50);
|
|
34
54
|
--scrim-strong: rgba(0, 0, 0, 0.70);
|
|
35
|
-
--color-success: #
|
|
55
|
+
--color-success: #16a34a;
|
|
36
56
|
--color-success-bright: #4ade80;
|
|
37
57
|
--color-danger: #ef4444;
|
|
38
58
|
--color-danger-bright: #f87171;
|
|
@@ -43,7 +63,7 @@
|
|
|
43
63
|
--gradient-brand: linear-gradient(135deg, #ff2929, #b30000); /* red → deep red */
|
|
44
64
|
--gradient-red: linear-gradient(to top, #ff3d3d, #ff4d4d);
|
|
45
65
|
--gradient-warm: linear-gradient(135deg, #ff6b6b, #ff2929);
|
|
46
|
-
--gradient-surface: linear-gradient(145deg, #
|
|
66
|
+
--gradient-surface: linear-gradient(145deg, #ffffff, #f2f2f3);
|
|
47
67
|
--gradient-shimmer: linear-gradient(90deg, transparent, #ff4d4d, transparent);
|
|
48
68
|
--radius-xs: 4px;
|
|
49
69
|
--radius-sm: 6px;
|
|
@@ -51,7 +71,7 @@
|
|
|
51
71
|
--radius-lg: 10px;
|
|
52
72
|
--radius-xl: 12px;
|
|
53
73
|
--radius-2xl: 16px;
|
|
54
|
-
--radius-pill: 999px; /*
|
|
74
|
+
--radius-pill: 999px; /* badges, chips, toggles, search field — NOT buttons (Button radius scales with height: 8/10/14px) */
|
|
55
75
|
--radius-circle: 50%;
|
|
56
76
|
--space-1: 4px;
|
|
57
77
|
--space-2: 8px;
|
|
@@ -80,9 +100,49 @@
|
|
|
80
100
|
--weight-semibold: 600; /* most common UI weight */
|
|
81
101
|
--weight-bold: 700;
|
|
82
102
|
--weight-black: 900;
|
|
103
|
+
--shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
104
|
+
--shadow-md: 0 8px 24px rgba(0, 0, 0, 0.12);
|
|
105
|
+
--shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.16);
|
|
106
|
+
--glow-brand: 0 0 20px rgba(255, 41, 41, 0.5), 0 0 40px rgba(255, 41, 41, 0.2); /* signature red glow — primary actions */
|
|
107
|
+
--glow-brand-soft: 0 0 24px rgba(255, 77, 77, 0.3);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
[data-theme="dark"] {
|
|
111
|
+
color-scheme: dark;
|
|
112
|
+
--color-bg: #000000;
|
|
113
|
+
--surface-0: #0a0a0a;
|
|
114
|
+
--surface-1: #121212;
|
|
115
|
+
--surface-2: #151515;
|
|
116
|
+
--surface-3: #1a1a1a;
|
|
117
|
+
--surface-4: #1f1f1f;
|
|
118
|
+
--surface-5: #252525;
|
|
119
|
+
--surface-6: #2a2a2a;
|
|
120
|
+
--surface-7: #3a3a3a;
|
|
121
|
+
--surface-canvas: #000000;
|
|
122
|
+
--surface-card: #1a1a1a;
|
|
123
|
+
--surface-field: #151515;
|
|
124
|
+
--surface-inset: #1f1f1f;
|
|
125
|
+
--surface-overlay: #151515;
|
|
126
|
+
--text-primary: #ffffff;
|
|
127
|
+
--text-secondary: #cccccc;
|
|
128
|
+
--text-tertiary: #aaaaaa;
|
|
129
|
+
--text-muted: #888888;
|
|
130
|
+
--text-faint: #666666;
|
|
131
|
+
--text-disabled: #555555;
|
|
132
|
+
--text-brand: #ff6b6b;
|
|
133
|
+
--text-success: #4ade80;
|
|
134
|
+
--text-warning: #fbbf24;
|
|
135
|
+
--text-danger: #f87171;
|
|
136
|
+
--border-subtle: rgba(255, 255, 255, 0.06);
|
|
137
|
+
--border-default: rgba(255, 255, 255, 0.10);
|
|
138
|
+
--border-strong: rgba(255, 255, 255, 0.15);
|
|
139
|
+
--border-focus: rgba(255, 255, 255, 0.30);
|
|
140
|
+
--fill-ghost: rgba(255, 255, 255, 0.04);
|
|
141
|
+
--fill-hover: rgba(255, 255, 255, 0.08);
|
|
142
|
+
--fill-active: rgba(255, 255, 255, 0.12);
|
|
143
|
+
--color-success: #22c55e;
|
|
144
|
+
--gradient-surface: linear-gradient(145deg, #2a2a2a, #1a1a1a);
|
|
83
145
|
--shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.5);
|
|
84
146
|
--shadow-md: 0 8px 24px rgba(0, 0, 0, 0.5);
|
|
85
147
|
--shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.6);
|
|
86
|
-
--glow-brand: 0 0 20px rgba(255, 41, 41, 0.5), 0 0 40px rgba(255, 41, 41, 0.2); /* signature red glow — primary actions */
|
|
87
|
-
--glow-brand-soft: 0 0 24px rgba(255, 77, 77, 0.3);
|
|
88
148
|
}
|
package/package.json
CHANGED