@primer/view-components 0.15.0-rc.2eb37d37 → 0.15.0-rc.4cde6a2d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,15 @@ type SelectedItem = {
6
6
  value: string | null | undefined;
7
7
  element: Element;
8
8
  };
9
+ export type ItemActivatedEvent = {
10
+ item: Element;
11
+ checked: boolean;
12
+ };
13
+ declare global {
14
+ interface HTMLElementEventMap {
15
+ itemActivated: CustomEvent<ItemActivatedEvent>;
16
+ }
17
+ }
9
18
  export declare class ActionMenuElement extends HTMLElement {
10
19
  #private;
11
20
  includeFragment: IncludeFragmentElement;
@@ -22,6 +31,17 @@ export declare class ActionMenuElement extends HTMLElement {
22
31
  connectedCallback(): void;
23
32
  disconnectedCallback(): void;
24
33
  handleEvent(event: Event): void;
34
+ get items(): HTMLElement[];
35
+ getItemById(itemId: string): HTMLElement | null;
36
+ isItemDisabled(item: Element | null): boolean;
37
+ disableItem(item: Element | null): void;
38
+ enableItem(item: Element | null): void;
39
+ isItemHidden(item: Element | null): boolean;
40
+ hideItem(item: Element | null): void;
41
+ showItem(item: Element | null): void;
42
+ isItemChecked(item: Element | null): boolean;
43
+ checkItem(item: Element | null): void;
44
+ uncheckItem(item: Element | null): void;
25
45
  }
26
46
  declare global {
27
47
  interface Window {
@@ -15,7 +15,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
15
15
  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");
16
16
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
17
17
  };
18
- var _ActionMenuElement_instances, _ActionMenuElement_abortController, _ActionMenuElement_originalLabel, _ActionMenuElement_inputName, _ActionMenuElement_invokerBeingClicked, _ActionMenuElement_softDisableItems, _ActionMenuElement_potentiallyDisallowActivation, _ActionMenuElement_isKeyboardActivation, _ActionMenuElement_isKeyboardActivationViaEnter, _ActionMenuElement_isKeyboardActivationViaSpace, _ActionMenuElement_isMouseActivation, _ActionMenuElement_isActivation, _ActionMenuElement_handleInvokerActivated, _ActionMenuElement_handleDialogItemActivated, _ActionMenuElement_handleItemActivated, _ActionMenuElement_activateItem, _ActionMenuElement_handleIncludeFragmentReplaced, _ActionMenuElement_handleFocusOut, _ActionMenuElement_show, _ActionMenuElement_hide, _ActionMenuElement_isOpen, _ActionMenuElement_setDynamicLabel, _ActionMenuElement_updateInput, _ActionMenuElement_firstItem_get, _ActionMenuElement_items_get;
18
+ var _ActionMenuElement_instances, _ActionMenuElement_abortController, _ActionMenuElement_originalLabel, _ActionMenuElement_inputName, _ActionMenuElement_invokerBeingClicked, _ActionMenuElement_softDisableItems, _ActionMenuElement_potentiallyDisallowActivation, _ActionMenuElement_isKeyboardActivation, _ActionMenuElement_isKeyboardActivationViaEnter, _ActionMenuElement_isKeyboardActivationViaSpace, _ActionMenuElement_isMouseActivation, _ActionMenuElement_isActivation, _ActionMenuElement_handleInvokerActivated, _ActionMenuElement_handleDialogItemActivated, _ActionMenuElement_handleItemActivated, _ActionMenuElement_activateItem, _ActionMenuElement_handleIncludeFragmentReplaced, _ActionMenuElement_handleFocusOut, _ActionMenuElement_show, _ActionMenuElement_hide, _ActionMenuElement_isOpen, _ActionMenuElement_setDynamicLabel, _ActionMenuElement_updateInput, _ActionMenuElement_firstItem_get;
19
19
  import { controller, target } from '@github/catalyst';
20
20
  import '@oddbird/popover-polyfill';
21
21
  const validSelectors = ['[role="menuitem"]', '[role="menuitemcheckbox"]', '[role="menuitemradio"]'];
@@ -84,7 +84,7 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
84
84
  results.push({
85
85
  label: labelEl === null || labelEl === void 0 ? void 0 : labelEl.textContent,
86
86
  value: selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.getAttribute('data-value'),
87
- element: selectedItem
87
+ element: selectedItem,
88
88
  });
89
89
  }
90
90
  return results;
@@ -101,7 +101,7 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
101
101
  __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_softDisableItems).call(this);
102
102
  if (this.includeFragment) {
103
103
  this.includeFragment.addEventListener('include-fragment-replaced', this, {
104
- signal
104
+ signal,
105
105
  });
106
106
  }
107
107
  }
@@ -141,6 +141,8 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
141
141
  const item = event.target.closest(menuItemSelectors.join(','));
142
142
  const targetIsItem = item !== null;
143
143
  if (targetIsItem && eventIsActivation) {
144
+ if (__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_potentiallyDisallowActivation).call(this, event))
145
+ return;
144
146
  const dialogInvoker = item.closest('[data-show-dialog-id]');
145
147
  if (dialogInvoker) {
146
148
  const dialog = this.ownerDocument.getElementById(dialogInvoker.getAttribute('data-show-dialog-id') || '');
@@ -150,7 +152,7 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
150
152
  }
151
153
  }
152
154
  __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_activateItem).call(this, event, item);
153
- __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleItemActivated).call(this, event, item);
155
+ __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleItemActivated).call(this, item);
154
156
  // Pressing the space key on a button or link will cause the page to scroll unless preventDefault()
155
157
  // is called. While calling preventDefault() appears to have no effect on link navigation, it skips
156
158
  // form submission. The code below therefore only calls preventDefault() if the button has been
@@ -167,6 +169,76 @@ let ActionMenuElement = class ActionMenuElement extends HTMLElement {
167
169
  __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleIncludeFragmentReplaced).call(this);
168
170
  }
169
171
  }
172
+ get items() {
173
+ return Array.from(this.querySelectorAll(menuItemSelectors.join(',')));
174
+ }
175
+ getItemById(itemId) {
176
+ return this.querySelector(`li[data-item-id="${itemId}"`);
177
+ }
178
+ isItemDisabled(item) {
179
+ if (item) {
180
+ return item.classList.contains('ActionListItem--disabled');
181
+ }
182
+ else {
183
+ return false;
184
+ }
185
+ }
186
+ disableItem(item) {
187
+ if (item) {
188
+ item.classList.add('ActionListItem--disabled');
189
+ item.querySelector('.ActionListContent').setAttribute('aria-disabled', 'true');
190
+ }
191
+ }
192
+ enableItem(item) {
193
+ if (item) {
194
+ item.classList.remove('ActionListItem--disabled');
195
+ item.querySelector('.ActionListContent').removeAttribute('aria-disabled');
196
+ }
197
+ }
198
+ isItemHidden(item) {
199
+ if (item) {
200
+ return item.hasAttribute('hidden');
201
+ }
202
+ else {
203
+ return false;
204
+ }
205
+ }
206
+ hideItem(item) {
207
+ if (item) {
208
+ item.setAttribute('hidden', 'hidden');
209
+ }
210
+ }
211
+ showItem(item) {
212
+ if (item) {
213
+ item.removeAttribute('hidden');
214
+ }
215
+ }
216
+ isItemChecked(item) {
217
+ if (item) {
218
+ return item.querySelector('.ActionListContent').getAttribute('aria-checked') === 'true';
219
+ }
220
+ else {
221
+ return false;
222
+ }
223
+ }
224
+ checkItem(item) {
225
+ if (item && (this.selectVariant === 'single' || this.selectVariant === 'multiple')) {
226
+ const itemContent = item.querySelector('.ActionListContent');
227
+ const ariaChecked = itemContent.getAttribute('aria-checked') === 'true';
228
+ if (!ariaChecked) {
229
+ __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleItemActivated).call(this, itemContent);
230
+ }
231
+ }
232
+ }
233
+ uncheckItem(item) {
234
+ if (item && (this.selectVariant === 'single' || this.selectVariant === 'multiple')) {
235
+ const itemContent = item.querySelector('.ActionListContent');
236
+ const ariaChecked = itemContent.getAttribute('aria-checked') === 'true';
237
+ if (ariaChecked) {
238
+ __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_handleItemActivated).call(this, itemContent);
239
+ }
240
+ }
241
+ }
170
242
  };
171
243
  _ActionMenuElement_abortController = new WeakMap();
172
244
  _ActionMenuElement_originalLabel = new WeakMap();
@@ -175,22 +247,24 @@ _ActionMenuElement_invokerBeingClicked = new WeakMap();
175
247
  _ActionMenuElement_instances = new WeakSet();
176
248
  _ActionMenuElement_softDisableItems = function _ActionMenuElement_softDisableItems() {
177
249
  const { signal } = __classPrivateFieldGet(this, _ActionMenuElement_abortController, "f");
178
- for (const item of __classPrivateFieldGet(this, _ActionMenuElement_instances, "a", _ActionMenuElement_items_get)) {
250
+ for (const item of this.querySelectorAll(validSelectors.join(','))) {
179
251
  item.addEventListener('click', __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_potentiallyDisallowActivation).bind(this), { signal });
180
252
  item.addEventListener('keydown', __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_potentiallyDisallowActivation).bind(this), { signal });
181
253
  }
182
254
  };
183
255
  _ActionMenuElement_potentiallyDisallowActivation = function _ActionMenuElement_potentiallyDisallowActivation(event) {
184
256
  if (!__classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_isActivation).call(this, event))
185
- return;
257
+ return false;
186
258
  const item = event.target.closest(menuItemSelectors.join(','));
187
259
  if (!item)
188
- return;
260
+ return false;
189
261
  if (item.getAttribute('aria-disabled')) {
190
262
  event.preventDefault();
191
263
  event.stopPropagation();
192
264
  event.stopImmediatePropagation();
265
+ return true;
193
266
  }
267
+ return false;
194
268
  };
195
269
  _ActionMenuElement_isKeyboardActivation = function _ActionMenuElement_isKeyboardActivation(event) {
196
270
  return __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_isKeyboardActivationViaEnter).call(this, event) || __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_isKeyboardActivationViaSpace).call(this, event);
@@ -239,7 +313,7 @@ _ActionMenuElement_handleDialogItemActivated = function _ActionMenuElement_handl
239
313
  dialog.addEventListener('close', handleDialogClose, { signal });
240
314
  dialog.addEventListener('cancel', handleDialogClose, { signal });
241
315
  };
242
- _ActionMenuElement_handleItemActivated = function _ActionMenuElement_handleItemActivated(event, item) {
316
+ _ActionMenuElement_handleItemActivated = function _ActionMenuElement_handleItemActivated(item) {
243
317
  // Hide popover after current event loop to prevent changes in focus from
244
318
  // altering the target of the event. Not doing this specifically affects
245
319
  // <a> tags. It causes the event to be sent to the currently focused element
@@ -276,6 +350,9 @@ _ActionMenuElement_handleItemActivated = function _ActionMenuElement_handleItemA
276
350
  item.setAttribute('aria-checked', `${checked}`);
277
351
  }
278
352
  __classPrivateFieldGet(this, _ActionMenuElement_instances, "m", _ActionMenuElement_updateInput).call(this);
353
+ this.dispatchEvent(new CustomEvent('itemActivated', {
354
+ detail: { item: item.parentElement, checked: this.isItemChecked(item.parentElement) },
355
+ }));
279
356
  };
280
357
  _ActionMenuElement_activateItem = function _ActionMenuElement_activateItem(event, item) {
281
358
  const eventWillActivateByDefault = (event instanceof MouseEvent && event.type === 'click') ||
@@ -373,9 +450,6 @@ _ActionMenuElement_updateInput = function _ActionMenuElement_updateInput() {
373
450
  _ActionMenuElement_firstItem_get = function _ActionMenuElement_firstItem_get() {
374
451
  return this.querySelector(menuItemSelectors.join(','));
375
452
  };
376
- _ActionMenuElement_items_get = function _ActionMenuElement_items_get() {
377
- return Array.from(this.querySelectorAll(menuItemSelectors.join(',')));
378
- };
379
453
  __decorate([
380
454
  target
381
455
  ], ActionMenuElement.prototype, "includeFragment", void 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primer/view-components",
3
- "version": "0.15.0-rc.2eb37d37",
3
+ "version": "0.15.0-rc.4cde6a2d",
4
4
  "description": "ViewComponents for the Primer Design System",
5
5
  "main": "app/assets/javascripts/primer_view_components.js",
6
6
  "module": "app/components/primer/primer.js",
@@ -75,7 +75,7 @@
75
75
  "eslint": "^8.23.1",
76
76
  "eslint-plugin-custom-elements": "^0.0.6",
77
77
  "eslint-plugin-github": "^4.9.2",
78
- "eslint-plugin-prettier": "^4.2.1",
78
+ "eslint-plugin-prettier": "^5.0.0",
79
79
  "markdownlint-cli2": "^0.10.0",
80
80
  "mocha": "^10.0.0",
81
81
  "playwright": "^1.35.1",