@wwtdev/bsds-css 0.2.0 → 1.0.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.
Files changed (32) hide show
  1. package/dist/components/_badge.scss +67 -0
  2. package/dist/components/_buttons.scss +193 -0
  3. package/dist/components/_form-booleans.scss +158 -0
  4. package/dist/components/_form-character-count.scss +20 -0
  5. package/dist/components/_form-elements.scss +118 -0
  6. package/dist/components/_form-field-details.scss +19 -0
  7. package/dist/components/_form-hints.scss +14 -0
  8. package/dist/components/_form-labels.scss +22 -0
  9. package/dist/components/_form-switches.scss +137 -0
  10. package/dist/components/_pills.scss +191 -0
  11. package/dist/components/_profile-details.scss +18 -0
  12. package/dist/components/_profile-img.scss +71 -0
  13. package/dist/components/_profile-layout.scss +33 -0
  14. package/dist/components/_tables.scss +84 -0
  15. package/dist/components/badge.css +63 -0
  16. package/dist/components/buttons.css +189 -0
  17. package/dist/components/form-booleans.css +154 -0
  18. package/dist/components/form-character-count.css +16 -0
  19. package/dist/components/form-elements.css +114 -0
  20. package/dist/components/form-field-details.css +15 -0
  21. package/dist/components/form-hints.css +10 -0
  22. package/dist/components/form-labels.css +18 -0
  23. package/dist/components/form-switches.css +133 -0
  24. package/dist/components/pills.css +187 -0
  25. package/dist/components/profile-details.css +14 -0
  26. package/dist/components/profile-img.css +67 -0
  27. package/dist/components/profile-layout.css +29 -0
  28. package/dist/components/tables.css +80 -0
  29. package/dist/wwt-bsds-wc-base.css +5 -0
  30. package/dist/wwt-bsds.css +310 -147
  31. package/dist/wwt-bsds.min.css +1 -1
  32. package/package.json +3 -3
package/dist/wwt-bsds.css CHANGED
@@ -632,8 +632,8 @@ body:where(.fluid) {
632
632
  box-shadow: var(--bs-shadow-profilePhoto);
633
633
  }
634
634
 
635
- .badge[data-position^='left']::before,
636
- .badge:where(:not([data-position^='left']))::after {
635
+ .bs-badge[data-position^='left']::before,
636
+ .bs-badge:where(:not([data-position^='left']))::after {
637
637
  align-items: center;
638
638
  background: var(--bs-red-500);
639
639
  border-radius: 0.5rem;
@@ -650,13 +650,13 @@ body:where(.fluid) {
650
650
  width: 6px;
651
651
  }
652
652
 
653
- .bs-pill .badge::before,
654
- .bs-pill .badge::after {
653
+ .bs-pill .bs-badge::before,
654
+ .bs-pill .bs-badge::after {
655
655
  font-size: 0.8125em;
656
656
  }
657
657
 
658
- .badge[data-count]:where([data-position^='left'])::before,
659
- .badge[data-count]:where(:not([data-position^='left']))::after {
658
+ .bs-badge[data-count]:where([data-position^='left'])::before,
659
+ .bs-badge[data-count]:where(:not([data-position^='left']))::after {
660
660
  color: white;
661
661
  content: attr(data-count);
662
662
  min-height: 1rem;
@@ -667,26 +667,31 @@ body:where(.fluid) {
667
667
  width: auto;
668
668
  }
669
669
 
670
- .badge[data-count]::before {
670
+ .bs-badge[data-count]::before {
671
671
  margin-right: 0.25rem;
672
672
  }
673
673
 
674
- .badge[data-count]::after {
674
+ .bs-badge[data-count]::after {
675
675
  margin-left: 0.25rem;
676
676
  }
677
677
 
678
- .badge[data-count='0']::before,
679
- .badge[data-count='0']::after {
678
+ .bs-badge[data-count='0']::before,
679
+ .bs-badge[data-count='0']::after {
680
680
  display: none;
681
681
  }
682
682
 
683
- .badge[data-badge-color^='blue']::before,
684
- .badge[data-badge-color^='blue']::after {
683
+ .bs-badge[data-show-zero]:where(:not([data-show-zero="false"]))::before,
684
+ .bs-badge[data-show-zero]:where(:not([data-show-zero="false"]))::after {
685
+ display: inline-flex;
686
+ }
687
+
688
+ .bs-badge[data-badge-color^='blue']::before,
689
+ .bs-badge[data-badge-color^='blue']::after {
685
690
  background: var(--bs-blue-500);
686
691
  }
687
692
 
688
- .badge[data-badge-color^='white']::before,
689
- .badge[data-badge-color^='white']::after {
693
+ .bs-badge[data-badge-color^='white']::before,
694
+ .bs-badge[data-badge-color^='white']::after {
690
695
  background: white;
691
696
  color: var(--badge-text, var(--bs-black));
692
697
  }
@@ -701,7 +706,7 @@ body:where(.fluid) {
701
706
  text-decoration: none;
702
707
  }
703
708
 
704
- .button {
709
+ .bs-button {
705
710
  --btn-main: var(--bs-blue-400);
706
711
  --btn-secondary: var(--bs-blue-300);
707
712
  --btn-highlight: var(--bs-blue-100);
@@ -714,6 +719,7 @@ body:where(.fluid) {
714
719
  display: inline-flex;
715
720
  font-size: var(--bs-text-md);
716
721
  font-weight: 600;
722
+ justify-content: center;
717
723
  line-height: 1.5;
718
724
  outline: 2px solid transparent;
719
725
  padding: var(--bs-space-1) var(--bs-space-4) calc(var(--bs-space-1) * 1.5);
@@ -723,11 +729,11 @@ body:where(.fluid) {
723
729
  vertical-align: middle;
724
730
  }
725
731
 
726
- .button:hover {
732
+ .bs-button:hover {
727
733
  background-color: var(--btn-secondary);
728
734
  }
729
735
 
730
- .button:active {
736
+ .bs-button:active {
731
737
  background-color: var(--btn-secondary);
732
738
  transform: scale(0.97);
733
739
  transform-origin: center;
@@ -736,7 +742,7 @@ body:where(.fluid) {
736
742
 
737
743
  /* Button Focus Styles */
738
744
 
739
- .button::before {
745
+ .bs-button::before {
740
746
  border-color: transparent;
741
747
  border-radius: 0.5rem;
742
748
  border-style: solid;
@@ -749,23 +755,23 @@ body:where(.fluid) {
749
755
  width: calc(100% + 0.5rem);
750
756
  }
751
757
 
752
- .button:focus::before {
758
+ .bs-button:focus::before {
753
759
  border-color: var(--btn-main);
754
760
  }
755
761
 
756
- .button:focus-visible::before {
762
+ .bs-button:focus-visible::before {
757
763
  border-color: var(--btn-main);
758
764
  box-shadow: none;
759
765
  }
760
766
 
761
- .button:focus:not(:focus-visible)::before {
767
+ .bs-button:focus:not(:focus-visible)::before {
762
768
  border-color: transparent;
763
769
  box-shadow: none;
764
770
  }
765
771
 
766
772
  /* Ghost Buttons */
767
773
 
768
- .button:where([data-ghost]) {
774
+ .bs-button:where([data-ghost]) {
769
775
  --btn-light: var(--bs-blue-10);
770
776
  --btn-secondary: var(--bs-blue-10);
771
777
  background-color: transparent;
@@ -773,16 +779,16 @@ body:where(.fluid) {
773
779
  color: var(--btn-main);
774
780
  }
775
781
 
776
- .button:where([data-ghost])::before {
782
+ .bs-button:where([data-ghost])::before {
777
783
  border-radius: 0.4375rem;
778
784
  }
779
785
 
780
- .button:where([data-ghost]):hover,
781
- .button:where([data-ghost]):focus {
786
+ .bs-button:where([data-ghost]):hover,
787
+ .bs-button:where([data-ghost]):focus {
782
788
  background-color: var(--btn-light);
783
789
  }
784
790
 
785
- .button:where([data-ghost]):active {
791
+ .bs-button:where([data-ghost]):active {
786
792
  box-shadow:
787
793
  inset 0 0 0 1px var(--btn-main),
788
794
  inset 0px 0px 4px 1px var(--btn-highlight);
@@ -790,35 +796,35 @@ body:where(.fluid) {
790
796
 
791
797
  /* Button type */
792
798
 
793
- .button:where([data-variant^='secondary']) {
799
+ .bs-button:where([data-variant^='secondary']) {
794
800
  --btn-main: var(--bs-plum-400);
795
801
  --btn-secondary: var(--bs-plum-300);
796
802
  --btn-light: var(--bs-plum-10);
797
803
  --btn-highlight: var(--bs-plum-100);
798
804
  }
799
805
 
800
- .dark .button:where([data-variant^='secondary']) {
806
+ .dark .bs-button:where([data-variant^='secondary']) {
801
807
  --btn-main: var(--bs-plum-200);
802
808
  --btn-secondary: var(--bs-plum-300);
803
809
  --btn-light: var(--bs-navy-400);
804
810
  --btn-highlight: var(--bs-plum-400);
805
811
  }
806
812
 
807
- .button:where([data-variant^='positive']) {
813
+ .bs-button:where([data-variant^='positive']) {
808
814
  --btn-main: var(--bs-purple-400);
809
815
  --btn-secondary: var(--bs-purple-300);
810
816
  --btn-light: var(--bs-purple-10);
811
817
  --btn-highlight: var(--bs-purple-100);
812
818
  }
813
819
 
814
- .button:where([data-variant^='warning']) {
820
+ .bs-button:where([data-variant^='warning']) {
815
821
  --btn-main: var(--bs-orange-warning);
816
822
  --btn-secondary: var(--bs-orange-300);
817
823
  --btn-light: var(--bs-orange-10);
818
824
  --btn-highlight: var(--bs-orange-100);
819
825
  }
820
826
 
821
- .button:where([data-variant^='negative']) {
827
+ .bs-button:where([data-variant^='negative']) {
822
828
  --btn-main: var(--bs-red-400);
823
829
  --btn-secondary: var(--bs-red-300);
824
830
  --btn-light: var(--bs-red-10);
@@ -827,7 +833,7 @@ body:where(.fluid) {
827
833
 
828
834
  /* Text Button */
829
835
 
830
- .button:where([data-text]) {
836
+ .bs-button:where([data-text]) {
831
837
  background-color: transparent;
832
838
  color: var(--bs-blue-500);
833
839
  cursor: pointer;
@@ -836,61 +842,61 @@ body:where(.fluid) {
836
842
  line-height: 150%;
837
843
  }
838
844
 
839
- .button:where([data-text]):hover {
845
+ .bs-button:where([data-text]):hover {
840
846
  background-color: transparent;
841
847
  text-decoration: underline;
842
848
  }
843
849
 
844
- .button:where([data-text]):active {
850
+ .bs-button:where([data-text]):active {
845
851
  box-shadow: none;
846
852
  }
847
853
 
848
854
  /* Button Size */
849
855
 
850
- .button:where([data-size^='sm']) {
856
+ .bs-button:where([data-size^='sm']) {
851
857
  font-size: var(--bs-text-sm);
852
858
  }
853
859
 
854
- .button:where([data-text][data-size^='sm']) {
860
+ .bs-button:where([data-text][data-size^='sm']) {
855
861
  font-size: var(--bs-text-base);
856
862
  }
857
863
 
858
864
  /* Disabled Styling */
859
865
 
860
866
  :where(button:disabled),
861
- .button:where([aria-disabled='true']) /* for links as buttons */ {
867
+ .bs-button:where([aria-disabled='true']) /* for links as buttons */ {
862
868
  pointer-events: none;
863
869
  }
864
870
 
865
- .button:where(:disabled),
866
- .button:where([aria-disabled='true']) {
871
+ .bs-button:where(:disabled),
872
+ .bs-button:where([aria-disabled='true']) {
867
873
  color: var(--bs-gray-400);
868
874
  background-color: var(--bs-gray-200);
869
875
  }
870
876
 
871
- .button:where([data-ghost]):disabled,
872
- .button:where([data-ghost])[aria-disabled='true'] {
877
+ .bs-button:where([data-ghost]):disabled,
878
+ .bs-button:where([data-ghost])[aria-disabled='true'] {
873
879
  box-shadow: inset 0 0 0 1px var(--bs-gray-400);
874
880
  }
875
881
 
876
- .button:where([data-text]):disabled,
877
- .button:where([data-text][aria-disabled='true']) {
882
+ .bs-button:where([data-text]):disabled,
883
+ .bs-button:where([data-text][aria-disabled='true']) {
878
884
  background-color: transparent;
879
885
  }
880
886
 
881
887
  /* Icon Height */
882
888
 
883
- .button :where(svg:not([height])) {
889
+ .bs-button :where(svg:not([height])) {
884
890
  height: var(--bs-text-base);
885
891
  }
886
892
 
887
- .button:where([data-size^='sm']) :where(svg:not([height])) {
893
+ .bs-button:where([data-size^='sm']) :where(svg:not([height])) {
888
894
  height: var(--bs-text-xs);
889
895
  }
890
896
 
891
897
  /* links as buttons */
892
898
 
893
- a.button {
899
+ a.bs-button {
894
900
  align-items: center;
895
901
  display: inline-flex;
896
902
  outline: none;
@@ -898,7 +904,9 @@ a.button {
898
904
  }
899
905
 
900
906
  :where(label, legend) {
901
- color: var(--bs-ink-base);
907
+ --label-color: var(--bs-ink-base);
908
+
909
+ color: var(--label-color);
902
910
  display: inline-block;
903
911
  font-size: var(--bs-text-sm);
904
912
  font-weight: 600;
@@ -906,19 +914,19 @@ a.button {
906
914
  width: 100%;
907
915
  }
908
916
 
909
- :where(.required) {
917
+ :where([data-required]) {
910
918
  color: var(--bs-red-400);
911
919
  }
912
920
 
913
- :where([data-disabled], [data-disabled] .required, [data-disabled] label) {
914
- color: var(--bs-ink-light);
921
+ :where(label[data-disabled], [data-disabled] [data-required], [data-disabled] label) {
922
+ --label-color: var(--bs-ink-light);
915
923
  }
916
924
 
917
- :where(.required) {
925
+ :where([data-required]) {
918
926
  color: var(--bs-red-400);
919
927
  }
920
928
 
921
- :where([data-disabled], [data-disabled] .required) {
929
+ :where([data-disabled], [data-disabled] [data-required]) {
922
930
  color: var(--bs-gray-400);
923
931
  }
924
932
 
@@ -928,8 +936,8 @@ a.button {
928
936
  margin-top: 0.25rem;
929
937
  }
930
938
 
931
- :where(input):not([type^='checkbox'], [type^='radio'], [type^='file'], [type^='range']),
932
- :where(textarea, select) {
939
+ input:not([type^='checkbox'], [type^='radio'], [type^='file'], [type^='range']),
940
+ textarea, select {
933
941
  -webkit-appearance: none;
934
942
  -moz-appearance: none;
935
943
  appearance: none;
@@ -947,74 +955,72 @@ a.button {
947
955
 
948
956
  /* Generally applicable (all input types) */
949
957
 
950
- :where(input, textarea, select)::-moz-placeholder {
958
+ :is(input, textarea, select)::-moz-placeholder {
951
959
  color: var(--bs-violet-200);
952
960
  opacity: 1;
953
961
  }
954
962
 
955
- :where(input, textarea, select)::placeholder {
963
+ :is(input, textarea, select)::placeholder {
956
964
  color: var(--bs-violet-200);
957
965
  opacity: 1;
958
966
  }
959
967
 
960
- :where(input, textarea, select):focus {
968
+ :is(input, textarea, select):focus {
961
969
  box-shadow: 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
962
970
  0 0 0 4px var(--outline-color, var(--bs-blue-400));
963
971
  outline: 2px solid transparent;
964
972
  }
965
973
 
966
- :where(.box) :where(input, textarea, select):focus {
974
+ :where(.box) :is(input, textarea, select):focus {
967
975
  --offset-color: var(--bs-bg-subtle);
968
976
  }
969
977
 
970
- :where(.box[data-invert]) :where(input, textarea, select):focus {
978
+ :where(.box[data-invert]) :is(input, textarea, select):focus {
971
979
  --offset-color: var(--bs-bg-invert);
972
980
  }
973
981
 
974
- :where(input, textarea, select)[required]:focus,
975
- :where(input, textarea, select)[data-error] {
982
+ :is(input, textarea, select):where([required]):focus,
983
+ :is(input, textarea, select):where([data-error]) {
976
984
  --outline-color: var(--bs-red-200);
977
985
  }
978
986
 
979
- :where(input, textarea, select):disabled {
987
+ :is(input, textarea, select):disabled {
980
988
  background-color: var(--bs-gray-200);
981
989
  border-color: var(--bs-gray-400);
982
990
  color: var(--bs-gray-400);
983
991
  }
984
992
 
993
+ /*
994
+ Removes the built-in 'margin' on bottom of textarea
995
+ see https://bugs.chromium.org/p/chromium/issues/detail?id=89530
996
+ :has not fully supported yet but will work for most
997
+ */
998
+
999
+ :has(> textarea:only-child) {
1000
+ display: block;
1001
+ line-height: 0;
1002
+ }
1003
+
985
1004
  /* chrome user agent styling was applying opacity: 0.7 */
986
1005
 
987
1006
  :where(select:disabled) {
988
1007
  opacity: 1;
989
1008
  }
990
1009
 
991
- :where(input, textarea, select):disabled::-moz-placeholder, :where(input, textarea, select)[disabled]::-moz-placeholder {
1010
+ :is(input, textarea, select):disabled::-moz-placeholder, :is(input, textarea, select)[disabled]::-moz-placeholder {
992
1011
  color: var(--bs-gray-400);
993
1012
  opacity: 1;
994
1013
  }
995
1014
 
996
- :where(input, textarea, select):disabled::placeholder,
997
- :where(input, textarea, select)[disabled]::placeholder {
1015
+ :is(input, textarea, select):disabled::placeholder,
1016
+ :is(input, textarea, select)[disabled]::placeholder {
998
1017
  color: var(--bs-gray-400);
999
1018
  opacity: 1;
1000
1019
  }
1001
1020
 
1002
- /* Character Counter for Textarea */
1003
-
1004
- :where(textarea + .character-count) {
1005
- color: var(--bs-ink-base);
1006
- font-size: var(--bs-text-xs);
1007
- font-weight: 400;
1008
- text-align: right;
1009
- }
1010
-
1011
- :where(textarea[disabled] + .character-count) {
1012
- color: var(--bs-ink-light);
1013
- }
1014
-
1015
1021
  /* Select */
1016
1022
 
1017
- :where(select) {
1023
+ select {
1018
1024
  /* URL Encoded SVG dropdown caret so there is something there */
1019
1025
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%230A0B19' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
1020
1026
  background-position: right 0.75rem center;
@@ -1022,15 +1028,20 @@ a.button {
1022
1028
  background-size: 1em 1em;
1023
1029
  }
1024
1030
 
1025
- .dark :where(select) {
1031
+ .dark select {
1026
1032
  /* URL Encoded SVG dropdown caret so there is something there */
1027
1033
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%23ffffff' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
1028
1034
  }
1029
1035
 
1036
+ .dark select:disabled {
1037
+ /* URL Encoded SVG dropdown caret so there is something there */
1038
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%23555775' d='M8.048 13.375a.745.745 0 0 1-.526-.217L0 5.686l1.053-1.061 6.995 6.95 6.897-6.85 1.053 1.06-7.423 7.373a.745.745 0 0 1-.527.217Z'/%3E%3C/svg%3E");
1039
+ }
1040
+
1030
1041
  /* Errors and Messages */
1031
1042
 
1032
- :where(input)[data-error] {
1033
- border-color: var(--bs-red-400);
1043
+ :is(input, select, textarea):where([data-error]) {
1044
+ --input-border: var(--bs-red-400);
1034
1045
  }
1035
1046
 
1036
1047
  /* Fieldset */
@@ -1047,6 +1058,39 @@ a.button {
1047
1058
  padding: 0;
1048
1059
  }
1049
1060
 
1061
+ .bs-field-details {
1062
+ display: flex;
1063
+ justify-content: space-between;
1064
+ align-items: center;
1065
+ padding: 0 0.75rem;
1066
+ margin-top: 0.5rem;
1067
+ }
1068
+
1069
+ :where(textarea, bs-textarea) + .bs-field-details {
1070
+ margin-top: 0.25rem;
1071
+ }
1072
+
1073
+ .bs-field-details :where(.bs-character-count:first-child) {
1074
+ margin-left: auto;
1075
+ }
1076
+
1077
+ .bs-character-count {
1078
+ color: var(--bs-ink-base);
1079
+ font-size: var(--bs-text-xs);
1080
+ font-weight: 400;
1081
+ text-align: right;
1082
+ }
1083
+
1084
+ :where([disabled], [data-disabled]) + .bs-character-count,
1085
+ :where([disabled], [data-disabled]) .bs-character-count,
1086
+ .bs-character-count:where([data-disabled]) {
1087
+ color: var(--bs-gray-400);
1088
+ }
1089
+
1090
+ .bs-character-count:where([data-error]) {
1091
+ color: var(--bs-red-400);
1092
+ }
1093
+
1050
1094
  /* Containers and Labels for Checkbox/Radio */
1051
1095
 
1052
1096
  .bs-boolean {
@@ -1058,7 +1102,7 @@ a.button {
1058
1102
  line-height: 115%;
1059
1103
  }
1060
1104
 
1061
- .bs-boolean[data-size='sm'] input {
1105
+ .bs-boolean:where([data-size='sm']) input {
1062
1106
  width: var(--bs-text-xs);
1063
1107
  height: var(--bs-text-xs);
1064
1108
  }
@@ -1070,8 +1114,8 @@ a.button {
1070
1114
  width: auto;
1071
1115
  }
1072
1116
 
1073
- .bs-boolean[data-size='sm'],
1074
- .bs-boolean[data-size='sm'] label {
1117
+ .bs-boolean:where([data-size='sm']),
1118
+ .bs-boolean:where([data-size='sm']) label {
1075
1119
  font-size: var(--bs-text-xs);
1076
1120
  }
1077
1121
 
@@ -1109,7 +1153,7 @@ a.button {
1109
1153
  border-radius: 50%;
1110
1154
  }
1111
1155
 
1112
- :where(input[type='checkbox'])::before {
1156
+ input:where([type='checkbox'])::before {
1113
1157
  --filled-size: 1rem;
1114
1158
  --check-fill-color: var(--bs-blue-400);
1115
1159
 
@@ -1121,7 +1165,7 @@ a.button {
1121
1165
  width: var(--filled-size);
1122
1166
  }
1123
1167
 
1124
- :where(input[type^='checkbox'])::after {
1168
+ input:where([type^='checkbox'])::after {
1125
1169
  border: solid var(--bs-white);
1126
1170
  border-width: 0 0.125rem 0.125rem 0;
1127
1171
  content: '';
@@ -1135,7 +1179,7 @@ a.button {
1135
1179
  width: 0.375em;
1136
1180
  }
1137
1181
 
1138
- :where(input[type='radio'])::before {
1182
+ input:where([type='radio'])::before {
1139
1183
  --filled-size: 1rem;
1140
1184
  --radio-fill-color: var(--bs-blue-400);
1141
1185
 
@@ -1148,7 +1192,7 @@ a.button {
1148
1192
  width: var(--filled-size);
1149
1193
  }
1150
1194
 
1151
- :where(input[type='radio'])::after {
1195
+ input:where([type='radio'])::after {
1152
1196
  --inner-size: 0.375rem;
1153
1197
  --inner-fill-color: var(--bs-white);
1154
1198
 
@@ -1165,54 +1209,190 @@ a.button {
1165
1209
  width: var(--inner-size);
1166
1210
  }
1167
1211
 
1168
- :where(input[type='checkbox']:checked, input[type='radio']:checked)::before,
1169
- :where(input[type='checkbox']:checked, input[type='radio']:checked)::after {
1212
+ input:where([type='checkbox']:checked, [type='radio']:checked)::before,
1213
+ input:where([type='checkbox']:checked, [type='radio']:checked)::after {
1170
1214
  visibility: visible;
1171
1215
  }
1172
1216
 
1173
- .bs-boolean[data-size='sm'] input::before {
1217
+ .bs-boolean:where([data-size='sm']) input::before {
1174
1218
  --filled-size: var(--bs-text-xs);
1175
1219
  }
1176
1220
 
1177
- .bs-boolean[data-size='sm'] input[type='checkbox']::after {
1221
+ .bs-boolean:where([data-size='sm']) input[type='checkbox']::after {
1178
1222
  height: 0.5625rem;
1179
1223
  width: 0.3125rem;
1180
1224
  }
1181
1225
 
1182
- .bs-boolean[data-size='sm'] input[type='radio']::after {
1226
+ .bs-boolean:where([data-size='sm']) input[type='radio']::after {
1183
1227
  --inner-size: 0.25rem;
1184
1228
  }
1185
1229
 
1186
1230
  /* Disabled State */
1187
1231
 
1188
- :where(input[type='checkbox'], input[type='radio']):disabled {
1232
+ input:where([type='checkbox'], [type='radio']):disabled {
1189
1233
  --box-shadow: var(--bs-gray-400);
1190
1234
  background-color: transparent;
1191
1235
  }
1192
1236
 
1193
- :where(input[type='checkbox']):checked:disabled::before {
1237
+ input:where([type='checkbox']):checked:disabled::before {
1194
1238
  --check-fill-color: var(--bs-gray-400);
1195
1239
  }
1196
1240
 
1197
- :where(input[type='radio']):checked:disabled::before {
1241
+ input:where([type='radio']):checked:disabled::before {
1198
1242
  --radio-fill-color: var(--bs-gray-400);
1199
1243
  }
1200
1244
 
1201
1245
  /* Error state */
1202
1246
 
1203
- :where(input[type^='checkbox'], input[type^='radio'])[data-error] {
1247
+ input:where([type^='checkbox'], [type^='radio'])[data-error] {
1204
1248
  --box-shadow: var(--bs-red-400);
1205
1249
  }
1206
1250
 
1207
- :where(.hints) {
1251
+ .bs-switch {
1252
+ --box-shadow: var(--bs-ink-base);
1253
+ --ball-background: var(--bs-white);
1254
+ --ball-diameter: 1rem;
1255
+ --inner-text-width: 1rem;
1256
+ --inner-text-padding: 0.5rem;
1257
+ --offset: 0.25rem;
1258
+ --switch-background: var(--bs-gray-400);
1259
+
1260
+ border: none;
1261
+ border-radius: 100vw;
1262
+ cursor: pointer;
1263
+ height: calc(var(--ball-diameter) + var(--offset) * 2);
1264
+ position: relative;
1265
+ }
1266
+
1267
+ .bs-switch:where([data-size="sm"]) {
1268
+ --ball-diameter: var(--bs-text-xs);
1269
+ --inner-text-width: .75rem;
1270
+ --inner-text-padding: 0.375rem;
1271
+ }
1272
+
1273
+ :where(.dark) .bs-switch:where(:not([data-disabled])) {
1274
+ --switch-background: var(--bs-blue-400);
1275
+ }
1276
+
1277
+ .bs-switch input,
1278
+ .bs-switch:where([data-size="sm"]) input {
1279
+ cursor: pointer;
1280
+ height: 100%;
1281
+ opacity: 0;
1282
+ position: absolute;
1283
+ width: 100%;
1284
+ }
1285
+
1286
+ .bs-switch span {
1287
+ align-items: center;
1288
+ background-color: var(--switch-background);
1289
+ border-radius: 100vw;
1290
+ display: inline-flex;
1291
+ height: 100%;
1292
+ padding: 0 var(--inner-text-padding);
1293
+ pointer-events: none;
1294
+ position: relative;
1295
+ transition: 250ms;
1296
+ width: calc(var(--ball-diameter) * 2 + var(--offset) * 2);
1297
+ height: calc(var(--ball-diameter) + var(--offset) * 2);
1298
+ }
1299
+
1300
+ /* Toggle "ball" */
1301
+
1302
+ .bs-switch span::before {
1303
+ background-color: var(--ball-background);
1304
+ border-radius: 50%;
1305
+ box-sizing: border-box;
1306
+ content: '';
1307
+ height: var(--ball-diameter);
1308
+ left: var(--offset);
1309
+ position: absolute;
1310
+ top: 50%;
1311
+ transform: translate(0, -50%);
1312
+ transition: inherit;
1313
+ width: var(--ball-diameter);
1314
+ z-index: 2;
1315
+ }
1316
+
1317
+ .bs-switch input:where(:checked) ~ span::before,
1318
+ .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span::before {
1319
+ transform: translate(var(--ball-diameter), -50%);
1320
+ }
1321
+
1322
+ .bs-switch input:where(:checked) ~ span:where([data-inner-on-label][data-inner-off-label])::before,
1323
+ .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span:where([data-inner-on-label][data-inner-off-label])::before {
1324
+ transform: translate(calc(var(--ball-diameter) + var(--inner-text-width)), -50%);
1325
+ }
1326
+
1327
+ /* Inner "on/off" text */
1328
+
1329
+ .bs-switch span:where([data-inner-on-label][data-inner-off-label]) {
1330
+ color: white;
1331
+ width: calc(var(--ball-diameter) * 2 + var(--offset) * 2 + var(--inner-text-width));
1332
+ }
1333
+
1334
+ .bs-switch span::after {
1335
+ align-items: center;
1336
+ color: var(--ball-background);
1337
+ display: flex;
1338
+ height: 100%;
1339
+ justify-content: flex-start;
1340
+ left: 0;
1341
+ padding: var(--inner-text-padding);
1342
+ position: absolute;
1343
+ text-transform: capitalize;
1344
+ top: 0;
1345
+ width: 100%;
1346
+ }
1347
+
1348
+ .bs-switch input:where(:not(:checked)) ~ span:where([data-inner-on-label][data-inner-off-label])::after,
1349
+ .bs-switch:where([aria-pressed="false"]) span:where([data-inner-on-label][data-inner-off-label])::after {
1350
+ content: attr(data-inner-off-label);
1351
+ justify-content: flex-end;
1352
+ }
1353
+
1354
+ .bs-switch input:where(:checked) ~ span:where([data-inner-on-label][data-inner-off-label])::after,
1355
+ .bs-switch:where([aria-pressed]):where(:not([aria-pressed="false"])) span:where([data-inner-on-label][data-inner-off-label])::after {
1356
+ content: attr(data-inner-on-label);
1357
+ justify-content: flex-start;
1358
+ }
1359
+
1360
+ /* Focus state */
1361
+
1362
+ .bs-switch:where(:focus-within) span {
1363
+ box-shadow: 0 0 0 2px var(--offset-color, var(--bs-bg-base)),
1364
+ 0 0 0 4px var(--outline-color, var(--bs-blue-400));
1365
+ outline: 2px solid transparent;
1366
+ }
1367
+
1368
+ :where(.box) .bs-switch:where(:focus-within) span {
1369
+ --offset-color: var(--bs-bg-subtle);
1370
+ }
1371
+
1372
+ :where(.box[data-invert]) .bs-switch:where(:focus-within) span {
1373
+ --offset-color: var(--bs-bg-invert);
1374
+ }
1375
+
1376
+ /* Disabled state */
1377
+
1378
+ .bs-switch:where([data-disabled]) {
1379
+ --ball-background: var(--bs-gray-400);
1380
+ --switch-background: var(--bs-gray-200);
1381
+ }
1382
+
1383
+ .bs-switch input:where(:disabled) {
1384
+ cursor: default;
1385
+ }
1386
+
1387
+ .bs-hint {
1208
1388
  color: var(--bs-ink-light);
1209
1389
  font-size: var(--bs-text-xs);
1210
- padding: 0.5rem 0.75rem 0 0.75rem;
1390
+ padding: 0;
1211
1391
  margin: 0;
1212
1392
  list-style: none;
1213
1393
  }
1214
1394
 
1215
- :where(.hints[data-error]) {
1395
+ .bs-hint:where([data-error]) {
1216
1396
  color: var(--bs-red-400);
1217
1397
  }
1218
1398
 
@@ -1268,7 +1448,7 @@ a.button {
1268
1448
 
1269
1449
  /* ------------------------------ Background Colors ------------------------------ */
1270
1450
 
1271
- :where(.box, [class*="bg-"]:not([class~="bg-white"])) .bs-pill:where(:not([data-variant^="live"], [data-variant^="restricted"], [data-active])) {
1451
+ :where(.box, [class*="bg-"]:not([class~="bg-white"])) .bs-pill:where(:not([data-variant^="live"], [data-active])) {
1272
1452
  --pill-background: var(--bs-bg-base);
1273
1453
  }
1274
1454
 
@@ -1414,28 +1594,6 @@ a.button {
1414
1594
  content: url("data:image/svg+xml,%3Csvg width='8' height='8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 .703 7.297 0 4 3.297.703 0 0 .703 3.297 4 0 7.297.703 8 4 4.703 7.297 8 8 7.297 4.703 4 8 .703Z' fill='%230A0B19'/%3E%3C/svg%3E%0A");
1415
1595
  }
1416
1596
 
1417
- /* ------------------------------ Restricted Styles ------------------------------ */
1418
-
1419
- .bs-pill:where([data-variant^="restricted"]) {
1420
- --pill-background: var(--bs-gray-400);
1421
- --pill-text: var(--bs-white);
1422
- --pill-gap: var(--bs-space-1);
1423
- }
1424
-
1425
- .bs-pill:where([data-variant^="restricted"]):hover {
1426
- --pill-border: transparent;
1427
- }
1428
-
1429
- .bs-pill:where([data-variant^="restricted"])::before {
1430
- content: url("data:image/svg+xml,%3Csvg width='11' height='12' viewBox='0 0 8 9' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.25 4.5H7v3.715a.34.34 0 0 1-.37.285H1V5.285A.34.34 0 0 1 1.37 5h5a.25.25 0 0 0 .25-.25V3.275A2.545 2.545 0 0 0 4 1a2.55 2.55 0 0 0-2.625 2.29L1.39 4.5a.83.83 0 0 0-.89.785V8.75A.25.25 0 0 0 .75 9h5.88a.835.835 0 0 0 .87-.785V4.75a.25.25 0 0 0-.25-.25Zm-2.225 0H2.96V3.425c0-.035 0-.845 1.03-.845a.96.96 0 0 1 1.035.8V4.5ZM4 1.5a2.045 2.045 0 0 1 2.115 1.79V4.5h-.59V3.37A1.455 1.455 0 0 0 4 2.075a1.385 1.385 0 0 0-1.53 1.35V4.5h-.58V3.31A2.045 2.045 0 0 1 4 1.5Zm-.495 4.25H1.5v.5h2.005v-.5Zm-2.005 1h1.505v.5H1.5v-.5Z' fill='%23F0F0FA'/%3E%3C/svg%3E");
1431
- line-height: 1.1;
1432
- }
1433
-
1434
- :where(.dark) .bs-pill:where([data-variant^="restricted"]) {
1435
- --pill-background: var(--bs-navy-300);
1436
- --pill-text: var(--bs-white);
1437
- }
1438
-
1439
1597
  /* ------------------------------ Live Now Styles ------------------------------ */
1440
1598
 
1441
1599
  .bs-pill:where([data-variant^="live"]) {
@@ -1470,8 +1628,8 @@ a.button {
1470
1628
  --pill-border: var(--bs-gray-400);
1471
1629
  }
1472
1630
 
1473
- .profile-img,
1474
- .profile-img:where([data-img-size^='sm']) {
1631
+ .bs-profile-img,
1632
+ .bs-profile-img:where([data-img-size^='sm']) {
1475
1633
  --profile-size: 2rem;
1476
1634
  --profile-text: var(--bs-text-sm);
1477
1635
 
@@ -1483,19 +1641,19 @@ a.button {
1483
1641
  width: var(--profile-size);
1484
1642
  }
1485
1643
 
1486
- .profile-img :where(img) {
1644
+ .bs-profile-img :where(img) {
1487
1645
  height: 100%;
1488
1646
  -o-object-fit: cover;
1489
1647
  object-fit: cover;
1490
1648
  width: 100%;
1491
1649
  }
1492
1650
 
1493
- .profile-img:where([data-no-img]) img {
1651
+ .bs-profile-img:where([data-no-img]) img {
1494
1652
  display: none;
1495
1653
  }
1496
1654
 
1497
- .profile-img::before,
1498
- .profile-img::after {
1655
+ .bs-profile-img::before,
1656
+ .bs-profile-img::after {
1499
1657
  border-radius: 50%;
1500
1658
  border-collapse: collapse;
1501
1659
  height: 100%;
@@ -1506,18 +1664,18 @@ a.button {
1506
1664
 
1507
1665
  /* Shadow */
1508
1666
 
1509
- .profile-img::before {
1667
+ .bs-profile-img::before {
1510
1668
  box-shadow: var(--bs-shadow-profilePhoto);
1511
1669
  content: '';
1512
1670
  }
1513
1671
 
1514
- .profile-img:where([data-no-img])::before {
1672
+ .bs-profile-img:where([data-no-img])::before {
1515
1673
  display: none;
1516
1674
  }
1517
1675
 
1518
1676
  /* Initials */
1519
1677
 
1520
- .profile-img:where([data-no-img])::after {
1678
+ .bs-profile-img:where([data-no-img])::after {
1521
1679
  border: 1px solid currentColor;
1522
1680
  color: var(--bs-blue-500);
1523
1681
  content: attr(data-initials);
@@ -1529,36 +1687,36 @@ a.button {
1529
1687
 
1530
1688
  /* Profile Sizes */
1531
1689
 
1532
- .profile-img:where([data-img-size^='xs']) {
1690
+ .bs-profile-img:where([data-img-size^='xs']) {
1533
1691
  --profile-size: 1.5rem;
1534
1692
  --profile-text: var(--bs-text-xs);
1535
1693
  }
1536
1694
 
1537
- .profile-img:where([data-img-size^='md']) {
1695
+ .bs-profile-img:where([data-img-size^='md']) {
1538
1696
  --profile-size: 3rem;
1539
1697
  --profile-text: var(--bs-text-md);
1540
1698
  }
1541
1699
 
1542
- .profile-img:where([data-img-size^='lg']) {
1700
+ .bs-profile-img:where([data-img-size^='lg']) {
1543
1701
  --profile-size: 4rem;
1544
1702
  --profile-text: var(--bs-text-lg);
1545
1703
  }
1546
1704
 
1547
- .profile-img:where([data-img-size^='xl']) {
1705
+ .bs-profile-img:where([data-img-size^='xl']) {
1548
1706
  --profile-size: 5.75rem;
1549
1707
  --profile-text: var(--bs-text-xl);
1550
1708
  }
1551
1709
 
1552
- :where(.profile-details) {
1710
+ .bs-profile-details {
1553
1711
  color: var(--bs-ink-light);
1554
1712
  font-size: var(--bs-text-sm);
1555
1713
  }
1556
1714
 
1557
- :where(.profile-details > *) {
1715
+ .bs-profile-details > :where(*) {
1558
1716
  display: block;
1559
1717
  }
1560
1718
 
1561
- :where(.profile-details > *:first-child) {
1719
+ .bs-profile-details > :where(*:first-child) {
1562
1720
  --profile-name-color: var(--bs-ink-base);
1563
1721
 
1564
1722
  color: var(--profile-name-color);
@@ -1566,13 +1724,13 @@ a.button {
1566
1724
 
1567
1725
  /* Profile with User Details */
1568
1726
 
1569
- :where(.profile[data-layout]),
1570
- :where(.profile[data-layout^='vertical']) {
1727
+ .bs-profile:where([data-layout]),
1728
+ .bs-profile:where([data-layout^='vertical']) {
1571
1729
  display: grid;
1572
1730
  row-gap: 0.5rem;
1573
1731
  }
1574
1732
 
1575
- :where(.profile[data-layout^='horizontal']) {
1733
+ .bs-profile:where([data-layout^='horizontal']) {
1576
1734
  -moz-column-gap: 1rem;
1577
1735
  column-gap: 1rem;
1578
1736
  grid-template-columns: auto 1fr;
@@ -1581,19 +1739,19 @@ a.button {
1581
1739
 
1582
1740
  /* When wrapped in a link */
1583
1741
 
1584
- a.profile[data-layout] {
1742
+ a.bs-profile:where([data-layout]) {
1585
1743
  text-decoration: none;
1586
1744
  }
1587
1745
 
1588
- a.profile[data-layout] .profile-details > *:first-child {
1746
+ a.bs-profile:where([data-layout]) .bs-profile-details > *:first-child {
1589
1747
  --profile-name-color: var(--bs-blue-500);
1590
1748
  }
1591
1749
 
1592
- a.profile[data-layout]:hover .profile-details > *:first-child {
1750
+ a.bs-profile:where([data-layout]):hover .bs-profile-details > *:first-child {
1593
1751
  text-decoration: underline;
1594
1752
  }
1595
1753
 
1596
- .dark a.profile[data-layout] .profile-details > *:first-child {
1754
+ .dark a.bs-profile:where([data-layout]) .bs-profile-details > *:first-child {
1597
1755
  --profile-name-color: var(--bs-blue-200);
1598
1756
  }
1599
1757
 
@@ -1719,6 +1877,11 @@ table:where([data-sticky^="left"]) :is(td:first-child, th:first-child) {
1719
1877
  justify-content: flex-start;
1720
1878
  }
1721
1879
 
1880
+ :where(.cluster[data-variant^="brick"]) > * {
1881
+ align-self: stretch;
1882
+ flex-grow: 1;
1883
+ }
1884
+
1722
1885
  .cluster[data-gap="tight"] {
1723
1886
  gap: var(--cluster-space, var(--bs-space-2));
1724
1887
  }