brainzlab-ui 0.1.0 → 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.
@@ -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 {
@@ -280,6 +280,43 @@
280
280
  color: var(--color-ink-600);
281
281
  }
282
282
 
283
+ /* ----------------------------------------
284
+ MATURITY BADGES
285
+ ----------------------------------------
286
+ Service maturity signal used on landing pages and the
287
+ app launcher. Honesty rule: never imply a scaffold is
288
+ production-ready — "proximamente" must read as not-yet.
289
+ */
290
+ .badge-maturity {
291
+ text-transform: uppercase;
292
+ letter-spacing: 0.04em;
293
+ font-size: 0.6875rem;
294
+ font-weight: 600;
295
+ }
296
+
297
+ .badge-maturity::before {
298
+ content: '';
299
+ width: 0.4375rem;
300
+ height: 0.4375rem;
301
+ border-radius: 9999px;
302
+ background: currentColor;
303
+ }
304
+
305
+ .badge-disponible {
306
+ background: rgba(34, 197, 94, 0.1);
307
+ color: var(--color-success-600);
308
+ }
309
+
310
+ .badge-beta {
311
+ background: rgba(59, 130, 246, 0.1);
312
+ color: var(--color-info-600);
313
+ }
314
+
315
+ .badge-proximamente {
316
+ background: var(--color-cream-200);
317
+ color: var(--color-ink-500);
318
+ }
319
+
283
320
  /* ----------------------------------------
284
321
  NAVIGATION
285
322
  ---------------------------------------- */
@@ -292,7 +329,7 @@
292
329
  font-weight: 500;
293
330
  color: var(--color-ink-600);
294
331
  border-radius: 0.75rem;
295
- transition: all 0.15s ease;
332
+ transition: all var(--duration-fast) var(--ease-out);
296
333
  }
297
334
 
298
335
  .nav-item:hover {
@@ -494,3 +531,511 @@
494
531
  height: 1px;
495
532
  background: var(--color-cream-200);
496
533
  }
534
+
535
+ /* ----------------------------------------
536
+ ACCESSIBILITY - FOCUS STATES
537
+ ---------------------------------------- */
538
+
539
+ /* Button focus states */
540
+ .btn-primary:focus-visible,
541
+ .btn-secondary:focus-visible,
542
+ .btn-ghost:focus-visible,
543
+ .btn-danger:focus-visible {
544
+ outline: 2px solid var(--color-primary-500);
545
+ outline-offset: 2px;
546
+ }
547
+
548
+ .btn-secondary:focus-visible {
549
+ outline-color: var(--color-ink-700);
550
+ }
551
+
552
+ .btn-danger:focus-visible {
553
+ outline-color: var(--color-error-500);
554
+ }
555
+
556
+ /* Link focus states */
557
+ a:focus-visible {
558
+ outline: 2px solid var(--color-primary-500);
559
+ outline-offset: 2px;
560
+ border-radius: 2px;
561
+ }
562
+
563
+ /* Nav item focus */
564
+ .nav-item:focus-visible {
565
+ outline: 2px solid var(--color-primary-500);
566
+ outline-offset: -2px;
567
+ }
568
+
569
+ /* Card focus states (for interactive/clickable cards) */
570
+ .card:focus-visible,
571
+ .card-interactive:focus-visible,
572
+ .card-lift:focus-visible {
573
+ outline: 2px solid var(--color-primary-500);
574
+ outline-offset: 2px;
575
+ }
576
+
577
+ /* Badge focus states (for interactive badges) */
578
+ .badge:focus-visible {
579
+ outline: 2px solid var(--color-primary-500);
580
+ outline-offset: 2px;
581
+ }
582
+
583
+ /* Avatar focus states (for clickable avatars) */
584
+ .avatar:focus-visible {
585
+ outline: 2px solid var(--color-primary-500);
586
+ outline-offset: 2px;
587
+ }
588
+
589
+ /* Table row focus states */
590
+ .table tbody tr:focus-visible {
591
+ outline: 2px solid var(--color-primary-500);
592
+ outline-offset: -2px;
593
+ }
594
+
595
+ /* Stat card focus states */
596
+ .stat-card:focus-visible {
597
+ outline: 2px solid var(--color-primary-500);
598
+ outline-offset: 2px;
599
+ }
600
+
601
+ /* Checkbox focus states */
602
+ input[type="checkbox"]:focus-visible,
603
+ input[type="radio"]:focus-visible {
604
+ outline: 2px solid var(--color-primary-500);
605
+ outline-offset: 2px;
606
+ }
607
+
608
+ /* Skip link for keyboard navigation */
609
+ .skip-link {
610
+ position: absolute;
611
+ top: -40px;
612
+ left: 0;
613
+ background: var(--color-primary-500);
614
+ color: white;
615
+ padding: 0.5rem 1rem;
616
+ z-index: 100;
617
+ text-decoration: none;
618
+ font-weight: 500;
619
+ border-radius: 0 0 0.5rem 0;
620
+ transition: top var(--duration-normal) var(--ease-out);
621
+ }
622
+
623
+ .skip-link:focus {
624
+ top: 0;
625
+ }
626
+
627
+ /* ----------------------------------------
628
+ SKELETONS / LOADING STATES
629
+ ---------------------------------------- */
630
+ .skeleton {
631
+ background: linear-gradient(
632
+ 90deg,
633
+ var(--color-cream-200) 0%,
634
+ var(--color-cream-100) 50%,
635
+ var(--color-cream-200) 100%
636
+ );
637
+ background-size: 200% 100%;
638
+ animation: shimmer 1.5s ease-in-out infinite;
639
+ border-radius: var(--radius-md);
640
+ }
641
+
642
+ .skeleton-text {
643
+ height: 1em;
644
+ margin-bottom: 0.5em;
645
+ border-radius: var(--radius-sm);
646
+ }
647
+
648
+ .skeleton-text:last-child {
649
+ width: 80%;
650
+ }
651
+
652
+ .skeleton-avatar {
653
+ width: 2.5rem;
654
+ height: 2.5rem;
655
+ border-radius: 50%;
656
+ }
657
+
658
+ .skeleton-card {
659
+ height: 200px;
660
+ border-radius: var(--radius-lg);
661
+ }
662
+
663
+ .skeleton-button {
664
+ height: 2.5rem;
665
+ width: 100px;
666
+ border-radius: 9999px;
667
+ }
668
+
669
+ /* Dark mode skeleton */
670
+ .dark .skeleton {
671
+ background: linear-gradient(
672
+ 90deg,
673
+ var(--color-dark-surface) 0%,
674
+ var(--color-dark-surface-light) 50%,
675
+ var(--color-dark-surface) 100%
676
+ );
677
+ background-size: 200% 100%;
678
+ }
679
+
680
+ /* Pulse loading indicator */
681
+ .loading-pulse {
682
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
683
+ }
684
+
685
+ /* Spinner */
686
+ .spinner {
687
+ width: 1.5rem;
688
+ height: 1.5rem;
689
+ border: 2px solid var(--color-cream-300);
690
+ border-top-color: var(--color-primary-500);
691
+ border-radius: 50%;
692
+ animation: spin 0.8s linear infinite;
693
+ }
694
+
695
+ .spinner-sm { width: 1rem; height: 1rem; }
696
+ .spinner-lg { width: 2rem; height: 2rem; }
697
+
698
+ .dark .spinner {
699
+ border-color: var(--color-dark-border);
700
+ border-top-color: var(--color-primary-400);
701
+ }
702
+
703
+ /* ============================================
704
+ DARK MODE VARIANTS
705
+ ============================================
706
+ Activated via .dark class on html/body element
707
+ Follows the landing page's dark mode approach
708
+ */
709
+
710
+ /* ----------------------------------------
711
+ DARK MODE - BUTTONS
712
+ ---------------------------------------- */
713
+ .dark .btn-primary {
714
+ background: var(--color-cream-200);
715
+ color: var(--color-ink-950);
716
+ }
717
+
718
+ .dark .btn-primary:hover {
719
+ background: var(--color-cream-100);
720
+ box-shadow: 0 4px 12px rgba(232, 225, 215, 0.2);
721
+ }
722
+
723
+ .dark .btn-secondary {
724
+ background: transparent;
725
+ color: var(--color-dark-text);
726
+ border-color: var(--color-dark-border);
727
+ }
728
+
729
+ .dark .btn-secondary:hover {
730
+ background: var(--color-dark-surface-light);
731
+ border-color: var(--color-dark-text-muted);
732
+ color: var(--color-dark-text);
733
+ }
734
+
735
+ .dark .btn-ghost {
736
+ color: var(--color-dark-text-muted);
737
+ }
738
+
739
+ .dark .btn-ghost:hover {
740
+ background: var(--color-dark-surface-light);
741
+ color: var(--color-dark-text);
742
+ }
743
+
744
+ .dark .btn-danger {
745
+ background: var(--color-error-600);
746
+ }
747
+
748
+ .dark .btn-danger:hover {
749
+ background: var(--color-error-500);
750
+ }
751
+
752
+ /* ----------------------------------------
753
+ DARK MODE - CARDS
754
+ ---------------------------------------- */
755
+ .dark .card {
756
+ background: var(--color-dark-surface);
757
+ border-color: var(--color-dark-border);
758
+ box-shadow: var(--shadow-dark-soft);
759
+ }
760
+
761
+ .dark .card:hover {
762
+ border-color: var(--color-dark-text-muted);
763
+ box-shadow: var(--shadow-dark-medium);
764
+ }
765
+
766
+ .dark .card-header {
767
+ border-bottom-color: var(--color-dark-border);
768
+ }
769
+
770
+ .dark .card-footer {
771
+ border-top-color: var(--color-dark-border);
772
+ }
773
+
774
+ .dark .card-lift:hover {
775
+ box-shadow: var(--shadow-dark-large);
776
+ }
777
+
778
+ /* ----------------------------------------
779
+ DARK MODE - FORM ELEMENTS
780
+ ---------------------------------------- */
781
+ .dark .input {
782
+ background: var(--color-dark-surface-light);
783
+ border-color: var(--color-dark-border);
784
+ color: var(--color-dark-text);
785
+ }
786
+
787
+ .dark .input::placeholder {
788
+ color: var(--color-dark-text-muted);
789
+ }
790
+
791
+ .dark .input:focus {
792
+ background: var(--color-dark-surface);
793
+ border-color: var(--color-primary-400);
794
+ box-shadow: 0 0 0 3px rgba(199, 123, 88, 0.2);
795
+ }
796
+
797
+ .dark .input:disabled {
798
+ background: var(--color-dark-bg);
799
+ color: var(--color-dark-text-muted);
800
+ }
801
+
802
+ .dark .label {
803
+ color: var(--color-dark-text);
804
+ }
805
+
806
+ .dark .select {
807
+ background-color: var(--color-dark-surface-light);
808
+ border-color: var(--color-dark-border);
809
+ color: var(--color-dark-text);
810
+ 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");
811
+ }
812
+
813
+ .dark .select:focus {
814
+ background-color: var(--color-dark-surface);
815
+ border-color: var(--color-primary-400);
816
+ box-shadow: 0 0 0 3px rgba(199, 123, 88, 0.2);
817
+ }
818
+
819
+ .dark .textarea {
820
+ background: var(--color-dark-surface-light);
821
+ border-color: var(--color-dark-border);
822
+ color: var(--color-dark-text);
823
+ }
824
+
825
+ .dark .textarea:focus {
826
+ background: var(--color-dark-surface);
827
+ border-color: var(--color-primary-400);
828
+ box-shadow: 0 0 0 3px rgba(199, 123, 88, 0.2);
829
+ }
830
+
831
+ .dark .search-input-wrapper .search-icon {
832
+ color: var(--color-dark-text-muted);
833
+ }
834
+
835
+ /* ----------------------------------------
836
+ DARK MODE - BADGES
837
+ ---------------------------------------- */
838
+ .dark .badge-primary {
839
+ background: rgba(199, 123, 88, 0.2);
840
+ color: var(--color-primary-300);
841
+ }
842
+
843
+ .dark .badge-success {
844
+ background: rgba(34, 197, 94, 0.2);
845
+ color: var(--color-success-400);
846
+ }
847
+
848
+ .dark .badge-error {
849
+ background: rgba(239, 68, 68, 0.2);
850
+ color: var(--color-error-400);
851
+ }
852
+
853
+ .dark .badge-warning {
854
+ background: rgba(245, 158, 11, 0.2);
855
+ color: var(--color-warning-400);
856
+ }
857
+
858
+ .dark .badge-info {
859
+ background: rgba(59, 130, 246, 0.2);
860
+ color: var(--color-info-400);
861
+ }
862
+
863
+ .dark .badge-neutral {
864
+ background: var(--color-dark-surface-light);
865
+ color: var(--color-dark-text-muted);
866
+ }
867
+
868
+ .dark .badge-disponible {
869
+ background: rgba(34, 197, 94, 0.2);
870
+ color: var(--color-success-400);
871
+ }
872
+
873
+ .dark .badge-beta {
874
+ background: rgba(59, 130, 246, 0.2);
875
+ color: var(--color-info-400);
876
+ }
877
+
878
+ .dark .badge-proximamente {
879
+ background: var(--color-dark-surface-light);
880
+ color: var(--color-dark-text-muted);
881
+ }
882
+
883
+ /* ----------------------------------------
884
+ DARK MODE - NAVIGATION
885
+ ---------------------------------------- */
886
+ .dark .nav-item {
887
+ color: var(--color-dark-text-muted);
888
+ }
889
+
890
+ .dark .nav-item:hover {
891
+ background: var(--color-dark-surface-light);
892
+ color: var(--color-dark-text);
893
+ }
894
+
895
+ .dark .nav-item.active {
896
+ background: rgba(199, 123, 88, 0.15);
897
+ color: var(--color-primary-300);
898
+ }
899
+
900
+ /* ----------------------------------------
901
+ DARK MODE - ALERTS
902
+ ---------------------------------------- */
903
+ .dark .alert-success {
904
+ background: rgba(34, 197, 94, 0.15);
905
+ border-color: rgba(34, 197, 94, 0.3);
906
+ color: var(--color-success-400);
907
+ }
908
+
909
+ .dark .alert-error {
910
+ background: rgba(239, 68, 68, 0.15);
911
+ border-color: rgba(239, 68, 68, 0.3);
912
+ color: var(--color-error-400);
913
+ }
914
+
915
+ .dark .alert-warning {
916
+ background: rgba(245, 158, 11, 0.15);
917
+ border-color: rgba(245, 158, 11, 0.3);
918
+ color: var(--color-warning-400);
919
+ }
920
+
921
+ .dark .alert-info {
922
+ background: rgba(59, 130, 246, 0.15);
923
+ border-color: rgba(59, 130, 246, 0.3);
924
+ color: var(--color-info-400);
925
+ }
926
+
927
+ /* ----------------------------------------
928
+ DARK MODE - AVATARS
929
+ ---------------------------------------- */
930
+ .dark .avatar-primary {
931
+ background: rgba(199, 123, 88, 0.2);
932
+ color: var(--color-primary-300);
933
+ }
934
+
935
+ .dark .avatar-neutral {
936
+ background: var(--color-dark-surface-light);
937
+ color: var(--color-dark-text-muted);
938
+ }
939
+
940
+ /* ----------------------------------------
941
+ DARK MODE - TABLES
942
+ ---------------------------------------- */
943
+ .dark .table-wrapper {
944
+ border-color: var(--color-dark-border);
945
+ }
946
+
947
+ .dark .table th {
948
+ background: var(--color-dark-surface);
949
+ color: var(--color-dark-text-muted);
950
+ border-bottom-color: var(--color-dark-border);
951
+ }
952
+
953
+ .dark .table td {
954
+ color: var(--color-dark-text);
955
+ border-bottom-color: var(--color-dark-surface-light);
956
+ }
957
+
958
+ .dark .table tbody tr:hover {
959
+ background: var(--color-dark-surface-light);
960
+ }
961
+
962
+ /* ----------------------------------------
963
+ DARK MODE - STAT CARDS
964
+ ---------------------------------------- */
965
+ .dark .stat-card {
966
+ background: var(--color-dark-surface);
967
+ border-color: var(--color-dark-border);
968
+ }
969
+
970
+ .dark .stat-label {
971
+ color: var(--color-dark-text-muted);
972
+ }
973
+
974
+ .dark .stat-value {
975
+ color: var(--color-dark-text);
976
+ }
977
+
978
+ /* ----------------------------------------
979
+ DARK MODE - EMPTY STATES
980
+ ---------------------------------------- */
981
+ .dark .empty-state-icon {
982
+ color: var(--color-dark-text-muted);
983
+ }
984
+
985
+ .dark .empty-state-title {
986
+ color: var(--color-dark-text);
987
+ }
988
+
989
+ .dark .empty-state-description {
990
+ color: var(--color-dark-text-muted);
991
+ }
992
+
993
+ /* ----------------------------------------
994
+ DARK MODE - SECTION HEADERS
995
+ ---------------------------------------- */
996
+ .dark .section-header {
997
+ color: var(--color-dark-text);
998
+ }
999
+
1000
+ .dark .section-subheader {
1001
+ color: var(--color-dark-text-muted);
1002
+ }
1003
+
1004
+ /* ----------------------------------------
1005
+ DARK MODE - DIVIDERS
1006
+ ---------------------------------------- */
1007
+ .dark .divider {
1008
+ background: var(--color-dark-border);
1009
+ }
1010
+
1011
+ /* ----------------------------------------
1012
+ DARK MODE - FOCUS STATES
1013
+ ---------------------------------------- */
1014
+ .dark .btn-primary:focus-visible,
1015
+ .dark .btn-secondary:focus-visible,
1016
+ .dark .btn-ghost:focus-visible {
1017
+ outline-color: var(--color-primary-400);
1018
+ }
1019
+
1020
+ .dark .btn-danger:focus-visible {
1021
+ outline-color: var(--color-error-400);
1022
+ }
1023
+
1024
+ .dark a:focus-visible {
1025
+ outline-color: var(--color-primary-400);
1026
+ }
1027
+
1028
+ .dark .nav-item:focus-visible {
1029
+ outline-color: var(--color-primary-400);
1030
+ }
1031
+
1032
+ .dark .card:focus-visible,
1033
+ .dark .card-interactive:focus-visible,
1034
+ .dark .card-lift:focus-visible {
1035
+ outline-color: var(--color-primary-400);
1036
+ }
1037
+
1038
+ .dark .skip-link {
1039
+ background: var(--color-primary-400);
1040
+ color: var(--color-ink-950);
1041
+ }