primer_view_components 0.13.2 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +63 -0
  3. data/app/assets/javascripts/app/components/primer/alpha/action_menu/action_menu_element.d.ts +20 -0
  4. data/app/assets/javascripts/app/components/primer/beta/nav_list.d.ts +0 -11
  5. data/app/assets/javascripts/app/components/primer/beta/nav_list_group_element.d.ts +19 -0
  6. data/app/assets/javascripts/app/components/primer/primer.d.ts +1 -0
  7. data/app/assets/javascripts/primer_view_components.js +1 -1
  8. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  9. data/app/assets/styles/primer_view_components.css +1 -1
  10. data/app/assets/styles/primer_view_components.css.map +1 -1
  11. data/app/components/primer/alpha/action_bar.css +1 -1
  12. data/app/components/primer/alpha/action_bar.css.json +1 -4
  13. data/app/components/primer/alpha/action_bar.css.map +1 -1
  14. data/app/components/primer/alpha/action_bar.pcss +1 -17
  15. data/app/components/primer/alpha/action_bar_element.js +21 -9
  16. data/app/components/primer/alpha/action_list/item.rb +13 -3
  17. data/app/components/primer/alpha/action_list.css +1 -1
  18. data/app/components/primer/alpha/action_list.css.json +1 -0
  19. data/app/components/primer/alpha/action_list.css.map +1 -1
  20. data/app/components/primer/alpha/action_list.pcss +3 -1
  21. data/app/components/primer/alpha/action_list.rb +5 -5
  22. data/app/components/primer/alpha/action_menu/action_menu_element.d.ts +20 -0
  23. data/app/components/primer/alpha/action_menu/action_menu_element.js +126 -28
  24. data/app/components/primer/alpha/action_menu/action_menu_element.ts +110 -12
  25. data/app/components/primer/alpha/action_menu/group.rb +23 -0
  26. data/app/components/primer/alpha/action_menu/heading.rb +17 -0
  27. data/app/components/primer/alpha/action_menu/list.html.erb +1 -0
  28. data/app/components/primer/alpha/action_menu/list.rb +62 -60
  29. data/app/components/primer/alpha/action_menu/list_wrapper.rb +40 -0
  30. data/app/components/primer/alpha/action_menu.html.erb +20 -18
  31. data/app/components/primer/alpha/action_menu.rb +38 -1
  32. data/app/components/primer/alpha/auto_complete.css +1 -1
  33. data/app/components/primer/alpha/auto_complete.css.map +1 -1
  34. data/app/components/primer/alpha/button_marketing.css +1 -1
  35. data/app/components/primer/alpha/button_marketing.css.map +1 -1
  36. data/app/components/primer/alpha/dialog/header.rb +1 -1
  37. data/app/components/primer/alpha/dropdown.css +1 -1
  38. data/app/components/primer/alpha/dropdown.css.map +1 -1
  39. data/app/components/primer/alpha/layout.css +1 -1
  40. data/app/components/primer/alpha/layout.css.map +1 -1
  41. data/app/components/primer/alpha/menu.css +1 -1
  42. data/app/components/primer/alpha/menu.css.map +1 -1
  43. data/app/components/primer/alpha/nav_list/divider.rb +1 -0
  44. data/app/components/primer/alpha/nav_list/group.rb +1 -0
  45. data/app/components/primer/alpha/nav_list/heading.rb +1 -0
  46. data/app/components/primer/alpha/nav_list/item.rb +1 -0
  47. data/app/components/primer/alpha/nav_list.rb +1 -0
  48. data/app/components/primer/alpha/octicon_symbols.html.erb +1 -1
  49. data/app/components/primer/alpha/overlay.css +1 -1
  50. data/app/components/primer/alpha/overlay.css.json +2 -2
  51. data/app/components/primer/alpha/overlay.css.map +1 -1
  52. data/app/components/primer/alpha/overlay.pcss +6 -2
  53. data/app/components/primer/alpha/segmented_control.css +1 -1
  54. data/app/components/primer/alpha/segmented_control.css.json +0 -1
  55. data/app/components/primer/alpha/segmented_control.css.map +1 -1
  56. data/app/components/primer/alpha/segmented_control.js +2 -1
  57. data/app/components/primer/alpha/segmented_control.pcss +0 -4
  58. data/app/components/primer/alpha/tab_nav.css +1 -1
  59. data/app/components/primer/alpha/tab_nav.css.map +1 -1
  60. data/app/components/primer/alpha/text_field.css +1 -1
  61. data/app/components/primer/alpha/text_field.css.json +11 -5
  62. data/app/components/primer/alpha/text_field.css.map +1 -1
  63. data/app/components/primer/alpha/text_field.pcss +10 -1
  64. data/app/components/primer/alpha/toggle_switch.css +1 -1
  65. data/app/components/primer/alpha/toggle_switch.css.map +1 -1
  66. data/app/components/primer/alpha/tool_tip.js +8 -4
  67. data/app/components/primer/alpha/tool_tip.ts +9 -4
  68. data/app/components/primer/alpha/underline_nav.css +1 -1
  69. data/app/components/primer/alpha/underline_nav.css.map +1 -1
  70. data/app/components/primer/alpha/x_banner.js +2 -1
  71. data/app/components/primer/anchored_position.js +2 -1
  72. data/app/components/primer/beta/auto_complete/auto_complete.html.erb +1 -7
  73. data/app/components/primer/beta/auto_complete/item.rb +2 -2
  74. data/app/components/primer/beta/auto_complete.rb +6 -1
  75. data/app/components/primer/beta/avatar.rb +1 -1
  76. data/app/components/primer/beta/base_button.rb +3 -4
  77. data/app/components/primer/beta/blankslate.css +1 -1
  78. data/app/components/primer/beta/blankslate.css.json +1 -0
  79. data/app/components/primer/beta/blankslate.css.map +1 -1
  80. data/app/components/primer/beta/blankslate.html.erb +16 -14
  81. data/app/components/primer/beta/blankslate.pcss +52 -2
  82. data/app/components/primer/beta/border_box.css +1 -1
  83. data/app/components/primer/beta/border_box.css.map +1 -1
  84. data/app/components/primer/beta/button.css +1 -1
  85. data/app/components/primer/beta/button.css.json +9 -9
  86. data/app/components/primer/beta/button.css.map +1 -1
  87. data/app/components/primer/beta/button.html.erb +18 -20
  88. data/app/components/primer/beta/button.pcss +15 -16
  89. data/app/components/primer/beta/button.rb +3 -0
  90. data/app/components/primer/beta/button_group.css +1 -1
  91. data/app/components/primer/beta/button_group.css.json +2 -4
  92. data/app/components/primer/beta/button_group.css.map +1 -1
  93. data/app/components/primer/beta/button_group.html.erb +3 -1
  94. data/app/components/primer/beta/button_group.pcss +2 -4
  95. data/app/components/primer/beta/button_group.rb +41 -12
  96. data/app/components/primer/beta/clipboard_copy.rb +4 -0
  97. data/app/components/primer/beta/clipboard_copy_button.rb +25 -0
  98. data/app/components/primer/beta/counter.rb +1 -1
  99. data/app/components/primer/beta/flash.html.erb +1 -1
  100. data/app/components/primer/beta/icon_button.html.erb +4 -6
  101. data/app/components/primer/beta/icon_button.rb +1 -3
  102. data/app/components/primer/beta/label.css +1 -1
  103. data/app/components/primer/beta/label.css.map +1 -1
  104. data/app/components/primer/beta/link.css +1 -1
  105. data/app/components/primer/beta/link.css.map +1 -1
  106. data/app/components/primer/beta/nav_list/group.html.erb +7 -5
  107. data/app/components/primer/beta/nav_list/group.rb +2 -2
  108. data/app/components/primer/beta/nav_list.d.ts +0 -11
  109. data/app/components/primer/beta/nav_list.js +14 -90
  110. data/app/components/primer/beta/nav_list.ts +1 -85
  111. data/app/components/primer/beta/nav_list_group_element.d.ts +19 -0
  112. data/app/components/primer/beta/nav_list_group_element.js +108 -0
  113. data/app/components/primer/beta/nav_list_group_element.ts +97 -0
  114. data/app/components/primer/beta/relative_time.rb +4 -4
  115. data/app/components/primer/beta/subhead.css +1 -1
  116. data/app/components/primer/beta/subhead.css.json +2 -0
  117. data/app/components/primer/beta/subhead.css.map +1 -1
  118. data/app/components/primer/beta/subhead.pcss +8 -1
  119. data/app/components/primer/beta/subhead.rb +9 -1
  120. data/app/components/primer/component.rb +3 -0
  121. data/app/components/primer/focus_group.js +2 -1
  122. data/app/components/primer/primer.d.ts +1 -0
  123. data/app/components/primer/primer.js +1 -0
  124. data/app/components/primer/primer.ts +1 -0
  125. data/app/forms/action_menu_form.rb +20 -0
  126. data/app/forms/immediate_validation_form.rb +2 -2
  127. data/app/lib/primer/experimental_render_helpers.rb +32 -0
  128. data/app/lib/primer/experimental_slot_helpers.rb +30 -0
  129. data/app/lib/primer/fetch_or_fallback_helper.rb +0 -1
  130. data/app/lib/primer/octicon/cache.rb +1 -1
  131. data/lib/primer/classify.rb +0 -2
  132. data/lib/primer/forms/action_menu.html.erb +6 -0
  133. data/lib/primer/forms/action_menu.rb +25 -0
  134. data/lib/primer/forms/acts_as_component.rb +0 -3
  135. data/lib/primer/forms/base.rb +0 -1
  136. data/lib/primer/forms/base_component.rb +0 -2
  137. data/lib/primer/forms/dsl/action_menu_input.rb +36 -0
  138. data/lib/primer/forms/dsl/input.rb +8 -1
  139. data/lib/primer/forms/dsl/input_methods.rb +9 -0
  140. data/lib/primer/forms/dsl/text_field_input.rb +8 -0
  141. data/lib/primer/forms/primer_base_component_wrapper.rb +0 -2
  142. data/lib/primer/forms/primer_text_field.js +40 -5
  143. data/lib/primer/forms/primer_text_field.ts +39 -7
  144. data/lib/primer/forms/validation_message.html.erb +2 -1
  145. data/lib/primer/static/generate_info_arch.rb +1 -2
  146. data/lib/primer/static/generate_previews.rb +0 -2
  147. data/lib/primer/view_components/engine.rb +5 -1
  148. data/lib/primer/view_components/linters/base_linter.rb +3 -2
  149. data/lib/primer/view_components/linters/deprecated_components_counter.rb +1 -1
  150. data/lib/primer/view_components/linters/disallow_action_list.rb +1 -0
  151. data/lib/primer/view_components/linters/severity_schema.rb +1 -0
  152. data/lib/primer/view_components/version.rb +2 -3
  153. data/lib/primer/yard/lookbook_pages_backend.rb +2 -4
  154. data/lib/rubocop/cop/primer/base_cop.rb +1 -1
  155. data/lib/rubocop/cop/primer/deprecated_arguments.rb +0 -2
  156. data/lib/rubocop/cop/primer/deprecated_components.rb +1 -1
  157. data/lib/rubocop/cop/primer/deprecated_label_schemes.rb +1 -1
  158. data/lib/rubocop/cop/primer/deprecated_label_variants.rb +1 -1
  159. data/previews/primer/alpha/action_menu_preview.rb +73 -7
  160. data/previews/primer/alpha/dialog_preview/with_auto_complete.html.erb +8 -0
  161. data/previews/primer/alpha/dialog_preview.rb +17 -0
  162. data/previews/primer/alpha/octicon_symbols_preview/default.html.erb +6 -0
  163. data/previews/primer/alpha/octicon_symbols_preview/playground.html.erb +13 -0
  164. data/previews/primer/alpha/octicon_symbols_preview.rb +21 -0
  165. data/previews/primer/alpha/text_field_preview.rb +5 -0
  166. data/previews/primer/beta/avatar_preview.rb +6 -0
  167. data/previews/primer/beta/blankslate_preview/inside_flex_container.html.erb +6 -0
  168. data/previews/primer/beta/blankslate_preview.rb +3 -0
  169. data/previews/primer/beta/button_group_preview.rb +11 -0
  170. data/previews/primer/beta/clipboard_copy_button_preview.rb +29 -0
  171. data/previews/primer/beta/nav_list_preview.rb +10 -1
  172. data/previews/primer/beta/subhead_preview.rb +32 -4
  173. data/previews/primer/forms_preview/action_menu_form.html.erb +3 -0
  174. data/previews/primer/forms_preview.rb +4 -0
  175. data/static/arguments.json +167 -14
  176. data/static/audited_at.json +6 -1
  177. data/static/classes.json +12 -3
  178. data/static/constants.json +25 -1
  179. data/static/info_arch.json +585 -78
  180. data/static/previews.json +198 -0
  181. data/static/statuses.json +5 -0
  182. metadata +24 -2
@@ -9,41 +9,14 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _NavListElement_instances, _NavListElement_parseHTML, _NavListElement_findSelectedNavItemById, _NavListElement_findSelectedNavItemByHref, _NavListElement_findSelectedNavItemByCurrentLocation, _NavListElement_select, _NavListElement_deselect, _NavListElement_findParentMenu;
12
+ var _NavListElement_instances, _NavListElement_findSelectedNavItemById, _NavListElement_findSelectedNavItemByHref, _NavListElement_findSelectedNavItemByCurrentLocation, _NavListElement_select, _NavListElement_deselect, _NavListElement_findParentMenu;
13
13
  /* eslint-disable custom-elements/expose-class-on-global */
14
- import { controller, target, targets } from '@github/catalyst';
14
+ import { controller, targets } from '@github/catalyst';
15
15
  let NavListElement = class NavListElement extends HTMLElement {
16
16
  constructor() {
17
17
  super(...arguments);
18
18
  _NavListElement_instances.add(this);
19
19
  }
20
- connectedCallback() {
21
- this.setShowMoreItemState();
22
- }
23
- get showMoreDisabled() {
24
- return this.showMoreItem.hasAttribute('aria-disabled');
25
- }
26
- set showMoreDisabled(value) {
27
- if (value) {
28
- this.showMoreItem.setAttribute('aria-disabled', 'true');
29
- }
30
- else {
31
- this.showMoreItem.removeAttribute('aria-disabled');
32
- }
33
- this.showMoreItem.classList.toggle('disabled', value);
34
- }
35
- set currentPage(value) {
36
- this.showMoreItem.setAttribute('data-current-page', value.toString());
37
- }
38
- get currentPage() {
39
- return parseInt(this.showMoreItem.getAttribute('data-current-page')) || 1;
40
- }
41
- get totalPages() {
42
- return parseInt(this.showMoreItem.getAttribute('data-total-pages')) || 1;
43
- }
44
- get paginationSrc() {
45
- return this.showMoreItem.getAttribute('src') || '';
46
- }
47
20
  selectItemById(itemId) {
48
21
  if (!itemId)
49
22
  return false;
@@ -126,57 +99,9 @@ let NavListElement = class NavListElement extends HTMLElement {
126
99
  }
127
100
  e.stopPropagation();
128
101
  }
129
- async showMore(e) {
130
- var _a, _b;
131
- e.preventDefault();
132
- if (this.showMoreDisabled)
133
- return;
134
- this.showMoreDisabled = true;
135
- let html;
136
- try {
137
- const paginationURL = new URL(this.paginationSrc, window.location.origin);
138
- this.currentPage++;
139
- paginationURL.searchParams.append('page', this.currentPage.toString());
140
- const response = await fetch(paginationURL);
141
- if (!response.ok)
142
- return;
143
- html = await response.text();
144
- if (this.currentPage === this.totalPages) {
145
- this.showMoreItem.hidden = true;
146
- }
147
- }
148
- catch (err) {
149
- // Ignore network errors
150
- this.showMoreDisabled = false;
151
- this.currentPage--;
152
- return;
153
- }
154
- const fragment = __classPrivateFieldGet(this, _NavListElement_instances, "m", _NavListElement_parseHTML).call(this, document, html);
155
- (_a = fragment === null || fragment === void 0 ? void 0 : fragment.querySelector('li > a')) === null || _a === void 0 ? void 0 : _a.setAttribute('data-targets', 'nav-list.focusMarkers');
156
- const listId = e.target.closest('button').getAttribute('data-list-id');
157
- const list = document.getElementById(listId);
158
- list.append(fragment);
159
- (_b = this.focusMarkers.pop()) === null || _b === void 0 ? void 0 : _b.focus();
160
- this.showMoreDisabled = false;
161
- }
162
- setShowMoreItemState() {
163
- if (!this.showMoreItem) {
164
- return;
165
- }
166
- if (this.currentPage < this.totalPages) {
167
- this.showMoreItem.hidden = false;
168
- }
169
- else {
170
- this.showMoreItem.hidden = true;
171
- }
172
- }
173
102
  };
174
- _NavListElement_instances = new WeakSet(), _NavListElement_parseHTML = function _NavListElement_parseHTML(document, html) {
175
- const template = document.createElement('template');
176
- // eslint-disable-next-line github/no-inner-html
177
- template.innerHTML = html;
178
- return document.importNode(template.content, true);
179
- }, _NavListElement_findSelectedNavItemById = function _NavListElement_findSelectedNavItemById(itemId) {
103
+ _NavListElement_instances = new WeakSet();
104
+ _NavListElement_findSelectedNavItemById = function _NavListElement_findSelectedNavItemById(itemId) {
180
105
  var _a;
181
106
  // First we compare the selected link to data-item-id for each nav item
182
107
  for (const navItem of this.items) {
@@ -189,16 +114,19 @@ _NavListElement_instances = new WeakSet(), _NavListElement_parseHTML = function
189
114
  }
190
115
  }
191
116
  return null;
192
- }, _NavListElement_findSelectedNavItemByHref = function _NavListElement_findSelectedNavItemByHref(href) {
117
+ };
118
+ _NavListElement_findSelectedNavItemByHref = function _NavListElement_findSelectedNavItemByHref(href) {
193
119
  // If we didn't find a match, we compare the selected link to the href of each nav item
194
120
  const selectedNavItem = this.querySelector(`.ActionListContent[href="${href}"]`);
195
121
  if (selectedNavItem) {
196
122
  return selectedNavItem.closest('.ActionListItem');
197
123
  }
198
124
  return null;
199
- }, _NavListElement_findSelectedNavItemByCurrentLocation = function _NavListElement_findSelectedNavItemByCurrentLocation() {
125
+ };
126
+ _NavListElement_findSelectedNavItemByCurrentLocation = function _NavListElement_findSelectedNavItemByCurrentLocation() {
200
127
  return __classPrivateFieldGet(this, _NavListElement_instances, "m", _NavListElement_findSelectedNavItemByHref).call(this, window.location.pathname);
201
- }, _NavListElement_select = function _NavListElement_select(navItem) {
128
+ };
129
+ _NavListElement_select = function _NavListElement_select(navItem) {
202
130
  const currentlySelectedItem = this.querySelector('.ActionListItem--navActive');
203
131
  if (currentlySelectedItem)
204
132
  __classPrivateFieldGet(this, _NavListElement_instances, "m", _NavListElement_deselect).call(this, currentlySelectedItem);
@@ -211,7 +139,8 @@ _NavListElement_instances = new WeakSet(), _NavListElement_parseHTML = function
211
139
  this.expandItem(parentMenu);
212
140
  parentMenu.classList.add('ActionListContent--hasActiveSubItem');
213
141
  }
214
- }, _NavListElement_deselect = function _NavListElement_deselect(navItem) {
142
+ };
143
+ _NavListElement_deselect = function _NavListElement_deselect(navItem) {
215
144
  navItem.classList.remove('ActionListItem--navActive');
216
145
  if (navItem.children.length > 0) {
217
146
  navItem.children[0].removeAttribute('aria-current');
@@ -221,7 +150,8 @@ _NavListElement_instances = new WeakSet(), _NavListElement_parseHTML = function
221
150
  this.collapseItem(parentMenu);
222
151
  parentMenu.classList.remove('ActionListContent--hasActiveSubItem');
223
152
  }
224
- }, _NavListElement_findParentMenu = function _NavListElement_findParentMenu(navItem) {
153
+ };
154
+ _NavListElement_findParentMenu = function _NavListElement_findParentMenu(navItem) {
225
155
  var _a;
226
156
  if (!navItem.classList.contains('ActionListItem--subItem'))
227
157
  return null;
@@ -236,12 +166,6 @@ _NavListElement_instances = new WeakSet(), _NavListElement_parseHTML = function
236
166
  __decorate([
237
167
  targets
238
168
  ], NavListElement.prototype, "items", void 0);
239
- __decorate([
240
- target
241
- ], NavListElement.prototype, "showMoreItem", void 0);
242
- __decorate([
243
- targets
244
- ], NavListElement.prototype, "focusMarkers", void 0);
245
169
  NavListElement = __decorate([
246
170
  controller
247
171
  ], NavListElement);
@@ -1,44 +1,9 @@
1
1
  /* eslint-disable custom-elements/expose-class-on-global */
2
- import {controller, target, targets} from '@github/catalyst'
2
+ import {controller, targets} from '@github/catalyst'
3
3
 
4
4
  @controller
5
5
  export class NavListElement extends HTMLElement {
6
6
  @targets items: HTMLElement[]
7
- @target showMoreItem: HTMLElement
8
- @targets focusMarkers: HTMLElement[]
9
-
10
- connectedCallback(): void {
11
- this.setShowMoreItemState()
12
- }
13
-
14
- get showMoreDisabled(): boolean {
15
- return this.showMoreItem.hasAttribute('aria-disabled')
16
- }
17
-
18
- set showMoreDisabled(value: boolean) {
19
- if (value) {
20
- this.showMoreItem.setAttribute('aria-disabled', 'true')
21
- } else {
22
- this.showMoreItem.removeAttribute('aria-disabled')
23
- }
24
- this.showMoreItem.classList.toggle('disabled', value)
25
- }
26
-
27
- set currentPage(value: number) {
28
- this.showMoreItem.setAttribute('data-current-page', value.toString())
29
- }
30
-
31
- get currentPage(): number {
32
- return parseInt(this.showMoreItem.getAttribute('data-current-page') as string) || 1
33
- }
34
-
35
- get totalPages(): number {
36
- return parseInt(this.showMoreItem.getAttribute('data-total-pages') as string) || 1
37
- }
38
-
39
- get paginationSrc(): string {
40
- return this.showMoreItem.getAttribute('src') || ''
41
- }
42
7
 
43
8
  selectItemById(itemId: string | null): boolean {
44
9
  if (!itemId) return false
@@ -134,55 +99,6 @@ export class NavListElement extends HTMLElement {
134
99
  e.stopPropagation()
135
100
  }
136
101
 
137
- private async showMore(e: Event) {
138
- e.preventDefault()
139
- if (this.showMoreDisabled) return
140
- this.showMoreDisabled = true
141
- let html
142
- try {
143
- const paginationURL = new URL(this.paginationSrc, window.location.origin)
144
- this.currentPage++
145
- paginationURL.searchParams.append('page', this.currentPage.toString())
146
- const response = await fetch(paginationURL)
147
- if (!response.ok) return
148
- html = await response.text()
149
- if (this.currentPage === this.totalPages) {
150
- this.showMoreItem.hidden = true
151
- }
152
- } catch (err) {
153
- // Ignore network errors
154
- this.showMoreDisabled = false
155
- this.currentPage--
156
- return
157
- }
158
- const fragment = this.#parseHTML(document, html)
159
- fragment?.querySelector('li > a')?.setAttribute('data-targets', 'nav-list.focusMarkers')
160
- const listId = (e.target as HTMLElement).closest('button')!.getAttribute('data-list-id')!
161
- const list = document.getElementById(listId)!
162
- list.append(fragment)
163
- this.focusMarkers.pop()?.focus()
164
- this.showMoreDisabled = false
165
- }
166
-
167
- private setShowMoreItemState() {
168
- if (!this.showMoreItem) {
169
- return
170
- }
171
-
172
- if (this.currentPage < this.totalPages) {
173
- this.showMoreItem.hidden = false
174
- } else {
175
- this.showMoreItem.hidden = true
176
- }
177
- }
178
-
179
- #parseHTML(document: Document, html: string): DocumentFragment {
180
- const template = document.createElement('template')
181
- // eslint-disable-next-line github/no-inner-html
182
- template.innerHTML = html
183
- return document.importNode(template.content, true)
184
- }
185
-
186
102
  #findSelectedNavItemById(itemId: string): HTMLElement | null {
187
103
  // First we compare the selected link to data-item-id for each nav item
188
104
  for (const navItem of this.items) {
@@ -0,0 +1,19 @@
1
+ export declare class NavListGroupElement extends HTMLElement {
2
+ #private;
3
+ showMoreItem: HTMLElement;
4
+ focusMarkers: HTMLElement[];
5
+ connectedCallback(): void;
6
+ get showMoreDisabled(): boolean;
7
+ set showMoreDisabled(value: boolean);
8
+ set currentPage(value: number);
9
+ get currentPage(): number;
10
+ get totalPages(): number;
11
+ get paginationSrc(): string;
12
+ private showMore;
13
+ private setShowMoreItemState;
14
+ }
15
+ declare global {
16
+ interface Window {
17
+ NavListGroupElement: typeof NavListGroupElement;
18
+ }
19
+ }
@@ -0,0 +1,108 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _NavListGroupElement_instances, _NavListGroupElement_parseHTML;
13
+ import { controller, target, targets } from '@github/catalyst';
14
+ let NavListGroupElement = class NavListGroupElement extends HTMLElement {
15
+ constructor() {
16
+ super(...arguments);
17
+ _NavListGroupElement_instances.add(this);
18
+ }
19
+ connectedCallback() {
20
+ this.setShowMoreItemState();
21
+ }
22
+ get showMoreDisabled() {
23
+ return this.showMoreItem.hasAttribute('aria-disabled');
24
+ }
25
+ set showMoreDisabled(value) {
26
+ if (value) {
27
+ this.showMoreItem.setAttribute('aria-disabled', 'true');
28
+ }
29
+ else {
30
+ this.showMoreItem.removeAttribute('aria-disabled');
31
+ }
32
+ this.showMoreItem.classList.toggle('disabled', value);
33
+ }
34
+ set currentPage(value) {
35
+ this.showMoreItem.setAttribute('data-current-page', value.toString());
36
+ }
37
+ get currentPage() {
38
+ return parseInt(this.showMoreItem.getAttribute('data-current-page')) || 1;
39
+ }
40
+ get totalPages() {
41
+ return parseInt(this.showMoreItem.getAttribute('data-total-pages')) || 1;
42
+ }
43
+ get paginationSrc() {
44
+ return this.showMoreItem.getAttribute('src') || '';
45
+ }
46
+ async showMore(e) {
47
+ var _a, _b;
48
+ e.preventDefault();
49
+ if (this.showMoreDisabled)
50
+ return;
51
+ this.showMoreDisabled = true;
52
+ let html;
53
+ try {
54
+ const paginationURL = new URL(this.paginationSrc, window.location.origin);
55
+ this.currentPage++;
56
+ paginationURL.searchParams.append('page', this.currentPage.toString());
57
+ const response = await fetch(paginationURL);
58
+ if (!response.ok)
59
+ return;
60
+ html = await response.text();
61
+ if (this.currentPage === this.totalPages) {
62
+ this.showMoreItem.hidden = true;
63
+ }
64
+ }
65
+ catch (err) {
66
+ // Ignore network errors
67
+ this.showMoreDisabled = false;
68
+ this.currentPage--;
69
+ return;
70
+ }
71
+ const fragment = __classPrivateFieldGet(this, _NavListGroupElement_instances, "m", _NavListGroupElement_parseHTML).call(this, document, html);
72
+ (_a = fragment === null || fragment === void 0 ? void 0 : fragment.querySelector('li > a')) === null || _a === void 0 ? void 0 : _a.setAttribute('data-targets', 'nav-list-group.focusMarkers');
73
+ const listId = e.target.closest('button').getAttribute('data-list-id');
74
+ const list = document.getElementById(listId);
75
+ list.append(fragment);
76
+ (_b = this.focusMarkers.pop()) === null || _b === void 0 ? void 0 : _b.focus();
77
+ this.showMoreDisabled = false;
78
+ }
79
+ setShowMoreItemState() {
80
+ if (!this.showMoreItem) {
81
+ return;
82
+ }
83
+ if (this.currentPage < this.totalPages) {
84
+ this.showMoreItem.hidden = false;
85
+ }
86
+ else {
87
+ this.showMoreItem.hidden = true;
88
+ }
89
+ }
90
+ };
91
+ _NavListGroupElement_instances = new WeakSet();
92
+ _NavListGroupElement_parseHTML = function _NavListGroupElement_parseHTML(document, html) {
93
+ const template = document.createElement('template');
94
+ // eslint-disable-next-line github/no-inner-html
95
+ template.innerHTML = html;
96
+ return document.importNode(template.content, true);
97
+ };
98
+ __decorate([
99
+ target
100
+ ], NavListGroupElement.prototype, "showMoreItem", void 0);
101
+ __decorate([
102
+ targets
103
+ ], NavListGroupElement.prototype, "focusMarkers", void 0);
104
+ NavListGroupElement = __decorate([
105
+ controller
106
+ ], NavListGroupElement);
107
+ export { NavListGroupElement };
108
+ window.NavListGroupElement = NavListGroupElement;
@@ -0,0 +1,97 @@
1
+ import {controller, target, targets} from '@github/catalyst'
2
+
3
+ @controller
4
+ export class NavListGroupElement extends HTMLElement {
5
+ @target showMoreItem: HTMLElement
6
+ @targets focusMarkers: HTMLElement[]
7
+
8
+ connectedCallback(): void {
9
+ this.setShowMoreItemState()
10
+ }
11
+
12
+ get showMoreDisabled(): boolean {
13
+ return this.showMoreItem.hasAttribute('aria-disabled')
14
+ }
15
+
16
+ set showMoreDisabled(value: boolean) {
17
+ if (value) {
18
+ this.showMoreItem.setAttribute('aria-disabled', 'true')
19
+ } else {
20
+ this.showMoreItem.removeAttribute('aria-disabled')
21
+ }
22
+ this.showMoreItem.classList.toggle('disabled', value)
23
+ }
24
+
25
+ set currentPage(value: number) {
26
+ this.showMoreItem.setAttribute('data-current-page', value.toString())
27
+ }
28
+
29
+ get currentPage(): number {
30
+ return parseInt(this.showMoreItem.getAttribute('data-current-page') as string) || 1
31
+ }
32
+
33
+ get totalPages(): number {
34
+ return parseInt(this.showMoreItem.getAttribute('data-total-pages') as string) || 1
35
+ }
36
+
37
+ get paginationSrc(): string {
38
+ return this.showMoreItem.getAttribute('src') || ''
39
+ }
40
+
41
+ private async showMore(e: Event) {
42
+ e.preventDefault()
43
+ if (this.showMoreDisabled) return
44
+ this.showMoreDisabled = true
45
+ let html
46
+ try {
47
+ const paginationURL = new URL(this.paginationSrc, window.location.origin)
48
+ this.currentPage++
49
+ paginationURL.searchParams.append('page', this.currentPage.toString())
50
+ const response = await fetch(paginationURL)
51
+ if (!response.ok) return
52
+ html = await response.text()
53
+ if (this.currentPage === this.totalPages) {
54
+ this.showMoreItem.hidden = true
55
+ }
56
+ } catch (err) {
57
+ // Ignore network errors
58
+ this.showMoreDisabled = false
59
+ this.currentPage--
60
+ return
61
+ }
62
+ const fragment = this.#parseHTML(document, html)
63
+ fragment?.querySelector('li > a')?.setAttribute('data-targets', 'nav-list-group.focusMarkers')
64
+ const listId = (e.target as HTMLElement).closest('button')!.getAttribute('data-list-id')!
65
+ const list = document.getElementById(listId)!
66
+ list.append(fragment)
67
+ this.focusMarkers.pop()?.focus()
68
+ this.showMoreDisabled = false
69
+ }
70
+
71
+ private setShowMoreItemState() {
72
+ if (!this.showMoreItem) {
73
+ return
74
+ }
75
+
76
+ if (this.currentPage < this.totalPages) {
77
+ this.showMoreItem.hidden = false
78
+ } else {
79
+ this.showMoreItem.hidden = true
80
+ }
81
+ }
82
+
83
+ #parseHTML(document: Document, html: string): DocumentFragment {
84
+ const template = document.createElement('template')
85
+ // eslint-disable-next-line github/no-inner-html
86
+ template.innerHTML = html
87
+ return document.importNode(template.content, true)
88
+ }
89
+ }
90
+
91
+ declare global {
92
+ interface Window {
93
+ NavListGroupElement: typeof NavListGroupElement
94
+ }
95
+ }
96
+
97
+ window.NavListGroupElement = NavListGroupElement
@@ -52,7 +52,7 @@ module Primer
52
52
 
53
53
  MONTH_DEFAULT = nil
54
54
  MONTH_MAPPINGS = {
55
- DAY_DEFAULT => nil,
55
+ MONTH_DEFAULT => nil,
56
56
  :numeric => "numeric",
57
57
  :two_digit => "2-digit",
58
58
  :short => "short",
@@ -63,7 +63,7 @@ module Primer
63
63
 
64
64
  YEAR_DEFAULT = nil
65
65
  YEAR_MAPPINGS = {
66
- DAY_DEFAULT => nil,
66
+ YEAR_DEFAULT => nil,
67
67
  :numeric => "numeric",
68
68
  :two_digit => "2-digit"
69
69
  }.freeze
@@ -71,7 +71,7 @@ module Primer
71
71
 
72
72
  TIMEZONENAME_DEFAULT = nil
73
73
  TIMEZONE_MAPPINGS = {
74
- DAY_DEFAULT => nil,
74
+ TIMEZONENAME_DEFAULT => nil,
75
75
  :long => "long",
76
76
  :short => "short",
77
77
  :short_offset => "shortOffset",
@@ -131,7 +131,7 @@ module Primer
131
131
  @system_arguments[:hour] = fetch_or_fallback(HOUR_OPTIONS, hour, HOUR_DEFAULT) if hour.present?
132
132
  @system_arguments[:weekday] = fetch_or_fallback(WEEKDAY_OPTIONS, weekday, WEEKDAY_DEFAULT) if weekday.present?
133
133
  @system_arguments[:day] = fetch_or_fallback(DAY_OPTIONS, day, DAY_DEFAULT) if day.present?
134
- @system_arguments[:month] = fetch_or_fallback(MONTH_DEFAULT, month, MONTH_DEFAULT) if month.present?
134
+ @system_arguments[:month] = fetch_or_fallback(MONTH_OPTIONS, month, MONTH_DEFAULT) if month.present?
135
135
  @system_arguments[:year] = fetch_or_fallback(YEAR_OPTIONS, year, YEAR_DEFAULT) if year.present?
136
136
  @system_arguments[:"time-zone-name"] = fetch_or_fallback(TIMEZONENAME_OPTIONS, time_zone_name, TIMEZONENAME_DEFAULT) if time_zone_name.present?
137
137
  @system_arguments[:threshold] = threshold if threshold.present?
@@ -1 +1 @@
1
- .Subhead{border-bottom:var(--borderWidth-thin,max(1px,.0625rem)) solid var(--borderColor-muted,var(--color-border-muted));display:flex;flex-flow:row wrap;justify-content:flex-end;margin-bottom:var(--stack-gap-normal,1rem);padding-bottom:var(--stack-padding-condensed,.5rem)}.Subhead--spacious{margin-top:var(--base-size-40,2.5rem)}.Subhead-heading{flex:1 1 auto;font-size:24px;font-weight:var(--base-text-weight-normal,400);order:0}.Subhead-heading--danger{color:var(--fgColor-danger,var(--color-danger-fg));font-weight:var(--base-text-weight-semibold,600)}.Subhead-description{color:var(--fgColor-muted,var(--color-fg-muted));flex:1 100%;font-size:var(--text-body-size-medium,.875rem);order:2}.Subhead-actions{align-self:center;justify-content:flex-end;margin:var(--base-size-4,.25rem) 0 var(--base-size-4,.25rem) var(--base-size-4,.25rem);order:1}.Subhead-actions+.Subhead-description{margin-top:var(--base-size-4,.25rem)}
1
+ .Subhead{border-bottom:var(--borderWidth-thin,max(1px,.0625rem)) solid var(--borderColor-muted,var(--color-border-muted));display:flex;flex-flow:row wrap;justify-content:flex-end;margin-bottom:var(--stack-gap-normal,1rem);padding-bottom:var(--stack-padding-condensed,.5rem)}.Subhead--spacious{margin-top:var(--base-size-40,2.5rem)}.Subhead-heading{flex:1 1 auto;font-weight:var(--base-text-weight-normal,400);order:0}.Subhead-heading--large{font-size:var(--base-size-24,1.5rem)}.Subhead-heading--medium{font-size:var(--text-title-size-medium,1.25rem)}.Subhead-heading--danger{color:var(--fgColor-danger,var(--color-danger-fg));font-weight:var(--base-text-weight-semibold,600)}.Subhead-description{color:var(--fgColor-muted,var(--color-fg-muted));flex:1 100%;font-size:var(--text-body-size-medium,.875rem);order:2}.Subhead-actions{align-self:center;justify-content:flex-end;margin:var(--base-size-4,.25rem) 0 var(--base-size-4,.25rem) var(--base-size-4,.25rem);order:1}.Subhead-actions+.Subhead-description{margin-top:var(--base-size-4,.25rem)}
@@ -4,6 +4,8 @@
4
4
  ".Subhead",
5
5
  ".Subhead--spacious",
6
6
  ".Subhead-heading",
7
+ ".Subhead-heading--large",
8
+ ".Subhead-heading--medium",
7
9
  ".Subhead-heading--danger",
8
10
  ".Subhead-description",
9
11
  ".Subhead-actions",
@@ -1 +1 @@
1
- {"version":3,"sources":["subhead.pcss"],"names":[],"mappings":"AAEA,SAIE,gHAAqE,CAHrE,YAAa,CAIb,kBAAmB,CACnB,wBAAyB,CAHzB,0CAAsC,CADtC,mDAKF,CAGA,mBACE,qCACF,CAGA,iBAGE,aAAc,CAFd,cAAe,CACf,8CAA2C,CAE3C,OACF,CAGA,yBAEE,kDAA4B,CAD5B,gDAEF,CAGA,qBAEE,gDAA2B,CAC3B,WAAY,CAFZ,8CAAuC,CAGvC,OACF,CAGA,iBAEE,iBAAkB,CAClB,wBAAyB,CAFzB,sFAAkE,CAGlE,OAKF,CAHE,sCACE,oCACF","file":"subhead.css","sourcesContent":["/* Subhead */\n\n.Subhead {\n display: flex;\n padding-bottom: var(--stack-padding-condensed);\n margin-bottom: var(--stack-gap-normal);\n border-bottom: var(--borderWidth-thin) solid var(--borderColor-muted);\n flex-flow: row wrap;\n justify-content: flex-end; /* Keep actions right aligned. */\n}\n\n/* Modifier class to give a lot of breathing room between sections of content. */\n.Subhead--spacious {\n margin-top: var(--base-size-40);\n}\n\n/* <h2> sized heading with normal font weight */\n.Subhead-heading {\n font-size: 24px;\n font-weight: var(--base-text-weight-normal);\n flex: 1 1 auto;\n order: 0;\n}\n\n/* Make the text bold and red for dangerous content */\n.Subhead-heading--danger {\n font-weight: var(--base-text-weight-semibold);\n color: var(--fgColor-danger);\n}\n\n/* One-liner of supporting text */\n.Subhead-description {\n font-size: var(--text-body-size-medium);\n color: var(--fgColor-muted);\n flex: 1 100%;\n order: 2;\n}\n\n/* Add 1 or 2 buttons to the right of the heading */\n.Subhead-actions {\n margin: var(--base-size-4) 0 var(--base-size-4) var(--base-size-4);\n align-self: center;\n justify-content: flex-end;\n order: 1;\n\n & + .Subhead-description {\n margin-top: var(--base-size-4);\n }\n}\n"]}
1
+ {"version":3,"sources":["subhead.pcss"],"names":[],"mappings":"AAEA,SAIE,gHAAqE,CAHrE,YAAa,CAIb,kBAAmB,CACnB,wBAAyB,CAHzB,0CAAsC,CADtC,mDAKF,CAGA,mBACE,qCACF,CAGA,iBAEE,aAAc,CADd,8CAA2C,CAE3C,OACF,CAEA,wBACE,oCACF,CAEA,yBACE,+CACF,CAGA,yBAEE,kDAA4B,CAD5B,gDAEF,CAGA,qBAEE,gDAA2B,CAC3B,WAAY,CAFZ,8CAAuC,CAGvC,OACF,CAGA,iBAEE,iBAAkB,CAClB,wBAAyB,CAFzB,sFAAkE,CAGlE,OAKF,CAHE,sCACE,oCACF","file":"subhead.css","sourcesContent":["/* Subhead */\n\n.Subhead {\n display: flex;\n padding-bottom: var(--stack-padding-condensed);\n margin-bottom: var(--stack-gap-normal);\n border-bottom: var(--borderWidth-thin) solid var(--borderColor-muted);\n flex-flow: row wrap;\n justify-content: flex-end; /* Keep actions right aligned. */\n}\n\n/* Modifier class to give a lot of breathing room between sections of content. */\n.Subhead--spacious {\n margin-top: var(--base-size-40);\n}\n\n/* <h2> sized heading with normal font weight */\n.Subhead-heading {\n font-weight: var(--base-text-weight-normal);\n flex: 1 1 auto;\n order: 0;\n}\n\n.Subhead-heading--large {\n font-size: var(--base-size-24);\n}\n\n.Subhead-heading--medium {\n font-size: var(--text-title-size-medium);\n}\n\n/* Make the text bold and red for dangerous content */\n.Subhead-heading--danger {\n font-weight: var(--base-text-weight-semibold);\n color: var(--fgColor-danger);\n}\n\n/* One-liner of supporting text */\n.Subhead-description {\n font-size: var(--text-body-size-medium);\n color: var(--fgColor-muted);\n flex: 1 100%;\n order: 2;\n}\n\n/* Add 1 or 2 buttons to the right of the heading */\n.Subhead-actions {\n margin: var(--base-size-4) 0 var(--base-size-4) var(--base-size-4);\n align-self: center;\n justify-content: flex-end;\n order: 1;\n\n & + .Subhead-description {\n margin-top: var(--base-size-4);\n }\n}\n"]}
@@ -16,12 +16,19 @@
16
16
 
17
17
  /* <h2> sized heading with normal font weight */
18
18
  .Subhead-heading {
19
- font-size: 24px;
20
19
  font-weight: var(--base-text-weight-normal);
21
20
  flex: 1 1 auto;
22
21
  order: 0;
23
22
  }
24
23
 
24
+ .Subhead-heading--large {
25
+ font-size: var(--base-size-24);
26
+ }
27
+
28
+ .Subhead-heading--medium {
29
+ font-size: var(--text-title-size-medium);
30
+ }
31
+
25
32
  /* Make the text bold and red for dangerous content */
26
33
  .Subhead-heading--danger {
27
34
  font-weight: var(--base-text-weight-semibold);
@@ -17,16 +17,24 @@ module Primer
17
17
  DEFAULT_HEADING_TAG = :div
18
18
  HEADING_TAG_OPTIONS = [DEFAULT_HEADING_TAG, :h1, :h2, :h3, :h4, :h5, :h6].freeze
19
19
 
20
+ DEFAULT_HEADING_SIZE = :large
21
+ HEADING_SIZE_MAP = {
22
+ DEFAULT_HEADING_SIZE => "Subhead-heading--large",
23
+ :medium => "Subhead-heading--medium"
24
+ }.freeze
25
+ HEADING_SIZE_OPTIONS = HEADING_SIZE_MAP.keys.freeze
26
+
20
27
  # The heading
21
28
  #
22
29
  # @param tag [Symbol] <%= one_of(Primer::Beta::Subhead::HEADING_TAG_OPTIONS)%>
23
30
  # @param danger [Boolean] Whether to style the heading as dangerous.
24
31
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
25
- renders_one :heading, lambda { |tag: DEFAULT_HEADING_TAG, danger: false, **system_arguments|
32
+ renders_one :heading, lambda { |tag: DEFAULT_HEADING_TAG, danger: false, size: DEFAULT_HEADING_SIZE, **system_arguments|
26
33
  system_arguments[:tag] = fetch_or_fallback(HEADING_TAG_OPTIONS, tag, DEFAULT_HEADING_TAG)
27
34
  system_arguments[:classes] = class_names(
28
35
  system_arguments[:classes],
29
36
  "Subhead-heading",
37
+ HEADING_SIZE_MAP[fetch_or_fallback(HEADING_SIZE_OPTIONS, size, DEFAULT_HEADING_SIZE)],
30
38
  "Subhead-heading--danger": danger
31
39
  )
32
40
 
@@ -16,6 +16,9 @@ module Primer
16
16
  include ViewComponent::PolymorphicSlots
17
17
  end
18
18
 
19
+ include ExperimentalRenderHelpers
20
+ include ExperimentalSlotHelpers
21
+
19
22
  include AttributesHelper
20
23
  include ClassNameHelper
21
24
  include FetchOrFallbackHelper
@@ -15,7 +15,7 @@ const validSelectors = ['[role="menuitem"]', '[role="menuitemcheckbox"]', '[role
15
15
  const menuItemSelector = validSelectors.map(selector => `:not([hidden]) > ${selector}`).join(', ');
16
16
  const getMnemonicFor = (item) => { var _a; return (_a = item.textContent) === null || _a === void 0 ? void 0 : _a.trim()[0].toLowerCase(); };
17
17
  const printable = /^\S$/;
18
- export default class FocusGroupElement extends HTMLElement {
18
+ class FocusGroupElement extends HTMLElement {
19
19
  constructor() {
20
20
  super(...arguments);
21
21
  _FocusGroupElement_instances.add(this);
@@ -159,6 +159,7 @@ export default class FocusGroupElement extends HTMLElement {
159
159
  _FocusGroupElement_retainSignal = new WeakMap(), _FocusGroupElement_abortController = new WeakMap(), _FocusGroupElement_instances = new WeakSet(), _FocusGroupElement_items_get = function _FocusGroupElement_items_get() {
160
160
  return this.querySelectorAll(menuItemSelector);
161
161
  };
162
+ export default FocusGroupElement;
162
163
  if (!customElements.get('focus-group')) {
163
164
  window.FocusGroupElement = FocusGroupElement;
164
165
  customElements.define('focus-group', FocusGroupElement);
@@ -6,6 +6,7 @@ import './focus_group';
6
6
  import './alpha/image_crop';
7
7
  import './alpha/modal_dialog';
8
8
  import './beta/nav_list';
9
+ import './beta/nav_list_group_element';
9
10
  import './alpha/segmented_control';
10
11
  import './alpha/toggle_switch';
11
12
  import './alpha/tool_tip';
@@ -6,6 +6,7 @@ import './focus_group';
6
6
  import './alpha/image_crop';
7
7
  import './alpha/modal_dialog';
8
8
  import './beta/nav_list';
9
+ import './beta/nav_list_group_element';
9
10
  import './alpha/segmented_control';
10
11
  import './alpha/toggle_switch';
11
12
  import './alpha/tool_tip';
@@ -6,6 +6,7 @@ import './focus_group'
6
6
  import './alpha/image_crop'
7
7
  import './alpha/modal_dialog'
8
8
  import './beta/nav_list'
9
+ import './beta/nav_list_group_element'
9
10
  import './alpha/segmented_control'
10
11
  import './alpha/toggle_switch'
11
12
  import './alpha/tool_tip'