osi-cards-lib 1.5.32 → 1.5.33

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 (88) hide show
  1. package/README.md +20 -58
  2. package/fesm2022/osi-cards-lib.mjs +31878 -0
  3. package/fesm2022/osi-cards-lib.mjs.map +1 -0
  4. package/index.d.ts +11522 -0
  5. package/package.json +24 -12
  6. package/scripts/setup-angular-styles.js +169 -0
  7. package/styles/_components.scss +38 -0
  8. package/styles/_index.scss +25 -0
  9. package/styles/_osi-cards-mixins.scss +459 -0
  10. package/styles/_osi-cards-tokens.scss +333 -0
  11. package/styles/_styles-scoped.scss +81 -0
  12. package/styles/_styles.scss +26 -0
  13. package/styles/bundles/_ai-card.scss +245 -0
  14. package/styles/bundles/_all.scss +68 -0
  15. package/styles/bundles/_base.scss +60 -0
  16. package/styles/bundles/_card-skeleton.scss +290 -0
  17. package/styles/bundles/_index.scss +25 -0
  18. package/styles/bundles/_sections.scss +48 -0
  19. package/styles/bundles/_tokens-only.scss +139 -0
  20. package/styles/components/_ai-card-renderer.scss +104 -0
  21. package/styles/components/_badges.scss +317 -0
  22. package/styles/components/_card-actions.scss +169 -0
  23. package/styles/components/_card-footer.scss +47 -0
  24. package/styles/components/_component-styles.scss +205 -0
  25. package/styles/components/_empty-state.scss +630 -0
  26. package/styles/components/_hero-card.scss +422 -0
  27. package/styles/components/_image-fallback.scss +28 -0
  28. package/styles/components/_streaming-effects.scss +518 -0
  29. package/styles/components/cards/_ai-card.scss +718 -0
  30. package/styles/components/sections/_all-sections.generated.scss +41 -0
  31. package/styles/components/sections/_all-sections.scss +1086 -0
  32. package/styles/components/sections/_balanced-compact-system.scss +186 -0
  33. package/styles/components/sections/_compact-mixins.scss +180 -0
  34. package/styles/components/sections/_component-mixins.scss +454 -0
  35. package/styles/components/sections/_design-system.scss +477 -0
  36. package/styles/components/sections/_design-tokens.scss +308 -0
  37. package/styles/components/sections/_enhanced-design-variables.scss +147 -0
  38. package/styles/components/sections/_master-compact-system.scss +302 -0
  39. package/styles/components/sections/_master-dense-system.scss +239 -0
  40. package/styles/components/sections/_minimalistic-design.scss +268 -0
  41. package/styles/components/sections/_modern-effects.scss +392 -0
  42. package/styles/components/sections/_modern-sections.scss +351 -0
  43. package/styles/components/sections/_perfect-system.scss +204 -0
  44. package/styles/components/sections/_section-animations.scss +331 -0
  45. package/styles/components/sections/_section-shell.scss +337 -0
  46. package/styles/components/sections/_section-types.generated.scss +30 -0
  47. package/styles/components/sections/_sections-all.scss +26 -0
  48. package/styles/components/sections/_sections-base.scss +334 -0
  49. package/styles/components/sections/_typography-system.scss +327 -0
  50. package/styles/components/sections/_ultra-compact-tokens.scss +375 -0
  51. package/styles/components/sections/_unified-section-style.scss +157 -0
  52. package/styles/components/sections/_utility-classes.scss +567 -0
  53. package/styles/components/sections/_visual-effects-library.scss +374 -0
  54. package/styles/core/_animations.scss +1498 -0
  55. package/styles/core/_bootstrap-reset.scss +445 -0
  56. package/styles/core/_color-helpers.scss +46 -0
  57. package/styles/core/_global-unified.scss +118 -0
  58. package/styles/core/_global.scss +73 -0
  59. package/styles/core/_mixins.scss +491 -0
  60. package/styles/core/_surface-layers.scss +76 -0
  61. package/styles/core/_utilities.scss +326 -0
  62. package/styles/core/_variables-unified.scss +57 -0
  63. package/styles/core/_variables.scss +36 -0
  64. package/styles/core/variables/_colors-source.scss +34 -0
  65. package/styles/core/variables/_colors-unified.scss +26 -0
  66. package/styles/core/variables/_colors.scss +21 -0
  67. package/styles/critical.scss +353 -0
  68. package/styles/design-system/_compact-theme.scss +159 -0
  69. package/styles/design-system/_section-base.scss +426 -0
  70. package/styles/design-system/_tokens.scss +237 -0
  71. package/styles/design-system/_unified-sections.scss +215 -0
  72. package/styles/layout/_feature-grid.scss +322 -0
  73. package/styles/layout/_masonry.scss +734 -0
  74. package/styles/layout/_tilt.scss +244 -0
  75. package/styles/micro-interactions.scss +583 -0
  76. package/styles/mixins/_section-mixins.scss +280 -0
  77. package/styles/non-critical.scss +643 -0
  78. package/styles/reset/_framework-reset.scss +457 -0
  79. package/styles/reset/_index.scss +14 -0
  80. package/styles/reset/_shadow-reset.scss +383 -0
  81. package/styles/responsive.scss +326 -0
  82. package/styles/themes.scss +573 -0
  83. package/styles/tokens/_index.scss +92 -0
  84. package/styles/tokens/_master.scss +1404 -0
  85. package/styles/tokens/_section-tokens.generated.scss +140 -0
  86. package/postcss.config.js +0 -81
  87. package/section-registry.json +0 -3864
  88. package/section-registry.schema.json +0 -264
@@ -0,0 +1,573 @@
1
+ /**
2
+ * OSI Cards - Theme Presets
3
+ *
4
+ * Beautiful, opinionated theme presets for OSI Cards.
5
+ *
6
+ * ⚠️ WARNING: This file contains :root selectors for global theming.
7
+ * For library integration, prefer container-scoped theming:
8
+ * - Use <osi-cards-container [theme]="'day'"> component
9
+ * - Use [attr.data-theme]="theme" attribute binding
10
+ * - This file is primarily for demo app use
11
+ *
12
+ * The selectors below support both global (:root) and container-scoped (.osi-cards-container) usage.
13
+ *
14
+ * ⚠️ TOKEN SOURCE RELATIONSHIPS:
15
+ * This file defines demo app theme presets (`--osi-card-*` variables).
16
+ * For CSS component tokens, see: `styles/tokens/_master.scss`
17
+ * For JS-applied theme presets, see: `themes/presets.ts`
18
+ *
19
+ * NOTE: Theme values here may differ from `themes/presets.ts` as they serve
20
+ * different purposes (demo app vs library integration). Consider aligning
21
+ * values if consistency is required.
22
+ */
23
+
24
+ // ============================================
25
+ // Light Theme (Default)
26
+ // ============================================
27
+
28
+ [data-theme="light"],
29
+ .osi-cards-container[data-theme="light"],
30
+ :root {
31
+ // Base colors
32
+ --osi-card-background: #ffffff;
33
+ --osi-card-foreground: #1a1a2e;
34
+ --osi-card-muted: #64748b;
35
+ --osi-card-muted-foreground: #94a3b8;
36
+
37
+ // Surface colors
38
+ --osi-card-surface: #f8fafc;
39
+ --osi-card-surface-hover: #f1f5f9;
40
+ --osi-card-surface-active: #e2e8f0;
41
+
42
+ // Accent
43
+ --osi-card-accent: #6366f1;
44
+ --osi-card-accent-rgb: 99, 102, 241;
45
+ --osi-card-accent-foreground: #ffffff;
46
+ --osi-card-accent-hover: #4f46e5;
47
+
48
+ // Borders
49
+ --osi-card-border: #e2e8f0;
50
+ --osi-card-border-hover: #cbd5e1;
51
+ --osi-card-ring: rgba(99, 102, 241, 0.3);
52
+
53
+ // Status colors
54
+ --osi-card-success: #10b981;
55
+ --osi-card-success-bg: #ecfdf5;
56
+ --osi-card-warning: #f59e0b;
57
+ --osi-card-warning-bg: #fffbeb;
58
+ --osi-card-destructive: #ef4444;
59
+ --osi-card-destructive-bg: #fef2f2;
60
+ --osi-card-info: #3b82f6;
61
+ --osi-card-info-bg: #eff6ff;
62
+
63
+ // Shadows
64
+ --osi-card-shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.04);
65
+ --osi-card-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.04);
66
+ --osi-card-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.08), 0 4px 6px rgba(0, 0, 0, 0.03);
67
+ --osi-card-shadow-glow: 0 0 20px rgba(99, 102, 241, 0.15);
68
+ }
69
+
70
+ // ============================================
71
+ // Dark Theme
72
+ // ============================================
73
+
74
+ [data-theme="dark"],
75
+ .osi-cards-container[data-theme="dark"] {
76
+ // Base colors
77
+ --osi-card-background: #0f172a;
78
+ --osi-card-foreground: #f1f5f9;
79
+ --osi-card-muted: #94a3b8;
80
+ --osi-card-muted-foreground: #64748b;
81
+
82
+ // Surface colors
83
+ --osi-card-surface: #1e293b;
84
+ --osi-card-surface-hover: #334155;
85
+ --osi-card-surface-active: #475569;
86
+
87
+ // Accent
88
+ --osi-card-accent: #818cf8;
89
+ --osi-card-accent-rgb: 129, 140, 248;
90
+ --osi-card-accent-foreground: #0f172a;
91
+ --osi-card-accent-hover: #a5b4fc;
92
+
93
+ // Borders
94
+ --osi-card-border: #334155;
95
+ --osi-card-border-hover: #475569;
96
+ --osi-card-ring: rgba(129, 140, 248, 0.4);
97
+
98
+ // Status colors
99
+ --osi-card-success: #34d399;
100
+ --osi-card-success-bg: rgba(16, 185, 129, 0.1);
101
+ --osi-card-warning: #fbbf24;
102
+ --osi-card-warning-bg: rgba(245, 158, 11, 0.1);
103
+ --osi-card-destructive: #f87171;
104
+ --osi-card-destructive-bg: rgba(239, 68, 68, 0.1);
105
+ --osi-card-info: #60a5fa;
106
+ --osi-card-info-bg: rgba(59, 130, 246, 0.1);
107
+
108
+ // Shadows
109
+ --osi-card-shadow: 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2);
110
+ --osi-card-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.15);
111
+ --osi-card-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.3), 0 4px 6px rgba(0, 0, 0, 0.15);
112
+ --osi-card-shadow-glow: 0 0 30px rgba(129, 140, 248, 0.2);
113
+ }
114
+
115
+ // ============================================
116
+ // Midnight Theme
117
+ // ============================================
118
+
119
+ [data-theme="midnight"],
120
+ .osi-cards-container[data-theme="midnight"] {
121
+ --osi-card-background: #0a0a0f;
122
+ --osi-card-foreground: #e4e4e7;
123
+ --osi-card-muted: #71717a;
124
+ --osi-card-muted-foreground: #52525b;
125
+
126
+ --osi-card-surface: #18181b;
127
+ --osi-card-surface-hover: #27272a;
128
+ --osi-card-surface-active: #3f3f46;
129
+
130
+ --osi-card-accent: #a78bfa;
131
+ --osi-card-accent-rgb: 167, 139, 250;
132
+ --osi-card-accent-foreground: #0a0a0f;
133
+ --osi-card-accent-hover: #c4b5fd;
134
+
135
+ --osi-card-border: #27272a;
136
+ --osi-card-border-hover: #3f3f46;
137
+ --osi-card-ring: rgba(167, 139, 250, 0.4);
138
+
139
+ --osi-card-shadow-glow: 0 0 40px rgba(167, 139, 250, 0.15);
140
+ }
141
+
142
+ // ============================================
143
+ // Corporate Theme
144
+ // ============================================
145
+
146
+ [data-theme="corporate"],
147
+ .osi-cards-container[data-theme="corporate"] {
148
+ --osi-card-background: #ffffff;
149
+ --osi-card-foreground: #1e3a5f;
150
+ --osi-card-muted: #5a7fa3;
151
+ --osi-card-muted-foreground: #8ba8c7;
152
+
153
+ --osi-card-surface: #f0f7ff;
154
+ --osi-card-surface-hover: #e1efff;
155
+ --osi-card-surface-active: #cfe2ff;
156
+
157
+ --osi-card-accent: #0066cc;
158
+ --osi-card-accent-rgb: 0, 102, 204;
159
+ --osi-card-accent-foreground: #ffffff;
160
+ --osi-card-accent-hover: #0052a3;
161
+
162
+ --osi-card-border: #d1e3f6;
163
+ --osi-card-border-hover: #a8cdef;
164
+
165
+ // More subdued shadows for professional look
166
+ --osi-card-shadow: 0 1px 2px rgba(30, 58, 95, 0.05);
167
+ --osi-card-shadow-md: 0 2px 4px rgba(30, 58, 95, 0.08);
168
+ --osi-card-shadow-lg: 0 4px 8px rgba(30, 58, 95, 0.1);
169
+
170
+ // Sharper corners for corporate feel
171
+ --osi-card-border-radius: 4px;
172
+ }
173
+
174
+ // ============================================
175
+ // Nature Theme
176
+ // ============================================
177
+
178
+ [data-theme="nature"],
179
+ .osi-cards-container[data-theme="nature"] {
180
+ --osi-card-background: #fefefe;
181
+ --osi-card-foreground: #1a3129;
182
+ --osi-card-muted: #5a7268;
183
+ --osi-card-muted-foreground: #8aa496;
184
+
185
+ --osi-card-surface: #f0f7f4;
186
+ --osi-card-surface-hover: #e3f0ea;
187
+ --osi-card-surface-active: #d1e6db;
188
+
189
+ --osi-card-accent: #059669;
190
+ --osi-card-accent-rgb: 5, 150, 105;
191
+ --osi-card-accent-foreground: #ffffff;
192
+ --osi-card-accent-hover: #047857;
193
+
194
+ --osi-card-border: #d1e6db;
195
+ --osi-card-border-hover: #a7d4be;
196
+ --osi-card-ring: rgba(5, 150, 105, 0.3);
197
+
198
+ --osi-card-success: #059669;
199
+ --osi-card-warning: #d97706;
200
+ --osi-card-destructive: #dc2626;
201
+ }
202
+
203
+ // ============================================
204
+ // Sunset Theme
205
+ // ============================================
206
+
207
+ [data-theme="sunset"],
208
+ .osi-cards-container[data-theme="sunset"] {
209
+ --osi-card-background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
210
+ --osi-card-foreground: #fef3c7;
211
+ --osi-card-muted: #d4a574;
212
+ --osi-card-muted-foreground: #a87c4f;
213
+
214
+ --osi-card-surface: rgba(255, 255, 255, 0.05);
215
+ --osi-card-surface-hover: rgba(255, 255, 255, 0.1);
216
+ --osi-card-surface-active: rgba(255, 255, 255, 0.15);
217
+
218
+ --osi-card-accent: #f59e0b;
219
+ --osi-card-accent-rgb: 245, 158, 11;
220
+ --osi-card-accent-foreground: #1a1a2e;
221
+ --osi-card-accent-hover: #d97706;
222
+
223
+ --osi-card-border: rgba(245, 158, 11, 0.2);
224
+ --osi-card-border-hover: rgba(245, 158, 11, 0.3);
225
+ --osi-card-ring: rgba(245, 158, 11, 0.4);
226
+
227
+ --osi-card-shadow-glow: 0 0 40px rgba(245, 158, 11, 0.2);
228
+ }
229
+
230
+ // ============================================
231
+ // Ocean Theme
232
+ // ============================================
233
+
234
+ [data-theme="ocean"],
235
+ .osi-cards-container[data-theme="ocean"] {
236
+ --osi-card-background: #0a192f;
237
+ --osi-card-foreground: #ccd6f6;
238
+ --osi-card-muted: #8892b0;
239
+ --osi-card-muted-foreground: #495670;
240
+
241
+ --osi-card-surface: #112240;
242
+ --osi-card-surface-hover: #1d3461;
243
+ --osi-card-surface-active: #233554;
244
+
245
+ --osi-card-accent: #64ffda;
246
+ --osi-card-accent-rgb: 100, 255, 218;
247
+ --osi-card-accent-foreground: #0a192f;
248
+ --osi-card-accent-hover: #4cd7b8;
249
+
250
+ --osi-card-border: #233554;
251
+ --osi-card-border-hover: #2d4a6f;
252
+ --osi-card-ring: rgba(100, 255, 218, 0.3);
253
+
254
+ --osi-card-shadow-glow: 0 0 50px rgba(100, 255, 218, 0.15);
255
+ }
256
+
257
+ // ============================================
258
+ // Rose Theme
259
+ // ============================================
260
+
261
+ [data-theme="rose"],
262
+ .osi-cards-container[data-theme="rose"] {
263
+ --osi-card-background: #fffbfc;
264
+ --osi-card-foreground: #4a1c2c;
265
+ --osi-card-muted: #9f6070;
266
+ --osi-card-muted-foreground: #c89aa6;
267
+
268
+ --osi-card-surface: #fef1f4;
269
+ --osi-card-surface-hover: #fde4ea;
270
+ --osi-card-surface-active: #fbd2dc;
271
+
272
+ --osi-card-accent: #e11d48;
273
+ --osi-card-accent-rgb: 225, 29, 72;
274
+ --osi-card-accent-foreground: #ffffff;
275
+ --osi-card-accent-hover: #be123c;
276
+
277
+ --osi-card-border: #fbd2dc;
278
+ --osi-card-border-hover: #f9a8bb;
279
+ --osi-card-ring: rgba(225, 29, 72, 0.3);
280
+ }
281
+
282
+ // ============================================
283
+ // Minimal Theme
284
+ // ============================================
285
+
286
+ [data-theme="minimal"],
287
+ .osi-cards-container[data-theme="minimal"] {
288
+ --osi-card-background: #ffffff;
289
+ --osi-card-foreground: #171717;
290
+ --osi-card-muted: #737373;
291
+ --osi-card-muted-foreground: #a3a3a3;
292
+
293
+ --osi-card-surface: #fafafa;
294
+ --osi-card-surface-hover: #f5f5f5;
295
+ --osi-card-surface-active: #e5e5e5;
296
+
297
+ --osi-card-accent: #171717;
298
+ --osi-card-accent-rgb: 23, 23, 23;
299
+ --osi-card-accent-foreground: #ffffff;
300
+ --osi-card-accent-hover: #404040;
301
+
302
+ --osi-card-border: #e5e5e5;
303
+ --osi-card-border-hover: #d4d4d4;
304
+ --osi-card-ring: rgba(23, 23, 23, 0.2);
305
+
306
+ // No shadows for minimal look
307
+ --osi-card-shadow: none;
308
+ --osi-card-shadow-md: none;
309
+ --osi-card-shadow-lg: none;
310
+ --osi-card-shadow-glow: none;
311
+
312
+ // Sharp corners
313
+ --osi-card-border-radius: 0;
314
+ }
315
+
316
+ // ============================================
317
+ // High Contrast Theme (Accessibility)
318
+ // ============================================
319
+
320
+ [data-theme="high-contrast"],
321
+ .osi-cards-container[data-theme="high-contrast"] {
322
+ --osi-card-background: #000000;
323
+ --osi-card-foreground: #ffffff;
324
+ --osi-card-muted: #ffffff;
325
+ --osi-card-muted-foreground: #d4d4d4;
326
+
327
+ --osi-card-surface: #1a1a1a;
328
+ --osi-card-surface-hover: #2d2d2d;
329
+ --osi-card-surface-active: #404040;
330
+
331
+ --osi-card-accent: #ffff00;
332
+ --osi-card-accent-rgb: 255, 255, 0;
333
+ --osi-card-accent-foreground: #000000;
334
+ --osi-card-accent-hover: #cccc00;
335
+
336
+ --osi-card-border: #ffffff;
337
+ --osi-card-border-hover: #ffffff;
338
+ --osi-card-ring: rgba(255, 255, 0, 0.5);
339
+
340
+ --osi-card-success: #00ff00;
341
+ --osi-card-warning: #ffff00;
342
+ --osi-card-destructive: #ff0000;
343
+ --osi-card-info: #00ffff;
344
+
345
+ // Strong shadows for depth perception
346
+ --osi-card-shadow: 0 0 0 2px #ffffff;
347
+ --osi-card-shadow-md: 0 0 0 3px #ffffff;
348
+ --osi-card-shadow-lg: 0 0 0 4px #ffffff;
349
+ }
350
+
351
+ // ============================================
352
+ // System Theme (Auto)
353
+ // ============================================
354
+
355
+ @media (prefers-color-scheme: dark) {
356
+ [data-theme="system"],
357
+ .osi-cards-container[data-theme="system"],
358
+ :root:not([data-theme]) {
359
+ --osi-card-background: #0f172a;
360
+ --osi-card-foreground: #f1f5f9;
361
+ --osi-card-muted: #94a3b8;
362
+ --osi-card-surface: #1e293b;
363
+ --osi-card-accent: #818cf8;
364
+ --osi-card-accent-rgb: 129, 140, 248;
365
+ --osi-card-border: #334155;
366
+ }
367
+ }
368
+
369
+ @media (prefers-color-scheme: light) {
370
+ [data-theme="system"],
371
+ .osi-cards-container[data-theme="system"],
372
+ :root:not([data-theme]) {
373
+ --osi-card-background: #ffffff;
374
+ --osi-card-foreground: #1a1a2e;
375
+ --osi-card-muted: #64748b;
376
+ --osi-card-surface: #f8fafc;
377
+ --osi-card-accent: #6366f1;
378
+ --osi-card-accent-rgb: 99, 102, 241;
379
+ --osi-card-border: #e2e8f0;
380
+ }
381
+ }
382
+
383
+ // ============================================
384
+ // Theme Transition System
385
+ // ============================================
386
+
387
+ // CSS Custom Properties for transition configuration
388
+ // Support both global and container-scoped usage
389
+ :root,
390
+ .osi-cards-container {
391
+ --osi-theme-transition-duration: 200ms;
392
+ --osi-theme-transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
393
+ }
394
+
395
+ // Properties that should transition during theme changes
396
+ $theme-transition-properties: (
397
+ background-color,
398
+ background,
399
+ border-color,
400
+ color,
401
+ fill,
402
+ stroke,
403
+ box-shadow,
404
+ opacity
405
+ );
406
+
407
+ // Properties that should NOT transition (prevent layout shift)
408
+ $theme-no-transition-properties: (
409
+ width,
410
+ height,
411
+ margin,
412
+ padding,
413
+ transform,
414
+ font-size,
415
+ line-height
416
+ );
417
+
418
+ // Transitioning class - applied during theme switch
419
+ .theme-transitioning,
420
+ [data-theme-transition="true"] {
421
+ // Apply transitions to all elements
422
+ *,
423
+ *::before,
424
+ *::after {
425
+ transition-property: #{$theme-transition-properties};
426
+ transition-duration: var(--osi-theme-transition-duration);
427
+ transition-timing-function: var(--osi-theme-transition-timing);
428
+ }
429
+
430
+ // Card-specific smoother transitions
431
+ .osi-card-container,
432
+ .ai-card-renderer,
433
+ .ai-section,
434
+ .masonry-item {
435
+ transition-duration: calc(var(--osi-theme-transition-duration) * 1.2);
436
+ }
437
+ }
438
+
439
+ // Respect reduced motion preference
440
+ @media (prefers-reduced-motion: reduce) {
441
+ .theme-transitioning,
442
+ [data-theme-transition="true"] {
443
+ *,
444
+ *::before,
445
+ *::after {
446
+ transition-duration: 0ms !important;
447
+ }
448
+ }
449
+ }
450
+
451
+ // ============================================
452
+ // Scoped Theme Container
453
+ // ============================================
454
+
455
+ .osi-scoped-theme {
456
+ // Inherit theme from data-theme attribute
457
+ // Container queries are progressive enhancement (Safari 16+)
458
+ @supports (container-type: inline-size) {
459
+ container-type: inline-size;
460
+ }
461
+
462
+ // Ensure CSS variables cascade properly
463
+ color: var(--osi-card-foreground);
464
+ background-color: var(--osi-card-background);
465
+ }
466
+
467
+ .osi-theme-container {
468
+ position: relative;
469
+ contain: layout style;
470
+ // Container queries are progressive enhancement (Safari 16+)
471
+ @supports (container-type: inline-size) {
472
+ container-type: inline-size;
473
+ }
474
+
475
+ // Reset background to theme
476
+ background-color: var(--osi-card-background);
477
+ color: var(--osi-card-foreground);
478
+ }
479
+
480
+ // ============================================
481
+ // Theme Transition Utilities
482
+ // ============================================
483
+
484
+ // Instant transition (no animation)
485
+ .theme-transition-none {
486
+ *,
487
+ *::before,
488
+ *::after {
489
+ transition: none !important;
490
+ }
491
+ }
492
+
493
+ // Fast transition
494
+ .theme-transition-fast {
495
+ --osi-theme-transition-duration: 100ms;
496
+ }
497
+
498
+ // Slow transition
499
+ .theme-transition-slow {
500
+ --osi-theme-transition-duration: 400ms;
501
+ }
502
+
503
+ // Smooth easing
504
+ .theme-transition-smooth {
505
+ --osi-theme-transition-timing: cubic-bezier(0.16, 1, 0.3, 1);
506
+ }
507
+
508
+ // ============================================
509
+ // Color Scheme Indicator
510
+ // ============================================
511
+
512
+ // Visual indicator for current theme (useful for debugging)
513
+ [data-theme]::before {
514
+ content: none; // Hidden by default
515
+ }
516
+
517
+ // Show theme indicator in debug mode
518
+ [data-osi-debug="true"][data-theme]::before {
519
+ content: attr(data-theme);
520
+ position: fixed;
521
+ bottom: 8px;
522
+ right: 8px;
523
+ padding: 4px 8px;
524
+ font-size: 10px;
525
+ font-family: monospace;
526
+ background: var(--osi-card-surface);
527
+ color: var(--osi-card-muted);
528
+ border: 1px solid var(--osi-card-border);
529
+ border-radius: 4px;
530
+ z-index: 9999;
531
+ pointer-events: none;
532
+ }
533
+
534
+ // ============================================
535
+ // Dark/Light Mode Specific Adjustments
536
+ // ============================================
537
+
538
+ // Enhanced readability for dark themes
539
+ [data-theme="dark"],
540
+ [data-theme="midnight"],
541
+ [data-theme="ocean"],
542
+ [data-theme="sunset"],
543
+ .osi-cards-container[data-theme="dark"],
544
+ .osi-cards-container[data-theme="midnight"],
545
+ .osi-cards-container[data-theme="ocean"],
546
+ .osi-cards-container[data-theme="sunset"] {
547
+ // Slightly increase font weight for better legibility on dark backgrounds
548
+ --osi-card-font-weight-normal: 400;
549
+ --osi-card-font-weight-medium: 500;
550
+
551
+ // Enhance link visibility
552
+ a:not([class]) {
553
+ color: var(--osi-card-accent);
554
+
555
+ &:hover {
556
+ color: var(--osi-card-accent-hover);
557
+ }
558
+ }
559
+ }
560
+
561
+ // Print mode - always use light theme
562
+ @media print {
563
+ [data-theme],
564
+ .osi-cards-container[data-theme] {
565
+ --osi-card-background: #ffffff !important;
566
+ --osi-card-foreground: #000000 !important;
567
+ --osi-card-muted: #666666 !important;
568
+ --osi-card-border: #cccccc !important;
569
+ --osi-card-shadow: none !important;
570
+ --osi-card-shadow-md: none !important;
571
+ --osi-card-shadow-lg: none !important;
572
+ }
573
+ }
@@ -0,0 +1,92 @@
1
+ // ============================================
2
+ // TOKENS INDEX - Single Source of Truth
3
+ // ============================================
4
+ //
5
+ // This file consolidates all design tokens for the OSI Cards library.
6
+ // Import this file to access all tokens and mixins.
7
+ //
8
+ // Usage:
9
+ // @use 'osi-cards-lib/styles/tokens' as tokens;
10
+ //
11
+ // :host {
12
+ // @include tokens.osi-tokens('integration', true);
13
+ // @include tokens.osi-theme-base('integration', true);
14
+ // }
15
+ //
16
+ // ============================================
17
+
18
+ @forward "master";
19
+
20
+ // ============================================
21
+ // ISOLATED FONT STACK
22
+ // ============================================
23
+ //
24
+ // System font stack that doesn't rely on external fonts.
25
+ // This ensures consistent typography without host app interference.
26
+ //
27
+
28
+ $osi-font-stack-system:
29
+ -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif,
30
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
31
+
32
+ $osi-font-stack-mono:
33
+ ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
34
+
35
+ // Helvetica-first stack for OSI Cards (matches existing)
36
+ $osi-font-stack-primary:
37
+ Helvetica,
38
+ -apple-system,
39
+ BlinkMacSystemFont,
40
+ "Segoe UI",
41
+ Roboto,
42
+ Arial,
43
+ sans-serif;
44
+
45
+ /// Apply isolated font stack
46
+ /// @param {Boolean} $important - Whether to use !important
47
+ @mixin osi-font-isolation($important: false) {
48
+ @if $important {
49
+ font-family: $osi-font-stack-primary !important;
50
+ -webkit-font-smoothing: antialiased !important;
51
+ -moz-osx-font-smoothing: grayscale !important;
52
+ text-rendering: optimizeLegibility !important;
53
+ font-feature-settings: "kern" 1 !important;
54
+ } @else {
55
+ font-family: $osi-font-stack-primary;
56
+ -webkit-font-smoothing: antialiased;
57
+ -moz-osx-font-smoothing: grayscale;
58
+ text-rendering: optimizeLegibility;
59
+ font-feature-settings: "kern" 1;
60
+ }
61
+ }
62
+
63
+ /// Apply isolated container styles
64
+ /// Creates a new stacking context and prevents style leakage
65
+ @mixin osi-container-isolation() {
66
+ // Create new stacking context
67
+ isolation: isolate;
68
+
69
+ // Ensure box-sizing is correct
70
+ box-sizing: border-box;
71
+
72
+ // Apply font isolation
73
+ @include osi-font-isolation(true);
74
+
75
+ // Reset inherited styles that could leak from host
76
+ font-size: var(--font-size-base, 13px);
77
+ font-weight: var(--font-weight-normal, 400);
78
+ line-height: 1.5;
79
+ text-align: left;
80
+ color: var(--foreground, #1c1c1f);
81
+
82
+ // Preserve 3D transforms for tilt effects
83
+ perspective: 1200px;
84
+ transform-style: preserve-3d;
85
+
86
+ // Apply to all children
87
+ *,
88
+ *::before,
89
+ *::after {
90
+ box-sizing: border-box;
91
+ }
92
+ }