primer_view_components 0.3.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/app/assets/javascripts/app/components/primer/alpha/action_bar_element.d.ts +16 -0
  4. data/app/assets/javascripts/app/components/primer/alpha/action_menu/action_menu_element.d.ts +30 -0
  5. data/app/assets/javascripts/app/components/primer/alpha/dropdown/menu.d.ts +1 -0
  6. data/app/assets/javascripts/app/components/primer/alpha/dropdown.d.ts +1 -0
  7. data/app/assets/javascripts/app/components/primer/alpha/image_crop.d.ts +1 -0
  8. data/app/assets/javascripts/app/components/primer/alpha/modal_dialog.d.ts +18 -0
  9. data/app/assets/javascripts/app/components/primer/alpha/nav_list.d.ts +28 -0
  10. data/app/assets/javascripts/app/components/primer/alpha/segmented_control.d.ts +12 -0
  11. data/app/assets/javascripts/app/components/primer/alpha/tab_container.d.ts +1 -0
  12. data/app/assets/javascripts/app/components/primer/alpha/toggle_switch.d.ts +30 -0
  13. data/app/assets/javascripts/app/components/primer/alpha/tool_tip.d.ts +26 -0
  14. data/app/assets/javascripts/app/components/primer/alpha/x_banner.d.ts +11 -0
  15. data/app/assets/javascripts/app/components/primer/anchored_position.d.ts +27 -0
  16. data/app/assets/javascripts/app/components/primer/beta/auto_complete/auto_complete.d.ts +1 -0
  17. data/app/assets/javascripts/app/components/primer/beta/clipboard_copy.d.ts +1 -0
  18. data/app/assets/javascripts/app/components/primer/beta/relative_time.d.ts +1 -0
  19. data/app/assets/javascripts/app/components/primer/focus_group.d.ts +19 -0
  20. data/app/assets/javascripts/app/components/primer/primer.d.ts +21 -0
  21. data/app/assets/javascripts/lib/primer/forms/primer_multi_input.d.ts +10 -0
  22. data/app/assets/javascripts/lib/primer/forms/primer_text_field.d.ts +1 -0
  23. data/app/assets/javascripts/lib/primer/forms/toggle_switch_input.d.ts +5 -0
  24. data/app/assets/javascripts/primer_view_components.js +1 -1
  25. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  26. data/app/assets/styles/primer_view_components.css +1 -1
  27. data/app/assets/styles/primer_view_components.css.map +1 -1
  28. data/app/components/primer/alpha/action_bar/divider.rb +30 -0
  29. data/app/components/primer/alpha/action_bar/item.rb +26 -0
  30. data/app/components/primer/alpha/action_bar.css +1 -0
  31. data/app/components/primer/alpha/action_bar.css.json +17 -0
  32. data/app/components/primer/alpha/action_bar.css.map +1 -0
  33. data/app/components/primer/alpha/action_bar.html.erb +12 -0
  34. data/app/components/primer/alpha/action_bar.pcss +69 -0
  35. data/app/components/primer/alpha/action_bar.rb +110 -0
  36. data/app/components/primer/alpha/action_bar_element.d.ts +16 -0
  37. data/app/components/primer/alpha/action_bar_element.js +172 -0
  38. data/app/components/primer/alpha/action_bar_element.ts +175 -0
  39. data/app/components/primer/alpha/action_list.css +1 -1
  40. data/app/components/primer/alpha/action_list.css.map +1 -1
  41. data/app/components/primer/alpha/action_list.pcss +42 -42
  42. data/app/components/primer/alpha/action_list.rb +1 -0
  43. data/app/components/primer/alpha/action_menu/action_menu_element.d.ts +2 -2
  44. data/app/components/primer/alpha/auto_complete.css +1 -1
  45. data/app/components/primer/alpha/auto_complete.css.map +1 -1
  46. data/app/components/primer/alpha/auto_complete.pcss +10 -10
  47. data/app/components/primer/alpha/banner.css +1 -1
  48. data/app/components/primer/alpha/banner.css.map +1 -1
  49. data/app/components/primer/alpha/banner.pcss +16 -16
  50. data/app/components/primer/alpha/button_marketing.css +1 -1
  51. data/app/components/primer/alpha/button_marketing.css.map +1 -1
  52. data/app/components/primer/alpha/button_marketing.pcss +9 -9
  53. data/app/components/primer/alpha/dialog.css +1 -1
  54. data/app/components/primer/alpha/dialog.css.map +1 -1
  55. data/app/components/primer/alpha/dialog.pcss +9 -9
  56. data/app/components/primer/alpha/dropdown.css +1 -1
  57. data/app/components/primer/alpha/dropdown.css.map +1 -1
  58. data/app/components/primer/alpha/dropdown.pcss +16 -16
  59. data/app/components/primer/alpha/layout.css +1 -1
  60. data/app/components/primer/alpha/layout.css.map +1 -1
  61. data/app/components/primer/alpha/layout.pcss +3 -3
  62. data/app/components/primer/alpha/menu.css +1 -1
  63. data/app/components/primer/alpha/menu.css.map +1 -1
  64. data/app/components/primer/alpha/menu.pcss +13 -13
  65. data/app/components/primer/alpha/nav_list.rb +1 -0
  66. data/app/components/primer/alpha/segmented_control.css +1 -1
  67. data/app/components/primer/alpha/segmented_control.css.json +2 -0
  68. data/app/components/primer/alpha/segmented_control.css.map +1 -1
  69. data/app/components/primer/alpha/segmented_control.pcss +16 -6
  70. data/app/components/primer/alpha/tab_nav.css +1 -1
  71. data/app/components/primer/alpha/tab_nav.css.map +1 -1
  72. data/app/components/primer/alpha/tab_nav.pcss +10 -10
  73. data/app/components/primer/alpha/text_field.css +1 -1
  74. data/app/components/primer/alpha/text_field.css.map +1 -1
  75. data/app/components/primer/alpha/text_field.pcss +38 -38
  76. data/app/components/primer/alpha/toggle_switch.css +1 -1
  77. data/app/components/primer/alpha/toggle_switch.css.map +1 -1
  78. data/app/components/primer/alpha/toggle_switch.pcss +23 -23
  79. data/app/components/primer/alpha/tool_tip.d.ts +3 -2
  80. data/app/components/primer/alpha/tool_tip.js +89 -44
  81. data/app/components/primer/alpha/tool_tip.ts +88 -41
  82. data/app/components/primer/alpha/tooltip.rb +1 -0
  83. data/app/components/primer/alpha/underline_nav.css +1 -1
  84. data/app/components/primer/alpha/underline_nav.css.map +1 -1
  85. data/app/components/primer/alpha/underline_nav.pcss +15 -15
  86. data/app/components/primer/beta/avatar.css +1 -1
  87. data/app/components/primer/beta/avatar.css.map +1 -1
  88. data/app/components/primer/beta/avatar.pcss +2 -2
  89. data/app/components/primer/beta/avatar_stack.css +1 -1
  90. data/app/components/primer/beta/avatar_stack.css.map +1 -1
  91. data/app/components/primer/beta/avatar_stack.pcss +10 -10
  92. data/app/components/primer/beta/blankslate.css +1 -1
  93. data/app/components/primer/beta/blankslate.css.map +1 -1
  94. data/app/components/primer/beta/blankslate.pcss +4 -4
  95. data/app/components/primer/beta/border_box.css +1 -1
  96. data/app/components/primer/beta/border_box.css.map +1 -1
  97. data/app/components/primer/beta/border_box.pcss +31 -31
  98. data/app/components/primer/beta/breadcrumbs.css +1 -1
  99. data/app/components/primer/beta/breadcrumbs.css.map +1 -1
  100. data/app/components/primer/beta/breadcrumbs.pcss +2 -2
  101. data/app/components/primer/beta/button.css +1 -1
  102. data/app/components/primer/beta/button.css.map +1 -1
  103. data/app/components/primer/beta/button.pcss +70 -70
  104. data/app/components/primer/beta/counter.css +1 -1
  105. data/app/components/primer/beta/counter.css.map +1 -1
  106. data/app/components/primer/beta/counter.pcss +7 -7
  107. data/app/components/primer/beta/flash.css +1 -1
  108. data/app/components/primer/beta/flash.css.map +1 -1
  109. data/app/components/primer/beta/flash.pcss +19 -19
  110. data/app/components/primer/beta/label.css +1 -1
  111. data/app/components/primer/beta/label.css.map +1 -1
  112. data/app/components/primer/beta/label.pcss +23 -23
  113. data/app/components/primer/beta/link.css +1 -1
  114. data/app/components/primer/beta/link.css.map +1 -1
  115. data/app/components/primer/beta/link.pcss +12 -8
  116. data/app/components/primer/beta/link.rb +6 -10
  117. data/app/components/primer/beta/popover.css +1 -1
  118. data/app/components/primer/beta/popover.css.map +1 -1
  119. data/app/components/primer/beta/popover.pcss +10 -10
  120. data/app/components/primer/beta/progress_bar.css +1 -1
  121. data/app/components/primer/beta/progress_bar.css.map +1 -1
  122. data/app/components/primer/beta/progress_bar.pcss +1 -1
  123. data/app/components/primer/beta/state.css +1 -1
  124. data/app/components/primer/beta/state.css.map +1 -1
  125. data/app/components/primer/beta/state.pcss +8 -8
  126. data/app/components/primer/beta/subhead.css +1 -1
  127. data/app/components/primer/beta/subhead.css.map +1 -1
  128. data/app/components/primer/beta/subhead.pcss +3 -3
  129. data/app/components/primer/beta/timeline_item.css +1 -1
  130. data/app/components/primer/beta/timeline_item.css.map +1 -1
  131. data/app/components/primer/beta/timeline_item.pcss +13 -13
  132. data/app/components/primer/primer.d.ts +1 -0
  133. data/app/components/primer/primer.js +1 -0
  134. data/app/components/primer/primer.pcss +1 -0
  135. data/app/components/primer/primer.ts +1 -0
  136. data/lib/postcss_mixins/activeIndicatorLine.pcss +1 -1
  137. data/lib/postcss_mixins/focusBoxShadowInset.pcss +2 -2
  138. data/lib/postcss_mixins/focusOutline.pcss +1 -1
  139. data/lib/postcss_mixins/focusOutlineOnEmphasis.pcss +2 -2
  140. data/lib/postcss_mixins/targetBoxShadow.pcss +2 -1
  141. data/lib/primer/static/generate_previews.rb +9 -0
  142. data/lib/primer/view_components/linters/accessibility.yml +2 -0
  143. data/lib/primer/view_components/linters/argument_mappers/label.rb +4 -4
  144. data/lib/primer/view_components/linters/details_menu_migration.rb +35 -0
  145. data/lib/primer/view_components/linters/label_component_migration_counter.rb +1 -1
  146. data/lib/primer/view_components/linters/tooltipped_migration.rb +1 -3
  147. data/lib/primer/view_components/version.rb +2 -2
  148. data/lib/primer/yard.rb +5 -0
  149. data/previews/primer/alpha/action_bar_preview/inline.html.erb +16 -0
  150. data/previews/primer/alpha/action_bar_preview.rb +77 -0
  151. data/previews/primer/alpha/action_list_preview.rb +10 -0
  152. data/previews/primer/alpha/action_menu_preview.rb +5 -0
  153. data/previews/primer/alpha/auto_complete_preview.rb +1 -0
  154. data/previews/primer/alpha/banner_preview.rb +9 -1
  155. data/previews/primer/alpha/button_marketing_preview.rb +2 -0
  156. data/previews/primer/alpha/check_box_group_preview.rb +1 -0
  157. data/previews/primer/alpha/check_box_preview.rb +6 -0
  158. data/previews/primer/alpha/dialog_preview.rb +1 -0
  159. data/previews/primer/alpha/dropdown_preview.rb +1 -0
  160. data/previews/primer/alpha/hellip_button_preview.rb +1 -0
  161. data/previews/primer/alpha/hidden_text_expander_preview.rb +1 -0
  162. data/previews/primer/alpha/layout_preview.rb +4 -0
  163. data/previews/primer/alpha/menu_preview.rb +1 -0
  164. data/previews/primer/alpha/multi_input_preview.rb +4 -0
  165. data/previews/primer/alpha/nav_list_preview.rb +3 -0
  166. data/previews/primer/alpha/radio_button_group_preview.rb +2 -0
  167. data/previews/primer/alpha/radio_button_preview.rb +10 -0
  168. data/previews/primer/alpha/segmented_control_preview.rb +13 -0
  169. data/previews/primer/alpha/select_preview.rb +6 -0
  170. data/previews/primer/alpha/tab_nav_preview.rb +3 -0
  171. data/previews/primer/alpha/tab_panels_preview.rb +1 -0
  172. data/previews/primer/alpha/text_area_preview.rb +7 -0
  173. data/previews/primer/alpha/text_field_preview.rb +15 -0
  174. data/previews/primer/alpha/toggle_switch_preview.rb +18 -11
  175. data/previews/primer/alpha/tooltip_preview/tooltip_inside_primer_overlay.html.erb +20 -0
  176. data/previews/primer/alpha/tooltip_preview.rb +7 -0
  177. data/previews/primer/alpha/underline_nav_preview.rb +2 -0
  178. data/previews/primer/beta/auto_complete_item_preview.rb +2 -0
  179. data/previews/primer/beta/auto_complete_preview.rb +7 -0
  180. data/previews/primer/beta/avatar_preview.rb +10 -0
  181. data/previews/primer/beta/avatar_stack_preview.rb +3 -0
  182. data/previews/primer/beta/blankslate_preview.rb +9 -0
  183. data/previews/primer/beta/border_box_preview.rb +4 -0
  184. data/previews/primer/beta/breadcrumbs_preview.rb +1 -0
  185. data/previews/primer/beta/button_group_preview.rb +4 -0
  186. data/previews/primer/beta/button_preview/all_schemes.html.erb +4 -0
  187. data/previews/primer/beta/button_preview.rb +17 -2
  188. data/previews/primer/beta/clipboard_copy_preview.rb +2 -0
  189. data/previews/primer/beta/close_button_preview.rb +1 -0
  190. data/previews/primer/beta/counter_preview.rb +11 -0
  191. data/previews/primer/beta/flash_preview.rb +8 -0
  192. data/previews/primer/beta/heading_preview.rb +1 -0
  193. data/previews/primer/beta/icon_button_preview.rb +3 -0
  194. data/previews/primer/beta/label_preview.rb +13 -0
  195. data/previews/primer/beta/link_preview.rb +11 -9
  196. data/previews/primer/beta/markdown_preview.rb +1 -0
  197. data/previews/primer/beta/octicon_preview.rb +1 -0
  198. data/previews/primer/beta/popover_preview.rb +6 -0
  199. data/previews/primer/beta/progress_bar_preview.rb +4 -0
  200. data/previews/primer/beta/spinner_preview.rb +1 -0
  201. data/previews/primer/beta/state_preview.rb +6 -0
  202. data/previews/primer/beta/subhead_preview.rb +4 -0
  203. data/previews/primer/beta/text_preview.rb +1 -0
  204. data/previews/primer/beta/timeline_item_preview.rb +1 -0
  205. data/previews/primer/beta/truncate_preview.rb +1 -0
  206. data/previews/primer/box_preview.rb +2 -0
  207. data/static/arguments.json +55 -11
  208. data/static/audited_at.json +7 -4
  209. data/static/classes.json +21 -0
  210. data/static/constants.json +20 -6
  211. data/static/info_arch.json +673 -11
  212. data/static/previews.json +571 -0
  213. data/static/statuses.json +3 -0
  214. metadata +44 -8
@@ -10,10 +10,11 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
10
10
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
11
  };
12
12
  var _ToolTipElement_instances, _ToolTipElement_abortController, _ToolTipElement_align, _ToolTipElement_side, _ToolTipElement_allowUpdatePosition, _ToolTipElement_update, _ToolTipElement_updateControlReference, _ToolTipElement_updateDirection, _ToolTipElement_updatePosition;
13
+ import '@oddbird/popover-polyfill';
13
14
  import { getAnchoredPosition } from '@primer/behaviors';
14
- const TOOLTIP_OPEN_CLASS = 'tooltip-open';
15
15
  const TOOLTIP_ARROW_EDGE_OFFSET = 6;
16
16
  const TOOLTIP_SR_ONLY_CLASS = 'sr-only';
17
+ const TOOLTIP_OFFSET = 10;
17
18
  const DIRECTION_CLASSES = [
18
19
  'tooltip-n',
19
20
  'tooltip-s',
@@ -24,6 +25,23 @@ const DIRECTION_CLASSES = [
24
25
  'tooltip-nw',
25
26
  'tooltip-sw'
26
27
  ];
28
+ function closeOpenTooltips(except) {
29
+ for (const tooltip of openTooltips) {
30
+ if (tooltip === except)
31
+ continue;
32
+ if (tooltip.matches(':popover-open')) {
33
+ tooltip.hidePopover();
34
+ }
35
+ else {
36
+ openTooltips.delete(tooltip);
37
+ }
38
+ }
39
+ }
40
+ function focusOutListener() {
41
+ closeOpenTooltips();
42
+ }
43
+ const tooltips = new Set();
44
+ const openTooltips = new Set();
27
45
  class ToolTipElement extends HTMLElement {
28
46
  constructor() {
29
47
  super(...arguments);
@@ -36,12 +54,10 @@ class ToolTipElement extends HTMLElement {
36
54
  styles() {
37
55
  return `
38
56
  :host {
39
- position: absolute;
40
- z-index: 1000000;
41
- padding: .5em .75em;
57
+ padding: .5em .75em !important;
42
58
  font: normal normal 11px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
43
59
  -webkit-font-smoothing: subpixel-antialiased;
44
- color: var(--color-fg-on-emphasis);
60
+ color: var(--color-fg-on-emphasis) !important;
45
61
  text-align: center;
46
62
  text-decoration: none;
47
63
  text-shadow: none;
@@ -49,13 +65,16 @@ class ToolTipElement extends HTMLElement {
49
65
  letter-spacing: normal;
50
66
  word-wrap: break-word;
51
67
  white-space: pre;
52
- background: var(--color-neutral-emphasis-plus);
68
+ background: var(--color-neutral-emphasis-plus) !important;
53
69
  border-radius: 6px;
70
+ border: 0 !important;
54
71
  opacity: 0;
55
72
  max-width: 250px;
56
73
  word-wrap: break-word;
57
74
  white-space: normal;
58
- width: max-content;
75
+ width: max-content !important;
76
+ inset: var(--tool-tip-position-top, 0) auto auto var(--tool-tip-position-left, 0) !important;
77
+ overflow: visible !important;
59
78
  }
60
79
 
61
80
  :host:before{
@@ -69,7 +88,7 @@ class ToolTipElement extends HTMLElement {
69
88
 
70
89
  @keyframes tooltip-appear {
71
90
  from {
72
- opacity: 0
91
+ opacity: 0;
73
92
  }
74
93
  to {
75
94
  opacity: 1
@@ -85,8 +104,17 @@ class ToolTipElement extends HTMLElement {
85
104
  content: ""
86
105
  }
87
106
 
88
- :host(.${TOOLTIP_OPEN_CLASS}),
89
- :host(.${TOOLTIP_OPEN_CLASS}):before {
107
+ :host(:popover-open),
108
+ :host(:popover-open):before {
109
+ animation-name: tooltip-appear;
110
+ animation-duration: .1s;
111
+ animation-fill-mode: forwards;
112
+ animation-timing-function: ease-in;
113
+ animation-delay: .4s
114
+ }
115
+
116
+ :host(.\\:popover-open),
117
+ :host(.\\:popover-open):before {
90
118
  animation-name: tooltip-appear;
91
119
  animation-duration: .1s;
92
120
  animation-fill-mode: forwards;
@@ -177,16 +205,22 @@ class ToolTipElement extends HTMLElement {
177
205
  get control() {
178
206
  return this.ownerDocument.getElementById(this.htmlFor);
179
207
  }
208
+ /* @deprecated */
180
209
  set hiddenFromView(value) {
181
- this.classList.toggle(TOOLTIP_SR_ONLY_CLASS, value);
182
- if (this.isConnected)
183
- __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_update).call(this);
210
+ if (value && this.matches(':popover-open')) {
211
+ this.hidePopover();
212
+ }
213
+ else if (!value && !this.matches(':popover-open')) {
214
+ this.showPopover();
215
+ }
184
216
  }
217
+ /* @deprecated */
185
218
  get hiddenFromView() {
186
- return this.classList.contains(TOOLTIP_SR_ONLY_CLASS);
219
+ return !this.matches(':popover-open');
187
220
  }
188
221
  connectedCallback() {
189
- var _a;
222
+ var _a, _b;
223
+ tooltips.add(this);
190
224
  __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_updateControlReference).call(this);
191
225
  __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_updateDirection).call(this);
192
226
  if (!this.shadowRoot) {
@@ -195,7 +229,7 @@ class ToolTipElement extends HTMLElement {
195
229
  style.textContent = this.styles();
196
230
  shadow.appendChild(document.createElement('slot'));
197
231
  }
198
- this.hiddenFromView = true;
232
+ __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_update).call(this, false);
199
233
  __classPrivateFieldSet(this, _ToolTipElement_allowUpdatePosition, true, "f");
200
234
  if (!this.control)
201
235
  return;
@@ -204,35 +238,48 @@ class ToolTipElement extends HTMLElement {
204
238
  __classPrivateFieldSet(this, _ToolTipElement_abortController, new AbortController(), "f");
205
239
  const { signal } = __classPrivateFieldGet(this, _ToolTipElement_abortController, "f");
206
240
  this.addEventListener('mouseleave', this, { signal });
241
+ this.addEventListener('toggle', this, { signal });
207
242
  this.control.addEventListener('mouseenter', this, { signal });
208
243
  this.control.addEventListener('mouseleave', this, { signal });
209
244
  this.control.addEventListener('focus', this, { signal });
210
- this.control.addEventListener('blur', this, { signal });
245
+ this.control.addEventListener('mousedown', this, { signal });
246
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
247
+ // @ts-ignore popoverTargetElement is not in the type definition
248
+ (_b = this.control.popoverTargetElement) === null || _b === void 0 ? void 0 : _b.addEventListener('beforetoggle', this, {
249
+ signal
250
+ });
251
+ this.ownerDocument.addEventListener('focusout', focusOutListener);
211
252
  this.ownerDocument.addEventListener('keydown', this, { signal });
212
- __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_update).call(this);
213
253
  }
214
254
  disconnectedCallback() {
215
255
  var _a;
256
+ tooltips.delete(this);
257
+ openTooltips.delete(this);
216
258
  (_a = __classPrivateFieldGet(this, _ToolTipElement_abortController, "f")) === null || _a === void 0 ? void 0 : _a.abort();
217
259
  }
218
- handleEvent(event) {
260
+ async handleEvent(event) {
219
261
  if (!this.control)
220
262
  return;
263
+ const showing = this.matches(':popover-open');
221
264
  // Ensures that tooltip stays open when hovering between tooltip and element
222
265
  // WCAG Success Criterion 1.4.13 Hoverable
223
- if ((event.type === 'mouseenter' || event.type === 'focus') && this.hiddenFromView) {
224
- this.hiddenFromView = false;
225
- }
226
- else if (event.type === 'blur') {
227
- this.hiddenFromView = true;
228
- }
229
- else if (event.type === 'mouseleave' &&
266
+ const shouldShow = event.type === 'mouseenter' || event.type === 'focus';
267
+ const isMouseLeaveFromButton = event.type === 'mouseleave' &&
230
268
  event.relatedTarget !== this.control &&
231
- event.relatedTarget !== this) {
232
- this.hiddenFromView = true;
269
+ event.relatedTarget !== this;
270
+ const isEscapeKeydown = event.type === 'keydown' && event.key === 'Escape';
271
+ const isMouseDownOnButton = event.type === 'mousedown' && event.currentTarget === this.control;
272
+ const isOpeningOtherPopover = event.type === 'beforetoggle' && event.currentTarget !== this;
273
+ const shouldHide = isMouseLeaveFromButton || isEscapeKeydown || isMouseDownOnButton || isOpeningOtherPopover;
274
+ await Promise.resolve();
275
+ if (!showing && shouldShow) {
276
+ this.showPopover();
277
+ }
278
+ else if (showing && shouldHide) {
279
+ this.hidePopover();
233
280
  }
234
- else if (event.type === 'keydown' && event.key === 'Escape' && !this.hiddenFromView) {
235
- this.hiddenFromView = true;
281
+ if (event.type === 'toggle') {
282
+ __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_update).call(this, event.newState === 'open');
236
283
  }
237
284
  }
238
285
  attributeChangedCallback(name) {
@@ -246,17 +293,17 @@ class ToolTipElement extends HTMLElement {
246
293
  }
247
294
  }
248
295
  }
249
- _ToolTipElement_abortController = new WeakMap(), _ToolTipElement_align = new WeakMap(), _ToolTipElement_side = new WeakMap(), _ToolTipElement_allowUpdatePosition = new WeakMap(), _ToolTipElement_instances = new WeakSet(), _ToolTipElement_update = function _ToolTipElement_update() {
250
- if (this.hiddenFromView) {
251
- this.classList.remove(TOOLTIP_OPEN_CLASS, ...DIRECTION_CLASSES);
296
+ _ToolTipElement_abortController = new WeakMap(), _ToolTipElement_align = new WeakMap(), _ToolTipElement_side = new WeakMap(), _ToolTipElement_allowUpdatePosition = new WeakMap(), _ToolTipElement_instances = new WeakSet(), _ToolTipElement_update = function _ToolTipElement_update(isOpen) {
297
+ if (isOpen) {
298
+ openTooltips.add(this);
299
+ this.classList.remove(TOOLTIP_SR_ONLY_CLASS);
300
+ closeOpenTooltips(this);
301
+ __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_updatePosition).call(this);
252
302
  }
253
303
  else {
254
- this.classList.add(TOOLTIP_OPEN_CLASS);
255
- for (const tooltip of this.ownerDocument.querySelectorAll(this.tagName)) {
256
- if (tooltip !== this)
257
- tooltip.hiddenFromView = true;
258
- }
259
- __classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_updatePosition).call(this);
304
+ openTooltips.delete(this);
305
+ this.classList.remove(...DIRECTION_CLASSES);
306
+ this.classList.add(TOOLTIP_SR_ONLY_CLASS);
260
307
  }
261
308
  }, _ToolTipElement_updateControlReference = function _ToolTipElement_updateControlReference() {
262
309
  if (!this.id || !this.control)
@@ -331,10 +378,8 @@ _ToolTipElement_abortController = new WeakMap(), _ToolTipElement_align = new Wea
331
378
  }, _ToolTipElement_updatePosition = function _ToolTipElement_updatePosition() {
332
379
  if (!this.control)
333
380
  return;
334
- if (!__classPrivateFieldGet(this, _ToolTipElement_allowUpdatePosition, "f") || this.hiddenFromView)
381
+ if (!__classPrivateFieldGet(this, _ToolTipElement_allowUpdatePosition, "f") || !this.matches(':popover-open'))
335
382
  return;
336
- const TOOLTIP_OFFSET = 10;
337
- this.style.left = `0px`; // Ensures we have reliable tooltip width in `getAnchoredPosition`
338
383
  const position = getAnchoredPosition(this, this.control, {
339
384
  side: __classPrivateFieldGet(this, _ToolTipElement_side, "f"),
340
385
  align: __classPrivateFieldGet(this, _ToolTipElement_align, "f"),
@@ -342,8 +387,8 @@ _ToolTipElement_abortController = new WeakMap(), _ToolTipElement_align = new Wea
342
387
  });
343
388
  const anchorSide = position.anchorSide;
344
389
  const align = position.anchorAlign;
345
- this.style.top = `${position.top}px`;
346
- this.style.left = `${position.left}px`;
390
+ this.style.setProperty('--tool-tip-position-top', `${position.top}px`);
391
+ this.style.setProperty('--tool-tip-position-left', `${position.left}px`);
347
392
  let direction = 's';
348
393
  if (anchorSide === 'outside-left') {
349
394
  direction = 'w';
@@ -1,9 +1,10 @@
1
1
  import type {AnchorAlignment, AnchorSide} from '@primer/behaviors'
2
+ import '@oddbird/popover-polyfill'
2
3
  import {getAnchoredPosition} from '@primer/behaviors'
3
4
 
4
- const TOOLTIP_OPEN_CLASS = 'tooltip-open'
5
5
  const TOOLTIP_ARROW_EDGE_OFFSET = 6
6
6
  const TOOLTIP_SR_ONLY_CLASS = 'sr-only'
7
+ const TOOLTIP_OFFSET = 10
7
8
 
8
9
  type Direction = 'n' | 's' | 'e' | 'w' | 'ne' | 'se' | 'nw' | 'sw'
9
10
 
@@ -18,16 +19,31 @@ const DIRECTION_CLASSES = [
18
19
  'tooltip-sw'
19
20
  ]
20
21
 
22
+ function closeOpenTooltips(except?: Element) {
23
+ for (const tooltip of openTooltips) {
24
+ if (tooltip === except) continue
25
+ if (tooltip.matches(':popover-open')) {
26
+ tooltip.hidePopover()
27
+ } else {
28
+ openTooltips.delete(tooltip)
29
+ }
30
+ }
31
+ }
32
+
33
+ function focusOutListener() {
34
+ closeOpenTooltips()
35
+ }
36
+
37
+ const tooltips = new Set<ToolTipElement>()
38
+ const openTooltips = new Set<ToolTipElement>()
21
39
  class ToolTipElement extends HTMLElement {
22
40
  styles() {
23
41
  return `
24
42
  :host {
25
- position: absolute;
26
- z-index: 1000000;
27
- padding: .5em .75em;
43
+ padding: .5em .75em !important;
28
44
  font: normal normal 11px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
29
45
  -webkit-font-smoothing: subpixel-antialiased;
30
- color: var(--color-fg-on-emphasis);
46
+ color: var(--color-fg-on-emphasis) !important;
31
47
  text-align: center;
32
48
  text-decoration: none;
33
49
  text-shadow: none;
@@ -35,13 +51,16 @@ class ToolTipElement extends HTMLElement {
35
51
  letter-spacing: normal;
36
52
  word-wrap: break-word;
37
53
  white-space: pre;
38
- background: var(--color-neutral-emphasis-plus);
54
+ background: var(--color-neutral-emphasis-plus) !important;
39
55
  border-radius: 6px;
56
+ border: 0 !important;
40
57
  opacity: 0;
41
58
  max-width: 250px;
42
59
  word-wrap: break-word;
43
60
  white-space: normal;
44
- width: max-content;
61
+ width: max-content !important;
62
+ inset: var(--tool-tip-position-top, 0) auto auto var(--tool-tip-position-left, 0) !important;
63
+ overflow: visible !important;
45
64
  }
46
65
 
47
66
  :host:before{
@@ -55,7 +74,7 @@ class ToolTipElement extends HTMLElement {
55
74
 
56
75
  @keyframes tooltip-appear {
57
76
  from {
58
- opacity: 0
77
+ opacity: 0;
59
78
  }
60
79
  to {
61
80
  opacity: 1
@@ -71,8 +90,17 @@ class ToolTipElement extends HTMLElement {
71
90
  content: ""
72
91
  }
73
92
 
74
- :host(.${TOOLTIP_OPEN_CLASS}),
75
- :host(.${TOOLTIP_OPEN_CLASS}):before {
93
+ :host(:popover-open),
94
+ :host(:popover-open):before {
95
+ animation-name: tooltip-appear;
96
+ animation-duration: .1s;
97
+ animation-fill-mode: forwards;
98
+ animation-timing-function: ease-in;
99
+ animation-delay: .4s
100
+ }
101
+
102
+ :host(.\\:popover-open),
103
+ :host(.\\:popover-open):before {
76
104
  animation-name: tooltip-appear;
77
105
  animation-duration: .1s;
78
106
  animation-fill-mode: forwards;
@@ -176,16 +204,22 @@ class ToolTipElement extends HTMLElement {
176
204
  return this.ownerDocument.getElementById(this.htmlFor)
177
205
  }
178
206
 
207
+ /* @deprecated */
179
208
  set hiddenFromView(value: true | false) {
180
- this.classList.toggle(TOOLTIP_SR_ONLY_CLASS, value)
181
- if (this.isConnected) this.#update()
209
+ if (value && this.matches(':popover-open')) {
210
+ this.hidePopover()
211
+ } else if (!value && !this.matches(':popover-open')) {
212
+ this.showPopover()
213
+ }
182
214
  }
183
215
 
216
+ /* @deprecated */
184
217
  get hiddenFromView() {
185
- return this.classList.contains(TOOLTIP_SR_ONLY_CLASS)
218
+ return !this.matches(':popover-open')
186
219
  }
187
220
 
188
221
  connectedCallback() {
222
+ tooltips.add(this)
189
223
  this.#updateControlReference()
190
224
  this.#updateDirection()
191
225
  if (!this.shadowRoot) {
@@ -194,7 +228,7 @@ class ToolTipElement extends HTMLElement {
194
228
  style.textContent = this.styles()
195
229
  shadow.appendChild(document.createElement('slot'))
196
230
  }
197
- this.hiddenFromView = true
231
+ this.#update(false)
198
232
  this.#allowUpdatePosition = true
199
233
 
200
234
  if (!this.control) return
@@ -206,49 +240,66 @@ class ToolTipElement extends HTMLElement {
206
240
  const {signal} = this.#abortController
207
241
 
208
242
  this.addEventListener('mouseleave', this, {signal})
243
+ this.addEventListener('toggle', this, {signal})
209
244
  this.control.addEventListener('mouseenter', this, {signal})
210
245
  this.control.addEventListener('mouseleave', this, {signal})
211
246
  this.control.addEventListener('focus', this, {signal})
212
- this.control.addEventListener('blur', this, {signal})
247
+ this.control.addEventListener('mousedown', this, {signal})
248
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
249
+ // @ts-ignore popoverTargetElement is not in the type definition
250
+ this.control.popoverTargetElement?.addEventListener('beforetoggle', this, {
251
+ signal
252
+ })
253
+ this.ownerDocument.addEventListener('focusout', focusOutListener)
213
254
  this.ownerDocument.addEventListener('keydown', this, {signal})
214
- this.#update()
215
255
  }
216
256
 
217
257
  disconnectedCallback() {
258
+ tooltips.delete(this)
259
+ openTooltips.delete(this)
218
260
  this.#abortController?.abort()
219
261
  }
220
262
 
221
- handleEvent(event: Event) {
263
+ async handleEvent(event: Event) {
222
264
  if (!this.control) return
265
+ const showing = this.matches(':popover-open')
223
266
 
224
267
  // Ensures that tooltip stays open when hovering between tooltip and element
225
268
  // WCAG Success Criterion 1.4.13 Hoverable
226
- if ((event.type === 'mouseenter' || event.type === 'focus') && this.hiddenFromView) {
227
- this.hiddenFromView = false
228
- } else if (event.type === 'blur') {
229
- this.hiddenFromView = true
230
- } else if (
269
+ const shouldShow = event.type === 'mouseenter' || event.type === 'focus'
270
+ const isMouseLeaveFromButton =
231
271
  event.type === 'mouseleave' &&
232
272
  (event as MouseEvent).relatedTarget !== this.control &&
233
273
  (event as MouseEvent).relatedTarget !== this
234
- ) {
235
- this.hiddenFromView = true
236
- } else if (event.type === 'keydown' && (event as KeyboardEvent).key === 'Escape' && !this.hiddenFromView) {
237
- this.hiddenFromView = true
274
+ const isEscapeKeydown = event.type === 'keydown' && (event as KeyboardEvent).key === 'Escape'
275
+ const isMouseDownOnButton = event.type === 'mousedown' && event.currentTarget === this.control
276
+ const isOpeningOtherPopover = event.type === 'beforetoggle' && event.currentTarget !== this
277
+ const shouldHide = isMouseLeaveFromButton || isEscapeKeydown || isMouseDownOnButton || isOpeningOtherPopover
278
+
279
+ await Promise.resolve()
280
+ if (!showing && shouldShow) {
281
+ this.showPopover()
282
+ } else if (showing && shouldHide) {
283
+ this.hidePopover()
284
+ }
285
+
286
+ if (event.type === 'toggle') {
287
+ this.#update((event as ToggleEvent).newState === 'open')
238
288
  }
239
289
  }
240
290
 
241
291
  static observedAttributes = ['data-type', 'data-direction', 'id']
242
292
 
243
- #update() {
244
- if (this.hiddenFromView) {
245
- this.classList.remove(TOOLTIP_OPEN_CLASS, ...DIRECTION_CLASSES)
246
- } else {
247
- this.classList.add(TOOLTIP_OPEN_CLASS)
248
- for (const tooltip of this.ownerDocument.querySelectorAll<ToolTipElement>(this.tagName)) {
249
- if (tooltip !== this) tooltip.hiddenFromView = true
250
- }
293
+ #update(isOpen: boolean) {
294
+ if (isOpen) {
295
+ openTooltips.add(this)
296
+ this.classList.remove(TOOLTIP_SR_ONLY_CLASS)
297
+ closeOpenTooltips(this)
251
298
  this.#updatePosition()
299
+ } else {
300
+ openTooltips.delete(this)
301
+ this.classList.remove(...DIRECTION_CLASSES)
302
+ this.classList.add(TOOLTIP_SR_ONLY_CLASS)
252
303
  }
253
304
  }
254
305
 
@@ -326,11 +377,7 @@ class ToolTipElement extends HTMLElement {
326
377
 
327
378
  #updatePosition() {
328
379
  if (!this.control) return
329
- if (!this.#allowUpdatePosition || this.hiddenFromView) return
330
-
331
- const TOOLTIP_OFFSET = 10
332
-
333
- this.style.left = `0px` // Ensures we have reliable tooltip width in `getAnchoredPosition`
380
+ if (!this.#allowUpdatePosition || !this.matches(':popover-open')) return
334
381
 
335
382
  const position = getAnchoredPosition(this, this.control, {
336
383
  side: this.#side,
@@ -340,8 +387,8 @@ class ToolTipElement extends HTMLElement {
340
387
  const anchorSide = position.anchorSide
341
388
  const align = position.anchorAlign
342
389
 
343
- this.style.top = `${position.top}px`
344
- this.style.left = `${position.left}px`
390
+ this.style.setProperty('--tool-tip-position-top', `${position.top}px`)
391
+ this.style.setProperty('--tool-tip-position-left', `${position.left}px`)
345
392
 
346
393
  let direction: Direction = 's'
347
394
 
@@ -110,6 +110,7 @@ module Primer
110
110
  @system_arguments[:id] ||= self.class.generate_id
111
111
  @system_arguments[:tag] = :"tool-tip"
112
112
  @system_arguments[:for] = for_id
113
+ @system_arguments[:popover] = "manual"
113
114
  @system_arguments[:classes] = class_names(
114
115
  @system_arguments[:classes],
115
116
  "sr-only"
@@ -1 +1 @@
1
- .UnderlineNav{-webkit-overflow-scrolling:auto;box-shadow:inset 0 -1px 0 var(--color-border-muted);display:flex;justify-content:space-between;min-height:var(--base-size-48,3rem);overflow-x:auto;overflow-y:hidden}.UnderlineNav .Counter{background-color:var(--color-neutral-muted);color:var(--color-fg-default);margin-left:var(--control-medium-gap,.5rem)}.UnderlineNav .Counter--primary{background-color:var(--color-neutral-emphasis);color:var(--color-fg-on-emphasis)}.UnderlineNav-body{align-items:center;display:flex;gap:var(--control-medium-gap,.5rem);list-style:none}.UnderlineNav-item{align-items:center;background-color:initial;border:0;border-radius:var(--borderRadius-medium,6px);color:var(--color-fg-default);cursor:pointer;display:flex;font-size:var(--text-body-size-medium,.875rem);line-height:30px;padding:0 var(--control-medium-paddingInline-condensed,.5rem);position:relative;text-align:center;white-space:nowrap}.UnderlineNav-item:focus,.UnderlineNav-item:focus-visible,.UnderlineNav-item:hover{border-bottom-color:var(--color-neutral-muted);color:var(--color-fg-default);outline-offset:-2px;text-decoration:none;transition:border-bottom-color .12s ease-out}.UnderlineNav-item [data-content]:before{content:attr(data-content);display:block;font-weight:var(--base-text-weight-semibold,600);height:0;visibility:hidden}.UnderlineNav-item:before{content:"";height:100%;left:50%;min-height:48px;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:100%}@media (pointer:fine){.UnderlineNav-item:hover{background:var(--color-action-list-item-default-hover-bg);color:var(--color-fg-default);text-decoration:none;transition:background .12s ease-out}}.UnderlineNav-item.selected,.UnderlineNav-item[aria-current]:not([aria-current=false]),.UnderlineNav-item[role=tab][aria-selected=true]{border-bottom-color:var(--color-primer-border-active);color:var(--color-fg-default);font-weight:var(--base-text-weight-semibold,600)}.UnderlineNav-item.selected:after,.UnderlineNav-item[aria-current]:not([aria-current=false]):after,.UnderlineNav-item[role=tab][aria-selected=true]:after{background:var(--color-primer-border-active);border-radius:var(--borderRadius-medium,6px);bottom:calc(50% - 25px);content:"";height:2px;position:absolute;right:50%;transform:translate(50%,-50%);width:100%;z-index:1}.UnderlineNav--right{justify-content:flex-end}.UnderlineNav--right .UnderlineNav-actions{flex:1 1 auto}.UnderlineNav-actions{align-self:center}.UnderlineNav--full{display:block}.UnderlineNav--full .UnderlineNav-body{min-height:var(--base-size-48,3rem)}.UnderlineNav-octicon{fill:var(--color-fg-muted);color:var(--color-fg-muted);display:inline!important;margin-right:var(--control-medium-gap,.5rem)}.UnderlineNav-container{display:flex;justify-content:space-between}
1
+ .UnderlineNav{-webkit-overflow-scrolling:auto;box-shadow:inset 0 -1px 0 var(--borderColor-muted,var(--color-border-muted));display:flex;justify-content:space-between;min-height:var(--base-size-48,3rem);overflow-x:auto;overflow-y:hidden}.UnderlineNav .Counter{background-color:var(--bgColor-neutral-muted,var(--color-neutral-muted));color:var(--fgColor-default,var(--color-fg-default));margin-left:var(--control-medium-gap,.5rem)}.UnderlineNav .Counter--primary{background-color:var(--bgColor-neutral-emphasis,var(--color-fg-subtle));color:var(--fgColor-onEmphasis,var(--color-fg-on-emphasis))}.UnderlineNav-body{align-items:center;display:flex;gap:var(--control-medium-gap,.5rem);list-style:none}.UnderlineNav-item{align-items:center;background-color:initial;border:0;border-radius:var(--borderRadius-medium,6px);color:var(--fgColor-default,var(--color-fg-default));cursor:pointer;display:flex;font-size:var(--text-body-size-medium,.875rem);line-height:30px;padding:0 var(--control-medium-paddingInline-condensed,.5rem);position:relative;text-align:center;white-space:nowrap}.UnderlineNav-item:focus,.UnderlineNav-item:focus-visible,.UnderlineNav-item:hover{border-bottom-color:var(--borderColor-neutral-muted,var(--color-neutral-muted));color:var(--fgColor-default,var(--color-fg-default));outline-offset:-2px;text-decoration:none;transition:border-bottom-color .12s ease-out}.UnderlineNav-item [data-content]:before{content:attr(data-content);display:block;font-weight:var(--base-text-weight-semibold,600);height:0;visibility:hidden}.UnderlineNav-item:before{content:"";height:100%;left:50%;min-height:48px;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:100%}@media (pointer:fine){.UnderlineNav-item:hover{background:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg));color:var(--fgColor-default,var(--color-fg-default));text-decoration:none;transition:background .12s ease-out}}.UnderlineNav-item.selected,.UnderlineNav-item[aria-current]:not([aria-current=false]),.UnderlineNav-item[role=tab][aria-selected=true]{border-bottom-color:var(--underlineNav-borderColor-active,var(--color-primer-border-active));color:var(--fgColor-default,var(--color-fg-default));font-weight:var(--base-text-weight-semibold,600)}.UnderlineNav-item.selected:after,.UnderlineNav-item[aria-current]:not([aria-current=false]):after,.UnderlineNav-item[role=tab][aria-selected=true]:after{background:var(--underlineNav-borderColor-active,var(--color-primer-border-active));border-radius:var(--borderRadius-medium,6px);bottom:calc(50% - 25px);content:"";height:2px;position:absolute;right:50%;transform:translate(50%,-50%);width:100%;z-index:1}.UnderlineNav--right{justify-content:flex-end}.UnderlineNav--right .UnderlineNav-actions{flex:1 1 auto}.UnderlineNav-actions{align-self:center}.UnderlineNav--full{display:block}.UnderlineNav--full .UnderlineNav-body{min-height:var(--base-size-48,3rem)}.UnderlineNav-octicon{fill:var(--fgColor-muted,var(--color-fg-muted));color:var(--fgColor-muted,var(--color-fg-muted));display:inline!important;margin-right:var(--control-medium-gap,.5rem)}.UnderlineNav-container{display:flex;justify-content:space-between}
@@ -1 +1 @@
1
- {"version":3,"sources":["underline_nav.pcss","<no source>"],"names":[],"mappings":"AAEA,cAME,+BAAgC,CADhC,mDAAoD,CAJpD,YAAa,CAMb,6BAA8B,CAL9B,mCAA+B,CAC/B,eAAgB,CAChB,iBAeF,CAVE,uBAGE,2CAA4C,CAD5C,6BAA8B,CAD9B,2CAGF,CAEA,gCAEE,8CAA+C,CAD/C,iCAEF,CAGF,mBAEE,kBAAmB,CADnB,YAAa,CAEb,mCAA8B,CAC9B,eACF,CAEA,mBAaE,kBAAmB,CAHnB,wBAA6B,CAC7B,QAAS,CACT,4CAAyC,CANzC,6BAA8B,CAG9B,cAAe,CAPf,YAAa,CAEb,8CAAuC,CACvC,gBAAiB,CAFjB,6DAAwD,CAFxD,iBAAkB,CAMlB,iBAAkB,CAClB,kBA8DF,CAvDE,mFAKE,8CAA+C,CAF/C,6BAA8B,CAG9B,mBAAoB,CAFpB,oBAAqB,CAGrB,4CACF,CAGA,yCAKE,0BAA2B,CAJ3B,aAAc,CAEd,gDAA6C,CAD7C,QAAS,CAET,iBAEF,CAIE,0BClEJ,WAAA,YAAA,SAAA,gBAAA,kBAAA,QAAA,4CAAA,UDkE8B,CAI5B,sBACE,yBAGE,yDAA0D,CAF1D,6BAA8B,CAC9B,oBAAqB,CAErB,mCACF,CACF,CAEA,wIAKE,qDAAsD,CADtD,6BAA8B,CAD9B,gDAiBF,CAZE,0JAQE,4CAA6C,CAC7C,4CAAyC,CALzC,uBAAwB,CAGxB,UAAW,CADX,UAAW,CALX,iBAAkB,CAElB,SAAU,CAOV,6BAA+B,CAL/B,UAAW,CAHX,SASF,CAIJ,qBACE,wBAKF,CAHE,2CACE,aACF,CAGF,sBACE,iBACF,CAEA,oBACE,aAMF,CAHE,uCACE,mCACF,CAGF,sBAIE,0BAA2B,CAD3B,2BAA4B,CAF5B,wBAA0B,CAC1B,4CAGF,CAEA,wBACE,YAAa,CACb,6BACF","file":"underline_nav.css","sourcesContent":["/* UnderlineNav */\n\n.UnderlineNav {\n display: flex;\n min-height: var(--base-size-48);\n overflow-x: auto;\n overflow-y: hidden;\n box-shadow: inset 0 -1px 0 var(--color-border-muted);\n -webkit-overflow-scrolling: auto;\n justify-content: space-between;\n\n & .Counter {\n margin-left: var(--control-medium-gap);\n color: var(--color-fg-default);\n background-color: var(--color-neutral-muted);\n }\n\n & .Counter--primary {\n color: var(--color-fg-on-emphasis);\n background-color: var(--color-neutral-emphasis);\n }\n}\n\n.UnderlineNav-body {\n display: flex;\n align-items: center;\n gap: var(--control-medium-gap);\n list-style: none;\n}\n\n.UnderlineNav-item {\n position: relative;\n display: flex;\n padding: 0 var(--control-medium-paddingInline-condensed);\n font-size: var(--text-body-size-medium);\n line-height: 30px;\n color: var(--color-fg-default);\n text-align: center;\n white-space: nowrap;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n border-radius: var(--borderRadius-medium);\n align-items: center;\n\n &:hover,\n &:focus,\n &:focus-visible {\n color: var(--color-fg-default);\n text-decoration: none;\n border-bottom-color: var(--color-neutral-muted);\n outline-offset: -2px;\n transition: border-bottom-color 0.12s ease-out;\n }\n\n /* renders a visibly hidden \"copy\" of the label in bold, reserving box space for when label becomes bold on selected */\n & [data-content]::before {\n display: block;\n height: 0;\n font-weight: var(--base-text-weight-semibold);\n visibility: hidden;\n content: attr(data-content);\n }\n\n /* increase touch target area */\n &::before {\n @mixin minTouchTarget 48px;\n }\n\n /* hover state was \"sticking\" on mobile after click */\n @media (pointer: fine) {\n &:hover {\n color: var(--color-fg-default);\n text-decoration: none;\n background: var(--color-action-list-item-default-hover-bg);\n transition: background 0.12s ease-out;\n }\n }\n\n &.selected,\n &[role='tab'][aria-selected='true'],\n &[aria-current]:not([aria-current='false']) {\n font-weight: var(--base-text-weight-semibold);\n color: var(--color-fg-default);\n border-bottom-color: var(--color-primer-border-active);\n\n /* current/selected underline */\n &::after {\n position: absolute;\n z-index: 1; /* raise above full-width flash banner */\n right: 50%;\n bottom: calc(50% - 25px); /* 48px total height / 2 (24px) + 1px */\n width: 100%;\n height: 2px;\n content: '';\n background: var(--color-primer-border-active);\n border-radius: var(--borderRadius-medium);\n transform: translate(50%, -50%);\n }\n }\n}\n\n.UnderlineNav--right {\n justify-content: flex-end;\n\n & .UnderlineNav-actions {\n flex: 1 1 auto;\n }\n}\n\n.UnderlineNav-actions {\n align-self: center;\n}\n\n.UnderlineNav--full {\n display: block;\n\n /* required for underline to align with additional wrapper element */\n & .UnderlineNav-body {\n min-height: var(--base-size-48);\n }\n}\n\n.UnderlineNav-octicon {\n display: inline !important;\n margin-right: var(--control-medium-gap);\n color: var(--color-fg-muted);\n fill: var(--color-fg-muted);\n}\n\n.UnderlineNav-container {\n display: flex;\n justify-content: space-between;\n}\n",null]}
1
+ {"version":3,"sources":["underline_nav.pcss","<no source>"],"names":[],"mappings":"AAEA,cAME,+BAAgC,CADhC,4EAAmD,CAJnD,YAAa,CAMb,6BAA8B,CAL9B,mCAA+B,CAC/B,eAAgB,CAChB,iBAeF,CAVE,uBAGE,wEAA0E,CAD1E,oDAA6B,CAD7B,2CAGF,CAEA,gCAEE,uEAAiD,CADjD,2DAEF,CAGF,mBAEE,kBAAmB,CADnB,YAAa,CAEb,mCAA8B,CAC9B,eACF,CAEA,mBAaE,kBAAmB,CAHnB,wBAA6B,CAC7B,QAAS,CACT,4CAAyC,CANzC,oDAA6B,CAG7B,cAAe,CAPf,YAAa,CAEb,8CAAuC,CACvC,gBAAiB,CAFjB,6DAAwD,CAFxD,iBAAkB,CAMlB,iBAAkB,CAClB,kBA8DF,CAvDE,mFAKE,+EAAqD,CAFrD,oDAA6B,CAG7B,mBAAoB,CAFpB,oBAAqB,CAGrB,4CACF,CAGA,yCAKE,0BAA2B,CAJ3B,aAAc,CAEd,gDAA6C,CAD7C,QAAS,CAET,iBAEF,CAIE,0BClEJ,WAAA,YAAA,SAAA,gBAAA,kBAAA,QAAA,4CAAA,UDkE8B,CAI5B,sBACE,yBAGE,kGAAoD,CAFpD,oDAA6B,CAC7B,oBAAqB,CAErB,mCACF,CACF,CAEA,wIAKE,4FAA2D,CAD3D,oDAA6B,CAD7B,gDAiBF,CAZE,0JAQE,mFAAkD,CAClD,4CAAyC,CALzC,uBAAwB,CAGxB,UAAW,CADX,UAAW,CALX,iBAAkB,CAElB,SAAU,CAOV,6BAA+B,CAL/B,UAAW,CAHX,SASF,CAIJ,qBACE,wBAKF,CAHE,2CACE,aACF,CAGF,sBACE,iBACF,CAEA,oBACE,aAMF,CAHE,uCACE,mCACF,CAGF,sBAIE,+CAA0B,CAD1B,gDAA2B,CAF3B,wBAA0B,CAC1B,4CAGF,CAEA,wBACE,YAAa,CACb,6BACF","file":"underline_nav.css","sourcesContent":["/* UnderlineNav */\n\n.UnderlineNav {\n display: flex;\n min-height: var(--base-size-48);\n overflow-x: auto;\n overflow-y: hidden;\n box-shadow: inset 0 -1px 0 var(--borderColor-muted);\n -webkit-overflow-scrolling: auto;\n justify-content: space-between;\n\n & .Counter {\n margin-left: var(--control-medium-gap);\n color: var(--fgColor-default);\n background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted));\n }\n\n & .Counter--primary {\n color: var(--fgColor-onEmphasis);\n background-color: var(--bgColor-neutral-emphasis);\n }\n}\n\n.UnderlineNav-body {\n display: flex;\n align-items: center;\n gap: var(--control-medium-gap);\n list-style: none;\n}\n\n.UnderlineNav-item {\n position: relative;\n display: flex;\n padding: 0 var(--control-medium-paddingInline-condensed);\n font-size: var(--text-body-size-medium);\n line-height: 30px;\n color: var(--fgColor-default);\n text-align: center;\n white-space: nowrap;\n cursor: pointer;\n background-color: transparent;\n border: 0;\n border-radius: var(--borderRadius-medium);\n align-items: center;\n\n &:hover,\n &:focus,\n &:focus-visible {\n color: var(--fgColor-default);\n text-decoration: none;\n border-bottom-color: var(--borderColor-neutral-muted);\n outline-offset: -2px;\n transition: border-bottom-color 0.12s ease-out;\n }\n\n /* renders a visibly hidden \"copy\" of the label in bold, reserving box space for when label becomes bold on selected */\n & [data-content]::before {\n display: block;\n height: 0;\n font-weight: var(--base-text-weight-semibold);\n visibility: hidden;\n content: attr(data-content);\n }\n\n /* increase touch target area */\n &::before {\n @mixin minTouchTarget 48px;\n }\n\n /* hover state was \"sticking\" on mobile after click */\n @media (pointer: fine) {\n &:hover {\n color: var(--fgColor-default);\n text-decoration: none;\n background: var(--control-transparent-bgColor-hover);\n transition: background 0.12s ease-out;\n }\n }\n\n &.selected,\n &[role='tab'][aria-selected='true'],\n &[aria-current]:not([aria-current='false']) {\n font-weight: var(--base-text-weight-semibold);\n color: var(--fgColor-default);\n border-bottom-color: var(--underlineNav-borderColor-active);\n\n /* current/selected underline */\n &::after {\n position: absolute;\n z-index: 1; /* raise above full-width flash banner */\n right: 50%;\n bottom: calc(50% - 25px); /* 48px total height / 2 (24px) + 1px */\n width: 100%;\n height: 2px;\n content: '';\n background: var(--underlineNav-borderColor-active);\n border-radius: var(--borderRadius-medium);\n transform: translate(50%, -50%);\n }\n }\n}\n\n.UnderlineNav--right {\n justify-content: flex-end;\n\n & .UnderlineNav-actions {\n flex: 1 1 auto;\n }\n}\n\n.UnderlineNav-actions {\n align-self: center;\n}\n\n.UnderlineNav--full {\n display: block;\n\n /* required for underline to align with additional wrapper element */\n & .UnderlineNav-body {\n min-height: var(--base-size-48);\n }\n}\n\n.UnderlineNav-octicon {\n display: inline !important;\n margin-right: var(--control-medium-gap);\n color: var(--fgColor-muted);\n fill: var(--fgColor-muted);\n}\n\n.UnderlineNav-container {\n display: flex;\n justify-content: space-between;\n}\n",null]}
@@ -5,19 +5,19 @@
5
5
  min-height: var(--base-size-48);
6
6
  overflow-x: auto;
7
7
  overflow-y: hidden;
8
- box-shadow: inset 0 -1px 0 var(--color-border-muted);
8
+ box-shadow: inset 0 -1px 0 var(--borderColor-muted);
9
9
  -webkit-overflow-scrolling: auto;
10
10
  justify-content: space-between;
11
11
 
12
12
  & .Counter {
13
13
  margin-left: var(--control-medium-gap);
14
- color: var(--color-fg-default);
15
- background-color: var(--color-neutral-muted);
14
+ color: var(--fgColor-default);
15
+ background-color: var(--bgColor-neutral-muted, var(--color-neutral-muted));
16
16
  }
17
17
 
18
18
  & .Counter--primary {
19
- color: var(--color-fg-on-emphasis);
20
- background-color: var(--color-neutral-emphasis);
19
+ color: var(--fgColor-onEmphasis);
20
+ background-color: var(--bgColor-neutral-emphasis);
21
21
  }
22
22
  }
23
23
 
@@ -34,7 +34,7 @@
34
34
  padding: 0 var(--control-medium-paddingInline-condensed);
35
35
  font-size: var(--text-body-size-medium);
36
36
  line-height: 30px;
37
- color: var(--color-fg-default);
37
+ color: var(--fgColor-default);
38
38
  text-align: center;
39
39
  white-space: nowrap;
40
40
  cursor: pointer;
@@ -46,9 +46,9 @@
46
46
  &:hover,
47
47
  &:focus,
48
48
  &:focus-visible {
49
- color: var(--color-fg-default);
49
+ color: var(--fgColor-default);
50
50
  text-decoration: none;
51
- border-bottom-color: var(--color-neutral-muted);
51
+ border-bottom-color: var(--borderColor-neutral-muted);
52
52
  outline-offset: -2px;
53
53
  transition: border-bottom-color 0.12s ease-out;
54
54
  }
@@ -70,9 +70,9 @@
70
70
  /* hover state was "sticking" on mobile after click */
71
71
  @media (pointer: fine) {
72
72
  &:hover {
73
- color: var(--color-fg-default);
73
+ color: var(--fgColor-default);
74
74
  text-decoration: none;
75
- background: var(--color-action-list-item-default-hover-bg);
75
+ background: var(--control-transparent-bgColor-hover);
76
76
  transition: background 0.12s ease-out;
77
77
  }
78
78
  }
@@ -81,8 +81,8 @@
81
81
  &[role='tab'][aria-selected='true'],
82
82
  &[aria-current]:not([aria-current='false']) {
83
83
  font-weight: var(--base-text-weight-semibold);
84
- color: var(--color-fg-default);
85
- border-bottom-color: var(--color-primer-border-active);
84
+ color: var(--fgColor-default);
85
+ border-bottom-color: var(--underlineNav-borderColor-active);
86
86
 
87
87
  /* current/selected underline */
88
88
  &::after {
@@ -93,7 +93,7 @@
93
93
  width: 100%;
94
94
  height: 2px;
95
95
  content: '';
96
- background: var(--color-primer-border-active);
96
+ background: var(--underlineNav-borderColor-active);
97
97
  border-radius: var(--borderRadius-medium);
98
98
  transform: translate(50%, -50%);
99
99
  }
@@ -124,8 +124,8 @@
124
124
  .UnderlineNav-octicon {
125
125
  display: inline !important;
126
126
  margin-right: var(--control-medium-gap);
127
- color: var(--color-fg-muted);
128
- fill: var(--color-fg-muted);
127
+ color: var(--fgColor-muted);
128
+ fill: var(--fgColor-muted);
129
129
  }
130
130
 
131
131
  .UnderlineNav-container {
@@ -1 +1 @@
1
- .avatar{background-color:var(--color-avatar-bg);border-radius:var(--borderRadius-medium,6px);box-shadow:0 0 0 1px var(--color-avatar-border);display:inline-block;flex-shrink:0;line-height:1;overflow:hidden;vertical-align:middle}.avatar-link{float:left;line-height:1}.avatar-group-item{display:inline-block;margin-bottom:3px}.avatar-1,.avatar-2,.avatar-small{border-radius:var(--borderRadius-small,3px)}.avatar-1{height:var(--base-size-16,1rem);width:var(--base-size-16,1rem)}.avatar-2{height:var(--base-size-20,1.25rem);width:var(--base-size-20,1.25rem)}.avatar-3{height:var(--base-size-24,1.5rem);width:var(--base-size-24,1.5rem)}.avatar-4{height:var(--base-size-28,1.75rem);width:var(--base-size-28,1.75rem)}.avatar-5{height:var(--base-size-32,2rem);width:var(--base-size-32,2rem)}.avatar-6{height:var(--base-size-40,2.5rem);width:var(--base-size-40,2.5rem)}.avatar-7{height:var(--base-size-48,3rem);width:var(--base-size-48,3rem)}.avatar-8{height:var(--base-size-64,4rem);width:var(--base-size-64,4rem)}
1
+ .avatar{background-color:var(--avatar-bgColor,var(--color-avatar-bg));border-radius:var(--borderRadius-medium,6px);box-shadow:0 0 0 1px var(--avatar-borderColor,var(--color-avatar-border));display:inline-block;flex-shrink:0;line-height:1;overflow:hidden;vertical-align:middle}.avatar-link{float:left;line-height:1}.avatar-group-item{display:inline-block;margin-bottom:3px}.avatar-1,.avatar-2,.avatar-small{border-radius:var(--borderRadius-small,3px)}.avatar-1{height:var(--base-size-16,1rem);width:var(--base-size-16,1rem)}.avatar-2{height:var(--base-size-20,1.25rem);width:var(--base-size-20,1.25rem)}.avatar-3{height:var(--base-size-24,1.5rem);width:var(--base-size-24,1.5rem)}.avatar-4{height:var(--base-size-28,1.75rem);width:var(--base-size-28,1.75rem)}.avatar-5{height:var(--base-size-32,2rem);width:var(--base-size-32,2rem)}.avatar-6{height:var(--base-size-40,2.5rem);width:var(--base-size-40,2.5rem)}.avatar-7{height:var(--base-size-48,3rem);width:var(--base-size-48,3rem)}.avatar-8{height:var(--base-size-64,4rem);width:var(--base-size-64,4rem)}
@@ -1 +1 @@
1
- {"version":3,"sources":["avatar.pcss"],"names":[],"mappings":"AAEA,QAKE,uCAAwC,CACxC,4CAAyC,CAEzC,+CAAgD,CAPhD,oBAAqB,CAMrB,aAAc,CAJd,aAAc,CADd,eAAgB,CAEhB,qBAKF,CAEA,aACE,UAAW,CACX,aACF,CAGA,mBACE,oBAAqB,CACrB,iBACF,CAIA,kCAGE,2CACF,CAIA,UAEE,+BAA2B,CAD3B,8BAEF,CAEA,UAEE,kCAA2B,CAD3B,iCAEF,CAEA,UAEE,iCAA2B,CAD3B,gCAEF,CAEA,UAEE,kCAA2B,CAD3B,iCAEF,CAEA,UAEE,+BAA2B,CAD3B,8BAEF,CAEA,UAEE,iCAA2B,CAD3B,gCAEF,CAEA,UAEE,+BAA2B,CAD3B,8BAEF,CAEA,UAEE,+BAA2B,CAD3B,8BAEF","file":"avatar.css","sourcesContent":["/* avatar */\n\n.avatar {\n display: inline-block;\n overflow: hidden; /* Ensure page layout in Firefox should images fail to load */\n line-height: 1;\n vertical-align: middle;\n background-color: var(--color-avatar-bg); /* adds opaque bg to transparent avatars */\n border-radius: var(--borderRadius-medium);\n flex-shrink: 0;\n box-shadow: 0 0 0 1px var(--color-avatar-border);\n}\n\n.avatar-link {\n float: left;\n line-height: 1;\n}\n\n/* User for example on /stars and /user for grids of avatars */\n.avatar-group-item {\n display: inline-block;\n margin-bottom: 3px;\n}\n\n/* Border radius */\n\n.avatar-1,\n.avatar-2,\n.avatar-small {\n border-radius: var(--borderRadius-small);\n}\n\n/* Sizes */\n\n.avatar-1 {\n width: var(--base-size-16);\n height: var(--base-size-16);\n}\n\n.avatar-2 {\n width: var(--base-size-20);\n height: var(--base-size-20);\n}\n\n.avatar-3 {\n width: var(--base-size-24);\n height: var(--base-size-24);\n}\n\n.avatar-4 {\n width: var(--base-size-28);\n height: var(--base-size-28);\n}\n\n.avatar-5 {\n width: var(--base-size-32);\n height: var(--base-size-32);\n}\n\n.avatar-6 {\n width: var(--base-size-40);\n height: var(--base-size-40);\n}\n\n.avatar-7 {\n width: var(--base-size-48);\n height: var(--base-size-48);\n}\n\n.avatar-8 {\n width: var(--base-size-64);\n height: var(--base-size-64);\n}\n"]}
1
+ {"version":3,"sources":["avatar.pcss"],"names":[],"mappings":"AAEA,QAKE,6DAAuC,CACvC,4CAAyC,CAEzC,yEAA+C,CAP/C,oBAAqB,CAMrB,aAAc,CAJd,aAAc,CADd,eAAgB,CAEhB,qBAKF,CAEA,aACE,UAAW,CACX,aACF,CAGA,mBACE,oBAAqB,CACrB,iBACF,CAIA,kCAGE,2CACF,CAIA,UAEE,+BAA2B,CAD3B,8BAEF,CAEA,UAEE,kCAA2B,CAD3B,iCAEF,CAEA,UAEE,iCAA2B,CAD3B,gCAEF,CAEA,UAEE,kCAA2B,CAD3B,iCAEF,CAEA,UAEE,+BAA2B,CAD3B,8BAEF,CAEA,UAEE,iCAA2B,CAD3B,gCAEF,CAEA,UAEE,+BAA2B,CAD3B,8BAEF,CAEA,UAEE,+BAA2B,CAD3B,8BAEF","file":"avatar.css","sourcesContent":["/* avatar */\n\n.avatar {\n display: inline-block;\n overflow: hidden; /* Ensure page layout in Firefox should images fail to load */\n line-height: 1;\n vertical-align: middle;\n background-color: var(--avatar-bgColor); /* adds opaque bg to transparent avatars */\n border-radius: var(--borderRadius-medium);\n flex-shrink: 0;\n box-shadow: 0 0 0 1px var(--avatar-borderColor);\n}\n\n.avatar-link {\n float: left;\n line-height: 1;\n}\n\n/* User for example on /stars and /user for grids of avatars */\n.avatar-group-item {\n display: inline-block;\n margin-bottom: 3px;\n}\n\n/* Border radius */\n\n.avatar-1,\n.avatar-2,\n.avatar-small {\n border-radius: var(--borderRadius-small);\n}\n\n/* Sizes */\n\n.avatar-1 {\n width: var(--base-size-16);\n height: var(--base-size-16);\n}\n\n.avatar-2 {\n width: var(--base-size-20);\n height: var(--base-size-20);\n}\n\n.avatar-3 {\n width: var(--base-size-24);\n height: var(--base-size-24);\n}\n\n.avatar-4 {\n width: var(--base-size-28);\n height: var(--base-size-28);\n}\n\n.avatar-5 {\n width: var(--base-size-32);\n height: var(--base-size-32);\n}\n\n.avatar-6 {\n width: var(--base-size-40);\n height: var(--base-size-40);\n}\n\n.avatar-7 {\n width: var(--base-size-48);\n height: var(--base-size-48);\n}\n\n.avatar-8 {\n width: var(--base-size-64);\n height: var(--base-size-64);\n}\n"]}
@@ -5,10 +5,10 @@
5
5
  overflow: hidden; /* Ensure page layout in Firefox should images fail to load */
6
6
  line-height: 1;
7
7
  vertical-align: middle;
8
- background-color: var(--color-avatar-bg); /* adds opaque bg to transparent avatars */
8
+ background-color: var(--avatar-bgColor); /* adds opaque bg to transparent avatars */
9
9
  border-radius: var(--borderRadius-medium);
10
10
  flex-shrink: 0;
11
- box-shadow: 0 0 0 1px var(--color-avatar-border);
11
+ box-shadow: 0 0 0 1px var(--avatar-borderColor);
12
12
  }
13
13
 
14
14
  .avatar-link {