primer_view_components 0.1.8 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +79 -0
  3. data/README.md +1 -1
  4. data/app/assets/javascripts/primer_view_components.js +1 -1
  5. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  6. data/app/assets/styles/primer_view_components.css +1 -3
  7. data/app/assets/styles/primer_view_components.css.map +1 -1
  8. data/app/components/primer/alpha/action_list/item.rb +3 -5
  9. data/app/components/primer/alpha/action_list.css +1 -1
  10. data/app/components/primer/alpha/action_list.css.json +16 -16
  11. data/app/components/primer/alpha/action_list.css.map +1 -1
  12. data/app/components/primer/alpha/action_list.pcss +145 -145
  13. data/app/components/primer/alpha/action_list.rb +30 -15
  14. data/app/components/primer/alpha/action_menu/action_menu_element.d.ts +2 -1
  15. data/app/components/primer/alpha/action_menu/action_menu_element.js +44 -34
  16. data/app/components/primer/alpha/action_menu/action_menu_element.ts +32 -30
  17. data/app/components/primer/alpha/action_menu/list.rb +6 -1
  18. data/app/components/primer/alpha/action_menu.rb +1 -1
  19. data/app/components/primer/alpha/auto_complete.css +1 -1
  20. data/app/components/primer/alpha/auto_complete.css.map +1 -1
  21. data/app/components/primer/alpha/auto_complete.pcss +3 -3
  22. data/app/components/primer/alpha/banner.css +1 -1
  23. data/app/components/primer/alpha/banner.css.map +1 -1
  24. data/app/components/primer/alpha/banner.pcss +11 -11
  25. data/app/components/primer/alpha/button_marketing.css.map +1 -1
  26. data/app/components/primer/alpha/button_marketing.pcss +5 -12
  27. data/app/components/primer/alpha/button_marketing.rb +3 -0
  28. data/app/components/primer/alpha/dialog.css +1 -1
  29. data/app/components/primer/alpha/dialog.css.map +1 -1
  30. data/app/components/primer/alpha/dialog.pcss +36 -36
  31. data/app/components/primer/alpha/dropdown.css +1 -1
  32. data/app/components/primer/alpha/dropdown.css.map +1 -1
  33. data/app/components/primer/alpha/dropdown.pcss +12 -12
  34. data/app/components/primer/alpha/form_control.html.erb +1 -1
  35. data/app/components/primer/alpha/hellip_button.rb +3 -1
  36. data/app/components/primer/alpha/layout.css +1 -1
  37. data/app/components/primer/alpha/layout.css.map +1 -1
  38. data/app/components/primer/alpha/layout.pcss +4 -4
  39. data/app/components/primer/alpha/menu.css +1 -1
  40. data/app/components/primer/alpha/menu.css.map +1 -1
  41. data/app/components/primer/alpha/menu.pcss +21 -21
  42. data/app/components/primer/alpha/modal_dialog.js +17 -4
  43. data/app/components/primer/alpha/modal_dialog.ts +17 -4
  44. data/app/components/primer/alpha/nav_list/item.rb +2 -0
  45. data/app/components/primer/alpha/nav_list.js +6 -0
  46. data/app/components/primer/alpha/nav_list.rb +55 -36
  47. data/app/components/primer/alpha/nav_list.ts +8 -0
  48. data/app/components/primer/alpha/octicon_symbols.html.erb +1 -1
  49. data/app/components/primer/alpha/overlay/header.html.erb +5 -3
  50. data/app/components/primer/alpha/overlay/header.rb +4 -1
  51. data/app/components/primer/alpha/overlay.css +1 -1
  52. data/app/components/primer/alpha/overlay.css.json +1 -2
  53. data/app/components/primer/alpha/overlay.css.map +1 -1
  54. data/app/components/primer/alpha/overlay.pcss +14 -4
  55. data/app/components/primer/alpha/overlay.rb +1 -0
  56. data/app/components/primer/alpha/segmented_control.css +1 -1
  57. data/app/components/primer/alpha/segmented_control.css.map +1 -1
  58. data/app/components/primer/alpha/segmented_control.pcss +24 -33
  59. data/app/components/primer/alpha/tab_nav.css +1 -1
  60. data/app/components/primer/alpha/tab_nav.css.map +1 -1
  61. data/app/components/primer/alpha/tab_nav.pcss +12 -12
  62. data/app/components/primer/alpha/text_field.css +1 -3
  63. data/app/components/primer/alpha/text_field.css.json +1 -0
  64. data/app/components/primer/alpha/text_field.css.map +1 -1
  65. data/app/components/primer/alpha/text_field.pcss +87 -83
  66. data/app/components/primer/alpha/toggle_switch.css +1 -1
  67. data/app/components/primer/alpha/toggle_switch.css.json +11 -11
  68. data/app/components/primer/alpha/toggle_switch.css.map +1 -1
  69. data/app/components/primer/alpha/toggle_switch.d.ts +1 -1
  70. data/app/components/primer/alpha/toggle_switch.html.erb +2 -2
  71. data/app/components/primer/alpha/toggle_switch.js +44 -42
  72. data/app/components/primer/alpha/toggle_switch.pcss +16 -16
  73. data/app/components/primer/alpha/toggle_switch.rb +7 -0
  74. data/app/components/primer/alpha/toggle_switch.ts +50 -41
  75. data/app/components/primer/alpha/underline_nav.css +1 -1
  76. data/app/components/primer/alpha/underline_nav.css.map +1 -1
  77. data/app/components/primer/alpha/underline_nav.pcss +11 -11
  78. data/app/components/primer/beta/auto_complete.rb +1 -1
  79. data/app/components/primer/beta/avatar.css +1 -1
  80. data/app/components/primer/beta/avatar.css.map +1 -1
  81. data/app/components/primer/beta/avatar.pcss +18 -18
  82. data/app/components/primer/beta/avatar_stack.css +1 -1
  83. data/app/components/primer/beta/avatar_stack.css.map +1 -1
  84. data/app/components/primer/beta/avatar_stack.pcss +5 -5
  85. data/app/components/primer/beta/base_button.rb +11 -0
  86. data/app/components/primer/beta/blankslate.css +1 -1
  87. data/app/components/primer/beta/blankslate.css.map +1 -1
  88. data/app/components/primer/beta/blankslate.pcss +16 -16
  89. data/app/components/primer/beta/border_box.css +1 -1
  90. data/app/components/primer/beta/border_box.css.json +1 -1
  91. data/app/components/primer/beta/border_box.css.map +1 -1
  92. data/app/components/primer/beta/border_box.pcss +40 -42
  93. data/app/components/primer/beta/button.css +1 -1
  94. data/app/components/primer/beta/button.css.json +4 -0
  95. data/app/components/primer/beta/button.css.map +1 -1
  96. data/app/components/primer/beta/button.pcss +39 -24
  97. data/app/components/primer/beta/button.rb +3 -0
  98. data/app/components/primer/beta/button_group.css +1 -0
  99. data/app/components/primer/beta/button_group.css.json +14 -0
  100. data/app/components/primer/beta/button_group.css.map +1 -0
  101. data/app/components/primer/beta/button_group.pcss +27 -0
  102. data/app/components/primer/beta/button_group.rb +19 -19
  103. data/app/components/primer/beta/close_button.rb +3 -1
  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 +5 -5
  107. data/app/components/primer/beta/details.html.erb +6 -2
  108. data/app/components/primer/beta/details.rb +18 -10
  109. data/app/components/primer/beta/flash.css +1 -1
  110. data/app/components/primer/beta/flash.css.map +1 -1
  111. data/app/components/primer/beta/flash.pcss +12 -12
  112. data/app/components/primer/beta/icon_button.rb +7 -3
  113. data/app/components/primer/beta/label.css +1 -1
  114. data/app/components/primer/beta/label.css.map +1 -1
  115. data/app/components/primer/beta/label.pcss +3 -3
  116. data/app/components/primer/beta/popover.css +1 -1
  117. data/app/components/primer/beta/popover.css.map +1 -1
  118. data/app/components/primer/beta/popover.pcss +4 -4
  119. data/app/components/primer/beta/state.css +1 -1
  120. data/app/components/primer/beta/state.css.map +1 -1
  121. data/app/components/primer/beta/state.pcss +7 -7
  122. data/app/components/primer/beta/subhead.css +1 -1
  123. data/app/components/primer/beta/subhead.css.map +1 -1
  124. data/app/components/primer/beta/subhead.pcss +9 -9
  125. data/app/components/primer/beta/timeline_item.css +1 -1
  126. data/app/components/primer/beta/timeline_item.css.map +1 -1
  127. data/app/components/primer/beta/timeline_item.pcss +18 -18
  128. data/app/components/primer/beta/truncate.css +1 -1
  129. data/app/components/primer/beta/truncate.css.map +1 -1
  130. data/app/components/primer/beta/truncate.pcss +1 -1
  131. data/app/components/primer/focus_group.js +8 -13
  132. data/app/components/primer/focus_group.ts +8 -12
  133. data/app/components/primer/primer.d.ts +1 -0
  134. data/app/components/primer/primer.js +1 -0
  135. data/app/components/primer/primer.pcss +1 -0
  136. data/app/components/primer/primer.ts +1 -0
  137. data/lib/postcss_mixins/activeIndicatorLine.pcss +4 -4
  138. data/lib/primer/accessibility.rb +74 -0
  139. data/lib/primer/forms/dsl/input.rb +4 -8
  140. data/lib/primer/forms/dsl/text_field_input.rb +0 -4
  141. data/lib/primer/forms/dsl/toggle_switch_input.rb +4 -0
  142. data/lib/primer/forms/form_control.html.erb +3 -5
  143. data/lib/primer/forms/primer_base_component_wrapper.html.erb +3 -0
  144. data/lib/primer/forms/primer_base_component_wrapper.rb +24 -0
  145. data/lib/primer/forms/toggle_switch.html.erb +3 -3
  146. data/lib/primer/forms/toggle_switch.rb +6 -2
  147. data/lib/primer/forms/toggle_switch_input.js +7 -2
  148. data/lib/primer/forms/toggle_switch_input.ts +9 -2
  149. data/lib/primer/static/generate_info_arch.rb +3 -0
  150. data/lib/primer/static/generate_previews.rb +15 -8
  151. data/lib/primer/view_components/linters/deprecated_components_counter.rb +37 -13
  152. data/lib/primer/view_components/version.rb +2 -2
  153. data/lib/primer/yard/component_manifest.rb +1 -1
  154. data/lib/primer/yard/lookbook_pages_backend.rb +8 -2
  155. data/lib/primer/yard/registry.rb +4 -0
  156. data/previews/pages/forms/03_caption_templates.md.erb +1 -1
  157. data/previews/pages/forms/04_after_content.md.erb +1 -1
  158. data/previews/pages/forms/06_miscellaneous_inputs.md.erb +1 -1
  159. data/previews/pages/forms/07_toggle_switch_forms.md.erb +1 -1
  160. data/previews/primer/alpha/action_menu_preview/two_menus.html.erb +13 -0
  161. data/previews/primer/alpha/action_menu_preview/with_actions.html.erb +21 -0
  162. data/previews/primer/alpha/action_menu_preview.rb +5 -13
  163. data/previews/primer/alpha/button_marketing_preview.rb +3 -2
  164. data/previews/primer/alpha/dialog_preview.rb +4 -3
  165. data/previews/primer/alpha/hellip_button_preview.rb +3 -2
  166. data/previews/primer/alpha/nav_list_preview.rb +1 -1
  167. data/previews/primer/alpha/overlay_preview/middle_of_page_with_relative_container.html.erb +19 -0
  168. data/previews/primer/alpha/overlay_preview.rb +31 -0
  169. data/previews/primer/beta/base_button_preview.rb +9 -2
  170. data/previews/primer/beta/button_group_preview/action_menus.html.erb +8 -0
  171. data/previews/primer/beta/button_group_preview.rb +49 -11
  172. data/previews/primer/beta/button_preview/trailing_counter.html.erb +1 -1
  173. data/previews/primer/beta/button_preview.rb +5 -2
  174. data/previews/primer/beta/close_button_preview.rb +3 -2
  175. data/previews/primer/beta/details_preview.rb +11 -8
  176. data/previews/primer/forms_preview.rb +44 -0
  177. data/static/arguments.json +11 -5
  178. data/static/classes.json +378 -372
  179. data/static/constants.json +0 -1
  180. data/static/info_arch.json +5457 -1364
  181. data/static/previews.json +5197 -1428
  182. metadata +40 -36
  183. data/lib/tasks/docs.rake +0 -185
  184. data/lib/tasks/helpers/ast_processor.rb +0 -44
  185. data/lib/tasks/helpers/ast_traverser.rb +0 -77
  186. data/lib/tasks/primer_view_components.rake +0 -47
  187. data/lib/tasks/static.rake +0 -29
  188. data/lib/tasks/test.rake +0 -83
  189. data/lib/tasks/utilities.rake +0 -109
  190. data/previews/primer/forms/forms_preview.rb +0 -48
  191. /data/previews/primer/{forms/forms_preview → forms_preview}/after_content_form.html.erb +0 -0
  192. /data/previews/primer/{forms/forms_preview → forms_preview}/array_check_box_group_form.html.erb +0 -0
  193. /data/previews/primer/{forms/forms_preview → forms_preview}/caption_template_form.html.erb +0 -0
  194. /data/previews/primer/{forms/forms_preview → forms_preview}/check_box_group_form.html.erb +0 -0
  195. /data/previews/primer/{forms/forms_preview → forms_preview}/check_box_with_nested_form.html.erb +0 -0
  196. /data/previews/primer/{forms/forms_preview → forms_preview}/composed_form.html.erb +0 -0
  197. /data/previews/primer/{forms/forms_preview → forms_preview}/example_toggle_switch_form.html.erb +0 -0
  198. /data/previews/primer/{forms/forms_preview → forms_preview}/horizontal_form.html.erb +0 -0
  199. /data/previews/primer/{forms/forms_preview → forms_preview}/immediate_validation_form.html.erb +0 -0
  200. /data/previews/primer/{forms/forms_preview → forms_preview}/invalid_form.html.erb +0 -0
  201. /data/previews/primer/{forms/forms_preview → forms_preview}/multi_input_form.html.erb +0 -0
  202. /data/previews/primer/{forms/forms_preview → forms_preview}/multi_text_field_form.html.erb +0 -0
  203. /data/previews/primer/{forms/forms_preview → forms_preview}/name_with_question_mark_form.html.erb +0 -0
  204. /data/previews/primer/{forms/forms_preview → forms_preview}/radio_button_group_form.html.erb +0 -0
  205. /data/previews/primer/{forms/forms_preview → forms_preview}/radio_button_with_nested_form.html.erb +0 -0
  206. /data/previews/primer/{forms/forms_preview → forms_preview}/select_form.html.erb +0 -0
  207. /data/previews/primer/{forms/forms_preview → forms_preview}/single_text_field_form.html.erb +0 -0
  208. /data/previews/primer/{forms/forms_preview → forms_preview}/submit_button_form.html.erb +0 -0
  209. /data/previews/primer/{forms/forms_preview → forms_preview}/text_field_and_checkbox_form.html.erb +0 -0
@@ -26,46 +26,59 @@ let ToggleSwitchElement = class ToggleSwitchElement extends HTMLElement {
26
26
  isRemote() {
27
27
  return this.src != null;
28
28
  }
29
- toggle() {
29
+ async toggle() {
30
30
  if (this.isDisabled()) {
31
31
  return;
32
32
  }
33
- if (this.isRemote()) {
34
- this.setLoadingState();
35
- this.submitForm();
36
- }
37
- else {
33
+ if (!this.isRemote()) {
38
34
  this.performToggle();
35
+ return;
36
+ }
37
+ // toggle immediately to tell screen readers the switch was clicked
38
+ this.performToggle();
39
+ this.setLoadingState();
40
+ try {
41
+ await this.submitForm();
42
+ }
43
+ catch (error) {
44
+ if (error instanceof Error) {
45
+ // because we toggle immediately when the switch is clicked, toggle back to the
46
+ // old state on failure
47
+ this.setErrorState(error.message || 'An error occurred, please try again.');
48
+ this.performToggle();
49
+ }
50
+ return;
39
51
  }
52
+ this.setSuccessState();
40
53
  }
41
54
  turnOn() {
42
55
  if (this.isDisabled()) {
43
56
  return;
44
57
  }
45
- this.switch.setAttribute('aria-checked', 'true');
58
+ this.switch.setAttribute('aria-pressed', 'true');
46
59
  this.classList.add('ToggleSwitch--checked');
47
60
  }
48
61
  turnOff() {
49
62
  if (this.isDisabled()) {
50
63
  return;
51
64
  }
52
- this.switch.setAttribute('aria-checked', 'false');
65
+ this.switch.setAttribute('aria-pressed', 'false');
53
66
  this.classList.remove('ToggleSwitch--checked');
54
67
  }
55
68
  isOn() {
56
- return this.switch.getAttribute('aria-checked') === 'true';
69
+ return this.switch.getAttribute('aria-pressed') === 'true';
57
70
  }
58
71
  isOff() {
59
72
  return !this.isOn();
60
73
  }
61
74
  isDisabled() {
62
- return this.switch.getAttribute('aria-disabled') === 'true';
75
+ return this.switch.getAttribute('disabled') != null;
63
76
  }
64
77
  disable() {
65
- this.switch.setAttribute('aria-disabled', 'true');
78
+ this.switch.setAttribute('disabled', 'disabled');
66
79
  }
67
80
  enable() {
68
- this.switch.setAttribute('aria-disabled', 'false');
81
+ this.switch.removeAttribute('disabled');
69
82
  }
70
83
  performToggle() {
71
84
  if (this.isOn()) {
@@ -76,9 +89,10 @@ let ToggleSwitchElement = class ToggleSwitchElement extends HTMLElement {
76
89
  }
77
90
  }
78
91
  setLoadingState() {
79
- this.disable();
80
92
  this.errorIcon.setAttribute('hidden', 'hidden');
81
93
  this.loadingSpinner.removeAttribute('hidden');
94
+ const event = new CustomEvent('toggleSwitchLoading', { bubbles: true });
95
+ this.dispatchEvent(event);
82
96
  }
83
97
  setSuccessState() {
84
98
  const event = new CustomEvent('toggleSwitchSuccess', { bubbles: true });
@@ -95,43 +109,31 @@ let ToggleSwitchElement = class ToggleSwitchElement extends HTMLElement {
95
109
  this.errorIcon.removeAttribute('hidden');
96
110
  }
97
111
  this.loadingSpinner.setAttribute('hidden', 'hidden');
98
- this.enable();
99
112
  }
100
113
  async submitForm() {
101
114
  const body = new FormData();
102
115
  if (this.csrf) {
103
116
  body.append(this.csrfField, this.csrf);
104
117
  }
105
- body.append('value', this.isOn() ? '0' : '1');
118
+ body.append('value', this.isOn() ? '1' : '0');
119
+ if (!this.src)
120
+ throw new Error('invalid src');
121
+ let response;
106
122
  try {
107
- if (!this.src)
108
- throw new Error('invalid src');
109
- let response;
110
- try {
111
- response = await fetch(this.src, {
112
- credentials: 'same-origin',
113
- method: 'POST',
114
- headers: {
115
- 'Requested-With': 'XMLHttpRequest'
116
- },
117
- body
118
- });
119
- }
120
- catch (error) {
121
- throw new Error('A network error occurred, please try again.');
122
- }
123
- if (response.ok) {
124
- this.setSuccessState();
125
- this.performToggle();
126
- }
127
- else {
128
- throw new Error(await response.text());
129
- }
123
+ response = await fetch(this.src, {
124
+ credentials: 'same-origin',
125
+ method: 'POST',
126
+ headers: {
127
+ 'Requested-With': 'XMLHttpRequest'
128
+ },
129
+ body
130
+ });
130
131
  }
131
132
  catch (error) {
132
- if (error instanceof Error) {
133
- this.setErrorState(error.message || 'An error occurred, please try again.');
134
- }
133
+ throw new Error('A network error occurred, please try again.');
134
+ }
135
+ if (!response.ok) {
136
+ throw new Error(await response.text());
135
137
  }
136
138
  }
137
139
  };
@@ -146,7 +148,7 @@ __decorate([
146
148
  ], ToggleSwitchElement.prototype, "errorIcon", void 0);
147
149
  __decorate([
148
150
  debounce(300)
149
- ], ToggleSwitchElement.prototype, "submitForm", null);
151
+ ], ToggleSwitchElement.prototype, "toggle", null);
150
152
  ToggleSwitchElement = __decorate([
151
153
  controller
152
154
  ], ToggleSwitchElement);
@@ -9,7 +9,7 @@
9
9
  .ToggleSwitch {
10
10
  align-items: center;
11
11
  display: inline-flex;
12
- gap: var(--controlStack-medium-gap-condensed, 8px);
12
+ gap: var(--controlStack-medium-gap-condensed);
13
13
  }
14
14
 
15
15
  .ToggleSwitch--checked {
@@ -27,16 +27,16 @@
27
27
  .ToggleSwitch-track {
28
28
  position: relative;
29
29
  display: block;
30
- width: var(--base-size-64, 64px);
31
- height: var(--control-medium-size, 32px);
30
+ width: var(--base-size-64);
31
+ height: var(--control-medium-size);
32
32
  padding: 0;
33
33
  overflow: hidden;
34
34
  text-decoration: none;
35
35
  cursor: pointer;
36
36
  user-select: none;
37
37
  background-color: var(--color-switch-track-bg);
38
- border: var(--borderWidth-thin, 1px) solid var(--color-switch-track-border);
39
- border-radius: var(--borderRadius-medium, 6px);
38
+ border: var(--borderWidth-thin) solid var(--color-switch-track-border);
39
+ border-radius: var(--borderRadius-medium);
40
40
  transition-timing-function: cubic-bezier(0.5, 1, 0.89, 1);
41
41
  transition-duration: 80ms;
42
42
  transition-property: background-color, border-color;
@@ -70,17 +70,17 @@
70
70
  }
71
71
  }
72
72
 
73
- .ToggleSwitch-track[aria-checked='true'][aria-disabled='true'] {
73
+ .ToggleSwitch-track[aria-pressed='true'][disabled] {
74
74
  background-color: var(--color-switch-track-disabled-bg);
75
75
  color: var(--color-switch-track-checked-disabled-fg);
76
76
  border-color: transparent;
77
77
  }
78
78
 
79
- .ToggleSwitch-track[aria-checked='true'] {
79
+ .ToggleSwitch-track[aria-pressed='true'] {
80
80
  background-color: var(--color-switch-track-checked-bg);
81
81
  border-color: var(--color-switch-track-checked-border);
82
82
 
83
- &:not([aria-disabled='true']) {
83
+ &:not([disabled]) {
84
84
  &:hover {
85
85
  background-color: var(--color-switch-track-checked-hover-bg);
86
86
  }
@@ -105,7 +105,7 @@
105
105
  }
106
106
  }
107
107
 
108
- .ToggleSwitch-track[aria-disabled='true'] {
108
+ .ToggleSwitch-track[disabled] {
109
109
  cursor: not-allowed;
110
110
  background-color: var(--color-switch-track-disabled-bg);
111
111
  border-color: transparent;
@@ -158,8 +158,8 @@
158
158
  z-index: 1;
159
159
  width: 50%;
160
160
  background-color: var(--color-switch-knob-bg);
161
- border: var(--borderWidth-thin, 1px) solid var(--color-switch-knob-border);
162
- border-radius: var(--borderRadius-medium, 6px);
161
+ border: var(--borderWidth-thin) solid var(--color-switch-knob-border);
162
+ border-radius: var(--borderRadius-medium);
163
163
  box-shadow: var(--color-shadow-medium), var(--color-btn-inset-shadow);
164
164
  transition-timing-function: cubic-bezier(0.5, 1, 0.89, 1);
165
165
  transition-duration: 80ms;
@@ -172,26 +172,26 @@
172
172
 
173
173
  .ToggleSwitch-status {
174
174
  position: relative;
175
- font-size: var(--text-body-size-medium, 14px);
175
+ font-size: var(--text-body-size-medium);
176
176
  line-height: 1.5;
177
177
  color: var(--color-fg-default);
178
178
  text-align: right;
179
179
  }
180
180
 
181
181
  .ToggleSwitch-statusIcon {
182
- width: var(--base-size-16, 16px);
182
+ width: var(--base-size-16);
183
183
  display: flex;
184
184
  margin-top: 0.063rem;
185
185
  }
186
186
 
187
187
  .ToggleSwitch--small {
188
188
  & .ToggleSwitch-status {
189
- font-size: var(--text-body-size-small, 12px);
189
+ font-size: var(--text-body-size-small);
190
190
  }
191
191
 
192
192
  & .ToggleSwitch-track {
193
- width: var(--base-size-48, 48px);
194
- height: var(--control-xsmall-size, 24px);
193
+ width: var(--base-size-48);
194
+ height: var(--control-xsmall-size);
195
195
  }
196
196
  }
197
197
 
@@ -66,6 +66,13 @@ module Primer
66
66
  SIZE_MAPPINGS[@size]
67
67
  )
68
68
 
69
+ @aria_arguments = {
70
+ aria: merge_aria(
71
+ @system_arguments,
72
+ aria: { pressed: on? }
73
+ )
74
+ }
75
+
69
76
  @system_arguments[:src] = @src if @src
70
77
 
71
78
  return unless @src && @csrf_token
@@ -31,17 +31,35 @@ class ToggleSwitchElement extends HTMLElement {
31
31
  return this.src != null
32
32
  }
33
33
 
34
- toggle() {
34
+ @debounce(300)
35
+ async toggle() {
35
36
  if (this.isDisabled()) {
36
37
  return
37
38
  }
38
39
 
39
- if (this.isRemote()) {
40
- this.setLoadingState()
41
- this.submitForm()
42
- } else {
40
+ if (!this.isRemote()) {
43
41
  this.performToggle()
42
+ return
44
43
  }
44
+
45
+ // toggle immediately to tell screen readers the switch was clicked
46
+ this.performToggle()
47
+ this.setLoadingState()
48
+
49
+ try {
50
+ await this.submitForm()
51
+ } catch (error) {
52
+ if (error instanceof Error) {
53
+ // because we toggle immediately when the switch is clicked, toggle back to the
54
+ // old state on failure
55
+ this.setErrorState(error.message || 'An error occurred, please try again.')
56
+ this.performToggle()
57
+ }
58
+
59
+ return
60
+ }
61
+
62
+ this.setSuccessState()
45
63
  }
46
64
 
47
65
  turnOn(): void {
@@ -49,7 +67,7 @@ class ToggleSwitchElement extends HTMLElement {
49
67
  return
50
68
  }
51
69
 
52
- this.switch.setAttribute('aria-checked', 'true')
70
+ this.switch.setAttribute('aria-pressed', 'true')
53
71
  this.classList.add('ToggleSwitch--checked')
54
72
  }
55
73
 
@@ -58,12 +76,12 @@ class ToggleSwitchElement extends HTMLElement {
58
76
  return
59
77
  }
60
78
 
61
- this.switch.setAttribute('aria-checked', 'false')
79
+ this.switch.setAttribute('aria-pressed', 'false')
62
80
  this.classList.remove('ToggleSwitch--checked')
63
81
  }
64
82
 
65
83
  isOn(): boolean {
66
- return this.switch.getAttribute('aria-checked') === 'true'
84
+ return this.switch.getAttribute('aria-pressed') === 'true'
67
85
  }
68
86
 
69
87
  isOff(): boolean {
@@ -71,15 +89,15 @@ class ToggleSwitchElement extends HTMLElement {
71
89
  }
72
90
 
73
91
  isDisabled(): boolean {
74
- return this.switch.getAttribute('aria-disabled') === 'true'
92
+ return this.switch.getAttribute('disabled') != null
75
93
  }
76
94
 
77
95
  disable(): void {
78
- this.switch.setAttribute('aria-disabled', 'true')
96
+ this.switch.setAttribute('disabled', 'disabled')
79
97
  }
80
98
 
81
99
  enable(): void {
82
- this.switch.setAttribute('aria-disabled', 'false')
100
+ this.switch.removeAttribute('disabled')
83
101
  }
84
102
 
85
103
  private performToggle(): void {
@@ -91,9 +109,11 @@ class ToggleSwitchElement extends HTMLElement {
91
109
  }
92
110
 
93
111
  private setLoadingState(): void {
94
- this.disable()
95
112
  this.errorIcon.setAttribute('hidden', 'hidden')
96
113
  this.loadingSpinner.removeAttribute('hidden')
114
+
115
+ const event = new CustomEvent('toggleSwitchLoading', {bubbles: true})
116
+ this.dispatchEvent(event)
97
117
  }
98
118
 
99
119
  private setSuccessState(): void {
@@ -116,10 +136,8 @@ class ToggleSwitchElement extends HTMLElement {
116
136
  }
117
137
 
118
138
  this.loadingSpinner.setAttribute('hidden', 'hidden')
119
- this.enable()
120
139
  }
121
140
 
122
- @debounce(300)
123
141
  private async submitForm() {
124
142
  const body = new FormData()
125
143
 
@@ -127,36 +145,27 @@ class ToggleSwitchElement extends HTMLElement {
127
145
  body.append(this.csrfField, this.csrf)
128
146
  }
129
147
 
130
- body.append('value', this.isOn() ? '0' : '1')
148
+ body.append('value', this.isOn() ? '1' : '0')
131
149
 
132
- try {
133
- if (!this.src) throw new Error('invalid src')
134
-
135
- let response
136
-
137
- try {
138
- response = await fetch(this.src, {
139
- credentials: 'same-origin',
140
- method: 'POST',
141
- headers: {
142
- 'Requested-With': 'XMLHttpRequest'
143
- },
144
- body
145
- })
146
- } catch (error) {
147
- throw new Error('A network error occurred, please try again.')
148
- }
150
+ if (!this.src) throw new Error('invalid src')
149
151
 
150
- if (response.ok) {
151
- this.setSuccessState()
152
- this.performToggle()
153
- } else {
154
- throw new Error(await response.text())
155
- }
152
+ let response
153
+
154
+ try {
155
+ response = await fetch(this.src, {
156
+ credentials: 'same-origin',
157
+ method: 'POST',
158
+ headers: {
159
+ 'Requested-With': 'XMLHttpRequest'
160
+ },
161
+ body
162
+ })
156
163
  } catch (error) {
157
- if (error instanceof Error) {
158
- this.setErrorState(error.message || 'An error occurred, please try again.')
159
- }
164
+ throw new Error('A network error occurred, please try again.')
165
+ }
166
+
167
+ if (!response.ok) {
168
+ throw new Error(await response.text())
160
169
  }
161
170
  }
162
171
  }
@@ -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,48px);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,8px)}.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,8px);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,14px);line-height:30px;padding:0 var(--control-medium-paddingInline-condensed,8px);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,48px)}.UnderlineNav-octicon{fill:var(--color-fg-muted);color:var(--color-fg-muted);display:inline!important;margin-right:var(--control-medium-gap,8px)}.UnderlineNav-container{display:flex;justify-content:space-between}
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 +1 @@
1
- {"version":3,"sources":["underline_nav.pcss","<no source>"],"names":[],"mappings":"AAEA,cAME,+BAAgC,CADhC,mDAAoD,CAJpD,YAAa,CAMb,6BAA8B,CAL9B,mCAAqC,CACrC,eAAgB,CAChB,iBAeF,CAVE,uBAGE,2CAA4C,CAD5C,6BAA8B,CAD9B,yCAGF,CAEA,gCAEE,8CAA+C,CAD/C,iCAEF,CAGF,mBAEE,kBAAmB,CADnB,YAAa,CAEb,iCAAmC,CACnC,eACF,CAEA,mBAaE,kBAAmB,CAHnB,wBAA6B,CAC7B,QAAS,CACT,4CAA8C,CAN9C,6BAA8B,CAG9B,cAAe,CAPf,YAAa,CAEb,2CAA6C,CAC7C,gBAAiB,CAFjB,2DAA6D,CAF7D,iBAAkB,CAMlB,iBAAkB,CAClB,kBA8DF,CAvDE,mFAKE,8CAA+C,CAF/C,6BAA8B,CAG9B,mBAAoB,CAFpB,oBAAqB,CAGrB,4CACF,CAGA,yCAKE,0BAA2B,CAJ3B,aAAc,CAEd,gDAAkD,CADlD,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,4CAA8C,CAL9C,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,0CAGF,CAEA,wBACE,YAAa,CACb,6BACF","file":"underline_nav.css","sourcesContent":["/* UnderlineNav */\n\n.UnderlineNav {\n display: flex;\n min-height: var(--base-size-48, 48px);\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, 8px);\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, 8px);\n list-style: none;\n}\n\n.UnderlineNav-item {\n position: relative;\n display: flex;\n padding: 0 var(--control-medium-paddingInline-condensed, 8px);\n font-size: var(--text-body-size-medium, 14px);\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, 6px);\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, 600);\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, 600);\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, 6px);\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, 48px);\n }\n}\n\n.UnderlineNav-octicon {\n display: inline !important;\n margin-right: var(--control-medium-gap, 8px);\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,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]}
@@ -2,7 +2,7 @@
2
2
 
3
3
  .UnderlineNav {
4
4
  display: flex;
5
- min-height: var(--base-size-48, 48px);
5
+ min-height: var(--base-size-48);
6
6
  overflow-x: auto;
7
7
  overflow-y: hidden;
8
8
  box-shadow: inset 0 -1px 0 var(--color-border-muted);
@@ -10,7 +10,7 @@
10
10
  justify-content: space-between;
11
11
 
12
12
  & .Counter {
13
- margin-left: var(--control-medium-gap, 8px);
13
+ margin-left: var(--control-medium-gap);
14
14
  color: var(--color-fg-default);
15
15
  background-color: var(--color-neutral-muted);
16
16
  }
@@ -24,15 +24,15 @@
24
24
  .UnderlineNav-body {
25
25
  display: flex;
26
26
  align-items: center;
27
- gap: var(--control-medium-gap, 8px);
27
+ gap: var(--control-medium-gap);
28
28
  list-style: none;
29
29
  }
30
30
 
31
31
  .UnderlineNav-item {
32
32
  position: relative;
33
33
  display: flex;
34
- padding: 0 var(--control-medium-paddingInline-condensed, 8px);
35
- font-size: var(--text-body-size-medium, 14px);
34
+ padding: 0 var(--control-medium-paddingInline-condensed);
35
+ font-size: var(--text-body-size-medium);
36
36
  line-height: 30px;
37
37
  color: var(--color-fg-default);
38
38
  text-align: center;
@@ -40,7 +40,7 @@
40
40
  cursor: pointer;
41
41
  background-color: transparent;
42
42
  border: 0;
43
- border-radius: var(--borderRadius-medium, 6px);
43
+ border-radius: var(--borderRadius-medium);
44
44
  align-items: center;
45
45
 
46
46
  &:hover,
@@ -57,7 +57,7 @@
57
57
  & [data-content]::before {
58
58
  display: block;
59
59
  height: 0;
60
- font-weight: var(--base-text-weight-semibold, 600);
60
+ font-weight: var(--base-text-weight-semibold);
61
61
  visibility: hidden;
62
62
  content: attr(data-content);
63
63
  }
@@ -80,7 +80,7 @@
80
80
  &.selected,
81
81
  &[role='tab'][aria-selected='true'],
82
82
  &[aria-current]:not([aria-current='false']) {
83
- font-weight: var(--base-text-weight-semibold, 600);
83
+ font-weight: var(--base-text-weight-semibold);
84
84
  color: var(--color-fg-default);
85
85
  border-bottom-color: var(--color-primer-border-active);
86
86
 
@@ -94,7 +94,7 @@
94
94
  height: 2px;
95
95
  content: '';
96
96
  background: var(--color-primer-border-active);
97
- border-radius: var(--borderRadius-medium, 6px);
97
+ border-radius: var(--borderRadius-medium);
98
98
  transform: translate(50%, -50%);
99
99
  }
100
100
  }
@@ -117,13 +117,13 @@
117
117
 
118
118
  /* required for underline to align with additional wrapper element */
119
119
  & .UnderlineNav-body {
120
- min-height: var(--base-size-48, 48px);
120
+ min-height: var(--base-size-48);
121
121
  }
122
122
  }
123
123
 
124
124
  .UnderlineNav-octicon {
125
125
  display: inline !important;
126
- margin-right: var(--control-medium-gap, 8px);
126
+ margin-right: var(--control-medium-gap);
127
127
  color: var(--color-fg-muted);
128
128
  fill: var(--color-fg-muted);
129
129
  }
@@ -41,7 +41,7 @@ module Primer
41
41
  system_arguments[:tag] = :ul
42
42
  system_arguments[:id] = @list_id
43
43
  system_arguments[:classes] = class_names(
44
- "ActionListWrap",
44
+ "ActionListWrap ActionListWrap--inset",
45
45
  system_arguments[:classes]
46
46
  )
47
47
 
@@ -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,4px)}.avatar-1{height:var(--base-size-16,16px);width:var(--base-size-16,16px)}.avatar-2{height:var(--base-size-20,20px);width:var(--base-size-20,20px)}.avatar-3{height:var(--base-size-24,24px);width:var(--base-size-24,24px)}.avatar-4{height:var(--base-size-28,28px);width:var(--base-size-28,28px)}.avatar-5{height:var(--base-size-32,32px);width:var(--base-size-32,32px)}.avatar-6{height:var(--base-size-40,40px);width:var(--base-size-40,40px)}.avatar-7{height:var(--base-size-48,48px);width:var(--base-size-48,48px)}.avatar-8{height:var(--base-size-64,64px);width:var(--base-size-64,64px)}
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 +1 @@
1
- {"version":3,"sources":["avatar.pcss"],"names":[],"mappings":"AAEA,QAKE,uCAAwC,CACxC,4CAA8C,CAE9C,+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,+BAAiC,CADjC,8BAEF,CAEA,UAEE,+BAAiC,CADjC,8BAEF,CAEA,UAEE,+BAAiC,CADjC,8BAEF,CAEA,UAEE,+BAAiC,CADjC,8BAEF,CAEA,UAEE,+BAAiC,CADjC,8BAEF,CAEA,UAEE,+BAAiC,CADjC,8BAEF,CAEA,UAEE,+BAAiC,CADjC,8BAEF,CAEA,UAEE,+BAAiC,CADjC,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, 6px);\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, 4px);\n}\n\n/* Sizes */\n\n.avatar-1 {\n width: var(--base-size-16, 16px);\n height: var(--base-size-16, 16px);\n}\n\n.avatar-2 {\n width: var(--base-size-20, 20px);\n height: var(--base-size-20, 20px);\n}\n\n.avatar-3 {\n width: var(--base-size-24, 24px);\n height: var(--base-size-24, 24px);\n}\n\n.avatar-4 {\n width: var(--base-size-28, 28px);\n height: var(--base-size-28, 28px);\n}\n\n.avatar-5 {\n width: var(--base-size-32, 32px);\n height: var(--base-size-32, 32px);\n}\n\n.avatar-6 {\n width: var(--base-size-40, 40px);\n height: var(--base-size-40, 40px);\n}\n\n.avatar-7 {\n width: var(--base-size-48, 48px);\n height: var(--base-size-48, 48px);\n}\n\n.avatar-8 {\n width: var(--base-size-64, 64px);\n height: var(--base-size-64, 64px);\n}\n"]}
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"]}
@@ -6,7 +6,7 @@
6
6
  line-height: 1;
7
7
  vertical-align: middle;
8
8
  background-color: var(--color-avatar-bg); /* adds opaque bg to transparent avatars */
9
- border-radius: var(--borderRadius-medium, 6px);
9
+ border-radius: var(--borderRadius-medium);
10
10
  flex-shrink: 0;
11
11
  box-shadow: 0 0 0 1px var(--color-avatar-border);
12
12
  }
@@ -27,47 +27,47 @@
27
27
  .avatar-1,
28
28
  .avatar-2,
29
29
  .avatar-small {
30
- border-radius: var(--borderRadius-small, 4px);
30
+ border-radius: var(--borderRadius-small);
31
31
  }
32
32
 
33
33
  /* Sizes */
34
34
 
35
35
  .avatar-1 {
36
- width: var(--base-size-16, 16px);
37
- height: var(--base-size-16, 16px);
36
+ width: var(--base-size-16);
37
+ height: var(--base-size-16);
38
38
  }
39
39
 
40
40
  .avatar-2 {
41
- width: var(--base-size-20, 20px);
42
- height: var(--base-size-20, 20px);
41
+ width: var(--base-size-20);
42
+ height: var(--base-size-20);
43
43
  }
44
44
 
45
45
  .avatar-3 {
46
- width: var(--base-size-24, 24px);
47
- height: var(--base-size-24, 24px);
46
+ width: var(--base-size-24);
47
+ height: var(--base-size-24);
48
48
  }
49
49
 
50
50
  .avatar-4 {
51
- width: var(--base-size-28, 28px);
52
- height: var(--base-size-28, 28px);
51
+ width: var(--base-size-28);
52
+ height: var(--base-size-28);
53
53
  }
54
54
 
55
55
  .avatar-5 {
56
- width: var(--base-size-32, 32px);
57
- height: var(--base-size-32, 32px);
56
+ width: var(--base-size-32);
57
+ height: var(--base-size-32);
58
58
  }
59
59
 
60
60
  .avatar-6 {
61
- width: var(--base-size-40, 40px);
62
- height: var(--base-size-40, 40px);
61
+ width: var(--base-size-40);
62
+ height: var(--base-size-40);
63
63
  }
64
64
 
65
65
  .avatar-7 {
66
- width: var(--base-size-48, 48px);
67
- height: var(--base-size-48, 48px);
66
+ width: var(--base-size-48);
67
+ height: var(--base-size-48);
68
68
  }
69
69
 
70
70
  .avatar-8 {
71
- width: var(--base-size-64, 64px);
72
- height: var(--base-size-64, 64px);
71
+ width: var(--base-size-64);
72
+ height: var(--base-size-64);
73
73
  }