@flyos/design-system 3.10.0 → 3.12.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/fesm2022/flyos-design-system.mjs +669 -149
- package/fesm2022/flyos-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/scss/_app-surface-tokens.scss +58 -48
- package/scss/_nova-glass.scss +14 -5
- package/types/flyos-design-system.d.ts +421 -7
- package/types/flyos-design-system.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -151,12 +151,12 @@
|
|
|
151
151
|
:root,
|
|
152
152
|
html.light-theme {
|
|
153
153
|
// ── Neutrals — text ──────────────────────────────────────────────────────
|
|
154
|
-
--ink: oklch(18% 0.005 250deg);
|
|
155
|
-
--ink-2: oklch(32% 0.005 250deg);
|
|
156
|
-
--ink-3: oklch(50% 0.005 250deg);
|
|
157
|
-
--ink-4: oklch(65% 0.005 250deg);
|
|
158
|
-
--ink-inverse: oklch(99% 0 0deg);
|
|
159
|
-
--ink-hover: oklch(28% 0.005 250deg);
|
|
154
|
+
--ink: oklch(18% 0.005 250deg); // primary text, primary button fills
|
|
155
|
+
--ink-2: oklch(32% 0.005 250deg); // secondary text
|
|
156
|
+
--ink-3: oklch(50% 0.005 250deg); // tertiary text, icons
|
|
157
|
+
--ink-4: oklch(65% 0.005 250deg); // disabled, muted labels
|
|
158
|
+
--ink-inverse: oklch(99% 0 0deg); // text on dark / gradient fills
|
|
159
|
+
--ink-hover: oklch(28% 0.005 250deg); // hover shade of --ink-filled controls
|
|
160
160
|
|
|
161
161
|
// Label for a fill of `--ink` itself (the primary button). Distinct from
|
|
162
162
|
// `--ink-inverse`, which is a FIXED near-white for coloured/gradient fills and
|
|
@@ -169,14 +169,14 @@ html.light-theme {
|
|
|
169
169
|
--on-ink: var(--ink-inverse);
|
|
170
170
|
|
|
171
171
|
// ── Neutrals — borders ───────────────────────────────────────────────────
|
|
172
|
-
--line: oklch(92% 0.004 250deg);
|
|
173
|
-
--line-2: oklch(88% 0.004 250deg);
|
|
174
|
-
--line-3: oklch(96% 0.003 250deg);
|
|
172
|
+
--line: oklch(92% 0.004 250deg); // default borders
|
|
173
|
+
--line-2: oklch(88% 0.004 250deg); // hover borders
|
|
174
|
+
--line-3: oklch(96% 0.003 250deg); // inner row dividers
|
|
175
175
|
|
|
176
176
|
// ── Surfaces (opaque by design — see the header note) ────────────────────
|
|
177
|
-
--bg: oklch(98.5% 0.003 100deg);
|
|
178
|
-
--bg-2: oklch(100% 0 0deg);
|
|
179
|
-
--bg-3: oklch(97% 0.004 100deg);
|
|
177
|
+
--bg: oklch(98.5% 0.003 100deg); // app background (warm off-white)
|
|
178
|
+
--bg-2: oklch(100% 0 0deg); // cards, table
|
|
179
|
+
--bg-3: oklch(97% 0.004 100deg); // sidebar, table header
|
|
180
180
|
--bg-hover: oklch(96% 0.005 250deg);
|
|
181
181
|
|
|
182
182
|
// ── Brand primitives ─────────────────────────────────────────────────────
|
|
@@ -188,11 +188,7 @@ html.light-theme {
|
|
|
188
188
|
oklch(60% 0.19 305deg),
|
|
189
189
|
oklch(45% 0.2 285deg)
|
|
190
190
|
);
|
|
191
|
-
--grad-soft: linear-gradient(
|
|
192
|
-
135deg,
|
|
193
|
-
oklch(74% 0.13 195deg / 12%),
|
|
194
|
-
oklch(55% 0.18 295deg / 12%)
|
|
195
|
-
);
|
|
191
|
+
--grad-soft: linear-gradient(135deg, oklch(74% 0.13 195deg / 12%), oklch(55% 0.18 295deg / 12%));
|
|
196
192
|
|
|
197
193
|
// ── Accent plate/ink PAIRS ───────────────────────────────────────────────
|
|
198
194
|
// NEVER paint --accent on an --accent-soft plate: that is purple-on-purple,
|
|
@@ -239,10 +235,10 @@ html.light-theme {
|
|
|
239
235
|
// ── Icon size ramp ───────────────────────────────────────────────────────
|
|
240
236
|
// ONE scale for every icon (PrimeIcons + inline SVG). Icons had drifted to
|
|
241
237
|
// ~13 different sizes, which is why they never lined up beside each other.
|
|
242
|
-
--icon-xs: 12px;
|
|
243
|
-
--icon-sm: 14px;
|
|
244
|
-
--icon-md: 16px;
|
|
245
|
-
--icon-lg: 20px;
|
|
238
|
+
--icon-xs: 12px; // dense meta rows, chips
|
|
239
|
+
--icon-sm: 14px; // text buttons, section-header actions
|
|
240
|
+
--icon-md: 16px; // default — icon buttons, rails, nav
|
|
241
|
+
--icon-lg: 20px; // emphasis / empty states
|
|
246
242
|
|
|
247
243
|
// ── Status chips (workflow-generic) ──────────────────────────────────────
|
|
248
244
|
--st-published: oklch(55% 0.13 165deg);
|
|
@@ -273,6 +269,20 @@ html.light-theme {
|
|
|
273
269
|
--scrim: rgb(0 0 0 / 50%);
|
|
274
270
|
--glass-blur: 24px;
|
|
275
271
|
|
|
272
|
+
// ── Module-card teal (app-home fidelity pass, 2026-08-20) ────────────────
|
|
273
|
+
// The launch-card family (`.ah__card--feature` tile, hover wash, hover ring)
|
|
274
|
+
// is deliberately THEME-FIXED — decoupled from the running `--accent` and
|
|
275
|
+
// from `--sys-teal`'s per-theme flip. Since the app-brand cascade (3.12.0)
|
|
276
|
+
// this pair is the FALLBACK: `fly-app-home` prefers a cascaded
|
|
277
|
+
// `--app-color`/`--app-color-deep` (published by the shell window from the
|
|
278
|
+
// app's authored brand colour), and renders this fixed teal only where no
|
|
279
|
+
// app colour cascades in. Consumers derive the design's alphas via
|
|
280
|
+
// color-mix; only these two literals exist (conventions-spec rule: raw
|
|
281
|
+
// colour values live in this file alone). Declared once in `:root`, no
|
|
282
|
+
// dark-scope redefinition, same as `--ink-inverse`.
|
|
283
|
+
--module-teal: #2896a0;
|
|
284
|
+
--module-teal-deep: #105a5a;
|
|
285
|
+
|
|
276
286
|
// ── Spacing scale (4px base) ─────────────────────────────────────────────
|
|
277
287
|
--sp-1: 4px;
|
|
278
288
|
--sp-2: 8px;
|
|
@@ -284,17 +294,17 @@ html.light-theme {
|
|
|
284
294
|
--sp-8: 56px;
|
|
285
295
|
|
|
286
296
|
// ── Typography scale ─────────────────────────────────────────────────────
|
|
287
|
-
--text-2xs: 11.5px;
|
|
288
|
-
--text-xs: 11px;
|
|
289
|
-
--text-sm: 12.5px;
|
|
290
|
-
--text-md: 13.5px;
|
|
291
|
-
--text-base: 14px;
|
|
292
|
-
--text-lg: 16px;
|
|
293
|
-
--text-xl: 18px;
|
|
294
|
-
--text-2xl: 28px;
|
|
295
|
-
--text-3xl: 32px;
|
|
297
|
+
--text-2xs: 11.5px; // field labels, field errors, footer hints
|
|
298
|
+
--text-xs: 11px; // eyebrows, badges, metric labels
|
|
299
|
+
--text-sm: 12.5px; // meta, hints, crumbs
|
|
300
|
+
--text-md: 13.5px; // body in cards, subtitles
|
|
301
|
+
--text-base: 14px; // controls, table body
|
|
302
|
+
--text-lg: 16px; // page body
|
|
303
|
+
--text-xl: 18px; // card titles, dialog titles
|
|
304
|
+
--text-2xl: 28px; // detail page h1
|
|
305
|
+
--text-3xl: 32px; // listing page h1
|
|
296
306
|
--text-display: 44px; // hero title
|
|
297
|
-
--fw-book: 450;
|
|
307
|
+
--fw-book: 450; // between regular and medium (segmented buttons)
|
|
298
308
|
--fw-medium: 500;
|
|
299
309
|
--fw-semibold: 600;
|
|
300
310
|
--fw-bold: 700;
|
|
@@ -312,10 +322,10 @@ html.light-theme {
|
|
|
312
322
|
--font-mono: var(--font-sans);
|
|
313
323
|
|
|
314
324
|
// ── Radii ────────────────────────────────────────────────────────────────
|
|
315
|
-
--r-sm: 6px;
|
|
316
|
-
--r-md: 8px;
|
|
317
|
-
--r-lg: 12px;
|
|
318
|
-
--r-xl: 16px;
|
|
325
|
+
--r-sm: 6px; // icon buttons, kbd
|
|
326
|
+
--r-md: 8px; // buttons, inputs, nav items
|
|
327
|
+
--r-lg: 12px; // cards, table wrapper, filter panel
|
|
328
|
+
--r-xl: 16px; // reserved
|
|
319
329
|
|
|
320
330
|
// ── Layout ───────────────────────────────────────────────────────────────
|
|
321
331
|
--row-h: 56px; // table row
|
|
@@ -323,8 +333,8 @@ html.light-theme {
|
|
|
323
333
|
// ── Z-index scale ────────────────────────────────────────────────────────
|
|
324
334
|
--z-sticky: 10;
|
|
325
335
|
--z-bulkbar: 50;
|
|
326
|
-
--z-overlay: 100;
|
|
327
|
-
--z-dialog: 110;
|
|
336
|
+
--z-overlay: 100; // drawers, scrims
|
|
337
|
+
--z-dialog: 110; // centered dialogs / confirms
|
|
328
338
|
--z-toast: 200;
|
|
329
339
|
--z-tooltip: 1000;
|
|
330
340
|
|
|
@@ -342,10 +352,12 @@ html.light-theme {
|
|
|
342
352
|
--shadow-accent: 0 4px 12px color-mix(in srgb, var(--accent) 25%, transparent);
|
|
343
353
|
--shadow-tooltip: 0 4px 16px oklch(0% 0 0deg / 18%);
|
|
344
354
|
--shadow-focus-soft: 0 0 0 3px oklch(0% 0 0deg / 4%);
|
|
345
|
-
--shadow-drawer: -24px 0 64px oklch(0% 0 0deg / 8%);
|
|
346
|
-
--shadow-drawer-rtl: 24px 0 64px oklch(0% 0 0deg / 8%);
|
|
347
|
-
--shadow-dialog:
|
|
348
|
-
|
|
355
|
+
--shadow-drawer: -24px 0 64px oklch(0% 0 0deg / 8%); // end-side panel (LTR)
|
|
356
|
+
--shadow-drawer-rtl: 24px 0 64px oklch(0% 0 0deg / 8%); // mirrored under RTL
|
|
357
|
+
--shadow-dialog:
|
|
358
|
+
0 24px 64px oklch(18% 0.005 250deg / 18%), 0 8px 24px oklch(18% 0.005 250deg / 10%);
|
|
359
|
+
--shadow-toast:
|
|
360
|
+
0 12px 32px oklch(18% 0.005 250deg / 14%), 0 4px 12px oklch(18% 0.005 250deg / 8%);
|
|
349
361
|
|
|
350
362
|
// ── Transitions ──────────────────────────────────────────────────────────
|
|
351
363
|
--t-state: 0.12s ease;
|
|
@@ -393,11 +405,7 @@ html.dark-theme {
|
|
|
393
405
|
oklch(70% 0.19 305deg),
|
|
394
406
|
oklch(60% 0.2 285deg)
|
|
395
407
|
);
|
|
396
|
-
--grad-soft: linear-gradient(
|
|
397
|
-
135deg,
|
|
398
|
-
oklch(78% 0.13 195deg / 18%),
|
|
399
|
-
oklch(68% 0.18 295deg / 18%)
|
|
400
|
-
);
|
|
408
|
+
--grad-soft: linear-gradient(135deg, oklch(78% 0.13 195deg / 18%), oklch(68% 0.18 295deg / 18%));
|
|
401
409
|
|
|
402
410
|
// ── Interaction state layers — light veil on dark surfaces ───────────────
|
|
403
411
|
--state-hover: oklch(95% 0.02 285deg / 6%);
|
|
@@ -409,7 +417,7 @@ html.dark-theme {
|
|
|
409
417
|
--st-published-bg: oklch(28% 0.06 165deg);
|
|
410
418
|
--st-approved: oklch(82% 0.15 245deg);
|
|
411
419
|
--st-approved-bg: oklch(28% 0.06 245deg);
|
|
412
|
-
--st-draft: var(--ink-2);
|
|
420
|
+
--st-draft: var(--ink-2); // same grey as secondary text on dark
|
|
413
421
|
--st-draft-bg: oklch(24% 0.003 250deg);
|
|
414
422
|
--st-archived: oklch(82% 0.06 60deg);
|
|
415
423
|
--st-archived-bg: oklch(28% 0.05 60deg);
|
|
@@ -577,6 +585,8 @@ $_plate-ink: 'clamp(0, (0.1791 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * infin
|
|
|
577
585
|
:root,
|
|
578
586
|
html.light-theme,
|
|
579
587
|
html.dark-theme {
|
|
580
|
-
--on-accent-fill: color(
|
|
588
|
+
--on-accent-fill: color(
|
|
589
|
+
from var(--accent-fill) srgb-linear #{$_plate-ink} #{$_plate-ink} #{$_plate-ink} / 100%
|
|
590
|
+
);
|
|
581
591
|
}
|
|
582
592
|
}
|
package/scss/_nova-glass.scss
CHANGED
|
@@ -147,7 +147,8 @@
|
|
|
147
147
|
// 2026-08-17 review fixed for dark. Alpha-1 in both themes; dark's twins are
|
|
148
148
|
// byte-identical to the base pair, so this changes nothing there.
|
|
149
149
|
@if $nested {
|
|
150
|
-
@return $glow, $sheen,
|
|
150
|
+
@return $glow, $sheen,
|
|
151
|
+
linear-gradient(180deg, var(--mat-menu-solid-a), var(--mat-menu-solid-b));
|
|
151
152
|
}
|
|
152
153
|
|
|
153
154
|
@return $glow, $sheen, linear-gradient(180deg, var(--mat-menu-a), var(--mat-menu-b));
|
|
@@ -350,8 +351,12 @@
|
|
|
350
351
|
border-radius: inherit;
|
|
351
352
|
background: var(--window-edge-gradient);
|
|
352
353
|
pointer-events: none;
|
|
353
|
-
-webkit-mask:
|
|
354
|
-
|
|
354
|
+
-webkit-mask:
|
|
355
|
+
linear-gradient(#000 0 0) content-box,
|
|
356
|
+
linear-gradient(#000 0 0);
|
|
357
|
+
mask:
|
|
358
|
+
linear-gradient(#000 0 0) content-box,
|
|
359
|
+
linear-gradient(#000 0 0);
|
|
355
360
|
-webkit-mask-composite: xor;
|
|
356
361
|
mask-composite: exclude;
|
|
357
362
|
}
|
|
@@ -533,8 +538,12 @@
|
|
|
533
538
|
rgb(255 255 255 / 42%)
|
|
534
539
|
);
|
|
535
540
|
pointer-events: none;
|
|
536
|
-
-webkit-mask:
|
|
537
|
-
|
|
541
|
+
-webkit-mask:
|
|
542
|
+
linear-gradient(#000 0 0) content-box,
|
|
543
|
+
linear-gradient(#000 0 0);
|
|
544
|
+
mask:
|
|
545
|
+
linear-gradient(#000 0 0) content-box,
|
|
546
|
+
linear-gradient(#000 0 0);
|
|
538
547
|
-webkit-mask-composite: xor;
|
|
539
548
|
mask-composite: exclude;
|
|
540
549
|
}
|