@primer/view-components 0.31.0-rc.9fb3fcc2 → 0.31.0-rc.ab0118a4
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.
- package/app/assets/javascripts/app/components/primer/alpha/select_panel_element.d.ts +0 -1
- 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.d.ts +0 -1
- package/app/components/primer/alpha/select_panel_element.js +38 -19
- package/package.json +1 -1
- package/static/arguments.json +5 -5
- package/static/info_arch.json +36 -5
- package/static/previews.json +13 -0
@@ -6,7 +6,6 @@ type SelectedItem = {
|
|
6
6
|
label: string | null | undefined;
|
7
7
|
value: string | null | undefined;
|
8
8
|
inputName: string | null | undefined;
|
9
|
-
element: SelectPanelItem;
|
10
9
|
};
|
11
10
|
export type SelectPanelItem = HTMLLIElement;
|
12
11
|
export type FilterFn = (item: SelectPanelItem, query: string) => boolean;
|
@@ -15,7 +15,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
15
15
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
16
16
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
17
17
|
};
|
18
|
-
var _SelectPanelElement_instances, _SelectPanelElement_dialogIntersectionObserver, _SelectPanelElement_abortController, _SelectPanelElement_originalLabel, _SelectPanelElement_inputName, _SelectPanelElement_selectedItems, _SelectPanelElement_loadingDelayTimeoutId, _SelectPanelElement_loadingAnnouncementTimeoutId, _SelectPanelElement_waitForCondition, _SelectPanelElement_softDisableItems, _SelectPanelElement_updateTabIndices, _SelectPanelElement_potentiallyDisallowActivation, _SelectPanelElement_isAnchorActivationViaSpace, _SelectPanelElement_isActivation, _SelectPanelElement_checkSelectedItems, _SelectPanelElement_addSelectedItem, _SelectPanelElement_removeSelectedItem, _SelectPanelElement_setTextFieldLoadingSpinnerTimer, _SelectPanelElement_handleIncludeFragmentEvent, _SelectPanelElement_toggleIncludeFragmentElements, _SelectPanelElement_handleRemoteInputEvent, _SelectPanelElement_defaultFilterFn, _SelectPanelElement_handleSearchFieldEvent, _SelectPanelElement_updateItemVisibility, _SelectPanelElement_inErrorState, _SelectPanelElement_setErrorState, _SelectPanelElement_clearErrorState, _SelectPanelElement_maybeAnnounce, _SelectPanelElement_fetchStrategy_get, _SelectPanelElement_filterInputTextFieldElement_get, _SelectPanelElement_performFilteringLocally, _SelectPanelElement_handleInvokerActivated, _SelectPanelElement_handleDialogItemActivated, _SelectPanelElement_handleItemActivated, _SelectPanelElement_setDynamicLabel, _SelectPanelElement_updateInput, _SelectPanelElement_firstItem_get, _SelectPanelElement_hideItem, _SelectPanelElement_showItem, _SelectPanelElement_getItemContent;
|
18
|
+
var _SelectPanelElement_instances, _SelectPanelElement_dialogIntersectionObserver, _SelectPanelElement_abortController, _SelectPanelElement_originalLabel, _SelectPanelElement_inputName, _SelectPanelElement_selectedItems, _SelectPanelElement_loadingDelayTimeoutId, _SelectPanelElement_loadingAnnouncementTimeoutId, _SelectPanelElement_hasLoadedData, _SelectPanelElement_waitForCondition, _SelectPanelElement_softDisableItems, _SelectPanelElement_updateTabIndices, _SelectPanelElement_potentiallyDisallowActivation, _SelectPanelElement_isAnchorActivationViaSpace, _SelectPanelElement_isActivation, _SelectPanelElement_checkSelectedItems, _SelectPanelElement_addSelectedItem, _SelectPanelElement_removeSelectedItem, _SelectPanelElement_setTextFieldLoadingSpinnerTimer, _SelectPanelElement_handleIncludeFragmentEvent, _SelectPanelElement_toggleIncludeFragmentElements, _SelectPanelElement_handleRemoteInputEvent, _SelectPanelElement_defaultFilterFn, _SelectPanelElement_handleSearchFieldEvent, _SelectPanelElement_updateItemVisibility, _SelectPanelElement_inErrorState, _SelectPanelElement_setErrorState, _SelectPanelElement_clearErrorState, _SelectPanelElement_maybeAnnounce, _SelectPanelElement_fetchStrategy_get, _SelectPanelElement_filterInputTextFieldElement_get, _SelectPanelElement_performFilteringLocally, _SelectPanelElement_handleInvokerActivated, _SelectPanelElement_handleDialogItemActivated, _SelectPanelElement_handleItemActivated, _SelectPanelElement_setDynamicLabel, _SelectPanelElement_updateInput, _SelectPanelElement_firstItem_get, _SelectPanelElement_hideItem, _SelectPanelElement_showItem, _SelectPanelElement_getItemContent;
|
19
19
|
import { getAnchoredPosition } from '@primer/behaviors';
|
20
20
|
import { controller, target } from '@github/catalyst';
|
21
21
|
import { announceFromElement, announce } from '../aria_live';
|
@@ -55,6 +55,7 @@ const updateWhenVisible = (() => {
|
|
55
55
|
}));
|
56
56
|
resizeObserver.observe(el.ownerDocument.documentElement);
|
57
57
|
el.addEventListener('dialog:close', () => {
|
58
|
+
el.invokerElement?.setAttribute('aria-expanded', 'false');
|
58
59
|
anchors.delete(el);
|
59
60
|
});
|
60
61
|
el.addEventListener('dialog:open', () => {
|
@@ -73,6 +74,7 @@ let SelectPanelElement = class SelectPanelElement extends HTMLElement {
|
|
73
74
|
_SelectPanelElement_selectedItems.set(this, new Map());
|
74
75
|
_SelectPanelElement_loadingDelayTimeoutId.set(this, null);
|
75
76
|
_SelectPanelElement_loadingAnnouncementTimeoutId.set(this, null);
|
77
|
+
_SelectPanelElement_hasLoadedData.set(this, false);
|
76
78
|
}
|
77
79
|
get open() {
|
78
80
|
return this.dialog.open;
|
@@ -251,6 +253,7 @@ let SelectPanelElement = class SelectPanelElement extends HTMLElement {
|
|
251
253
|
if (event.target === this.dialog && event.type === 'close') {
|
252
254
|
// Remove data-ready so it can be set the next time the panel is opened
|
253
255
|
this.dialog.removeAttribute('data-ready');
|
256
|
+
this.invokerElement?.setAttribute('aria-expanded', 'false');
|
254
257
|
this.dispatchEvent(new CustomEvent('panelClosed', {
|
255
258
|
detail: { panel: this },
|
256
259
|
bubbles: true,
|
@@ -300,6 +303,7 @@ let SelectPanelElement = class SelectPanelElement extends HTMLElement {
|
|
300
303
|
show() {
|
301
304
|
this.updateAnchorPosition();
|
302
305
|
this.dialog.showModal();
|
306
|
+
this.invokerElement?.setAttribute('aria-expanded', 'true');
|
303
307
|
const event = new CustomEvent('dialog:open', {
|
304
308
|
detail: { dialog: this.dialog },
|
305
309
|
});
|
@@ -385,6 +389,7 @@ _SelectPanelElement_inputName = new WeakMap();
|
|
385
389
|
_SelectPanelElement_selectedItems = new WeakMap();
|
386
390
|
_SelectPanelElement_loadingDelayTimeoutId = new WeakMap();
|
387
391
|
_SelectPanelElement_loadingAnnouncementTimeoutId = new WeakMap();
|
392
|
+
_SelectPanelElement_hasLoadedData = new WeakMap();
|
388
393
|
_SelectPanelElement_instances = new WeakSet();
|
389
394
|
_SelectPanelElement_waitForCondition = function _SelectPanelElement_waitForCondition(condition, body) {
|
390
395
|
if (condition()) {
|
@@ -422,7 +427,7 @@ _SelectPanelElement_updateTabIndices = function _SelectPanelElement_updateTabInd
|
|
422
427
|
itemContent.setAttribute('tabindex', '-1');
|
423
428
|
}
|
424
429
|
// <li> elements should not themselves be tabbable
|
425
|
-
item.
|
430
|
+
item.removeAttribute('tabindex');
|
426
431
|
}
|
427
432
|
}
|
428
433
|
else {
|
@@ -437,7 +442,7 @@ _SelectPanelElement_updateTabIndices = function _SelectPanelElement_updateTabInd
|
|
437
442
|
itemContent.setAttribute('tabindex', '-1');
|
438
443
|
}
|
439
444
|
// <li> elements should not themselves be tabbable
|
440
|
-
item.
|
445
|
+
item.removeAttribute('tabindex');
|
441
446
|
}
|
442
447
|
}
|
443
448
|
if (!setZeroTabIndex && __classPrivateFieldGet(this, _SelectPanelElement_instances, "a", _SelectPanelElement_firstItem_get)) {
|
@@ -497,12 +502,14 @@ _SelectPanelElement_addSelectedItem = function _SelectPanelElement_addSelectedIt
|
|
497
502
|
value,
|
498
503
|
label: itemContent.querySelector('.ActionListItem-label')?.textContent?.trim(),
|
499
504
|
inputName: itemContent.getAttribute('data-input-name'),
|
500
|
-
element: item,
|
501
505
|
});
|
502
506
|
}
|
503
507
|
};
|
504
508
|
_SelectPanelElement_removeSelectedItem = function _SelectPanelElement_removeSelectedItem(item) {
|
505
|
-
const
|
509
|
+
const itemContent = __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item);
|
510
|
+
if (!itemContent)
|
511
|
+
return;
|
512
|
+
const value = itemContent.getAttribute('data-value');
|
506
513
|
if (value) {
|
507
514
|
__classPrivateFieldGet(this, _SelectPanelElement_selectedItems, "f").delete(value);
|
508
515
|
}
|
@@ -604,27 +611,33 @@ _SelectPanelElement_handleSearchFieldEvent = function _SelectPanelElement_handle
|
|
604
611
|
if (key === 'Enter') {
|
605
612
|
const item = this.visibleItems[0];
|
606
613
|
if (item) {
|
607
|
-
__classPrivateFieldGet(this, _SelectPanelElement_instances, "m",
|
614
|
+
const itemContent = __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item);
|
615
|
+
if (itemContent)
|
616
|
+
itemContent.click();
|
608
617
|
}
|
609
618
|
}
|
610
619
|
else if (key === 'ArrowDown') {
|
611
|
-
const item = (this.focusableItem || this.visibleItems[0]);
|
620
|
+
const item = (this.focusableItem || __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, this.visibleItems[0]));
|
612
621
|
if (item) {
|
613
|
-
|
622
|
+
item.focus();
|
614
623
|
event.preventDefault();
|
615
624
|
}
|
616
625
|
}
|
617
626
|
else if (key === 'Home') {
|
618
627
|
const item = this.visibleItems[0];
|
619
628
|
if (item) {
|
620
|
-
__classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item)
|
629
|
+
const itemContent = __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item);
|
630
|
+
if (itemContent)
|
631
|
+
itemContent.focus();
|
621
632
|
event.preventDefault();
|
622
633
|
}
|
623
634
|
}
|
624
635
|
else if (key === 'End') {
|
625
636
|
if (this.visibleItems.length > 0) {
|
626
637
|
const item = this.visibleItems[this.visibleItems.length - 1];
|
627
|
-
__classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item)
|
638
|
+
const itemContent = __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item);
|
639
|
+
if (itemContent)
|
640
|
+
itemContent.focus();
|
628
641
|
event.preventDefault();
|
629
642
|
}
|
630
643
|
}
|
@@ -672,7 +685,13 @@ _SelectPanelElement_updateItemVisibility = function _SelectPanelElement_updateIt
|
|
672
685
|
if (!itemContent)
|
673
686
|
continue;
|
674
687
|
const value = itemContent.getAttribute('data-value');
|
675
|
-
if (
|
688
|
+
if (__classPrivateFieldGet(this, _SelectPanelElement_hasLoadedData, "f")) {
|
689
|
+
if (value && !__classPrivateFieldGet(this, _SelectPanelElement_selectedItems, "f").has(value)) {
|
690
|
+
itemContent.setAttribute(this.ariaSelectionType, 'false');
|
691
|
+
}
|
692
|
+
}
|
693
|
+
else if (value && !__classPrivateFieldGet(this, _SelectPanelElement_selectedItems, "f").has(value) && this.isItemChecked(item)) {
|
694
|
+
__classPrivateFieldSet(this, _SelectPanelElement_hasLoadedData, true, "f");
|
676
695
|
__classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_addSelectedItem).call(this, item);
|
677
696
|
}
|
678
697
|
}
|
@@ -786,7 +805,7 @@ _SelectPanelElement_handleDialogItemActivated = function _SelectPanelElement_han
|
|
786
805
|
dialog.addEventListener('close', handleDialogClose, { signal });
|
787
806
|
dialog.addEventListener('cancel', handleDialogClose, { signal });
|
788
807
|
};
|
789
|
-
_SelectPanelElement_handleItemActivated = function _SelectPanelElement_handleItemActivated(item
|
808
|
+
_SelectPanelElement_handleItemActivated = function _SelectPanelElement_handleItemActivated(item) {
|
790
809
|
// Hide popover after current event loop to prevent changes in focus from
|
791
810
|
// altering the target of the event. Not doing this specifically affects
|
792
811
|
// <a> tags. It causes the event to be sent to the currently focused element
|
@@ -795,7 +814,7 @@ _SelectPanelElement_handleItemActivated = function _SelectPanelElement_handleIte
|
|
795
814
|
// works fine.
|
796
815
|
if (this.selectVariant !== 'multiple') {
|
797
816
|
setTimeout(() => {
|
798
|
-
if (this.open
|
817
|
+
if (this.open) {
|
799
818
|
this.hide();
|
800
819
|
}
|
801
820
|
});
|
@@ -814,17 +833,17 @@ _SelectPanelElement_handleItemActivated = function _SelectPanelElement_handleIte
|
|
814
833
|
return;
|
815
834
|
const itemContent = __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, item);
|
816
835
|
if (this.selectVariant === 'single') {
|
836
|
+
const value = this.selectedItems[0]?.value;
|
837
|
+
const element = this.visibleItems.find(el => __classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, el)?.getAttribute('data-value') === value);
|
838
|
+
if (element) {
|
839
|
+
__classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_getItemContent).call(this, element)?.setAttribute(this.ariaSelectionType, 'false');
|
840
|
+
}
|
841
|
+
__classPrivateFieldGet(this, _SelectPanelElement_selectedItems, "f").clear();
|
817
842
|
// Only check, never uncheck here. Single-select mode does not allow unchecking a checked item.
|
818
843
|
if (checked) {
|
819
844
|
__classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_addSelectedItem).call(this, item);
|
820
845
|
itemContent?.setAttribute(this.ariaSelectionType, 'true');
|
821
846
|
}
|
822
|
-
for (const checkedItem of this.querySelectorAll(`[${this.ariaSelectionType}]`)) {
|
823
|
-
if (checkedItem !== itemContent) {
|
824
|
-
__classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_removeSelectedItem).call(this, checkedItem);
|
825
|
-
checkedItem.setAttribute(this.ariaSelectionType, 'false');
|
826
|
-
}
|
827
|
-
}
|
828
847
|
__classPrivateFieldGet(this, _SelectPanelElement_instances, "m", _SelectPanelElement_setDynamicLabel).call(this);
|
829
848
|
}
|
830
849
|
else {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@primer/view-components",
|
3
|
-
"version": "0.31.0-rc.
|
3
|
+
"version": "0.31.0-rc.ab0118a4",
|
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
@@ -4336,9 +4336,9 @@
|
|
4336
4336
|
},
|
4337
4337
|
{
|
4338
4338
|
"name": "prefix",
|
4339
|
-
"type": "
|
4339
|
+
"type": "String",
|
4340
4340
|
"default": "`nil`",
|
4341
|
-
"description": "What to prefix the relative
|
4341
|
+
"description": "What to prefix the relative time display with."
|
4342
4342
|
},
|
4343
4343
|
{
|
4344
4344
|
"name": "second",
|
@@ -4390,7 +4390,7 @@
|
|
4390
4390
|
},
|
4391
4391
|
{
|
4392
4392
|
"name": "threshold",
|
4393
|
-
"type": "
|
4393
|
+
"type": "String",
|
4394
4394
|
"default": "`nil`",
|
4395
4395
|
"description": "The threshold, in ISO-8601 'durations' format, at which relative time displays become absolute."
|
4396
4396
|
},
|
@@ -4414,13 +4414,13 @@
|
|
4414
4414
|
},
|
4415
4415
|
{
|
4416
4416
|
"name": "lang",
|
4417
|
-
"type": "
|
4417
|
+
"type": "String",
|
4418
4418
|
"default": "`nil`",
|
4419
4419
|
"description": "The language to use."
|
4420
4420
|
},
|
4421
4421
|
{
|
4422
4422
|
"name": "title",
|
4423
|
-
"type": "
|
4423
|
+
"type": "String",
|
4424
4424
|
"default": "`nil`",
|
4425
4425
|
"description": "Provide a custom title to the element."
|
4426
4426
|
},
|
package/static/info_arch.json
CHANGED
@@ -991,6 +991,12 @@
|
|
991
991
|
"name": "description",
|
992
992
|
"description": "Description content that complements the item's label, with optional test_selector.\nSee `ActionList`'s `description_scheme` argument for layout options.",
|
993
993
|
"parameters": [
|
994
|
+
{
|
995
|
+
"name": "legacy_content",
|
996
|
+
"type": "String",
|
997
|
+
"default": "N/A",
|
998
|
+
"description": "Slot content, provided for backwards-compatibility. Pass a content block instead, or call `with_content`, eg. `component.with_description { \"My description\" }` or `component.with_description.with_content(\"My description\")`."
|
999
|
+
},
|
994
1000
|
{
|
995
1001
|
"name": "test_selector",
|
996
1002
|
"type": "String",
|
@@ -5554,6 +5560,12 @@
|
|
5554
5560
|
"name": "description",
|
5555
5561
|
"description": "Description content that complements the item's label, with optional test_selector.\nSee `ActionList`'s `description_scheme` argument for layout options.",
|
5556
5562
|
"parameters": [
|
5563
|
+
{
|
5564
|
+
"name": "legacy_content",
|
5565
|
+
"type": "String",
|
5566
|
+
"default": "N/A",
|
5567
|
+
"description": "Slot content, provided for backwards-compatibility. Pass a content block instead, or call `with_content`, eg. `component.with_description { \"My description\" }` or `component.with_description.with_content(\"My description\")`."
|
5568
|
+
},
|
5557
5569
|
{
|
5558
5570
|
"name": "test_selector",
|
5559
5571
|
"type": "String",
|
@@ -8093,6 +8105,19 @@
|
|
8093
8105
|
"color-contrast"
|
8094
8106
|
]
|
8095
8107
|
}
|
8108
|
+
},
|
8109
|
+
{
|
8110
|
+
"preview_path": "primer/alpha/select_panel/list_of_links",
|
8111
|
+
"name": "list_of_links",
|
8112
|
+
"snapshot": "interactive",
|
8113
|
+
"skip_rules": {
|
8114
|
+
"wont_fix": [
|
8115
|
+
"region"
|
8116
|
+
],
|
8117
|
+
"will_fix": [
|
8118
|
+
"color-contrast"
|
8119
|
+
]
|
8120
|
+
}
|
8096
8121
|
}
|
8097
8122
|
],
|
8098
8123
|
"subcomponents": [
|
@@ -14699,6 +14724,12 @@
|
|
14699
14724
|
"name": "description",
|
14700
14725
|
"description": "Description content that complements the item's label, with optional test_selector.\nSee `ActionList`'s `description_scheme` argument for layout options.",
|
14701
14726
|
"parameters": [
|
14727
|
+
{
|
14728
|
+
"name": "legacy_content",
|
14729
|
+
"type": "String",
|
14730
|
+
"default": "N/A",
|
14731
|
+
"description": "Slot content, provided for backwards-compatibility. Pass a content block instead, or call `with_content`, eg. `component.with_description { \"My description\" }` or `component.with_description.with_content(\"My description\")`."
|
14732
|
+
},
|
14702
14733
|
{
|
14703
14734
|
"name": "test_selector",
|
14704
14735
|
"type": "String",
|
@@ -15364,9 +15395,9 @@
|
|
15364
15395
|
},
|
15365
15396
|
{
|
15366
15397
|
"name": "prefix",
|
15367
|
-
"type": "
|
15398
|
+
"type": "String",
|
15368
15399
|
"default": "`nil`",
|
15369
|
-
"description": "What to prefix the relative
|
15400
|
+
"description": "What to prefix the relative time display with."
|
15370
15401
|
},
|
15371
15402
|
{
|
15372
15403
|
"name": "second",
|
@@ -15418,7 +15449,7 @@
|
|
15418
15449
|
},
|
15419
15450
|
{
|
15420
15451
|
"name": "threshold",
|
15421
|
-
"type": "
|
15452
|
+
"type": "String",
|
15422
15453
|
"default": "`nil`",
|
15423
15454
|
"description": "The threshold, in ISO-8601 'durations' format, at which relative time displays become absolute."
|
15424
15455
|
},
|
@@ -15442,13 +15473,13 @@
|
|
15442
15473
|
},
|
15443
15474
|
{
|
15444
15475
|
"name": "lang",
|
15445
|
-
"type": "
|
15476
|
+
"type": "String",
|
15446
15477
|
"default": "`nil`",
|
15447
15478
|
"description": "The language to use."
|
15448
15479
|
},
|
15449
15480
|
{
|
15450
15481
|
"name": "title",
|
15451
|
-
"type": "
|
15482
|
+
"type": "String",
|
15452
15483
|
"default": "`nil`",
|
15453
15484
|
"description": "Provide a custom title to the element."
|
15454
15485
|
},
|
package/static/previews.json
CHANGED
@@ -6160,6 +6160,19 @@
|
|
6160
6160
|
"color-contrast"
|
6161
6161
|
]
|
6162
6162
|
}
|
6163
|
+
},
|
6164
|
+
{
|
6165
|
+
"preview_path": "primer/alpha/select_panel/list_of_links",
|
6166
|
+
"name": "list_of_links",
|
6167
|
+
"snapshot": "interactive",
|
6168
|
+
"skip_rules": {
|
6169
|
+
"wont_fix": [
|
6170
|
+
"region"
|
6171
|
+
],
|
6172
|
+
"will_fix": [
|
6173
|
+
"color-contrast"
|
6174
|
+
]
|
6175
|
+
}
|
6163
6176
|
}
|
6164
6177
|
]
|
6165
6178
|
},
|