@enderfall/ui 0.1.0 → 0.1.4

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.
Files changed (45) hide show
  1. package/assets/brand/enderfall-lockup.png +0 -0
  2. package/assets/brand/enderfall-lockup.svg +8 -0
  3. package/assets/brand/enderfall-mark.png +0 -0
  4. package/assets/brand/enderfall-mark.svg +8 -0
  5. package/dist/components/Button.d.ts +2 -1
  6. package/dist/components/Button.d.ts.map +1 -1
  7. package/dist/components/Button.js +8 -1
  8. package/dist/components/Dropdown.d.ts.map +1 -1
  9. package/dist/components/Dropdown.js +2 -2
  10. package/package.json +5 -2
  11. package/src/base.css +160 -0
  12. package/src/components/AccessGate.css +24 -0
  13. package/src/components/AccessGate.tsx +61 -0
  14. package/src/components/BookmarkDropdown.css +220 -0
  15. package/src/components/Button.css +183 -0
  16. package/src/components/Button.tsx +20 -0
  17. package/src/components/Dropdown.tsx +570 -0
  18. package/src/components/FloatingFooter.css +49 -0
  19. package/src/components/FloatingFooter.tsx +27 -0
  20. package/src/components/FormField.tsx +29 -0
  21. package/src/components/HeaderMenu.css +280 -0
  22. package/src/components/Input.css +68 -0
  23. package/src/components/Input.tsx +23 -0
  24. package/src/components/MainHeader.css +167 -0
  25. package/src/components/MainHeader.tsx +51 -0
  26. package/src/components/Modal.css +282 -0
  27. package/src/components/Modal.tsx +142 -0
  28. package/src/components/Panel.css +71 -0
  29. package/src/components/Panel.tsx +31 -0
  30. package/src/components/PreferencesModal.tsx +67 -0
  31. package/src/components/SideMenu.tsx +239 -0
  32. package/src/components/Slider.css +114 -0
  33. package/src/components/Slider.tsx +33 -0
  34. package/src/components/StackedCard.css +180 -0
  35. package/src/components/StackedCard.tsx +125 -0
  36. package/src/components/StatDots.css +122 -0
  37. package/src/components/StatDots.tsx +53 -0
  38. package/src/components/Tabs.css +108 -0
  39. package/src/components/Tabs.tsx +68 -0
  40. package/src/components/Toggle.css +161 -0
  41. package/src/components/Toggle.tsx +38 -0
  42. package/src/components/UserMenu.css +273 -0
  43. package/src/index.ts +45 -0
  44. package/src/theme.css +353 -0
  45. package/styles.css +1 -0
@@ -0,0 +1,273 @@
1
+ .user-section {
2
+ position: relative;
3
+ display: inline-block;
4
+ z-index: 30;
5
+ --user-border-gradient: var(--ef-border-gradient);
6
+ --user-button-height: 46px;
7
+ }
8
+
9
+ .user-button {
10
+ display: flex;
11
+ align-items: center;
12
+ gap: 10px;
13
+ border: 2px solid transparent;
14
+ padding: 8px 12px;
15
+ border-radius: var(--ef-control-radius, 12px);
16
+ min-height: 46px;
17
+ height: var(--user-button-height);
18
+ background:
19
+ linear-gradient(var(--ef-surface), var(--ef-surface)) padding-box,
20
+ var(--user-border-gradient) border-box;
21
+ color: var(--text-strong);
22
+ font-weight: 500;
23
+ cursor: pointer;
24
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.35);
25
+ }
26
+
27
+ .user-section[data-open="true"] .user-button {
28
+ border-bottom-left-radius: 0;
29
+ border-bottom-right-radius: 0;
30
+ border-bottom-color: transparent;
31
+ }
32
+
33
+ .avatar {
34
+ width: 32px;
35
+ height: 32px;
36
+ border-radius: 50%;
37
+ background: rgba(255, 255, 255, 0.12);
38
+ display: grid;
39
+ place-items: center;
40
+ overflow: hidden;
41
+ flex-shrink: 0;
42
+ }
43
+
44
+ .avatar img {
45
+ width: 100%;
46
+ height: 100%;
47
+ object-fit: cover;
48
+ }
49
+
50
+ .avatar-fallback {
51
+ font-size: 0.85rem;
52
+ font-weight: 700;
53
+ }
54
+
55
+ .user-name {
56
+ max-width: 160px;
57
+ overflow: hidden;
58
+ text-overflow: ellipsis;
59
+ white-space: nowrap;
60
+ }
61
+
62
+ .chevron {
63
+ font-size: 0.7rem;
64
+ opacity: 0.7;
65
+ display: inline-flex;
66
+ }
67
+
68
+ .chevron svg {
69
+ width: 14px;
70
+ height: 14px;
71
+ }
72
+
73
+ .chevron.open svg {
74
+ transform: rotate(180deg);
75
+ }
76
+
77
+ .dropdown {
78
+ position: absolute;
79
+ left: 0;
80
+ right: 0;
81
+ top: calc(100% - 2px);
82
+ width: 100%;
83
+ min-width: 100%;
84
+ background:
85
+ linear-gradient(var(--ef-surface), var(--ef-surface)) padding-box,
86
+ var(--user-border-gradient) border-box;
87
+ border: 2px solid transparent;
88
+ border-top: none;
89
+ border-radius: 0 0 var(--ef-control-radius, 12px) var(--ef-control-radius, 12px);
90
+ padding: 8px;
91
+ display: grid;
92
+ gap: 6px;
93
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.4);
94
+ backdrop-filter: blur(12px);
95
+ opacity: 0;
96
+ transform: translateY(-6px);
97
+ pointer-events: none;
98
+ transition: opacity 0.12s ease, transform 0.12s ease;
99
+ z-index: 200;
100
+ }
101
+
102
+ .dropdown[data-open="true"] {
103
+ opacity: 1;
104
+ transform: translateY(0);
105
+ pointer-events: auto;
106
+ }
107
+
108
+ .dropdown-item {
109
+ border: 2px solid transparent;
110
+ padding: 10px 16px;
111
+ border-radius: var(--ef-control-radius, 12px);
112
+ background:
113
+ linear-gradient(var(--ef-surface), var(--ef-surface)) padding-box,
114
+ var(--ef-border-gradient) border-box;
115
+ color: var(--text-strong);
116
+ font-weight: 600;
117
+ font-size: 0.85rem;
118
+ text-align: left;
119
+ cursor: pointer;
120
+ width: 100%;
121
+ transition: box-shadow 0.2s ease, transform 0.2s ease;
122
+ box-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
123
+ }
124
+
125
+ .dropdown-item:hover {
126
+ box-shadow: 0 0 18px rgba(124, 77, 255, 0.35);
127
+ transform: translateY(-1px);
128
+ }
129
+
130
+ .dropdown-item.theme-preview {
131
+ border: 2px solid transparent;
132
+ border-radius: var(--ef-control-radius, 12px);
133
+ background:
134
+ linear-gradient(var(--ef-button-surface), var(--ef-button-surface)) padding-box,
135
+ var(--ef-button-border) border-box;
136
+ color: var(--ef-button-text);
137
+ box-shadow: var(--shadow);
138
+ }
139
+
140
+ .dropdown-item.theme-preview:hover {
141
+ box-shadow: var(--shadow);
142
+ filter: brightness(1.04);
143
+ transform: translateY(-1px);
144
+ }
145
+
146
+ .dropdown-item.theme-preview.is-disabled,
147
+ .dropdown-item.theme-preview.is-disabled:hover {
148
+ opacity: 0.6;
149
+ box-shadow: none;
150
+ filter: none;
151
+ transform: none;
152
+ background:
153
+ linear-gradient(var(--ef-button-surface), var(--ef-button-surface)) padding-box,
154
+ var(--ef-button-border-soft) border-box;
155
+ }
156
+
157
+ .dropdown-item.is-disabled {
158
+ opacity: 0.55;
159
+ cursor: not-allowed;
160
+ box-shadow: none;
161
+ }
162
+
163
+ .dropdown-item.is-disabled:hover {
164
+ box-shadow: none;
165
+ transform: none;
166
+ }
167
+
168
+ .dropdown-empty {
169
+ padding: 10px 12px;
170
+ border-radius: var(--ef-control-radius, 12px);
171
+ border: 2px dashed rgba(255, 255, 255, 0.1);
172
+ color: var(--muted);
173
+ font-weight: 600;
174
+ font-size: 0.8rem;
175
+ text-align: center;
176
+ }
177
+
178
+ .dropdown-item-rich {
179
+ display: grid;
180
+ grid-template-columns: auto 1fr auto;
181
+ gap: 10px;
182
+ align-items: center;
183
+ padding: 10px 12px;
184
+ }
185
+
186
+ .dropdown-avatar {
187
+ width: 34px;
188
+ height: 34px;
189
+ border-radius: 10px;
190
+ background: rgba(255, 255, 255, 0.12);
191
+ display: grid;
192
+ place-items: center;
193
+ overflow: hidden;
194
+ font-size: 0.7rem;
195
+ font-weight: 700;
196
+ text-transform: uppercase;
197
+ }
198
+
199
+ .dropdown-avatar img {
200
+ width: 100%;
201
+ height: 100%;
202
+ object-fit: cover;
203
+ }
204
+
205
+ .dropdown-avatar-fallback {
206
+ line-height: 1;
207
+ }
208
+
209
+ .dropdown-item-text {
210
+ display: grid;
211
+ gap: 2px;
212
+ }
213
+
214
+ .dropdown-item-label {
215
+ font-size: 0.85rem;
216
+ font-weight: 600;
217
+ }
218
+
219
+ .dropdown-item-subtitle {
220
+ font-size: 0.72rem;
221
+ color: var(--muted);
222
+ font-weight: 500;
223
+ }
224
+
225
+ .dropdown-item-actions {
226
+ display: inline-flex;
227
+ gap: 6px;
228
+ align-items: center;
229
+ }
230
+
231
+ .dropdown-action {
232
+ width: 28px;
233
+ height: 28px;
234
+ border-radius: 8px;
235
+ border: 1px solid rgba(255, 255, 255, 0.18);
236
+ background: rgba(255, 255, 255, 0.08);
237
+ color: var(--text-strong);
238
+ display: grid;
239
+ place-items: center;
240
+ cursor: pointer;
241
+ }
242
+
243
+ .dropdown-action.ef-button {
244
+ padding: 0;
245
+ min-width: 0;
246
+ box-shadow: none;
247
+ }
248
+
249
+ .dropdown-action svg {
250
+ width: 14px;
251
+ height: 14px;
252
+ }
253
+
254
+ .dropdown-action.is-delete {
255
+ border-color: rgba(255, 120, 120, 0.45);
256
+ color: rgb(255, 164, 164);
257
+ }
258
+
259
+ .dropdown-action:hover {
260
+ filter: brightness(1.1);
261
+ }
262
+
263
+ @media (max-width: 760px) {
264
+ .user-button {
265
+ gap: 8px;
266
+ padding: 8px 10px;
267
+ }
268
+
269
+ .user-name {
270
+ display: inline;
271
+ max-width: 32vw;
272
+ }
273
+ }
package/src/index.ts ADDED
@@ -0,0 +1,45 @@
1
+ export type ThemeMode = string;
2
+ export { AccessGate } from "./components/AccessGate";
3
+ export { Button } from "./components/Button";
4
+ export { FormField } from "./components/FormField";
5
+ export { Input, Textarea, Select } from "./components/Input";
6
+ export { Panel } from "./components/Panel";
7
+ export { StackedCard } from "./components/StackedCard";
8
+ export { Dropdown } from "./components/Dropdown";
9
+ export { MainHeader } from "./components/MainHeader";
10
+ export { FloatingFooter } from "./components/FloatingFooter";
11
+ export { Modal } from "./components/Modal";
12
+ export { PreferencesModal } from "./components/PreferencesModal";
13
+ export { Toggle } from "./components/Toggle";
14
+ export { Slider } from "./components/Slider";
15
+ export { StatDots } from "./components/StatDots";
16
+ export { Tabs } from "./components/Tabs";
17
+ export { SideMenu, SideMenuSubmenu } from "./components/SideMenu";
18
+
19
+ type ThemeOptions<T extends ThemeMode> = {
20
+ storageKey: string;
21
+ defaultTheme: T;
22
+ allowed: readonly T[];
23
+ dataAttribute?: string;
24
+ bodyClass?: string | null;
25
+ };
26
+
27
+ export const getStoredTheme = <T extends ThemeMode>(options: ThemeOptions<T>) => {
28
+ const stored = localStorage.getItem(options.storageKey);
29
+ if (stored && options.allowed.includes(stored as T)) {
30
+ return stored as T;
31
+ }
32
+ if (stored === "dark" && options.allowed.includes("galaxy" as T)) {
33
+ return "galaxy" as T;
34
+ }
35
+ return options.defaultTheme;
36
+ };
37
+
38
+ export const applyTheme = <T extends ThemeMode>(theme: T, options: ThemeOptions<T>) => {
39
+ const dataAttribute = options.dataAttribute ?? "data-theme";
40
+ if (options.bodyClass) {
41
+ document.body.classList.toggle(options.bodyClass, theme === (options.defaultTheme as string));
42
+ }
43
+ document.documentElement.setAttribute(dataAttribute, theme);
44
+ localStorage.setItem(options.storageKey, theme);
45
+ };
package/src/theme.css ADDED
@@ -0,0 +1,353 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --ef-surface: #0b0c1a;
4
+ --ef-surface-soft: rgba(10, 13, 22, 0.78);
5
+ --ef-control-radius: 12px;
6
+ --ef-border-gradient: linear-gradient(135deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
7
+ --ef-border-gradient-reverse: linear-gradient(315deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
8
+ --ef-border-gradient-soft: linear-gradient(
9
+ 135deg,
10
+ rgba(0, 229, 255, 0.6),
11
+ rgba(124, 77, 255, 0.6),
12
+ rgba(255, 77, 210, 0.6),
13
+ rgba(255, 183, 77, 0.6)
14
+ );
15
+ --ef-button-surface: var(--ef-surface);
16
+ --ef-button-border: var(--ef-border-gradient);
17
+ --ef-button-border-soft: var(--ef-border-gradient-soft);
18
+ --ef-button-text: var(--text-strong);
19
+ --ef-button-glow-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
20
+ --ef-button-locked-bg: rgba(15, 18, 28, 0.7);
21
+ --ef-button-locked-border: rgba(255, 255, 255, 0.15);
22
+ --ef-button-locked-text: rgba(255, 255, 255, 0.7);
23
+ --ef-button-danger-border: linear-gradient(135deg, rgba(255, 92, 92, 0.8), rgba(255, 170, 170, 0.7));
24
+ --ef-button-danger-text: #ffd6d6;
25
+ --ef-button-warning-border: linear-gradient(135deg, rgba(255, 183, 77, 0.85), rgba(255, 221, 128, 0.7));
26
+ --ef-button-warning-text: #2b1a00;
27
+ --ef-button-info-border: linear-gradient(135deg, rgba(0, 229, 255, 0.7), rgba(124, 220, 255, 0.7));
28
+ --ef-button-info-text: #021823;
29
+ --ef-button-success-border: linear-gradient(135deg, rgba(76, 255, 200, 0.7), rgba(140, 255, 220, 0.7));
30
+ --ef-button-success-text: #041a10;
31
+ --ef-slider-surface: var(--ef-surface);
32
+ --ef-slider-border-color: var(--line-strong);
33
+ --ef-slider-track-radius: 6px;
34
+ --ef-slider-thumb-radius: 6px;
35
+ --ef-slider-thumb-clip: inset(0);
36
+ --ef-slider-thumb-mask: none;
37
+ --ef-toggle-track-radius: 6px;
38
+ --ef-toggle-thumb-radius: 6px;
39
+ --ef-toggle-box-radius: 6px;
40
+ --ef-toggle-check-radius: 2px;
41
+ --ef-toggle-check-bg: var(--ef-slider-border-color);
42
+ --ef-field-label: rgba(255, 255, 255, 0.7);
43
+ --ef-field-required: rgba(255, 183, 77, 0.95);
44
+ --ef-field-helper: rgba(255, 255, 255, 0.6);
45
+ --ef-field-error: #ff8a8a;
46
+ --ef-input-surface: #0b0c1a;
47
+ --ef-input-border: var(--ef-border-gradient);
48
+ --ef-input-text: #eef1f6;
49
+ --ef-input-placeholder: rgba(246, 245, 255, 0.45);
50
+ --ef-input-focus: rgba(124, 77, 255, 0.55);
51
+ --ef-input-shadow: 0 0 0 2px rgba(124, 77, 255, 0.2);
52
+ --ef-stacked-card-bg: rgba(10, 12, 22, 0.92);
53
+ --ef-stacked-card-shadow: 0 14px 35px rgba(10, 12, 24, 0.6);
54
+ --ef-stacked-card-shadow-hover: 0 20px 45px rgba(10, 12, 24, 0.7);
55
+ --ef-stacked-frame-shadow: 0 18px 40px rgba(10, 12, 24, 0.55);
56
+ --ef-stacked-tag-bg: rgba(15, 18, 28, 0.7);
57
+ --ef-stacked-tag-text: rgba(238, 241, 246, 0.75);
58
+ --ef-stacked-body-muted: rgba(255, 255, 255, 0.7);
59
+ --ef-stacked-action-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
60
+ --ef-stacked-image-gradient: linear-gradient(
61
+ 135deg,
62
+ rgba(0, 229, 255, 0.35),
63
+ rgba(124, 77, 255, 0.35),
64
+ rgba(255, 77, 210, 0.25)
65
+ );
66
+ --text-strong: #f6f5ff;
67
+ --text-soft: rgba(238, 241, 246, 0.75);
68
+ --text-muted: rgba(247, 248, 251, 0.6);
69
+ --card: rgba(10, 13, 22, 0.78);
70
+ --card-border: rgba(124, 77, 255, 0.4);
71
+ --accent: #7c4dff;
72
+ --accent-bright: #00e5ff;
73
+ --accent-warm: #ff4dd2;
74
+ --accent-gold: #ffb74d;
75
+ --shadow: 0 24px 60px rgba(0, 0, 0, 0.35);
76
+ --font-main: "Inter", "Segoe UI", Arial, sans-serif;
77
+ --text: var(--text-strong);
78
+ --muted: var(--text-muted);
79
+ --line: var(--card-border);
80
+ --bg: #0b0f15;
81
+ --bg-soft: #141b26;
82
+ --accent-dark: #5e35ff;
83
+ --accent-alt: var(--accent-gold);
84
+ --accent-soft: rgba(255, 183, 77, 0.18);
85
+ --danger: #e06c6c;
86
+ --radius: 18px;
87
+ --row-odd: rgba(10, 13, 22, 0.9);
88
+ --scrollbar-track: rgba(255, 255, 255, 0.12);
89
+ --bg-glow: rgba(124, 77, 255, 0.18);
90
+ --panel: var(--card);
91
+ --panel-2: rgba(12, 16, 26, 0.9);
92
+ --ink: var(--text-strong);
93
+ --line-strong: var(--accent);
94
+ --accent-2: var(--accent-gold);
95
+ --frame-bg: linear-gradient(180deg, #0b0c1a 0%, #0a0d16 100%);
96
+ --bio-bg: linear-gradient(180deg, #0e101c, #0b0f15 85%);
97
+ --section-bg: linear-gradient(180deg, rgba(15, 18, 28, 0.92), rgba(12, 16, 24, 0.95));
98
+ --note-bg: rgba(10, 13, 22, 0.6);
99
+ --portrait-bg: #0c1322;
100
+ --chip-bg: rgba(12, 16, 26, 0.8);
101
+ --placeholder-bg:
102
+ linear-gradient(135deg, rgba(28, 38, 64, 0.9), rgba(12, 18, 32, 0.95)),
103
+ repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.05) 0px, rgba(255, 255, 255, 0.05) 1px, transparent 1px, transparent 8px);
104
+ --placeholder-ink: #dde6f2;
105
+ --menu-card: var(--card);
106
+ --menu-line: var(--card-border);
107
+ --menu-shadow: var(--shadow);
108
+ --menu-bg-soft: rgba(124, 77, 255, 0.12);
109
+ --menu-radius: 18px;
110
+ --menu-muted: var(--text-muted);
111
+ }
112
+
113
+ :root[data-theme="light"],
114
+ :root[data-theme="plain-light"] {
115
+ color-scheme: light;
116
+ --ef-control-radius: 12px;
117
+ --ef-surface: #ffffff;
118
+ --ef-surface-soft: rgba(255, 255, 255, 0.92);
119
+ --ef-border-gradient: linear-gradient(135deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
120
+ --ef-border-gradient-reverse: linear-gradient(315deg, #00e5ff, #7c4dff, #ff4dd2, #ffb74d);
121
+ --ef-border-gradient-soft: linear-gradient(
122
+ 135deg,
123
+ rgba(0, 229, 255, 0.6),
124
+ rgba(124, 77, 255, 0.6),
125
+ rgba(255, 77, 210, 0.6),
126
+ rgba(255, 183, 77, 0.6)
127
+ );
128
+ --ef-button-text: #1d232a;
129
+ --ef-button-glow-shadow: 0 0 20px rgba(124, 77, 255, 0.32);
130
+ --ef-button-locked-bg: rgba(255, 255, 255, 0.8);
131
+ --ef-button-locked-border: rgba(24, 32, 40, 0.18);
132
+ --ef-button-locked-text: rgba(24, 32, 40, 0.6);
133
+ --ef-button-danger-border: linear-gradient(135deg, rgba(200, 76, 76, 0.7), rgba(255, 138, 138, 0.65));
134
+ --ef-button-danger-text: #5a0f0f;
135
+ --ef-button-warning-border: linear-gradient(135deg, rgba(242, 159, 69, 0.75), rgba(255, 210, 128, 0.7));
136
+ --ef-button-warning-text: #4a2c00;
137
+ --ef-button-info-border: linear-gradient(135deg, rgba(0, 180, 210, 0.6), rgba(124, 180, 255, 0.6));
138
+ --ef-button-info-text: #0b2a3a;
139
+ --ef-button-success-border: linear-gradient(135deg, rgba(46, 170, 130, 0.65), rgba(130, 220, 180, 0.65));
140
+ --ef-button-success-text: #0b2b1d;
141
+ --ef-slider-surface: var(--ef-surface);
142
+ --ef-slider-border-color: var(--line-strong);
143
+ --ef-slider-track-radius: 6px;
144
+ --ef-slider-thumb-radius: 6px;
145
+ --ef-slider-thumb-clip: inset(0);
146
+ --ef-slider-thumb-mask: none;
147
+ --ef-toggle-track-radius: 6px;
148
+ --ef-toggle-thumb-radius: 6px;
149
+ --ef-toggle-box-radius: 6px;
150
+ --ef-toggle-check-radius: 2px;
151
+ --ef-toggle-check-bg: var(--ef-slider-border-color);
152
+ --ef-field-label: rgba(29, 35, 42, 0.7);
153
+ --ef-field-required: rgba(242, 159, 69, 0.9);
154
+ --ef-field-helper: rgba(29, 35, 42, 0.6);
155
+ --ef-field-error: #b83a3a;
156
+ --ef-input-surface: #ffffff;
157
+ --ef-input-border: var(--ef-border-gradient);
158
+ --ef-input-text: #1d232a;
159
+ --ef-input-placeholder: rgba(29, 35, 42, 0.45);
160
+ --ef-input-focus: rgba(31, 122, 140, 0.3);
161
+ --ef-input-shadow: 0 0 0 2px rgba(31, 122, 140, 0.14);
162
+ --ef-field-label: rgba(29, 35, 42, 0.7);
163
+ --ef-field-helper: rgba(29, 35, 42, 0.55);
164
+ --ef-field-error: #b34a4a;
165
+ --ef-stacked-card-bg: rgba(10, 12, 22, 0.92);
166
+ --ef-stacked-card-shadow: 0 14px 35px rgba(10, 12, 24, 0.6);
167
+ --ef-stacked-card-shadow-hover: 0 20px 45px rgba(10, 12, 24, 0.7);
168
+ --ef-stacked-frame-shadow: 0 18px 40px rgba(10, 12, 24, 0.55);
169
+ --ef-stacked-tag-bg: rgba(15, 18, 28, 0.7);
170
+ --ef-stacked-tag-text: rgba(238, 241, 246, 0.75);
171
+ --ef-stacked-body-muted: rgba(255, 255, 255, 0.7);
172
+ --ef-stacked-action-shadow: 0 0 24px rgba(124, 77, 255, 0.45);
173
+ --ef-stacked-image-gradient: linear-gradient(
174
+ 135deg,
175
+ rgba(0, 229, 255, 0.35),
176
+ rgba(124, 77, 255, 0.35),
177
+ rgba(255, 77, 210, 0.25)
178
+ );
179
+ --text-strong: #1d232a;
180
+ --text-soft: rgba(29, 35, 42, 0.75);
181
+ --text-muted: rgba(29, 35, 42, 0.6);
182
+ --card: rgba(255, 255, 255, 0.9);
183
+ --card-border: rgba(24, 32, 40, 0.12);
184
+ --shadow: 0 20px 50px rgba(24, 32, 40, 0.12);
185
+ --text: var(--text-strong);
186
+ --muted: var(--text-muted);
187
+ --line: rgba(24, 32, 40, 0.18);
188
+ --bg: #f4f1ea;
189
+ --bg-soft: #fbf7f0;
190
+ --accent-dark: #1f7a8c;
191
+ --accent-alt: #f29f45;
192
+ --accent-soft: rgba(242, 159, 69, 0.18);
193
+ --danger: #c84c4c;
194
+ --row-odd: rgba(255, 255, 255, 0.95);
195
+ --scrollbar-track: rgba(24, 32, 40, 0.08);
196
+ --bg-glow: rgba(31, 122, 140, 0.16);
197
+ --panel: var(--card);
198
+ --panel-2: rgba(255, 255, 255, 0.94);
199
+ --ink: var(--text-strong);
200
+ --line-strong: var(--accent);
201
+ --accent-2: var(--accent-alt);
202
+ --frame-bg: linear-gradient(180deg, #ffffff 0%, #f6ede1 100%);
203
+ --bio-bg: linear-gradient(180deg, #ffffff, #f9f6f0 85%);
204
+ --section-bg: linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(249, 246, 240, 0.96));
205
+ --note-bg: rgba(255, 255, 255, 0.8);
206
+ --portrait-bg: #e7ecf2;
207
+ --chip-bg: rgba(255, 255, 255, 0.9);
208
+ --placeholder-bg:
209
+ linear-gradient(135deg, rgba(210, 225, 245, 0.9), rgba(240, 244, 248, 0.95)),
210
+ repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.04) 0px, rgba(0, 0, 0, 0.04) 1px, transparent 1px, transparent 8px);
211
+ --placeholder-ink: #2b3440;
212
+ --menu-card: rgba(255, 255, 255, 0.88);
213
+ --menu-line: rgba(24, 32, 40, 0.12);
214
+ --menu-shadow: 0 16px 40px rgba(23, 28, 33, 0.12);
215
+ --menu-bg-soft: #f9f6f0;
216
+ --menu-radius: 18px;
217
+ --menu-muted: var(--text-muted);
218
+ }
219
+
220
+ :root[data-theme="plain-light"] {
221
+ --ef-border-gradient: linear-gradient(135deg, var(--line), var(--line));
222
+ --ef-border-gradient-reverse: linear-gradient(315deg, var(--line), var(--line));
223
+ --ef-border-gradient-soft: linear-gradient(
224
+ 135deg,
225
+ rgba(24, 32, 40, 0.18),
226
+ rgba(24, 32, 40, 0.18)
227
+ );
228
+ --ef-button-border: var(--ef-border-gradient);
229
+ --ef-button-border-soft: var(--ef-border-gradient-soft);
230
+ --ef-input-border: var(--ef-border-gradient);
231
+ --ef-stacked-image-gradient: linear-gradient(135deg, rgba(24, 32, 40, 0.08), rgba(24, 32, 40, 0.15));
232
+ }
233
+
234
+ :root[data-theme="plain-dark"] {
235
+ color-scheme: dark;
236
+ --card-border: rgba(255, 255, 255, 0.16);
237
+ --line: rgba(255, 255, 255, 0.2);
238
+ --line-strong: rgba(255, 255, 255, 0.35);
239
+ --ef-border-gradient: linear-gradient(135deg, var(--line-strong), var(--line-strong));
240
+ --ef-border-gradient-reverse: linear-gradient(315deg, var(--line-strong), var(--line-strong));
241
+ --ef-border-gradient-soft: linear-gradient(
242
+ 135deg,
243
+ rgba(255, 255, 255, 0.18),
244
+ rgba(255, 255, 255, 0.18)
245
+ );
246
+ --ef-button-border: var(--ef-border-gradient);
247
+ --ef-button-border-soft: var(--ef-border-gradient-soft);
248
+ --ef-input-border: var(--ef-border-gradient);
249
+ --menu-line: var(--line);
250
+ --menu-bg-soft: rgba(255, 255, 255, 0.06);
251
+ --ef-stacked-image-gradient: linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.12));
252
+ }
253
+
254
+
255
+
256
+ :root[data-theme="atelier"] {
257
+ color-scheme: dark;
258
+ --ef-control-radius: 0px;
259
+ --ef-surface: #1b0b18;
260
+ --ef-surface-soft: rgba(27, 11, 24, 0.92);
261
+ --ef-border-gradient: linear-gradient(135deg, #ff86c8, #e255a1, #7dd6f6);
262
+ --ef-border-gradient-reverse: linear-gradient(315deg, #ff86c8, #e255a1, #7dd6f6);
263
+ --ef-border-gradient-soft: linear-gradient(
264
+ 135deg,
265
+ rgba(255, 134, 200, 0.5),
266
+ rgba(226, 85, 161, 0.5),
267
+ rgba(125, 214, 246, 0.5)
268
+ );
269
+ --ef-slider-surface: var(--ef-surface);
270
+ --ef-slider-border-color: var(--line-strong);
271
+ --ef-slider-track-radius: 0px;
272
+ --ef-slider-thumb-radius: 0px;
273
+ --ef-slider-thumb-clip: inset(0);
274
+ --ef-slider-thumb-mask: none;
275
+ --ef-toggle-track-radius: 0px;
276
+ --ef-toggle-thumb-radius: 0px;
277
+ --ef-toggle-box-radius: 0px;
278
+ --ef-toggle-check-radius: 0px;
279
+ --ef-toggle-check-bg: var(--ef-slider-border-color);
280
+ --ef-button-surface: var(--ef-surface);
281
+ --ef-button-border: var(--ef-border-gradient);
282
+ --ef-button-border-soft: var(--ef-border-gradient-soft);
283
+ --ef-button-text: #f6eaf2;
284
+ --ef-button-glow-shadow: 0 0 24px rgba(226, 85, 161, 0.42);
285
+ --ef-input-surface: #1b0b18;
286
+ --ef-input-border: var(--ef-border-gradient);
287
+ --ef-input-text: #f6eaf2;
288
+ --ef-input-placeholder: rgba(246, 234, 242, 0.6);
289
+ --ef-input-focus: rgba(226, 85, 161, 0.45);
290
+ --ef-input-shadow: 0 0 0 2px rgba(226, 85, 161, 0.2);
291
+ --text-strong: #f6eaf2;
292
+ --text-soft: rgba(246, 234, 242, 0.8);
293
+ --text-muted: #dbc7d7;
294
+ --card: #1b0b18;
295
+ --card-border: rgba(192, 59, 132, 0.6);
296
+ --accent: #ff86c8;
297
+ --accent-bright: #7dd6f6;
298
+ --accent-warm: #e255a1;
299
+ --accent-gold: #ff86c8;
300
+ --shadow: rgba(0, 0, 0, 0.6);
301
+ --text: #f6eaf2;
302
+ --muted: #dbc7d7;
303
+ --line: #c03b84;
304
+ --bg: #130810;
305
+ --bg-soft: #241028;
306
+ --accent-dark: #c03b84;
307
+ --accent-alt: #7dd6f6;
308
+ --accent-soft: rgba(255, 134, 200, 0.18);
309
+ --danger: #e06c6c;
310
+ --radius: 18px;
311
+ --row-odd: rgba(27, 11, 24, 0.85);
312
+ --scrollbar-track: rgba(255, 255, 255, 0.08);
313
+ --bg-glow: #2a0f21;
314
+ --panel: #1b0b18;
315
+ --panel-2: #241028;
316
+ --ink: #f6eaf2;
317
+ --line-strong: #e255a1;
318
+ --accent-2: #7dd6f6;
319
+ --frame-bg: linear-gradient(180deg, #220b1a 0%, #12070f 100%);
320
+ --bio-bg: linear-gradient(180deg, #1a0b1b, #12070f 85%);
321
+ --section-bg: linear-gradient(180deg, rgba(35, 14, 32, 0.94), rgba(20, 9, 18, 0.95));
322
+ --note-bg: rgba(16, 7, 14, 0.6);
323
+ --portrait-bg: #131a2c;
324
+ --chip-bg: rgba(17, 9, 20, 0.8);
325
+ --placeholder-bg:
326
+ linear-gradient(135deg, rgba(60, 78, 108, 0.9), rgba(20, 30, 50, 0.95)),
327
+ repeating-linear-gradient(
328
+ 0deg,
329
+ rgba(255, 255, 255, 0.06) 0px,
330
+ rgba(255, 255, 255, 0.06) 1px,
331
+ transparent 1px,
332
+ transparent 8px
333
+ );
334
+ --placeholder-ink: #dde6f2;
335
+ --menu-card: #1b0b18;
336
+ --menu-line: rgba(192, 59, 132, 0.5);
337
+ --menu-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);
338
+ --menu-bg-soft: rgba(255, 134, 200, 0.12);
339
+ --menu-radius: 18px;
340
+ --menu-muted: #dbc7d7;
341
+ }
342
+
343
+ :root[data-theme="galaxy"] {
344
+ --ef-slider-track-radius: 6px;
345
+ --ef-slider-thumb-radius: 6px;
346
+ --ef-slider-thumb-clip: inset(0);
347
+ --ef-slider-thumb-mask: none;
348
+ --ef-toggle-track-radius: 6px;
349
+ --ef-toggle-thumb-radius: 6px;
350
+ --ef-toggle-box-radius: 6px;
351
+ --ef-toggle-check-radius: 2px;
352
+ }
353
+
package/styles.css CHANGED
@@ -7,6 +7,7 @@
7
7
  @import "./src/components/Input.css";
8
8
  @import "./src/components/Toggle.css";
9
9
  @import "./src/components/Slider.css";
10
+ @import "./src/components/Tabs.css";
10
11
  @import "./src/components/StackedCard.css";
11
12
  @import "./src/components/Panel.css";
12
13
  @import "./src/components/Modal.css";