@neptune.fintech/web-ui 1.0.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.
Files changed (42) hide show
  1. package/LICENSE +104 -0
  2. package/README.md +62 -0
  3. package/dist/components/base.d.ts +18 -0
  4. package/dist/components/base.d.ts.map +1 -0
  5. package/dist/components/base.js +57 -0
  6. package/dist/components/base.js.map +1 -0
  7. package/dist/components/button.d.ts +12 -0
  8. package/dist/components/button.d.ts.map +1 -0
  9. package/dist/components/button.js +70 -0
  10. package/dist/components/button.js.map +1 -0
  11. package/dist/components/card.d.ts +13 -0
  12. package/dist/components/card.d.ts.map +1 -0
  13. package/dist/components/card.js +46 -0
  14. package/dist/components/card.js.map +1 -0
  15. package/dist/components/financial.d.ts +23 -0
  16. package/dist/components/financial.d.ts.map +1 -0
  17. package/dist/components/financial.js +164 -0
  18. package/dist/components/financial.js.map +1 -0
  19. package/dist/components/inputs.d.ts +27 -0
  20. package/dist/components/inputs.d.ts.map +1 -0
  21. package/dist/components/inputs.js +167 -0
  22. package/dist/components/inputs.js.map +1 -0
  23. package/dist/components/nav.d.ts +24 -0
  24. package/dist/components/nav.d.ts.map +1 -0
  25. package/dist/components/nav.js +131 -0
  26. package/dist/components/nav.js.map +1 -0
  27. package/dist/index.d.ts +12 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +19 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/register.d.ts +3 -0
  32. package/dist/register.d.ts.map +1 -0
  33. package/dist/register.js +24 -0
  34. package/dist/register.js.map +1 -0
  35. package/dist/theme/applyTheme.d.ts +27 -0
  36. package/dist/theme/applyTheme.d.ts.map +1 -0
  37. package/dist/theme/applyTheme.js +118 -0
  38. package/dist/theme/applyTheme.js.map +1 -0
  39. package/package.json +58 -0
  40. package/styles/neptune-odyssey.css +6 -0
  41. package/styles/system.css +74 -0
  42. package/styles/themes.css +246 -0
@@ -0,0 +1,74 @@
1
+ /* ════════════════════════════════════════════════════════════════════════
2
+ NEPTUNE ODYSSEY — system token layer · by Neptune.Fintech
3
+ Brand-agnostic semantic tokens: motion, elevation, spacing, type scale,
4
+ state layers, focus, z-index, density.
5
+
6
+ themes.css owns what changes PER BRAND (color, shape, type family, motif).
7
+ system.css owns what stays CONSTANT across every brand — the physics of the
8
+ system. Together they make the platform's "everything is a token" promise
9
+ literally true: no component should hardcode a shadow, duration, easing,
10
+ spacing step, focus ring, or type size again.
11
+
12
+ Load order: themes.css → system.css (system reads scrim from the theme)
13
+ ════════════════════════════════════════════════════════════════════════ */
14
+
15
+ :root{
16
+ /* ── Spacing · 4px base grid ─────────────────────────────────────────── */
17
+ --npt-space-0:0; --npt-space-1:4px; --npt-space-2:8px; --npt-space-3:12px;
18
+ --npt-space-4:16px; --npt-space-5:20px; --npt-space-6:24px; --npt-space-8:32px;
19
+ --npt-space-10:40px; --npt-space-12:48px; --npt-space-16:64px; --npt-space-20:80px;
20
+
21
+ /* ── Type scale · M3 roles (pair size + leading + weight) ────────────── */
22
+ --npt-text-display-lg: 57px; --npt-leading-display-lg: 64px;
23
+ --npt-text-display-md: 45px; --npt-leading-display-md: 52px;
24
+ --npt-text-headline: 28px; --npt-leading-headline: 36px;
25
+ --npt-text-title-lg: 22px; --npt-leading-title-lg: 28px;
26
+ --npt-text-title: 18px; --npt-leading-title: 24px;
27
+ --npt-text-body-lg: 16px; --npt-leading-body-lg: 24px;
28
+ --npt-text-body: 14px; --npt-leading-body: 20px;
29
+ --npt-text-label: 14px; --npt-leading-label: 20px;
30
+ --npt-text-caption: 12px; --npt-leading-caption: 16px;
31
+ --npt-weight-regular:400; --npt-weight-medium:500; --npt-weight-semibold:600; --npt-weight-bold:700;
32
+
33
+ /* ── Motion · durations + M3 Expressive easings ──────────────────────── */
34
+ --npt-dur-1:100ms; --npt-dur-2:180ms; --npt-dur-3:280ms; --npt-dur-4:400ms; --npt-dur-5:520ms;
35
+ --npt-ease-standard: cubic-bezier(.2,0,0,1);
36
+ --npt-ease-emphasized: cubic-bezier(.2,0,0,1);
37
+ --npt-ease-decelerate: cubic-bezier(0,0,0,1);
38
+ --npt-ease-accelerate: cubic-bezier(.3,0,1,1);
39
+ --npt-ease-spring: cubic-bezier(.34,1.56,.64,1);
40
+ /* composed motions — use these on transitions */
41
+ --npt-motion-enter: var(--npt-dur-4) var(--npt-ease-emphasized);
42
+ --npt-motion-exit: var(--npt-dur-2) var(--npt-ease-accelerate);
43
+ --npt-motion-spring: var(--npt-dur-4) var(--npt-ease-spring);
44
+ --npt-motion-press: var(--npt-dur-1) var(--npt-ease-standard);
45
+
46
+ /* ── Elevation · tinted by the theme's scrim (so shadows match the brand) ─ */
47
+ --npt-elev-0: none;
48
+ --npt-elev-1: 0 1px 2px -1px color-mix(in oklab, var(--md-sys-color-scrim) 16%, transparent);
49
+ --npt-elev-2: 0 2px 6px -2px color-mix(in oklab, var(--md-sys-color-scrim) 20%, transparent);
50
+ --npt-elev-3: 0 8px 20px -10px color-mix(in oklab, var(--md-sys-color-scrim) 28%, transparent);
51
+ --npt-elev-4: 0 16px 36px -16px color-mix(in oklab, var(--md-sys-color-scrim) 32%, transparent);
52
+ --npt-elev-5: 0 28px 60px -24px color-mix(in oklab, var(--md-sys-color-scrim) 40%, transparent);
53
+ /* branded key-light glow for primary heroes/buttons */
54
+ --npt-glow-primary: 0 10px 26px -12px color-mix(in oklab, var(--md-sys-color-primary) 70%, transparent);
55
+
56
+ /* ── State layers · M3 overlay opacities ─────────────────────────────── */
57
+ --npt-state-hover:0.08; --npt-state-focus:0.10; --npt-state-pressed:0.12; --npt-state-drag:0.16;
58
+
59
+ /* ── Focus · the single source of the keyboard ring (a11y) ───────────── */
60
+ --npt-focus-ring-width:3px;
61
+ --npt-focus-ring-offset:2px;
62
+ --npt-focus-ring-color: var(--md-sys-color-primary);
63
+
64
+ /* ── Z-index scale ───────────────────────────────────────────────────── */
65
+ --npt-z-base:0; --npt-z-sticky:10; --npt-z-nav:20; --npt-z-overlay:60;
66
+ --npt-z-modal:70; --npt-z-toast:80; --npt-z-max:9999;
67
+
68
+ /* ── Density · product-layer hook (comfortable ⇄ compact) ────────────── */
69
+ --npt-row-comfortable:56px; --npt-row-standard:48px; --npt-row-compact:40px;
70
+ --npt-touch-min:48px; /* never smaller on touch surfaces */
71
+
72
+ /* native form controls inherit the brand */
73
+ accent-color: var(--md-sys-color-primary);
74
+ }
@@ -0,0 +1,246 @@
1
+ /* Neptune Odyssey — theme token layer · © Neptune.Fintech · v1.0.0
2
+ M3 + M3 Expressive · 4 brands (neptune/andalus/nuran/fglb) · light+dark · LTR/RTL
3
+ Apply on a wrapper: <body data-theme="andalus" data-mode="dark" dir="rtl"> */
4
+
5
+ /* ====== NEPTUNE DESIGN SYSTEM — token layer ====== */
6
+ :root,[data-theme="neptune"]{
7
+ --md-sys-color-primary: oklch(0.48 0.15 258); --md-sys-color-on-primary: oklch(0.99 0.02 258);
8
+ --md-sys-color-primary-container: oklch(0.91 0.07 258); --md-sys-color-on-primary-container: oklch(0.22 0.13 258);
9
+ --md-sys-color-secondary: oklch(0.5 0.06 258); --md-sys-color-on-secondary: oklch(0.99 0.02 258);
10
+ --md-sys-color-secondary-container: oklch(0.92 0.035 258); --md-sys-color-on-secondary-container: oklch(0.25 0.05 258);
11
+ --md-sys-color-tertiary: oklch(0.55 0.1 200); --md-sys-color-on-tertiary: oklch(0.99 0.02 200);
12
+ --md-sys-color-tertiary-container: oklch(0.9 0.06 200); --md-sys-color-on-tertiary-container: oklch(0.24 0.08 200);
13
+ --md-sys-color-error: oklch(0.52 0.2 27); --md-sys-color-on-error: oklch(0.99 0.02 27);
14
+ --md-sys-color-error-container: oklch(0.92 0.07 27); --md-sys-color-on-error-container: oklch(0.28 0.16 27);
15
+ --md-sys-color-success: oklch(0.58 0.13 152); --md-sys-color-on-success: oklch(0.99 0.02 152);
16
+ --md-sys-color-success-container: oklch(0.9 0.07 152); --md-sys-color-on-success-container: oklch(0.26 0.1 152);
17
+ --md-sys-color-background: oklch(0.985 0.006 258); --md-sys-color-on-background: oklch(0.16 0.02 258);
18
+ --md-sys-color-surface: oklch(0.985 0.006 258); --md-sys-color-on-surface: oklch(0.16 0.02 258);
19
+ --md-sys-color-surface-variant: oklch(0.9 0.018 258); --md-sys-color-on-surface-variant: oklch(0.4 0.025 258);
20
+ --md-sys-color-outline: oklch(0.62 0.02 258); --md-sys-color-outline-variant: oklch(0.86 0.015 258);
21
+ --md-sys-color-surface-container-lowest: oklch(1 0 0); --md-sys-color-surface-container-low: oklch(0.965 0.006 258);
22
+ --md-sys-color-surface-container: oklch(0.945 0.008 258); --md-sys-color-surface-container-high: oklch(0.925 0.01 258);
23
+ --md-sys-color-surface-container-highest: oklch(0.905 0.012 258);
24
+ --md-sys-color-inverse-surface: oklch(0.24 0.02 258); --md-sys-color-inverse-on-surface: oklch(0.96 0.006 258);
25
+ --md-sys-color-inverse-primary: oklch(0.82 0.12 258); --md-sys-color-scrim: oklch(0.08 0.02 258);
26
+ --npt-font-display:'Hanken Grotesk'; --npt-font-text:'Hanken Grotesk'; --npt-font-num:'Hanken Grotesk';
27
+ --npt-font-display-ar:'IBM Plex Sans Arabic'; --npt-font-text-ar:'IBM Plex Sans Arabic';
28
+ --npt-corner-xs-base:8px; --npt-corner-sm-base:12px; --npt-corner-md-base:16px; --npt-corner-lg-base:24px; --npt-corner-xl-base:32px; --npt-corner-2xl-base:44px; --npt-corner-full:999px;
29
+ --npt-display-tracking:-0.02em; --npt-display-weight:700;
30
+ --npt-shape-scale:1; --npt-spring:cubic-bezier(.34,1.56,.64,1); --npt-spring-dur:.4s;
31
+ /* lever · motion feel (Neptune: smooth-fluid) */
32
+ --npt-ease-standard:cubic-bezier(.2,0,0,1); --npt-ease-emphasized:cubic-bezier(.2,0,0,1); --npt-ease-spring:cubic-bezier(.34,1.56,.64,1);
33
+ --npt-dur-fast:240ms; --npt-dur-standard:300ms; --npt-dur-slow:500ms;
34
+ /* lever · glass tint (Neptune: oceanic) */
35
+ --npt-glass-tint:color-mix(in oklab, var(--md-sys-color-primary) 8%, color-mix(in oklab, var(--md-sys-color-surface) 70%, transparent)); --npt-glass-blur:18px;
36
+ /* lever · named treatments (login shell / dashboard hero / content tone) */
37
+ --npt-login-shell:depth-emblem; --npt-dashboard-hero:balance-cards; --npt-content-tone:clear-calm;
38
+ /* brand expression — signature motif (Neptune: sonar tide-rings) */
39
+ --npt-motif: repeating-radial-gradient(circle at 86% 6%, color-mix(in oklab,currentColor 11%,transparent) 0 1.5px, transparent 1.5px 27px);
40
+ --npt-motif-size: auto; --npt-motif-strength: .9;
41
+ --npt-hero-emblem: radial-gradient(circle at 50% 50%, color-mix(in oklab,currentColor 14%,transparent) 0 1px, transparent 1px 9px, color-mix(in oklab,currentColor 12%,transparent) 9px 10px, transparent 10px 20px, color-mix(in oklab,currentColor 10%,transparent) 20px 21px, transparent 21px);
42
+ }
43
+ /* client customization: corner family scales with --npt-shape-scale (full stays a pill) */
44
+ [data-theme]{
45
+ --npt-corner-xs: calc(var(--npt-corner-xs-base,8px) * var(--npt-shape-scale,1));
46
+ --npt-corner-sm: calc(var(--npt-corner-sm-base,12px) * var(--npt-shape-scale,1));
47
+ --npt-corner-md: calc(var(--npt-corner-md-base,16px) * var(--npt-shape-scale,1));
48
+ --npt-corner-lg: calc(var(--npt-corner-lg-base,24px) * var(--npt-shape-scale,1));
49
+ --npt-corner-xl: calc(var(--npt-corner-xl-base,32px) * var(--npt-shape-scale,1));
50
+ --npt-corner-2xl: calc(var(--npt-corner-2xl-base,44px) * var(--npt-shape-scale,1));
51
+ }
52
+ [data-theme="neptune"][data-mode="dark"]{
53
+ --md-sys-color-primary: oklch(0.8 0.12 258); --md-sys-color-on-primary: oklch(0.2 0.1 258);
54
+ --md-sys-color-primary-container: oklch(0.36 0.12 258); --md-sys-color-on-primary-container: oklch(0.9 0.07 258);
55
+ --md-sys-color-secondary: oklch(0.82 0.04 258); --md-sys-color-on-secondary: oklch(0.22 0.04 258);
56
+ --md-sys-color-secondary-container: oklch(0.34 0.04 258); --md-sys-color-on-secondary-container: oklch(0.9 0.035 258);
57
+ --md-sys-color-tertiary: oklch(0.82 0.08 200); --md-sys-color-on-tertiary: oklch(0.22 0.06 200);
58
+ --md-sys-color-tertiary-container: oklch(0.34 0.07 200); --md-sys-color-on-tertiary-container: oklch(0.9 0.06 200);
59
+ --md-sys-color-error: oklch(0.78 0.13 27); --md-sys-color-on-error: oklch(0.24 0.1 27);
60
+ --md-sys-color-error-container: oklch(0.36 0.14 27); --md-sys-color-on-error-container: oklch(0.92 0.06 27);
61
+ --md-sys-color-success: oklch(0.78 0.12 152); --md-sys-color-on-success: oklch(0.22 0.08 152);
62
+ --md-sys-color-success-container: oklch(0.34 0.1 152); --md-sys-color-on-success-container: oklch(0.9 0.07 152);
63
+ --md-sys-color-background: oklch(0.13 0.012 258); --md-sys-color-on-background: oklch(0.92 0.01 258);
64
+ --md-sys-color-surface: oklch(0.13 0.012 258); --md-sys-color-on-surface: oklch(0.92 0.01 258);
65
+ --md-sys-color-surface-variant: oklch(0.34 0.02 258); --md-sys-color-on-surface-variant: oklch(0.78 0.02 258);
66
+ --md-sys-color-outline: oklch(0.58 0.02 258); --md-sys-color-outline-variant: oklch(0.32 0.02 258);
67
+ --md-sys-color-surface-container-lowest: oklch(0.09 0.012 258); --md-sys-color-surface-container-low: oklch(0.16 0.014 258);
68
+ --md-sys-color-surface-container: oklch(0.18 0.016 258); --md-sys-color-surface-container-high: oklch(0.22 0.018 258);
69
+ --md-sys-color-surface-container-highest: oklch(0.27 0.02 258);
70
+ --md-sys-color-inverse-surface: oklch(0.92 0.01 258); --md-sys-color-inverse-on-surface: oklch(0.2 0.02 258);
71
+ --md-sys-color-inverse-primary: oklch(0.48 0.15 258); --md-sys-color-scrim: oklch(0 0 0);
72
+ }
73
+ [data-theme="andalus"]{
74
+ --md-sys-color-primary: oklch(0.5 0.12 162); --md-sys-color-on-primary: oklch(0.99 0.02 162);
75
+ --md-sys-color-primary-container: oklch(0.9 0.08 162); --md-sys-color-on-primary-container: oklch(0.24 0.1 162);
76
+ --md-sys-color-secondary: oklch(0.52 0.05 162); --md-sys-color-on-secondary: oklch(0.99 0.02 162);
77
+ --md-sys-color-secondary-container: oklch(0.91 0.04 162); --md-sys-color-on-secondary-container: oklch(0.26 0.05 162);
78
+ --md-sys-color-tertiary: oklch(0.62 0.12 86); --md-sys-color-on-tertiary: oklch(0.99 0.02 86);
79
+ --md-sys-color-tertiary-container: oklch(0.9 0.09 86); --md-sys-color-on-tertiary-container: oklch(0.3 0.09 86);
80
+ --md-sys-color-error: oklch(0.52 0.2 27); --md-sys-color-on-error: oklch(0.99 0.02 27);
81
+ --md-sys-color-error-container: oklch(0.92 0.07 27); --md-sys-color-on-error-container: oklch(0.28 0.16 27);
82
+ --md-sys-color-success: oklch(0.56 0.13 150); --md-sys-color-on-success: oklch(0.99 0.02 150);
83
+ --md-sys-color-success-container: oklch(0.9 0.07 150); --md-sys-color-on-success-container: oklch(0.26 0.1 150);
84
+ --md-sys-color-background: oklch(0.985 0.01 150); --md-sys-color-on-background: oklch(0.18 0.02 150);
85
+ --md-sys-color-surface: oklch(0.985 0.01 150); --md-sys-color-on-surface: oklch(0.18 0.02 150);
86
+ --md-sys-color-surface-variant: oklch(0.9 0.025 150); --md-sys-color-on-surface-variant: oklch(0.4 0.03 150);
87
+ --md-sys-color-outline: oklch(0.62 0.025 150); --md-sys-color-outline-variant: oklch(0.86 0.02 150);
88
+ --md-sys-color-surface-container-lowest: oklch(1 0 0); --md-sys-color-surface-container-low: oklch(0.965 0.012 150);
89
+ --md-sys-color-surface-container: oklch(0.945 0.016 150); --md-sys-color-surface-container-high: oklch(0.925 0.02 150);
90
+ --md-sys-color-surface-container-highest: oklch(0.905 0.024 150);
91
+ --md-sys-color-inverse-surface: oklch(0.26 0.02 150); --md-sys-color-inverse-on-surface: oklch(0.96 0.01 150);
92
+ --md-sys-color-inverse-primary: oklch(0.82 0.1 162); --md-sys-color-scrim: oklch(0.08 0.02 150);
93
+ --npt-font-display:'Bricolage Grotesque'; --npt-font-text:'Hanken Grotesk'; --npt-font-num:'Hanken Grotesk';
94
+ --npt-font-display-ar:'Reem Kufi'; --npt-font-text-ar:'Tajawal';
95
+ --npt-corner-xs-base:12px; --npt-corner-sm-base:18px; --npt-corner-md-base:26px; --npt-corner-lg-base:34px; --npt-corner-xl-base:44px; --npt-corner-2xl-base:56px; --npt-corner-full:999px;
96
+ --npt-display-tracking:-0.01em; --npt-display-weight:700;
97
+ /* lever · motion feel (Andalus: calm-graceful) */
98
+ --npt-ease-standard:cubic-bezier(.25,0,.2,1); --npt-ease-emphasized:cubic-bezier(.2,0,.1,1); --npt-ease-spring:cubic-bezier(.3,1.3,.5,1);
99
+ --npt-dur-fast:280ms; --npt-dur-standard:340ms; --npt-dur-slow:560ms;
100
+ /* lever · glass tint (Andalus: warm-amber) */
101
+ --npt-glass-tint:color-mix(in oklab, var(--md-sys-color-tertiary) 9%, color-mix(in oklab, var(--md-sys-color-surface) 72%, transparent)); --npt-glass-blur:16px;
102
+ /* lever · named treatments */
103
+ --npt-login-shell:arcade-arches; --npt-dashboard-hero:warm-balance-cards; --npt-content-tone:warm-hospitable;
104
+ /* brand expression — signature motif (Andalus: heritage arcade of arches) */
105
+ --npt-motif: radial-gradient(circle at 50% 100%, transparent 0 12px, color-mix(in oklab,currentColor 13%,transparent) 12px 13.5px, transparent 14.5px);
106
+ --npt-motif-size: 40px 32px; --npt-motif-strength: 1;
107
+ --npt-hero-emblem: radial-gradient(circle at 50% 118%, transparent 0 34px, color-mix(in oklab,currentColor 16%,transparent) 34px 36px, transparent 37px 52px, color-mix(in oklab,currentColor 12%,transparent) 52px 54px, transparent 55px);
108
+ }
109
+ [data-theme="andalus"][data-mode="dark"]{
110
+ --md-sys-color-primary: oklch(0.82 0.11 162); --md-sys-color-on-primary: oklch(0.22 0.08 162);
111
+ --md-sys-color-primary-container: oklch(0.36 0.1 162); --md-sys-color-on-primary-container: oklch(0.9 0.08 162);
112
+ --md-sys-color-secondary: oklch(0.82 0.045 162); --md-sys-color-on-secondary: oklch(0.24 0.04 162);
113
+ --md-sys-color-secondary-container: oklch(0.34 0.045 162); --md-sys-color-on-secondary-container: oklch(0.9 0.04 162);
114
+ --md-sys-color-tertiary: oklch(0.82 0.1 86); --md-sys-color-on-tertiary: oklch(0.26 0.08 86);
115
+ --md-sys-color-tertiary-container: oklch(0.4 0.09 86); --md-sys-color-on-tertiary-container: oklch(0.92 0.08 86);
116
+ --md-sys-color-error: oklch(0.78 0.13 27); --md-sys-color-on-error: oklch(0.24 0.1 27);
117
+ --md-sys-color-error-container: oklch(0.36 0.14 27); --md-sys-color-on-error-container: oklch(0.92 0.06 27);
118
+ --md-sys-color-success: oklch(0.78 0.12 150); --md-sys-color-on-success: oklch(0.22 0.08 150);
119
+ --md-sys-color-success-container: oklch(0.34 0.1 150); --md-sys-color-on-success-container: oklch(0.9 0.07 150);
120
+ --md-sys-color-background: oklch(0.14 0.014 150); --md-sys-color-on-background: oklch(0.92 0.012 150);
121
+ --md-sys-color-surface: oklch(0.14 0.014 150); --md-sys-color-on-surface: oklch(0.92 0.012 150);
122
+ --md-sys-color-surface-variant: oklch(0.34 0.022 150); --md-sys-color-on-surface-variant: oklch(0.78 0.022 150);
123
+ --md-sys-color-outline: oklch(0.58 0.022 150); --md-sys-color-outline-variant: oklch(0.32 0.022 150);
124
+ --md-sys-color-surface-container-lowest: oklch(0.1 0.014 150); --md-sys-color-surface-container-low: oklch(0.17 0.016 150);
125
+ --md-sys-color-surface-container: oklch(0.19 0.018 150); --md-sys-color-surface-container-high: oklch(0.23 0.02 150);
126
+ --md-sys-color-surface-container-highest: oklch(0.28 0.022 150);
127
+ --md-sys-color-inverse-surface: oklch(0.92 0.012 150); --md-sys-color-inverse-on-surface: oklch(0.22 0.02 150);
128
+ --md-sys-color-inverse-primary: oklch(0.5 0.12 162); --md-sys-color-scrim: oklch(0 0 0);
129
+ }
130
+ [data-theme="nuran"]{
131
+ --md-sys-color-primary: oklch(0.52 0.18 292); --md-sys-color-on-primary: oklch(0.99 0.02 292);
132
+ --md-sys-color-primary-container: oklch(0.91 0.08 292); --md-sys-color-on-primary-container: oklch(0.26 0.16 292);
133
+ --md-sys-color-secondary: oklch(0.54 0.06 292); --md-sys-color-on-secondary: oklch(0.99 0.02 292);
134
+ --md-sys-color-secondary-container: oklch(0.92 0.04 292); --md-sys-color-on-secondary-container: oklch(0.28 0.06 292);
135
+ --md-sys-color-tertiary: oklch(0.6 0.16 350); --md-sys-color-on-tertiary: oklch(0.99 0.02 350);
136
+ --md-sys-color-tertiary-container: oklch(0.91 0.08 350); --md-sys-color-on-tertiary-container: oklch(0.3 0.13 350);
137
+ --md-sys-color-error: oklch(0.52 0.2 27); --md-sys-color-on-error: oklch(0.99 0.02 27);
138
+ --md-sys-color-error-container: oklch(0.92 0.07 27); --md-sys-color-on-error-container: oklch(0.28 0.16 27);
139
+ --md-sys-color-success: oklch(0.58 0.13 152); --md-sys-color-on-success: oklch(0.99 0.02 152);
140
+ --md-sys-color-success-container: oklch(0.9 0.07 152); --md-sys-color-on-success-container: oklch(0.26 0.1 152);
141
+ --md-sys-color-background: oklch(0.985 0.008 300); --md-sys-color-on-background: oklch(0.16 0.02 300);
142
+ --md-sys-color-surface: oklch(0.985 0.008 300); --md-sys-color-on-surface: oklch(0.16 0.02 300);
143
+ --md-sys-color-surface-variant: oklch(0.9 0.022 300); --md-sys-color-on-surface-variant: oklch(0.4 0.03 300);
144
+ --md-sys-color-outline: oklch(0.62 0.025 300); --md-sys-color-outline-variant: oklch(0.86 0.018 300);
145
+ --md-sys-color-surface-container-lowest: oklch(1 0 0); --md-sys-color-surface-container-low: oklch(0.965 0.008 300);
146
+ --md-sys-color-surface-container: oklch(0.945 0.012 300); --md-sys-color-surface-container-high: oklch(0.925 0.016 300);
147
+ --md-sys-color-surface-container-highest: oklch(0.905 0.02 300);
148
+ --md-sys-color-inverse-surface: oklch(0.24 0.02 300); --md-sys-color-inverse-on-surface: oklch(0.96 0.008 300);
149
+ --md-sys-color-inverse-primary: oklch(0.82 0.14 292); --md-sys-color-scrim: oklch(0.08 0.02 300);
150
+ --npt-font-display:'Space Grotesk'; --npt-font-text:'Hanken Grotesk'; --npt-font-num:'Space Grotesk';
151
+ --npt-font-display-ar:'Readex Pro'; --npt-font-text-ar:'Readex Pro';
152
+ --npt-corner-xs-base:4px; --npt-corner-sm-base:8px; --npt-corner-md-base:12px; --npt-corner-lg-base:18px; --npt-corner-xl-base:26px; --npt-corner-2xl-base:36px; --npt-corner-full:999px;
153
+ --npt-display-tracking:-0.03em; --npt-display-weight:600;
154
+ /* lever · motion feel (Nuran: light-quick-crisp) */
155
+ --npt-ease-standard:cubic-bezier(.2,0,0,1); --npt-ease-emphasized:cubic-bezier(.2,0,0,1); --npt-ease-spring:cubic-bezier(.34,1.56,.64,1);
156
+ --npt-dur-fast:200ms; --npt-dur-standard:240ms; --npt-dur-slow:400ms;
157
+ /* lever · glass tint (Nuran: violet-luminous) */
158
+ --npt-glass-tint:color-mix(in oklab, var(--md-sys-color-primary) 12%, color-mix(in oklab, var(--md-sys-color-surface) 62%, transparent)); --npt-glass-blur:22px;
159
+ /* lever · named treatments */
160
+ --npt-login-shell:light-grid-spark; --npt-dashboard-hero:wallet-hero; --npt-content-tone:light-instant;
161
+ /* brand expression — signature motif (Nuran: crisp digital light-grid) */
162
+ --npt-motif: linear-gradient(color-mix(in oklab,currentColor 8%,transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in oklab,currentColor 8%,transparent) 1px, transparent 1px);
163
+ --npt-motif-size: 23px 23px; --npt-motif-strength: 1;
164
+ --npt-hero-emblem: linear-gradient(125deg, transparent 38%, color-mix(in oklab,currentColor 16%,transparent) 49%, color-mix(in oklab,currentColor 4%,transparent) 50%, transparent 62%);
165
+ }
166
+ [data-theme="nuran"][data-mode="dark"]{
167
+ --md-sys-color-primary: oklch(0.8 0.15 292); --md-sys-color-on-primary: oklch(0.22 0.12 292);
168
+ --md-sys-color-primary-container: oklch(0.38 0.14 292); --md-sys-color-on-primary-container: oklch(0.9 0.08 292);
169
+ --md-sys-color-secondary: oklch(0.82 0.05 292); --md-sys-color-on-secondary: oklch(0.24 0.05 292);
170
+ --md-sys-color-secondary-container: oklch(0.36 0.05 292); --md-sys-color-on-secondary-container: oklch(0.9 0.04 292);
171
+ --md-sys-color-tertiary: oklch(0.8 0.13 350); --md-sys-color-on-tertiary: oklch(0.24 0.1 350);
172
+ --md-sys-color-tertiary-container: oklch(0.4 0.13 350); --md-sys-color-on-tertiary-container: oklch(0.92 0.08 350);
173
+ --md-sys-color-error: oklch(0.78 0.13 27); --md-sys-color-on-error: oklch(0.24 0.1 27);
174
+ --md-sys-color-error-container: oklch(0.36 0.14 27); --md-sys-color-on-error-container: oklch(0.92 0.06 27);
175
+ --md-sys-color-success: oklch(0.78 0.12 152); --md-sys-color-on-success: oklch(0.22 0.08 152);
176
+ --md-sys-color-success-container: oklch(0.34 0.1 152); --md-sys-color-on-success-container: oklch(0.9 0.07 152);
177
+ --md-sys-color-background: oklch(0.13 0.014 300); --md-sys-color-on-background: oklch(0.92 0.012 300);
178
+ --md-sys-color-surface: oklch(0.13 0.014 300); --md-sys-color-on-surface: oklch(0.92 0.012 300);
179
+ --md-sys-color-surface-variant: oklch(0.34 0.024 300); --md-sys-color-on-surface-variant: oklch(0.78 0.024 300);
180
+ --md-sys-color-outline: oklch(0.58 0.024 300); --md-sys-color-outline-variant: oklch(0.32 0.024 300);
181
+ --md-sys-color-surface-container-lowest: oklch(0.09 0.014 300); --md-sys-color-surface-container-low: oklch(0.16 0.016 300);
182
+ --md-sys-color-surface-container: oklch(0.18 0.018 300); --md-sys-color-surface-container-high: oklch(0.22 0.02 300);
183
+ --md-sys-color-surface-container-highest: oklch(0.27 0.022 300);
184
+ --md-sys-color-inverse-surface: oklch(0.92 0.012 300); --md-sys-color-inverse-on-surface: oklch(0.2 0.02 300);
185
+ --md-sys-color-inverse-primary: oklch(0.52 0.18 292); --md-sys-color-scrim: oklch(0 0 0);
186
+ }
187
+ [data-theme="fglb"]{
188
+ --md-sys-color-primary: oklch(0.42 0.13 248); --md-sys-color-on-primary: oklch(0.99 0.02 248);
189
+ --md-sys-color-primary-container: oklch(0.89 0.07 248); --md-sys-color-on-primary-container: oklch(0.2 0.12 248);
190
+ --md-sys-color-secondary: oklch(0.5 0.05 248); --md-sys-color-on-secondary: oklch(0.99 0.02 248);
191
+ --md-sys-color-secondary-container: oklch(0.91 0.035 250); --md-sys-color-on-secondary-container: oklch(0.24 0.05 248);
192
+ --md-sys-color-tertiary: oklch(0.66 0.12 85); --md-sys-color-on-tertiary: oklch(0.99 0.02 85);
193
+ --md-sys-color-tertiary-container: oklch(0.9 0.09 85); --md-sys-color-on-tertiary-container: oklch(0.32 0.09 85);
194
+ --md-sys-color-error: oklch(0.52 0.2 27); --md-sys-color-on-error: oklch(0.99 0.02 27);
195
+ --md-sys-color-error-container: oklch(0.92 0.07 27); --md-sys-color-on-error-container: oklch(0.28 0.16 27);
196
+ --md-sys-color-success: oklch(0.58 0.13 152); --md-sys-color-on-success: oklch(0.99 0.02 152);
197
+ --md-sys-color-success-container: oklch(0.9 0.07 152); --md-sys-color-on-success-container: oklch(0.26 0.1 152);
198
+ --md-sys-color-background: oklch(0.985 0.005 245); --md-sys-color-on-background: oklch(0.15 0.02 248);
199
+ --md-sys-color-surface: oklch(0.985 0.005 245); --md-sys-color-on-surface: oklch(0.15 0.02 248);
200
+ --md-sys-color-surface-variant: oklch(0.9 0.016 245); --md-sys-color-on-surface-variant: oklch(0.4 0.025 248);
201
+ --md-sys-color-outline: oklch(0.62 0.02 245); --md-sys-color-outline-variant: oklch(0.86 0.014 245);
202
+ --md-sys-color-surface-container-lowest: oklch(1 0 0); --md-sys-color-surface-container-low: oklch(0.965 0.005 245);
203
+ --md-sys-color-surface-container: oklch(0.945 0.007 245); --md-sys-color-surface-container-high: oklch(0.925 0.009 245);
204
+ --md-sys-color-surface-container-highest: oklch(0.905 0.011 245);
205
+ --md-sys-color-inverse-surface: oklch(0.22 0.02 248); --md-sys-color-inverse-on-surface: oklch(0.96 0.005 245);
206
+ --md-sys-color-inverse-primary: oklch(0.78 0.11 248); --md-sys-color-scrim: oklch(0.06 0.02 248);
207
+ --npt-font-display:'Sora'; --npt-font-text:'Hanken Grotesk'; --npt-font-num:'Sora';
208
+ --npt-font-display-ar:'Noto Kufi Arabic'; --npt-font-text-ar:'IBM Plex Sans Arabic';
209
+ --npt-corner-xs-base:6px; --npt-corner-sm-base:10px; --npt-corner-md-base:14px; --npt-corner-lg-base:20px; --npt-corner-xl-base:28px; --npt-corner-2xl-base:38px; --npt-corner-full:999px;
210
+ --npt-display-tracking:-0.02em; --npt-display-weight:700;
211
+ /* lever · motion feel (FGLB: stable-minimal-authoritative) */
212
+ --npt-ease-standard:cubic-bezier(.3,0,.2,1); --npt-ease-emphasized:cubic-bezier(.25,0,.15,1); --npt-ease-spring:cubic-bezier(.2,.9,.3,1);
213
+ --npt-dur-fast:240ms; --npt-dur-standard:280ms; --npt-dur-slow:460ms;
214
+ /* lever · glass tint (FGLB: navy-steel) */
215
+ --npt-glass-tint:color-mix(in oklab, var(--md-sys-color-primary) 7%, color-mix(in oklab, var(--md-sys-color-surface) 76%, transparent)); --npt-glass-blur:14px;
216
+ /* lever · named treatments */
217
+ --npt-login-shell:shield-guilloche; --npt-dashboard-hero:restrained-balance; --npt-content-tone:formal-authoritative;
218
+ /* brand expression — signature motif (FGLB: secure guilloché / shield) */
219
+ --npt-motif: repeating-linear-gradient(45deg, color-mix(in oklab,currentColor 7%,transparent) 0 1px, transparent 1px 12px), repeating-linear-gradient(-45deg, color-mix(in oklab,currentColor 7%,transparent) 0 1px, transparent 1px 12px);
220
+ --npt-motif-size: auto; --npt-motif-strength: .85;
221
+ --npt-hero-emblem: linear-gradient(135deg, transparent 45%, color-mix(in oklab,currentColor 15%,transparent) 47% 49%, transparent 51%), linear-gradient(-135deg, transparent 45%, color-mix(in oklab,currentColor 15%,transparent) 47% 49%, transparent 51%), linear-gradient(135deg, transparent 62%, color-mix(in oklab,currentColor 9%,transparent) 64% 66%, transparent 68%);
222
+ }
223
+ [data-theme="fglb"][data-mode="dark"]{
224
+ --md-sys-color-primary: oklch(0.78 0.11 248); --md-sys-color-on-primary: oklch(0.18 0.09 248);
225
+ --md-sys-color-primary-container: oklch(0.34 0.11 248); --md-sys-color-on-primary-container: oklch(0.88 0.07 248);
226
+ --md-sys-color-secondary: oklch(0.82 0.04 248); --md-sys-color-on-secondary: oklch(0.22 0.04 248);
227
+ --md-sys-color-secondary-container: oklch(0.33 0.04 248); --md-sys-color-on-secondary-container: oklch(0.9 0.035 248);
228
+ --md-sys-color-tertiary: oklch(0.82 0.11 85); --md-sys-color-on-tertiary: oklch(0.24 0.08 85);
229
+ --md-sys-color-tertiary-container: oklch(0.4 0.1 85); --md-sys-color-on-tertiary-container: oklch(0.92 0.08 85);
230
+ --md-sys-color-error: oklch(0.78 0.13 27); --md-sys-color-on-error: oklch(0.24 0.1 27);
231
+ --md-sys-color-error-container: oklch(0.36 0.14 27); --md-sys-color-on-error-container: oklch(0.92 0.06 27);
232
+ --md-sys-color-success: oklch(0.78 0.12 152); --md-sys-color-on-success: oklch(0.22 0.08 152);
233
+ --md-sys-color-success-container: oklch(0.34 0.1 152); --md-sys-color-on-success-container: oklch(0.9 0.07 152);
234
+ --md-sys-color-background: oklch(0.12 0.012 248); --md-sys-color-on-background: oklch(0.92 0.01 245);
235
+ --md-sys-color-surface: oklch(0.12 0.012 248); --md-sys-color-on-surface: oklch(0.92 0.01 245);
236
+ --md-sys-color-surface-variant: oklch(0.33 0.02 248); --md-sys-color-on-surface-variant: oklch(0.78 0.02 245);
237
+ --md-sys-color-outline: oklch(0.58 0.02 245); --md-sys-color-outline-variant: oklch(0.31 0.02 245);
238
+ --md-sys-color-surface-container-lowest: oklch(0.08 0.012 248); --md-sys-color-surface-container-low: oklch(0.15 0.014 248);
239
+ --md-sys-color-surface-container: oklch(0.17 0.016 248); --md-sys-color-surface-container-high: oklch(0.21 0.018 248);
240
+ --md-sys-color-surface-container-highest: oklch(0.26 0.02 248);
241
+ --md-sys-color-inverse-surface: oklch(0.92 0.01 245); --md-sys-color-inverse-on-surface: oklch(0.2 0.02 248);
242
+ --md-sys-color-inverse-primary: oklch(0.42 0.13 248); --md-sys-color-scrim: oklch(0 0 0);
243
+ }
244
+
245
+ /* RTL font swap */
246
+ [data-theme][dir="rtl"]{ --npt-font-display:var(--npt-font-display-ar); --npt-font-text:var(--npt-font-text-ar); --npt-font-num:var(--npt-font-text-ar); }