@fluixi-ui/tokens 0.4.0-alpha.1 → 0.4.0-alpha.3

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.
@@ -31,9 +31,9 @@
31
31
  border-radius: var(--flx-ui-radius-md);
32
32
  cursor: pointer;
33
33
  user-select: none;
34
- transition: background var(--flx-ui-duration-fast) var(--flx-ui-easing-standard),
35
- color var(--flx-ui-duration-fast) var(--flx-ui-easing-standard),
36
- border-color var(--flx-ui-duration-fast) var(--flx-ui-easing-standard);
34
+ transition: background var(--flx-ui-duration-fast) var(--flx-ui-ease-standard),
35
+ color var(--flx-ui-duration-fast) var(--flx-ui-ease-standard),
36
+ border-color var(--flx-ui-duration-fast) var(--flx-ui-ease-standard);
37
37
  }
38
38
  :where([data-pagination-page]:hover:not([disabled])),
39
39
  :where([data-pagination-prev]:hover:not([disabled])),
@@ -33,9 +33,13 @@
33
33
  box-shadow: var(--flx-ui-ctl-ring);
34
34
  }
35
35
  :where(button[role='combobox'])::after {
36
- content: '▾';
37
- color: var(--flx-ui-color-fg-muted);
38
- font-size: 0.8em;
36
+ content: '';
37
+ width: 1.15em;
38
+ height: 1.15em;
39
+ flex: none;
40
+ background: var(--flx-ui-color-fg-muted);
41
+ -webkit-mask: var(--flx-ui-chevron-down) center / contain no-repeat;
42
+ mask: var(--flx-ui-chevron-down) center / contain no-repeat;
39
43
  }
40
44
  :where([data-select-value][data-placeholder]) {
41
45
  color: var(--flx-ui-color-fg-muted);
@@ -65,12 +69,23 @@
65
69
  color: var(--flx-ui-color-fg-muted);
66
70
  }
67
71
  :where([data-combobox-control] > button) {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ justify-content: center;
68
75
  border: none;
69
76
  background: none;
70
77
  cursor: pointer;
71
78
  color: var(--flx-ui-color-fg-muted);
72
79
  padding: 0 var(--flx-ui-space-1);
73
- font-size: 0.8em;
74
80
  border-radius: var(--flx-ui-radius-sm);
75
81
  }
82
+ /* When the trigger has no custom content, show the shared theme chevron. */
83
+ :where([data-combobox-control] > button:empty)::after {
84
+ content: '';
85
+ width: 1.15em;
86
+ height: 1.15em;
87
+ background: currentColor;
88
+ -webkit-mask: var(--flx-ui-chevron-down) center / contain no-repeat;
89
+ mask: var(--flx-ui-chevron-down) center / contain no-repeat;
90
+ }
76
91
  }
@@ -3,9 +3,13 @@
3
3
  * Sidenav (persistent navigation rail)
4
4
  * ------------------------------------------------------------------------- */
5
5
  :where([data-sidenav]) {
6
+ /* Exposed so a consumer's shell can read the live rail width (it also drives the
7
+ rail's own width, so an in-flow flex/grid sidebar makes the main area adapt
8
+ automatically as this transitions). */
9
+ --flx-ui-sidenav-width: 16rem;
6
10
  display: flex;
7
11
  flex-direction: column;
8
- width: 16rem;
12
+ width: var(--flx-ui-sidenav-width);
9
13
  height: 100%;
10
14
  background: var(--flx-ui-color-bg);
11
15
  color: var(--flx-ui-color-fg);
@@ -17,8 +21,14 @@
17
21
  :where([data-sidenav][data-side='right']) {
18
22
  border-left: var(--flx-ui-border-width-thin) solid var(--flx-ui-color-border);
19
23
  }
20
- :where([data-sidenav][data-collapsed]) {
21
- width: 3.75rem;
24
+ /* Compact = icon rail. Hidden = fully off-canvas (zero width, content clipped). */
25
+ :where([data-sidenav][data-state='compact']) {
26
+ --flx-ui-sidenav-width: 3.75rem;
27
+ }
28
+ :where([data-sidenav][data-state='hidden']) {
29
+ --flx-ui-sidenav-width: 0px;
30
+ overflow: hidden;
31
+ border-inline-width: 0;
22
32
  }
23
33
 
24
34
  :where([data-sidenav-header]) {
@@ -115,13 +125,126 @@
115
125
  outline-offset: 2px;
116
126
  }
117
127
 
118
- /* Collapsed rail: hide text labels, center the icons. */
119
- :where([data-sidenav][data-collapsed] [data-sidenav-label]),
120
- :where([data-sidenav][data-collapsed] [data-sidenav-group-label]) {
128
+ /* Compact icon rail: hide text labels, center the icons. Scoped to `compact` (not
129
+ the mobile drawer, which presents full-width) — `hidden` is clipped anyway. */
130
+ :where([data-sidenav][data-state='compact']:not([data-mobile]) [data-sidenav-label]),
131
+ :where([data-sidenav][data-state='compact']:not([data-mobile]) [data-sidenav-group-label]) {
121
132
  display: none;
122
133
  }
123
- :where([data-sidenav][data-collapsed] [data-sidenav-link]) {
134
+ :where([data-sidenav][data-state='compact']:not([data-mobile]) [data-sidenav-link]) {
124
135
  justify-content: center;
125
136
  padding-inline: 0;
126
137
  }
138
+
139
+ /* ── Nested items (submenus) ──────────────────────────────────────────────── */
140
+ /* The parent row reuses [data-sidenav-link] styling; add the disclosure chevron. */
141
+ :where([data-sidenav-sub-trigger]) {
142
+ width: 100%;
143
+ border: 0;
144
+ background: transparent;
145
+ font: inherit;
146
+ text-align: start;
147
+ cursor: pointer;
148
+ }
149
+ :where([data-sidenav-sub-trigger])::after {
150
+ content: '';
151
+ margin-inline-start: auto;
152
+ width: 1em;
153
+ height: 1em;
154
+ flex-shrink: 0;
155
+ background: currentColor;
156
+ mask: var(--flx-ui-chevron-down, none) center / contain no-repeat;
157
+ -webkit-mask: var(--flx-ui-chevron-down, none) center / contain no-repeat;
158
+ transition: transform var(--flx-ui-duration-fast) var(--flx-ui-ease-standard);
159
+ }
160
+ :where([data-sidenav-sub-trigger][data-open])::after {
161
+ transform: rotate(180deg);
162
+ }
163
+ /* Hide the chevron on the compact rail (the flyout replaces it). */
164
+ :where([data-sidenav][data-state='compact']:not([data-mobile]) [data-sidenav-sub-trigger])::after {
165
+ display: none;
166
+ }
167
+
168
+ /* Inline nested list (expanded / mobile). Collapsed via grid-rows so it animates. */
169
+ :where([data-sidenav-sub-content]:not([data-flyout])) {
170
+ display: grid;
171
+ grid-template-rows: 0fr;
172
+ margin: 0;
173
+ padding: 0 0 0 var(--flx-ui-space-5);
174
+ list-style: none;
175
+ overflow: hidden;
176
+ transition: grid-template-rows var(--flx-ui-duration-normal) var(--flx-ui-ease-standard);
177
+ }
178
+ :where([data-sidenav-sub-content]:not([data-flyout])[data-open]) {
179
+ grid-template-rows: 1fr;
180
+ }
181
+ :where([data-sidenav-sub-content]:not([data-flyout]) > *) {
182
+ min-height: 0;
183
+ }
184
+
185
+ /* Flyout panel (compact rail): a floating anchored menu of the nested links. */
186
+ :where([data-sidenav-sub-content][data-flyout]) {
187
+ position: absolute;
188
+ z-index: var(--flx-ui-z-popover, 40);
189
+ min-width: 12rem;
190
+ margin: 0;
191
+ padding: var(--flx-ui-space-1);
192
+ list-style: none;
193
+ display: flex;
194
+ flex-direction: column;
195
+ gap: var(--flx-ui-space-1);
196
+ background: var(--flx-ui-color-bg);
197
+ border: var(--flx-ui-border-width-thin) solid var(--flx-ui-color-border);
198
+ border-radius: var(--flx-ui-radius-lg);
199
+ box-shadow: var(--flx-ui-shadow-lg);
200
+ }
201
+
202
+ /* ── Mobile overlay drawer ────────────────────────────────────────────────── */
203
+ :where([data-sidenav-overlay]) {
204
+ position: fixed;
205
+ inset: 0;
206
+ z-index: var(--flx-ui-z-modal, 50);
207
+ }
208
+ :where([data-sidenav-overlay][data-state='closed']) {
209
+ pointer-events: none;
210
+ }
211
+ :where([data-sidenav-backdrop]) {
212
+ position: fixed;
213
+ inset: 0;
214
+ background: var(--flx-ui-color-overlay);
215
+ opacity: 0;
216
+ transition: opacity var(--flx-ui-duration-normal) var(--flx-ui-ease-standard);
217
+ }
218
+ :where([data-sidenav-backdrop][data-state='open']) {
219
+ opacity: 1;
220
+ }
221
+ /* The overlay rail is full-height, positioned against its side, always expanded. */
222
+ :where([data-sidenav][data-mobile]) {
223
+ position: fixed;
224
+ top: 0;
225
+ bottom: 0;
226
+ --flx-ui-sidenav-width: 16rem;
227
+ max-width: 85vw;
228
+ box-shadow: var(--flx-ui-shadow-xl);
229
+ animation: flx-sidenav-in var(--flx-ui-duration-normal) var(--flx-ui-ease-standard);
230
+ }
231
+ :where([data-sidenav][data-mobile][data-side='left']) {
232
+ left: 0;
233
+ }
234
+ :where([data-sidenav][data-mobile][data-side='right']) {
235
+ right: 0;
236
+ }
237
+ @keyframes flx-sidenav-in {
238
+ from {
239
+ transform: translateX(var(--flx-ui-sidenav-enter-x, -100%));
240
+ }
241
+ }
242
+ :where([data-sidenav][data-mobile][data-side='right']) {
243
+ --flx-ui-sidenav-enter-x: 100%;
244
+ }
245
+ @media (prefers-reduced-motion: reduce) {
246
+ :where([data-sidenav][data-mobile]) {
247
+ animation: none;
248
+ }
249
+ }
127
250
  }
@@ -66,9 +66,9 @@
66
66
  font-size: var(--flx-ui-font-size-sm);
67
67
  font-weight: var(--flx-ui-font-weight-medium);
68
68
  line-height: 1;
69
- transition: background var(--flx-ui-duration-fast) var(--flx-ui-easing-standard),
70
- border-color var(--flx-ui-duration-fast) var(--flx-ui-easing-standard),
71
- color var(--flx-ui-duration-fast) var(--flx-ui-easing-standard);
69
+ transition: background var(--flx-ui-duration-fast) var(--flx-ui-ease-standard),
70
+ border-color var(--flx-ui-duration-fast) var(--flx-ui-ease-standard),
71
+ color var(--flx-ui-duration-fast) var(--flx-ui-ease-standard);
72
72
  }
73
73
  :where([data-stepper-indicator][data-state='active']) {
74
74
  border-color: var(--flx-ui-color-primary);
@@ -0,0 +1,71 @@
1
+ @layer flx.components {
2
+ /* ----------------------------------------------------------------------------
3
+ * Surface — an elevated container primitive. Background + radius are always set;
4
+ * elevation (shadow) and border are opt-in via data attributes, so it backs
5
+ * everything from a flat panel to a raised card or floating sheet.
6
+ * ------------------------------------------------------------------------- */
7
+ :where([data-surface]) {
8
+ background: var(--flx-ui-color-bg);
9
+ color: var(--flx-ui-color-fg);
10
+ border-radius: var(--flx-ui-radius-lg);
11
+ transition:
12
+ box-shadow var(--flx-ui-duration-fast) var(--flx-ui-ease-standard),
13
+ border-color var(--flx-ui-duration-fast) var(--flx-ui-ease-standard);
14
+ }
15
+ :where([data-surface][data-bordered]) {
16
+ border: var(--flx-ui-border-width-thin) solid var(--flx-ui-color-border);
17
+ }
18
+
19
+ :where([data-surface][data-radius='none']) {
20
+ border-radius: 0;
21
+ }
22
+ :where([data-surface][data-radius='sm']) {
23
+ border-radius: var(--flx-ui-radius-sm);
24
+ }
25
+ :where([data-surface][data-radius='md']) {
26
+ border-radius: var(--flx-ui-radius-md);
27
+ }
28
+ :where([data-surface][data-radius='lg']) {
29
+ border-radius: var(--flx-ui-radius-lg);
30
+ }
31
+ :where([data-surface][data-radius='xl']) {
32
+ border-radius: var(--flx-ui-radius-xl);
33
+ }
34
+ :where([data-surface][data-radius='full']) {
35
+ border-radius: var(--flx-ui-radius-full);
36
+ }
37
+
38
+ :where([data-surface][data-elevation='0']) {
39
+ box-shadow: none;
40
+ }
41
+ :where([data-surface][data-elevation='1']) {
42
+ box-shadow: var(--flx-ui-shadow-sm);
43
+ }
44
+ :where([data-surface][data-elevation='2']) {
45
+ box-shadow: var(--flx-ui-shadow-md);
46
+ }
47
+ :where([data-surface][data-elevation='3']) {
48
+ box-shadow: var(--flx-ui-shadow-lg);
49
+ }
50
+ :where([data-surface][data-elevation='4']) {
51
+ box-shadow: var(--flx-ui-shadow-xl);
52
+ }
53
+
54
+ /* In dark, shadows barely read on a near-black page, so elevation is tonal — the
55
+ surface lightens as it rises — with a hairline edge for definition. */
56
+ [data-theme='dark'] :where([data-surface][data-elevation='1']) {
57
+ background: var(--flx-ui-gray-2);
58
+ }
59
+ [data-theme='dark'] :where([data-surface][data-elevation='2']) {
60
+ background: var(--flx-ui-gray-3);
61
+ }
62
+ [data-theme='dark'] :where([data-surface][data-elevation='3']) {
63
+ background: var(--flx-ui-gray-4);
64
+ }
65
+ [data-theme='dark'] :where([data-surface][data-elevation='4']) {
66
+ background: var(--flx-ui-gray-5);
67
+ }
68
+ [data-theme='dark'] :where([data-surface]:not([data-elevation='0']):not([data-bordered])) {
69
+ border: var(--flx-ui-border-width-thin) solid var(--flx-ui-color-border);
70
+ }
71
+ }
@@ -30,4 +30,16 @@
30
30
  :where([role='switch'][data-state='checked'])::after {
31
31
  transform: translateX(16px);
32
32
  }
33
+ :where([role='switch']:hover:not([data-disabled])) {
34
+ background: var(--flx-ui-color-border-strong);
35
+ filter: brightness(0.97);
36
+ }
37
+ :where([role='switch']:focus-visible) {
38
+ outline: none;
39
+ box-shadow: var(--flx-ui-ctl-ring);
40
+ }
41
+ :where([role='switch'][data-disabled]) {
42
+ opacity: var(--flx-ui-opacity-disabled);
43
+ cursor: not-allowed;
44
+ }
33
45
  }
package/dist/css/tabs.css CHANGED
@@ -19,13 +19,22 @@
19
19
  margin-bottom: -1px;
20
20
  transition: color var(--flx-ui-duration-fast) var(--flx-ui-ease-standard);
21
21
  }
22
- :where([role='tab']:hover) {
22
+ :where([role='tab']:hover:not([data-disabled])) {
23
23
  color: var(--flx-ui-color-fg);
24
24
  }
25
+ :where([role='tab']:focus-visible) {
26
+ outline: none;
27
+ border-radius: var(--flx-ui-radius-sm);
28
+ box-shadow: var(--flx-ui-ctl-ring);
29
+ }
25
30
  :where([role='tab'][data-state='active']) {
26
31
  color: var(--flx-ui-color-primary-active);
27
32
  border-bottom-color: var(--flx-ui-color-primary);
28
33
  }
34
+ :where([role='tab'][data-disabled]) {
35
+ opacity: var(--flx-ui-opacity-disabled);
36
+ cursor: not-allowed;
37
+ }
29
38
  :where([role='tabpanel']) {
30
39
  padding: var(--flx-ui-space-4) 0;
31
40
  }
@@ -34,6 +34,12 @@
34
34
  border-color: var(--flx-ui-color-primary);
35
35
  color: var(--flx-ui-color-primary-active);
36
36
  }
37
+ :where([aria-pressed]:focus-visible) {
38
+ outline: none;
39
+ position: relative;
40
+ z-index: 2;
41
+ box-shadow: var(--flx-ui-ctl-ring);
42
+ }
37
43
  :where([aria-pressed][data-disabled]) {
38
44
  opacity: var(--flx-ui-opacity-disabled);
39
45
  pointer-events: none;
@@ -1,20 +1,16 @@
1
1
  export declare const TOKEN_PREFIX = "flx-ui";
2
2
  /**
3
- * Cascade layer order (low → high): tokens (vars) → components (the default
4
- * "fluixi" look, `preset.css`) → skin (an alternate skin's overrides, e.g.
3
+ * Cascade layer order (low → high): base (a CSS reset, e.g. fluixi-css's — we
4
+ * reserve the slot but never fill it, so a reset always sits below our
5
+ * components) → tokens (vars) → components (the default "fluixi" look,
6
+ * `preset.css`) → skin (an alternate skin's overrides, e.g.
5
7
  * `@fluixi-ui/skin-material`). Consumer CSS stays unlayered, so it always wins.
6
8
  * Declared first in every stylesheet we emit so ordering is deterministic
7
9
  * regardless of load order; redeclarations are no-ops.
8
10
  */
9
- export declare const LAYER_ORDER = "@layer flx.tokens, flx.components, flx.skin;";
11
+ export declare const LAYER_ORDER = "@layer flx.base, flx.tokens, flx.components, flx.skin;";
10
12
  export declare function cssVar(name: string): string;
11
13
  export declare function cssVarRef(name: string): string;
12
- /**
13
- * Generate the full token stylesheet: static reference tokens and the light
14
- * scales plus semantic aliases on `:root`, with dark and high-contrast themes
15
- * overriding only the scales (and a few semantics). Dark also applies
16
- * automatically via `prefers-color-scheme` when no explicit theme is set.
17
- */
18
14
  export declare function generateTokensCss(): string;
19
15
  export declare const tokensCss: string;
20
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/css/index.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,iDAAiD,CAAC;AAE1E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AA4FD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAkC1C;AAED,eAAO,MAAM,SAAS,EAAE,MAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/css/index.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,2DAA2D,CAAC;AAEpF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AA4GD,wBAAgB,iBAAiB,IAAI,MAAM,CAmC1C;AAED,eAAO,MAAM,SAAS,EAAE,MAA4B,CAAC"}
@@ -2,13 +2,15 @@ import { staticTokens } from '../reference/index.js';
2
2
  import { accentPresets, colorScales, semanticColors, semanticOverrides, } from '../reference/colors.js';
3
3
  export const TOKEN_PREFIX = 'flx-ui';
4
4
  /**
5
- * Cascade layer order (low → high): tokens (vars) → components (the default
6
- * "fluixi" look, `preset.css`) → skin (an alternate skin's overrides, e.g.
5
+ * Cascade layer order (low → high): base (a CSS reset, e.g. fluixi-css's — we
6
+ * reserve the slot but never fill it, so a reset always sits below our
7
+ * components) → tokens (vars) → components (the default "fluixi" look,
8
+ * `preset.css`) → skin (an alternate skin's overrides, e.g.
7
9
  * `@fluixi-ui/skin-material`). Consumer CSS stays unlayered, so it always wins.
8
10
  * Declared first in every stylesheet we emit so ordering is deterministic
9
11
  * regardless of load order; redeclarations are no-ops.
10
12
  */
11
- export const LAYER_ORDER = '@layer flx.tokens, flx.components, flx.skin;';
13
+ export const LAYER_ORDER = '@layer flx.base, flx.tokens, flx.components, flx.skin;';
12
14
  export function cssVar(name) {
13
15
  return `--${TOKEN_PREFIX}-${name}`;
14
16
  }
@@ -105,6 +107,15 @@ function accentBlocks(name, preset) {
105
107
  * overriding only the scales (and a few semantics). Dark also applies
106
108
  * automatically via `prefers-color-scheme` when no explicit theme is set.
107
109
  */
110
+ // A dark shadow on a dark surface is nearly invisible, so dark mode needs its
111
+ // own elevation: pure black at a much higher alpha with more spread, which reads
112
+ // as a halo of shade around a raised surface instead of a faint drop.
113
+ const darkShadows = {
114
+ [cssVar('shadow-sm')]: '0 1px 2px rgba(0, 0, 0, 0.4)',
115
+ [cssVar('shadow-md')]: '0 2px 6px rgba(0, 0, 0, 0.44), 0 1px 2px rgba(0, 0, 0, 0.3)',
116
+ [cssVar('shadow-lg')]: '0 8px 20px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.36)',
117
+ [cssVar('shadow-xl')]: '0 16px 36px rgba(0, 0, 0, 0.6), 0 4px 12px rgba(0, 0, 0, 0.42)',
118
+ };
108
119
  export function generateTokensCss() {
109
120
  const root = block(":root, [data-theme='light']", {
110
121
  ...staticVars(),
@@ -118,13 +129,14 @@ export function generateTokensCss() {
118
129
  ...scaleVars('dark'),
119
130
  ...semanticVars(),
120
131
  ...overrideVars('dark'),
132
+ ...darkShadows,
121
133
  });
122
134
  const highContrast = block("[data-theme='high-contrast']", {
123
135
  ...scaleVars('high-contrast'),
124
136
  ...semanticVars(),
125
137
  ...overrideVars('high-contrast'),
126
138
  });
127
- const autoDark = `@media (prefers-color-scheme: dark) {\n${block(':root:not([data-theme])', { ...scaleVars('dark'), ...semanticVars(), ...overrideVars('dark') })
139
+ const autoDark = `@media (prefers-color-scheme: dark) {\n${block(':root:not([data-theme])', { ...scaleVars('dark'), ...semanticVars(), ...overrideVars('dark'), ...darkShadows })
128
140
  .split('\n')
129
141
  .map((line) => ` ${line}`)
130
142
  .join('\n')}\n}`;
@@ -104,7 +104,7 @@ export const semanticColors = {
104
104
  'color-fg': 'var(--flx-ui-gray-12)',
105
105
  'color-fg-muted': 'var(--flx-ui-gray-11)',
106
106
  'color-border': 'var(--flx-ui-gray-6)',
107
- 'color-border-strong': 'var(--flx-ui-gray-8)',
107
+ 'color-border-strong': 'var(--flx-ui-gray-7)',
108
108
  'color-focus-ring': 'var(--flx-ui-accent-8)',
109
109
  'color-primary': 'var(--flx-ui-accent-9)',
110
110
  'color-primary-hover': 'var(--flx-ui-accent-10)',
package/dist/preset.css CHANGED
@@ -7,7 +7,7 @@
7
7
  * non-bundler consumers get every component's CSS in one import.
8
8
  */
9
9
 
10
- @layer flx.tokens, flx.components, flx.skin;
10
+ @layer flx.base, flx.tokens, flx.components, flx.skin;
11
11
 
12
12
  @import './css/base.css';
13
13
  @import './css/button.css';
@@ -32,7 +32,9 @@
32
32
  @import './css/separator.css';
33
33
  @import './css/breadcrumb.css';
34
34
  @import './css/pagination.css';
35
+ @import './css/surface.css';
35
36
  @import './css/card.css';
37
+ @import './css/glow.css';
36
38
  @import './css/aspect-ratio.css';
37
39
  @import './css/stepper.css';
38
40
  @import './css/select-combobox.css';
package/dist/tokens.css CHANGED
@@ -1,4 +1,4 @@
1
- @layer flx.tokens, flx.components, flx.skin;
1
+ @layer flx.base, flx.tokens, flx.components, flx.skin;
2
2
 
3
3
  @layer flx.tokens {
4
4
  :root, [data-theme='light'] {
@@ -129,7 +129,7 @@
129
129
  --flx-ui-color-fg: var(--flx-ui-gray-12);
130
130
  --flx-ui-color-fg-muted: var(--flx-ui-gray-11);
131
131
  --flx-ui-color-border: var(--flx-ui-gray-6);
132
- --flx-ui-color-border-strong: var(--flx-ui-gray-8);
132
+ --flx-ui-color-border-strong: var(--flx-ui-gray-7);
133
133
  --flx-ui-color-focus-ring: var(--flx-ui-accent-8);
134
134
  --flx-ui-color-primary: var(--flx-ui-accent-9);
135
135
  --flx-ui-color-primary-hover: var(--flx-ui-accent-10);
@@ -188,7 +188,7 @@
188
188
  --flx-ui-color-fg: var(--flx-ui-gray-12);
189
189
  --flx-ui-color-fg-muted: var(--flx-ui-gray-11);
190
190
  --flx-ui-color-border: var(--flx-ui-gray-6);
191
- --flx-ui-color-border-strong: var(--flx-ui-gray-8);
191
+ --flx-ui-color-border-strong: var(--flx-ui-gray-7);
192
192
  --flx-ui-color-focus-ring: var(--flx-ui-accent-8);
193
193
  --flx-ui-color-primary: var(--flx-ui-accent-9);
194
194
  --flx-ui-color-primary-hover: var(--flx-ui-accent-10);
@@ -205,6 +205,10 @@
205
205
  --flx-ui-color-warning-fg: var(--flx-ui-warning-fg);
206
206
  --flx-ui-color-warning-subtle: var(--flx-ui-warning-subtle);
207
207
  --flx-ui-color-overlay: rgba(0, 0, 0, 0.6);
208
+ --flx-ui-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
209
+ --flx-ui-shadow-md: 0 2px 6px rgba(0, 0, 0, 0.44), 0 1px 2px rgba(0, 0, 0, 0.3);
210
+ --flx-ui-shadow-lg: 0 8px 20px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.36);
211
+ --flx-ui-shadow-xl: 0 16px 36px rgba(0, 0, 0, 0.6), 0 4px 12px rgba(0, 0, 0, 0.42);
208
212
  }
209
213
 
210
214
  [data-theme='high-contrast'] {
@@ -307,7 +311,7 @@
307
311
  --flx-ui-color-fg: var(--flx-ui-gray-12);
308
312
  --flx-ui-color-fg-muted: var(--flx-ui-gray-11);
309
313
  --flx-ui-color-border: var(--flx-ui-gray-6);
310
- --flx-ui-color-border-strong: var(--flx-ui-gray-8);
314
+ --flx-ui-color-border-strong: var(--flx-ui-gray-7);
311
315
  --flx-ui-color-focus-ring: var(--flx-ui-accent-8);
312
316
  --flx-ui-color-primary: var(--flx-ui-accent-9);
313
317
  --flx-ui-color-primary-hover: var(--flx-ui-accent-10);
@@ -324,6 +328,10 @@
324
328
  --flx-ui-color-warning-fg: var(--flx-ui-warning-fg);
325
329
  --flx-ui-color-warning-subtle: var(--flx-ui-warning-subtle);
326
330
  --flx-ui-color-overlay: rgba(0, 0, 0, 0.6);
331
+ --flx-ui-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
332
+ --flx-ui-shadow-md: 0 2px 6px rgba(0, 0, 0, 0.44), 0 1px 2px rgba(0, 0, 0, 0.3);
333
+ --flx-ui-shadow-lg: 0 8px 20px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.36);
334
+ --flx-ui-shadow-xl: 0 16px 36px rgba(0, 0, 0, 0.6), 0 4px 12px rgba(0, 0, 0, 0.42);
327
335
  }
328
336
  }
329
337