osi-cards-lib 1.5.32 → 1.5.34
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/osi-cards-lib.mjs +31889 -0
- package/fesm2022/osi-cards-lib.mjs.map +1 -0
- package/index.d.ts +11528 -0
- package/package.json +25 -13
- package/scripts/setup-angular-styles.js +169 -0
- package/styles/_components.scss +38 -0
- package/styles/_index.scss +25 -0
- package/styles/_osi-cards-mixins.scss +459 -0
- package/styles/_osi-cards-tokens.scss +333 -0
- package/styles/_styles-scoped.scss +81 -0
- package/styles/_styles.scss +26 -0
- package/styles/bundles/_ai-card.scss +245 -0
- package/styles/bundles/_all.scss +68 -0
- package/styles/bundles/_base.scss +60 -0
- package/styles/bundles/_card-skeleton.scss +290 -0
- package/styles/bundles/_index.scss +25 -0
- package/styles/bundles/_sections.scss +48 -0
- package/styles/bundles/_tokens-only.scss +139 -0
- package/styles/components/_ai-card-renderer.scss +104 -0
- package/styles/components/_badges.scss +317 -0
- package/styles/components/_card-actions.scss +169 -0
- package/styles/components/_card-footer.scss +47 -0
- package/styles/components/_component-styles.scss +205 -0
- package/styles/components/_empty-state.scss +630 -0
- package/styles/components/_hero-card.scss +422 -0
- package/styles/components/_image-fallback.scss +28 -0
- package/styles/components/_streaming-effects.scss +518 -0
- package/styles/components/cards/_ai-card.scss +718 -0
- package/styles/components/sections/_all-sections.generated.scss +41 -0
- package/styles/components/sections/_all-sections.scss +1086 -0
- package/styles/components/sections/_balanced-compact-system.scss +186 -0
- package/styles/components/sections/_compact-mixins.scss +180 -0
- package/styles/components/sections/_component-mixins.scss +454 -0
- package/styles/components/sections/_design-system.scss +477 -0
- package/styles/components/sections/_design-tokens.scss +308 -0
- package/styles/components/sections/_enhanced-design-variables.scss +147 -0
- package/styles/components/sections/_master-compact-system.scss +302 -0
- package/styles/components/sections/_master-dense-system.scss +239 -0
- package/styles/components/sections/_minimalistic-design.scss +268 -0
- package/styles/components/sections/_modern-effects.scss +392 -0
- package/styles/components/sections/_modern-sections.scss +351 -0
- package/styles/components/sections/_perfect-system.scss +204 -0
- package/styles/components/sections/_section-animations.scss +331 -0
- package/styles/components/sections/_section-shell.scss +337 -0
- package/styles/components/sections/_section-types.generated.scss +30 -0
- package/styles/components/sections/_sections-all.scss +26 -0
- package/styles/components/sections/_sections-base.scss +334 -0
- package/styles/components/sections/_typography-system.scss +327 -0
- package/styles/components/sections/_ultra-compact-tokens.scss +375 -0
- package/styles/components/sections/_unified-section-style.scss +157 -0
- package/styles/components/sections/_utility-classes.scss +567 -0
- package/styles/components/sections/_visual-effects-library.scss +374 -0
- package/styles/core/_animations.scss +1498 -0
- package/styles/core/_bootstrap-reset.scss +445 -0
- package/styles/core/_color-helpers.scss +46 -0
- package/styles/core/_global-unified.scss +118 -0
- package/styles/core/_global.scss +73 -0
- package/styles/core/_mixins.scss +491 -0
- package/styles/core/_surface-layers.scss +76 -0
- package/styles/core/_utilities.scss +326 -0
- package/styles/core/_variables-unified.scss +57 -0
- package/styles/core/_variables.scss +36 -0
- package/styles/core/variables/_colors-source.scss +34 -0
- package/styles/core/variables/_colors-unified.scss +26 -0
- package/styles/core/variables/_colors.scss +21 -0
- package/styles/critical.scss +353 -0
- package/styles/design-system/_compact-theme.scss +159 -0
- package/styles/design-system/_section-base.scss +426 -0
- package/styles/design-system/_tokens.scss +237 -0
- package/styles/design-system/_unified-sections.scss +215 -0
- package/styles/layout/_feature-grid.scss +322 -0
- package/styles/layout/_masonry.scss +734 -0
- package/styles/layout/_tilt.scss +244 -0
- package/styles/micro-interactions.scss +583 -0
- package/styles/mixins/_section-mixins.scss +280 -0
- package/styles/non-critical.scss +643 -0
- package/styles/reset/_framework-reset.scss +457 -0
- package/styles/reset/_index.scss +14 -0
- package/styles/reset/_shadow-reset.scss +383 -0
- package/styles/responsive.scss +326 -0
- package/styles/themes.scss +573 -0
- package/styles/tokens/_index.scss +92 -0
- package/styles/tokens/_master.scss +1404 -0
- package/styles/tokens/_section-tokens.generated.scss +140 -0
- package/postcss.config.js +0 -81
- package/section-registry.json +0 -3864
- package/section-registry.schema.json +0 -264
|
@@ -0,0 +1,1404 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// MASTER DESIGN TOKENS - Single Source of Truth
|
|
3
|
+
// ============================================
|
|
4
|
+
//
|
|
5
|
+
// This file is the PRIMARY source for CSS design tokens (`--osi-*` variables).
|
|
6
|
+
// All other SCSS files import from here.
|
|
7
|
+
//
|
|
8
|
+
// ⚠️ TOKEN SOURCE RELATIONSHIPS:
|
|
9
|
+
// - CSS tokens (`--osi-*`): This file is authoritative
|
|
10
|
+
// - JS theme presets (`--theme-*`): See `themes/presets.ts` (applied via JavaScript)
|
|
11
|
+
// - Demo app themes: See `styles/themes.scss` (for demo app global theming)
|
|
12
|
+
//
|
|
13
|
+
// NOTE: `--theme-*` values in `themes/presets.ts` should match corresponding
|
|
14
|
+
// values in this file's mixins (e.g., `osi-theme-dark`, `osi-theme-light`).
|
|
15
|
+
//
|
|
16
|
+
// TODO: Consider consolidating all token sources into a single definition file
|
|
17
|
+
// that both SCSS and TypeScript can consume to eliminate duplication.
|
|
18
|
+
//
|
|
19
|
+
// Organization:
|
|
20
|
+
// 1. PRIMITIVE TOKENS - Raw color values, base numbers
|
|
21
|
+
// 2. SEMANTIC TOKENS - Meaningful references to primitives
|
|
22
|
+
// 3. COMPONENT TOKENS - UI element-specific values
|
|
23
|
+
// 4. THEME VARIANTS - Light/dark mode overrides
|
|
24
|
+
//
|
|
25
|
+
// ============================================
|
|
26
|
+
|
|
27
|
+
// ============================================
|
|
28
|
+
// 1. PRIMITIVE TOKENS
|
|
29
|
+
// ============================================
|
|
30
|
+
|
|
31
|
+
// --- Brand Colors ---
|
|
32
|
+
$osi-color-brand: #ff7900;
|
|
33
|
+
$osi-color-brand-dark: #cc5f00;
|
|
34
|
+
$osi-color-brand-light: #ff9933;
|
|
35
|
+
$osi-color-brand-pale: #ffe6cc;
|
|
36
|
+
|
|
37
|
+
// --- Neutral Colors ---
|
|
38
|
+
$osi-color-white: #ffffff;
|
|
39
|
+
$osi-color-black: #000000;
|
|
40
|
+
|
|
41
|
+
// --- Grayscale Ramp ---
|
|
42
|
+
$osi-gray-50: #ffffff;
|
|
43
|
+
$osi-gray-100: #fcfcfc;
|
|
44
|
+
$osi-gray-150: #f7f7f7;
|
|
45
|
+
$osi-gray-200: #f0f0f1;
|
|
46
|
+
$osi-gray-300: #e9e9e9;
|
|
47
|
+
$osi-gray-400: #92999e;
|
|
48
|
+
$osi-gray-500: #5a5f62;
|
|
49
|
+
$osi-gray-600: #343541;
|
|
50
|
+
$osi-gray-700: #2a2a2a;
|
|
51
|
+
$osi-gray-800: #232323;
|
|
52
|
+
$osi-gray-850: #171717;
|
|
53
|
+
$osi-gray-900: #000000;
|
|
54
|
+
|
|
55
|
+
// --- Status Colors ---
|
|
56
|
+
$osi-color-success: #22c55e;
|
|
57
|
+
$osi-color-warning: #f59e0b;
|
|
58
|
+
$osi-color-error: #ef4444;
|
|
59
|
+
$osi-color-info: #3b82f6;
|
|
60
|
+
$osi-color-neutral: #6b7280;
|
|
61
|
+
|
|
62
|
+
// --- Trend Colors ---
|
|
63
|
+
$osi-color-trend-up: #4ade80;
|
|
64
|
+
$osi-color-trend-down: #f87171;
|
|
65
|
+
$osi-color-trend-stable: #facc15;
|
|
66
|
+
$osi-color-trend-neutral: #94a3b8;
|
|
67
|
+
|
|
68
|
+
// --- Text Colors (Light Theme) ---
|
|
69
|
+
$osi-foreground-light: #1c1c1f;
|
|
70
|
+
$osi-muted-foreground-light: #555861;
|
|
71
|
+
|
|
72
|
+
// --- Text Colors (Dark Theme) ---
|
|
73
|
+
$osi-foreground-dark: #ffffff;
|
|
74
|
+
$osi-muted-foreground-dark: #aaaaaa;
|
|
75
|
+
|
|
76
|
+
// --- Background Colors (Light Theme) ---
|
|
77
|
+
$osi-background-light: #ffffff;
|
|
78
|
+
$osi-card-bg-light: #fefefe;
|
|
79
|
+
$osi-section-bg-light: #fafafa;
|
|
80
|
+
|
|
81
|
+
// --- Background Colors (Dark Theme) ---
|
|
82
|
+
$osi-background-dark: #0a0a0a;
|
|
83
|
+
$osi-background-dark-scoped: #030303;
|
|
84
|
+
$osi-card-bg-dark: rgba(20, 20, 20, 0.6);
|
|
85
|
+
|
|
86
|
+
// ============================================
|
|
87
|
+
// 2. COLOR HELPER FUNCTIONS & VARIABLES
|
|
88
|
+
// ============================================
|
|
89
|
+
|
|
90
|
+
/// Generate brand color with opacity
|
|
91
|
+
/// @param {Number} $opacity - Opacity value (0-1)
|
|
92
|
+
@function brand-alpha($opacity) {
|
|
93
|
+
@return rgba($osi-color-brand, $opacity);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/// Generate foreground color with opacity
|
|
97
|
+
/// @param {Number} $opacity - Opacity value (0-1)
|
|
98
|
+
@function foreground-alpha($opacity) {
|
|
99
|
+
@return rgba($osi-foreground-light, $opacity);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// Generate white with opacity
|
|
103
|
+
/// @param {Number} $opacity - Opacity value (0-1)
|
|
104
|
+
@function white-alpha($opacity) {
|
|
105
|
+
@return rgba(255, 255, 255, $opacity);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/// Generate black with opacity
|
|
109
|
+
/// @param {Number} $opacity - Opacity value (0-1)
|
|
110
|
+
@function black-alpha($opacity) {
|
|
111
|
+
@return rgba(0, 0, 0, $opacity);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// --- Pre-computed Brand Opacity Variants ---
|
|
115
|
+
$brand-color: $osi-color-brand;
|
|
116
|
+
$brand-color-rgb: 255, 121, 0;
|
|
117
|
+
$brand-color-90: rgba($osi-color-brand, 0.9);
|
|
118
|
+
$brand-color-80: rgba($osi-color-brand, 0.8);
|
|
119
|
+
$brand-color-70: rgba($osi-color-brand, 0.7);
|
|
120
|
+
$brand-color-60: rgba($osi-color-brand, 0.6);
|
|
121
|
+
$brand-color-50: rgba($osi-color-brand, 0.5);
|
|
122
|
+
$brand-color-40: rgba($osi-color-brand, 0.4);
|
|
123
|
+
$brand-color-35: rgba($osi-color-brand, 0.35);
|
|
124
|
+
$brand-color-30: rgba($osi-color-brand, 0.3);
|
|
125
|
+
$brand-color-25: rgba($osi-color-brand, 0.25);
|
|
126
|
+
$brand-color-22: rgba($osi-color-brand, 0.22);
|
|
127
|
+
$brand-color-20: rgba($osi-color-brand, 0.2);
|
|
128
|
+
$brand-color-15: rgba($osi-color-brand, 0.15);
|
|
129
|
+
$brand-color-12: rgba($osi-color-brand, 0.12);
|
|
130
|
+
$brand-color-10: rgba($osi-color-brand, 0.1);
|
|
131
|
+
$brand-color-08: rgba($osi-color-brand, 0.08);
|
|
132
|
+
$brand-color-05: rgba($osi-color-brand, 0.05);
|
|
133
|
+
$brand-color-03: rgba($osi-color-brand, 0.03);
|
|
134
|
+
|
|
135
|
+
// --- Pre-computed Foreground Opacity Variants ---
|
|
136
|
+
$foreground-color: $osi-foreground-light;
|
|
137
|
+
$foreground-rgb: 28, 28, 31;
|
|
138
|
+
$foreground-90: rgba($osi-foreground-light, 0.9);
|
|
139
|
+
$foreground-80: rgba($osi-foreground-light, 0.8);
|
|
140
|
+
$foreground-70: rgba($osi-foreground-light, 0.7);
|
|
141
|
+
$foreground-60: rgba($osi-foreground-light, 0.6);
|
|
142
|
+
$foreground-50: rgba($osi-foreground-light, 0.5);
|
|
143
|
+
$foreground-40: rgba($osi-foreground-light, 0.4);
|
|
144
|
+
$foreground-30: rgba($osi-foreground-light, 0.3);
|
|
145
|
+
$foreground-20: rgba($osi-foreground-light, 0.2);
|
|
146
|
+
$foreground-16: rgba($osi-foreground-light, 0.16);
|
|
147
|
+
$foreground-14: rgba($osi-foreground-light, 0.14);
|
|
148
|
+
$foreground-12: rgba($osi-foreground-light, 0.12);
|
|
149
|
+
$foreground-10: rgba($osi-foreground-light, 0.1);
|
|
150
|
+
$foreground-08: rgba($osi-foreground-light, 0.08);
|
|
151
|
+
$foreground-06: rgba($osi-foreground-light, 0.06);
|
|
152
|
+
$foreground-05: rgba($osi-foreground-light, 0.05);
|
|
153
|
+
$foreground-04: rgba($osi-foreground-light, 0.04);
|
|
154
|
+
$foreground-03: rgba($osi-foreground-light, 0.03);
|
|
155
|
+
|
|
156
|
+
// --- Pre-computed Secondary Text Variants ---
|
|
157
|
+
$text-secondary: $osi-muted-foreground-light;
|
|
158
|
+
$text-secondary-rgb: 85, 88, 97;
|
|
159
|
+
$text-secondary-50: rgba($osi-muted-foreground-light, 0.5);
|
|
160
|
+
$text-secondary-30: rgba($osi-muted-foreground-light, 0.3);
|
|
161
|
+
$text-secondary-20: rgba($osi-muted-foreground-light, 0.2);
|
|
162
|
+
$text-secondary-15: rgba($osi-muted-foreground-light, 0.15);
|
|
163
|
+
$text-secondary-10: rgba($osi-muted-foreground-light, 0.1);
|
|
164
|
+
$text-secondary-05: rgba($osi-muted-foreground-light, 0.05);
|
|
165
|
+
|
|
166
|
+
// --- Pre-computed Muted Foreground (Dark Theme) ---
|
|
167
|
+
$muted-foreground: $osi-muted-foreground-dark;
|
|
168
|
+
$muted-foreground-rgb: 170, 170, 170;
|
|
169
|
+
$muted-foreground-50: rgba($osi-muted-foreground-dark, 0.5);
|
|
170
|
+
$muted-foreground-30: rgba($osi-muted-foreground-dark, 0.3);
|
|
171
|
+
$muted-foreground-20: rgba($osi-muted-foreground-dark, 0.2);
|
|
172
|
+
$muted-foreground-10: rgba($osi-muted-foreground-dark, 0.1);
|
|
173
|
+
|
|
174
|
+
// --- Pre-computed White Opacity Variants ---
|
|
175
|
+
$white-90: rgba(255, 255, 255, 0.9);
|
|
176
|
+
$white-80: rgba(255, 255, 255, 0.8);
|
|
177
|
+
$white-70: rgba(255, 255, 255, 0.7);
|
|
178
|
+
$white-60: rgba(255, 255, 255, 0.6);
|
|
179
|
+
$white-50: rgba(255, 255, 255, 0.5);
|
|
180
|
+
$white-40: rgba(255, 255, 255, 0.4);
|
|
181
|
+
$white-30: rgba(255, 255, 255, 0.3);
|
|
182
|
+
$white-20: rgba(255, 255, 255, 0.2);
|
|
183
|
+
$white-15: rgba(255, 255, 255, 0.15);
|
|
184
|
+
$white-10: rgba(255, 255, 255, 0.1);
|
|
185
|
+
$white-05: rgba(255, 255, 255, 0.05);
|
|
186
|
+
|
|
187
|
+
// --- Pre-computed Status Color Variants ---
|
|
188
|
+
$success-color: $osi-color-success;
|
|
189
|
+
$success-color-20: rgba($osi-color-success, 0.2);
|
|
190
|
+
$success-color-15: rgba($osi-color-success, 0.15);
|
|
191
|
+
$success-color-10: rgba($osi-color-success, 0.1);
|
|
192
|
+
|
|
193
|
+
$warning-color: $osi-color-warning;
|
|
194
|
+
$warning-color-20: rgba($osi-color-warning, 0.2);
|
|
195
|
+
$warning-color-15: rgba($osi-color-warning, 0.15);
|
|
196
|
+
$warning-color-10: rgba($osi-color-warning, 0.1);
|
|
197
|
+
|
|
198
|
+
$error-color: $osi-color-error;
|
|
199
|
+
$error-color-20: rgba($osi-color-error, 0.2);
|
|
200
|
+
$error-color-15: rgba($osi-color-error, 0.15);
|
|
201
|
+
$error-color-10: rgba($osi-color-error, 0.1);
|
|
202
|
+
|
|
203
|
+
$info-color: $osi-color-info;
|
|
204
|
+
$info-color-20: rgba($osi-color-info, 0.2);
|
|
205
|
+
$info-color-15: rgba($osi-color-info, 0.15);
|
|
206
|
+
$info-color-10: rgba($osi-color-info, 0.1);
|
|
207
|
+
|
|
208
|
+
// --- Border Colors ---
|
|
209
|
+
$border-light: rgba(0, 0, 0, 0.08);
|
|
210
|
+
$border-medium: rgba(0, 0, 0, 0.14);
|
|
211
|
+
$border-dark: rgba(0, 0, 0, 0.22);
|
|
212
|
+
$border-light-dark: rgba(255, 255, 255, 0.08);
|
|
213
|
+
$border-medium-dark: rgba(255, 255, 255, 0.16);
|
|
214
|
+
$border-dark-dark: rgba(255, 255, 255, 0.28);
|
|
215
|
+
|
|
216
|
+
// --- Shadow Colors ---
|
|
217
|
+
$shadow-light: rgba(0, 0, 0, 0.07);
|
|
218
|
+
$shadow-medium: rgba(0, 0, 0, 0.12);
|
|
219
|
+
$shadow-dark: rgba(0, 0, 0, 0.18);
|
|
220
|
+
$shadow-light-dark: rgba(0, 0, 0, 0.55);
|
|
221
|
+
$shadow-medium-dark: rgba(0, 0, 0, 0.65);
|
|
222
|
+
$shadow-dark-dark: rgba(0, 0, 0, 0.75);
|
|
223
|
+
|
|
224
|
+
// --- Background Aliases ---
|
|
225
|
+
$card-bg: $osi-card-bg-light;
|
|
226
|
+
$card-bg-hover: #fcfcfc;
|
|
227
|
+
$section-bg: $osi-section-bg-light;
|
|
228
|
+
$section-bg-hover: #f7f7f7;
|
|
229
|
+
|
|
230
|
+
// ============================================
|
|
231
|
+
// 3. BREAKPOINTS
|
|
232
|
+
// ============================================
|
|
233
|
+
|
|
234
|
+
$breakpoints: (
|
|
235
|
+
"mobile": 520px,
|
|
236
|
+
"tablet": 640px,
|
|
237
|
+
"lg": 820px,
|
|
238
|
+
"desktop": 1024px,
|
|
239
|
+
"wide": 1280px,
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
// ============================================
|
|
243
|
+
// 4. CSS VARIABLE MIXINS
|
|
244
|
+
// ============================================
|
|
245
|
+
|
|
246
|
+
/// Generate base color tokens (shared between themes)
|
|
247
|
+
@mixin osi-base-colors() {
|
|
248
|
+
--color-white: #{$osi-color-white};
|
|
249
|
+
--color-black: #{$osi-color-black};
|
|
250
|
+
--color-brand: #{$osi-color-brand};
|
|
251
|
+
--color-brand-dark: #{$osi-color-brand-dark};
|
|
252
|
+
--color-brand-light: #{$osi-color-brand-light};
|
|
253
|
+
|
|
254
|
+
// Grayscale
|
|
255
|
+
--color-gray-50: #{$osi-gray-50};
|
|
256
|
+
--color-gray-100: #{$osi-gray-100};
|
|
257
|
+
--color-gray-150: #{$osi-gray-150};
|
|
258
|
+
--color-gray-200: #{$osi-gray-200};
|
|
259
|
+
--color-gray-300: #{$osi-gray-300};
|
|
260
|
+
--color-gray-400: #{$osi-gray-400};
|
|
261
|
+
--color-gray-500: #{$osi-gray-500};
|
|
262
|
+
--color-gray-600: #{$osi-gray-600};
|
|
263
|
+
--color-gray-700: #{$osi-gray-700};
|
|
264
|
+
--color-gray-800: #{$osi-gray-800};
|
|
265
|
+
--color-gray-850: #{$osi-gray-850};
|
|
266
|
+
--color-gray-900: #{$osi-gray-900};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/// Generate status color tokens
|
|
270
|
+
@mixin osi-status-colors() {
|
|
271
|
+
--status-success: #{$osi-color-success};
|
|
272
|
+
--status-success-bg: #{$success-color-15};
|
|
273
|
+
--status-success-border: rgba(74, 222, 128, 0.4);
|
|
274
|
+
|
|
275
|
+
--status-warning: #{$osi-color-warning};
|
|
276
|
+
--status-warning-bg: rgba(253, 186, 116, 0.15);
|
|
277
|
+
--status-warning-border: rgba(251, 191, 36, 0.4);
|
|
278
|
+
|
|
279
|
+
--status-error: #{$osi-color-error};
|
|
280
|
+
--status-error-bg: #{$error-color-15};
|
|
281
|
+
--status-error-border: rgba(248, 113, 113, 0.4);
|
|
282
|
+
|
|
283
|
+
--status-info: #{$osi-color-info};
|
|
284
|
+
--status-info-bg: #{$info-color-15};
|
|
285
|
+
--status-info-border: rgba(147, 197, 253, 0.4);
|
|
286
|
+
|
|
287
|
+
--status-neutral: #{$osi-color-neutral};
|
|
288
|
+
--status-neutral-bg: rgba(107, 114, 128, 0.15);
|
|
289
|
+
--status-neutral-border: rgba(156, 163, 175, 0.4);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/// Generate shadow tokens
|
|
293
|
+
@mixin osi-shadows() {
|
|
294
|
+
// Elevation shadows - tight under the element
|
|
295
|
+
--shadow-sm: 0 1px 1px rgba(0, 0, 0, 0.03);
|
|
296
|
+
--shadow-md: 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
297
|
+
--shadow-lg: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
298
|
+
--shadow-xl: 0 2px 4px rgba(0, 0, 0, 0.06);
|
|
299
|
+
|
|
300
|
+
// Glow shadows (brand-colored) - very subtle
|
|
301
|
+
--shadow-glow-sm: 0 0 3px #{$brand-color-05};
|
|
302
|
+
--shadow-glow-md: 0 0 5px #{$brand-color-08};
|
|
303
|
+
--shadow-glow-lg: 0 0 8px #{$brand-color-10};
|
|
304
|
+
|
|
305
|
+
// Inset shadows
|
|
306
|
+
--shadow-inset-sm: inset 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
307
|
+
--shadow-inset-md: inset 0 2px 4px rgba(0, 0, 0, 0.05);
|
|
308
|
+
|
|
309
|
+
// Combined hover shadow - subtle with brand accent
|
|
310
|
+
--shadow-hover: var(--shadow-lg), var(--shadow-glow-sm);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/// Generate radius tokens
|
|
314
|
+
@mixin osi-radius() {
|
|
315
|
+
--radius-base: 0.625rem;
|
|
316
|
+
--radius-xs: 0.25rem;
|
|
317
|
+
--radius-sm: 0.375rem;
|
|
318
|
+
--radius-md: 0.5rem;
|
|
319
|
+
--radius-lg: 0.75rem;
|
|
320
|
+
--radius-xl: 1rem;
|
|
321
|
+
--radius-2xl: 1.5rem;
|
|
322
|
+
--radius-full: 9999px;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/// Generate spacing tokens
|
|
326
|
+
@mixin osi-spacing() {
|
|
327
|
+
--spacing-base: 0.25rem;
|
|
328
|
+
|
|
329
|
+
// Primary spacing scale (fluid)
|
|
330
|
+
--space-1: clamp(2px, 0.4vw, 6px);
|
|
331
|
+
--space-2: clamp(4px, 0.6vw, 8px);
|
|
332
|
+
--space-3: clamp(6px, 0.8vw, 12px);
|
|
333
|
+
--space-4: clamp(8px, 1vw, 14px);
|
|
334
|
+
--space-5: clamp(10px, 1.2vw, 18px);
|
|
335
|
+
--space-6: clamp(12px, 1.4vw, 20px);
|
|
336
|
+
--space-7: clamp(14px, 1.6vw, 22px);
|
|
337
|
+
--space-8: clamp(16px, 1.8vw, 24px);
|
|
338
|
+
--space-9: clamp(18px, 2vw, 28px);
|
|
339
|
+
--space-10: clamp(20px, 2.2vw, 32px);
|
|
340
|
+
--space-11: clamp(22px, 2.4vw, 36px);
|
|
341
|
+
--space-12: clamp(24px, 2.6vw, 40px);
|
|
342
|
+
|
|
343
|
+
// Semantic spacing aliases
|
|
344
|
+
--spacing-xs: var(--space-1);
|
|
345
|
+
--spacing-sm: var(--space-2);
|
|
346
|
+
--spacing-md: var(--space-3);
|
|
347
|
+
--spacing-lg: var(--space-4);
|
|
348
|
+
--spacing-xl: var(--space-5);
|
|
349
|
+
--spacing-2xl: var(--space-6);
|
|
350
|
+
--spacing-3xl: var(--space-7);
|
|
351
|
+
--spacing-4xl: var(--space-8);
|
|
352
|
+
|
|
353
|
+
// Fixed grid gaps
|
|
354
|
+
--gap-xs: 4px;
|
|
355
|
+
--gap-sm: 6px;
|
|
356
|
+
--gap-md: 8px;
|
|
357
|
+
--gap-lg: 12px;
|
|
358
|
+
--gap-xl: 16px;
|
|
359
|
+
--gap-2xl: 20px;
|
|
360
|
+
--gap-3xl: 24px;
|
|
361
|
+
--gap-4xl: 32px;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/// Generate z-index scale tokens (isolated within container)
|
|
365
|
+
/// All z-indices are relative to 0 to prevent host app collisions
|
|
366
|
+
@mixin osi-z-index() {
|
|
367
|
+
// Base layer (content)
|
|
368
|
+
--z-base: 0;
|
|
369
|
+
--z-content: 1;
|
|
370
|
+
|
|
371
|
+
// Elevated layers (cards, sections)
|
|
372
|
+
--z-elevated: 10;
|
|
373
|
+
--z-card: 10;
|
|
374
|
+
--z-section: 15;
|
|
375
|
+
|
|
376
|
+
// Interactive layers (dropdowns, tooltips)
|
|
377
|
+
--z-dropdown: 100;
|
|
378
|
+
--z-tooltip: 200;
|
|
379
|
+
--z-popover: 300;
|
|
380
|
+
|
|
381
|
+
// Overlay layers (modals, dialogs)
|
|
382
|
+
--z-overlay: 400;
|
|
383
|
+
--z-modal: 500;
|
|
384
|
+
--z-dialog: 600;
|
|
385
|
+
|
|
386
|
+
// Top-most layers (notifications, alerts)
|
|
387
|
+
--z-notification: 700;
|
|
388
|
+
--z-toast: 800;
|
|
389
|
+
|
|
390
|
+
// Maximum layer (for special cases)
|
|
391
|
+
--z-max: 999;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/// Generate animation tokens
|
|
395
|
+
@mixin osi-animation() {
|
|
396
|
+
// Duration scale
|
|
397
|
+
--duration-instant: 40ms;
|
|
398
|
+
--duration-fast: 80ms;
|
|
399
|
+
--duration-normal: 160ms;
|
|
400
|
+
--duration-moderate: 220ms;
|
|
401
|
+
--duration-slow: 300ms;
|
|
402
|
+
--duration-slower: 380ms;
|
|
403
|
+
--duration-slowest: 460ms;
|
|
404
|
+
|
|
405
|
+
// Easing functions
|
|
406
|
+
--ease-out-smooth: cubic-bezier(0.23, 1, 0.32, 1);
|
|
407
|
+
--ease-in-out-smooth: cubic-bezier(0.4, 0, 0.2, 1);
|
|
408
|
+
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
409
|
+
--ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
|
410
|
+
--ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
|
|
411
|
+
--ease-in-out-quad: cubic-bezier(0.455, 0.03, 0.515, 0.955);
|
|
412
|
+
|
|
413
|
+
// Motion distances
|
|
414
|
+
--motion-distance-xs: 2px;
|
|
415
|
+
--motion-distance-sm: 4px;
|
|
416
|
+
--motion-distance-md: 6px;
|
|
417
|
+
--motion-distance-lg: 10px;
|
|
418
|
+
--motion-distance-xl: 12px;
|
|
419
|
+
|
|
420
|
+
// Motion scales
|
|
421
|
+
--motion-scale-soft-start: 0.992;
|
|
422
|
+
--motion-scale-soft-end: 1;
|
|
423
|
+
--motion-scale-pop: 1.015;
|
|
424
|
+
|
|
425
|
+
// Stagger delays
|
|
426
|
+
--stagger-delay-fast: 15ms;
|
|
427
|
+
--stagger-delay-base: 25ms;
|
|
428
|
+
--stagger-delay-slow: 45ms;
|
|
429
|
+
|
|
430
|
+
// Animation playback
|
|
431
|
+
--animation-fill-mode: both;
|
|
432
|
+
--animation-play-state: running;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/// Generate opacity tokens
|
|
436
|
+
@mixin osi-opacity() {
|
|
437
|
+
--opacity-subtle: 0.05;
|
|
438
|
+
--opacity-muted: 0.15;
|
|
439
|
+
--opacity-medium: 0.4;
|
|
440
|
+
--opacity-strong: 0.7;
|
|
441
|
+
--opacity-solid: 0.9;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/// Generate typography tokens
|
|
445
|
+
/// @param {String} $variant - 'demo' or 'integration'
|
|
446
|
+
@mixin osi-typography($variant: "demo") {
|
|
447
|
+
// Both demo and integration now use the same compact values
|
|
448
|
+
--font-size-base: 13px;
|
|
449
|
+
--text-xs: 0.625rem;
|
|
450
|
+
--text-sm: 0.75rem;
|
|
451
|
+
--text-base: 0.875rem;
|
|
452
|
+
--text-lg: 0.8125rem;
|
|
453
|
+
--text-xl: 1.125rem;
|
|
454
|
+
--text-2xl: 1.0625rem;
|
|
455
|
+
--text-3xl: 1.75rem;
|
|
456
|
+
--text-4xl: 2.125rem;
|
|
457
|
+
--text-5xl: 2.875rem;
|
|
458
|
+
--text-7xl: 4.375rem;
|
|
459
|
+
|
|
460
|
+
--font-weight-normal: 400;
|
|
461
|
+
--font-weight-medium: 500;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/// Generate card typography tokens
|
|
465
|
+
/// @param {String} $variant - 'demo' or 'integration'
|
|
466
|
+
@mixin osi-card-typography($variant: "demo") {
|
|
467
|
+
// Both demo and integration now use the same compact values
|
|
468
|
+
// Section Titles
|
|
469
|
+
--section-title-font-size: clamp(0.92rem, 0.87rem + 0.2vw, 1.07rem);
|
|
470
|
+
--section-title-font-weight: 700;
|
|
471
|
+
--section-title-letter-spacing: -0.02em;
|
|
472
|
+
--section-title-line-height: 1.3;
|
|
473
|
+
--section-title-text-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
|
|
474
|
+
|
|
475
|
+
// Card Titles
|
|
476
|
+
--card-title-font-size: clamp(0.83rem, 0.78rem + 0.15vw, 0.93rem);
|
|
477
|
+
--card-title-font-weight: 700;
|
|
478
|
+
--card-title-letter-spacing: -0.01em;
|
|
479
|
+
--card-title-line-height: 1.4;
|
|
480
|
+
--card-title-text-shadow: 0 1px 1px rgba(0, 0, 0, 0.06);
|
|
481
|
+
|
|
482
|
+
// Card Subtitles
|
|
483
|
+
--card-subtitle-font-size: clamp(0.65rem, 0.625rem + 0.1vw, 0.7rem);
|
|
484
|
+
--card-subtitle-font-weight: 500;
|
|
485
|
+
--card-subtitle-letter-spacing: 0.015em;
|
|
486
|
+
--card-subtitle-line-height: 1.3;
|
|
487
|
+
|
|
488
|
+
// Card Labels
|
|
489
|
+
--card-label-font-size: clamp(0.5rem, 0.48rem + 0.05vw, 0.5rem);
|
|
490
|
+
--card-label-font-weight: 700;
|
|
491
|
+
--card-label-letter-spacing: 0.065em;
|
|
492
|
+
--card-label-line-height: 1.25;
|
|
493
|
+
--card-label-text-transform: uppercase;
|
|
494
|
+
--card-label-text-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
|
|
495
|
+
|
|
496
|
+
// Card Values
|
|
497
|
+
--card-value-font-size: clamp(1rem, 0.95rem + 0.2vw, 1rem);
|
|
498
|
+
--card-value-font-size-large: clamp(1.2rem, 1.15rem + 0.2vw, 1.25rem);
|
|
499
|
+
--card-value-font-size-xl: clamp(1.25rem, 1.2rem + 0.2vw, 1.25rem);
|
|
500
|
+
--card-value-font-weight: 600;
|
|
501
|
+
--card-value-letter-spacing: -0.015em;
|
|
502
|
+
--card-value-line-height: 1.35;
|
|
503
|
+
--card-value-text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
504
|
+
|
|
505
|
+
// Card Meta
|
|
506
|
+
--card-meta-font-size: clamp(0.55rem, 0.525rem + 0.1vw, 0.6rem);
|
|
507
|
+
--card-meta-font-weight: 500;
|
|
508
|
+
--card-meta-line-height: 1.3;
|
|
509
|
+
|
|
510
|
+
// Smallest text
|
|
511
|
+
--card-text-small-font-size: clamp(0.355rem, 0.295rem + 0.13vw, 0.455rem);
|
|
512
|
+
|
|
513
|
+
// Grid min width
|
|
514
|
+
--section-grid-min-width: 200px;
|
|
515
|
+
|
|
516
|
+
// Shared aliases
|
|
517
|
+
--font-size-section-header: var(--section-title-font-size);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/// Generate card layout tokens
|
|
521
|
+
@mixin osi-card-layout() {
|
|
522
|
+
--card-main-padding: 16px;
|
|
523
|
+
--card-padding-vertical: 12px;
|
|
524
|
+
--card-padding-horizontal: 16px;
|
|
525
|
+
--card-padding: 16px;
|
|
526
|
+
--card-padding-large: 20px;
|
|
527
|
+
--section-padding: 12px;
|
|
528
|
+
--section-container-padding: 12px;
|
|
529
|
+
--card-min-height: auto;
|
|
530
|
+
--card-gap: clamp(6px, 0.6vw, 10px);
|
|
531
|
+
--card-gap-large: clamp(10px, 0.8vw, 14px);
|
|
532
|
+
--card-nested-gap: clamp(3px, 0.4vw, 6px);
|
|
533
|
+
--section-header-gap: clamp(3px, 0.4vw, 6px);
|
|
534
|
+
--section-header-padding-bottom: clamp(0px, 0.2vw, 2px);
|
|
535
|
+
--section-title-margin-bottom: 0;
|
|
536
|
+
--card-border-radius: 12px;
|
|
537
|
+
--card-border-radius-large: 16px;
|
|
538
|
+
--section-card-gap: 12px;
|
|
539
|
+
--section-card-border-radius: 10px;
|
|
540
|
+
|
|
541
|
+
// Element gaps within cards
|
|
542
|
+
--card-element-gap-xs: 2px;
|
|
543
|
+
--card-element-gap-sm: 3px;
|
|
544
|
+
--card-element-gap-md: 4px;
|
|
545
|
+
--card-element-gap-lg: 6px;
|
|
546
|
+
--card-element-gap-xl: 8px;
|
|
547
|
+
|
|
548
|
+
// Border widths
|
|
549
|
+
--border-width-default: 1px;
|
|
550
|
+
--border-width-accent: 3px;
|
|
551
|
+
--border-width-accent-sm: 2px;
|
|
552
|
+
|
|
553
|
+
// Icon sizes
|
|
554
|
+
--icon-xs: 10px;
|
|
555
|
+
--icon-sm: 13px;
|
|
556
|
+
--icon-md: 16px;
|
|
557
|
+
--icon-lg: 22px;
|
|
558
|
+
--icon-xl: 36px;
|
|
559
|
+
|
|
560
|
+
// Avatar sizes
|
|
561
|
+
--avatar-sm: 32px;
|
|
562
|
+
--avatar-md: 36px;
|
|
563
|
+
|
|
564
|
+
// Progress bar
|
|
565
|
+
--progress-height: 2px;
|
|
566
|
+
--progress-margin: 4px 0;
|
|
567
|
+
|
|
568
|
+
// Tag padding
|
|
569
|
+
--tag-padding: 3px 6px;
|
|
570
|
+
--tag-padding-sm: 2px 4px;
|
|
571
|
+
--tag-padding-lg: 3px 7px;
|
|
572
|
+
|
|
573
|
+
// Grid gaps (semantic)
|
|
574
|
+
--grid-gap-xs: var(--gap-sm);
|
|
575
|
+
--grid-gap-sm: var(--gap-md);
|
|
576
|
+
--grid-gap-md: var(--gap-lg);
|
|
577
|
+
--grid-gap-lg: var(--gap-xl);
|
|
578
|
+
--grid-gap-xl: var(--gap-2xl);
|
|
579
|
+
|
|
580
|
+
// Section-specific gaps
|
|
581
|
+
--section-grid-gap: var(--gap-md);
|
|
582
|
+
--section-stack-gap: var(--gap-lg);
|
|
583
|
+
--section-item-gap: var(--gap-sm);
|
|
584
|
+
--section-item-padding: var(--gap-lg);
|
|
585
|
+
--metric-item-padding: 10px 12px;
|
|
586
|
+
--list-item-padding: 10px 12px;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/// Generate card text color tokens
|
|
590
|
+
@mixin osi-card-text-colors() {
|
|
591
|
+
--card-text-primary: var(--foreground);
|
|
592
|
+
--card-text-secondary: var(--muted-foreground);
|
|
593
|
+
--card-text-muted: var(--muted-foreground);
|
|
594
|
+
--card-text-hover: var(--primary);
|
|
595
|
+
--card-text-label: var(--muted-foreground);
|
|
596
|
+
--card-meta-color: var(--muted-foreground);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/// Generate card surface tokens
|
|
600
|
+
@mixin osi-card-surfaces() {
|
|
601
|
+
--card-background: var(--ai-card-background, #{$brand-color-03});
|
|
602
|
+
--card-background-hover: var(--ai-card-background-hover, #{$brand-color-05});
|
|
603
|
+
|
|
604
|
+
// Card transitions
|
|
605
|
+
--card-transition: all 0.28s cubic-bezier(0.4, 0, 0.2, 1);
|
|
606
|
+
--card-transition-fast: all 0.22s ease;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/// Generate interactive state tokens
|
|
610
|
+
@mixin osi-interactive() {
|
|
611
|
+
--interactive-hover-bg: #{$brand-color-03};
|
|
612
|
+
--interactive-active-bg: #{$brand-color-12};
|
|
613
|
+
--interactive-focus-ring: 0 0 0 2px #{$brand-color-40};
|
|
614
|
+
--interactive-glow: 0 0 12px #{$brand-color-30};
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/// Generate OSI Card component tokens (--osi-card-*)
|
|
618
|
+
/// SINGLE SOURCE OF TRUTH for all card styling variables
|
|
619
|
+
@mixin osi-card-tokens() {
|
|
620
|
+
// Card Background
|
|
621
|
+
--osi-card-background: var(
|
|
622
|
+
--theme-ai-card-background,
|
|
623
|
+
var(--card-surface, var(--card-section-bg))
|
|
624
|
+
);
|
|
625
|
+
--osi-card-background-hover: var(
|
|
626
|
+
--theme-ai-card-background-hover,
|
|
627
|
+
var(--card-surface-hover, var(--card-section-bg))
|
|
628
|
+
);
|
|
629
|
+
--osi-card-background-fullscreen: var(--osi-card-background);
|
|
630
|
+
|
|
631
|
+
// Card Backdrop Filter
|
|
632
|
+
--osi-card-backdrop-filter: var(--theme-ai-card-backdrop-filter, blur(12px));
|
|
633
|
+
|
|
634
|
+
// Card Border
|
|
635
|
+
--osi-card-border: var(--theme-ai-card-border, 1px solid #{$white-05});
|
|
636
|
+
--osi-card-border-hover: var(--theme-ai-card-border-hover, 1px solid #{$brand-color-12});
|
|
637
|
+
--osi-card-border-fullscreen: none;
|
|
638
|
+
|
|
639
|
+
// Card Shadow
|
|
640
|
+
--osi-card-shadow: var(--theme-ai-card-box-shadow, var(--shadow-md));
|
|
641
|
+
--osi-card-shadow-hover: var(--theme-ai-card-box-shadow-hover, var(--shadow-lg));
|
|
642
|
+
--osi-card-shadow-fullscreen: none;
|
|
643
|
+
|
|
644
|
+
// Card Spacing - Padding
|
|
645
|
+
--osi-card-padding: var(--card-main-padding);
|
|
646
|
+
--osi-card-padding-top: var(--card-main-padding);
|
|
647
|
+
--osi-card-padding-bottom: var(--card-main-padding);
|
|
648
|
+
--osi-card-padding-left: var(--card-main-padding);
|
|
649
|
+
--osi-card-padding-right: var(--card-main-padding);
|
|
650
|
+
--osi-card-padding-mobile: var(--space-1);
|
|
651
|
+
|
|
652
|
+
// Card Spacing - Margins
|
|
653
|
+
--osi-card-margin-top: 0;
|
|
654
|
+
--osi-card-margin-bottom: 0;
|
|
655
|
+
--osi-card-margin-left: 0;
|
|
656
|
+
--osi-card-margin-right: 0;
|
|
657
|
+
|
|
658
|
+
// Card Spacing - Gaps
|
|
659
|
+
--osi-card-gap: var(--section-card-gap);
|
|
660
|
+
--osi-card-body-gap: var(--space-3);
|
|
661
|
+
--osi-card-grid-gap: var(--section-card-gap);
|
|
662
|
+
|
|
663
|
+
// Card Border Radius
|
|
664
|
+
--osi-card-border-radius: var(--card-border-radius);
|
|
665
|
+
--osi-card-border-radius-fullscreen: 0;
|
|
666
|
+
|
|
667
|
+
// Card Text Colors
|
|
668
|
+
--osi-card-text-primary: var(--card-text-primary);
|
|
669
|
+
--osi-card-text-secondary: var(--card-text-secondary);
|
|
670
|
+
--osi-card-text-muted: var(--card-text-muted);
|
|
671
|
+
--osi-card-text-label: var(--card-text-label);
|
|
672
|
+
--osi-card-text-meta: var(--card-meta-color);
|
|
673
|
+
|
|
674
|
+
// Card Transitions
|
|
675
|
+
--osi-card-transition: var(--theme-ai-card-transition, all 0.28s cubic-bezier(0.4, 0, 0.2, 1));
|
|
676
|
+
--osi-card-transition-border: border-color 0.2s ease;
|
|
677
|
+
--osi-card-transition-background: background 0.2s ease;
|
|
678
|
+
--osi-card-transition-shadow: box-shadow 0.2s ease;
|
|
679
|
+
|
|
680
|
+
// Card Actions
|
|
681
|
+
--osi-card-action-primary-bg: var(--primary, #{$osi-color-brand});
|
|
682
|
+
--osi-card-action-primary-bg-hover: rgba($osi-color-brand, 0.85);
|
|
683
|
+
--osi-card-action-primary-color: var(--primary-foreground, #{$osi-color-white});
|
|
684
|
+
--osi-card-action-primary-border: #{$brand-color-80};
|
|
685
|
+
--osi-card-action-primary-shadow: 0 2px 8px #{$brand-color-15}, 0 1px 2px rgba(0, 0, 0, 0.1);
|
|
686
|
+
--osi-card-action-primary-shadow-hover:
|
|
687
|
+
0 4px 16px #{$brand-color-20}, 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
688
|
+
--osi-card-action-secondary-bg: rgba(40, 40, 45, 0.9);
|
|
689
|
+
--osi-card-action-secondary-bg-hover: rgba(50, 46, 42, 0.85);
|
|
690
|
+
--osi-card-action-secondary-color: var(--foreground, #{$osi-color-white});
|
|
691
|
+
--osi-card-action-secondary-border: rgba(55, 55, 60, 0.6);
|
|
692
|
+
--osi-card-action-secondary-border-hover: #{$brand-color-25};
|
|
693
|
+
--osi-card-action-secondary-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
694
|
+
--osi-card-action-secondary-shadow-hover:
|
|
695
|
+
0 4px 12px rgba(0, 0, 0, 0.15), 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
696
|
+
|
|
697
|
+
// Card Meta Elements
|
|
698
|
+
--osi-card-eyebrow-color: #{$foreground-80};
|
|
699
|
+
--osi-card-type-pill-bg: #{$brand-color-20};
|
|
700
|
+
--osi-card-type-pill-border: #{$brand-color-30};
|
|
701
|
+
--osi-card-type-pill-color: rgba(66, 61, 55, 0.85);
|
|
702
|
+
--osi-card-meta-color: #{$foreground-80};
|
|
703
|
+
--osi-card-meta-chip-bg: rgba(40, 40, 45, 0.8);
|
|
704
|
+
--osi-card-meta-chip-border: rgba(55, 55, 60, 0.65);
|
|
705
|
+
--osi-card-meta-chip-dot-primary: var(--accent);
|
|
706
|
+
--osi-card-meta-chip-dot-secondary: #{$brand-color-60};
|
|
707
|
+
--osi-card-meta-chip-dot-tertiary: #{$brand-color-35};
|
|
708
|
+
--osi-card-meta-chip-dot-shadow: 0 0 0 1px #{$brand-color-12};
|
|
709
|
+
--osi-card-footnote-color: #{$foreground-70};
|
|
710
|
+
|
|
711
|
+
// Card Fullscreen Button
|
|
712
|
+
--osi-card-fullscreen-btn-bg: #{$brand-color-08};
|
|
713
|
+
--osi-card-fullscreen-btn-bg-hover: #{$brand-color-08};
|
|
714
|
+
--osi-card-fullscreen-btn-border: #{$brand-color-12};
|
|
715
|
+
--osi-card-fullscreen-btn-border-hover: #{$brand-color-20};
|
|
716
|
+
--osi-card-fullscreen-btn-shadow: 0 4px 12px #{$brand-color-20};
|
|
717
|
+
--osi-card-fullscreen-btn-size: 36px;
|
|
718
|
+
--osi-card-fullscreen-btn-radius: 8px;
|
|
719
|
+
|
|
720
|
+
// Card Shine Effect
|
|
721
|
+
--osi-card-shine-gradient-primary: linear-gradient(
|
|
722
|
+
135deg,
|
|
723
|
+
rgba(255, 255, 255, 0.2) 0%,
|
|
724
|
+
rgba(255, 255, 255, 0) 50%,
|
|
725
|
+
rgba(255, 255, 255, 0.1) 100%
|
|
726
|
+
);
|
|
727
|
+
--osi-card-shine-gradient-secondary: linear-gradient(
|
|
728
|
+
135deg,
|
|
729
|
+
rgba(255, 255, 255, 0.15) 0%,
|
|
730
|
+
rgba(255, 255, 255, 0) 50%,
|
|
731
|
+
rgba(255, 255, 255, 0.08) 100%
|
|
732
|
+
);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/// Generate OSI Section component tokens (--osi-section-*)
|
|
736
|
+
/// SINGLE SOURCE OF TRUTH for all section styling variables
|
|
737
|
+
@mixin osi-section-tokens() {
|
|
738
|
+
// Section Background
|
|
739
|
+
--osi-section-background: var(
|
|
740
|
+
--section-background,
|
|
741
|
+
var(--section-surface, var(--card-section-bg))
|
|
742
|
+
);
|
|
743
|
+
--osi-section-background-hover: var(
|
|
744
|
+
--section-background-hover,
|
|
745
|
+
var(--section-surface-hover, var(--card-section-bg))
|
|
746
|
+
);
|
|
747
|
+
--osi-section-background-main: var(--section-bg-main, var(--section-surface, var(--background)));
|
|
748
|
+
--osi-section-background-main-hover: var(
|
|
749
|
+
--section-bg-main-hover,
|
|
750
|
+
var(--section-surface-hover, var(--background))
|
|
751
|
+
);
|
|
752
|
+
--osi-section-background-contrast: var(--section-bg-contrast, var(--card-section-bg));
|
|
753
|
+
--osi-section-background-contrast-hover: var(
|
|
754
|
+
--section-bg-contrast-hover,
|
|
755
|
+
var(--card-section-card-bg)
|
|
756
|
+
);
|
|
757
|
+
|
|
758
|
+
// Section Border
|
|
759
|
+
--osi-section-border: var(--theme-section-border, 1px solid rgba(0, 0, 0, 0.06));
|
|
760
|
+
--osi-section-border-hover: var(--theme-section-border-hover, 1px solid #{$brand-color-15});
|
|
761
|
+
|
|
762
|
+
// Section Shadow
|
|
763
|
+
--osi-section-shadow: var(--theme-section-box-shadow, var(--shadow-md));
|
|
764
|
+
--osi-section-shadow-hover: var(
|
|
765
|
+
--theme-section-box-shadow-hover,
|
|
766
|
+
var(--shadow-lg),
|
|
767
|
+
var(--shadow-glow-sm)
|
|
768
|
+
);
|
|
769
|
+
--osi-section-shadow-fullscreen: none;
|
|
770
|
+
|
|
771
|
+
// Section Spacing - Padding
|
|
772
|
+
--osi-section-padding: var(--section-padding);
|
|
773
|
+
--osi-section-padding-top: var(--section-padding);
|
|
774
|
+
--osi-section-padding-bottom: var(--section-padding);
|
|
775
|
+
--osi-section-padding-left: var(--section-padding);
|
|
776
|
+
--osi-section-padding-right: var(--section-padding);
|
|
777
|
+
|
|
778
|
+
// Section Spacing - Margins
|
|
779
|
+
--osi-section-margin-top: 0;
|
|
780
|
+
--osi-section-margin-bottom: var(--osi-section-spacing-bottom);
|
|
781
|
+
--osi-section-margin-left: 0;
|
|
782
|
+
--osi-section-margin-right: 0;
|
|
783
|
+
--osi-section-spacing-bottom: var(--space-3);
|
|
784
|
+
|
|
785
|
+
// Section Spacing - Gaps
|
|
786
|
+
--osi-section-gap: var(--section-card-gap);
|
|
787
|
+
--osi-section-gap-internal: var(--card-gap);
|
|
788
|
+
--osi-section-grid-gap: var(--section-grid-gap);
|
|
789
|
+
--osi-section-internal-gap: var(--card-gap);
|
|
790
|
+
--osi-section-header-gap: var(--section-header-gap);
|
|
791
|
+
--osi-section-header-padding-bottom: var(--section-header-padding-bottom);
|
|
792
|
+
|
|
793
|
+
// Section Border Radius
|
|
794
|
+
--osi-section-border-radius: var(--section-card-border-radius);
|
|
795
|
+
|
|
796
|
+
// Section Typography
|
|
797
|
+
--osi-section-title-font-size: var(--section-title-font-size, 1.1rem);
|
|
798
|
+
--osi-section-title-font-weight: var(--section-title-font-weight, 700);
|
|
799
|
+
--osi-section-title-letter-spacing: var(--section-title-letter-spacing, -0.02em);
|
|
800
|
+
--osi-section-title-line-height: var(--section-title-line-height, 1.3);
|
|
801
|
+
--osi-section-title-color: var(--card-text-primary);
|
|
802
|
+
--osi-section-title-margin-bottom: var(--section-title-margin-bottom);
|
|
803
|
+
--osi-section-title-underline-length: clamp(var(--space-8), 3vw, var(--space-12));
|
|
804
|
+
--osi-section-title-underline-hover-length: clamp(var(--space-10), 4vw, var(--space-12));
|
|
805
|
+
--osi-section-title-underline-height: var(--border-width-accent);
|
|
806
|
+
--osi-section-title-underline-offset: calc(var(--space-2) * -1);
|
|
807
|
+
--osi-section-title-underline-color: var(--section-accent, var(--accent, #{$osi-color-brand}));
|
|
808
|
+
// Fallback for browsers without color-mix support
|
|
809
|
+
--osi-section-title-hover-color: var(--color-brand);
|
|
810
|
+
|
|
811
|
+
--osi-section-description-color: var(--muted-foreground);
|
|
812
|
+
--osi-section-description-color-hover: var(--foreground);
|
|
813
|
+
|
|
814
|
+
// Section Accent
|
|
815
|
+
--osi-section-accent: var(--section-accent, var(--accent, #{$osi-color-brand}));
|
|
816
|
+
--osi-section-accent-info: var(--section-accent-info, #{$osi-color-brand});
|
|
817
|
+
--osi-section-accent-analytics: var(--section-accent-analytics, #{$osi-color-brand});
|
|
818
|
+
--osi-section-accent-financials: var(--section-accent-financials, #{$osi-color-brand});
|
|
819
|
+
--osi-section-accent-map: var(--section-accent-map, #{$osi-color-brand});
|
|
820
|
+
--osi-section-accent-network: var(--section-accent-network, #{$osi-color-brand});
|
|
821
|
+
--osi-section-accent-contact: var(--section-accent-contact, #{$osi-color-brand});
|
|
822
|
+
--osi-section-accent-product: var(--section-accent-product, #{$osi-color-brand});
|
|
823
|
+
--osi-section-accent-solutions: var(--section-accent-solutions, #{$osi-color-brand});
|
|
824
|
+
--osi-section-accent-overview: var(--section-accent-overview, #{$osi-color-brand});
|
|
825
|
+
--osi-section-accent-list: var(--section-accent-list, #{$osi-color-brand});
|
|
826
|
+
--osi-section-accent-event: var(--section-accent-event, #{$osi-color-brand});
|
|
827
|
+
--osi-section-accent-chart: var(--section-accent-chart, var(--accent, #{$osi-color-brand}));
|
|
828
|
+
--osi-section-accent-reference: var(
|
|
829
|
+
--section-accent-reference,
|
|
830
|
+
var(--accent, #{$osi-color-brand})
|
|
831
|
+
);
|
|
832
|
+
--osi-section-accent-quotation: var(
|
|
833
|
+
--section-accent-quotation,
|
|
834
|
+
var(--accent, #{$osi-color-brand})
|
|
835
|
+
);
|
|
836
|
+
|
|
837
|
+
// Section Effects
|
|
838
|
+
--osi-section-glow-background: radial-gradient(
|
|
839
|
+
circle at top right,
|
|
840
|
+
#{$brand-color-35} 0%,
|
|
841
|
+
transparent 65%
|
|
842
|
+
);
|
|
843
|
+
--osi-section-glow-opacity-hover: 0.12;
|
|
844
|
+
--osi-section-backdrop-filter: blur(12px);
|
|
845
|
+
|
|
846
|
+
// Section Badge
|
|
847
|
+
--osi-section-badge-bg: linear-gradient(135deg, #{$brand-color-15}, #{$brand-color-12});
|
|
848
|
+
--osi-section-badge-bg-hover: #{$brand-color-12};
|
|
849
|
+
--osi-section-badge-color: #{$brand-color-90};
|
|
850
|
+
--osi-section-badge-padding: calc(var(--tag-padding-y-sm) * 0.75)
|
|
851
|
+
calc(var(--tag-padding-x) * 0.875);
|
|
852
|
+
|
|
853
|
+
// Section Empty State
|
|
854
|
+
--osi-section-empty-bg: var(--section-item-background, var(--card-section-bg));
|
|
855
|
+
--osi-section-empty-bg-hover: var(--section-item-background-hover, var(--card-section-card-bg));
|
|
856
|
+
--osi-section-empty-border: 1px dashed var(--border);
|
|
857
|
+
--osi-section-empty-border-hover: var(--accent);
|
|
858
|
+
--osi-section-empty-icon-opacity: 0.5;
|
|
859
|
+
--osi-section-empty-icon-opacity-hover: 0.7;
|
|
860
|
+
|
|
861
|
+
// Section Transitions
|
|
862
|
+
--osi-section-transition: var(
|
|
863
|
+
--theme-section-transition,
|
|
864
|
+
border-color 0.22s cubic-bezier(0.4, 0, 0.2, 1),
|
|
865
|
+
box-shadow 0.22s cubic-bezier(0.4, 0, 0.2, 1)
|
|
866
|
+
);
|
|
867
|
+
--osi-section-title-transition: color 0.22s cubic-bezier(0.4, 0, 0.2, 1);
|
|
868
|
+
--osi-section-description-transition: color 0.2s ease;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/// Generate OSI Section Item component tokens (--osi-section-item-*)
|
|
872
|
+
/// SINGLE SOURCE OF TRUTH for all section item/field styling variables
|
|
873
|
+
@mixin osi-section-item-tokens() {
|
|
874
|
+
// Section Item Background
|
|
875
|
+
--osi-section-item-background: var(--theme-section-item-background, var(--card-section-bg));
|
|
876
|
+
--osi-section-item-background-hover: var(
|
|
877
|
+
--theme-section-item-background-hover,
|
|
878
|
+
var(--card-section-bg)
|
|
879
|
+
);
|
|
880
|
+
|
|
881
|
+
// Section Item Border
|
|
882
|
+
--osi-section-item-border: var(--theme-section-item-border, 1px solid rgba(0, 0, 0, 0.06));
|
|
883
|
+
--osi-section-item-border-hover: var(
|
|
884
|
+
--theme-section-item-border-hover,
|
|
885
|
+
1px solid #{$brand-color-08}
|
|
886
|
+
);
|
|
887
|
+
|
|
888
|
+
// Section Item Shadow
|
|
889
|
+
--osi-section-item-shadow: var(--theme-section-item-box-shadow, var(--shadow-sm));
|
|
890
|
+
--osi-section-item-shadow-hover: var(
|
|
891
|
+
--theme-section-item-box-shadow-hover,
|
|
892
|
+
var(--shadow-md),
|
|
893
|
+
var(--shadow-glow-sm)
|
|
894
|
+
);
|
|
895
|
+
|
|
896
|
+
// Section Item Spacing - Padding
|
|
897
|
+
--osi-section-item-padding: var(--section-item-padding);
|
|
898
|
+
--osi-section-item-padding-top: var(--gap-lg);
|
|
899
|
+
--osi-section-item-padding-bottom: var(--gap-lg);
|
|
900
|
+
--osi-section-item-padding-left: var(--gap-lg);
|
|
901
|
+
--osi-section-item-padding-right: var(--gap-lg);
|
|
902
|
+
--osi-section-item-metric-padding: var(--metric-item-padding);
|
|
903
|
+
--osi-section-item-list-padding: var(--list-item-padding);
|
|
904
|
+
|
|
905
|
+
// Section Item Spacing - Margins
|
|
906
|
+
--osi-section-item-margin-top: 0;
|
|
907
|
+
--osi-section-item-margin-bottom: 0;
|
|
908
|
+
--osi-section-item-margin-left: 0;
|
|
909
|
+
--osi-section-item-margin-right: 0;
|
|
910
|
+
|
|
911
|
+
// Section Item Spacing - Gaps
|
|
912
|
+
--osi-section-item-gap: var(--section-item-gap);
|
|
913
|
+
--osi-section-item-grid-gap: var(--section-item-gap);
|
|
914
|
+
|
|
915
|
+
// Section Item Border Radius
|
|
916
|
+
--osi-section-item-border-radius: var(--radius-md);
|
|
917
|
+
|
|
918
|
+
// Section Item Typography - Label
|
|
919
|
+
--osi-section-item-label-font-size: var(--text-sm);
|
|
920
|
+
--osi-section-item-label-font-weight: var(--font-weight-medium);
|
|
921
|
+
--osi-section-item-label-color: var(--muted-foreground);
|
|
922
|
+
--osi-section-item-label-letter-spacing: 0.01em;
|
|
923
|
+
--osi-section-item-label-text-transform: uppercase;
|
|
924
|
+
|
|
925
|
+
// Section Item Typography - Value
|
|
926
|
+
--osi-section-item-value-font-size: var(--text-base);
|
|
927
|
+
--osi-section-item-value-font-weight: var(--font-weight-normal);
|
|
928
|
+
--osi-section-item-value-color: var(--foreground);
|
|
929
|
+
--osi-section-item-value-letter-spacing: 0;
|
|
930
|
+
|
|
931
|
+
// Section Item Icon
|
|
932
|
+
--osi-section-item-icon-size: var(--icon-md);
|
|
933
|
+
--osi-section-item-icon-color: var(--muted-foreground);
|
|
934
|
+
--osi-section-item-icon-color-hover: var(--accent);
|
|
935
|
+
|
|
936
|
+
// Section Item Transitions
|
|
937
|
+
--osi-section-item-transition: var(
|
|
938
|
+
--theme-section-item-transition,
|
|
939
|
+
background 220ms cubic-bezier(0.4, 0, 0.2, 1),
|
|
940
|
+
box-shadow 220ms cubic-bezier(0.4, 0, 0.2, 1),
|
|
941
|
+
border-color 220ms cubic-bezier(0.4, 0, 0.2, 1)
|
|
942
|
+
);
|
|
943
|
+
--osi-section-item-hover-transform: var(--theme-section-item-hover-transform, none);
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
/// Generate element type system tokens (Hero, Buttons, Cards, Sections, Section Items)
|
|
947
|
+
@mixin osi-element-system() {
|
|
948
|
+
// Include component-specific token mixins
|
|
949
|
+
@include osi-card-tokens();
|
|
950
|
+
@include osi-section-tokens();
|
|
951
|
+
@include osi-section-item-tokens();
|
|
952
|
+
|
|
953
|
+
// 1. HERO CARDS
|
|
954
|
+
--hero-card-border: 1px solid rgba(146, 153, 158, 0.15);
|
|
955
|
+
--hero-card-border-hover: #{$brand-color-40};
|
|
956
|
+
--hero-card-background: var(--card);
|
|
957
|
+
--hero-card-background-hover: var(--card);
|
|
958
|
+
--hero-card-border-radius: var(--radius-lg);
|
|
959
|
+
--hero-card-box-shadow: var(--shadow-md);
|
|
960
|
+
--hero-card-box-shadow-hover: var(--shadow-lg);
|
|
961
|
+
--hero-card-hover-transform: translateY(-2px);
|
|
962
|
+
|
|
963
|
+
// 2. BUTTONS
|
|
964
|
+
--button-border: 1px solid transparent;
|
|
965
|
+
--button-border-hover: 1px solid #{$brand-color-40};
|
|
966
|
+
--button-background: var(--primary);
|
|
967
|
+
--button-background-hover: color-mix(in srgb, var(--primary) 85%, transparent);
|
|
968
|
+
--button-border-radius: var(--radius-md);
|
|
969
|
+
--button-box-shadow: var(--shadow-sm);
|
|
970
|
+
--button-box-shadow-hover: var(--shadow-md);
|
|
971
|
+
--button-hover-transform: translateY(-1px);
|
|
972
|
+
|
|
973
|
+
// 3. AI CARDS (aliases for backward compatibility)
|
|
974
|
+
--ai-card-border: var(--osi-card-border);
|
|
975
|
+
--ai-card-border-hover: var(--osi-card-border-hover);
|
|
976
|
+
--ai-card-background: var(--osi-card-background);
|
|
977
|
+
--ai-card-background-hover: var(--osi-card-background-hover);
|
|
978
|
+
--ai-card-border-radius: var(--osi-card-border-radius);
|
|
979
|
+
--ai-card-box-shadow: var(--osi-card-shadow);
|
|
980
|
+
--ai-card-box-shadow-hover: var(--osi-card-shadow-hover);
|
|
981
|
+
--ai-card-hover-transform: none;
|
|
982
|
+
--ai-card-transition-default:
|
|
983
|
+
border 0.32s cubic-bezier(0.4, 0, 0.2, 1), background 0.32s cubic-bezier(0.4, 0, 0.2, 1),
|
|
984
|
+
box-shadow 0.32s cubic-bezier(0.4, 0, 0.2, 1);
|
|
985
|
+
--ai-card-transition: var(--theme-ai-card-transition, var(--ai-card-transition-default));
|
|
986
|
+
|
|
987
|
+
// 4. SECTIONS (aliases for backward compatibility)
|
|
988
|
+
--section-border: var(--osi-section-border);
|
|
989
|
+
--section-border-hover: var(--osi-section-border-hover);
|
|
990
|
+
--section-border-radius: var(--osi-section-border-radius);
|
|
991
|
+
--section-box-shadow-default: var(--osi-section-shadow);
|
|
992
|
+
--section-box-shadow-hover-default: var(--osi-section-shadow-hover);
|
|
993
|
+
--section-box-shadow: var(--osi-section-shadow);
|
|
994
|
+
--section-box-shadow-hover: var(--osi-section-shadow-hover);
|
|
995
|
+
--section-hover-transform: none;
|
|
996
|
+
--section-transition: var(--osi-section-transition);
|
|
997
|
+
|
|
998
|
+
// 5. SECTION ITEMS (aliases for backward compatibility)
|
|
999
|
+
--section-item-border: var(--osi-section-item-border);
|
|
1000
|
+
--section-item-border-hover: var(--osi-section-item-border-hover);
|
|
1001
|
+
--section-item-background: var(--osi-section-item-background);
|
|
1002
|
+
--section-item-background-hover: var(--osi-section-item-background-hover);
|
|
1003
|
+
--section-item-border-radius: var(--osi-section-item-border-radius);
|
|
1004
|
+
--section-item-box-shadow: var(--osi-section-item-shadow);
|
|
1005
|
+
--section-item-box-shadow-hover-default: var(--osi-section-item-shadow-hover);
|
|
1006
|
+
--section-item-box-shadow-hover: var(--osi-section-item-shadow-hover);
|
|
1007
|
+
--section-item-hover-transform: var(--osi-section-item-hover-transform);
|
|
1008
|
+
--section-item-transition-default: var(--osi-section-item-transition);
|
|
1009
|
+
--section-item-transition: var(--osi-section-item-transition);
|
|
1010
|
+
|
|
1011
|
+
// Legacy card variables (theme-aware)
|
|
1012
|
+
--card-border: var(--theme-card-border, 1px solid rgba(146, 153, 158, 0.15));
|
|
1013
|
+
--card-border-hover: var(--theme-card-border-hover, #{$brand-color-15});
|
|
1014
|
+
--card-box-shadow: var(--theme-card-box-shadow, var(--shadow-md));
|
|
1015
|
+
--card-box-shadow-hover: var(--theme-card-box-shadow-hover, var(--shadow-lg));
|
|
1016
|
+
--card-hover-transform: none;
|
|
1017
|
+
|
|
1018
|
+
// Entrance animations
|
|
1019
|
+
--ai-card-entrance-animation: fadeInUpSoft var(--duration-moderate) var(--ease-out-smooth) 10ms 1
|
|
1020
|
+
normal both;
|
|
1021
|
+
--section-entrance-animation: fadeInSoft var(--duration-moderate) var(--ease-out-smooth) 20ms 1
|
|
1022
|
+
normal both;
|
|
1023
|
+
--section-item-entrance-animation: fadeInScaleSoft var(--duration-normal) var(--ease-out-smooth)
|
|
1024
|
+
30ms 1 normal both;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
// ============================================
|
|
1028
|
+
// 5. THEME COLOR MIXINS
|
|
1029
|
+
// ============================================
|
|
1030
|
+
|
|
1031
|
+
/// Generate base theme colors (default/dark)
|
|
1032
|
+
/// @param {String} $variant - 'demo' or 'integration' (deprecated - now always uses demo values)
|
|
1033
|
+
/// @param {Boolean} $is-scoped - If true, outputs for nested context
|
|
1034
|
+
@mixin osi-theme-base($variant: "demo", $is-scoped: false) {
|
|
1035
|
+
@if $is-scoped {
|
|
1036
|
+
color-scheme: light dark;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
@include osi-base-colors();
|
|
1040
|
+
|
|
1041
|
+
--background: #{$osi-color-white};
|
|
1042
|
+
--surface-contrast-color: #{$osi-color-black};
|
|
1043
|
+
|
|
1044
|
+
// Cross-browser color-mix support with token-only fallback
|
|
1045
|
+
@supports (color: color-mix(in srgb, black 50%, white)) {
|
|
1046
|
+
--theme-card-background-hover: color-mix(
|
|
1047
|
+
in srgb,
|
|
1048
|
+
var(--background) 98%,
|
|
1049
|
+
var(--surface-contrast-color) 2%
|
|
1050
|
+
);
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
// Surface tokens - defaults (will be overridden by theme-specific mixins and JavaScript presets)
|
|
1054
|
+
// These are fallback values only - actual values come from osi-theme-dark/light mixins or JavaScript presets
|
|
1055
|
+
--theme-ai-card-border: 1px solid rgba(0, 0, 0, 0.08);
|
|
1056
|
+
--theme-ai-card-border-hover: 1px solid rgba(255, 121, 0, 0.4);
|
|
1057
|
+
--theme-ai-card-background: rgba(255, 255, 255, 0.85);
|
|
1058
|
+
--theme-ai-card-background-hover: rgba(255, 255, 255, 0.92);
|
|
1059
|
+
--theme-ai-card-box-shadow: 0 4px 24px -1px rgba(0, 0, 0, 0.1), 0 0 18px rgba(255, 121, 0, 0.15);
|
|
1060
|
+
--theme-ai-card-box-shadow-hover:
|
|
1061
|
+
0 20px 40px -5px rgba(0, 0, 0, 0.15), 0 0 24px rgba(255, 121, 0, 0.25),
|
|
1062
|
+
0 0 0 1px rgba(255, 121, 0, 0.15);
|
|
1063
|
+
--theme-ai-card-backdrop-filter: blur(12px);
|
|
1064
|
+
--theme-ai-card-transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1065
|
+
|
|
1066
|
+
--theme-card-border: 1px solid rgba(0, 0, 0, 0.08);
|
|
1067
|
+
--theme-card-border-hover: var(--color-brand);
|
|
1068
|
+
--theme-card-background: var(--background);
|
|
1069
|
+
--theme-card-background-hover: color-mix(
|
|
1070
|
+
in srgb,
|
|
1071
|
+
var(--background) 98%,
|
|
1072
|
+
var(--surface-contrast-color) 2%
|
|
1073
|
+
);
|
|
1074
|
+
--theme-card-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
1075
|
+
--theme-card-box-shadow-hover: 0 2px 4px rgba(0, 0, 0, 0.07);
|
|
1076
|
+
|
|
1077
|
+
--theme-section-border: 1px solid rgba(0, 0, 0, 0.06);
|
|
1078
|
+
--theme-section-border-hover: 1px solid rgba(255, 121, 0, 0.15);
|
|
1079
|
+
--theme-section-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
|
|
1080
|
+
--theme-section-box-shadow-hover: 0 2px 4px rgba(0, 0, 0, 0.05);
|
|
1081
|
+
--theme-section-transition:
|
|
1082
|
+
border-color 0.22s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.22s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1083
|
+
// Flat backgrounds - no color-mix
|
|
1084
|
+
--section-background: var(--background);
|
|
1085
|
+
--section-background-hover: var(--background);
|
|
1086
|
+
--section-surface: var(--background);
|
|
1087
|
+
--section-surface-hover: var(--background);
|
|
1088
|
+
|
|
1089
|
+
--theme-section-item-border: 1px solid rgba(0, 0, 0, 0.06);
|
|
1090
|
+
--theme-section-item-border-hover: 1px solid rgba(255, 121, 0, 0.15);
|
|
1091
|
+
--theme-section-item-background: var(--background);
|
|
1092
|
+
--theme-section-item-background-hover: var(--background);
|
|
1093
|
+
--theme-section-item-box-shadow: var(--shadow-md, 0 1px 2px rgba(0, 0, 0, 0.04));
|
|
1094
|
+
--theme-section-item-box-shadow-hover: var(--shadow-lg, 0 1px 3px rgba(0, 0, 0, 0.05));
|
|
1095
|
+
--theme-section-item-hover-transform: none;
|
|
1096
|
+
--theme-section-item-transition:
|
|
1097
|
+
border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), background 0.2s cubic-bezier(0.4, 0, 0.2, 1),
|
|
1098
|
+
box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
/// Generate dark theme colors
|
|
1102
|
+
/// @param {String} $variant - 'demo' or 'integration' (deprecated - now always uses demo values)
|
|
1103
|
+
/// @param {Boolean} $is-scoped - If true, outputs for nested context
|
|
1104
|
+
@mixin osi-theme-dark($variant: "demo", $is-scoped: false) {
|
|
1105
|
+
@if $is-scoped {
|
|
1106
|
+
color-scheme: dark;
|
|
1107
|
+
--background: #{$osi-background-dark-scoped};
|
|
1108
|
+
} @else {
|
|
1109
|
+
--background: #{$osi-background-dark};
|
|
1110
|
+
}
|
|
1111
|
+
--surface-contrast-color: #{$osi-color-white};
|
|
1112
|
+
--foreground: #{$osi-foreground-dark};
|
|
1113
|
+
--muted: #242424;
|
|
1114
|
+
--muted-foreground: #{$osi-muted-foreground-dark};
|
|
1115
|
+
|
|
1116
|
+
// Flat dark backgrounds - no color-mix
|
|
1117
|
+
--card: var(--background);
|
|
1118
|
+
--card-surface: var(--background);
|
|
1119
|
+
--card-foreground: #{$osi-foreground-dark};
|
|
1120
|
+
--card-surface-hover: var(--background);
|
|
1121
|
+
--card-section-bg: #181818;
|
|
1122
|
+
--card-section-card-bg: #1f1f1f;
|
|
1123
|
+
|
|
1124
|
+
// AI Card surface - transparent with blur effect (matches preset)
|
|
1125
|
+
--theme-ai-card-border: 1px solid rgba(255, 255, 255, 0.08);
|
|
1126
|
+
--theme-ai-card-border-hover: 1px solid rgba(255, 121, 0, 0.2);
|
|
1127
|
+
--theme-ai-card-background: rgba(20, 20, 20, 0.6);
|
|
1128
|
+
--theme-ai-card-background-hover: rgba(25, 25, 25, 0.7);
|
|
1129
|
+
--theme-ai-card-box-shadow: 0 4px 24px -1px rgba(0, 0, 0, 0.2);
|
|
1130
|
+
--theme-ai-card-box-shadow-hover:
|
|
1131
|
+
0 12px 32px -4px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 121, 0, 0.1);
|
|
1132
|
+
--theme-ai-card-backdrop-filter: blur(12px);
|
|
1133
|
+
--theme-ai-card-transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1134
|
+
|
|
1135
|
+
// Card backgrounds (matches preset)
|
|
1136
|
+
--theme-card-border: 1px solid rgba(255, 255, 255, 0.08);
|
|
1137
|
+
--theme-card-border-hover: 1px solid rgba(255, 121, 0, 0.2);
|
|
1138
|
+
--theme-card-background: var(--background);
|
|
1139
|
+
// Fallback for browsers without color-mix support
|
|
1140
|
+
--theme-card-background-hover: rgba(25, 25, 25, 0.7);
|
|
1141
|
+
--theme-card-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
|
|
1142
|
+
--theme-card-box-shadow-hover: 0 2px 4px rgba(0, 0, 0, 0.4);
|
|
1143
|
+
|
|
1144
|
+
// Flat section backgrounds
|
|
1145
|
+
--section-background: var(--background);
|
|
1146
|
+
--section-background-hover: var(--background);
|
|
1147
|
+
--section-surface: #181818;
|
|
1148
|
+
--section-surface-hover: #1f1f1f;
|
|
1149
|
+
--popover: #111111;
|
|
1150
|
+
--popover-foreground: #{$osi-foreground-dark};
|
|
1151
|
+
--primary: #{$osi-color-brand};
|
|
1152
|
+
--primary-foreground: #{$osi-foreground-dark};
|
|
1153
|
+
--secondary: #333333;
|
|
1154
|
+
--secondary-foreground: #{$osi-foreground-dark};
|
|
1155
|
+
--accent: #{$osi-color-brand};
|
|
1156
|
+
--accent-foreground: #{$osi-color-black};
|
|
1157
|
+
--destructive: #d4183d;
|
|
1158
|
+
--destructive-foreground: #{$osi-foreground-dark};
|
|
1159
|
+
--border: rgba(200, 200, 200, 0.3);
|
|
1160
|
+
--input: transparent;
|
|
1161
|
+
--input-background: #222222;
|
|
1162
|
+
--switch-background: #333333;
|
|
1163
|
+
--ring: #{$brand-color-60};
|
|
1164
|
+
--chart-1: #{$osi-color-brand};
|
|
1165
|
+
--chart-2: #{$osi-color-brand-light};
|
|
1166
|
+
--chart-3: #{$osi-color-brand-dark};
|
|
1167
|
+
--chart-4: #{$osi-color-brand-pale};
|
|
1168
|
+
--chart-5: #ff4500;
|
|
1169
|
+
|
|
1170
|
+
// Element type overrides - subtle theme-aware hover
|
|
1171
|
+
--hero-card-border: 1px solid rgba(233, 233, 233, 0.2);
|
|
1172
|
+
--hero-card-border-hover: 1px solid rgba(255, 121, 0, 0.25);
|
|
1173
|
+
// Section (matches preset)
|
|
1174
|
+
--theme-section-border: 1px solid rgba(255, 255, 255, 0.1);
|
|
1175
|
+
--theme-section-border-hover: 1px solid rgba(255, 255, 255, 0.1);
|
|
1176
|
+
--theme-section-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
|
|
1177
|
+
--theme-section-box-shadow-hover: 0 2px 5px rgba(0, 0, 0, 0.5);
|
|
1178
|
+
--theme-section-transition:
|
|
1179
|
+
border-color 0.22s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.22s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1180
|
+
// Section Item (matches preset)
|
|
1181
|
+
--theme-section-item-border: 1px solid rgba(255, 255, 255, 0.06);
|
|
1182
|
+
--theme-section-item-border-hover: 1px solid rgba(255, 121, 0, 0.08);
|
|
1183
|
+
--theme-section-item-background: #202020;
|
|
1184
|
+
--theme-section-item-background-hover: #212121;
|
|
1185
|
+
--theme-section-item-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
|
|
1186
|
+
--theme-section-item-box-shadow-hover: 0 1px 4px rgba(0, 0, 0, 0.3);
|
|
1187
|
+
--theme-section-item-hover-transform: none;
|
|
1188
|
+
--theme-section-item-transition:
|
|
1189
|
+
background 220ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 220ms cubic-bezier(0.4, 0, 0.2, 1),
|
|
1190
|
+
border-color 220ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
/// Generate light theme colors
|
|
1194
|
+
/// @param {String} $variant - 'demo' or 'integration' (deprecated - now always uses demo values)
|
|
1195
|
+
/// @param {Boolean} $is-scoped - If true, outputs for nested context
|
|
1196
|
+
@mixin osi-theme-light($variant: "demo", $is-scoped: false) {
|
|
1197
|
+
@if $is-scoped {
|
|
1198
|
+
color-scheme: light;
|
|
1199
|
+
}
|
|
1200
|
+
--background: #{$osi-background-light};
|
|
1201
|
+
--foreground: #{$osi-foreground-light};
|
|
1202
|
+
--muted: #f4f4f6;
|
|
1203
|
+
--muted-foreground: #{$osi-muted-foreground-light};
|
|
1204
|
+
|
|
1205
|
+
// Cross-browser color-mix support with token-only fallback
|
|
1206
|
+
@supports (color: color-mix(in srgb, black 50%, white)) {
|
|
1207
|
+
--theme-card-background-hover: color-mix(
|
|
1208
|
+
in srgb,
|
|
1209
|
+
var(--background) 98%,
|
|
1210
|
+
var(--surface-contrast-color) 2%
|
|
1211
|
+
);
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
// Flat light backgrounds - no color-mix
|
|
1215
|
+
--card: var(--background);
|
|
1216
|
+
--card-surface: var(--background);
|
|
1217
|
+
--card-foreground: #{$osi-foreground-light};
|
|
1218
|
+
--card-surface-hover: var(--background);
|
|
1219
|
+
--card-section-bg: #fcfcfc;
|
|
1220
|
+
--card-section-card-bg: #f8f8f8;
|
|
1221
|
+
|
|
1222
|
+
// AI Card surface - light theme with blur (matches preset)
|
|
1223
|
+
--theme-ai-card-border: 1px solid rgba(0, 0, 0, 0.08);
|
|
1224
|
+
--theme-ai-card-border-hover: 1px solid rgba(255, 121, 0, 0.2);
|
|
1225
|
+
--theme-ai-card-background: rgba(255, 255, 255, 0.85);
|
|
1226
|
+
--theme-ai-card-background-hover: rgba(255, 255, 255, 0.88);
|
|
1227
|
+
--theme-ai-card-box-shadow: 0 4px 24px -1px rgba(0, 0, 0, 0.1), 0 0 18px rgba(255, 121, 0, 0.15);
|
|
1228
|
+
--theme-ai-card-box-shadow-hover:
|
|
1229
|
+
0 12px 32px -4px rgba(0, 0, 0, 0.12), 0 0 20px rgba(255, 121, 0, 0.18),
|
|
1230
|
+
0 0 0 1px rgba(255, 121, 0, 0.1);
|
|
1231
|
+
--theme-ai-card-backdrop-filter: blur(12px);
|
|
1232
|
+
--theme-ai-card-transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1233
|
+
|
|
1234
|
+
// Card backgrounds (matches preset)
|
|
1235
|
+
--theme-card-border: 1px solid rgba(0, 0, 0, 0.08);
|
|
1236
|
+
--theme-card-border-hover: 1px solid rgba(255, 121, 0, 0.2);
|
|
1237
|
+
--theme-card-background: var(--background);
|
|
1238
|
+
// Fallback for browsers without color-mix support
|
|
1239
|
+
--theme-card-background-hover: rgba(255, 255, 255, 0.88);
|
|
1240
|
+
--theme-card-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
1241
|
+
--theme-card-box-shadow-hover: 0 2px 4px rgba(0, 0, 0, 0.06);
|
|
1242
|
+
|
|
1243
|
+
// Flat section backgrounds
|
|
1244
|
+
--section-background: var(--background);
|
|
1245
|
+
--section-background-hover: var(--background);
|
|
1246
|
+
--section-surface: #fcfcfc;
|
|
1247
|
+
--section-surface-hover: #f8f8f8;
|
|
1248
|
+
--popover: #{$osi-color-white};
|
|
1249
|
+
--popover-foreground: #1a1a1a;
|
|
1250
|
+
--primary: #{$osi-color-brand};
|
|
1251
|
+
--primary-foreground: #{$osi-color-white};
|
|
1252
|
+
--secondary: #f5f5f5;
|
|
1253
|
+
--secondary-foreground: #1a1a1a;
|
|
1254
|
+
--accent: #{$osi-color-brand};
|
|
1255
|
+
--accent-foreground: #{$osi-color-white};
|
|
1256
|
+
--destructive: #d4183d;
|
|
1257
|
+
--destructive-foreground: #{$osi-color-white};
|
|
1258
|
+
--border: rgba(200, 200, 200, 0.5);
|
|
1259
|
+
--input: transparent;
|
|
1260
|
+
--input-background: #f9f9f9;
|
|
1261
|
+
--switch-background: #e5e5e5;
|
|
1262
|
+
--ring: #{$brand-color-40};
|
|
1263
|
+
--chart-1: #{$osi-color-brand};
|
|
1264
|
+
--chart-2: #{$osi-color-brand-light};
|
|
1265
|
+
--chart-3: #{$osi-color-brand-dark};
|
|
1266
|
+
--chart-4: #{$osi-color-brand-pale};
|
|
1267
|
+
--chart-5: #ff4500;
|
|
1268
|
+
|
|
1269
|
+
// Light theme gray overrides
|
|
1270
|
+
--color-gray-700: #e0e0e0;
|
|
1271
|
+
--color-gray-600: #d0d0d0;
|
|
1272
|
+
|
|
1273
|
+
// Element type overrides - subtle theme-aware hover
|
|
1274
|
+
--hero-card-border: 1px solid rgba(146, 153, 158, 0.25);
|
|
1275
|
+
--hero-card-border-hover: 1px solid rgba(255, 121, 0, 0.2);
|
|
1276
|
+
// Section (matches preset)
|
|
1277
|
+
--theme-section-border: 1px solid rgba(0, 0, 0, 0.08);
|
|
1278
|
+
--theme-section-border-hover: 1px solid rgba(0, 0, 0, 0.1);
|
|
1279
|
+
--theme-section-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
1280
|
+
--theme-section-box-shadow-hover: 0 2px 4px rgba(0, 0, 0, 0.07);
|
|
1281
|
+
--theme-section-transition:
|
|
1282
|
+
border-color 0.22s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.22s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1283
|
+
// Section Item (matches preset)
|
|
1284
|
+
--theme-section-item-border: 1px solid rgba(0, 0, 0, 0.06);
|
|
1285
|
+
--theme-section-item-border-hover: 1px solid rgba(255, 121, 0, 0.08);
|
|
1286
|
+
--theme-section-item-background: #f9f9f9;
|
|
1287
|
+
--theme-section-item-background-hover: #f7f7f7;
|
|
1288
|
+
--theme-section-item-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
1289
|
+
--theme-section-item-box-shadow-hover: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
1290
|
+
--theme-section-item-hover-transform: none;
|
|
1291
|
+
--theme-section-item-transition:
|
|
1292
|
+
background 220ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 220ms cubic-bezier(0.4, 0, 0.2, 1),
|
|
1293
|
+
border-color 220ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
// ============================================
|
|
1297
|
+
// 6. MAIN TOKEN GENERATION MIXIN
|
|
1298
|
+
// ============================================
|
|
1299
|
+
|
|
1300
|
+
/// Generate all design tokens
|
|
1301
|
+
/// @param {String} $variant - 'demo' for larger demo app, 'integration' for compact OSA
|
|
1302
|
+
/// @param {Boolean} $is-scoped - If true, outputs for nested context
|
|
1303
|
+
@mixin osi-tokens($variant: "demo", $is-scoped: false) {
|
|
1304
|
+
@include osi-shadows();
|
|
1305
|
+
@include osi-radius();
|
|
1306
|
+
|
|
1307
|
+
// Cross-browser color-mix support for section title hover color
|
|
1308
|
+
@supports (color: color-mix(in srgb, black 50%, white)) {
|
|
1309
|
+
--osi-section-title-hover-color: color-mix(
|
|
1310
|
+
in srgb,
|
|
1311
|
+
var(--color-brand) 70%,
|
|
1312
|
+
var(--color-white) 30%
|
|
1313
|
+
);
|
|
1314
|
+
}
|
|
1315
|
+
@include osi-spacing();
|
|
1316
|
+
@include osi-z-index();
|
|
1317
|
+
@include osi-animation();
|
|
1318
|
+
@include osi-opacity();
|
|
1319
|
+
@include osi-typography($variant);
|
|
1320
|
+
@include osi-card-typography($variant);
|
|
1321
|
+
@include osi-card-layout();
|
|
1322
|
+
@include osi-card-text-colors();
|
|
1323
|
+
@include osi-card-surfaces();
|
|
1324
|
+
@include osi-status-colors();
|
|
1325
|
+
@include osi-interactive();
|
|
1326
|
+
@include osi-element-system();
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
/// Generate reduced motion overrides
|
|
1330
|
+
@mixin osi-tokens-reduced-motion() {
|
|
1331
|
+
--duration-instant: 1ms;
|
|
1332
|
+
--duration-fast: 1ms;
|
|
1333
|
+
--duration-normal: 1ms;
|
|
1334
|
+
--duration-moderate: 1ms;
|
|
1335
|
+
--duration-slow: 1ms;
|
|
1336
|
+
--duration-slower: 1ms;
|
|
1337
|
+
--duration-slowest: 1ms;
|
|
1338
|
+
--stagger-delay-base: 0ms;
|
|
1339
|
+
--stagger-delay-fast: 0ms;
|
|
1340
|
+
--stagger-delay-slow: 0ms;
|
|
1341
|
+
--ai-card-entrance-animation: none;
|
|
1342
|
+
--section-entrance-animation: none;
|
|
1343
|
+
--section-item-entrance-animation: none;
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
/// Generate high contrast mode overrides
|
|
1347
|
+
@mixin osi-tokens-high-contrast() {
|
|
1348
|
+
--foreground: #{$osi-color-white};
|
|
1349
|
+
--background: #{$osi-color-black};
|
|
1350
|
+
--muted-foreground: #{$osi-color-white};
|
|
1351
|
+
--muted: #{$osi-color-black};
|
|
1352
|
+
--border: #{$osi-color-white};
|
|
1353
|
+
--card: #{$osi-color-black};
|
|
1354
|
+
--card-foreground: #{$osi-color-white};
|
|
1355
|
+
--ai-card-border: 2px solid #{$osi-color-white};
|
|
1356
|
+
--section-border: 2px solid #{$osi-color-white};
|
|
1357
|
+
--button-border: 2px solid #{$osi-color-white};
|
|
1358
|
+
--card-background: #{$osi-color-black};
|
|
1359
|
+
--card-background-hover: #1a1a1a;
|
|
1360
|
+
--section-item-background: #{$osi-color-black};
|
|
1361
|
+
--section-item-background-hover: #1a1a1a;
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
/// Generate forced colors mode overrides
|
|
1365
|
+
@mixin osi-tokens-forced-colors() {
|
|
1366
|
+
--foreground: ButtonText;
|
|
1367
|
+
--background: Canvas;
|
|
1368
|
+
--border: ButtonBorder;
|
|
1369
|
+
--card: Canvas;
|
|
1370
|
+
--card-foreground: ButtonText;
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
// ============================================
|
|
1374
|
+
// 7. CSS PROPERTY HELPER MIXINS (for Bootstrap overrides)
|
|
1375
|
+
// ============================================
|
|
1376
|
+
|
|
1377
|
+
// These mixins allow applying !important when needed
|
|
1378
|
+
@mixin display($value) {
|
|
1379
|
+
display: $value !important;
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
@mixin flex-direction($value) {
|
|
1383
|
+
flex-direction: $value !important;
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
@mixin gap($value) {
|
|
1387
|
+
gap: $value !important;
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1390
|
+
@mixin width($value) {
|
|
1391
|
+
width: $value !important;
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
@mixin min-height($value) {
|
|
1395
|
+
min-height: $value !important;
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
@mixin box-sizing($value) {
|
|
1399
|
+
box-sizing: $value !important;
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
@mixin grid-columns($value) {
|
|
1403
|
+
grid-template-columns: $value !important;
|
|
1404
|
+
}
|