@primer/view-components 0.29.0-rc.e93857ff → 0.30.0-rc.2e940d27

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.
@@ -183,6 +183,15 @@ let SelectPanelElement = class SelectPanelElement extends HTMLElement {
183
183
  for (const entry of entries) {
184
184
  const elem = entry.target;
185
185
  if (entry.isIntersecting && elem === this.dialog) {
186
+ // Focus on the filter input when the dialog opens to work around a Safari limitation
187
+ // that prevents the autofocus attribute from working as it does in other browsers
188
+ if (this.filterInputTextField) {
189
+ if (document.activeElement !== this.filterInputTextField) {
190
+ this.filterInputTextField.focus();
191
+ }
192
+ }
193
+ // signal that any focus hijinks are finished (thanks Safari)
194
+ this.dialog.setAttribute('data-ready', 'true');
186
195
  this.updateAnchorPosition();
187
196
  if (__classPrivateFieldGet(this, _SelectPanelElement_instances, "a", _SelectPanelElement_fetchStrategy_get) === FetchStrategy.LOCAL) {
188
197
  __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_updateItemVisibility).call(this);
@@ -191,11 +200,11 @@ let SelectPanelElement = class SelectPanelElement extends HTMLElement {
191
200
  }
192
201
  }), "f");
193
202
  __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_waitForCondition).call(this, () => Boolean(this.dialog), () => {
203
+ __classPrivateFieldGet(this, _SelectPanelElement_dialogIntersectionObserver, "f").observe(this.dialog);
204
+ this.dialog.addEventListener('close', this, { signal });
194
205
  if (this.getAttribute('data-open-on-load') === 'true') {
195
206
  this.show();
196
207
  }
197
- __classPrivateFieldGet(this, _SelectPanelElement_dialogIntersectionObserver, "f").observe(this.dialog);
198
- this.dialog.addEventListener('close', this, { signal });
199
208
  });
200
209
  if (__classPrivateFieldGet(this, _SelectPanelElement_instances, "a", _SelectPanelElement_fetchStrategy_get) === FetchStrategy.LOCAL) {
201
210
  __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_waitForCondition).call(this, () => this.items.length > 0, () => {
@@ -240,6 +249,8 @@ let SelectPanelElement = class SelectPanelElement extends HTMLElement {
240
249
  return;
241
250
  }
242
251
  if (event.target === this.dialog && event.type === 'close') {
252
+ // Remove data-ready so it can be set the next time the panel is opened
253
+ this.dialog.removeAttribute('data-ready');
243
254
  this.dispatchEvent(new CustomEvent('panelClosed', {
244
255
  detail: { panel: this },
245
256
  bubbles: true,
@@ -588,10 +599,34 @@ _SelectPanelElement_defaultFilterFn = function _SelectPanelElement_defaultFilter
588
599
  return text.indexOf(query.toLowerCase()) > -1;
589
600
  };
590
601
  _SelectPanelElement_handleSearchFieldEvent = function _SelectPanelElement_handleSearchFieldEvent(event) {
591
- if (event.type === 'keydown' && event.key === 'ArrowDown') {
592
- if (this.focusableItem) {
593
- this.focusableItem.focus();
594
- event.preventDefault();
602
+ if (event.type === 'keydown') {
603
+ const key = event.key;
604
+ if (key === 'Enter') {
605
+ const item = this.visibleItems[0];
606
+ if (item) {
607
+ __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_handleItemActivated).call(this, item, false);
608
+ }
609
+ }
610
+ else if (key === 'ArrowDown') {
611
+ const item = (this.focusableItem || this.visibleItems[0]);
612
+ if (item) {
613
+ __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item).focus();
614
+ event.preventDefault();
615
+ }
616
+ }
617
+ else if (key === 'Home') {
618
+ const item = this.visibleItems[0];
619
+ if (item) {
620
+ __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item).focus();
621
+ event.preventDefault();
622
+ }
623
+ }
624
+ else if (key === 'End') {
625
+ if (this.visibleItems.length > 0) {
626
+ const item = this.visibleItems[this.visibleItems.length - 1];
627
+ __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item).focus();
628
+ event.preventDefault();
629
+ }
595
630
  }
596
631
  }
597
632
  if (event.type !== 'input')
@@ -751,7 +786,7 @@ _SelectPanelElement_handleDialogItemActivated = function _SelectPanelElement_han
751
786
  dialog.addEventListener('close', handleDialogClose, { signal });
752
787
  dialog.addEventListener('cancel', handleDialogClose, { signal });
753
788
  };
754
- _SelectPanelElement_handleItemActivated = function _SelectPanelElement_handleItemActivated(item) {
789
+ _SelectPanelElement_handleItemActivated = function _SelectPanelElement_handleItemActivated(item, shouldClose = true) {
755
790
  // Hide popover after current event loop to prevent changes in focus from
756
791
  // altering the target of the event. Not doing this specifically affects
757
792
  // <a> tags. It causes the event to be sent to the currently focused element
@@ -760,7 +795,7 @@ _SelectPanelElement_handleItemActivated = function _SelectPanelElement_handleIte
760
795
  // works fine.
761
796
  if (this.selectVariant !== 'multiple') {
762
797
  setTimeout(() => {
763
- if (this.open) {
798
+ if (this.open && shouldClose) {
764
799
  this.hide();
765
800
  }
766
801
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primer/view-components",
3
- "version": "0.29.0-rc.e93857ff",
3
+ "version": "0.30.0-rc.2e940d27",
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",
@@ -2467,6 +2467,28 @@
2467
2467
  "type": "Symbol",
2468
2468
  "default": "`:outside_bottom`",
2469
2469
  "description": "The side to anchor the Overlay to. One of `:inside_bottom`, `:inside_center`, `:inside_left`, `:inside_right`, `:inside_top`, `:outside_bottom`, `:outside_left`, `:outside_right`, or `:outside_top`."
2470
+ },
2471
+ {
2472
+ "name": "system_arguments",
2473
+ "type": "Hash",
2474
+ "default": "N/A",
2475
+ "description": "[System arguments](/system-arguments)"
2476
+ }
2477
+ ]
2478
+ },
2479
+ {
2480
+ "component": "SelectPanel::ItemList",
2481
+ "status": "alpha",
2482
+ "a11y_reviewed": true,
2483
+ "short_name": "SelectPanelItemList",
2484
+ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/alpha/select_panel/item_list.rb",
2485
+ "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/alpha/select_panel/item_list/default/",
2486
+ "parameters": [
2487
+ {
2488
+ "name": "system_arguments",
2489
+ "type": "Hash",
2490
+ "default": "N/A",
2491
+ "description": "The arguments accepted by [ActionList](/components/alpha/actionlist)."
2470
2492
  }
2471
2493
  ]
2472
2494
  },
@@ -53,6 +53,7 @@
53
53
  "Primer::Alpha::SegmentedControl::Item": "2023-02-01",
54
54
  "Primer::Alpha::Select": "",
55
55
  "Primer::Alpha::SelectPanel": "",
56
+ "Primer::Alpha::SelectPanel::ItemList": "2023-07-10",
56
57
  "Primer::Alpha::SubmitButton": "",
57
58
  "Primer::Alpha::TabContainer": "",
58
59
  "Primer::Alpha::TabNav": "",
@@ -606,13 +606,15 @@
606
606
  "eventually_local",
607
607
  "local"
608
608
  ],
609
- "ItemList": "Primer::Alpha::ActionList",
609
+ "ItemList": "Primer::Alpha::SelectPanel::ItemList",
610
610
  "SELECT_VARIANT_OPTIONS": [
611
611
  "single",
612
612
  "multiple",
613
613
  "none"
614
614
  ]
615
615
  },
616
+ "Primer::Alpha::SelectPanel::ItemList": {
617
+ },
616
618
  "Primer::Alpha::SubmitButton": {
617
619
  },
618
620
  "Primer::Alpha::TabContainer": {
@@ -7630,6 +7630,12 @@
7630
7630
  "type": "Symbol",
7631
7631
  "default": "`:outside_bottom`",
7632
7632
  "description": "The side to anchor the Overlay to. One of `:inside_bottom`, `:inside_center`, `:inside_left`, `:inside_right`, `:inside_top`, `:outside_bottom`, `:outside_left`, `:outside_right`, or `:outside_top`."
7633
+ },
7634
+ {
7635
+ "name": "system_arguments",
7636
+ "type": "Hash",
7637
+ "default": "N/A",
7638
+ "description": "{{link_to_system_arguments_docs}}"
7633
7639
  }
7634
7640
  ],
7635
7641
  "slots": [
@@ -8080,7 +8086,64 @@
8080
8086
  }
8081
8087
  ],
8082
8088
  "subcomponents": [
8089
+ {
8090
+ "fully_qualified_name": "Primer::Alpha::SelectPanel::ItemList",
8091
+ "description": "The component that should be used to render the list of items in the body of a SelectPanel.",
8092
+ "accessibility_docs": null,
8093
+ "is_form_component": false,
8094
+ "is_published": true,
8095
+ "requires_js": true,
8096
+ "component": "SelectPanel::ItemList",
8097
+ "status": "alpha",
8098
+ "a11y_reviewed": true,
8099
+ "short_name": "SelectPanelItemList",
8100
+ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/alpha/select_panel/item_list.rb",
8101
+ "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/alpha/select_panel/item_list/default/",
8102
+ "parameters": [
8103
+ {
8104
+ "name": "system_arguments",
8105
+ "type": "Hash",
8106
+ "default": "N/A",
8107
+ "description": "The arguments accepted by {{#link_to_component}}Primer::Alpha::ActionList{{/link_to_component}}."
8108
+ }
8109
+ ],
8110
+ "slots": [
8111
+ {
8112
+ "name": "heading",
8113
+ "description": "Heading text rendered above the list of items.",
8114
+ "parameters": [
8115
+ {
8116
+ "name": "component_klass",
8117
+ "type": "Class",
8118
+ "default": "N/A",
8119
+ "description": "The class to use instead of the default {{#link_to_component}}Primer::Alpha::ActionList::Heading{{/link_to_component}}."
8120
+ },
8121
+ {
8122
+ "name": "system_arguments",
8123
+ "type": "Hash",
8124
+ "default": "N/A",
8125
+ "description": "The arguments accepted by `component_klass`."
8126
+ }
8127
+ ]
8128
+ },
8129
+ {
8130
+ "name": "items",
8131
+ "description": "Items. Items can be individual items, avatar items, or dividers. See the documentation for `#with_item`, `#with_divider`, and `#with_avatar_item` respectively for more information.",
8132
+ "parameters": [
8133
+
8134
+ ]
8135
+ }
8136
+ ],
8137
+ "methods": [
8138
+
8139
+ ],
8140
+ "previews": [
8083
8141
 
8142
+ ],
8143
+ "subcomponents": [
8144
+
8145
+ ]
8146
+ }
8084
8147
  ]
8085
8148
  },
8086
8149
  {
@@ -53,6 +53,7 @@
53
53
  "Primer::Alpha::SegmentedControl::Item": "alpha",
54
54
  "Primer::Alpha::Select": "alpha",
55
55
  "Primer::Alpha::SelectPanel": "alpha",
56
+ "Primer::Alpha::SelectPanel::ItemList": "alpha",
56
57
  "Primer::Alpha::SubmitButton": "alpha",
57
58
  "Primer::Alpha::TabContainer": "alpha",
58
59
  "Primer::Alpha::TabNav": "alpha",