@primer/css 20.0.0-rc.645e2ab2 → 20.0.0-rc.7b88bc5d

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 (173) hide show
  1. package/CHANGELOG.md +162 -3
  2. package/CONTRIBUTING.md +6 -4
  3. package/DEVELOP.md +26 -21
  4. package/README.md +2 -2
  5. package/actionlist/action-list-item-divider.scss +8 -2
  6. package/actionlist/action-list-item.scss +213 -129
  7. package/actionlist/action-list-tree.scss +118 -0
  8. package/actionlist/action-list.scss +29 -0
  9. package/actionlist/index.scss +1 -0
  10. package/alerts/flash.scss +6 -2
  11. package/autocomplete/autocomplete.scss +58 -1
  12. package/avatars/avatar-stack.scss +1 -0
  13. package/base/base.scss +63 -3
  14. package/base/kbd.scss +0 -1
  15. package/base/normalize.scss +13 -53
  16. package/base/typography-base.scss +3 -2
  17. package/blankslate/blankslate.scss +20 -1
  18. package/box/box-overlay.scss +2 -0
  19. package/box/box.scss +0 -3
  20. package/branch-name/branch-name.scss +1 -0
  21. package/buttons/button.scss +55 -27
  22. package/buttons/misc.scss +25 -19
  23. package/color-modes/index.scss +2 -0
  24. package/color-modes/native.scss +11 -0
  25. package/color-modes/themes/dark_tritanopia.scss +6 -0
  26. package/color-modes/themes/light_tritanopia.scss +6 -0
  27. package/dist/actionlist.css +1 -1
  28. package/dist/actionlist.css.map +1 -1
  29. package/dist/alerts.css +1 -1
  30. package/dist/alerts.css.map +1 -1
  31. package/dist/autocomplete.css +1 -1
  32. package/dist/autocomplete.css.map +1 -1
  33. package/dist/avatars.css +1 -1
  34. package/dist/avatars.css.map +1 -1
  35. package/dist/base.css +1 -1
  36. package/dist/base.css.map +1 -1
  37. package/dist/blankslate.css +1 -1
  38. package/dist/blankslate.css.map +1 -1
  39. package/dist/box.css.map +1 -1
  40. package/dist/branch-name.css +1 -1
  41. package/dist/branch-name.css.map +1 -1
  42. package/dist/breadcrumb.css.map +1 -1
  43. package/dist/buttons.css +1 -1
  44. package/dist/buttons.css.map +1 -1
  45. package/dist/color-modes.css +1 -1
  46. package/dist/color-modes.css.map +1 -1
  47. package/dist/core.css +1 -1
  48. package/dist/core.css.map +1 -1
  49. package/dist/dropdown.css +1 -1
  50. package/dist/dropdown.css.map +1 -1
  51. package/dist/forms.css +1 -1
  52. package/dist/forms.css.map +1 -1
  53. package/dist/header.css.map +1 -1
  54. package/dist/labels.css +1 -1
  55. package/dist/labels.css.map +1 -1
  56. package/dist/layout.css +1 -1
  57. package/dist/layout.css.map +1 -1
  58. package/dist/links.css +1 -1
  59. package/dist/links.css.map +1 -1
  60. package/dist/loaders.css.map +1 -1
  61. package/dist/markdown.css +1 -1
  62. package/dist/markdown.css.map +1 -1
  63. package/dist/marketing-buttons.css +1 -1
  64. package/dist/marketing-buttons.css.map +1 -1
  65. package/dist/marketing-links.css +1 -1
  66. package/dist/marketing-links.css.map +1 -1
  67. package/dist/marketing-type.css.map +1 -1
  68. package/dist/marketing-utilities.css.map +1 -1
  69. package/dist/marketing.css +1 -1
  70. package/dist/marketing.css.map +1 -1
  71. package/dist/meta.json +106 -106
  72. package/dist/navigation.css +1 -1
  73. package/dist/navigation.css.map +1 -1
  74. package/dist/pagination.css +1 -1
  75. package/dist/pagination.css.map +1 -1
  76. package/dist/popover.css +1 -1
  77. package/dist/popover.css.map +1 -1
  78. package/dist/primer.css +4 -4
  79. package/dist/primer.css.map +1 -1
  80. package/dist/product.css +1 -1
  81. package/dist/product.css.map +1 -1
  82. package/dist/progress.css.map +1 -1
  83. package/dist/select-menu.css.map +1 -1
  84. package/dist/stats/actionlist.json +1 -1
  85. package/dist/stats/alerts.json +1 -1
  86. package/dist/stats/autocomplete.json +1 -1
  87. package/dist/stats/avatars.json +1 -1
  88. package/dist/stats/base.json +1 -1
  89. package/dist/stats/blankslate.json +1 -1
  90. package/dist/stats/branch-name.json +1 -1
  91. package/dist/stats/buttons.json +1 -1
  92. package/dist/stats/color-modes.json +1 -1
  93. package/dist/stats/core.json +1 -1
  94. package/dist/stats/dropdown.json +1 -1
  95. package/dist/stats/forms.json +1 -1
  96. package/dist/stats/labels.json +1 -1
  97. package/dist/stats/layout.json +1 -1
  98. package/dist/stats/links.json +1 -1
  99. package/dist/stats/markdown.json +1 -1
  100. package/dist/stats/marketing-buttons.json +1 -1
  101. package/dist/stats/marketing-links.json +1 -1
  102. package/dist/stats/marketing.json +1 -1
  103. package/dist/stats/navigation.json +1 -1
  104. package/dist/stats/pagination.json +1 -1
  105. package/dist/stats/popover.json +1 -1
  106. package/dist/stats/primer.json +1 -1
  107. package/dist/stats/product.json +1 -1
  108. package/dist/stats/subhead.json +1 -1
  109. package/dist/stats/toasts.json +1 -1
  110. package/dist/stats/tooltips.json +1 -1
  111. package/dist/stats/utilities.json +1 -1
  112. package/dist/subhead.css +1 -1
  113. package/dist/subhead.css.map +1 -1
  114. package/dist/table-object.css.map +1 -1
  115. package/dist/timeline.css.map +1 -1
  116. package/dist/toasts.css +1 -1
  117. package/dist/toasts.css.map +1 -1
  118. package/dist/tooltips.css +1 -1
  119. package/dist/tooltips.css.map +1 -1
  120. package/dist/truncate.css.map +1 -1
  121. package/dist/utilities.css +1 -1
  122. package/dist/utilities.css.map +1 -1
  123. package/dist/variables.json +34 -34
  124. package/dropdown/dropdown.scss +0 -2
  125. package/forms/form-control.scss +24 -5
  126. package/forms/form-group.scss +48 -13
  127. package/forms/form-validation.scss +12 -7
  128. package/forms/input-group.scss +18 -0
  129. package/labels/labels.scss +11 -1
  130. package/labels/mixins.scss +7 -2
  131. package/labels/states.scss +2 -2
  132. package/layout/grid-offset.scss +1 -0
  133. package/layout/grid.scss +1 -0
  134. package/layout/index.scss +1 -0
  135. package/layout/layout.scss +5 -4
  136. package/layout/mixins.scss +27 -1
  137. package/layout/page-layout.scss +384 -0
  138. package/links/link.scss +6 -1
  139. package/markdown/code.scss +5 -0
  140. package/markdown/footnotes.scss +38 -26
  141. package/markdown/headings.scss +17 -0
  142. package/markdown/images.scss +1 -1
  143. package/markdown/markdown-body.scss +0 -8
  144. package/marketing/buttons/button.scss +32 -26
  145. package/marketing/links/link.scss +5 -5
  146. package/marketing/type/typography.scss +18 -0
  147. package/marketing/utilities/layout.scss +1 -0
  148. package/navigation/filter-list.scss +18 -0
  149. package/navigation/menu.scss +6 -8
  150. package/navigation/sidenav.scss +1 -10
  151. package/navigation/subnav.scss +19 -0
  152. package/navigation/tabnav.scss +7 -2
  153. package/navigation/underline-nav.scss +51 -46
  154. package/package.json +32 -25
  155. package/pagination/pagination.scss +62 -4
  156. package/popover/popover.scss +2 -2
  157. package/select-menu/select-menu.scss +1 -1
  158. package/subhead/subhead.scss +3 -0
  159. package/support/mixins/color-modes.scss +2 -0
  160. package/support/mixins/layout.scss +1 -0
  161. package/support/mixins/misc.scss +28 -5
  162. package/support/variables/layout.scss +3 -3
  163. package/table-object/table-object.scss +3 -0
  164. package/timeline/timeline-item.scss +2 -1
  165. package/toasts/toasts.scss +7 -4
  166. package/tooltips/tooltips.scss +0 -7
  167. package/utilities/colors.scss +16 -0
  168. package/utilities/details.scss +81 -4
  169. package/utilities/layout.scss +1 -1
  170. package/utilities/margin.scss +4 -1
  171. package/utilities/padding.scss +3 -1
  172. package/utilities/visibility-display.scss +52 -3
  173. package/table-object/README.md +0 -25
@@ -1,37 +1,49 @@
1
1
  // stylelint-disable selector-max-type
2
2
  // stylelint-disable selector-max-compound-selectors
3
3
 
4
- .markdown-body .footnotes {
5
- font-size: $h6-size;
6
- color: var(--color-fg-muted);
7
- border-top: $border;
4
+ .markdown-body {
5
+ [data-footnote-ref] {
6
+ &::before {
7
+ content: '[';
8
+ }
8
9
 
9
- ol {
10
- padding-left: $spacer-3;
10
+ &::after {
11
+ content: ']';
12
+ }
11
13
  }
12
14
 
13
- li {
14
- position: relative;
15
- }
15
+ .footnotes {
16
+ font-size: $h6-size;
17
+ color: var(--color-fg-muted);
18
+ border-top: $border;
16
19
 
17
- li:target::before {
18
- position: absolute;
19
- top: -$spacer-2;
20
- right: -$spacer-2;
21
- bottom: -$spacer-2;
22
- left: -$spacer-4;
23
- pointer-events: none;
24
- content: '';
25
- // stylelint-disable-next-line primer/borders
26
- border: 2px $border-style var(--color-accent-emphasis);
27
- border-radius: $border-radius;
28
- }
20
+ ol {
21
+ padding-left: $spacer-3;
22
+ }
29
23
 
30
- li:target {
31
- color: var(--color-fg-default);
32
- }
24
+ li {
25
+ position: relative;
26
+ }
27
+
28
+ li:target::before {
29
+ position: absolute;
30
+ top: -$spacer-2;
31
+ right: -$spacer-2;
32
+ bottom: -$spacer-2;
33
+ left: -$spacer-4;
34
+ pointer-events: none;
35
+ content: '';
36
+ // stylelint-disable-next-line primer/borders
37
+ border: 2px $border-style var(--color-accent-emphasis);
38
+ border-radius: $border-radius;
39
+ }
40
+
41
+ li:target {
42
+ color: var(--color-fg-default);
43
+ }
33
44
 
34
- .data-footnote-backref g-emoji {
35
- font-family: monospace;
45
+ .data-footnote-backref g-emoji {
46
+ font-family: monospace;
47
+ }
36
48
  }
37
49
  }
@@ -71,4 +71,21 @@
71
71
  font-size: 0.85em;
72
72
  color: var(--color-fg-muted);
73
73
  }
74
+
75
+ summary {
76
+ h1,
77
+ h2,
78
+ h3,
79
+ h4,
80
+ h5,
81
+ h6 {
82
+ display: inline-block;
83
+ }
84
+
85
+ h1,
86
+ h2 {
87
+ padding-bottom: 0;
88
+ border-bottom: 0;
89
+ }
90
+ }
74
91
  }
@@ -24,7 +24,7 @@
24
24
  .emoji {
25
25
  max-width: none;
26
26
  vertical-align: text-top;
27
- // Override `<img>` styles so Emjois don't clash with zebra striping in our tables
27
+ // Override `<img>` styles so Emojis don't clash with zebra striping in our tables
28
28
  background-color: transparent;
29
29
  }
30
30
 
@@ -93,12 +93,4 @@
93
93
  margin-bottom: 0;
94
94
  }
95
95
  }
96
-
97
- sup > a::before {
98
- content: '[';
99
- }
100
-
101
- sup > a::after {
102
- content: ']';
103
- }
104
96
  }
@@ -13,11 +13,13 @@
13
13
  white-space: nowrap;
14
14
  vertical-align: middle;
15
15
  user-select: none;
16
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%), var(--color-mktg-btn-bg) !important;
16
+ background:
17
+ linear-gradient(180deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%),
18
+ var(--color-mktg-btn-bg) !important;
17
19
  border: 0;
18
20
  // stylelint-disable-next-line primer/borders
19
21
  border-radius: 0.375rem;
20
- transition: box-shadow 0.2s;
22
+ transition: box-shadow 0.2s, outline 0.2s ease;
21
23
  appearance: none !important;
22
24
 
23
25
  &::before {
@@ -42,29 +44,32 @@
42
44
  box-shadow: var(--color-mktg-btn-shadow-hover) !important;
43
45
  }
44
46
 
45
- &:focus,
46
- &.focus {
47
- outline: 0;
48
- box-shadow: var(--color-mktg-btn-shadow-focus), var(--color-mktg-btn-shadow-hover) !important;
49
- }
50
-
51
47
  &:hover,
52
48
  &:focus,
49
+ &:focus-visible,
53
50
  &.focus {
54
51
  &::before {
55
52
  opacity: 1;
56
53
  }
54
+ }
55
+
56
+ // fallback :focus state
57
+ &:focus {
58
+ @include focusOutline(2px, var(--color-accent-fg));
57
59
 
58
- &:disabled {
59
- box-shadow: none !important;
60
+ // remove fallback :focus if :focus-visible is supported
61
+ &:not(:focus-visible) {
62
+ outline: solid 1px transparent;
63
+ box-shadow: none;
60
64
  }
61
65
  }
62
66
 
63
- &:active {
64
- outline: none;
65
- // stylelint-disable-next-line primer/box-shadow
66
- box-shadow: 0 0 0 transparent;
67
+ // default focus state
68
+ &:focus-visible {
69
+ @include focusOutline(2px, var(--color-accent-fg));
70
+ }
67
71
 
72
+ &:active {
68
73
  &::before {
69
74
  opacity: 0.5 !important;
70
75
  }
@@ -91,11 +96,6 @@
91
96
  box-shadow: var(--color-mktg-btn-shadow-hover-muted) !important;
92
97
  }
93
98
 
94
- &:focus,
95
- &.focus {
96
- box-shadow: var(--color-mktg-btn-shadow-hover-muted), var(--color-mktg-btn-shadow-focus) !important;
97
- }
98
-
99
99
  &:active {
100
100
  // stylelint-disable-next-line primer/box-shadow
101
101
  box-shadow: var(--color-fg-default) 0 0 0 3px inset !important;
@@ -119,11 +119,6 @@
119
119
  &:hover {
120
120
  box-shadow: var(--color-mktg-btn-shadow-hover-muted) !important;
121
121
  }
122
-
123
- &:focus,
124
- .focus {
125
- box-shadow: var(--color-mktg-btn-shadow-hover-muted), var(--color-mktg-btn-shadow-focus) !important;
126
- }
127
122
  }
128
123
 
129
124
  .btn-signup-mktg {
@@ -137,9 +132,20 @@
137
132
  background: linear-gradient(180deg, rgba(52, 183, 89, 0.15) 0%, rgba(46, 164, 79, 0) 100%) !important;
138
133
  }
139
134
 
135
+ // fallback :focus state
140
136
  &:focus {
141
- // stylelint-disable-next-line primer/box-shadow
142
- box-shadow: rgba(46, 164, 79, 0.45) 0 0 0 4px !important;
137
+ @include focusOutline(2px, var(--color-accent-fg));
138
+
139
+ // remove fallback :focus if :focus-visible is supported
140
+ &:not(:focus-visible) {
141
+ outline: solid 1px transparent;
142
+ box-shadow: none;
143
+ }
144
+ }
145
+
146
+ // default focus state
147
+ &:focus-visible {
148
+ @include focusOutline(2px, var(--color-accent-fg));
143
149
  }
144
150
  }
145
151
 
@@ -6,10 +6,6 @@
6
6
  text-decoration: none;
7
7
  }
8
8
 
9
- &:active {
10
- outline: none;
11
- }
12
-
13
9
  &::after,
14
10
  &.link-emphasis-mktg::before {
15
11
  position: absolute;
@@ -35,13 +31,17 @@
35
31
  }
36
32
 
37
33
  &:hover,
38
- &:focus,
39
34
  &:active {
40
35
  &::after {
41
36
  transform: scaleX(1);
42
37
  }
43
38
  }
44
39
 
40
+ &:focus,
41
+ &:focus-visible {
42
+ outline-offset: 2px;
43
+ }
44
+
45
45
  &.arrow-target-mktg {
46
46
  .arrow-symbol-mktg {
47
47
  margin-left: -$em-spacer-3;
@@ -15,18 +15,25 @@
15
15
 
16
16
  @each $header, $sizes in $mktg-headers {
17
17
  .h#{$header}-mktg {
18
+ // stylelint-disable-next-line function-no-unknown
18
19
  $pairing: map-get($mktg-header-pairings, nth($sizes, 1));
20
+ // stylelint-disable-next-line function-no-unknown
19
21
  $pairing-md: map-get($mktg-header-pairings, nth($sizes, 2));
22
+ // stylelint-disable-next-line function-no-unknown
20
23
  $pairing-lg: map-get($mktg-header-pairings, nth($sizes, 3));
21
24
 
25
+ // stylelint-disable-next-line function-no-unknown
22
26
  font-size: map-get($pairing, 'size') !important;
27
+ // stylelint-disable-next-line function-no-unknown
23
28
  line-height: map-get($pairing, 'lh') !important;
24
29
 
25
30
  @if (map-get($pairing, 'size') >= $mktg-header-weight-threshold) { font-weight: $mktg-header-weight-large !important; }
26
31
 
27
32
  @if (nth($sizes, 1) != nth($sizes, 2)) {
28
33
  @include breakpoint(md) {
34
+ // stylelint-disable-next-line function-no-unknown
29
35
  font-size: map-get($pairing-md, 'size') !important;
36
+ // stylelint-disable-next-line function-no-unknown
30
37
  line-height: map-get($pairing-md, 'lh') !important;
31
38
 
32
39
  @if (map-get($pairing-md, 'size') >= $mktg-header-spacing-threshold and map-get($pairing, 'size') < $mktg-header-spacing-threshold) {
@@ -41,7 +48,9 @@
41
48
 
42
49
  @if (nth($sizes, 2) != nth($sizes, 3)) {
43
50
  @include breakpoint(lg) {
51
+ // stylelint-disable-next-line function-no-unknown
44
52
  font-size: map-get($pairing-lg, 'size') !important;
53
+ // stylelint-disable-next-line function-no-unknown
45
54
  line-height: map-get($pairing-lg, 'lh') !important;
46
55
 
47
56
  @if (map-get($pairing-lg, 'size') >= $mktg-header-spacing-threshold and map-get($pairing-md, 'size') < $mktg-header-spacing-threshold) {
@@ -70,11 +79,16 @@
70
79
 
71
80
  @each $body, $sizes in $mktg-bodies {
72
81
  .f#{$body}-mktg {
82
+ // stylelint-disable-next-line function-no-unknown
73
83
  $pairing: map-get($mktg-body-pairings, nth($sizes, 1));
84
+ // stylelint-disable-next-line function-no-unknown
74
85
  $pairing-md: map-get($mktg-body-pairings, nth($sizes, 2));
86
+ // stylelint-disable-next-line function-no-unknown
75
87
  $pairing-lg: map-get($mktg-body-pairings, nth($sizes, 3));
76
88
 
89
+ // stylelint-disable-next-line function-no-unknown
77
90
  font-size: map-get($pairing, 'size') !important;
91
+ // stylelint-disable-next-line function-no-unknown
78
92
  line-height: map-get($pairing, 'lh') !important;
79
93
 
80
94
  @if (map-get($pairing, 'size') >= $mktg-body-spacing-threshold) { letter-spacing: $mktg-body-spacing-large !important; }
@@ -83,7 +97,9 @@
83
97
 
84
98
  @if (nth($sizes, 1) != nth($sizes, 2)) {
85
99
  @include breakpoint(md) {
100
+ // stylelint-disable-next-line function-no-unknown
86
101
  font-size: map-get($pairing-md, 'size') !important;
102
+ // stylelint-disable-next-line function-no-unknown
87
103
  line-height: map-get($pairing-md, 'lh') !important;
88
104
 
89
105
  @if (map-get($pairing-md, 'size') >= $mktg-body-spacing-threshold and map-get($pairing, 'size') < $mktg-body-spacing-threshold) {
@@ -98,7 +114,9 @@
98
114
 
99
115
  @if (nth($sizes, 2) != nth($sizes, 3)) {
100
116
  @include breakpoint(lg) {
117
+ // stylelint-disable-next-line function-no-unknown
101
118
  font-size: map-get($pairing-lg, 'size') !important;
119
+ // stylelint-disable-next-line function-no-unknown
102
120
  line-height: map-get($pairing-lg, 'lh') !important;
103
121
 
104
122
  @if (map-get($pairing-lg, 'size') >= $mktg-body-spacing-threshold and map-get($pairing-md, 'size') < $mktg-body-spacing-threshold) {
@@ -27,6 +27,7 @@
27
27
  @each $breakpoint, $variant in $responsive-variants {
28
28
  @include breakpoint($breakpoint) {
29
29
  @for $offset from 1 through 7 {
30
+ // stylelint-disable-next-line primer/spacing, function-no-unknown
30
31
  .offset#{$variant}-n#{$offset} { margin-left: -($offset * 0.0833333333 * 100%); }
31
32
  }
32
33
  }
@@ -1,3 +1,5 @@
1
+ // stylelint-disable selector-max-specificity
2
+
1
3
  // Filters list
2
4
  //
3
5
  // A vertical list of filters.
@@ -45,6 +47,22 @@
45
47
  &[aria-current]:not([aria-current='false']) {
46
48
  color: var(--color-fg-on-emphasis);
47
49
  background-color: var(--color-accent-emphasis);
50
+
51
+ // fallback :focus state
52
+ &:focus {
53
+ @include focusOutlineOnEmphasis;
54
+
55
+ // remove fallback :focus if :focus-visible is supported
56
+ &:not(:focus-visible) {
57
+ outline: solid 1px transparent;
58
+ box-shadow: none;
59
+ }
60
+ }
61
+
62
+ // default focus state
63
+ &:focus-visible {
64
+ @include focusOutlineOnEmphasis;
65
+ }
48
66
  }
49
67
 
50
68
  .count {
@@ -22,7 +22,9 @@
22
22
  border-top-left-radius: $border-radius;
23
23
  border-top-right-radius: $border-radius;
24
24
 
25
- &::before { border-top-left-radius: $border-radius; }
25
+ &::before {
26
+ border-top-left-radius: $border-radius;
27
+ }
26
28
  }
27
29
 
28
30
  &:last-child {
@@ -30,13 +32,9 @@
30
32
  border-bottom-right-radius: $border-radius;
31
33
  border-bottom-left-radius: $border-radius;
32
34
 
33
- &::before { border-bottom-left-radius: $border-radius; }
34
- }
35
-
36
- &:focus {
37
- z-index: 1;
38
- outline: none;
39
- box-shadow: var(--color-primer-shadow-focus);
35
+ &::before {
36
+ border-bottom-left-radius: $border-radius;
37
+ }
40
38
  }
41
39
 
42
40
  &:hover {
@@ -43,16 +43,9 @@
43
43
 
44
44
  // States
45
45
 
46
- .SideNav-item:focus {
47
- z-index: 1;
48
- outline: none;
49
- box-shadow: var(--color-primer-shadow-focus);
50
- }
51
-
52
46
  .SideNav-item:hover {
53
47
  text-decoration: none;
54
48
  background-color: var(--color-neutral-subtle);
55
- outline: none;
56
49
  }
57
50
 
58
51
  .SideNav-item:active {
@@ -94,11 +87,9 @@
94
87
  border: 0;
95
88
  }
96
89
 
97
- .SideNav-subItem:hover,
98
- .SideNav-subItem:focus {
90
+ .SideNav-subItem:hover {
99
91
  color: var(--color-fg-default);
100
92
  text-decoration: none;
101
- outline: none;
102
93
  }
103
94
 
104
95
  .SideNav-subItem[aria-current]:not([aria-current='false']),
@@ -1,3 +1,5 @@
1
+ // stylelint-disable selector-max-specificity
2
+
1
3
  // Needs refactoring
2
4
  // Sub nav
3
5
  .subnav {
@@ -46,6 +48,22 @@
46
48
  color: var(--color-fg-on-emphasis);
47
49
  background-color: var(--color-accent-emphasis);
48
50
  border-color: var(--color-accent-emphasis);
51
+
52
+ // fallback :focus state
53
+ &:focus {
54
+ @include focusOutlineOnEmphasis;
55
+
56
+ // remove fallback :focus if :focus-visible is supported
57
+ &:not(:focus-visible) {
58
+ outline: solid 1px transparent;
59
+ box-shadow: none;
60
+ }
61
+ }
62
+
63
+ // default focus state
64
+ &:focus-visible {
65
+ @include focusOutlineOnEmphasis;
66
+ }
49
67
  }
50
68
 
51
69
  &:first-child {
@@ -72,6 +90,7 @@
72
90
  }
73
91
 
74
92
  .subnav-search-input-wide {
93
+ // stylelint-disable-next-line primer/responsive-widths
75
94
  width: 500px;
76
95
  }
77
96
 
@@ -40,13 +40,18 @@
40
40
  }
41
41
  }
42
42
 
43
- &:hover,
44
- &:focus {
43
+ &:hover {
45
44
  color: var(--color-fg-default);
46
45
  text-decoration: none;
47
46
  transition-duration: 0.1s;
48
47
  }
49
48
 
49
+ &:focus,
50
+ &:focus-visible {
51
+ border-radius: $border-radius $border-radius 0 0 !important;
52
+ outline-offset: -6px;
53
+ }
54
+
50
55
  &:active {
51
56
  color: var(--color-fg-muted);
52
57
  }
@@ -1,3 +1,4 @@
1
+ // stylelint-disable selector-max-specificity
1
2
  $nav-height: $spacer-3 * 3 !default; // 48px
2
3
 
3
4
  .UnderlineNav {
@@ -34,57 +35,61 @@ $nav-height: $spacer-3 * 3 !default; // 48px
34
35
  border-radius: $border-radius;
35
36
  align-items: center;
36
37
 
37
- // renders a visibly hidden "copy" of the label in bold, reserving box space for when label becomes bold on selected
38
- [data-content]::before {
39
- display: block;
40
- height: 0;
41
- font-weight: $font-weight-bold;
42
- visibility: hidden;
43
- content: attr(data-content);
44
- }
45
-
46
- // increase touch target area
47
- &::before {
48
- @include minTouchTarget($min-height: $nav-height);
49
- }
50
-
51
- // hover state was "sticking" on mobile after click
52
- @media (pointer: fine) {
53
- &:hover {
54
- color: var(--color-fg-default);
55
- text-decoration: none;
56
- background: var(--color-action-list-item-default-hover-bg);
57
- transition: background 0.12s ease-out;
58
- }
59
- }
60
-
61
- &.selected,
62
- &[role='tab'][aria-selected='true'],
63
- &[aria-current]:not([aria-current='false']) {
64
- font-weight: $font-weight-bold;
38
+ &:hover,
39
+ &:focus,
40
+ &:focus-visible {
65
41
  color: var(--color-fg-default);
42
+ text-decoration: none;
43
+ border-bottom-color: var(--color-neutral-muted);
44
+ outline-offset: -8px;
45
+ transition: border-bottom-color 0.12s ease-out;
46
+
47
+ // renders a visibly hidden "copy" of the label in bold, reserving box space for when label becomes bold on selected
48
+ [data-content]::before {
49
+ display: block;
50
+ height: 0;
51
+ font-weight: $font-weight-bold;
52
+ visibility: hidden;
53
+ content: attr(data-content);
54
+ }
66
55
 
67
- // current/selected underline
68
- &::after {
69
- position: absolute;
70
- right: 50%;
71
- // 48px total height / 2 (24px) + 1px
72
- bottom: calc(50% - 25px);
73
- width: 100%;
74
- height: 2px;
75
- content: '';
76
- background: var(--color-primer-border-active);
77
- border-radius: $border-radius;
78
- transform: translate(50%, -50%);
56
+ // increase touch target area
57
+ &::before {
58
+ @include minTouchTarget($min-height: $nav-height);
79
59
  }
80
- }
81
60
 
82
- // remove when global focus state is merged
83
- &.focus,
84
- &:focus {
85
- @include focusOutline;
61
+ // hover state was "sticking" on mobile after click
62
+ @media (pointer: fine) {
63
+ &:hover {
64
+ color: var(--color-fg-default);
65
+ text-decoration: none;
66
+ background: var(--color-action-list-item-default-hover-bg);
67
+ transition: background 0.12s ease-out;
68
+ }
69
+ }
86
70
 
87
- outline-offset: -2px;
71
+ &.selected,
72
+ &[role='tab'][aria-selected='true'],
73
+ &[aria-current]:not([aria-current='false']) {
74
+ font-weight: $font-weight-bold;
75
+ color: var(--color-fg-default);
76
+ border-bottom-color: var(--color-primer-border-active);
77
+ outline-offset: -8px;
78
+
79
+ // current/selected underline
80
+ &::after {
81
+ position: absolute;
82
+ right: 50%;
83
+ // 48px total height / 2 (24px) + 1px
84
+ bottom: calc(50% - 25px);
85
+ width: 100%;
86
+ height: 2px;
87
+ content: '';
88
+ background: var(--color-primer-border-active);
89
+ border-radius: $border-radius;
90
+ transform: translate(50%, -50%);
91
+ }
92
+ }
88
93
  }
89
94
 
90
95
  .Counter {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primer/css",
3
- "version": "20.0.0-rc.645e2ab2",
3
+ "version": "20.0.0-rc.7b88bc5d",
4
4
  "description": "The CSS implementation of GitHub's Primer Design System",
5
5
  "homepage": "https://primer.style/css",
6
6
  "author": "GitHub, Inc.",
@@ -23,8 +23,14 @@
23
23
  "design-system"
24
24
  ],
25
25
  "scripts": {
26
+ "build:docs": "script/build-docs",
27
+ "build:docs:preview": "script/build-docs preview",
26
28
  "dist": "script/dist.js",
27
- "stylelint": "stylelint --quiet 'src/**/*.scss'",
29
+ "dist:watch": "chokidar \"src/**/*.scss\" -c \"script/dist.js\"",
30
+ "stylelint": "stylelint --quiet --rd 'src/**/*.scss'",
31
+ "stylelint:fix": "yarn stylelint -- --fix",
32
+ "stylelint:remove-disables": "script/stylelint-remove-disables.js 'src/**/*.scss'",
33
+ "stylelint:add-disables": "script/stylelint-add-disables.js 'src/**/*.scss'",
28
34
  "eslint": "eslint deprecations.js __tests__ script",
29
35
  "prepublishOnly": "script/prepublish",
30
36
  "start": "yarn dev",
@@ -35,36 +41,37 @@
35
41
  "storybook": "cd docs && yarn && yarn storybook"
36
42
  },
37
43
  "dependencies": {
38
- "@primer/primitives": "^7.2.0"
44
+ "@primer/primitives": "^7.7.0"
39
45
  },
40
46
  "devDependencies": {
41
- "@changesets/changelog-github": "0.4.2",
42
- "@changesets/cli": "2.18.1",
47
+ "@changesets/changelog-github": "0.4.4",
48
+ "@changesets/cli": "2.22.0",
43
49
  "@github/prettier-config": "0.0.4",
44
- "@koddsson/postcss-sass": "5.0.0",
45
- "@primer/stylelint-config": "12.2.0",
46
- "autoprefixer": "10.4.0",
47
- "cssstats": "4.0.2",
48
- "eslint": "8.4.1",
49
- "eslint-plugin-github": "4.3.5",
50
- "eslint-plugin-jest": "25.3.0",
50
+ "@koddsson/postcss-sass": "5.0.1",
51
+ "@primer/stylelint-config": "^12.4.0",
52
+ "autoprefixer": "10.4.4",
53
+ "chokidar-cli": "3.0.0",
54
+ "cssstats": "4.0.5",
55
+ "eslint": "8.13.0",
56
+ "eslint-plugin-github": "4.3.6",
57
+ "eslint-plugin-jest": "26.0.0",
51
58
  "eslint-plugin-prettier": "4.0.0",
52
- "filesize": "8.0.6",
59
+ "filesize": "8.0.7",
53
60
  "front-matter": "4.0.2",
54
- "fs-extra": "10.0.0",
55
- "globby": "12.0.2",
56
- "jest": "27.4.4",
61
+ "fs-extra": "10.0.1",
62
+ "globby": "13.1.1",
63
+ "jest": "27.5.1",
57
64
  "js-yaml": "4.1.0",
58
- "postcss": "8.4.5",
59
- "postcss-calc": "8.0.0",
60
- "postcss-import": "14.0.2",
61
- "postcss-load-config": "3.1.0",
62
- "postcss-scss": "4.0.2",
65
+ "postcss": "8.4.12",
66
+ "postcss-calc": "8.2.4",
67
+ "postcss-import": "14.1.0",
68
+ "postcss-load-config": "3.1.4",
69
+ "postcss-scss": "4.0.3",
63
70
  "postcss-simple-vars": "6.0.3",
64
- "prettier": "2.5.1",
65
- "semver": "7.3.5",
66
- "stylelint": "14.1.0",
67
- "table": "6.7.5"
71
+ "prettier": "2.6.2",
72
+ "semver": "7.3.7",
73
+ "stylelint": "14.6.1",
74
+ "table": "6.8.0"
68
75
  },
69
76
  "jest": {
70
77
  "testEnvironment": "node",