@primer/view-components 0.29.0-rc.e93857ff → 0.30.0-rc.2e940d27
Sign up to get free protection for your applications and to get access to all the features.
- package/app/assets/javascripts/primer_view_components.js +1 -1
- package/app/assets/javascripts/primer_view_components.js.map +1 -1
- package/app/components/primer/alpha/select_panel_element.js +43 -8
- package/package.json +1 -1
- package/static/arguments.json +22 -0
- package/static/audited_at.json +1 -0
- package/static/constants.json +3 -1
- package/static/info_arch.json +63 -0
- package/static/statuses.json +1 -0
@@ -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'
|
592
|
-
|
593
|
-
|
594
|
-
|
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.
|
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",
|
package/static/arguments.json
CHANGED
@@ -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
|
},
|
package/static/audited_at.json
CHANGED
@@ -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": "",
|
package/static/constants.json
CHANGED
@@ -606,13 +606,15 @@
|
|
606
606
|
"eventually_local",
|
607
607
|
"local"
|
608
608
|
],
|
609
|
-
"ItemList": "Primer::Alpha::
|
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": {
|
package/static/info_arch.json
CHANGED
@@ -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
|
{
|
package/static/statuses.json
CHANGED
@@ -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",
|