brainzlab-ui 0.1.0 → 0.1.1

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.
@@ -15,7 +15,7 @@
15
15
  color: white;
16
16
  font-weight: 500;
17
17
  border-radius: 9999px;
18
- transition: all 0.2s var(--ease-out-expo);
18
+ transition: all var(--duration-normal) var(--ease-out-expo);
19
19
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
20
20
  }
21
21
 
@@ -39,7 +39,7 @@
39
39
  font-weight: 500;
40
40
  border: 1px solid var(--color-cream-300);
41
41
  border-radius: 9999px;
42
- transition: all 0.2s var(--ease-out-expo);
42
+ transition: all var(--duration-normal) var(--ease-out-expo);
43
43
  }
44
44
 
45
45
  .btn-secondary:hover {
@@ -58,7 +58,7 @@
58
58
  color: var(--color-ink-600);
59
59
  font-weight: 500;
60
60
  border-radius: 0.75rem;
61
- transition: all 0.15s ease;
61
+ transition: all var(--duration-fast) var(--ease-out);
62
62
  }
63
63
 
64
64
  .btn-ghost:hover {
@@ -76,7 +76,7 @@
76
76
  color: white;
77
77
  font-weight: 500;
78
78
  border-radius: 9999px;
79
- transition: all 0.2s var(--ease-out-expo);
79
+ transition: all var(--duration-normal) var(--ease-out-expo);
80
80
  }
81
81
 
82
82
  .btn-danger:hover {
@@ -85,7 +85,7 @@
85
85
  }
86
86
 
87
87
  .btn-lift {
88
- transition: transform 0.2s var(--ease-out-back), box-shadow 0.2s ease;
88
+ transition: transform var(--duration-normal) var(--ease-out-back), box-shadow var(--duration-normal) var(--ease-out);
89
89
  }
90
90
 
91
91
  .btn-lift:hover {
@@ -107,7 +107,7 @@
107
107
  border: 1px solid var(--color-cream-200);
108
108
  border-radius: 1rem;
109
109
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
110
- transition: all 0.3s var(--ease-out-expo);
110
+ transition: all var(--duration-slow) var(--ease-out-expo);
111
111
  }
112
112
 
113
113
  .card:hover {
@@ -118,7 +118,7 @@
118
118
  .card-interactive:hover { transform: translateY(-2px); }
119
119
 
120
120
  .card-lift {
121
- transition: transform 0.3s var(--ease-out-expo), box-shadow 0.3s ease;
121
+ transition: transform var(--duration-slow) var(--ease-out-expo), box-shadow var(--duration-slow) var(--ease-out);
122
122
  }
123
123
 
124
124
  .card-lift:hover {
@@ -141,7 +141,7 @@
141
141
  border-radius: 0.75rem;
142
142
  color: var(--color-ink-900);
143
143
  font-size: 0.9375rem;
144
- transition: all 0.2s ease;
144
+ transition: all var(--duration-normal) var(--ease-out);
145
145
  }
146
146
 
147
147
  .input::placeholder { color: var(--color-ink-400); }
@@ -207,7 +207,7 @@
207
207
  background-position: right 0.75rem center;
208
208
  background-repeat: no-repeat;
209
209
  background-size: 1.25rem;
210
- transition: all 0.2s ease;
210
+ transition: all var(--duration-normal) var(--ease-out);
211
211
  }
212
212
 
213
213
  .select:focus {
@@ -227,7 +227,7 @@
227
227
  font-size: 0.9375rem;
228
228
  min-height: 100px;
229
229
  resize: vertical;
230
- transition: all 0.2s ease;
230
+ transition: all var(--duration-normal) var(--ease-out);
231
231
  }
232
232
 
233
233
  .textarea:focus {
@@ -292,7 +292,7 @@
292
292
  font-weight: 500;
293
293
  color: var(--color-ink-600);
294
294
  border-radius: 0.75rem;
295
- transition: all 0.15s ease;
295
+ transition: all var(--duration-fast) var(--ease-out);
296
296
  }
297
297
 
298
298
  .nav-item:hover {
@@ -494,3 +494,496 @@
494
494
  height: 1px;
495
495
  background: var(--color-cream-200);
496
496
  }
497
+
498
+ /* ----------------------------------------
499
+ ACCESSIBILITY - FOCUS STATES
500
+ ---------------------------------------- */
501
+
502
+ /* Button focus states */
503
+ .btn-primary:focus-visible,
504
+ .btn-secondary:focus-visible,
505
+ .btn-ghost:focus-visible,
506
+ .btn-danger:focus-visible {
507
+ outline: 2px solid var(--color-primary-500);
508
+ outline-offset: 2px;
509
+ }
510
+
511
+ .btn-secondary:focus-visible {
512
+ outline-color: var(--color-ink-700);
513
+ }
514
+
515
+ .btn-danger:focus-visible {
516
+ outline-color: var(--color-error-500);
517
+ }
518
+
519
+ /* Link focus states */
520
+ a:focus-visible {
521
+ outline: 2px solid var(--color-primary-500);
522
+ outline-offset: 2px;
523
+ border-radius: 2px;
524
+ }
525
+
526
+ /* Nav item focus */
527
+ .nav-item:focus-visible {
528
+ outline: 2px solid var(--color-primary-500);
529
+ outline-offset: -2px;
530
+ }
531
+
532
+ /* Card focus states (for interactive/clickable cards) */
533
+ .card:focus-visible,
534
+ .card-interactive:focus-visible,
535
+ .card-lift:focus-visible {
536
+ outline: 2px solid var(--color-primary-500);
537
+ outline-offset: 2px;
538
+ }
539
+
540
+ /* Badge focus states (for interactive badges) */
541
+ .badge:focus-visible {
542
+ outline: 2px solid var(--color-primary-500);
543
+ outline-offset: 2px;
544
+ }
545
+
546
+ /* Avatar focus states (for clickable avatars) */
547
+ .avatar:focus-visible {
548
+ outline: 2px solid var(--color-primary-500);
549
+ outline-offset: 2px;
550
+ }
551
+
552
+ /* Table row focus states */
553
+ .table tbody tr:focus-visible {
554
+ outline: 2px solid var(--color-primary-500);
555
+ outline-offset: -2px;
556
+ }
557
+
558
+ /* Stat card focus states */
559
+ .stat-card:focus-visible {
560
+ outline: 2px solid var(--color-primary-500);
561
+ outline-offset: 2px;
562
+ }
563
+
564
+ /* Checkbox focus states */
565
+ input[type="checkbox"]:focus-visible,
566
+ input[type="radio"]:focus-visible {
567
+ outline: 2px solid var(--color-primary-500);
568
+ outline-offset: 2px;
569
+ }
570
+
571
+ /* Skip link for keyboard navigation */
572
+ .skip-link {
573
+ position: absolute;
574
+ top: -40px;
575
+ left: 0;
576
+ background: var(--color-primary-500);
577
+ color: white;
578
+ padding: 0.5rem 1rem;
579
+ z-index: 100;
580
+ text-decoration: none;
581
+ font-weight: 500;
582
+ border-radius: 0 0 0.5rem 0;
583
+ transition: top var(--duration-normal) var(--ease-out);
584
+ }
585
+
586
+ .skip-link:focus {
587
+ top: 0;
588
+ }
589
+
590
+ /* ----------------------------------------
591
+ SKELETONS / LOADING STATES
592
+ ---------------------------------------- */
593
+ .skeleton {
594
+ background: linear-gradient(
595
+ 90deg,
596
+ var(--color-cream-200) 0%,
597
+ var(--color-cream-100) 50%,
598
+ var(--color-cream-200) 100%
599
+ );
600
+ background-size: 200% 100%;
601
+ animation: shimmer 1.5s ease-in-out infinite;
602
+ border-radius: var(--radius-md);
603
+ }
604
+
605
+ .skeleton-text {
606
+ height: 1em;
607
+ margin-bottom: 0.5em;
608
+ border-radius: var(--radius-sm);
609
+ }
610
+
611
+ .skeleton-text:last-child {
612
+ width: 80%;
613
+ }
614
+
615
+ .skeleton-avatar {
616
+ width: 2.5rem;
617
+ height: 2.5rem;
618
+ border-radius: 50%;
619
+ }
620
+
621
+ .skeleton-card {
622
+ height: 200px;
623
+ border-radius: var(--radius-lg);
624
+ }
625
+
626
+ .skeleton-button {
627
+ height: 2.5rem;
628
+ width: 100px;
629
+ border-radius: 9999px;
630
+ }
631
+
632
+ /* Dark mode skeleton */
633
+ .dark .skeleton {
634
+ background: linear-gradient(
635
+ 90deg,
636
+ var(--color-dark-surface) 0%,
637
+ var(--color-dark-surface-light) 50%,
638
+ var(--color-dark-surface) 100%
639
+ );
640
+ background-size: 200% 100%;
641
+ }
642
+
643
+ /* Pulse loading indicator */
644
+ .loading-pulse {
645
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
646
+ }
647
+
648
+ /* Spinner */
649
+ .spinner {
650
+ width: 1.5rem;
651
+ height: 1.5rem;
652
+ border: 2px solid var(--color-cream-300);
653
+ border-top-color: var(--color-primary-500);
654
+ border-radius: 50%;
655
+ animation: spin 0.8s linear infinite;
656
+ }
657
+
658
+ .spinner-sm { width: 1rem; height: 1rem; }
659
+ .spinner-lg { width: 2rem; height: 2rem; }
660
+
661
+ .dark .spinner {
662
+ border-color: var(--color-dark-border);
663
+ border-top-color: var(--color-primary-400);
664
+ }
665
+
666
+ /* ============================================
667
+ DARK MODE VARIANTS
668
+ ============================================
669
+ Activated via .dark class on html/body element
670
+ Follows the landing page's dark mode approach
671
+ */
672
+
673
+ /* ----------------------------------------
674
+ DARK MODE - BUTTONS
675
+ ---------------------------------------- */
676
+ .dark .btn-primary {
677
+ background: var(--color-cream-200);
678
+ color: var(--color-ink-950);
679
+ }
680
+
681
+ .dark .btn-primary:hover {
682
+ background: var(--color-cream-100);
683
+ box-shadow: 0 4px 12px rgba(232, 225, 215, 0.2);
684
+ }
685
+
686
+ .dark .btn-secondary {
687
+ background: transparent;
688
+ color: var(--color-dark-text);
689
+ border-color: var(--color-dark-border);
690
+ }
691
+
692
+ .dark .btn-secondary:hover {
693
+ background: var(--color-dark-surface-light);
694
+ border-color: var(--color-dark-text-muted);
695
+ color: var(--color-dark-text);
696
+ }
697
+
698
+ .dark .btn-ghost {
699
+ color: var(--color-dark-text-muted);
700
+ }
701
+
702
+ .dark .btn-ghost:hover {
703
+ background: var(--color-dark-surface-light);
704
+ color: var(--color-dark-text);
705
+ }
706
+
707
+ .dark .btn-danger {
708
+ background: var(--color-error-600);
709
+ }
710
+
711
+ .dark .btn-danger:hover {
712
+ background: var(--color-error-500);
713
+ }
714
+
715
+ /* ----------------------------------------
716
+ DARK MODE - CARDS
717
+ ---------------------------------------- */
718
+ .dark .card {
719
+ background: var(--color-dark-surface);
720
+ border-color: var(--color-dark-border);
721
+ box-shadow: var(--shadow-dark-soft);
722
+ }
723
+
724
+ .dark .card:hover {
725
+ border-color: var(--color-dark-text-muted);
726
+ box-shadow: var(--shadow-dark-medium);
727
+ }
728
+
729
+ .dark .card-header {
730
+ border-bottom-color: var(--color-dark-border);
731
+ }
732
+
733
+ .dark .card-footer {
734
+ border-top-color: var(--color-dark-border);
735
+ }
736
+
737
+ .dark .card-lift:hover {
738
+ box-shadow: var(--shadow-dark-large);
739
+ }
740
+
741
+ /* ----------------------------------------
742
+ DARK MODE - FORM ELEMENTS
743
+ ---------------------------------------- */
744
+ .dark .input {
745
+ background: var(--color-dark-surface-light);
746
+ border-color: var(--color-dark-border);
747
+ color: var(--color-dark-text);
748
+ }
749
+
750
+ .dark .input::placeholder {
751
+ color: var(--color-dark-text-muted);
752
+ }
753
+
754
+ .dark .input:focus {
755
+ background: var(--color-dark-surface);
756
+ border-color: var(--color-primary-400);
757
+ box-shadow: 0 0 0 3px rgba(199, 123, 88, 0.2);
758
+ }
759
+
760
+ .dark .input:disabled {
761
+ background: var(--color-dark-bg);
762
+ color: var(--color-dark-text-muted);
763
+ }
764
+
765
+ .dark .label {
766
+ color: var(--color-dark-text);
767
+ }
768
+
769
+ .dark .select {
770
+ background-color: var(--color-dark-surface-light);
771
+ border-color: var(--color-dark-border);
772
+ color: var(--color-dark-text);
773
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23a0a0a0' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
774
+ }
775
+
776
+ .dark .select:focus {
777
+ background-color: var(--color-dark-surface);
778
+ border-color: var(--color-primary-400);
779
+ box-shadow: 0 0 0 3px rgba(199, 123, 88, 0.2);
780
+ }
781
+
782
+ .dark .textarea {
783
+ background: var(--color-dark-surface-light);
784
+ border-color: var(--color-dark-border);
785
+ color: var(--color-dark-text);
786
+ }
787
+
788
+ .dark .textarea:focus {
789
+ background: var(--color-dark-surface);
790
+ border-color: var(--color-primary-400);
791
+ box-shadow: 0 0 0 3px rgba(199, 123, 88, 0.2);
792
+ }
793
+
794
+ .dark .search-input-wrapper .search-icon {
795
+ color: var(--color-dark-text-muted);
796
+ }
797
+
798
+ /* ----------------------------------------
799
+ DARK MODE - BADGES
800
+ ---------------------------------------- */
801
+ .dark .badge-primary {
802
+ background: rgba(199, 123, 88, 0.2);
803
+ color: var(--color-primary-300);
804
+ }
805
+
806
+ .dark .badge-success {
807
+ background: rgba(34, 197, 94, 0.2);
808
+ color: var(--color-success-400);
809
+ }
810
+
811
+ .dark .badge-error {
812
+ background: rgba(239, 68, 68, 0.2);
813
+ color: var(--color-error-400);
814
+ }
815
+
816
+ .dark .badge-warning {
817
+ background: rgba(245, 158, 11, 0.2);
818
+ color: var(--color-warning-400);
819
+ }
820
+
821
+ .dark .badge-info {
822
+ background: rgba(59, 130, 246, 0.2);
823
+ color: var(--color-info-400);
824
+ }
825
+
826
+ .dark .badge-neutral {
827
+ background: var(--color-dark-surface-light);
828
+ color: var(--color-dark-text-muted);
829
+ }
830
+
831
+ /* ----------------------------------------
832
+ DARK MODE - NAVIGATION
833
+ ---------------------------------------- */
834
+ .dark .nav-item {
835
+ color: var(--color-dark-text-muted);
836
+ }
837
+
838
+ .dark .nav-item:hover {
839
+ background: var(--color-dark-surface-light);
840
+ color: var(--color-dark-text);
841
+ }
842
+
843
+ .dark .nav-item.active {
844
+ background: rgba(199, 123, 88, 0.15);
845
+ color: var(--color-primary-300);
846
+ }
847
+
848
+ /* ----------------------------------------
849
+ DARK MODE - ALERTS
850
+ ---------------------------------------- */
851
+ .dark .alert-success {
852
+ background: rgba(34, 197, 94, 0.15);
853
+ border-color: rgba(34, 197, 94, 0.3);
854
+ color: var(--color-success-400);
855
+ }
856
+
857
+ .dark .alert-error {
858
+ background: rgba(239, 68, 68, 0.15);
859
+ border-color: rgba(239, 68, 68, 0.3);
860
+ color: var(--color-error-400);
861
+ }
862
+
863
+ .dark .alert-warning {
864
+ background: rgba(245, 158, 11, 0.15);
865
+ border-color: rgba(245, 158, 11, 0.3);
866
+ color: var(--color-warning-400);
867
+ }
868
+
869
+ .dark .alert-info {
870
+ background: rgba(59, 130, 246, 0.15);
871
+ border-color: rgba(59, 130, 246, 0.3);
872
+ color: var(--color-info-400);
873
+ }
874
+
875
+ /* ----------------------------------------
876
+ DARK MODE - AVATARS
877
+ ---------------------------------------- */
878
+ .dark .avatar-primary {
879
+ background: rgba(199, 123, 88, 0.2);
880
+ color: var(--color-primary-300);
881
+ }
882
+
883
+ .dark .avatar-neutral {
884
+ background: var(--color-dark-surface-light);
885
+ color: var(--color-dark-text-muted);
886
+ }
887
+
888
+ /* ----------------------------------------
889
+ DARK MODE - TABLES
890
+ ---------------------------------------- */
891
+ .dark .table-wrapper {
892
+ border-color: var(--color-dark-border);
893
+ }
894
+
895
+ .dark .table th {
896
+ background: var(--color-dark-surface);
897
+ color: var(--color-dark-text-muted);
898
+ border-bottom-color: var(--color-dark-border);
899
+ }
900
+
901
+ .dark .table td {
902
+ color: var(--color-dark-text);
903
+ border-bottom-color: var(--color-dark-surface-light);
904
+ }
905
+
906
+ .dark .table tbody tr:hover {
907
+ background: var(--color-dark-surface-light);
908
+ }
909
+
910
+ /* ----------------------------------------
911
+ DARK MODE - STAT CARDS
912
+ ---------------------------------------- */
913
+ .dark .stat-card {
914
+ background: var(--color-dark-surface);
915
+ border-color: var(--color-dark-border);
916
+ }
917
+
918
+ .dark .stat-label {
919
+ color: var(--color-dark-text-muted);
920
+ }
921
+
922
+ .dark .stat-value {
923
+ color: var(--color-dark-text);
924
+ }
925
+
926
+ /* ----------------------------------------
927
+ DARK MODE - EMPTY STATES
928
+ ---------------------------------------- */
929
+ .dark .empty-state-icon {
930
+ color: var(--color-dark-text-muted);
931
+ }
932
+
933
+ .dark .empty-state-title {
934
+ color: var(--color-dark-text);
935
+ }
936
+
937
+ .dark .empty-state-description {
938
+ color: var(--color-dark-text-muted);
939
+ }
940
+
941
+ /* ----------------------------------------
942
+ DARK MODE - SECTION HEADERS
943
+ ---------------------------------------- */
944
+ .dark .section-header {
945
+ color: var(--color-dark-text);
946
+ }
947
+
948
+ .dark .section-subheader {
949
+ color: var(--color-dark-text-muted);
950
+ }
951
+
952
+ /* ----------------------------------------
953
+ DARK MODE - DIVIDERS
954
+ ---------------------------------------- */
955
+ .dark .divider {
956
+ background: var(--color-dark-border);
957
+ }
958
+
959
+ /* ----------------------------------------
960
+ DARK MODE - FOCUS STATES
961
+ ---------------------------------------- */
962
+ .dark .btn-primary:focus-visible,
963
+ .dark .btn-secondary:focus-visible,
964
+ .dark .btn-ghost:focus-visible {
965
+ outline-color: var(--color-primary-400);
966
+ }
967
+
968
+ .dark .btn-danger:focus-visible {
969
+ outline-color: var(--color-error-400);
970
+ }
971
+
972
+ .dark a:focus-visible {
973
+ outline-color: var(--color-primary-400);
974
+ }
975
+
976
+ .dark .nav-item:focus-visible {
977
+ outline-color: var(--color-primary-400);
978
+ }
979
+
980
+ .dark .card:focus-visible,
981
+ .dark .card-interactive:focus-visible,
982
+ .dark .card-lift:focus-visible {
983
+ outline-color: var(--color-primary-400);
984
+ }
985
+
986
+ .dark .skip-link {
987
+ background: var(--color-primary-400);
988
+ color: var(--color-ink-950);
989
+ }