@codecademy/gamut 72.2.3-alpha.5a1220.0 → 72.2.3-alpha.83b0a8.0
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/dist/Alert/elements.d.ts +2 -2
- package/dist/Anchor/index.d.ts +19 -9
- package/dist/Anchor/index.js +9 -6
- package/dist/BarChart/BarRow/elements.d.ts +47 -45
- package/dist/BarChart/utils/hooks.d.ts +2 -2
- package/dist/BarChart/utils/hooks.js +3 -1
- package/dist/Box/GridBox.d.ts +1 -0
- package/dist/Box/GridBox.js +1 -1
- package/dist/Box/props.d.ts +1 -1
- package/dist/Breadcrumbs/index.d.ts +5 -5
- package/dist/Breadcrumbs/index.js +2 -2
- package/dist/Button/CTAButton.d.ts +2 -2
- package/dist/Button/FillButton.d.ts +4 -4
- package/dist/Button/IconButton.d.ts +4 -4
- package/dist/Button/StrokeButton.d.ts +4 -4
- package/dist/Button/TextButton.d.ts +4 -4
- package/dist/Button/shared/InlineIconButton.d.ts +2 -2
- package/dist/Button/shared/styles.d.ts +3 -3
- package/dist/Button/shared/types.d.ts +1 -1
- package/dist/ButtonBase/ButtonBase.d.ts +9 -4
- package/dist/ButtonBase/ButtonBase.js +11 -4
- package/dist/Card/elements.d.ts +109 -103
- package/dist/Card/styles.d.ts +8 -8
- package/dist/Coachmark/index.d.ts +1 -1
- package/dist/ConnectedForm/ConnectedForm.d.ts +1 -1
- package/dist/ConnectedForm/ConnectedFormGroup.js +4 -3
- package/dist/ConnectedForm/utils.d.ts +1 -1
- package/dist/ConnectedForm/utils.js +1 -1
- package/dist/DatePicker/DatePickerInput/index.d.ts +1 -1
- package/dist/Disclosure/elements.d.ts +18 -12
- package/dist/FeatureShimmer/index.js +1 -1
- package/dist/Form/SelectDropdown/SelectDropdown.js +35 -104
- package/dist/Form/SelectDropdown/core/accessibility.d.ts +3 -0
- package/dist/Form/SelectDropdown/core/accessibility.js +12 -0
- package/dist/Form/SelectDropdown/core/constants.d.ts +13 -0
- package/dist/Form/SelectDropdown/core/constants.js +14 -0
- package/dist/Form/SelectDropdown/{styles.js → core/styles.js} +2 -2
- package/dist/Form/SelectDropdown/{utils.d.ts → core/utils.d.ts} +6 -2
- package/dist/Form/SelectDropdown/{utils.js → core/utils.js} +7 -0
- package/dist/Form/SelectDropdown/elements/containers.js +1 -1
- package/dist/Form/SelectDropdown/elements/controls.d.ts +1 -10
- package/dist/Form/SelectDropdown/elements/controls.js +0 -21
- package/dist/Form/SelectDropdown/elements/index.d.ts +2 -1
- package/dist/Form/SelectDropdown/elements/index.js +2 -1
- package/dist/Form/SelectDropdown/elements/multi-value.js +2 -2
- package/dist/Form/SelectDropdown/hooks/useSelectHandlers.d.ts +22 -0
- package/dist/Form/SelectDropdown/hooks/useSelectHandlers.js +62 -0
- package/dist/Form/SelectDropdown/hooks/useSelectOptions.d.ts +14 -0
- package/dist/Form/SelectDropdown/hooks/useSelectOptions.js +39 -0
- package/dist/Form/SelectDropdown/types/internal.d.ts +3 -3
- package/dist/Form/SelectDropdown/types/styles.d.ts +1 -1
- package/dist/Form/elements/Form.d.ts +15 -15
- package/dist/Form/elements/FormGroup.d.ts +1 -1
- package/dist/Form/styles/Checkbox-styles.d.ts +1 -1
- package/dist/Form/styles/index.d.ts +1 -1
- package/dist/Form/styles/index.js +1 -1
- package/dist/GridForm/GridFormButtons/index.d.ts +4 -4
- package/dist/List/ListProvider.d.ts +1 -1
- package/dist/List/elements.d.ts +44 -42
- package/dist/Menu/MenuItem.js +10 -6
- package/dist/Menu/elements.d.ts +2 -2
- package/dist/Modals/Dialog.js +6 -2
- package/dist/Modals/Modal.js +5 -2
- package/dist/Modals/elements.d.ts +1 -1
- package/dist/Pagination/AnimatedPaginationButtons.d.ts +31 -29
- package/dist/Pagination/EllipsisButton.d.ts +2 -2
- package/dist/Pagination/PaginationButton.d.ts +6 -6
- package/dist/Pagination/utils.d.ts +31 -29
- package/dist/Pagination/utils.js +14 -11
- package/dist/Popover/Popover.js +6 -6
- package/dist/Popover/types.d.ts +4 -3
- package/dist/PopoverContainer/PopoverContainer.js +9 -9
- package/dist/PopoverContainer/hooks.d.ts +16 -4
- package/dist/PopoverContainer/hooks.js +50 -27
- package/dist/PopoverContainer/types.d.ts +2 -1
- package/dist/Tabs/TabButton.d.ts +2 -2
- package/dist/Tabs/TabNavLink.d.ts +2 -2
- package/dist/Tag/elements.d.ts +14 -8
- package/dist/Tag/index.js +1 -1
- package/dist/Tip/InfoTip/InfoTipButton.d.ts +4 -4
- package/dist/Tip/PreviewTip/elements.d.ts +12 -6
- package/dist/Tip/__tests__/helpers.d.ts +1 -1
- package/dist/Tip/shared/FloatingTip.js +2 -2
- package/dist/Tip/shared/types.d.ts +2 -2
- package/dist/Tip/shared/utils.js +1 -1
- package/dist/utils/nullish.d.ts +10 -0
- package/dist/utils/nullish.js +11 -0
- package/dist/utils/react.js +4 -2
- package/package.json +10 -10
- /package/dist/Form/SelectDropdown/{styles.d.ts → core/styles.d.ts} +0 -0
|
@@ -17,7 +17,7 @@ const Shimmer = /*#__PURE__*/_styled(BaseContainer, {
|
|
|
17
17
|
left: '-100%',
|
|
18
18
|
top: 0,
|
|
19
19
|
bg: 'white-400'
|
|
20
|
-
}), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
20
|
+
}), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9GZWF0dXJlU2hpbW1lci9pbmRleC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT2dCIiwiZmlsZSI6Ii4uLy4uL3NyYy9GZWF0dXJlU2hpbW1lci9pbmRleC50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjc3MgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgbW90aW9uLCB1c2VSZWR1Y2VkTW90aW9uIH0gZnJvbSAnZnJhbWVyLW1vdGlvbic7XG5cbmltcG9ydCB7IEJveCwgQm94UHJvcHMgfSBmcm9tICcuLi9Cb3gnO1xuXG5jb25zdCBCYXNlQ29udGFpbmVyID0gbW90aW9uLmNyZWF0ZShCb3gpO1xuY29uc3QgU2hpbW1lciA9IHN0eWxlZChCYXNlQ29udGFpbmVyKShcbiAgY3NzKHtcbiAgICBoZWlnaHQ6ICcxNTAlJyxcbiAgICB3aWR0aDogJ2NhbGMoMTAwJSAvIDkpJyxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMzBkZWcpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgcmlnaHQnLFxuICAgIGZpbHRlcjogJ2JsdXIoMjVweCknLFxuICAgIGxlZnQ6ICctMTAwJScsXG4gICAgdG9wOiAwLFxuICAgIGJnOiAnd2hpdGUtNDAwJyxcbiAgfSlcbik7XG5cbmNvbnN0IGJveFZhcmlhbnRzID0ge1xuICBpblZpZXc6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJyxcbiAgICBib3JkZXJDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknLFxuICAgIHRyYW5zaXRpb246IHtcbiAgICAgIGVhc2U6ICdlYXNlT3V0JyBhcyBjb25zdCxcbiAgICAgIGR1cmF0aW9uOiAwLjMsXG4gICAgICBkZWxheTogNCxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2hpbW1lclZhcmlhbnRzID0ge1xuICBpblZpZXc6IHtcbiAgICBsZWZ0OiAnMTIwJScsIC8vIGV4dHJhICUgdG8gYWNjb3VudCBmb3Igcm90YXRpb25cbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJyxcbiAgICB0cmFuc2l0aW9uOiB7XG4gICAgICBsZWZ0OiB7XG4gICAgICAgIGVhc2U6ICdlYXNlSW5PdXQnIGFzIGNvbnN0LFxuICAgICAgICBkdXJhdGlvbjogMixcbiAgICAgICAgZGVsYXk6IDIsXG4gICAgICB9LFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB7XG4gICAgICAgIGVhc2U6ICdlYXNlT3V0JyBhcyBjb25zdCxcbiAgICAgICAgZHVyYXRpb246IDEsXG4gICAgICAgIGRlbGF5OiA0LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEZlYXR1cmVTaGltbWVyOiBSZWFjdC5GQzxPbWl0PEJveFByb3BzLCAncmVmJz4+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgY29uc3Qgc2hvdWxkUmVkdWNlTW90aW9uID0gdXNlUmVkdWNlZE1vdGlvbigpO1xuICByZXR1cm4gKFxuICAgIDxCb3ggey4uLnJlc3R9PlxuICAgICAge3Nob3VsZFJlZHVjZU1vdGlvbiA/IChcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgICkgOiAoXG4gICAgICAgIDxCYXNlQ29udGFpbmVyXG4gICAgICAgICAgYmc9XCJiYWNrZ3JvdW5kLXNlbGVjdGVkXCJcbiAgICAgICAgICBib3JkZXI9ezF9XG4gICAgICAgICAgYm9yZGVyQ29sb3I9XCJib3JkZXItdGVydGlhcnlcIlxuICAgICAgICAgIGJvcmRlclJhZGl1cz17cmVzdD8uYm9yZGVyUmFkaXVzfVxuICAgICAgICAgIGhlaWdodD17MX1cbiAgICAgICAgICBvdmVyZmxvdz1cImhpZGRlblwiXG4gICAgICAgICAgcG9zaXRpb249XCJyZWxhdGl2ZVwiXG4gICAgICAgICAgdmFyaWFudHM9e2JveFZhcmlhbnRzfVxuICAgICAgICAgIHZpZXdwb3J0PXt7IG9uY2U6IHRydWUgfX1cbiAgICAgICAgICB3aGlsZUluVmlldz1cImluVmlld1wiXG4gICAgICAgICAgd2lkdGg9ezF9XG4gICAgICAgID5cbiAgICAgICAgICA8U2hpbW1lclxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmZWF0dXJlLXNoaW1tZXJcIlxuICAgICAgICAgICAgdmFyaWFudHM9e3NoaW1tZXJWYXJpYW50c31cbiAgICAgICAgICAgIHZpZXdwb3J0PXt7IG9uY2U6IHRydWUgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9CYXNlQ29udGFpbmVyPlxuICAgICAgKX1cbiAgICA8L0JveD5cbiAgKTtcbn07XG4iXX0= */");
|
|
21
21
|
const boxVariants = {
|
|
22
22
|
inView: {
|
|
23
23
|
backgroundColor: 'rgba(0, 0, 0, 0)',
|
|
@@ -1,28 +1,14 @@
|
|
|
1
1
|
import { useTheme } from '@emotion/react';
|
|
2
|
-
import {
|
|
2
|
+
import { useId, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { getMemoizedStyles } from './styles';
|
|
7
|
-
import {
|
|
4
|
+
import { onFocus } from './core/accessibility';
|
|
5
|
+
import { defaultComponents } from './core/constants';
|
|
6
|
+
import { getMemoizedStyles } from './core/styles';
|
|
7
|
+
import { resolveNoOptionsMessage } from './core/utils';
|
|
8
|
+
import { formatGroupLabel, formatOptionLabel, SelectDropdownContext, TypedReactSelect } from './elements';
|
|
9
|
+
import { useSelectHandlers } from './hooks/useSelectHandlers';
|
|
10
|
+
import { useSelectOptions } from './hooks/useSelectOptions';
|
|
8
11
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
-
const defaultProps = {
|
|
10
|
-
name: undefined,
|
|
11
|
-
components: {
|
|
12
|
-
DropdownIndicator: DropdownButton,
|
|
13
|
-
IndicatorSeparator: () => null,
|
|
14
|
-
ClearIndicator: RemoveAllButton,
|
|
15
|
-
SelectContainer: CustomContainer,
|
|
16
|
-
ValueContainer: CustomValueContainer,
|
|
17
|
-
MultiValue: MultiValueWithColorMode,
|
|
18
|
-
MultiValueRemove: MultiValueRemoveButton,
|
|
19
|
-
Option: IconOption,
|
|
20
|
-
SingleValue: AbbreviatedSingleValue,
|
|
21
|
-
Input: CustomInput
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
const onChangeAction = 'select-option';
|
|
25
|
-
|
|
26
12
|
/**
|
|
27
13
|
* A flexible dropdown select component built on top of react-select.
|
|
28
14
|
*
|
|
@@ -99,87 +85,32 @@ export const SelectDropdown = ({
|
|
|
99
85
|
const isSearchable = isCreatable || isSearchableProp;
|
|
100
86
|
const rawInputId = useId();
|
|
101
87
|
const inputId = name ?? `${id}-select-dropdown-${rawInputId}`;
|
|
102
|
-
const [activated, setActivated] = useState(false);
|
|
103
|
-
const [currentFocusedValue, setCurrentFocusedValue] = useState(undefined);
|
|
104
|
-
|
|
105
|
-
// these are used to programatically manage the focus state of our multi-select options + 'Remove all' button
|
|
106
88
|
const removeAllButtonRef = useRef(null);
|
|
107
89
|
const selectInputRef = useRef(null);
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}, [selectOptions, value]);
|
|
133
|
-
const [multiValues, setMultiValues] = useState(multiple &&
|
|
134
|
-
// To keep this efficient for non-multiSelect
|
|
135
|
-
filterValueFromOptions(selectOptions, value, isOptionsGrouped(selectOptions)));
|
|
136
|
-
|
|
137
|
-
// Sync multi-select value from props when controlled (`value` is a string[]).
|
|
138
|
-
// Uncontrolled multi (`value` undefined or '') keeps selection in local state.
|
|
139
|
-
useEffect(() => {
|
|
140
|
-
if (!multiple || !Array.isArray(value)) return;
|
|
141
|
-
const newMultiValues = filterValueFromOptions(selectOptions, value, isOptionsGrouped(selectOptions));
|
|
142
|
-
if (newMultiValues !== multiValues) setMultiValues(newMultiValues);
|
|
143
|
-
|
|
144
|
-
// We only update this when our passed in options or value changes, not multiValues.
|
|
145
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
146
|
-
}, [options, value, multiple]);
|
|
147
|
-
const changeHandler = useCallback((optionEvent, actionMeta) => {
|
|
148
|
-
setActivated(true);
|
|
149
|
-
if (actionMeta.action === 'create-option') {
|
|
150
|
-
const createdValue = getCreatedOptionValue(optionEvent, actionMeta, multiple);
|
|
151
|
-
if (createdValue) {
|
|
152
|
-
onCreateOption?.(createdValue);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
const onChangeProps = {
|
|
156
|
-
onChange,
|
|
157
|
-
multiple
|
|
158
|
-
};
|
|
159
|
-
const forwardedMeta = actionMeta.action === 'create-option' ? actionMeta : {
|
|
160
|
-
action: onChangeAction,
|
|
161
|
-
option: isMultipleSelectProps(onChangeProps) ? undefined : optionEvent
|
|
162
|
-
};
|
|
163
|
-
if (isSingleSelectProps(onChangeProps)) {
|
|
164
|
-
const singleOptionEvent = optionEvent;
|
|
165
|
-
onChangeProps.onChange?.(singleOptionEvent, forwardedMeta);
|
|
166
|
-
}
|
|
167
|
-
if (isMultipleSelectProps(onChangeProps)) {
|
|
168
|
-
setMultiValues(optionEvent);
|
|
169
|
-
onChangeProps.onChange?.(optionEvent, forwardedMeta);
|
|
170
|
-
}
|
|
171
|
-
}, [onChange, multiple, onCreateOption]);
|
|
172
|
-
const keyPressHandler = e => {
|
|
173
|
-
if (multiple && e.key === 'Enter' && currentFocusedValue && multiValues) {
|
|
174
|
-
const newMultiValues = removeValueFromSelectedOptions(multiValues, currentFocusedValue);
|
|
175
|
-
if (newMultiValues !== multiValues) setMultiValues(newMultiValues);
|
|
176
|
-
}
|
|
177
|
-
if (removeAllButtonRef.current !== null && e.key === 'ArrowRight' && multiValues && currentFocusedValue === multiValues[multiValues.length - 1].value) {
|
|
178
|
-
removeAllButtonRef.current.focus();
|
|
179
|
-
}
|
|
180
|
-
};
|
|
181
|
-
const noOptionsMessage = validationMessage === undefined ? undefined // fall back to react-select default ("No options")
|
|
182
|
-
: typeof validationMessage === 'function' ? validationMessage : () => validationMessage;
|
|
90
|
+
const [currentFocusedValue, setCurrentFocusedValue] = useState(undefined);
|
|
91
|
+
const {
|
|
92
|
+
selectOptions,
|
|
93
|
+
parsedValue
|
|
94
|
+
} = useSelectOptions({
|
|
95
|
+
options,
|
|
96
|
+
id,
|
|
97
|
+
size,
|
|
98
|
+
value: value
|
|
99
|
+
});
|
|
100
|
+
const {
|
|
101
|
+
activated,
|
|
102
|
+
multiValues,
|
|
103
|
+
changeHandler,
|
|
104
|
+
keyPressHandler
|
|
105
|
+
} = useSelectHandlers({
|
|
106
|
+
onChange,
|
|
107
|
+
multiple,
|
|
108
|
+
onCreateOption,
|
|
109
|
+
selectOptions,
|
|
110
|
+
value,
|
|
111
|
+
currentFocusedValue,
|
|
112
|
+
removeAllButtonRef
|
|
113
|
+
});
|
|
183
114
|
const theme = useTheme();
|
|
184
115
|
const memoizedStyles = useMemo(() => {
|
|
185
116
|
return getMemoizedStyles(theme, zIndex);
|
|
@@ -192,12 +123,12 @@ export const SelectDropdown = ({
|
|
|
192
123
|
selectInputRef
|
|
193
124
|
},
|
|
194
125
|
children: /*#__PURE__*/_jsx(TypedReactSelect, {
|
|
195
|
-
...defaultProps,
|
|
196
126
|
activated: activated,
|
|
197
127
|
"aria-live": "assertive",
|
|
198
128
|
ariaLiveMessages: {
|
|
199
129
|
onFocus
|
|
200
130
|
},
|
|
131
|
+
components: defaultComponents,
|
|
201
132
|
dropdownWidth: dropdownWidth,
|
|
202
133
|
error: Boolean(error),
|
|
203
134
|
formatCreateLabel: formatCreateLabel,
|
|
@@ -217,7 +148,7 @@ export const SelectDropdown = ({
|
|
|
217
148
|
isValidNewOption: isValidNewOption,
|
|
218
149
|
menuAlignment: menuAlignment,
|
|
219
150
|
name: name,
|
|
220
|
-
noOptionsMessage:
|
|
151
|
+
noOptionsMessage: resolveNoOptionsMessage(validationMessage),
|
|
221
152
|
options: selectOptions,
|
|
222
153
|
placeholder: placeholder,
|
|
223
154
|
selectRef: selectInputRef,
|
|
@@ -227,7 +158,7 @@ export const SelectDropdown = ({
|
|
|
227
158
|
value: multiple ? multiValues : parsedValue,
|
|
228
159
|
onChange: changeHandler,
|
|
229
160
|
onInputChange: onInputChange,
|
|
230
|
-
onKeyDown: multiple ?
|
|
161
|
+
onKeyDown: multiple ? keyPressHandler : undefined,
|
|
231
162
|
...rest
|
|
232
163
|
})
|
|
233
164
|
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const onFocus = ({
|
|
2
|
+
focused: {
|
|
3
|
+
label,
|
|
4
|
+
subtitle,
|
|
5
|
+
rightLabel,
|
|
6
|
+
disabled
|
|
7
|
+
}
|
|
8
|
+
}) => {
|
|
9
|
+
const formattedSubtitle = `, ${subtitle}`;
|
|
10
|
+
const formattedRightLabel = `, ${rightLabel}`;
|
|
11
|
+
return `You are currently focused on option ${label}${subtitle ? formattedSubtitle : ''} ${rightLabel ? formattedRightLabel : ''}${disabled ? ', disabled' : ''}`;
|
|
12
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const defaultComponents: {
|
|
2
|
+
DropdownIndicator: (props: import("../types").SizedIndicatorProps) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
IndicatorSeparator: () => null;
|
|
4
|
+
ClearIndicator: (props: import("../types").SizedIndicatorProps) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
SelectContainer: ({ children, ...rest }: import("../types").CustomSelectComponentProps<(<Option_18, IsMulti_18 extends boolean, Group_18 extends import("react-select").GroupBase<Option_18>>(props: import("react-select").ContainerProps<Option_18, IsMulti_18, Group_18>) => import("@emotion/react").jsx.JSX.Element)>) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
ValueContainer: ({ ...rest }: import("../types").CustomSelectComponentProps<(<Option_20, IsMulti_20 extends boolean, Group_20 extends import("react-select").GroupBase<Option_20>>(props: import("react-select").ValueContainerProps<Option_20, IsMulti_20, Group_20>) => import("@emotion/react").jsx.JSX.Element)>) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
MultiValue: (props: import("react-select").MultiValueProps<import("..").ExtendedOption, true, import("react-select").GroupBase<import("..").ExtendedOption>>) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
MultiValueRemove: (props: import("react-select").MultiValueRemoveProps<import("..").ExtendedOption, true, import("react-select").GroupBase<import("..").ExtendedOption>>) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
Option: ({ children, ...rest }: import("../types").CustomSelectComponentProps<(<Option_16, IsMulti_16 extends boolean, Group_16 extends import("react-select").GroupBase<Option_16>>(props: import("react-select").OptionProps<Option_16, IsMulti_16, Group_16>) => import("@emotion/react").jsx.JSX.Element)>) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
SingleValue: (props: import("react-select").SingleValueProps<import("..").ExtendedOption, false>) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
Input: ({ ...rest }: import("../types").CustomSelectComponentProps<(<Option_7, IsMulti_7 extends boolean, Group_7 extends import("react-select").GroupBase<Option_7>>(props: import("react-select").InputProps<Option_7, IsMulti_7, Group_7>) => import("@emotion/react").jsx.JSX.Element)>) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
};
|
|
13
|
+
export declare const ON_CHANGE_ACTION: "select-option";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AbbreviatedSingleValue, CustomContainer, CustomInput, CustomValueContainer, DropdownButton, IconOption, MultiValueRemoveButton, MultiValueWithColorMode, RemoveAllButton } from '../elements';
|
|
2
|
+
export const defaultComponents = {
|
|
3
|
+
DropdownIndicator: DropdownButton,
|
|
4
|
+
IndicatorSeparator: () => null,
|
|
5
|
+
ClearIndicator: RemoveAllButton,
|
|
6
|
+
SelectContainer: CustomContainer,
|
|
7
|
+
ValueContainer: CustomValueContainer,
|
|
8
|
+
MultiValue: MultiValueWithColorMode,
|
|
9
|
+
MultiValueRemove: MultiValueRemoveButton,
|
|
10
|
+
Option: IconOption,
|
|
11
|
+
SingleValue: AbbreviatedSingleValue,
|
|
12
|
+
Input: CustomInput
|
|
13
|
+
};
|
|
14
|
+
export const ON_CHANGE_ACTION = 'select-option';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css, states, variant } from '@codecademy/gamut-styles';
|
|
2
|
-
import { dismissSharedStyles, tagBaseStyles, tagLabelFontSize, tagLabelPadding } from '
|
|
3
|
-
import { formBaseComponentStyles, formBaseFieldStylesObject, formFieldDisabledStyles, formFieldPaddingStyles, InputSelectors } from '
|
|
2
|
+
import { dismissSharedStyles, tagBaseStyles, tagLabelFontSize, tagLabelPadding } from '../../../Tag/styles';
|
|
3
|
+
import { formBaseComponentStyles, formBaseFieldStylesObject, formFieldDisabledStyles, formFieldPaddingStyles, InputSelectors } from '../../styles';
|
|
4
4
|
const selectDropdownStyles = css({
|
|
5
5
|
...formBaseFieldStylesObject,
|
|
6
6
|
display: 'flex',
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
import { ActionMeta, Options as OptionsType } from 'react-select';
|
|
2
|
-
import { SelectOptionBase } from '
|
|
3
|
-
import { BaseOnChangeProps, ExtendedOption, MultiSelectDropdownProps, OptionStrict, SelectDropdownGroup, SelectDropdownOptions, SelectDropdownProps, SingleSelectDropdownProps } from '
|
|
3
|
+
import { SelectOptionBase } from '../../utils';
|
|
4
|
+
import { BaseOnChangeProps, ExtendedOption, MultiSelectDropdownProps, OptionStrict, SelectDropdownGroup, SelectDropdownOptions, SelectDropdownProps, SingleSelectDropdownProps } from '../types';
|
|
4
5
|
export declare const isMultipleSelectProps: (props: BaseOnChangeProps) => props is MultiSelectDropdownProps;
|
|
5
6
|
export declare const isSingleSelectProps: (props: BaseOnChangeProps) => props is SingleSelectDropdownProps;
|
|
6
7
|
/**
|
|
@@ -29,4 +30,7 @@ export declare const filterValueFromOptions: (options: SelectOptionBase[] | Sele
|
|
|
29
30
|
* @param value - The value or values to remove
|
|
30
31
|
* @returns New array with the specified values removed
|
|
31
32
|
*/
|
|
33
|
+
export declare const resolveNoOptionsMessage: (validationMessage: SelectDropdownProps["validationMessage"]) => ((obj: {
|
|
34
|
+
inputValue: string;
|
|
35
|
+
}) => React.ReactNode) | undefined;
|
|
32
36
|
export declare const removeValueFromSelectedOptions: (selectedOptions: ExtendedOption[] | SelectOptionBase[], value: SelectDropdownProps["value"]) => SelectOptionBase[];
|
|
@@ -44,6 +44,13 @@ export const filterValueFromOptions = (options, value, optionsAreGrouped) => {
|
|
|
44
44
|
* @param value - The value or values to remove
|
|
45
45
|
* @returns New array with the specified values removed
|
|
46
46
|
*/
|
|
47
|
+
export const resolveNoOptionsMessage = validationMessage => {
|
|
48
|
+
if (validationMessage === undefined) return undefined;
|
|
49
|
+
if (typeof validationMessage === 'function') {
|
|
50
|
+
return validationMessage;
|
|
51
|
+
}
|
|
52
|
+
return () => validationMessage;
|
|
53
|
+
};
|
|
47
54
|
export const removeValueFromSelectedOptions = (selectedOptions, value) => {
|
|
48
55
|
return selectedOptions.filter(option => {
|
|
49
56
|
if (Array.isArray(value)) {
|
|
@@ -62,7 +62,7 @@ export const CustomValueContainer = ({
|
|
|
62
62
|
} = rest.selectProps;
|
|
63
63
|
if (inputId) {
|
|
64
64
|
const inputElement = document.getElementById(inputId);
|
|
65
|
-
if (inputElement
|
|
65
|
+
if (inputElement?.getAttribute('role') === 'combobox') {
|
|
66
66
|
Object.entries(comboboxProps).forEach(([key, value]) => {
|
|
67
67
|
inputElement.setAttribute(key, value);
|
|
68
68
|
});
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ExtendedOption, SizedIndicatorProps } from '../types';
|
|
3
|
-
/**
|
|
4
|
-
* Generates accessible focus messages for screen readers.
|
|
5
|
-
* Provides detailed information about the currently focused option.
|
|
6
|
-
*
|
|
7
|
-
* @param params - Object containing the focused option details
|
|
8
|
-
* @returns Formatted accessibility message
|
|
9
|
-
*/
|
|
10
|
-
export declare const onFocus: AriaOnFocus<ExtendedOption>;
|
|
1
|
+
import { SizedIndicatorProps } from '../types';
|
|
11
2
|
/**
|
|
12
3
|
* Custom dropdown indicator that shows either a chevron or search icon.
|
|
13
4
|
* The icon type depends on whether the select is searchable or not.
|
|
@@ -5,27 +5,6 @@ const {
|
|
|
5
5
|
DropdownIndicator
|
|
6
6
|
} = SelectDropdownElements;
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Generates accessible focus messages for screen readers.
|
|
10
|
-
* Provides detailed information about the currently focused option.
|
|
11
|
-
*
|
|
12
|
-
* @param params - Object containing the focused option details
|
|
13
|
-
* @returns Formatted accessibility message
|
|
14
|
-
*/
|
|
15
|
-
export const onFocus = ({
|
|
16
|
-
focused: {
|
|
17
|
-
label,
|
|
18
|
-
subtitle,
|
|
19
|
-
rightLabel,
|
|
20
|
-
disabled
|
|
21
|
-
}
|
|
22
|
-
}) => {
|
|
23
|
-
const formattedSubtitle = `, ${subtitle}`;
|
|
24
|
-
const formattedRightLabel = `, ${rightLabel}`;
|
|
25
|
-
const msg = `You are currently focused on option ${label}${subtitle ? formattedSubtitle : ''} ${rightLabel ? formattedRightLabel : ''}${disabled ? ', disabled' : ''}`;
|
|
26
|
-
return msg;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
8
|
/**
|
|
30
9
|
* Custom dropdown indicator that shows either a chevron or search icon.
|
|
31
10
|
* The icon type depends on whether the select is searchable or not.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { iconSize, selectedIconSize, indicatorIcons } from './constants';
|
|
2
2
|
export { MultiValueWithColorMode, MultiValueRemoveButton, RemoveAllButton, } from './multi-value';
|
|
3
|
-
export { DropdownButton
|
|
3
|
+
export { DropdownButton } from './controls';
|
|
4
|
+
export { onFocus } from '../core/accessibility';
|
|
4
5
|
export { SelectDropdownContext, CustomContainer, CustomInput, CustomValueContainer, TypedReactSelect, } from './containers';
|
|
5
6
|
export { IconOption, AbbreviatedSingleValue, formatOptionLabel, formatGroupLabel, } from './options';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { iconSize, selectedIconSize, indicatorIcons } from './constants';
|
|
2
2
|
export { MultiValueWithColorMode, MultiValueRemoveButton, RemoveAllButton } from './multi-value';
|
|
3
|
-
export { DropdownButton
|
|
3
|
+
export { DropdownButton } from './controls';
|
|
4
|
+
export { onFocus } from '../core/accessibility';
|
|
4
5
|
export { SelectDropdownContext, CustomContainer, CustomInput, CustomValueContainer, TypedReactSelect } from './containers';
|
|
5
6
|
export { IconOption, AbbreviatedSingleValue, formatOptionLabel, formatGroupLabel } from './options';
|
|
@@ -75,7 +75,7 @@ const CustomStyledRemoveAllDiv = /*#__PURE__*/_styled('div', {
|
|
|
75
75
|
'&:focus-visible': {
|
|
76
76
|
outline: `2px solid ${theme.colors.primary}`
|
|
77
77
|
}
|
|
78
|
-
}, ";label:CustomStyledRemoveAllDiv;" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9Gb3JtL1NlbGVjdERyb3Bkb3duL2VsZW1lbnRzL211bHRpLXZhbHVlLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE2RUUiLCJmaWxlIjoiLi4vLi4vLi4vLi4vc3JjL0Zvcm0vU2VsZWN0RHJvcGRvd24vZWxlbWVudHMvbXVsdGktdmFsdWUudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWluaURlbGV0ZUljb24gfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1pY29ucyc7XG5pbXBvcnQgeyB0aGVtZSB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LXN0eWxlcyc7XG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBLZXlib2FyZEV2ZW50LCB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgY29tcG9uZW50cyBhcyBTZWxlY3REcm9wZG93bkVsZW1lbnRzLFxuICBHcm91cEJhc2UsXG4gIE11bHRpVmFsdWVQcm9wcyxcbiAgTXVsdGlWYWx1ZVJlbW92ZVByb3BzLFxufSBmcm9tICdyZWFjdC1zZWxlY3QnO1xuXG5pbXBvcnQgeyBFeHRlbmRlZE9wdGlvbiwgU2l6ZWRJbmRpY2F0b3JQcm9wcyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGluZGljYXRvckljb25zIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU2VsZWN0RHJvcGRvd25Db250ZXh0IH0gZnJvbSAnLi9jb250YWluZXJzJztcblxuY29uc3QgeyBNdWx0aVZhbHVlLCBNdWx0aVZhbHVlUmVtb3ZlIH0gPSBTZWxlY3REcm9wZG93bkVsZW1lbnRzO1xuXG4vKipcbiAqIEN1c3RvbSBtdWx0aS12YWx1ZSBjb21wb25lbnQgdGhhdCBtYW5hZ2VzIGZvY3VzIHN0YXRlIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICogVHJhY2tzIHdoaWNoIG11bHRpLXZhbHVlIGlzIGN1cnJlbnRseSBmb2N1c2VkIGFuZCB1cGRhdGVzIHRoZSBjb250ZXh0IGFjY29yZGluZ2x5LlxuICovXG5leHBvcnQgY29uc3QgTXVsdGlWYWx1ZVdpdGhDb2xvck1vZGUgPSAoXG4gIHByb3BzOiBNdWx0aVZhbHVlUHJvcHM8RXh0ZW5kZWRPcHRpb24sIHRydWUsIEdyb3VwQmFzZTxFeHRlbmRlZE9wdGlvbj4+XG4pID0+IHtcbiAgY29uc3QgeyBjdXJyZW50Rm9jdXNlZFZhbHVlLCBzZXRDdXJyZW50Rm9jdXNlZFZhbHVlIH0gPSB1c2VDb250ZXh0KFxuICAgIFNlbGVjdERyb3Bkb3duQ29udGV4dFxuICApO1xuXG4gIGNvbnN0IHsgZGF0YSB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyB2YWx1ZSwgbGFiZWwgfSA9IGRhdGE7XG5cbiAgaWYgKFxuICAgIHByb3BzLmlzRm9jdXNlZCAmJlxuICAgIHNldEN1cnJlbnRGb2N1c2VkVmFsdWUgJiZcbiAgICBjdXJyZW50Rm9jdXNlZFZhbHVlICE9PSB2YWx1ZVxuICApIHtcbiAgICBzZXRDdXJyZW50Rm9jdXNlZFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhcHJvcHMuaXNGb2N1c2VkICYmXG4gICAgc2V0Q3VycmVudEZvY3VzZWRWYWx1ZSAmJlxuICAgIGN1cnJlbnRGb2N1c2VkVmFsdWUgPT09IHZhbHVlXG4gICkge1xuICAgIHNldEN1cnJlbnRGb2N1c2VkVmFsdWUodW5kZWZpbmVkKTtcbiAgfVxuICBjb25zdCBkaXNwbGF5VGV4dCA9IGRhdGE/LmFiYnJldmlhdGlvbiA/IGRhdGEuYWJicmV2aWF0aW9uIDogbGFiZWwgfHwgJyc7XG5cbiAgcmV0dXJuIDxNdWx0aVZhbHVlIHsuLi5wcm9wc30+e2Rpc3BsYXlUZXh0fTwvTXVsdGlWYWx1ZT47XG59O1xuXG4vKipcbiAqIEN1c3RvbSByZW1vdmUgYnV0dG9uIGZvciBtdWx0aS12YWx1ZSBpdGVtcy5cbiAqIFByb3ZpZGVzIGFjY2Vzc2libGUgcmVtb3ZhbCBmdW5jdGlvbmFsaXR5IHdpdGggcHJvcGVyIEFSSUEgbGFiZWxzLlxuICovXG5leHBvcnQgY29uc3QgTXVsdGlWYWx1ZVJlbW92ZUJ1dHRvbiA9IChcbiAgcHJvcHM6IE11bHRpVmFsdWVSZW1vdmVQcm9wczxFeHRlbmRlZE9wdGlvbiwgdHJ1ZSwgR3JvdXBCYXNlPEV4dGVuZGVkT3B0aW9uPj5cbikgPT4ge1xuICBjb25zdCB7IGxhYmVsIH0gPSBwcm9wcz8uZGF0YSA/PyB7IGxhYmVsOiAnJyB9O1xuXG4gIHByb3BzLmlubmVyUHJvcHNbJ2FyaWEtbGFiZWwnXSA9IGBSZW1vdmUgJHtsYWJlbH1gO1xuXG4gIHJldHVybiAoXG4gICAgPE11bHRpVmFsdWVSZW1vdmUgey4uLnByb3BzfT5cbiAgICAgIDxNaW5pRGVsZXRlSWNvbiBzaXplPXsxMn0gLz5cbiAgICA8L011bHRpVmFsdWVSZW1vdmU+XG4gICk7XG59O1xuXG4vKipcbiAqIEN1c3RvbSByZW1vdmUgYWxsIGJ1dHRvbiBmb3IgbXVsdGktc2VsZWN0IG1vZGUuXG4gKiBQcm92aWRlcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBhY2Nlc3NpYmxlIHJlbW92YWwgb2YgYWxsIHNlbGVjdGVkIHZhbHVlcy5cbiAqL1xuXG5jb25zdCBDdXN0b21TdHlsZWRSZW1vdmVBbGxEaXYgPSBzdHlsZWQoJ2RpdicpKFxuICBjc3Moe1xuICAgICcmOmZvY3VzJzoge1xuICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLmNvbG9ycy5wcmltYXJ5fWAsXG4gICAgfSxcbiAgICAnJjpmb2N1cy12aXNpYmxlJzoge1xuICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLmNvbG9ycy5wcmltYXJ5fWAsXG4gICAgfSxcbiAgfSlcbik7XG5cbmV4cG9ydCBjb25zdCBSZW1vdmVBbGxCdXR0b24gPSAocHJvcHM6IFNpemVkSW5kaWNhdG9yUHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGdldFN0eWxlcyxcbiAgICBpbm5lclByb3BzOiB7IC4uLnJlc3RJbm5lclByb3BzIH0sXG4gICAgc2VsZWN0UHJvcHM6IHsgc2l6ZSB9LFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZW1vdmVBbGxCdXR0b25SZWYsIHNlbGVjdElucHV0UmVmIH0gPSB1c2VDb250ZXh0KFxuICAgIFNlbGVjdERyb3Bkb3duQ29udGV4dFxuICApO1xuXG4gIGNvbnN0IGljb25TaXplID0gc2l6ZSA/PyAnbWVkaXVtJztcbiAgY29uc3QgeyAuLi5pY29uUHJvcHMgfSA9IGluZGljYXRvckljb25zW2Ake2ljb25TaXplfVJlbW92ZWBdO1xuICBjb25zdCB7IGljb246IEluZGljYXRvckljb24gfSA9IGljb25Qcm9wcztcblxuICBjb25zdCBvbktleVByZXNzID0gKGU6IEtleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIHJlc3RJbm5lclByb3BzLm9uTW91c2VEb3duKSB7XG4gICAgICByZXN0SW5uZXJQcm9wcy5vbk1vdXNlRG93bihlIGFzIGFueSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc2VsZWN0SW5wdXRSZWY/LmN1cnJlbnQgJiZcbiAgICAgIChlLmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGUua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBlLmtleSA9PT0gJ0Fycm93RG93bicpXG4gICAgKSB7XG4gICAgICBzZWxlY3RJbnB1dFJlZj8uY3VycmVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzdHlsZSA9IGdldFN0eWxlcygnY2xlYXJJbmRpY2F0b3InLCBwcm9wcykgYXMgUmVhY3QuQ1NTUHJvcGVydGllcztcblxuICByZXR1cm4gKFxuICAgIDxDdXN0b21TdHlsZWRSZW1vdmVBbGxEaXZcbiAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgYWxsIHNlbGVjdGVkXCJcbiAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICB7Li4ucmVzdElubmVyUHJvcHN9XG4gICAgICByZWY9e3JlbW92ZUFsbEJ1dHRvblJlZn1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnYW11dC9uby1pbmxpbmUtc3R5bGVcbiAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgIG9uS2V5RG93bj17b25LZXlQcmVzc31cbiAgICA+XG4gICAgICA8SW5kaWNhdG9ySWNvbiB7Li4uaWNvblByb3BzfSBjb2xvcj1cInRleHRcIiAvPlxuICAgIDwvQ3VzdG9tU3R5bGVkUmVtb3ZlQWxsRGl2PlxuICApO1xufTtcbiJdfQ== */")), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9Gb3JtL1NlbGVjdERyb3Bkb3duL2VsZW1lbnRzL211bHRpLXZhbHVlLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE0RWlDIiwiZmlsZSI6Ii4uLy4uLy4uLy4uL3NyYy9Gb3JtL1NlbGVjdERyb3Bkb3duL2VsZW1lbnRzL211bHRpLXZhbHVlLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pbmlEZWxldGVJY29uIH0gZnJvbSAnQGNvZGVjYWRlbXkvZ2FtdXQtaWNvbnMnO1xuaW1wb3J0IHsgdGhlbWUgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSAnQGVtb3Rpb24vcmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgS2V5Ym9hcmRFdmVudCwgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIGNvbXBvbmVudHMgYXMgU2VsZWN0RHJvcGRvd25FbGVtZW50cyxcbiAgR3JvdXBCYXNlLFxuICBNdWx0aVZhbHVlUHJvcHMsXG4gIE11bHRpVmFsdWVSZW1vdmVQcm9wcyxcbn0gZnJvbSAncmVhY3Qtc2VsZWN0JztcblxuaW1wb3J0IHsgRXh0ZW5kZWRPcHRpb24sIFNpemVkSW5kaWNhdG9yUHJvcHMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBpbmRpY2F0b3JJY29ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNlbGVjdERyb3Bkb3duQ29udGV4dCB9IGZyb20gJy4vY29udGFpbmVycyc7XG5cbmNvbnN0IHsgTXVsdGlWYWx1ZSwgTXVsdGlWYWx1ZVJlbW92ZSB9ID0gU2VsZWN0RHJvcGRvd25FbGVtZW50cztcblxuLyoqXG4gKiBDdXN0b20gbXVsdGktdmFsdWUgY29tcG9uZW50IHRoYXQgbWFuYWdlcyBmb2N1cyBzdGF0ZSBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAqIFRyYWNrcyB3aGljaCBtdWx0aS12YWx1ZSBpcyBjdXJyZW50bHkgZm9jdXNlZCBhbmQgdXBkYXRlcyB0aGUgY29udGV4dCBhY2NvcmRpbmdseS5cbiAqL1xuZXhwb3J0IGNvbnN0IE11bHRpVmFsdWVXaXRoQ29sb3JNb2RlID0gKFxuICBwcm9wczogTXVsdGlWYWx1ZVByb3BzPEV4dGVuZGVkT3B0aW9uLCB0cnVlLCBHcm91cEJhc2U8RXh0ZW5kZWRPcHRpb24+PlxuKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudEZvY3VzZWRWYWx1ZSwgc2V0Q3VycmVudEZvY3VzZWRWYWx1ZSB9ID0gdXNlQ29udGV4dChcbiAgICBTZWxlY3REcm9wZG93bkNvbnRleHRcbiAgKTtcblxuICBjb25zdCB7IGRhdGEgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgdmFsdWUsIGxhYmVsIH0gPSBkYXRhO1xuXG4gIGlmIChcbiAgICBwcm9wcy5pc0ZvY3VzZWQgJiZcbiAgICBzZXRDdXJyZW50Rm9jdXNlZFZhbHVlICYmXG4gICAgY3VycmVudEZvY3VzZWRWYWx1ZSAhPT0gdmFsdWVcbiAgKSB7XG4gICAgc2V0Q3VycmVudEZvY3VzZWRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBpZiAoXG4gICAgIXByb3BzLmlzRm9jdXNlZCAmJlxuICAgIHNldEN1cnJlbnRGb2N1c2VkVmFsdWUgJiZcbiAgICBjdXJyZW50Rm9jdXNlZFZhbHVlID09PSB2YWx1ZVxuICApIHtcbiAgICBzZXRDdXJyZW50Rm9jdXNlZFZhbHVlKHVuZGVmaW5lZCk7XG4gIH1cbiAgY29uc3QgZGlzcGxheVRleHQgPSBkYXRhPy5hYmJyZXZpYXRpb24gPyBkYXRhLmFiYnJldmlhdGlvbiA6IGxhYmVsIHx8ICcnO1xuXG4gIHJldHVybiA8TXVsdGlWYWx1ZSB7Li4ucHJvcHN9PntkaXNwbGF5VGV4dH08L011bHRpVmFsdWU+O1xufTtcblxuLyoqXG4gKiBDdXN0b20gcmVtb3ZlIGJ1dHRvbiBmb3IgbXVsdGktdmFsdWUgaXRlbXMuXG4gKiBQcm92aWRlcyBhY2Nlc3NpYmxlIHJlbW92YWwgZnVuY3Rpb25hbGl0eSB3aXRoIHByb3BlciBBUklBIGxhYmVscy5cbiAqL1xuZXhwb3J0IGNvbnN0IE11bHRpVmFsdWVSZW1vdmVCdXR0b24gPSAoXG4gIHByb3BzOiBNdWx0aVZhbHVlUmVtb3ZlUHJvcHM8RXh0ZW5kZWRPcHRpb24sIHRydWUsIEdyb3VwQmFzZTxFeHRlbmRlZE9wdGlvbj4+XG4pID0+IHtcbiAgY29uc3QgeyBsYWJlbCB9ID0gcHJvcHM/LmRhdGEgPz8geyBsYWJlbDogJycgfTtcblxuICBwcm9wcy5pbm5lclByb3BzWydhcmlhLWxhYmVsJ10gPSBgUmVtb3ZlICR7bGFiZWx9YDtcblxuICByZXR1cm4gKFxuICAgIDxNdWx0aVZhbHVlUmVtb3ZlIHsuLi5wcm9wc30+XG4gICAgICA8TWluaURlbGV0ZUljb24gc2l6ZT17MTJ9IC8+XG4gICAgPC9NdWx0aVZhbHVlUmVtb3ZlPlxuICApO1xufTtcblxuLyoqXG4gKiBDdXN0b20gcmVtb3ZlIGFsbCBidXR0b24gZm9yIG11bHRpLXNlbGVjdCBtb2RlLlxuICogUHJvdmlkZXMga2V5Ym9hcmQgbmF2aWdhdGlvbiBhbmQgYWNjZXNzaWJsZSByZW1vdmFsIG9mIGFsbCBzZWxlY3RlZCB2YWx1ZXMuXG4gKi9cblxuY29uc3QgQ3VzdG9tU3R5bGVkUmVtb3ZlQWxsRGl2ID0gc3R5bGVkKCdkaXYnKShcbiAgY3NzKHtcbiAgICAnJjpmb2N1cyc6IHtcbiAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5jb2xvcnMucHJpbWFyeX1gLFxuICAgIH0sXG4gICAgJyY6Zm9jdXMtdmlzaWJsZSc6IHtcbiAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5jb2xvcnMucHJpbWFyeX1gLFxuICAgIH0sXG4gIH0pXG4pO1xuXG5leHBvcnQgY29uc3QgUmVtb3ZlQWxsQnV0dG9uID0gKHByb3BzOiBTaXplZEluZGljYXRvclByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBnZXRTdHlsZXMsXG4gICAgaW5uZXJQcm9wczogeyAuLi5yZXN0SW5uZXJQcm9wcyB9LFxuICAgIHNlbGVjdFByb3BzOiB7IHNpemUgfSxcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVtb3ZlQWxsQnV0dG9uUmVmLCBzZWxlY3RJbnB1dFJlZiB9ID0gdXNlQ29udGV4dChcbiAgICBTZWxlY3REcm9wZG93bkNvbnRleHRcbiAgKTtcblxuICBjb25zdCBpY29uU2l6ZSA9IHNpemUgPz8gJ21lZGl1bSc7XG4gIGNvbnN0IHsgLi4uaWNvblByb3BzIH0gPSBpbmRpY2F0b3JJY29uc1tgJHtpY29uU2l6ZX1SZW1vdmVgXTtcbiAgY29uc3QgeyBpY29uOiBJbmRpY2F0b3JJY29uIH0gPSBpY29uUHJvcHM7XG5cbiAgY29uc3Qgb25LZXlQcmVzcyA9IChlOiBLZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiByZXN0SW5uZXJQcm9wcy5vbk1vdXNlRG93bikge1xuICAgICAgcmVzdElubmVyUHJvcHMub25Nb3VzZURvd24oZSBhcyBhbnkpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHNlbGVjdElucHV0UmVmPy5jdXJyZW50ICYmXG4gICAgICAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBlLmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZS5rZXkgPT09ICdBcnJvd0Rvd24nKVxuICAgICkge1xuICAgICAgc2VsZWN0SW5wdXRSZWY/LmN1cnJlbnQuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc3R5bGUgPSBnZXRTdHlsZXMoJ2NsZWFySW5kaWNhdG9yJywgcHJvcHMpIGFzIFJlYWN0LkNTU1Byb3BlcnRpZXM7XG5cbiAgcmV0dXJuIChcbiAgICA8Q3VzdG9tU3R5bGVkUmVtb3ZlQWxsRGl2XG4gICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIGFsbCBzZWxlY3RlZFwiXG4gICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgIHRhYkluZGV4PXswfVxuICAgICAgey4uLnJlc3RJbm5lclByb3BzfVxuICAgICAgcmVmPXtyZW1vdmVBbGxCdXR0b25SZWZ9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2FtdXQvbm8taW5saW5lLXN0eWxlXG4gICAgICBzdHlsZT17c3R5bGV9XG4gICAgICBvbktleURvd249e29uS2V5UHJlc3N9XG4gICAgPlxuICAgICAgPEluZGljYXRvckljb24gey4uLmljb25Qcm9wc30gY29sb3I9XCJ0ZXh0XCIgLz5cbiAgICA8L0N1c3RvbVN0eWxlZFJlbW92ZUFsbERpdj5cbiAgKTtcbn07XG4iXX0= */");
|
|
78
|
+
}, ";label:CustomStyledRemoveAllDiv;" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9Gb3JtL1NlbGVjdERyb3Bkb3duL2VsZW1lbnRzL211bHRpLXZhbHVlLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE2RUUiLCJmaWxlIjoiLi4vLi4vLi4vLi4vc3JjL0Zvcm0vU2VsZWN0RHJvcGRvd24vZWxlbWVudHMvbXVsdGktdmFsdWUudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWluaURlbGV0ZUljb24gfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1pY29ucyc7XG5pbXBvcnQgeyB0aGVtZSB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LXN0eWxlcyc7XG5pbXBvcnQgeyBjc3MgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBLZXlib2FyZEV2ZW50LCB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgY29tcG9uZW50cyBhcyBTZWxlY3REcm9wZG93bkVsZW1lbnRzLFxuICBHcm91cEJhc2UsXG4gIE11bHRpVmFsdWVQcm9wcyxcbiAgTXVsdGlWYWx1ZVJlbW92ZVByb3BzLFxufSBmcm9tICdyZWFjdC1zZWxlY3QnO1xuXG5pbXBvcnQgeyBFeHRlbmRlZE9wdGlvbiwgU2l6ZWRJbmRpY2F0b3JQcm9wcyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGluZGljYXRvckljb25zIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU2VsZWN0RHJvcGRvd25Db250ZXh0IH0gZnJvbSAnLi9jb250YWluZXJzJztcblxuY29uc3QgeyBNdWx0aVZhbHVlLCBNdWx0aVZhbHVlUmVtb3ZlIH0gPSBTZWxlY3REcm9wZG93bkVsZW1lbnRzO1xuXG4vKipcbiAqIEN1c3RvbSBtdWx0aS12YWx1ZSBjb21wb25lbnQgdGhhdCBtYW5hZ2VzIGZvY3VzIHN0YXRlIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICogVHJhY2tzIHdoaWNoIG11bHRpLXZhbHVlIGlzIGN1cnJlbnRseSBmb2N1c2VkIGFuZCB1cGRhdGVzIHRoZSBjb250ZXh0IGFjY29yZGluZ2x5LlxuICovXG5leHBvcnQgY29uc3QgTXVsdGlWYWx1ZVdpdGhDb2xvck1vZGUgPSAoXG4gIHByb3BzOiBNdWx0aVZhbHVlUHJvcHM8RXh0ZW5kZWRPcHRpb24sIHRydWUsIEdyb3VwQmFzZTxFeHRlbmRlZE9wdGlvbj4+XG4pID0+IHtcbiAgY29uc3QgeyBjdXJyZW50Rm9jdXNlZFZhbHVlLCBzZXRDdXJyZW50Rm9jdXNlZFZhbHVlIH0gPSB1c2VDb250ZXh0KFxuICAgIFNlbGVjdERyb3Bkb3duQ29udGV4dFxuICApO1xuXG4gIGNvbnN0IHsgZGF0YSB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyB2YWx1ZSwgbGFiZWwgfSA9IGRhdGE7XG5cbiAgaWYgKFxuICAgIHByb3BzLmlzRm9jdXNlZCAmJlxuICAgIHNldEN1cnJlbnRGb2N1c2VkVmFsdWUgJiZcbiAgICBjdXJyZW50Rm9jdXNlZFZhbHVlICE9PSB2YWx1ZVxuICApIHtcbiAgICBzZXRDdXJyZW50Rm9jdXNlZFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAhcHJvcHMuaXNGb2N1c2VkICYmXG4gICAgc2V0Q3VycmVudEZvY3VzZWRWYWx1ZSAmJlxuICAgIGN1cnJlbnRGb2N1c2VkVmFsdWUgPT09IHZhbHVlXG4gICkge1xuICAgIHNldEN1cnJlbnRGb2N1c2VkVmFsdWUodW5kZWZpbmVkKTtcbiAgfVxuICBjb25zdCBkaXNwbGF5VGV4dCA9IGRhdGE/LmFiYnJldmlhdGlvbiA/IGRhdGEuYWJicmV2aWF0aW9uIDogbGFiZWwgfHwgJyc7XG5cbiAgcmV0dXJuIDxNdWx0aVZhbHVlIHsuLi5wcm9wc30+e2Rpc3BsYXlUZXh0fTwvTXVsdGlWYWx1ZT47XG59O1xuXG4vKipcbiAqIEN1c3RvbSByZW1vdmUgYnV0dG9uIGZvciBtdWx0aS12YWx1ZSBpdGVtcy5cbiAqIFByb3ZpZGVzIGFjY2Vzc2libGUgcmVtb3ZhbCBmdW5jdGlvbmFsaXR5IHdpdGggcHJvcGVyIEFSSUEgbGFiZWxzLlxuICovXG5leHBvcnQgY29uc3QgTXVsdGlWYWx1ZVJlbW92ZUJ1dHRvbiA9IChcbiAgcHJvcHM6IE11bHRpVmFsdWVSZW1vdmVQcm9wczxFeHRlbmRlZE9wdGlvbiwgdHJ1ZSwgR3JvdXBCYXNlPEV4dGVuZGVkT3B0aW9uPj5cbikgPT4ge1xuICBjb25zdCB7IGxhYmVsIH0gPSBwcm9wcz8uZGF0YSA/PyB7IGxhYmVsOiAnJyB9O1xuXG4gIHByb3BzLmlubmVyUHJvcHNbJ2FyaWEtbGFiZWwnXSA9IGBSZW1vdmUgJHtsYWJlbH1gO1xuXG4gIHJldHVybiAoXG4gICAgPE11bHRpVmFsdWVSZW1vdmUgey4uLnByb3BzfT5cbiAgICAgIDxNaW5pRGVsZXRlSWNvbiBzaXplPXsxMn0gLz5cbiAgICA8L011bHRpVmFsdWVSZW1vdmU+XG4gICk7XG59O1xuXG4vKipcbiAqIEN1c3RvbSByZW1vdmUgYWxsIGJ1dHRvbiBmb3IgbXVsdGktc2VsZWN0IG1vZGUuXG4gKiBQcm92aWRlcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBhY2Nlc3NpYmxlIHJlbW92YWwgb2YgYWxsIHNlbGVjdGVkIHZhbHVlcy5cbiAqL1xuXG5jb25zdCBDdXN0b21TdHlsZWRSZW1vdmVBbGxEaXYgPSBzdHlsZWQoJ2RpdicpKFxuICBjc3Moe1xuICAgICcmOmZvY3VzJzoge1xuICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLmNvbG9ycy5wcmltYXJ5fWAsXG4gICAgfSxcbiAgICAnJjpmb2N1cy12aXNpYmxlJzoge1xuICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLmNvbG9ycy5wcmltYXJ5fWAsXG4gICAgfSxcbiAgfSlcbik7XG5cbmV4cG9ydCBjb25zdCBSZW1vdmVBbGxCdXR0b24gPSAocHJvcHM6IFNpemVkSW5kaWNhdG9yUHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGdldFN0eWxlcyxcbiAgICBpbm5lclByb3BzOiB7IC4uLnJlc3RJbm5lclByb3BzIH0sXG4gICAgc2VsZWN0UHJvcHM6IHsgc2l6ZSB9LFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZW1vdmVBbGxCdXR0b25SZWYsIHNlbGVjdElucHV0UmVmIH0gPSB1c2VDb250ZXh0KFxuICAgIFNlbGVjdERyb3Bkb3duQ29udGV4dFxuICApO1xuXG4gIGNvbnN0IGljb25TaXplID0gc2l6ZSA/PyAnbWVkaXVtJztcbiAgY29uc3QgeyAuLi5pY29uUHJvcHMgfSA9IGluZGljYXRvckljb25zW2Ake2ljb25TaXplfVJlbW92ZWBdO1xuICBjb25zdCB7IGljb246IEluZGljYXRvckljb24gfSA9IGljb25Qcm9wcztcblxuICBjb25zdCBvbktleVByZXNzID0gKGU6IEtleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIHJlc3RJbm5lclByb3BzLm9uTW91c2VEb3duKSB7XG4gICAgICByZXN0SW5uZXJQcm9wcy5vbk1vdXNlRG93bihlIGFzIGFueSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc2VsZWN0SW5wdXRSZWY/LmN1cnJlbnQgJiZcbiAgICAgIChlLmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGUua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBlLmtleSA9PT0gJ0Fycm93RG93bicpXG4gICAgKSB7XG4gICAgICBzZWxlY3RJbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHN0eWxlID0gZ2V0U3R5bGVzKCdjbGVhckluZGljYXRvcicsIHByb3BzKSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzO1xuXG4gIHJldHVybiAoXG4gICAgPEN1c3RvbVN0eWxlZFJlbW92ZUFsbERpdlxuICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBhbGwgc2VsZWN0ZWRcIlxuICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICB0YWJJbmRleD17MH1cbiAgICAgIHsuLi5yZXN0SW5uZXJQcm9wc31cbiAgICAgIHJlZj17cmVtb3ZlQWxsQnV0dG9uUmVmIGFzIFJlYWN0LlJlZjxIVE1MRGl2RWxlbWVudD59XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2FtdXQvbm8taW5saW5lLXN0eWxlXG4gICAgICBzdHlsZT17c3R5bGV9XG4gICAgICBvbktleURvd249e29uS2V5UHJlc3N9XG4gICAgPlxuICAgICAgPEluZGljYXRvckljb24gey4uLmljb25Qcm9wc30gY29sb3I9XCJ0ZXh0XCIgLz5cbiAgICA8L0N1c3RvbVN0eWxlZFJlbW92ZUFsbERpdj5cbiAgKTtcbn07XG4iXX0= */")), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9Gb3JtL1NlbGVjdERyb3Bkb3duL2VsZW1lbnRzL211bHRpLXZhbHVlLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE0RWlDIiwiZmlsZSI6Ii4uLy4uLy4uLy4uL3NyYy9Gb3JtL1NlbGVjdERyb3Bkb3duL2VsZW1lbnRzL211bHRpLXZhbHVlLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pbmlEZWxldGVJY29uIH0gZnJvbSAnQGNvZGVjYWRlbXkvZ2FtdXQtaWNvbnMnO1xuaW1wb3J0IHsgdGhlbWUgfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSAnQGVtb3Rpb24vcmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgS2V5Ym9hcmRFdmVudCwgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIGNvbXBvbmVudHMgYXMgU2VsZWN0RHJvcGRvd25FbGVtZW50cyxcbiAgR3JvdXBCYXNlLFxuICBNdWx0aVZhbHVlUHJvcHMsXG4gIE11bHRpVmFsdWVSZW1vdmVQcm9wcyxcbn0gZnJvbSAncmVhY3Qtc2VsZWN0JztcblxuaW1wb3J0IHsgRXh0ZW5kZWRPcHRpb24sIFNpemVkSW5kaWNhdG9yUHJvcHMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBpbmRpY2F0b3JJY29ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNlbGVjdERyb3Bkb3duQ29udGV4dCB9IGZyb20gJy4vY29udGFpbmVycyc7XG5cbmNvbnN0IHsgTXVsdGlWYWx1ZSwgTXVsdGlWYWx1ZVJlbW92ZSB9ID0gU2VsZWN0RHJvcGRvd25FbGVtZW50cztcblxuLyoqXG4gKiBDdXN0b20gbXVsdGktdmFsdWUgY29tcG9uZW50IHRoYXQgbWFuYWdlcyBmb2N1cyBzdGF0ZSBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAqIFRyYWNrcyB3aGljaCBtdWx0aS12YWx1ZSBpcyBjdXJyZW50bHkgZm9jdXNlZCBhbmQgdXBkYXRlcyB0aGUgY29udGV4dCBhY2NvcmRpbmdseS5cbiAqL1xuZXhwb3J0IGNvbnN0IE11bHRpVmFsdWVXaXRoQ29sb3JNb2RlID0gKFxuICBwcm9wczogTXVsdGlWYWx1ZVByb3BzPEV4dGVuZGVkT3B0aW9uLCB0cnVlLCBHcm91cEJhc2U8RXh0ZW5kZWRPcHRpb24+PlxuKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudEZvY3VzZWRWYWx1ZSwgc2V0Q3VycmVudEZvY3VzZWRWYWx1ZSB9ID0gdXNlQ29udGV4dChcbiAgICBTZWxlY3REcm9wZG93bkNvbnRleHRcbiAgKTtcblxuICBjb25zdCB7IGRhdGEgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgdmFsdWUsIGxhYmVsIH0gPSBkYXRhO1xuXG4gIGlmIChcbiAgICBwcm9wcy5pc0ZvY3VzZWQgJiZcbiAgICBzZXRDdXJyZW50Rm9jdXNlZFZhbHVlICYmXG4gICAgY3VycmVudEZvY3VzZWRWYWx1ZSAhPT0gdmFsdWVcbiAgKSB7XG4gICAgc2V0Q3VycmVudEZvY3VzZWRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBpZiAoXG4gICAgIXByb3BzLmlzRm9jdXNlZCAmJlxuICAgIHNldEN1cnJlbnRGb2N1c2VkVmFsdWUgJiZcbiAgICBjdXJyZW50Rm9jdXNlZFZhbHVlID09PSB2YWx1ZVxuICApIHtcbiAgICBzZXRDdXJyZW50Rm9jdXNlZFZhbHVlKHVuZGVmaW5lZCk7XG4gIH1cbiAgY29uc3QgZGlzcGxheVRleHQgPSBkYXRhPy5hYmJyZXZpYXRpb24gPyBkYXRhLmFiYnJldmlhdGlvbiA6IGxhYmVsIHx8ICcnO1xuXG4gIHJldHVybiA8TXVsdGlWYWx1ZSB7Li4ucHJvcHN9PntkaXNwbGF5VGV4dH08L011bHRpVmFsdWU+O1xufTtcblxuLyoqXG4gKiBDdXN0b20gcmVtb3ZlIGJ1dHRvbiBmb3IgbXVsdGktdmFsdWUgaXRlbXMuXG4gKiBQcm92aWRlcyBhY2Nlc3NpYmxlIHJlbW92YWwgZnVuY3Rpb25hbGl0eSB3aXRoIHByb3BlciBBUklBIGxhYmVscy5cbiAqL1xuZXhwb3J0IGNvbnN0IE11bHRpVmFsdWVSZW1vdmVCdXR0b24gPSAoXG4gIHByb3BzOiBNdWx0aVZhbHVlUmVtb3ZlUHJvcHM8RXh0ZW5kZWRPcHRpb24sIHRydWUsIEdyb3VwQmFzZTxFeHRlbmRlZE9wdGlvbj4+XG4pID0+IHtcbiAgY29uc3QgeyBsYWJlbCB9ID0gcHJvcHM/LmRhdGEgPz8geyBsYWJlbDogJycgfTtcblxuICBwcm9wcy5pbm5lclByb3BzWydhcmlhLWxhYmVsJ10gPSBgUmVtb3ZlICR7bGFiZWx9YDtcblxuICByZXR1cm4gKFxuICAgIDxNdWx0aVZhbHVlUmVtb3ZlIHsuLi5wcm9wc30+XG4gICAgICA8TWluaURlbGV0ZUljb24gc2l6ZT17MTJ9IC8+XG4gICAgPC9NdWx0aVZhbHVlUmVtb3ZlPlxuICApO1xufTtcblxuLyoqXG4gKiBDdXN0b20gcmVtb3ZlIGFsbCBidXR0b24gZm9yIG11bHRpLXNlbGVjdCBtb2RlLlxuICogUHJvdmlkZXMga2V5Ym9hcmQgbmF2aWdhdGlvbiBhbmQgYWNjZXNzaWJsZSByZW1vdmFsIG9mIGFsbCBzZWxlY3RlZCB2YWx1ZXMuXG4gKi9cblxuY29uc3QgQ3VzdG9tU3R5bGVkUmVtb3ZlQWxsRGl2ID0gc3R5bGVkKCdkaXYnKShcbiAgY3NzKHtcbiAgICAnJjpmb2N1cyc6IHtcbiAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5jb2xvcnMucHJpbWFyeX1gLFxuICAgIH0sXG4gICAgJyY6Zm9jdXMtdmlzaWJsZSc6IHtcbiAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5jb2xvcnMucHJpbWFyeX1gLFxuICAgIH0sXG4gIH0pXG4pO1xuXG5leHBvcnQgY29uc3QgUmVtb3ZlQWxsQnV0dG9uID0gKHByb3BzOiBTaXplZEluZGljYXRvclByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBnZXRTdHlsZXMsXG4gICAgaW5uZXJQcm9wczogeyAuLi5yZXN0SW5uZXJQcm9wcyB9LFxuICAgIHNlbGVjdFByb3BzOiB7IHNpemUgfSxcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVtb3ZlQWxsQnV0dG9uUmVmLCBzZWxlY3RJbnB1dFJlZiB9ID0gdXNlQ29udGV4dChcbiAgICBTZWxlY3REcm9wZG93bkNvbnRleHRcbiAgKTtcblxuICBjb25zdCBpY29uU2l6ZSA9IHNpemUgPz8gJ21lZGl1bSc7XG4gIGNvbnN0IHsgLi4uaWNvblByb3BzIH0gPSBpbmRpY2F0b3JJY29uc1tgJHtpY29uU2l6ZX1SZW1vdmVgXTtcbiAgY29uc3QgeyBpY29uOiBJbmRpY2F0b3JJY29uIH0gPSBpY29uUHJvcHM7XG5cbiAgY29uc3Qgb25LZXlQcmVzcyA9IChlOiBLZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiByZXN0SW5uZXJQcm9wcy5vbk1vdXNlRG93bikge1xuICAgICAgcmVzdElubmVyUHJvcHMub25Nb3VzZURvd24oZSBhcyBhbnkpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHNlbGVjdElucHV0UmVmPy5jdXJyZW50ICYmXG4gICAgICAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBlLmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZS5rZXkgPT09ICdBcnJvd0Rvd24nKVxuICAgICkge1xuICAgICAgc2VsZWN0SW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzdHlsZSA9IGdldFN0eWxlcygnY2xlYXJJbmRpY2F0b3InLCBwcm9wcykgYXMgUmVhY3QuQ1NTUHJvcGVydGllcztcblxuICByZXR1cm4gKFxuICAgIDxDdXN0b21TdHlsZWRSZW1vdmVBbGxEaXZcbiAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgYWxsIHNlbGVjdGVkXCJcbiAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICB7Li4ucmVzdElubmVyUHJvcHN9XG4gICAgICByZWY9e3JlbW92ZUFsbEJ1dHRvblJlZiBhcyBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+fVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdhbXV0L25vLWlubGluZS1zdHlsZVxuICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgb25LZXlEb3duPXtvbktleVByZXNzfVxuICAgID5cbiAgICAgIDxJbmRpY2F0b3JJY29uIHsuLi5pY29uUHJvcHN9IGNvbG9yPVwidGV4dFwiIC8+XG4gICAgPC9DdXN0b21TdHlsZWRSZW1vdmVBbGxEaXY+XG4gICk7XG59O1xuIl19 */");
|
|
79
79
|
export const RemoveAllButton = props => {
|
|
80
80
|
const {
|
|
81
81
|
getStyles,
|
|
@@ -102,7 +102,7 @@ export const RemoveAllButton = props => {
|
|
|
102
102
|
restInnerProps.onMouseDown(e);
|
|
103
103
|
}
|
|
104
104
|
if (selectInputRef?.current && (e.key === 'ArrowRight' || e.key === 'ArrowLeft' || e.key === 'ArrowDown')) {
|
|
105
|
-
selectInputRef
|
|
105
|
+
selectInputRef.current.focus();
|
|
106
106
|
}
|
|
107
107
|
};
|
|
108
108
|
const style = getStyles('clearIndicator', props);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { KeyboardEvent } from 'react';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { ActionMeta, Options as OptionsType } from 'react-select';
|
|
4
|
+
import { SelectOptionBase } from '../../utils';
|
|
5
|
+
import { MultiSelectDropdownProps, OptionStrict, SelectDropdownGroup, SelectDropdownProps, SingleSelectDropdownProps } from '../types';
|
|
6
|
+
interface UseSelectHandlersArgs {
|
|
7
|
+
onChange?: SingleSelectDropdownProps['onChange'] | MultiSelectDropdownProps['onChange'];
|
|
8
|
+
multiple?: boolean;
|
|
9
|
+
onCreateOption?: (inputValue: string) => void;
|
|
10
|
+
selectOptions: SelectOptionBase[] | SelectDropdownGroup[];
|
|
11
|
+
value?: SelectDropdownProps['value'];
|
|
12
|
+
currentFocusedValue: unknown;
|
|
13
|
+
removeAllButtonRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
14
|
+
}
|
|
15
|
+
interface UseSelectHandlersReturn {
|
|
16
|
+
activated: boolean;
|
|
17
|
+
multiValues: OptionStrict[] | false;
|
|
18
|
+
changeHandler: (optionEvent: OptionStrict | OptionsType<OptionStrict>, actionMeta: ActionMeta<OptionStrict>) => void;
|
|
19
|
+
keyPressHandler: (e: KeyboardEvent<HTMLDivElement>) => void;
|
|
20
|
+
}
|
|
21
|
+
export declare const useSelectHandlers: ({ onChange, multiple, onCreateOption, selectOptions, value, currentFocusedValue, removeAllButtonRef, }: UseSelectHandlersArgs) => UseSelectHandlersReturn;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { ON_CHANGE_ACTION } from '../core/constants';
|
|
3
|
+
import { filterValueFromOptions, getCreatedOptionValue, isMultipleSelectProps, isOptionsGrouped, isSingleSelectProps, removeValueFromSelectedOptions } from '../core/utils';
|
|
4
|
+
export const useSelectHandlers = ({
|
|
5
|
+
onChange,
|
|
6
|
+
multiple,
|
|
7
|
+
onCreateOption,
|
|
8
|
+
selectOptions,
|
|
9
|
+
value,
|
|
10
|
+
currentFocusedValue,
|
|
11
|
+
removeAllButtonRef
|
|
12
|
+
}) => {
|
|
13
|
+
const [activated, setActivated] = useState(false);
|
|
14
|
+
const [multiValues, setMultiValues] = useState(multiple ? filterValueFromOptions(selectOptions, value, isOptionsGrouped(selectOptions)) : false);
|
|
15
|
+
|
|
16
|
+
// Sync multi-select value from props when controlled (`value` is a string[]).
|
|
17
|
+
// Uncontrolled multi (`value` undefined or '') keeps selection in local state.
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (!multiple || !Array.isArray(value)) return;
|
|
20
|
+
const newMultiValues = filterValueFromOptions(selectOptions, value, isOptionsGrouped(selectOptions));
|
|
21
|
+
if (newMultiValues !== multiValues) setMultiValues(newMultiValues);
|
|
22
|
+
|
|
23
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
24
|
+
}, [selectOptions, value, multiple]);
|
|
25
|
+
const changeHandler = useCallback((optionEvent, actionMeta) => {
|
|
26
|
+
setActivated(true);
|
|
27
|
+
if (actionMeta.action === 'create-option') {
|
|
28
|
+
const createdValue = getCreatedOptionValue(optionEvent, actionMeta, multiple);
|
|
29
|
+
if (createdValue) onCreateOption?.(createdValue);
|
|
30
|
+
}
|
|
31
|
+
const onChangeProps = {
|
|
32
|
+
onChange,
|
|
33
|
+
multiple
|
|
34
|
+
};
|
|
35
|
+
const forwardedMeta = actionMeta.action === 'create-option' ? actionMeta : {
|
|
36
|
+
action: ON_CHANGE_ACTION,
|
|
37
|
+
option: isMultipleSelectProps(onChangeProps) ? undefined : optionEvent
|
|
38
|
+
};
|
|
39
|
+
if (isSingleSelectProps(onChangeProps)) {
|
|
40
|
+
onChangeProps.onChange?.(optionEvent, forwardedMeta);
|
|
41
|
+
}
|
|
42
|
+
if (isMultipleSelectProps(onChangeProps)) {
|
|
43
|
+
setMultiValues(optionEvent);
|
|
44
|
+
onChangeProps.onChange?.(optionEvent, forwardedMeta);
|
|
45
|
+
}
|
|
46
|
+
}, [onChange, multiple, onCreateOption]);
|
|
47
|
+
const keyPressHandler = e => {
|
|
48
|
+
if (multiple && e.key === 'Enter' && currentFocusedValue && multiValues) {
|
|
49
|
+
const newMultiValues = removeValueFromSelectedOptions(multiValues, currentFocusedValue);
|
|
50
|
+
if (newMultiValues !== multiValues) setMultiValues(newMultiValues);
|
|
51
|
+
}
|
|
52
|
+
if (removeAllButtonRef.current !== null && e.key === 'ArrowRight' && multiValues && currentFocusedValue === multiValues[multiValues.length - 1].value) {
|
|
53
|
+
removeAllButtonRef.current.focus();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
activated,
|
|
58
|
+
multiValues,
|
|
59
|
+
changeHandler,
|
|
60
|
+
keyPressHandler
|
|
61
|
+
};
|
|
62
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SelectOptionBase } from '../../utils';
|
|
2
|
+
import { SelectDropdownGroup, SelectDropdownOptions, SelectDropdownSizes } from '../types';
|
|
3
|
+
interface UseSelectOptionsArgs {
|
|
4
|
+
options?: SelectDropdownOptions | SelectDropdownGroup[];
|
|
5
|
+
id?: string;
|
|
6
|
+
size?: SelectDropdownSizes['size'];
|
|
7
|
+
value?: string | string[];
|
|
8
|
+
}
|
|
9
|
+
interface UseSelectOptionsReturn {
|
|
10
|
+
selectOptions: SelectOptionBase[] | SelectDropdownGroup[];
|
|
11
|
+
parsedValue: SelectOptionBase | undefined;
|
|
12
|
+
}
|
|
13
|
+
export declare const useSelectOptions: ({ options, id, size, value, }: UseSelectOptionsArgs) => UseSelectOptionsReturn;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { parseOptions } from '../../utils';
|
|
3
|
+
import { isOptionsGrouped } from '../core/utils';
|
|
4
|
+
export const useSelectOptions = ({
|
|
5
|
+
options,
|
|
6
|
+
id,
|
|
7
|
+
size,
|
|
8
|
+
value
|
|
9
|
+
}) => {
|
|
10
|
+
const selectOptions = useMemo(() => {
|
|
11
|
+
if (!options || Array.isArray(options) && !options.length || typeof options === 'object' && !Array.isArray(options) && Object.keys(options).length === 0) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
if (isOptionsGrouped(options)) {
|
|
15
|
+
return options;
|
|
16
|
+
}
|
|
17
|
+
return parseOptions({
|
|
18
|
+
options,
|
|
19
|
+
id,
|
|
20
|
+
size
|
|
21
|
+
});
|
|
22
|
+
}, [options, id, size]);
|
|
23
|
+
const parsedValue = useMemo(() => {
|
|
24
|
+
if (isOptionsGrouped(selectOptions)) {
|
|
25
|
+
for (const group of selectOptions) {
|
|
26
|
+
if (group.options) {
|
|
27
|
+
const foundOption = group.options.find(option => option.value === value);
|
|
28
|
+
if (foundOption) return foundOption;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
return selectOptions.find(option => option.value === value);
|
|
34
|
+
}, [selectOptions, value]);
|
|
35
|
+
return {
|
|
36
|
+
selectOptions,
|
|
37
|
+
parsedValue
|
|
38
|
+
};
|
|
39
|
+
};
|
|
@@ -14,7 +14,7 @@ export type InternalSelectProps = {
|
|
|
14
14
|
* Ref type for programmatic focus management.
|
|
15
15
|
* Used for managing focus on select input and remove all button.
|
|
16
16
|
*/
|
|
17
|
-
export type
|
|
17
|
+
export type ProgrammaticFocusRef = React.MutableRefObject<HTMLDivElement> | React.MutableRefObject<null>;
|
|
18
18
|
/**
|
|
19
19
|
* Context value for SelectDropdown internal state management.
|
|
20
20
|
* Provides access to focus state and refs for keyboard navigation.
|
|
@@ -25,9 +25,9 @@ export interface SelectDropdownContextValueTypes {
|
|
|
25
25
|
/** Function to update the currently focused value */
|
|
26
26
|
setCurrentFocusedValue?: React.Dispatch<React.SetStateAction<unknown>>;
|
|
27
27
|
/** Ref to the select input for programmatic focus */
|
|
28
|
-
selectInputRef?:
|
|
28
|
+
selectInputRef?: ProgrammaticFocusRef;
|
|
29
29
|
/** Ref to the remove all button for programmatic focus */
|
|
30
|
-
removeAllButtonRef?:
|
|
30
|
+
removeAllButtonRef?: ProgrammaticFocusRef;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Props for sized indicator components (dropdown arrow, search icon, etc.).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StyleProps } from '@codecademy/variance';
|
|
2
|
-
import { conditionalBorderStates } from '../styles';
|
|
2
|
+
import { conditionalBorderStates } from '../core/styles';
|
|
3
3
|
import { InternalInputsProps } from './component-props';
|
|
4
4
|
/**
|
|
5
5
|
* Size variants for the SelectDropdown component.
|