@casoon/atlas-styles 0.0.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,622 @@
1
+ /**
2
+ * Atlas Style Recipes
3
+ *
4
+ * Reusable styling patterns for UI components.
5
+ * These recipes can be applied via classes or used in Shadow DOM
6
+ * components via :host selectors.
7
+ *
8
+ * Usage: @import "@casoon/atlas-styles/recipes";
9
+ */
10
+
11
+ /* ========================================
12
+ Focus Ring - A11y Critical
13
+ ======================================== */
14
+
15
+ .atlas-focus-ring:focus-visible,
16
+ :host(.atlas-focus-ring):focus-visible {
17
+ outline: var(--atlas-ring-width, 2px) solid hsl(var(--atlas-ring));
18
+ outline-offset: var(--atlas-ring-offset, 2px);
19
+ }
20
+
21
+ .atlas-focus-ring-inset:focus-visible {
22
+ outline: var(--atlas-ring-width, 2px) solid hsl(var(--atlas-ring));
23
+ outline-offset: calc(var(--atlas-ring-offset, 2px) * -1);
24
+ }
25
+
26
+ /* Focus within for containers */
27
+ .atlas-focus-within:focus-within {
28
+ outline: var(--atlas-ring-width, 2px) solid hsl(var(--atlas-ring));
29
+ outline-offset: var(--atlas-ring-offset, 2px);
30
+ }
31
+
32
+ /* ========================================
33
+ Interactive - Base Transitions
34
+ ======================================== */
35
+
36
+ .atlas-interactive {
37
+ cursor: pointer;
38
+ transition-property: background-color, border-color, color, box-shadow, opacity, transform;
39
+ transition-duration: var(--atlas-duration-normal, 200ms);
40
+ transition-timing-function: var(--atlas-ease-default);
41
+ }
42
+
43
+ .atlas-interactive:active:not(:disabled) {
44
+ transform: scale(0.98);
45
+ }
46
+
47
+ .atlas-interactive:disabled,
48
+ .atlas-interactive[aria-disabled='true'] {
49
+ pointer-events: none;
50
+ opacity: 0.5;
51
+ cursor: not-allowed;
52
+ }
53
+
54
+ /* ========================================
55
+ Surface Variants
56
+ ======================================== */
57
+
58
+ /* Elevated surface (cards, dropdowns) */
59
+ .atlas-surface-elevated {
60
+ background-color: hsl(var(--atlas-card));
61
+ border: 1px solid hsl(var(--atlas-border));
62
+ border-radius: var(--atlas-radius-lg);
63
+ box-shadow: var(--atlas-shadow-md);
64
+ }
65
+
66
+ /* Muted surface */
67
+ .atlas-surface-muted {
68
+ background-color: hsl(var(--atlas-muted));
69
+ color: hsl(var(--atlas-muted-foreground));
70
+ }
71
+
72
+ /* Inset surface */
73
+ .atlas-surface-inset {
74
+ background-color: hsl(var(--atlas-muted));
75
+ box-shadow: inset 0 2px 4px 0 hsl(var(--atlas-foreground) / 0.05);
76
+ }
77
+
78
+ /* ========================================
79
+ Glass Effect (Glassmorphism)
80
+ ======================================== */
81
+
82
+ .atlas-glass {
83
+ background: var(--atlas-glass-bg);
84
+ backdrop-filter: blur(var(--atlas-glass-blur));
85
+ -webkit-backdrop-filter: blur(var(--atlas-glass-blur));
86
+ border: 1px solid var(--atlas-glass-border);
87
+ box-shadow: var(--atlas-glass-shadow);
88
+ }
89
+
90
+ /* Fallback for browsers without backdrop-filter */
91
+ @supports not (backdrop-filter: blur(1px)) {
92
+ .atlas-glass {
93
+ background: hsl(var(--atlas-card) / 0.95);
94
+ }
95
+ }
96
+
97
+ /* ========================================
98
+ Button Variants
99
+ ======================================== */
100
+
101
+ .atlas-btn {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ justify-content: center;
105
+ gap: var(--atlas-space-2);
106
+ white-space: nowrap;
107
+ border-radius: var(--atlas-radius);
108
+ font-size: var(--atlas-text-sm);
109
+ font-weight: var(--atlas-font-medium);
110
+ font-family: inherit;
111
+ cursor: pointer;
112
+ border: none;
113
+ transition-property: background-color, border-color, color, box-shadow, opacity;
114
+ transition-duration: var(--atlas-duration-normal);
115
+ transition-timing-function: var(--atlas-ease-default);
116
+ }
117
+
118
+ .atlas-btn:focus-visible {
119
+ outline: var(--atlas-ring-width) solid hsl(var(--atlas-ring));
120
+ outline-offset: var(--atlas-ring-offset);
121
+ }
122
+
123
+ .atlas-btn:disabled {
124
+ pointer-events: none;
125
+ opacity: 0.5;
126
+ }
127
+
128
+ /* Button Sizes */
129
+ .atlas-btn-sm {
130
+ height: var(--atlas-button-height-sm);
131
+ padding: var(--atlas-space-2) var(--atlas-space-3);
132
+ font-size: var(--atlas-text-xs);
133
+ border-radius: var(--atlas-radius-sm);
134
+ }
135
+
136
+ .atlas-btn-md {
137
+ height: var(--atlas-button-height-md);
138
+ padding: var(--atlas-space-2) var(--atlas-space-4);
139
+ }
140
+
141
+ .atlas-btn-lg {
142
+ height: var(--atlas-button-height-lg);
143
+ padding: var(--atlas-space-2) var(--atlas-space-6);
144
+ border-radius: var(--atlas-radius-md);
145
+ }
146
+
147
+ .atlas-btn-icon {
148
+ width: var(--atlas-button-height-md);
149
+ height: var(--atlas-button-height-md);
150
+ padding: 0;
151
+ }
152
+
153
+ /* Button Colors */
154
+ .atlas-btn-primary {
155
+ background-color: hsl(var(--atlas-primary));
156
+ color: hsl(var(--atlas-primary-foreground));
157
+ }
158
+
159
+ .atlas-btn-primary:hover:not(:disabled) {
160
+ background-color: hsl(var(--atlas-primary) / 0.9);
161
+ }
162
+
163
+ .atlas-btn-secondary {
164
+ background-color: hsl(var(--atlas-secondary));
165
+ color: hsl(var(--atlas-secondary-foreground));
166
+ }
167
+
168
+ .atlas-btn-secondary:hover:not(:disabled) {
169
+ background-color: hsl(var(--atlas-secondary) / 0.8);
170
+ }
171
+
172
+ .atlas-btn-destructive {
173
+ background-color: hsl(var(--atlas-destructive));
174
+ color: hsl(var(--atlas-destructive-foreground));
175
+ }
176
+
177
+ .atlas-btn-destructive:hover:not(:disabled) {
178
+ background-color: hsl(var(--atlas-destructive) / 0.9);
179
+ }
180
+
181
+ .atlas-btn-outline {
182
+ background-color: transparent;
183
+ border: 1px solid hsl(var(--atlas-input));
184
+ color: hsl(var(--atlas-foreground));
185
+ }
186
+
187
+ .atlas-btn-outline:hover:not(:disabled) {
188
+ background-color: hsl(var(--atlas-accent));
189
+ color: hsl(var(--atlas-accent-foreground));
190
+ }
191
+
192
+ .atlas-btn-ghost {
193
+ background-color: transparent;
194
+ color: hsl(var(--atlas-foreground));
195
+ }
196
+
197
+ .atlas-btn-ghost:hover:not(:disabled) {
198
+ background-color: hsl(var(--atlas-accent));
199
+ color: hsl(var(--atlas-accent-foreground));
200
+ }
201
+
202
+ .atlas-btn-link {
203
+ background-color: transparent;
204
+ color: hsl(var(--atlas-primary));
205
+ text-decoration: underline;
206
+ text-underline-offset: 4px;
207
+ height: auto;
208
+ padding: 0;
209
+ }
210
+
211
+ .atlas-btn-link:hover:not(:disabled) {
212
+ text-decoration: none;
213
+ }
214
+
215
+ /* ========================================
216
+ Form Inputs
217
+ ======================================== */
218
+
219
+ .atlas-input {
220
+ display: flex;
221
+ width: 100%;
222
+ height: var(--atlas-input-height-md);
223
+ padding: var(--atlas-space-2) var(--atlas-space-3);
224
+ background-color: hsl(var(--atlas-background));
225
+ border: 1px solid hsl(var(--atlas-input));
226
+ border-radius: var(--atlas-radius);
227
+ font-size: var(--atlas-text-sm);
228
+ color: hsl(var(--atlas-foreground));
229
+ transition:
230
+ border-color var(--atlas-duration-fast) var(--atlas-ease-default),
231
+ box-shadow var(--atlas-duration-fast) var(--atlas-ease-default);
232
+ }
233
+
234
+ .atlas-input::placeholder {
235
+ color: hsl(var(--atlas-muted-foreground));
236
+ }
237
+
238
+ .atlas-input:focus {
239
+ outline: none;
240
+ border-color: hsl(var(--atlas-ring));
241
+ box-shadow: 0 0 0 var(--atlas-ring-width) hsl(var(--atlas-ring) / 0.2);
242
+ }
243
+
244
+ .atlas-input:disabled {
245
+ opacity: 0.5;
246
+ cursor: not-allowed;
247
+ }
248
+
249
+ .atlas-input[aria-invalid='true'] {
250
+ border-color: hsl(var(--atlas-destructive));
251
+ }
252
+
253
+ .atlas-input[aria-invalid='true']:focus {
254
+ box-shadow: 0 0 0 var(--atlas-ring-width) hsl(var(--atlas-destructive) / 0.2);
255
+ }
256
+
257
+ /* Input Sizes */
258
+ .atlas-input-sm {
259
+ height: var(--atlas-input-height-sm);
260
+ padding: var(--atlas-space-1) var(--atlas-space-2);
261
+ font-size: var(--atlas-text-xs);
262
+ }
263
+
264
+ .atlas-input-lg {
265
+ height: var(--atlas-input-height-lg);
266
+ padding: var(--atlas-space-3) var(--atlas-space-4);
267
+ font-size: var(--atlas-text-base);
268
+ }
269
+
270
+ /* ========================================
271
+ Checkbox & Radio
272
+ ======================================== */
273
+
274
+ .atlas-check {
275
+ appearance: none;
276
+ width: 1rem;
277
+ height: 1rem;
278
+ border: 1px solid hsl(var(--atlas-input));
279
+ border-radius: var(--atlas-radius-sm);
280
+ background-color: hsl(var(--atlas-background));
281
+ cursor: pointer;
282
+ transition:
283
+ background-color var(--atlas-duration-fast),
284
+ border-color var(--atlas-duration-fast);
285
+ }
286
+
287
+ .atlas-check:checked {
288
+ background-color: hsl(var(--atlas-primary));
289
+ border-color: hsl(var(--atlas-primary));
290
+ }
291
+
292
+ .atlas-check:focus-visible {
293
+ outline: var(--atlas-ring-width) solid hsl(var(--atlas-ring));
294
+ outline-offset: var(--atlas-ring-offset);
295
+ }
296
+
297
+ .atlas-check:disabled {
298
+ opacity: 0.5;
299
+ cursor: not-allowed;
300
+ }
301
+
302
+ .atlas-radio {
303
+ border-radius: var(--atlas-radius-full);
304
+ }
305
+
306
+ /* ========================================
307
+ Switch/Toggle
308
+ ======================================== */
309
+
310
+ .atlas-switch {
311
+ position: relative;
312
+ display: inline-flex;
313
+ width: 2.75rem;
314
+ height: 1.5rem;
315
+ padding: 0.125rem;
316
+ background-color: hsl(var(--atlas-input));
317
+ border-radius: var(--atlas-radius-full);
318
+ cursor: pointer;
319
+ transition: background-color var(--atlas-duration-fast);
320
+ }
321
+
322
+ .atlas-switch[aria-checked='true'] {
323
+ background-color: hsl(var(--atlas-primary));
324
+ }
325
+
326
+ .atlas-switch-thumb {
327
+ width: 1.25rem;
328
+ height: 1.25rem;
329
+ background-color: hsl(var(--atlas-background));
330
+ border-radius: var(--atlas-radius-full);
331
+ box-shadow: var(--atlas-shadow-sm);
332
+ transition: transform var(--atlas-duration-fast) var(--atlas-ease-default);
333
+ }
334
+
335
+ .atlas-switch[aria-checked='true'] .atlas-switch-thumb {
336
+ transform: translateX(1.25rem);
337
+ }
338
+
339
+ /* ========================================
340
+ Badges
341
+ ======================================== */
342
+
343
+ .atlas-badge {
344
+ display: inline-flex;
345
+ align-items: center;
346
+ padding: var(--atlas-space-0-5) var(--atlas-space-2);
347
+ border-radius: var(--atlas-radius-full);
348
+ font-size: var(--atlas-text-xs);
349
+ font-weight: var(--atlas-font-medium);
350
+ line-height: 1;
351
+ }
352
+
353
+ .atlas-badge-default {
354
+ background-color: hsl(var(--atlas-secondary));
355
+ color: hsl(var(--atlas-secondary-foreground));
356
+ }
357
+
358
+ .atlas-badge-primary {
359
+ background-color: hsl(var(--atlas-primary));
360
+ color: hsl(var(--atlas-primary-foreground));
361
+ }
362
+
363
+ .atlas-badge-destructive {
364
+ background-color: hsl(var(--atlas-destructive));
365
+ color: hsl(var(--atlas-destructive-foreground));
366
+ }
367
+
368
+ .atlas-badge-outline {
369
+ background-color: transparent;
370
+ border: 1px solid hsl(var(--atlas-border));
371
+ color: hsl(var(--atlas-foreground));
372
+ }
373
+
374
+ .atlas-badge-success {
375
+ background-color: hsl(var(--atlas-success));
376
+ color: hsl(var(--atlas-success-foreground));
377
+ }
378
+
379
+ .atlas-badge-warning {
380
+ background-color: hsl(var(--atlas-warning));
381
+ color: hsl(var(--atlas-warning-foreground));
382
+ }
383
+
384
+ /* ========================================
385
+ Cards
386
+ ======================================== */
387
+
388
+ .atlas-card {
389
+ background-color: hsl(var(--atlas-card));
390
+ border: 1px solid hsl(var(--atlas-border));
391
+ border-radius: var(--atlas-radius-lg);
392
+ box-shadow: var(--atlas-shadow-sm);
393
+ }
394
+
395
+ .atlas-card-header {
396
+ display: flex;
397
+ flex-direction: column;
398
+ gap: var(--atlas-space-1-5);
399
+ padding: var(--atlas-space-6);
400
+ padding-bottom: 0;
401
+ }
402
+
403
+ .atlas-card-title {
404
+ font-size: var(--atlas-text-lg);
405
+ font-weight: var(--atlas-font-semibold);
406
+ line-height: var(--atlas-leading-tight);
407
+ letter-spacing: -0.025em;
408
+ }
409
+
410
+ .atlas-card-description {
411
+ font-size: var(--atlas-text-sm);
412
+ color: hsl(var(--atlas-muted-foreground));
413
+ }
414
+
415
+ .atlas-card-content {
416
+ padding: var(--atlas-space-6);
417
+ }
418
+
419
+ .atlas-card-footer {
420
+ display: flex;
421
+ align-items: center;
422
+ gap: var(--atlas-space-2);
423
+ padding: var(--atlas-space-6);
424
+ padding-top: 0;
425
+ }
426
+
427
+ /* ========================================
428
+ Overlays (Dialog, Popover, Tooltip)
429
+ ======================================== */
430
+
431
+ .atlas-overlay-backdrop {
432
+ position: fixed;
433
+ inset: 0;
434
+ background-color: hsl(var(--atlas-foreground) / 0.8);
435
+ z-index: var(--atlas-z-modal);
436
+ }
437
+
438
+ .atlas-overlay-content {
439
+ position: fixed;
440
+ background-color: hsl(var(--atlas-popover));
441
+ border: 1px solid hsl(var(--atlas-border));
442
+ border-radius: var(--atlas-radius-lg);
443
+ box-shadow: var(--atlas-shadow-xl);
444
+ z-index: var(--atlas-z-modal);
445
+ }
446
+
447
+ .atlas-tooltip-content {
448
+ padding: var(--atlas-space-2) var(--atlas-space-3);
449
+ background-color: hsl(var(--atlas-foreground));
450
+ color: hsl(var(--atlas-background));
451
+ border-radius: var(--atlas-radius);
452
+ font-size: var(--atlas-text-sm);
453
+ z-index: var(--atlas-z-tooltip);
454
+ }
455
+
456
+ /* ========================================
457
+ Avatar
458
+ ======================================== */
459
+
460
+ .atlas-avatar {
461
+ position: relative;
462
+ display: flex;
463
+ align-items: center;
464
+ justify-content: center;
465
+ overflow: hidden;
466
+ width: var(--atlas-avatar-size-md);
467
+ height: var(--atlas-avatar-size-md);
468
+ border-radius: var(--atlas-radius-full);
469
+ background-color: hsl(var(--atlas-muted));
470
+ }
471
+
472
+ .atlas-avatar img {
473
+ width: 100%;
474
+ height: 100%;
475
+ object-fit: cover;
476
+ }
477
+
478
+ .atlas-avatar-fallback {
479
+ display: flex;
480
+ align-items: center;
481
+ justify-content: center;
482
+ width: 100%;
483
+ height: 100%;
484
+ font-size: var(--atlas-text-sm);
485
+ font-weight: var(--atlas-font-medium);
486
+ color: hsl(var(--atlas-muted-foreground));
487
+ }
488
+
489
+ /* Avatar sizes */
490
+ .atlas-avatar-sm {
491
+ width: var(--atlas-avatar-size-sm);
492
+ height: var(--atlas-avatar-size-sm);
493
+ }
494
+
495
+ .atlas-avatar-lg {
496
+ width: var(--atlas-avatar-size-lg);
497
+ height: var(--atlas-avatar-size-lg);
498
+ }
499
+
500
+ .atlas-avatar-xl {
501
+ width: var(--atlas-avatar-size-xl);
502
+ height: var(--atlas-avatar-size-xl);
503
+ }
504
+
505
+ /* ========================================
506
+ Progress
507
+ ======================================== */
508
+
509
+ .atlas-progress {
510
+ position: relative;
511
+ width: 100%;
512
+ height: 0.5rem;
513
+ overflow: hidden;
514
+ background-color: hsl(var(--atlas-secondary));
515
+ border-radius: var(--atlas-radius-full);
516
+ }
517
+
518
+ .atlas-progress-indicator {
519
+ height: 100%;
520
+ background-color: hsl(var(--atlas-primary));
521
+ border-radius: var(--atlas-radius-full);
522
+ transition: width var(--atlas-duration-slow) var(--atlas-ease-out);
523
+ }
524
+
525
+ /* ========================================
526
+ Separator
527
+ ======================================== */
528
+
529
+ .atlas-separator {
530
+ background-color: hsl(var(--atlas-border));
531
+ }
532
+
533
+ .atlas-separator-horizontal {
534
+ height: 1px;
535
+ width: 100%;
536
+ }
537
+
538
+ .atlas-separator-vertical {
539
+ width: 1px;
540
+ height: 100%;
541
+ }
542
+
543
+ /* ========================================
544
+ Skeleton Loading
545
+ ======================================== */
546
+
547
+ .atlas-skeleton {
548
+ background-color: hsl(var(--atlas-muted));
549
+ border-radius: var(--atlas-radius);
550
+ animation: atlas-skeleton-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
551
+ }
552
+
553
+ @keyframes atlas-skeleton-pulse {
554
+ 0%,
555
+ 100% {
556
+ opacity: 1;
557
+ }
558
+ 50% {
559
+ opacity: 0.5;
560
+ }
561
+ }
562
+
563
+ /* ========================================
564
+ Scroll Area
565
+ ======================================== */
566
+
567
+ .atlas-scrollbar::-webkit-scrollbar {
568
+ width: 8px;
569
+ height: 8px;
570
+ }
571
+
572
+ .atlas-scrollbar::-webkit-scrollbar-track {
573
+ background: transparent;
574
+ }
575
+
576
+ .atlas-scrollbar::-webkit-scrollbar-thumb {
577
+ background-color: hsl(var(--atlas-muted-foreground) / 0.3);
578
+ border-radius: var(--atlas-radius-full);
579
+ }
580
+
581
+ .atlas-scrollbar::-webkit-scrollbar-thumb:hover {
582
+ background-color: hsl(var(--atlas-muted-foreground) / 0.5);
583
+ }
584
+
585
+ /* ========================================
586
+ Accessibility Helpers
587
+ ======================================== */
588
+
589
+ .atlas-sr-only {
590
+ position: absolute;
591
+ width: 1px;
592
+ height: 1px;
593
+ padding: 0;
594
+ margin: -1px;
595
+ overflow: hidden;
596
+ clip: rect(0, 0, 0, 0);
597
+ white-space: nowrap;
598
+ border: 0;
599
+ }
600
+
601
+ .atlas-not-sr-only {
602
+ position: static;
603
+ width: auto;
604
+ height: auto;
605
+ padding: 0;
606
+ margin: 0;
607
+ overflow: visible;
608
+ clip: auto;
609
+ white-space: normal;
610
+ }
611
+
612
+ /* ========================================
613
+ Disabled State
614
+ ======================================== */
615
+
616
+ .atlas-disabled,
617
+ [disabled],
618
+ [aria-disabled='true'] {
619
+ opacity: 0.5;
620
+ pointer-events: none;
621
+ cursor: not-allowed;
622
+ }