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.
Files changed (87) hide show
  1. package/fesm2022/osi-cards-lib.mjs +31889 -0
  2. package/fesm2022/osi-cards-lib.mjs.map +1 -0
  3. package/index.d.ts +11528 -0
  4. package/package.json +25 -13
  5. package/scripts/setup-angular-styles.js +169 -0
  6. package/styles/_components.scss +38 -0
  7. package/styles/_index.scss +25 -0
  8. package/styles/_osi-cards-mixins.scss +459 -0
  9. package/styles/_osi-cards-tokens.scss +333 -0
  10. package/styles/_styles-scoped.scss +81 -0
  11. package/styles/_styles.scss +26 -0
  12. package/styles/bundles/_ai-card.scss +245 -0
  13. package/styles/bundles/_all.scss +68 -0
  14. package/styles/bundles/_base.scss +60 -0
  15. package/styles/bundles/_card-skeleton.scss +290 -0
  16. package/styles/bundles/_index.scss +25 -0
  17. package/styles/bundles/_sections.scss +48 -0
  18. package/styles/bundles/_tokens-only.scss +139 -0
  19. package/styles/components/_ai-card-renderer.scss +104 -0
  20. package/styles/components/_badges.scss +317 -0
  21. package/styles/components/_card-actions.scss +169 -0
  22. package/styles/components/_card-footer.scss +47 -0
  23. package/styles/components/_component-styles.scss +205 -0
  24. package/styles/components/_empty-state.scss +630 -0
  25. package/styles/components/_hero-card.scss +422 -0
  26. package/styles/components/_image-fallback.scss +28 -0
  27. package/styles/components/_streaming-effects.scss +518 -0
  28. package/styles/components/cards/_ai-card.scss +718 -0
  29. package/styles/components/sections/_all-sections.generated.scss +41 -0
  30. package/styles/components/sections/_all-sections.scss +1086 -0
  31. package/styles/components/sections/_balanced-compact-system.scss +186 -0
  32. package/styles/components/sections/_compact-mixins.scss +180 -0
  33. package/styles/components/sections/_component-mixins.scss +454 -0
  34. package/styles/components/sections/_design-system.scss +477 -0
  35. package/styles/components/sections/_design-tokens.scss +308 -0
  36. package/styles/components/sections/_enhanced-design-variables.scss +147 -0
  37. package/styles/components/sections/_master-compact-system.scss +302 -0
  38. package/styles/components/sections/_master-dense-system.scss +239 -0
  39. package/styles/components/sections/_minimalistic-design.scss +268 -0
  40. package/styles/components/sections/_modern-effects.scss +392 -0
  41. package/styles/components/sections/_modern-sections.scss +351 -0
  42. package/styles/components/sections/_perfect-system.scss +204 -0
  43. package/styles/components/sections/_section-animations.scss +331 -0
  44. package/styles/components/sections/_section-shell.scss +337 -0
  45. package/styles/components/sections/_section-types.generated.scss +30 -0
  46. package/styles/components/sections/_sections-all.scss +26 -0
  47. package/styles/components/sections/_sections-base.scss +334 -0
  48. package/styles/components/sections/_typography-system.scss +327 -0
  49. package/styles/components/sections/_ultra-compact-tokens.scss +375 -0
  50. package/styles/components/sections/_unified-section-style.scss +157 -0
  51. package/styles/components/sections/_utility-classes.scss +567 -0
  52. package/styles/components/sections/_visual-effects-library.scss +374 -0
  53. package/styles/core/_animations.scss +1498 -0
  54. package/styles/core/_bootstrap-reset.scss +445 -0
  55. package/styles/core/_color-helpers.scss +46 -0
  56. package/styles/core/_global-unified.scss +118 -0
  57. package/styles/core/_global.scss +73 -0
  58. package/styles/core/_mixins.scss +491 -0
  59. package/styles/core/_surface-layers.scss +76 -0
  60. package/styles/core/_utilities.scss +326 -0
  61. package/styles/core/_variables-unified.scss +57 -0
  62. package/styles/core/_variables.scss +36 -0
  63. package/styles/core/variables/_colors-source.scss +34 -0
  64. package/styles/core/variables/_colors-unified.scss +26 -0
  65. package/styles/core/variables/_colors.scss +21 -0
  66. package/styles/critical.scss +353 -0
  67. package/styles/design-system/_compact-theme.scss +159 -0
  68. package/styles/design-system/_section-base.scss +426 -0
  69. package/styles/design-system/_tokens.scss +237 -0
  70. package/styles/design-system/_unified-sections.scss +215 -0
  71. package/styles/layout/_feature-grid.scss +322 -0
  72. package/styles/layout/_masonry.scss +734 -0
  73. package/styles/layout/_tilt.scss +244 -0
  74. package/styles/micro-interactions.scss +583 -0
  75. package/styles/mixins/_section-mixins.scss +280 -0
  76. package/styles/non-critical.scss +643 -0
  77. package/styles/reset/_framework-reset.scss +457 -0
  78. package/styles/reset/_index.scss +14 -0
  79. package/styles/reset/_shadow-reset.scss +383 -0
  80. package/styles/responsive.scss +326 -0
  81. package/styles/themes.scss +573 -0
  82. package/styles/tokens/_index.scss +92 -0
  83. package/styles/tokens/_master.scss +1404 -0
  84. package/styles/tokens/_section-tokens.generated.scss +140 -0
  85. package/postcss.config.js +0 -81
  86. package/section-registry.json +0 -3864
  87. package/section-registry.schema.json +0 -264
@@ -0,0 +1,426 @@
1
+ // =====================================================================
2
+ // SECTION BASE STYLES - Common Patterns for All Sections
3
+ // =====================================================================
4
+ // These styles define the standard structure and patterns used across
5
+ // all section types. Import this file to get consistent styling.
6
+
7
+ @use "./tokens" as *;
8
+
9
+ // ═══════════════════════════════════════════════════════════════════
10
+ // SECTION CONTAINER (Standard wrapper for all sections)
11
+ // ═══════════════════════════════════════════════════════════════════
12
+
13
+ @mixin section-container {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: var(--osi-section-header-gap);
17
+ width: 100%;
18
+ }
19
+
20
+ // ═══════════════════════════════════════════════════════════════════
21
+ // GRID LAYOUTS (Standardized grid patterns)
22
+ // ═══════════════════════════════════════════════════════════════════
23
+
24
+ // Small cards (analytics, metrics)
25
+ @mixin grid-small-cards {
26
+ display: grid;
27
+ grid-template-columns: repeat(auto-fit, minmax(var(--osi-grid-min-small), 1fr));
28
+ gap: var(--osi-grid-gap);
29
+
30
+ @include mobile {
31
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
32
+ gap: var(--osi-spacing-sm);
33
+ }
34
+ }
35
+
36
+ // Medium cards (contacts, products)
37
+ @mixin grid-medium-cards {
38
+ display: grid;
39
+ grid-template-columns: repeat(auto-fit, minmax(var(--osi-grid-min-medium), 1fr));
40
+ gap: var(--osi-grid-gap);
41
+
42
+ @include mobile {
43
+ grid-template-columns: 1fr;
44
+ gap: var(--osi-spacing-sm);
45
+ }
46
+ }
47
+
48
+ // Large cards (gallery, features)
49
+ @mixin grid-large-cards {
50
+ display: grid;
51
+ grid-template-columns: repeat(auto-fit, minmax(var(--osi-grid-min-large), 1fr));
52
+ gap: var(--osi-grid-gap);
53
+
54
+ @include mobile {
55
+ grid-template-columns: 1fr;
56
+ }
57
+ }
58
+
59
+ // Two-column layout
60
+ @mixin grid-two-column {
61
+ display: grid;
62
+ grid-template-columns: repeat(2, 1fr);
63
+ gap: var(--osi-grid-gap);
64
+
65
+ @include mobile {
66
+ grid-template-columns: 1fr;
67
+ }
68
+ }
69
+
70
+ // Three-column layout
71
+ @mixin grid-three-column {
72
+ display: grid;
73
+ grid-template-columns: repeat(3, 1fr);
74
+ gap: var(--osi-grid-gap);
75
+
76
+ @include tablet {
77
+ grid-template-columns: repeat(2, 1fr);
78
+ }
79
+
80
+ @include mobile {
81
+ grid-template-columns: 1fr;
82
+ }
83
+ }
84
+
85
+ // ═══════════════════════════════════════════════════════════════════
86
+ // LIST LAYOUTS (Vertical stacking)
87
+ // ═══════════════════════════════════════════════════════════════════
88
+
89
+ @mixin list-layout {
90
+ display: flex;
91
+ flex-direction: column;
92
+ gap: var(--osi-item-gap);
93
+ }
94
+
95
+ // ═══════════════════════════════════════════════════════════════════
96
+ // CARD STYLES (Standard card appearance)
97
+ // ═══════════════════════════════════════════════════════════════════
98
+
99
+ @mixin card-base {
100
+ background: var(--osi-surface-raised);
101
+ border: 1px solid var(--osi-border);
102
+ border-radius: var(--osi-radius-md);
103
+ padding: var(--osi-item-padding);
104
+ transition: all var(--osi-duration-normal) var(--osi-ease-out);
105
+ position: relative;
106
+ overflow: hidden;
107
+
108
+ // Ensure proper stacking context
109
+ isolation: isolate;
110
+ }
111
+
112
+ @mixin card-elevated {
113
+ @include card-base;
114
+ box-shadow: var(--osi-shadow-sm);
115
+ position: relative;
116
+
117
+ // Subtle accent border on hover for visual interest
118
+ &::before {
119
+ content: "";
120
+ position: absolute;
121
+ top: 0;
122
+ left: 0;
123
+ right: 0;
124
+ height: 2px;
125
+ background: linear-gradient(90deg, var(--osi-accent) 0%, transparent 100%);
126
+ opacity: 0;
127
+ transition: opacity var(--osi-duration-normal) var(--osi-ease-out);
128
+ border-radius: var(--osi-radius-md) var(--osi-radius-md) 0 0;
129
+ }
130
+
131
+ &:hover {
132
+ transform: translateY(-2px);
133
+ box-shadow: var(--osi-shadow-md);
134
+ border-color: var(--osi-border);
135
+
136
+ &::before {
137
+ opacity: 0.6;
138
+ }
139
+ }
140
+
141
+ &:focus-visible {
142
+ outline: 2px solid var(--osi-accent);
143
+ outline-offset: 2px;
144
+ }
145
+ }
146
+
147
+ @mixin card-interactive {
148
+ @include card-elevated;
149
+ cursor: pointer;
150
+
151
+ &:hover {
152
+ background: var(--osi-surface-hover);
153
+ border-color: var(--osi-border);
154
+ }
155
+
156
+ &:active {
157
+ transform: translateY(0);
158
+ box-shadow: var(--osi-shadow-sm);
159
+ background: var(--osi-surface-raised);
160
+ }
161
+
162
+ &:focus-visible {
163
+ outline: 2px solid var(--osi-accent);
164
+ outline-offset: 2px;
165
+ }
166
+ }
167
+
168
+ // ═══════════════════════════════════════════════════════════════════
169
+ // ITEM STYLES (Individual items in lists/grids)
170
+ // ═══════════════════════════════════════════════════════════════════
171
+
172
+ @mixin item-base {
173
+ padding: var(--osi-item-padding);
174
+ border-radius: var(--osi-radius-sm);
175
+ transition: all var(--osi-duration-normal) var(--osi-ease-out);
176
+ }
177
+
178
+ @mixin item-hoverable {
179
+ @include item-base;
180
+
181
+ &:hover {
182
+ background: var(--osi-surface-raised);
183
+ transform: translateX(4px);
184
+ }
185
+ }
186
+
187
+ @mixin item-with-border {
188
+ @include item-base;
189
+ background: var(--osi-surface-raised);
190
+ border: 1px solid var(--osi-border);
191
+
192
+ &:hover {
193
+ border-color: var(--osi-border);
194
+ background: var(--osi-surface-hover);
195
+ }
196
+ }
197
+
198
+ // ═══════════════════════════════════════════════════════════════════
199
+ // TYPOGRAPHY PATTERNS
200
+ // ═══════════════════════════════════════════════════════════════════
201
+
202
+ // Item title (h4-h6 level headings in items)
203
+ @mixin item-title {
204
+ margin: 0;
205
+ font-size: var(--osi-text-base);
206
+ font-weight: var(--osi-font-semibold);
207
+ line-height: var(--osi-leading-snug);
208
+ color: var(--osi-foreground);
209
+ }
210
+
211
+ // Item label (small uppercase labels)
212
+ @mixin item-label {
213
+ font-size: var(--osi-text-xs);
214
+ font-weight: var(--osi-font-medium);
215
+ line-height: var(--osi-leading-tight);
216
+ color: var(--osi-muted-foreground);
217
+ text-transform: uppercase;
218
+ letter-spacing: var(--osi-tracking-wider);
219
+ }
220
+
221
+ // Item value (prominent values)
222
+ @mixin item-value {
223
+ font-size: var(--osi-text-md);
224
+ font-weight: var(--osi-font-semibold);
225
+ line-height: var(--osi-leading-normal);
226
+ color: var(--osi-foreground);
227
+ }
228
+
229
+ // Item description (secondary text)
230
+ @mixin item-description {
231
+ font-size: var(--osi-text-sm);
232
+ font-weight: var(--osi-font-normal);
233
+ line-height: var(--osi-leading-relaxed);
234
+ color: var(--osi-muted-foreground);
235
+ }
236
+
237
+ // Number display (for metrics, analytics)
238
+ @mixin number-display {
239
+ font-size: var(--osi-text-2xl);
240
+ font-weight: var(--osi-font-bold);
241
+ line-height: 1;
242
+ letter-spacing: var(--osi-tracking-tight);
243
+ font-variant-numeric: tabular-nums;
244
+ color: var(--osi-foreground);
245
+ }
246
+
247
+ // ═══════════════════════════════════════════════════════════════════
248
+ // CONTENT STRUCTURE (Common element layouts)
249
+ // ═══════════════════════════════════════════════════════════════════
250
+
251
+ @mixin content-header {
252
+ display: flex;
253
+ align-items: center;
254
+ justify-content: space-between;
255
+ gap: var(--osi-spacing-md);
256
+ margin-bottom: var(--osi-spacing-sm);
257
+ }
258
+
259
+ @mixin content-body {
260
+ display: flex;
261
+ flex-direction: column;
262
+ gap: var(--osi-element-gap);
263
+ }
264
+
265
+ @mixin content-footer {
266
+ display: flex;
267
+ align-items: center;
268
+ gap: var(--osi-spacing-sm);
269
+ margin-top: var(--osi-spacing-sm);
270
+ padding-top: var(--osi-spacing-sm);
271
+ border-top: 1px solid var(--osi-border-muted);
272
+ }
273
+
274
+ // ═══════════════════════════════════════════════════════════════════
275
+ // COMMON PATTERNS
276
+ // ═══════════════════════════════════════════════════════════════════
277
+
278
+ // Metadata row (icons + text)
279
+ @mixin metadata-row {
280
+ display: flex;
281
+ align-items: center;
282
+ gap: var(--osi-spacing-xs);
283
+ font-size: var(--osi-text-sm);
284
+ color: var(--osi-muted-foreground);
285
+ }
286
+
287
+ // Badge container
288
+ @mixin badge-container {
289
+ display: flex;
290
+ align-items: center;
291
+ gap: var(--osi-spacing-xs);
292
+ flex-wrap: wrap;
293
+ }
294
+
295
+ // Avatar (circular)
296
+ @mixin avatar($size: 40px) {
297
+ width: $size;
298
+ height: $size;
299
+ border-radius: var(--osi-radius-full);
300
+ object-fit: cover;
301
+ background: var(--osi-surface-hover);
302
+ display: flex;
303
+ align-items: center;
304
+ justify-content: center;
305
+ font-size: calc($size * 0.4);
306
+ font-weight: var(--osi-font-semibold);
307
+ color: var(--osi-foreground);
308
+ }
309
+
310
+ // Icon wrapper
311
+ @mixin icon-wrapper($size: 24px) {
312
+ width: $size;
313
+ height: $size;
314
+ display: flex;
315
+ align-items: center;
316
+ justify-content: center;
317
+ flex-shrink: 0;
318
+ color: var(--osi-muted-foreground);
319
+ }
320
+
321
+ // Divider line
322
+ @mixin divider {
323
+ height: 1px;
324
+ background: var(--osi-border-muted);
325
+ margin: var(--osi-spacing-sm) 0;
326
+ }
327
+
328
+ // ═══════════════════════════════════════════════════════════════════
329
+ // ANIMATION PATTERNS
330
+ // ═══════════════════════════════════════════════════════════════════
331
+
332
+ // Fade in animation
333
+ @mixin fade-in {
334
+ animation: fadeIn var(--osi-duration-medium) var(--osi-ease-out);
335
+ }
336
+
337
+ @keyframes fadeIn {
338
+ from {
339
+ opacity: 0;
340
+ transform: translateY(8px);
341
+ }
342
+ to {
343
+ opacity: 1;
344
+ transform: translateY(0);
345
+ }
346
+ }
347
+
348
+ // Slide in animation
349
+ @mixin slide-in-right {
350
+ animation: slideInRight var(--osi-duration-medium) var(--osi-ease-out);
351
+ }
352
+
353
+ @keyframes slideInRight {
354
+ from {
355
+ opacity: 0;
356
+ transform: translateX(-16px);
357
+ }
358
+ to {
359
+ opacity: 1;
360
+ transform: translateX(0);
361
+ }
362
+ }
363
+
364
+ // Scale in animation
365
+ @mixin scale-in {
366
+ animation: scaleIn var(--osi-duration-normal) var(--osi-ease-bounce);
367
+ }
368
+
369
+ @keyframes scaleIn {
370
+ from {
371
+ opacity: 0;
372
+ transform: scale(0.95);
373
+ }
374
+ to {
375
+ opacity: 1;
376
+ transform: scale(1);
377
+ }
378
+ }
379
+
380
+ // ═══════════════════════════════════════════════════════════════════
381
+ // ACCESSIBILITY PATTERNS
382
+ // ═══════════════════════════════════════════════════════════════════
383
+
384
+ // Screen reader only
385
+ @mixin sr-only {
386
+ position: absolute;
387
+ width: 1px;
388
+ height: 1px;
389
+ padding: 0;
390
+ margin: -1px;
391
+ overflow: hidden;
392
+ clip: rect(0, 0, 0, 0);
393
+ white-space: nowrap;
394
+ border-width: 0;
395
+ }
396
+
397
+ // Focus visible (keyboard navigation)
398
+ @mixin focus-visible {
399
+ &:focus-visible {
400
+ outline: 2px solid var(--osi-accent);
401
+ outline-offset: 2px;
402
+ border-radius: var(--osi-radius-sm);
403
+ }
404
+ }
405
+
406
+ // Interactive element states
407
+ @mixin interactive-states {
408
+ @include focus-visible;
409
+
410
+ &:hover {
411
+ @content;
412
+ }
413
+
414
+ &:active {
415
+ transform: scale(0.98);
416
+ }
417
+
418
+ @media (prefers-reduced-motion: reduce) {
419
+ transition: none;
420
+
421
+ &:hover,
422
+ &:active {
423
+ transform: none;
424
+ }
425
+ }
426
+ }
@@ -0,0 +1,237 @@
1
+ // =====================================================================
2
+ // DESIGN SYSTEM TOKENS - Universal Variables
3
+ // =====================================================================
4
+ // This file defines all design tokens used across sections
5
+ // Use these tokens instead of hardcoded values for consistency
6
+
7
+ :root {
8
+ // ═══════════════════════════════════════════════════════════════════
9
+ // SPACING SCALE (4px base unit)
10
+ // ═══════════════════════════════════════════════════════════════════
11
+ --osi-spacing-xs: 4px;
12
+ --osi-spacing-sm: 8px;
13
+ --osi-spacing-md: 12px;
14
+ --osi-spacing-lg: 16px;
15
+ --osi-spacing-xl: 24px;
16
+ --osi-spacing-2xl: 32px;
17
+ --osi-spacing-3xl: 48px;
18
+
19
+ // Section-specific spacing (More compact by default)
20
+ --osi-section-header-gap: var(--osi-spacing-sm); // 8px (was 12px)
21
+ --osi-section-padding: var(--osi-spacing-sm); // 8px (was 12px)
22
+ --osi-section-gap: var(--osi-spacing-md); // 12px (was 16px)
23
+ --osi-item-padding: var(--osi-spacing-sm); // 8px (was 12px)
24
+ --osi-item-gap: var(--osi-spacing-xs); // 4px (was 8px)
25
+ --osi-element-gap: 2px; // 2px (was 4px)
26
+
27
+ // ═══════════════════════════════════════════════════════════════════
28
+ // TYPOGRAPHY SCALE
29
+ // ═══════════════════════════════════════════════════════════════════
30
+
31
+ // Font Sizes (rem-based for accessibility)
32
+ --osi-text-xs: 0.75rem; // 12px
33
+ --osi-text-sm: 0.875rem; // 14px
34
+ --osi-text-base: 1rem; // 16px
35
+ --osi-text-md: 1.125rem; // 18px
36
+ --osi-text-lg: 1.25rem; // 20px
37
+ --osi-text-xl: 1.5rem; // 24px
38
+ --osi-text-2xl: 1.875rem; // 30px
39
+ --osi-text-3xl: 2.25rem; // 36px
40
+
41
+ // Font Weights
42
+ --osi-font-normal: 400;
43
+ --osi-font-medium: 500;
44
+ --osi-font-semibold: 600;
45
+ --osi-font-bold: 700;
46
+
47
+ // Line Heights
48
+ --osi-leading-tight: 1.25;
49
+ --osi-leading-snug: 1.375;
50
+ --osi-leading-normal: 1.5;
51
+ --osi-leading-relaxed: 1.625;
52
+ --osi-leading-loose: 2;
53
+
54
+ // Letter Spacing
55
+ --osi-tracking-tight: -0.025em;
56
+ --osi-tracking-normal: 0;
57
+ --osi-tracking-wide: 0.025em;
58
+ --osi-tracking-wider: 0.05em;
59
+
60
+ // ═══════════════════════════════════════════════════════════════════
61
+ // COLOR SYSTEM - Semantic Colors
62
+ // ═══════════════════════════════════════════════════════════════════
63
+
64
+ // Surface Colors (Layering)
65
+ --osi-surface: hsl(0, 0%, 10%); // #1a1a1a
66
+ --osi-surface-raised: hsl(0, 0%, 15%); // #262626
67
+ --osi-surface-hover: hsl(0, 0%, 20%); // #333333
68
+ --osi-surface-subtle: hsl(0, 0%, 12%); // #1f1f1f
69
+
70
+ // Text Colors
71
+ --osi-foreground: hsl(0, 0%, 95%); // #f2f2f2
72
+ --osi-foreground-strong: hsl(0, 0%, 100%); // #ffffff
73
+ --osi-muted-foreground: hsl(0, 0%, 60%); // #999999
74
+ --osi-disabled-foreground: hsl(0, 0%, 40%); // #666666
75
+
76
+ // Brand/Accent Colors
77
+ --osi-accent: hsl(25, 100%, 50%); // #ff7900
78
+ --osi-accent-bright: hsl(25, 100%, 60%); // #ffa347
79
+ --osi-accent-muted: hsl(25, 50%, 40%); // #bf7400
80
+
81
+ // Status Colors
82
+ --osi-success: hsl(142, 71%, 45%); // #22c55e
83
+ --osi-success-bg: hsla(142, 71%, 45%, 0.15);
84
+ --osi-success-bright: hsl(142, 71%, 55%);
85
+
86
+ --osi-error: hsl(0, 84%, 60%); // #ef4444
87
+ --osi-error-bg: hsla(0, 84%, 60%, 0.15);
88
+ --osi-error-bright: hsl(0, 84%, 70%);
89
+
90
+ --osi-warning: hsl(45, 93%, 47%); // #eab308
91
+ --osi-warning-bg: hsla(45, 93%, 47%, 0.15);
92
+ --osi-warning-bright: hsl(45, 93%, 57%);
93
+
94
+ --osi-info: hsl(221, 83%, 53%); // #3b82f6
95
+ --osi-info-bg: hsla(221, 83%, 53%, 0.15);
96
+ --osi-info-bright: hsl(221, 83%, 63%);
97
+
98
+ // Border Colors
99
+ --osi-border: hsla(0, 0%, 100%, 0.2); // rgba(255, 255, 255, 0.2)
100
+ --osi-border-muted: hsla(0, 0%, 100%, 0.06);
101
+ --osi-border-strong: hsla(0, 0%, 100%, 0.35);
102
+
103
+ // ═══════════════════════════════════════════════════════════════════
104
+ // BORDER RADIUS
105
+ // ═══════════════════════════════════════════════════════════════════
106
+ --osi-radius-none: 0;
107
+ --osi-radius-sm: 4px;
108
+ --osi-radius-md: 8px;
109
+ --osi-radius-lg: 12px;
110
+ --osi-radius-xl: 16px;
111
+ --osi-radius-full: 9999px;
112
+
113
+ // ═══════════════════════════════════════════════════════════════════
114
+ // SHADOWS (Elevation)
115
+ // ═══════════════════════════════════════════════════════════════════
116
+ --osi-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
117
+ --osi-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
118
+ --osi-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
119
+ --osi-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15);
120
+ --osi-shadow-2xl: 0 25px 50px rgba(0, 0, 0, 0.25);
121
+
122
+ // ═══════════════════════════════════════════════════════════════════
123
+ // TRANSITIONS & ANIMATIONS
124
+ // ═══════════════════════════════════════════════════════════════════
125
+
126
+ // Durations
127
+ --osi-duration-fast: 150ms;
128
+ --osi-duration-normal: 200ms;
129
+ --osi-duration-medium: 300ms;
130
+ --osi-duration-slow: 600ms;
131
+
132
+ // Easing Functions
133
+ --osi-ease-linear: linear;
134
+ --osi-ease-in: cubic-bezier(0.4, 0, 1, 1);
135
+ --osi-ease-out: cubic-bezier(0, 0, 0.2, 1);
136
+ --osi-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
137
+ --osi-ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
138
+
139
+ // ═══════════════════════════════════════════════════════════════════
140
+ // Z-INDEX SCALE
141
+ // ═══════════════════════════════════════════════════════════════════
142
+ --osi-z-base: 0;
143
+ --osi-z-raised: 10;
144
+ --osi-z-dropdown: 100;
145
+ --osi-z-sticky: 200;
146
+ --osi-z-fixed: 300;
147
+ --osi-z-modal: 400;
148
+ --osi-z-popover: 500;
149
+ --osi-z-tooltip: 600;
150
+
151
+ // ═══════════════════════════════════════════════════════════════════
152
+ // GRID & LAYOUT
153
+ // ═══════════════════════════════════════════════════════════════════
154
+ --osi-grid-gap: var(--osi-spacing-md);
155
+ --osi-grid-row-gap: var(--osi-grid-gap);
156
+ --osi-grid-column-gap: var(--osi-grid-gap);
157
+
158
+ // Common grid column widths
159
+ --osi-grid-min-small: 140px; // Analytics cards
160
+ --osi-grid-min-medium: 200px; // Contact cards
161
+ --osi-grid-min-large: 300px; // Gallery items
162
+
163
+ // ═══════════════════════════════════════════════════════════════════
164
+ // COMPACT SIZES (for min-heights, etc.)
165
+ // ═══════════════════════════════════════════════════════════════════
166
+ --osi-card-min-height: 90px; // Compact metric cards (was 120px)
167
+ --osi-card-min-height-large: 120px; // Larger cards when needed
168
+ }
169
+
170
+ // ═══════════════════════════════════════════════════════════════════
171
+ // RESPONSIVE BREAKPOINTS
172
+ // ═══════════════════════════════════════════════════════════════════
173
+
174
+ $osi-breakpoint-sm: 640px; // Small devices
175
+ $osi-breakpoint-md: 768px; // Medium devices
176
+ $osi-breakpoint-lg: 1024px; // Large devices
177
+ $osi-breakpoint-xl: 1280px; // Extra large devices
178
+
179
+ // Responsive mixins
180
+ @mixin mobile {
181
+ @media (max-width: #{$osi-breakpoint-sm - 1px}) {
182
+ @content;
183
+ }
184
+ }
185
+
186
+ @mixin tablet {
187
+ @media (min-width: $osi-breakpoint-sm) and (max-width: #{$osi-breakpoint-md - 1px}) {
188
+ @content;
189
+ }
190
+ }
191
+
192
+ @mixin desktop {
193
+ @media (min-width: $osi-breakpoint-md) {
194
+ @content;
195
+ }
196
+ }
197
+
198
+ @mixin large-desktop {
199
+ @media (min-width: $osi-breakpoint-lg) {
200
+ @content;
201
+ }
202
+ }
203
+
204
+ // ═══════════════════════════════════════════════════════════════════
205
+ // DARK MODE OVERRIDES
206
+ // ═══════════════════════════════════════════════════════════════════
207
+
208
+ @media (prefers-color-scheme: dark) {
209
+ :root {
210
+ --osi-surface: hsl(0, 0%, 8%);
211
+ --osi-surface-raised: hsl(0, 0%, 12%);
212
+ --osi-surface-hover: hsl(0, 0%, 16%);
213
+ --osi-border-muted: hsla(0, 0%, 100%, 0.04);
214
+ }
215
+ }
216
+
217
+ // ═══════════════════════════════════════════════════════════════════
218
+ // ACCESSIBILITY
219
+ // ═══════════════════════════════════════════════════════════════════
220
+
221
+ // High contrast mode support
222
+ @media (prefers-contrast: high) {
223
+ :root {
224
+ --osi-border: hsla(0, 0%, 100%, 0.4);
225
+ --osi-border-strong: hsla(0, 0%, 100%, 0.6);
226
+ }
227
+ }
228
+
229
+ // Reduced motion support
230
+ @media (prefers-reduced-motion: reduce) {
231
+ :root {
232
+ --osi-duration-fast: 0ms;
233
+ --osi-duration-normal: 0ms;
234
+ --osi-duration-medium: 0ms;
235
+ --osi-duration-slow: 0ms;
236
+ }
237
+ }