zenkit-css 1.2.2 → 1.2.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zenkit-css",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
4
4
  "description": "A minimal, modern CSS framework for peaceful development",
5
5
  "main": "dist/zenkit.css",
6
6
  "scripts": {
@@ -263,3 +263,370 @@
263
263
  gap: 1.5rem;
264
264
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
265
265
  }
266
+
267
+ // ----------------------------------------
268
+ // Card Variants - Outlined, Filled, Elevated
269
+ // ----------------------------------------
270
+ .card-outlined {
271
+ background-color: transparent;
272
+ border: 2px solid var(--border);
273
+ box-shadow: none;
274
+
275
+ .card-header,
276
+ .card-footer {
277
+ background-color: transparent;
278
+ border-color: var(--border);
279
+ }
280
+ }
281
+
282
+ .card-filled {
283
+ background-color: var(--bg-muted);
284
+ border: none;
285
+ box-shadow: none;
286
+
287
+ .card-header,
288
+ .card-footer {
289
+ background-color: rgba(0, 0, 0, 0.03);
290
+ border-color: rgba(0, 0, 0, 0.05);
291
+ }
292
+ }
293
+
294
+ .card-elevated {
295
+ background-color: var(--bg-card);
296
+ border: none;
297
+ box-shadow: var(--shadow-md);
298
+
299
+ .card-header,
300
+ .card-footer {
301
+ background-color: transparent;
302
+ border-color: var(--border);
303
+ }
304
+
305
+ &:hover {
306
+ box-shadow: var(--shadow-lg);
307
+ }
308
+ }
309
+
310
+ .card-elevated-lg {
311
+ box-shadow: var(--shadow-lg);
312
+
313
+ &:hover {
314
+ box-shadow: var(--shadow-xl);
315
+ }
316
+ }
317
+
318
+ // ----------------------------------------
319
+ // Card Actions
320
+ // ----------------------------------------
321
+ .card-actions {
322
+ display: flex;
323
+ align-items: center;
324
+ justify-content: flex-end;
325
+ gap: 0.75rem;
326
+ padding: 0.75rem 1.25rem;
327
+ border-top: $border-width solid var(--border);
328
+ background-color: transparent;
329
+
330
+ .btn {
331
+ margin: 0;
332
+ }
333
+ }
334
+
335
+ .card-actions-start {
336
+ justify-content: flex-start;
337
+ }
338
+
339
+ .card-actions-center {
340
+ justify-content: center;
341
+ }
342
+
343
+ .card-actions-between {
344
+ justify-content: space-between;
345
+ }
346
+
347
+ .card-actions-stacked {
348
+ flex-direction: column;
349
+ align-items: stretch;
350
+
351
+ .btn {
352
+ width: 100%;
353
+ }
354
+ }
355
+
356
+ // ----------------------------------------
357
+ // Card with Borderless Header/Footer
358
+ // ----------------------------------------
359
+ .card-borderless {
360
+ .card-header {
361
+ border-bottom: none;
362
+ background-color: transparent;
363
+ }
364
+
365
+ .card-footer {
366
+ border-top: none;
367
+ background-color: transparent;
368
+ }
369
+ }
370
+
371
+ // ----------------------------------------
372
+ // Card Ghost (No background)
373
+ // ----------------------------------------
374
+ .card-ghost {
375
+ background-color: transparent;
376
+ border: none;
377
+ box-shadow: none;
378
+
379
+ .card-header,
380
+ .card-footer {
381
+ background-color: transparent;
382
+ border-color: var(--border);
383
+ }
384
+ }
385
+
386
+ // ----------------------------------------
387
+ // Card Interactive States
388
+ // ----------------------------------------
389
+ .card-selectable {
390
+ cursor: pointer;
391
+ transition: border-color $transition-fast ease-in-out,
392
+ box-shadow $transition-fast ease-in-out;
393
+
394
+ &:hover {
395
+ border-color: var(--primary-300);
396
+ }
397
+
398
+ &.is-selected {
399
+ border-color: var(--primary);
400
+ box-shadow: 0 0 0 2px rgba($primary, 0.15);
401
+ }
402
+ }
403
+
404
+ .card-focusable {
405
+ &:focus {
406
+ outline: none;
407
+ border-color: var(--primary);
408
+ box-shadow: 0 0 0 3px rgba($primary, 0.15);
409
+ }
410
+
411
+ &:focus-visible {
412
+ outline: none;
413
+ border-color: var(--primary);
414
+ box-shadow: 0 0 0 3px rgba($primary, 0.15);
415
+ }
416
+ }
417
+
418
+ // ----------------------------------------
419
+ // Card with Badge/Ribbon
420
+ // ----------------------------------------
421
+ .card-badge {
422
+ position: absolute;
423
+ top: 0.75rem;
424
+ right: 0.75rem;
425
+ z-index: 1;
426
+ }
427
+
428
+ .card-ribbon {
429
+ position: absolute;
430
+ top: 0;
431
+ right: 0;
432
+ padding: 0.25rem 0.75rem;
433
+ font-size: var(--text-xs);
434
+ font-weight: $font-weight-semibold;
435
+ color: var(--white);
436
+ background-color: var(--primary);
437
+ border-radius: 0 calc(var(--radius-lg) - 1px) 0 var(--radius);
438
+ }
439
+
440
+ .card-ribbon-success {
441
+ background-color: var(--success);
442
+ }
443
+
444
+ .card-ribbon-danger {
445
+ background-color: var(--danger);
446
+ }
447
+
448
+ .card-ribbon-warning {
449
+ background-color: var(--warning);
450
+ color: var(--gray-900);
451
+ }
452
+
453
+ // ----------------------------------------
454
+ // Card Loading State
455
+ // ----------------------------------------
456
+ .card-loading {
457
+ position: relative;
458
+ pointer-events: none;
459
+
460
+ &::after {
461
+ content: "";
462
+ position: absolute;
463
+ inset: 0;
464
+ background-color: rgba(255, 255, 255, 0.7);
465
+ display: flex;
466
+ align-items: center;
467
+ justify-content: center;
468
+ border-radius: inherit;
469
+ z-index: 10;
470
+ }
471
+
472
+ .card-loading-spinner {
473
+ position: absolute;
474
+ top: 50%;
475
+ left: 50%;
476
+ transform: translate(-50%, -50%);
477
+ z-index: 11;
478
+ width: 2rem;
479
+ height: 2rem;
480
+ border: 2px solid var(--border);
481
+ border-top-color: var(--primary);
482
+ border-radius: 50%;
483
+ animation: card-spin 0.6s linear infinite;
484
+ }
485
+ }
486
+
487
+ @keyframes card-spin {
488
+ to {
489
+ transform: translate(-50%, -50%) rotate(360deg);
490
+ }
491
+ }
492
+
493
+ // ----------------------------------------
494
+ // Card Expandable
495
+ // ----------------------------------------
496
+ .card-expandable {
497
+ .card-expand-btn {
498
+ display: flex;
499
+ align-items: center;
500
+ gap: 0.5rem;
501
+ width: 100%;
502
+ padding: 0.75rem 1.25rem;
503
+ font-size: var(--text-sm);
504
+ color: var(--text-muted);
505
+ background: transparent;
506
+ border: none;
507
+ border-top: $border-width solid var(--border);
508
+ cursor: pointer;
509
+ transition: color $transition-fast ease-in-out;
510
+
511
+ &:hover {
512
+ color: var(--text);
513
+ }
514
+
515
+ svg {
516
+ width: 1rem;
517
+ height: 1rem;
518
+ transition: transform $transition-fast ease-in-out;
519
+ }
520
+ }
521
+
522
+ &.is-expanded .card-expand-btn svg {
523
+ transform: rotate(180deg);
524
+ }
525
+
526
+ .card-expand-content {
527
+ max-height: 0;
528
+ overflow: hidden;
529
+ transition: max-height $transition-base ease-in-out;
530
+ }
531
+
532
+ &.is-expanded .card-expand-content {
533
+ max-height: 1000px;
534
+ }
535
+ }
536
+
537
+ // ----------------------------------------
538
+ // Card Media (Full-width sections)
539
+ // ----------------------------------------
540
+ .card-media {
541
+ position: relative;
542
+ overflow: hidden;
543
+
544
+ img,
545
+ video {
546
+ width: 100%;
547
+ height: 100%;
548
+ object-fit: cover;
549
+ }
550
+ }
551
+
552
+ .card-media-top {
553
+ border-radius: calc(var(--radius-lg) - 1px) calc(var(--radius-lg) - 1px) 0 0;
554
+ }
555
+
556
+ .card-media-bottom {
557
+ border-radius: 0 0 calc(var(--radius-lg) - 1px) calc(var(--radius-lg) - 1px);
558
+ }
559
+
560
+ // ----------------------------------------
561
+ // Card Compact
562
+ // ----------------------------------------
563
+ .card-compact {
564
+ .card-header,
565
+ .card-footer {
566
+ padding: 0.5rem 0.75rem;
567
+ }
568
+
569
+ .card-body {
570
+ padding: 0.75rem;
571
+ }
572
+
573
+ .card-actions {
574
+ padding: 0.5rem 0.75rem;
575
+ }
576
+ }
577
+
578
+ // ----------------------------------------
579
+ // Card Link (Entire card is clickable)
580
+ // ----------------------------------------
581
+ .card-link {
582
+ text-decoration: none;
583
+ color: inherit;
584
+ display: block;
585
+
586
+ &:hover {
587
+ text-decoration: none;
588
+ color: inherit;
589
+ }
590
+ }
591
+
592
+ // ----------------------------------------
593
+ // Dark Mode Enhancements
594
+ // ----------------------------------------
595
+ [data-theme="dark"] {
596
+ .card-outlined {
597
+ border-color: var(--gray-700);
598
+
599
+ .card-header,
600
+ .card-footer {
601
+ border-color: var(--gray-700);
602
+ }
603
+ }
604
+
605
+ .card-filled {
606
+ background-color: var(--gray-800);
607
+
608
+ .card-header,
609
+ .card-footer {
610
+ background-color: rgba(0, 0, 0, 0.2);
611
+ border-color: var(--gray-700);
612
+ }
613
+ }
614
+
615
+ .card-elevated {
616
+ background-color: var(--gray-800);
617
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
618
+
619
+ &:hover {
620
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.4);
621
+ }
622
+ }
623
+
624
+ .card-loading::after {
625
+ background-color: rgba(0, 0, 0, 0.7);
626
+ }
627
+
628
+ .card-loading .card-loading-spinner {
629
+ border-color: var(--gray-600);
630
+ border-top-color: var(--primary);
631
+ }
632
+ }