@webority/theme 0.0.9

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.
@@ -0,0 +1,159 @@
1
+ // =====================================================================
2
+ // Lumex — Custom CSS variables.
3
+ // Things Bootstrap doesn't natively have a slot for: extended brand
4
+ // ramps, gradient definitions, easing curves, etc. Imported AFTER
5
+ // `bootstrap/scss/bootstrap` so we don't clobber its computed values.
6
+ // =====================================================================
7
+
8
+ :root {
9
+ // Extended Lumex primary-blue ramp — used for tints, washes, hovers.
10
+ --wui-primary: #2F50E4;
11
+ --wui-primary-hover: #4A66E8;
12
+ --wui-primary-pressed: #2440C4;
13
+ --wui-primary-50: #97A8F2;
14
+ --wui-primary-30: #C1CBF7;
15
+ --wui-primary-20: #D5DCFA;
16
+ --wui-primary-15: #E0E5FB;
17
+ --wui-primary-10: #EAEEFC;
18
+ --wui-primary-5: #F5F6FE;
19
+
20
+ // Foreground ramp (cool blue-grey neutrals) — for text hierarchy
21
+ // beyond Bootstrap's body-color / body-secondary-color.
22
+ --wui-text-heading: #071437;
23
+ --wui-text-1: #252F4A;
24
+ --wui-text-2: #4B5675;
25
+ --wui-text-3: #78829D;
26
+ --wui-text-4: #99A1B7;
27
+ --wui-text-5: #C4CADA;
28
+
29
+ // Surfaces
30
+ --wui-bg-page: #F4F6F8;
31
+ --wui-bg-light: #FFFFFF;
32
+ --wui-bg-elevated: #F9FBFC;
33
+ --wui-bg-muted: #F5F6FA;
34
+ --wui-border-light: #EBEDF3;
35
+ --wui-border-soft: #F4F6F8;
36
+
37
+ // Gradients (hero, CTA)
38
+ --wui-hero-gradient:
39
+ radial-gradient(ellipse 120% 80% at 50% 30%,
40
+ #6E86F0 0%, #2F50E4 35%, #2440C4 75%, #16297A 100%);
41
+ --wui-cta-gradient:
42
+ radial-gradient(ellipse 120% 100% at 50% 50%,
43
+ #1F2F8C 0%, #0E1450 60%, #04082A 100%);
44
+
45
+ // Easing curves — match locked design's CSS / Framer Motion exports
46
+ --wui-ease-out-quart: cubic-bezier(0.22, 1, 0.36, 1);
47
+ --wui-ease-ui: cubic-bezier(0.32, 0.72, 0, 1);
48
+
49
+ // Elevation — exposes the Bootstrap $box-shadow* SCSS vars (set in
50
+ // _lumex-variables.scss) as CSS vars so inline styles / JS / the portal
51
+ // can reach the same values Bootstrap utilities use.
52
+ --wui-shadow-card: #{$box-shadow-sm};
53
+ --wui-shadow-card-lifted: #{$box-shadow};
54
+ --wui-shadow-card-lifted-hover: #{$box-shadow-lg};
55
+
56
+ // ---- Marketing surface ramp -------------------------------------
57
+ // Soft tints + neutral washes used by mega-menu hover, callout cards,
58
+ // and section accents. Distinct from --wui-bg-* (which are the
59
+ // platform/portal palette).
60
+ --wui-surface-soft: #F2EFFE;
61
+ --wui-surface-blue: #ECE4FE;
62
+ --wui-surface-blue-soft: #FCFCFC;
63
+ --wui-surface-mute: #F9FBFC;
64
+ --wui-ink: #000000;
65
+
66
+ // ---- Foreground ramp aliases -----------------------------------
67
+ // Marketing-side parlance — names mirror the standalone design.
68
+ // These point at the same hex values as --wui-text-* (kept as
69
+ // aliases rather than duplicated literals so a re-tune of the text
70
+ // ramp updates both sides at once).
71
+ --wui-fg-2: var(--wui-text-1);
72
+ --wui-fg-3: var(--wui-text-2);
73
+ --wui-fg-4: var(--wui-text-3);
74
+ --wui-fg-5: var(--wui-text-5);
75
+
76
+ // ---- Neutral ramp ----------------------------------------------
77
+ // Used by table emphasis, dividers, and mega-menu hover surfaces.
78
+ --wui-neutral-border-dark: #EBEDF3;
79
+ --wui-neutral-border-light: #F9FBFC;
80
+ --wui-neutral-bg-dark: #F5F6FA;
81
+ --wui-neutral-bg-light: #F9FBFC;
82
+
83
+ // ---- Accent-dark -----------------------------------------------
84
+ // Link hover, focused button, deep-purple CTA underline. Matches
85
+ // $link-hover-color in _lumex-variables.scss but exposed as a CSS
86
+ // var so JS / inline styles can reach it.
87
+ --wui-accent-dark: #2440C4;
88
+
89
+ // ---- Container width + responsive padding ----------------------
90
+ // The standalone design uses a 1512px max canvas with generous side
91
+ // padding that grows on wider viewports. Pair with .container-cloves.
92
+ --wui-container-max: 1512px;
93
+ --wui-container-pad: 24px;
94
+
95
+ // ---- Semantic status ramps -------------------------------------
96
+ // Canonical info/success/warning/danger scales: `active` (text/icon on
97
+ // light), the base `100` (vivid fills/dots), then tints 50/30/20/10/5.
98
+ // Shared by the portal (aliased to --color-*) and marketing alerts/badges.
99
+ --wui-info-active: #056EE9;
100
+ --wui-info: #1B84FF;
101
+ --wui-info-50: #8DC2FF;
102
+ --wui-info-30: #BBDBFF;
103
+ --wui-info-20: #D1E6FF;
104
+ --wui-info-10: #E9F3FF;
105
+ --wui-info-5: #F3F9FF;
106
+
107
+ --wui-success-active: #04B440;
108
+ --wui-success: #17C653;
109
+ --wui-success-50: #8BE3A9;
110
+ --wui-success-30: #BAEECC;
111
+ --wui-success-20: #D1F4DD;
112
+ --wui-success-10: #E8FAEE;
113
+ --wui-success-5: #F3FCF6;
114
+
115
+ --wui-warning-active: #DFA000;
116
+ --wui-warning: #F6B100;
117
+ --wui-warning-50: #FBD880;
118
+ --wui-warning-30: #FDE8B3;
119
+ --wui-warning-20: #FDEFCC;
120
+ --wui-warning-10: #FFF8E6;
121
+ --wui-warning-5: #FEFBF2;
122
+
123
+ --wui-danger-active: #E82646;
124
+ --wui-danger: #F8285A;
125
+ --wui-danger-50: #FC94AD;
126
+ --wui-danger-30: #FDBFCE;
127
+ --wui-danger-20: #FED4DE;
128
+ --wui-danger-10: #FFEAEF;
129
+ --wui-danger-5: #FEF4F6;
130
+
131
+ // Corner radii (DESIGN.md scale) — portal aliases as --radius-*
132
+ --wui-radius-sm: 6px;
133
+ --wui-radius: 10px;
134
+ --wui-radius-lg: 16px;
135
+ --wui-radius-xl: 24px;
136
+
137
+ // ---- Portal dark palette ----------------------------------------
138
+ // Marketing stays light. Portal flips [data-theme="dark"] and maps
139
+ // --color-* aliases onto these so dark hexes live in theme/, not the app.
140
+ --wui-dark-bg-page: #0f1117;
141
+ --wui-dark-bg-elevated: #0d0f15;
142
+ --wui-dark-bg-muted: #232733;
143
+ --wui-dark-bg-surface: #181b23;
144
+ --wui-dark-border: #2a2f3a;
145
+ --wui-dark-border-strong:#3a414f;
146
+ --wui-dark-text: #e6e8ee;
147
+ --wui-dark-text-muted: #b4b9c6;
148
+ --wui-dark-text-subtle: #8a90a0;
149
+ --wui-dark-primary: #6B83EC;
150
+ --wui-dark-primary-hover:#93A6F2;
151
+ }
152
+
153
+ // Bootstrap md / xl (not invented px)
154
+ @media (min-width: 768px) {
155
+ :root { --wui-container-pad: 64px; }
156
+ }
157
+ @media (min-width: 1200px) {
158
+ :root { --wui-container-pad: 88px; }
159
+ }
@@ -0,0 +1,199 @@
1
+ // =====================================================================
2
+ // Lumex — Bootstrap variable overrides.
3
+ // Imported BEFORE `bootstrap/scss/bootstrap` so Bootstrap derives every
4
+ // utility class (.btn-primary, .bg-info, .text-success, etc.) from these
5
+ // values. Shared by Lumex.Web (Razor) and Lumex.Web.Customer.Frontend
6
+ // (React) so the marketing site and portal stay visually identical.
7
+ //
8
+ // Source of truth: docs/DESIGN-SYSTEM.md (mirrors locked palette from
9
+ // Design/Lumex-Updated/src/app/globals.css).
10
+ // =====================================================================
11
+
12
+
13
+ // ---- Brand colors ---------------------------------------------------
14
+ // Lumex primary blue. The full blue ramp lives in _lumex-tokens.scss as
15
+ // CSS variables since Bootstrap only consumes the named theme colors.
16
+ $primary: #2F50E4;
17
+ $secondary: #4B5675; // foreground-3 — quiet text + secondary buttons
18
+ $success: #04B440;
19
+ $info: #056EE9;
20
+ $warning: #DFA000;
21
+ $danger: #E82646;
22
+ $light: #F9FBFC; // surface-mute
23
+ $dark: #071437; // text-heading
24
+
25
+ // Override `$theme-colors` so Bootstrap's $theme-colors map includes
26
+ // our brand. Anything we add here gets utility classes generated
27
+ // automatically (e.g. adding "accent" gives you bg-accent, text-accent).
28
+ $theme-colors: (
29
+ "primary": $primary,
30
+ "secondary": $secondary,
31
+ "success": $success,
32
+ "info": $info,
33
+ "warning": $warning,
34
+ "danger": $danger,
35
+ "light": $light,
36
+ "dark": $dark,
37
+ );
38
+
39
+
40
+ // ---- Body / text ----------------------------------------------------
41
+ $body-color: #252F4A; // text-1 from locked palette
42
+ $body-bg: #FFFFFF;
43
+ $body-secondary-color: #4B5675;
44
+ $body-tertiary-color: #78829D;
45
+ $body-secondary-bg: #F9FBFC;
46
+ $body-tertiary-bg: #F5F6FA;
47
+
48
+
49
+ // ---- Borders --------------------------------------------------------
50
+ $border-color: #EBEDF3;
51
+ $border-color-translucent: rgba(13, 24, 43, 0.08);
52
+
53
+ $border-radius: 0.625rem; // 10px — Bootstrap default 0.375rem felt small for our card chrome
54
+ $border-radius-sm: 0.375rem;
55
+ $border-radius-lg: 1rem;
56
+ $border-radius-xl: 1.5rem;
57
+ $border-radius-2xl: 2rem;
58
+ $border-radius-pill: 9999px;
59
+
60
+
61
+ // ---- Typography -----------------------------------------------------
62
+ $font-family-sans-serif: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
63
+ $font-family-monospace: 'JetBrains Mono', SFMono-Regular, Menlo, Monaco, Consolas, monospace;
64
+
65
+ $font-size-base: 1rem; // 16px
66
+ $line-height-base: 1.55;
67
+
68
+ $font-weight-light: 300;
69
+ $font-weight-normal: 400;
70
+ $font-weight-medium: 500;
71
+ $font-weight-semibold: 600;
72
+ $font-weight-bold: 700;
73
+
74
+ $headings-font-weight: 600;
75
+ $headings-line-height: 1.2;
76
+ $headings-letter-spacing: -0.02em;
77
+ $headings-color: #071437;
78
+
79
+ $display-font-weight: 500;
80
+ $display-line-height: 1.05;
81
+
82
+ $h1-font-size: 2.5rem; // 40px
83
+ $h2-font-size: 2rem; // 32px
84
+ $h3-font-size: 1.5rem; // 24px
85
+ $h4-font-size: 1.25rem; // 20px
86
+ $h5-font-size: 1.125rem; // 18px
87
+ $h6-font-size: 1rem; // 16px
88
+
89
+
90
+ // ---- Spacing --------------------------------------------------------
91
+ // Bootstrap default ladder is 0/.25/.5/1/1.5/3rem. We add 6/8/10/12
92
+ // for hero / section padding so utility classes like `py-8` exist.
93
+ $spacer: 1rem;
94
+ $spacers: (
95
+ 0: 0,
96
+ 1: $spacer * 0.25, // 4px
97
+ 2: $spacer * 0.5, // 8px
98
+ 3: $spacer, // 16px
99
+ 4: $spacer * 1.5, // 24px
100
+ 5: $spacer * 3, // 48px
101
+ 6: $spacer * 4.5, // 72px
102
+ 7: $spacer * 5, // 80px
103
+ 8: $spacer * 6, // 96px
104
+ 10: $spacer * 8, // 128px
105
+ 12: $spacer * 10, // 160px
106
+ );
107
+
108
+
109
+ // ---- Container widths -----------------------------------------------
110
+ // The locked design uses a wider canvas (1512px max) with generous side
111
+ // padding. Override Bootstrap's narrower default so marketing layouts
112
+ // breathe properly on large monitors.
113
+ $container-max-widths: (
114
+ sm: 540px,
115
+ md: 720px,
116
+ lg: 960px,
117
+ xl: 1140px,
118
+ xxl: 1320px,
119
+ );
120
+
121
+
122
+ // ---- Shadows --------------------------------------------------------
123
+ // Mirrors the `card / card-lifted / card-lifted-hover` shadow tokens
124
+ // from the locked design.
125
+ $box-shadow-sm: 0 1px 2px rgba(7, 20, 55, 0.04), 0 4px 12px rgba(7, 20, 55, 0.06);
126
+ $box-shadow: 0 0 2px 0 rgba(145, 158, 171, 0.20), 0 12px 24px -4px rgba(145, 158, 171, 0.12);
127
+ $box-shadow-lg: 0 0 2px 0 rgba(145, 158, 171, 0.20), 0 20px 40px -4px rgba(145, 158, 171, 0.20);
128
+
129
+
130
+ // ---- Buttons --------------------------------------------------------
131
+ $btn-font-weight: 500;
132
+ $btn-padding-y: 0.625rem;
133
+ $btn-padding-x: 1.25rem;
134
+ $btn-padding-y-lg: 0.875rem;
135
+ $btn-padding-x-lg: 1.75rem;
136
+ $btn-border-radius: $border-radius-lg;
137
+ $btn-border-radius-sm: $border-radius;
138
+ $btn-border-radius-lg: $border-radius-xl;
139
+ $btn-transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
140
+
141
+
142
+ // ---- Forms ----------------------------------------------------------
143
+ // Matches the reference `<Input>` component spec (5 locked states:
144
+ // default / hover / focus / disabled / error). The border itself is the
145
+ // focus cue — no separate box-shadow glow. Disabled gets a muted bg.
146
+ // Error is driven by `aria-invalid="true"` (no separate .is-invalid
147
+ // class needed for the visual change).
148
+ $input-bg: #FFFFFF;
149
+ $input-disabled-bg: #F5F6FA; // --wui-bg-muted
150
+ $input-border-color: $border-color;
151
+ $input-focus-border-color: $primary;
152
+ $input-focus-box-shadow: none; // border IS the focus cue
153
+ $input-focus-color: $body-color;
154
+ $input-padding-y: 0.5rem; // 8px → 40px total height with 1rem font + 1.5 line-height
155
+ $input-padding-x: 0.875rem; // 14px — comfortable inset for leading icon space
156
+ $input-border-radius: 0.625rem; // 10px — refined from 16px to match reference rounded-lg
157
+ $input-placeholder-color: #99A1B7; // --wui-text-4
158
+
159
+
160
+ // ---- Cards ----------------------------------------------------------
161
+ $card-border-color: $border-color;
162
+ $card-border-radius: $border-radius-lg;
163
+ // Flat surfaces — no drop shadow on default .card. Depth is conveyed
164
+ // via background tint + hairline border instead. Use .card-lifted
165
+ // utility (in _lumex-components.scss) only when a card legitimately
166
+ // needs to sit "above" the page (currently disabled — set to `none`).
167
+ $card-box-shadow: none;
168
+ $card-spacer-y: 1.5rem;
169
+ $card-spacer-x: 1.5rem;
170
+
171
+
172
+ // ---- Nav / dropdown --------------------------------------------------
173
+ $nav-link-font-weight: 500;
174
+ $dropdown-border-color: $border-color;
175
+ $dropdown-border-radius: $border-radius-lg;
176
+ $dropdown-box-shadow: $box-shadow-lg;
177
+
178
+
179
+ // ---- Modals + toasts ------------------------------------------------
180
+ $modal-content-border-color: $border-color;
181
+ $modal-content-border-radius: $border-radius-xl;
182
+ $modal-content-box-shadow-xs: $box-shadow-lg;
183
+
184
+ $toast-border-color: $border-color;
185
+ $toast-border-radius: $border-radius-pill; // pill-shape toast — matches locked Sonner override
186
+ $toast-box-shadow: $box-shadow-lg;
187
+
188
+
189
+ // ---- Links ----------------------------------------------------------
190
+ $link-color: $primary;
191
+ $link-hover-color: #2440C4; // accent-dark
192
+ $link-decoration: none;
193
+ $link-hover-decoration: underline;
194
+
195
+
196
+ // ---- Focus ring -----------------------------------------------------
197
+ $focus-ring-width: 3px;
198
+ $focus-ring-color: rgba(47, 80, 228, 0.30);
199
+ $focus-ring-blur: 0;
@@ -0,0 +1,128 @@
1
+ // Portal component token aliases.
2
+ //
3
+ // The extracted component CSS (_wui-components.scss) references --color-* /
4
+ // --radius-* / --shadow-* names. Those are aliases onto the canonical --wui-*
5
+ // design tokens, so the component layer is self-contained: a consumer that
6
+ // imports the theme gets the components fully styled, with no app-local token
7
+ // layer required. Alias only — never declare a brand hex here.
8
+
9
+ :root {
10
+ // Surfaces
11
+ --color-bg: var(--wui-bg-page);
12
+ --color-bg-subtle: var(--wui-bg-elevated);
13
+ --color-bg-muted: var(--wui-bg-muted);
14
+ --color-surface: var(--wui-bg-light);
15
+
16
+ // Borders
17
+ --color-border: var(--wui-border-light);
18
+ --color-border-light: var(--wui-border-soft);
19
+ --color-border-strong: var(--wui-text-5);
20
+
21
+ // Text ramp
22
+ --color-text: var(--wui-text-heading);
23
+ --color-text-muted: var(--wui-text-2);
24
+ --color-text-subtle: var(--wui-text-3);
25
+
26
+ // Bootstrap colour vars bridged onto app tokens so un-tokenised BS text
27
+ // flips with data-theme.
28
+ --bs-body-color: var(--color-text);
29
+ --bs-emphasis-color: var(--color-text);
30
+ --bs-secondary-color: var(--color-text-muted);
31
+ --bs-tertiary-color: var(--color-text-subtle);
32
+ --bs-body-bg: var(--color-bg);
33
+ --bs-border-color: var(--color-border);
34
+
35
+ // Brand
36
+ --color-primary: var(--wui-primary);
37
+ --color-primary-hover: var(--wui-primary-pressed);
38
+ --color-primary-soft: var(--wui-primary-10);
39
+
40
+ // Semantic status ramps
41
+ --color-info-active: var(--wui-info-active);
42
+ --color-info: var(--wui-info);
43
+ --color-info-50: var(--wui-info-50);
44
+ --color-info-30: var(--wui-info-30);
45
+ --color-info-20: var(--wui-info-20);
46
+ --color-info-10: var(--wui-info-10);
47
+ --color-info-5: var(--wui-info-5);
48
+ --color-info-strong: var(--color-info-active);
49
+ --color-info-soft: var(--color-info-10);
50
+
51
+ --color-success-active: var(--wui-success-active);
52
+ --color-success: var(--wui-success);
53
+ --color-success-50: var(--wui-success-50);
54
+ --color-success-30: var(--wui-success-30);
55
+ --color-success-20: var(--wui-success-20);
56
+ --color-success-10: var(--wui-success-10);
57
+ --color-success-5: var(--wui-success-5);
58
+ --color-success-strong: var(--color-success-active);
59
+ --color-success-soft: var(--color-success-10);
60
+
61
+ --color-warning-active: var(--wui-warning-active);
62
+ --color-warning: var(--wui-warning);
63
+ --color-warning-50: var(--wui-warning-50);
64
+ --color-warning-30: var(--wui-warning-30);
65
+ --color-warning-20: var(--wui-warning-20);
66
+ --color-warning-10: var(--wui-warning-10);
67
+ --color-warning-5: var(--wui-warning-5);
68
+ --color-warning-strong: var(--color-warning-active);
69
+ --color-warning-soft: var(--color-warning-10);
70
+
71
+ --color-danger-active: var(--wui-danger-active);
72
+ --color-danger: var(--wui-danger);
73
+ --color-danger-50: var(--wui-danger-50);
74
+ --color-danger-30: var(--wui-danger-30);
75
+ --color-danger-20: var(--wui-danger-20);
76
+ --color-danger-10: var(--wui-danger-10);
77
+ --color-danger-5: var(--wui-danger-5);
78
+ --color-danger-strong: var(--color-danger-active);
79
+ --color-danger-soft: var(--color-danger-10);
80
+
81
+ // Accent → warning ramp
82
+ --color-accent: var(--color-warning);
83
+ --color-accent-soft: var(--color-warning-soft);
84
+
85
+ // Scrim — media hover overlays (logo uploader)
86
+ --color-scrim: color-mix(in srgb, var(--wui-text-heading) 62%, transparent);
87
+ --color-on-scrim: var(--wui-bg-light);
88
+
89
+ // Elevation — flat (borders only)
90
+ --shadow-sm: none;
91
+ --shadow-md: none;
92
+ --shadow-lg: none;
93
+
94
+ // Corner radii
95
+ --radius-sm: var(--wui-radius-sm);
96
+ --radius: var(--wui-radius);
97
+ --radius-lg: var(--wui-radius-lg);
98
+ --radius-xl: var(--wui-radius-xl);
99
+ }
100
+
101
+ :root[data-theme="dark"] {
102
+ --color-bg: var(--wui-dark-bg-page);
103
+ --color-bg-subtle: var(--wui-dark-bg-elevated);
104
+ --color-bg-muted: var(--wui-dark-bg-muted);
105
+ --color-surface: var(--wui-dark-bg-surface);
106
+
107
+ --color-border: var(--wui-dark-border);
108
+ --color-border-strong: var(--wui-dark-border-strong);
109
+
110
+ --color-text: var(--wui-dark-text);
111
+ --color-text-muted: var(--wui-dark-text-muted);
112
+ --color-text-subtle: var(--wui-dark-text-subtle);
113
+
114
+ --color-primary: var(--wui-dark-primary);
115
+ --color-primary-hover: var(--wui-dark-primary-hover);
116
+ --color-primary-soft: color-mix(in srgb, var(--wui-primary) 20%, transparent);
117
+
118
+ --color-success-soft: color-mix(in srgb, var(--wui-success) 18%, transparent);
119
+ --color-warning-soft: color-mix(in srgb, var(--wui-warning) 18%, transparent);
120
+ --color-danger-soft: color-mix(in srgb, var(--wui-danger) 18%, transparent);
121
+ --color-info-soft: color-mix(in srgb, var(--wui-info) 18%, transparent);
122
+ --color-accent-soft: var(--color-warning-soft);
123
+
124
+ --color-scrim: color-mix(in srgb, black 62%, transparent);
125
+ --color-on-scrim: var(--wui-bg-light);
126
+
127
+ color-scheme: dark;
128
+ }