@codecademy/gamut 68.1.2 → 68.1.3-alpha.77d8dc.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/ConnectedForm/utils.d.ts +1 -1
- package/dist/DatePicker/Calendar/Calendar.d.ts +9 -0
- package/dist/DatePicker/Calendar/Calendar.js +28 -0
- package/dist/DatePicker/Calendar/CalendarBody.d.ts +3 -0
- package/dist/DatePicker/Calendar/CalendarBody.js +155 -0
- package/dist/DatePicker/Calendar/CalendarFooter.d.ts +3 -0
- package/dist/DatePicker/Calendar/CalendarFooter.js +54 -0
- package/dist/DatePicker/Calendar/CalendarHeader.d.ts +3 -0
- package/dist/DatePicker/Calendar/CalendarHeader.js +67 -0
- package/dist/DatePicker/Calendar/index.d.ts +6 -0
- package/dist/DatePicker/Calendar/index.js +5 -0
- package/dist/DatePicker/Calendar/types.d.ts +60 -0
- package/dist/DatePicker/Calendar/types.js +1 -0
- package/dist/DatePicker/Calendar/utils/dateGrid.d.ts +30 -0
- package/dist/DatePicker/Calendar/utils/dateGrid.js +93 -0
- package/dist/DatePicker/Calendar/utils/format.d.ts +61 -0
- package/dist/DatePicker/Calendar/utils/format.js +184 -0
- package/dist/DatePicker/Calendar/utils/index.d.ts +3 -0
- package/dist/DatePicker/Calendar/utils/index.js +3 -0
- package/dist/DatePicker/Calendar/utils/keyHandler.d.ts +13 -0
- package/dist/DatePicker/Calendar/utils/keyHandler.js +116 -0
- package/dist/DatePicker/Calendar/utils/validation.d.ts +13 -0
- package/dist/DatePicker/Calendar/utils/validation.js +23 -0
- package/dist/DatePicker/DatePicker.d.ts +8 -0
- package/dist/DatePicker/DatePicker.js +147 -0
- package/dist/DatePicker/DatePickerCalendar.d.ts +13 -0
- package/dist/DatePicker/DatePickerCalendar.js +130 -0
- package/dist/DatePicker/DatePickerContext.d.ts +11 -0
- package/dist/DatePicker/DatePickerContext.js +18 -0
- package/dist/DatePicker/DatePickerInput.d.ts +16 -0
- package/dist/DatePicker/DatePickerInput.js +135 -0
- package/dist/DatePicker/index.d.ts +13 -0
- package/dist/DatePicker/index.js +10 -0
- package/dist/DatePicker/translations.d.ts +3 -0
- package/dist/DatePicker/translations.js +4 -0
- package/dist/DatePicker/types.d.ts +85 -0
- package/dist/DatePicker/types.js +1 -0
- package/dist/DatePicker/utils.d.ts +3 -0
- package/dist/DatePicker/utils.js +71 -0
- package/dist/FocusTrap/index.d.ts +2 -2
- package/dist/List/elements.d.ts +1 -1
- package/dist/PopoverContainer/PopoverContainer.js +3 -1
- package/dist/PopoverContainer/types.d.ts +5 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
export const DatePickerContext = /*#__PURE__*/createContext(null);
|
|
3
|
+
|
|
4
|
+
/** Provider component; DatePicker uses this to set the context value. */
|
|
5
|
+
export const DatePickerProvider = DatePickerContext.Provider;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Returns the DatePicker context value (shared state and callbacks).
|
|
9
|
+
* Must be used inside a DatePicker. For composed layouts, use this to get
|
|
10
|
+
* openCalendar, closeCalendar, isCalendarOpen, inputRef, calendarDialogId, etc.
|
|
11
|
+
*/
|
|
12
|
+
export function useDatePicker() {
|
|
13
|
+
const value = useContext(DatePickerContext);
|
|
14
|
+
if (value == null) {
|
|
15
|
+
throw new Error('useDatePickerContext must be used within a DatePicker.');
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
import { Input } from '../Form/inputs/Input';
|
|
3
|
+
/**
|
|
4
|
+
* Props for DatePickerInput. When used inside DatePicker, only overrides (e.g. placeholder, label).
|
|
5
|
+
* In range mode, use rangePart to bind to start or end date. When outside DatePicker, pass value, onChange, etc.
|
|
6
|
+
*/
|
|
7
|
+
export type DatePickerInputProps = Omit<ComponentProps<typeof Input>, 'type' | 'icon'> & {
|
|
8
|
+
/** In range mode: which part of the range this input edits. Omit for single-date or combined display. */
|
|
9
|
+
rangePart?: 'start' | 'end';
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Date input. When inside DatePicker: owns local input value state and syncs to
|
|
13
|
+
* shared selectedDate via context on blur/parse; opens calendar on click/arrow down.
|
|
14
|
+
* When outside DatePicker: fully controlled by props.
|
|
15
|
+
*/
|
|
16
|
+
export declare const DatePickerInput: import("react").ForwardRefExoticComponent<Omit<DatePickerInputProps, "ref"> & import("react").RefAttributes<HTMLInputElement>>;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { MiniCalendarIcon } from '@codecademy/gamut-icons';
|
|
2
|
+
import { forwardRef, useEffect, useId, useRef, useState } from 'react';
|
|
3
|
+
import { FormGroup } from '../Form/elements/FormGroup';
|
|
4
|
+
import { Input } from '../Form/inputs/Input';
|
|
5
|
+
import { formatDateForInput, getDateFormatPattern, parseDateFromInput } from './Calendar/utils/format';
|
|
6
|
+
import { useDatePicker } from './DatePickerContext';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Props for DatePickerInput. When used inside DatePicker, only overrides (e.g. placeholder, label).
|
|
10
|
+
* In range mode, use rangePart to bind to start or end date. When outside DatePicker, pass value, onChange, etc.
|
|
11
|
+
*/
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
/**
|
|
14
|
+
* Date input. When inside DatePicker: owns local input value state and syncs to
|
|
15
|
+
* shared selectedDate via context on blur/parse; opens calendar on click/arrow down.
|
|
16
|
+
* When outside DatePicker: fully controlled by props.
|
|
17
|
+
*/
|
|
18
|
+
export const DatePickerInput = /*#__PURE__*/forwardRef(({
|
|
19
|
+
placeholder,
|
|
20
|
+
label,
|
|
21
|
+
rangePart,
|
|
22
|
+
...rest
|
|
23
|
+
}, ref) => {
|
|
24
|
+
const context = useDatePicker();
|
|
25
|
+
// do we want to do this or just throw an error?
|
|
26
|
+
// if (context == null) {
|
|
27
|
+
// return (
|
|
28
|
+
// <Input
|
|
29
|
+
// {...rest}
|
|
30
|
+
// icon={CalendarIcon}
|
|
31
|
+
// placeholder={placeholder ?? 'MM/DD/YYYY'}
|
|
32
|
+
// ref={ref}
|
|
33
|
+
// type="text"
|
|
34
|
+
// />
|
|
35
|
+
// );
|
|
36
|
+
// }
|
|
37
|
+
if (context == null) {
|
|
38
|
+
throw new Error('DatePickerInput must be used inside a DatePicker (it reads shared state from context).');
|
|
39
|
+
}
|
|
40
|
+
const {
|
|
41
|
+
mode,
|
|
42
|
+
startOrSelectedDate,
|
|
43
|
+
setSelection,
|
|
44
|
+
openCalendar,
|
|
45
|
+
locale,
|
|
46
|
+
isCalendarOpen,
|
|
47
|
+
calendarDialogId
|
|
48
|
+
} = context;
|
|
49
|
+
const isRange = mode === 'range';
|
|
50
|
+
const inputID = useId();
|
|
51
|
+
const inputId = `datepicker-input-${inputID.replace(/:/g, '')}`;
|
|
52
|
+
|
|
53
|
+
// Range with two inputs: each input binds to one part. Single or range combined: one value.
|
|
54
|
+
const boundDate = isRange && rangePart === 'end' ? context.endDate : startOrSelectedDate;
|
|
55
|
+
const formattedValue = boundDate != null ? formatDateForInput(boundDate, locale) : '';
|
|
56
|
+
const [inputValue, setInputValue] = useState(() => formattedValue);
|
|
57
|
+
const isInputFocusedRef = useRef(false);
|
|
58
|
+
|
|
59
|
+
// Sync input from shared state. Skip when focused so we don't overwrite while typing.
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!isInputFocusedRef.current) {
|
|
62
|
+
setInputValue(formattedValue);
|
|
63
|
+
}
|
|
64
|
+
}, [formattedValue]);
|
|
65
|
+
|
|
66
|
+
/** Apply raw input string to selection state. Returns formatted string if parsed so caller can sync input (e.g. on blur). */
|
|
67
|
+
const applyValueToSelection = raw => {
|
|
68
|
+
const trimmed = raw.trim();
|
|
69
|
+
if (!trimmed) {
|
|
70
|
+
if (isRange && rangePart) {
|
|
71
|
+
if (rangePart === 'start') setSelection(null, context.endDate);else setSelection(startOrSelectedDate, null);
|
|
72
|
+
} else setSelection(null);
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
const parsed = parseDateFromInput(trimmed, locale);
|
|
76
|
+
if (!parsed) return undefined;
|
|
77
|
+
if (isRange && rangePart) {
|
|
78
|
+
if (rangePart === 'start') setSelection(parsed, context.endDate);else setSelection(startOrSelectedDate, parsed);
|
|
79
|
+
} else setSelection(parsed);
|
|
80
|
+
return formatDateForInput(parsed, locale);
|
|
81
|
+
};
|
|
82
|
+
const handleChange = e => {
|
|
83
|
+
const raw = e.target.value;
|
|
84
|
+
setInputValue(raw);
|
|
85
|
+
applyValueToSelection(raw);
|
|
86
|
+
};
|
|
87
|
+
const handleBlur = () => {
|
|
88
|
+
isInputFocusedRef.current = false;
|
|
89
|
+
const formatted = applyValueToSelection(inputValue.trim());
|
|
90
|
+
if (formatted) setInputValue(formatted);else if (inputValue.trim()) setInputValue(formattedValue);
|
|
91
|
+
};
|
|
92
|
+
const handleKeyDown = e => {
|
|
93
|
+
if (e.key === 'ArrowDown' || e.key === 'Down') {
|
|
94
|
+
e.preventDefault();
|
|
95
|
+
openCalendar();
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const handleOpenCalendar = () => {
|
|
99
|
+
openCalendar();
|
|
100
|
+
};
|
|
101
|
+
const defaultLabel = isRange && rangePart === 'end' ? 'End date' : isRange ? 'Start date' : 'Date';
|
|
102
|
+
return /*#__PURE__*/_jsx(FormGroup, {
|
|
103
|
+
htmlFor: inputId,
|
|
104
|
+
isSoloField: true // should probaly be based on a prop
|
|
105
|
+
,
|
|
106
|
+
label: label ?? defaultLabel,
|
|
107
|
+
pb: 0,
|
|
108
|
+
spacing: "tight",
|
|
109
|
+
width: "170px",
|
|
110
|
+
children: /*#__PURE__*/_jsx(Input, {
|
|
111
|
+
...rest,
|
|
112
|
+
"aria-autocomplete": "none",
|
|
113
|
+
"aria-controls": calendarDialogId,
|
|
114
|
+
"aria-expanded": isCalendarOpen,
|
|
115
|
+
"aria-haspopup": "dialog",
|
|
116
|
+
icon: () => /*#__PURE__*/_jsx(MiniCalendarIcon, {
|
|
117
|
+
size: 16
|
|
118
|
+
}),
|
|
119
|
+
id: inputId,
|
|
120
|
+
placeholder: placeholder ?? getDateFormatPattern(locale),
|
|
121
|
+
ref: ref,
|
|
122
|
+
role: "combobox",
|
|
123
|
+
type: "text",
|
|
124
|
+
value: inputValue,
|
|
125
|
+
onBlur: handleBlur,
|
|
126
|
+
onChange: handleChange,
|
|
127
|
+
onClick: handleOpenCalendar,
|
|
128
|
+
onFocus: () => {
|
|
129
|
+
isInputFocusedRef.current = true;
|
|
130
|
+
if (isRange && rangePart) context.setActiveRangePart(rangePart);
|
|
131
|
+
},
|
|
132
|
+
onKeyDown: handleKeyDown
|
|
133
|
+
})
|
|
134
|
+
});
|
|
135
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DatePicker – Single-date and range picker with input + calendar popover.
|
|
3
|
+
*/
|
|
4
|
+
export type { DatePickerContextValue, DatePickerProps, DatePickerRangeProps, DatePickerSingleProps, } from './types';
|
|
5
|
+
export { DatePicker } from './DatePicker';
|
|
6
|
+
export { DatePickerContext, DatePickerProvider, useDatePicker, } from './DatePickerContext';
|
|
7
|
+
export { DatePickerCalendar } from './DatePickerCalendar';
|
|
8
|
+
export type { DatePickerCalendarProps } from './DatePickerCalendar';
|
|
9
|
+
export { DatePickerInput } from './DatePickerInput';
|
|
10
|
+
export type { DatePickerInputProps } from './DatePickerInput';
|
|
11
|
+
export { Calendar, CalendarHeader, CalendarBody, CalendarFooter, } from './Calendar';
|
|
12
|
+
export type { CalendarHeaderProps, CalendarBodyProps, CalendarFooterProps, QuickAction, } from './Calendar/types';
|
|
13
|
+
export * from './Calendar/utils';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DatePicker – Single-date and range picker with input + calendar popover.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export { DatePicker } from './DatePicker';
|
|
6
|
+
export { DatePickerContext, DatePickerProvider, useDatePicker } from './DatePickerContext';
|
|
7
|
+
export { DatePickerCalendar } from './DatePickerCalendar';
|
|
8
|
+
export { DatePickerInput } from './DatePickerInput';
|
|
9
|
+
export { Calendar, CalendarHeader, CalendarBody, CalendarFooter } from './Calendar';
|
|
10
|
+
export * from './Calendar/utils';
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public and internal types for the DatePicker (single-date and range).
|
|
3
|
+
*/
|
|
4
|
+
/// <reference types="react" />
|
|
5
|
+
/** Result of custom validation; null means valid. */
|
|
6
|
+
export interface DatePickerValidationResult {
|
|
7
|
+
errorMessage: string;
|
|
8
|
+
errorType: string;
|
|
9
|
+
}
|
|
10
|
+
/** Shared props for all DatePicker modes. */
|
|
11
|
+
export interface DatePickerBaseProps {
|
|
12
|
+
/** Locale for formatting (e.g. 'en-US'). */
|
|
13
|
+
locale?: string;
|
|
14
|
+
/** Dates that are disabled (unselectable) in the calendar. */
|
|
15
|
+
disabledDates?: Date[];
|
|
16
|
+
/** When provided, only the provider is rendered and children compose Input + Calendar. */
|
|
17
|
+
children?: React.ReactNode;
|
|
18
|
+
/** Placeholder for the input. */
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
/** Override UI strings (e.g. clear button). Merged with defaults. */
|
|
21
|
+
translations?: DatePickerTranslations;
|
|
22
|
+
}
|
|
23
|
+
/** Props for the DatePicker (single-date mode). */
|
|
24
|
+
export interface DatePickerSingleProps extends DatePickerBaseProps {
|
|
25
|
+
mode?: 'single';
|
|
26
|
+
/** Controlled selected date. */
|
|
27
|
+
selectedDate: Date | null;
|
|
28
|
+
/** Called when the user selects a date. */
|
|
29
|
+
setSelectedDate: (date: Date | null) => void;
|
|
30
|
+
/** Label for the input. */
|
|
31
|
+
label?: string;
|
|
32
|
+
}
|
|
33
|
+
/** Props for the DatePicker (range mode). */
|
|
34
|
+
export interface DatePickerRangeProps extends DatePickerBaseProps {
|
|
35
|
+
mode: 'range';
|
|
36
|
+
/** Controlled start date. */
|
|
37
|
+
startDate: Date | null;
|
|
38
|
+
/** Controlled end date. */
|
|
39
|
+
endDate: Date | null;
|
|
40
|
+
/** Called when the user changes the start date. */
|
|
41
|
+
setStartDate: (date: Date | null) => void;
|
|
42
|
+
/** Called when the user changes the end date. */
|
|
43
|
+
setEndDate: (date: Date | null) => void;
|
|
44
|
+
/** Label for the start date input. */
|
|
45
|
+
startLabel?: string;
|
|
46
|
+
/** Label for the end date input. */
|
|
47
|
+
endLabel?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Props for the DatePicker provider / standalone component. */
|
|
50
|
+
export type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;
|
|
51
|
+
/** Which range input is active (focused); null = calendar drives both (selection mode). */
|
|
52
|
+
export type ActiveRangePart = 'start' | 'end' | null;
|
|
53
|
+
/** Optional translations for DatePicker UI strings. Pass to override defaults. */
|
|
54
|
+
export interface DatePickerTranslations {
|
|
55
|
+
/** Label for the clear date button (default: "Clear"). */
|
|
56
|
+
clear?: string;
|
|
57
|
+
}
|
|
58
|
+
/** Shared state provided by DatePicker via context. */
|
|
59
|
+
export interface DatePickerBaseContextValue {
|
|
60
|
+
isCalendarOpen: boolean;
|
|
61
|
+
openCalendar: () => void;
|
|
62
|
+
closeCalendar: () => void;
|
|
63
|
+
locale?: string;
|
|
64
|
+
disabledDates: Date[];
|
|
65
|
+
calendarDialogId: string;
|
|
66
|
+
/** UI string overrides (e.g. clear button). */
|
|
67
|
+
translations: Required<DatePickerTranslations>;
|
|
68
|
+
/** Start date (range) or selected date (single). */
|
|
69
|
+
startOrSelectedDate: Date | null;
|
|
70
|
+
/** Set selection. Single: (date). Range: (start, end). */
|
|
71
|
+
setSelection: (startOrSelectedDate: Date | null, endDate?: Date | null) => void;
|
|
72
|
+
}
|
|
73
|
+
export interface DatePickerSingleContextValue extends DatePickerBaseContextValue {
|
|
74
|
+
mode: 'single';
|
|
75
|
+
}
|
|
76
|
+
export interface DatePickerRangeContextValue extends DatePickerBaseContextValue {
|
|
77
|
+
mode: 'range';
|
|
78
|
+
/** Range only: end date. */
|
|
79
|
+
endDate: Date | null;
|
|
80
|
+
/** Range only: which input is active (start/end focused); null = selection mode. */
|
|
81
|
+
activeRangePart: ActiveRangePart;
|
|
82
|
+
/** Range only: set which input is active (e.g. when input receives focus). */
|
|
83
|
+
setActiveRangePart: (part: ActiveRangePart) => void;
|
|
84
|
+
}
|
|
85
|
+
export type DatePickerContextValue = DatePickerSingleContextValue | DatePickerRangeContextValue;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ActiveRangePart } from './types';
|
|
2
|
+
export declare const handleDateSelectSingle: (date: Date, selectedDate: Date | null, setSelection: (date: Date | null) => void) => void;
|
|
3
|
+
export declare const handleDateSelectRange: (date: Date, activeRangePart: ActiveRangePart, startDate: Date | null, endDate: Date | null, setSelection: (startDate: Date | null, endDate?: Date | null) => void) => void;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export const handleDateSelectSingle = (date, selectedDate, setSelection) => {
|
|
2
|
+
// If clicked date is the same as Start Date: Clear Start Date
|
|
3
|
+
if (selectedDate && date.getTime() === selectedDate.getTime()) {
|
|
4
|
+
setSelection(null);
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
// If clicked date is not the same as Start Date: Set Start Date to clicked date
|
|
8
|
+
setSelection(date);
|
|
9
|
+
};
|
|
10
|
+
export const handleDateSelectRange = (date, activeRangePart, startDate, endDate, setSelection) => {
|
|
11
|
+
// Range mode: field targeting (start or end input was focused)
|
|
12
|
+
if (activeRangePart === 'start') {
|
|
13
|
+
if (date.getTime() === startDate?.getTime()) {
|
|
14
|
+
setSelection(null, endDate);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const newEnd = endDate != null && date.getTime() <= endDate.getTime() ? endDate : null;
|
|
18
|
+
setSelection(date, newEnd);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (activeRangePart === 'end') {
|
|
22
|
+
if (date.getTime() === endDate?.getTime()) {
|
|
23
|
+
setSelection(startDate, null);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const newStart = startDate != null && date.getTime() >= startDate.getTime() ? startDate : null;
|
|
27
|
+
setSelection(newStart, date);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Range selection mode (no field focused: calendar drives both)
|
|
32
|
+
if (startDate && endDate) {
|
|
33
|
+
// if start date is end date and is clicked, clears everything
|
|
34
|
+
if (startDate.getTime() === endDate.getTime() && date.getTime() === startDate.getTime()) {
|
|
35
|
+
setSelection(null, null);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// if clicked on start date, end date becomes start date
|
|
39
|
+
if (date.getTime() === startDate.getTime()) {
|
|
40
|
+
setSelection(endDate, null);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// if clicked on end date, clears end date and start remains
|
|
44
|
+
if (date.getTime() === endDate.getTime()) {
|
|
45
|
+
setSelection(startDate, null);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// If clicked date > Start: Updates End Date to new date (Start remains)
|
|
49
|
+
if (date.getTime() > startDate.getTime()) {
|
|
50
|
+
setSelection(startDate, date);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// If clicked date < Start: Updates Start Date to new date (End remains) - extends range to the left
|
|
54
|
+
|
|
55
|
+
setSelection(date, endDate);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Start is Set, End is Empty
|
|
59
|
+
if (startDate && !endDate) {
|
|
60
|
+
// If clicked date < Start: Restarts selection with clicked date as new Start
|
|
61
|
+
if (date.getTime() < startDate.getTime()) {
|
|
62
|
+
setSelection(date, null);
|
|
63
|
+
}
|
|
64
|
+
// If clicked date > Start: Sets it as End Date
|
|
65
|
+
else {
|
|
66
|
+
setSelection(startDate, date);
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
setSelection(date, null);
|
|
71
|
+
};
|
|
@@ -23,8 +23,8 @@ export interface FocusTrapProps extends WithChildrenProp {
|
|
|
23
23
|
*/
|
|
24
24
|
allowPageInteraction?: boolean;
|
|
25
25
|
/**
|
|
26
|
-
* Passthrough for react-focus-on library props
|
|
26
|
+
* Passthrough for react-focus-on library props (partial; only override what you need).
|
|
27
27
|
*/
|
|
28
|
-
focusOnProps?: ReactFocusOnProps
|
|
28
|
+
focusOnProps?: Partial<ReactFocusOnProps>;
|
|
29
29
|
}
|
|
30
30
|
export declare const FocusTrap: React.FC<FocusTrapProps>;
|
package/dist/List/elements.d.ts
CHANGED
|
@@ -388,7 +388,7 @@ export declare const HeaderRowEl: import("@emotion/styled").StyledComponent<{
|
|
|
388
388
|
theme?: import("@emotion/react").Theme | undefined;
|
|
389
389
|
as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
|
|
390
390
|
} & HeaderProps, Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, "slot" | "style" | "title" | "dir" | "children" | "className" | "aria-hidden" | "onAnimationStart" | "onDragStart" | "onDragEnd" | "onDrag" | keyof import("react").ClassAttributes<HTMLDivElement> | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "contentEditable" | "contextMenu" | "draggable" | "enterKeyHint" | "hidden" | "id" | "lang" | "nonce" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "content" | "datatype" | "inlist" | "prefix" | "property" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "exportparts" | "part" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDragCapture" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture">, {}>;
|
|
391
|
-
declare const columnType: (props: import("@codecademy/variance/dist/types/config").VariantProps<"type", false | "header" | "select" | "content" | "
|
|
391
|
+
declare const columnType: (props: import("@codecademy/variance/dist/types/config").VariantProps<"type", false | "header" | "select" | "content" | "control" | "orderedHeader" | "tableControl" | "expand" | "expandControl"> & {
|
|
392
392
|
theme?: import("@emotion/react").Theme | undefined;
|
|
393
393
|
}) => import("@codecademy/variance").CSSObject;
|
|
394
394
|
declare const columnJustify: (props: import("@codecademy/variance/dist/types/config").VariantProps<"justify", false | "left" | "right"> & {
|
|
@@ -16,7 +16,7 @@ const PopoverContent = /*#__PURE__*/_styled("div", {
|
|
|
16
16
|
transform: {
|
|
17
17
|
property: 'transform'
|
|
18
18
|
}
|
|
19
|
-
})), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Qb3BvdmVyQ29udGFpbmVyL1BvcG92ZXJDb250YWluZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCdUIiLCJmaWxlIjoiLi4vLi4vc3JjL1BvcG92ZXJDb250YWluZXIvUG9wb3ZlckNvbnRhaW5lci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzeXN0ZW0gfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHsgdmFyaWFuY2UgfSBmcm9tICdAY29kZWNhZGVteS92YXJpYW5jZSc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlV2luZG93U2Nyb2xsLCB1c2VXaW5kb3dTaXplIH0gZnJvbSAncmVhY3QtdXNlJztcblxuaW1wb3J0IHsgQm9keVBvcnRhbCB9IGZyb20gJy4uL0JvZHlQb3J0YWwnO1xuaW1wb3J0IHsgRm9jdXNUcmFwIH0gZnJvbSAnLi4vRm9jdXNUcmFwJztcbmltcG9ydCB7XG4gIHVzZVJlc2l6aW5nUGFyZW50RWZmZWN0LFxuICB1c2VTY3JvbGxpbmdQYXJlbnRzLFxuICB1c2VTY3JvbGxpbmdQYXJlbnRzRWZmZWN0LFxufSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB7IENvbnRhaW5lclN0YXRlLCBQb3BvdmVyQ29udGFpbmVyUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldENvbnRhaW5lcnMsIGdldFBvc2l0aW9uLCBpc091dE9mVmlldyB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBQb3BvdmVyQ29udGVudCA9IHN0eWxlZC5kaXYoXG4gIHZhcmlhbmNlLmNvbXBvc2UoXG4gICAgc3lzdGVtLnBvc2l0aW9uaW5nLFxuICAgIHZhcmlhbmNlLmNyZWF0ZSh7XG4gICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgcHJvcGVydHk6ICd0cmFuc2Zvcm0nLFxuICAgICAgfSxcbiAgICB9KVxuICApXG4pO1xuXG5leHBvcnQgY29uc3QgUG9wb3ZlckNvbnRhaW5lcjogUmVhY3QuRkM8UG9wb3ZlckNvbnRhaW5lclByb3BzPiA9ICh7XG4gIGFsaWdubWVudCA9ICdib3R0b20tbGVmdCcsXG4gIG9mZnNldCA9IDIwLFxuICB5ID0gMCxcbiAgeCA9IDAsXG4gIGludmVydEF4aXMsXG4gIGlubGluZSA9IGZhbHNlLFxuICBpc09wZW4sXG4gIG9uUmVxdWVzdENsb3NlLFxuICB0YXJnZXRSZWYsXG4gIGFsbG93UGFnZUludGVyYWN0aW9uLFxuICBjbG9zZU9uVmlld3BvcnRFeGl0ID0gZmFsc2UsXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgY29uc3QgcG9wb3ZlclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGhhc1JlcXVlc3RlZENsb3NlUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3Qgb25SZXF1ZXN0Q2xvc2VSZWYgPSB1c2VSZWYob25SZXF1ZXN0Q2xvc2UpO1xuICBjb25zdCB7IHdpZHRoOiB3aW5XLCBoZWlnaHQ6IHdpbkggfSA9IHVzZVdpbmRvd1NpemUoKTtcbiAgY29uc3QgeyB4OiB3aW5YLCB5OiB3aW5ZIH0gPSB1c2VXaW5kb3dTY3JvbGwoKTtcbiAgY29uc3QgW2NvbnRhaW5lcnMsIHNldENvbnRhaW5lcnNdID0gdXNlU3RhdGU8Q29udGFpbmVyU3RhdGU+KCk7XG4gIGNvbnN0IFt0YXJnZXRSZWN0LCBzZXRUYXJnZXRSZWN0XSA9IHVzZVN0YXRlPERPTVJlY3Q+KCk7XG4gIGNvbnN0IHBhcmVudCA9IGNvbnRhaW5lcnM/LnBhcmVudDtcblxuICAvLyBNZW1vaXplIHNjcm9sbGluZyBwYXJlbnRzIHRvIGF2b2lkIGV4cGVuc2l2ZSBET00gdHJhdmVyc2Fsc1xuICBjb25zdCBzY3JvbGxpbmdQYXJlbnRzID0gdXNlU2Nyb2xsaW5nUGFyZW50cyhcbiAgICB0YXJnZXRSZWYgYXMgUmVhY3QuUmVmT2JqZWN0PEhUTUxFbGVtZW50IHwgbnVsbD5cbiAgKTtcblxuICAvLyBLZWVwIG9uUmVxdWVzdENsb3NlIHJlZiB1cCB0byBkYXRlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25SZXF1ZXN0Q2xvc2VSZWYuY3VycmVudCA9IG9uUmVxdWVzdENsb3NlO1xuICB9LCBbb25SZXF1ZXN0Q2xvc2VdKTtcblxuICAvLyBEZXRlY3QgUlRMIGRpcmVjdGlvbiBmcm9tIHRoZSB0YXJnZXQgZWxlbWVudCBhbmQgd2F0Y2ggZm9yIGF0dHJpYnV0ZSBjaGFuZ2VzIHNvIHRoZVxuICAvLyBwb3NpdGlvbiByZWNhbGN1bGF0ZXMgd2hlbiBjaGFuZ2VzIG9jY3VyXG4gIGNvbnN0IFtpc1J0bCwgc2V0SXNSdGxdID0gdXNlU3RhdGUoZmFsc2UpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNoZWNrRGlyZWN0aW9uID0gKCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0UmVmPy5jdXJyZW50O1xuICAgICAgY29uc3QgZWwgPSB0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ID8gdGFyZ2V0IDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgc2V0SXNSdGwoZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZGlyZWN0aW9uID09PSAncnRsJyk7XG4gICAgfTtcblxuICAgIGNoZWNrRGlyZWN0aW9uKCk7XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNoZWNrRGlyZWN0aW9uKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydkaXInXSxcbiAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW3RhcmdldFJlZl0pO1xuXG4gIGNvbnN0IHBvcG92ZXJQb3NpdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGdldFBvc2l0aW9uKHtcbiAgICAgICAgYWxpZ25tZW50LFxuICAgICAgICBjb250YWluZXI6IHBhcmVudCxcbiAgICAgICAgaW52ZXJ0QXhpcyxcbiAgICAgICAgaXNSdGwsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBzdHlsZXM6IHt9LCBwaHlzaWNhbFN0eWxlczogdW5kZWZpbmVkIH07XG4gIH0sIFtwYXJlbnQsIHgsIHksIG9mZnNldCwgYWxpZ25tZW50LCBpbnZlcnRBeGlzLCBpc1J0bF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0UmVmPy5jdXJyZW50O1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgc2V0Q29udGFpbmVycyhnZXRDb250YWluZXJzKHRhcmdldCwgaW5saW5lLCB7IHg6IHdpblgsIHk6IHdpblkgfSkpO1xuICB9LCBbdGFyZ2V0UmVmLCBpbmxpbmUsIHdpblcsIHdpbkgsIHdpblgsIHdpblksIHRhcmdldFJlY3RdKTtcblxuICAvLyBVcGRhdGUgdGFyZ2V0IHJlY3RhbmdsZSB3aGVuIHdpbmRvdyBzaXplL3Njcm9sbCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0VGFyZ2V0UmVjdCh0YXJnZXRSZWY/LmN1cnJlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgfSwgW3RhcmdldFJlZiwgaXNPcGVuLCB3aW5XLCB3aW5ILCB3aW5YLCB3aW5ZXSk7XG5cbiAgLy8gVXBkYXRlIHRhcmdldCByZWN0YW5nbGUgd2hlbiBwYXJlbnQgc2l6ZS9zY3JvbGwgY2hhbmdlc1xuICBjb25zdCB1cGRhdGVUYXJnZXRQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChyZWN0PzogRE9NUmVjdCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0UmVmPy5jdXJyZW50O1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgICAgY29uc3QgbmV3UmVjdCA9IHJlY3QgfHwgdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgc2V0VGFyZ2V0UmVjdChuZXdSZWN0KTtcblxuICAgICAgY29uc3QgY3VycmVudFNjcm9sbFggPVxuICAgICAgICB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICBjb25zdCBjdXJyZW50U2Nyb2xsWSA9XG4gICAgICAgIHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuXG4gICAgICBzZXRDb250YWluZXJzKFxuICAgICAgICBnZXRDb250YWluZXJzKHRhcmdldCwgaW5saW5lLCB7IHg6IGN1cnJlbnRTY3JvbGxYLCB5OiBjdXJyZW50U2Nyb2xsWSB9KVxuICAgICAgKTtcbiAgICB9LFxuICAgIFt0YXJnZXRSZWYsIGlubGluZV1cbiAgKTtcblxuICB1c2VTY3JvbGxpbmdQYXJlbnRzRWZmZWN0KHRhcmdldFJlZiwgdXBkYXRlVGFyZ2V0UG9zaXRpb24pO1xuXG4gIHVzZVJlc2l6aW5nUGFyZW50RWZmZWN0KHRhcmdldFJlZiwgc2V0VGFyZ2V0UmVjdCk7XG5cbiAgLy8gSGFuZGxlIGNsb3NlT25WaWV3cG9ydEV4aXQgd2l0aCBjYWNoZWQgc2Nyb2xsaW5nIHBhcmVudHMgZm9yIHBlcmZvcm1hbmNlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjbG9zZU9uVmlld3BvcnRFeGl0KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0UmVjdCB8fCBjb250YWluZXJzPy52aWV3cG9ydDtcbiAgICBpZiAoIXJlY3QpIHJldHVybjtcblxuICAgIGNvbnN0IGlzT3V0ID0gaXNPdXRPZlZpZXcoXG4gICAgICByZWN0LFxuICAgICAgdGFyZ2V0UmVmPy5jdXJyZW50IGFzIEhUTUxFbGVtZW50LFxuICAgICAgc2Nyb2xsaW5nUGFyZW50c1xuICAgICk7XG5cbiAgICBpZiAoaXNPdXQgJiYgIWhhc1JlcXVlc3RlZENsb3NlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGhhc1JlcXVlc3RlZENsb3NlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgb25SZXF1ZXN0Q2xvc2VSZWYuY3VycmVudD8uKCk7XG4gICAgfSBlbHNlIGlmICghaXNPdXQpIHtcbiAgICAgIGhhc1JlcXVlc3RlZENsb3NlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG4gIH0sIFtcbiAgICB0YXJnZXRSZWN0LFxuICAgIGNvbnRhaW5lcnM/LnZpZXdwb3J0LFxuICAgIHRhcmdldFJlZixcbiAgICBjbG9zZU9uVmlld3BvcnRFeGl0LFxuICAgIHNjcm9sbGluZ1BhcmVudHMsXG4gIF0pO1xuICAvKipcbiAgICogQWxsb3dzIHRhcmdldFJlZiB0byBiZSBvciBjb250YWluIGEgYnV0dG9uIHRoYXQgdG9nZ2xlcyB0aGUgcG9wb3ZlciBvcGVuIGFuZCBjbG9zZWQuXG4gICAqIFdpdGhvdXQgdGhpcyBjaGVjayBpdCB3b3VsZCB0b2dnbGUgY2xvc2VkIHRoZW4gYmFjayBvcGVuIGltbWVkaWF0ZWx5LlxuICAgKlxuICAgKi9cbiAgY29uc3QgaGFuZGxlQ2xpY2tPdXRzaWRlID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBOb2RlO1xuICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRhcmdldFJlZi5jdXJyZW50O1xuXG4gICAgICBpZiAoIXRhcmdldEVsZW1lbnQpIHJldHVybjtcbiAgICAgIGlmICh0YXJnZXRFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcbiAgICAgIGlmIChwb3BvdmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcblxuICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIGl0J3MgYSBnZW51aW5lIG91dHNpZGUgY2xpY2tcbiAgICAgIG9uUmVxdWVzdENsb3NlPy4oKTtcbiAgICB9LFxuICAgIFtvblJlcXVlc3RDbG9zZSwgdGFyZ2V0UmVmXVxuICApO1xuXG4gIC8qKlxuICAgKiBCYWNrdXAgY2xpY2sgb3V0c2lkZSBoYW5kbGVyIGZvciBjYXNlcyB3aGVyZSBGb2N1c1RyYXAgZGV0ZWN0aW9uIG1pZ2h0IGJlIGludGVyZmVyZWQgd2l0aFxuICAgKiBieSBvdXIgb3duIGZsb2F0aW5nIGVsZW1lbnRzXG4gICAqL1xuICBjb25zdCBoYW5kbGVHbG9iYWxDbGlja091dHNpZGUgPSB1c2VDYWxsYmFjayhcbiAgICAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgTm9kZTtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0YXJnZXRSZWYuY3VycmVudDtcblxuICAgICAgaWYgKCF0YXJnZXRFbGVtZW50IHx8ICFpc09wZW4pIHJldHVybjtcblxuICAgICAgaWYgKFxuICAgICAgICB0YXJnZXRFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgfHxcbiAgICAgICAgcG9wb3ZlclJlZi5jdXJyZW50Py5jb250YWlucyh0YXJnZXQpXG4gICAgICApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrZWQgZWxlbWVudCBpcyB3aXRoaW4gYW4gT3ZlcmxheSBjb21wb25lbnRcbiAgICAgIGNvbnN0IGNsaWNrZWRFbGVtZW50ID0gdGFyZ2V0IGFzIEVsZW1lbnQ7XG4gICAgICBpZiAoY2xpY2tlZEVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtZmxvYXRpbmc9XCJvdmVybGF5XCJdJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2tlZCBlbGVtZW50IGlzIHdpdGhpbiBhbm90aGVyIFBvcG92ZXIgb3IgUG9wb3ZlckNvbnRhaW5lclxuICAgICAgY29uc3QgaXNGbG9hdGluZ0VsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5jbG9zZXN0KFxuICAgICAgICAnW2RhdGEtZmxvYXRpbmc9XCJwb3BvdmVyXCJdJ1xuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgaXNGbG9hdGluZ0VsZW1lbnQgJiZcbiAgICAgICAgIXBvcG92ZXJSZWYuY3VycmVudD8uY29udGFpbnMoaXNGbG9hdGluZ0VsZW1lbnQpXG4gICAgICApIHtcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2U/LigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG9uUmVxdWVzdENsb3NlPy4oKTtcbiAgICB9LFxuICAgIFtvblJlcXVlc3RDbG9zZSwgdGFyZ2V0UmVmLCBpc09wZW5dXG4gICk7XG5cbiAgLy8gQmFja3VwIGdsb2JhbCBjbGljayBsaXN0ZW5lciBmb3Igd2hlbiBhIFBvcG92ZXIgb3IgUG9wb3ZlckNvbnRhaW5lciBpcyBvcGVuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzT3Blbikge1xuICAgICAgLy8gVXNlIGEgc21hbGwgZGVsYXkgdG8gZW5zdXJlIHRoaXMgZG9lc24ndCBpbnRlcmZlcmUgd2l0aCB0aGUgRm9jdXNUcmFwJ3Mgb3duIGRldGVjdGlvblxuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUdsb2JhbENsaWNrT3V0c2lkZSwgdHJ1ZSk7XG4gICAgICB9LCA1MCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICdtb3VzZWRvd24nLFxuICAgICAgICAgIGhhbmRsZUdsb2JhbENsaWNrT3V0c2lkZSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2lzT3BlbiwgaGFuZGxlR2xvYmFsQ2xpY2tPdXRzaWRlXSk7XG5cbiAgaWYgKCFpc09wZW4gfHwgIXRhcmdldFJlZikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY29udGVudCA9IChcbiAgICA8Rm9jdXNUcmFwXG4gICAgICBhbGxvd1BhZ2VJbnRlcmFjdGlvbj17aW5saW5lIHx8IGFsbG93UGFnZUludGVyYWN0aW9ufVxuICAgICAgb25DbGlja091dHNpZGU9e2hhbmRsZUNsaWNrT3V0c2lkZX1cbiAgICAgIG9uRXNjYXBlS2V5PXtvblJlcXVlc3RDbG9zZX1cbiAgICA+XG4gICAgICA8UG9wb3ZlckNvbnRlbnRcbiAgICAgICAgZGF0YS1mbG9hdGluZz1cInBvcG92ZXJcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInBvcG92ZXItY29udGVudC1jb250YWluZXJcIlxuICAgICAgICBwb3NpdGlvbj1cImFic29sdXRlXCJcbiAgICAgICAgcmVmPXtwb3BvdmVyUmVmfVxuICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgIHpJbmRleD17aW5saW5lID8gNSA6ICdpbml0aWFsJ31cbiAgICAgICAgey4uLnBvcG92ZXJQb3NpdGlvbi5zdHlsZXN9XG4gICAgICAgIC8qIFBoeXNpY2FsIGlubGluZSBzdHlsZSBmb3IgY2VudGVyZWQgYWxpZ25tZW50cyAodG9wL2JvdHRvbSkgd2hlcmVcbiAgICAgICAgICAgaW5zZXQtaW5saW5lLXN0YXJ0IHdvdWxkIGluY29ycmVjdGx5IGZsaXAgdGhlIGNlbnRlciBwb2ludCBpbiBSVEwgKi9cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdhbXV0L25vLWlubGluZS1zdHlsZSAqL1xuICAgICAgICBzdHlsZT17cG9wb3ZlclBvc2l0aW9uLnBoeXNpY2FsU3R5bGVzfVxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgIC8+XG4gICAgPC9Gb2N1c1RyYXA+XG4gICk7XG5cbiAgaWYgKGlubGluZSkgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgcmV0dXJuIDxCb2R5UG9ydGFsPntjb250ZW50fTwvQm9keVBvcnRhbD47XG59O1xuIl19 */");
|
|
19
|
+
})), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Qb3BvdmVyQ29udGFpbmVyL1BvcG92ZXJDb250YWluZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCdUIiLCJmaWxlIjoiLi4vLi4vc3JjL1BvcG92ZXJDb250YWluZXIvUG9wb3ZlckNvbnRhaW5lci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzeXN0ZW0gfSBmcm9tICdAY29kZWNhZGVteS9nYW11dC1zdHlsZXMnO1xuaW1wb3J0IHsgdmFyaWFuY2UgfSBmcm9tICdAY29kZWNhZGVteS92YXJpYW5jZSc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlV2luZG93U2Nyb2xsLCB1c2VXaW5kb3dTaXplIH0gZnJvbSAncmVhY3QtdXNlJztcblxuaW1wb3J0IHsgQm9keVBvcnRhbCB9IGZyb20gJy4uL0JvZHlQb3J0YWwnO1xuaW1wb3J0IHsgRm9jdXNUcmFwIH0gZnJvbSAnLi4vRm9jdXNUcmFwJztcbmltcG9ydCB7XG4gIHVzZVJlc2l6aW5nUGFyZW50RWZmZWN0LFxuICB1c2VTY3JvbGxpbmdQYXJlbnRzLFxuICB1c2VTY3JvbGxpbmdQYXJlbnRzRWZmZWN0LFxufSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB7IENvbnRhaW5lclN0YXRlLCBQb3BvdmVyQ29udGFpbmVyUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldENvbnRhaW5lcnMsIGdldFBvc2l0aW9uLCBpc091dE9mVmlldyB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBQb3BvdmVyQ29udGVudCA9IHN0eWxlZC5kaXYoXG4gIHZhcmlhbmNlLmNvbXBvc2UoXG4gICAgc3lzdGVtLnBvc2l0aW9uaW5nLFxuICAgIHZhcmlhbmNlLmNyZWF0ZSh7XG4gICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgcHJvcGVydHk6ICd0cmFuc2Zvcm0nLFxuICAgICAgfSxcbiAgICB9KVxuICApXG4pO1xuXG5leHBvcnQgY29uc3QgUG9wb3ZlckNvbnRhaW5lcjogUmVhY3QuRkM8UG9wb3ZlckNvbnRhaW5lclByb3BzPiA9ICh7XG4gIGFsaWdubWVudCA9ICdib3R0b20tbGVmdCcsXG4gIG9mZnNldCA9IDIwLFxuICB5ID0gMCxcbiAgeCA9IDAsXG4gIGludmVydEF4aXMsXG4gIGlubGluZSA9IGZhbHNlLFxuICBpc09wZW4sXG4gIG9uUmVxdWVzdENsb3NlLFxuICB0YXJnZXRSZWYsXG4gIGFsbG93UGFnZUludGVyYWN0aW9uLFxuICBjbG9zZU9uVmlld3BvcnRFeGl0ID0gZmFsc2UsXG4gIGZvY3VzT25Qcm9wcyxcbiAgLi4ucmVzdFxufSkgPT4ge1xuICBjb25zdCBwb3BvdmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgaGFzUmVxdWVzdGVkQ2xvc2VSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBvblJlcXVlc3RDbG9zZVJlZiA9IHVzZVJlZihvblJlcXVlc3RDbG9zZSk7XG4gIGNvbnN0IHsgd2lkdGg6IHdpblcsIGhlaWdodDogd2luSCB9ID0gdXNlV2luZG93U2l6ZSgpO1xuICBjb25zdCB7IHg6IHdpblgsIHk6IHdpblkgfSA9IHVzZVdpbmRvd1Njcm9sbCgpO1xuICBjb25zdCBbY29udGFpbmVycywgc2V0Q29udGFpbmVyc10gPSB1c2VTdGF0ZTxDb250YWluZXJTdGF0ZT4oKTtcbiAgY29uc3QgW3RhcmdldFJlY3QsIHNldFRhcmdldFJlY3RdID0gdXNlU3RhdGU8RE9NUmVjdD4oKTtcbiAgY29uc3QgcGFyZW50ID0gY29udGFpbmVycz8ucGFyZW50O1xuXG4gIC8vIE1lbW9pemUgc2Nyb2xsaW5nIHBhcmVudHMgdG8gYXZvaWQgZXhwZW5zaXZlIERPTSB0cmF2ZXJzYWxzXG4gIGNvbnN0IHNjcm9sbGluZ1BhcmVudHMgPSB1c2VTY3JvbGxpbmdQYXJlbnRzKFxuICAgIHRhcmdldFJlZiBhcyBSZWFjdC5SZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPlxuICApO1xuXG4gIC8vIEtlZXAgb25SZXF1ZXN0Q2xvc2UgcmVmIHVwIHRvIGRhdGVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvblJlcXVlc3RDbG9zZVJlZi5jdXJyZW50ID0gb25SZXF1ZXN0Q2xvc2U7XG4gIH0sIFtvblJlcXVlc3RDbG9zZV0pO1xuXG4gIC8vIERldGVjdCBSVEwgZGlyZWN0aW9uIGZyb20gdGhlIHRhcmdldCBlbGVtZW50IGFuZCB3YXRjaCBmb3IgYXR0cmlidXRlIGNoYW5nZXMgc28gdGhlXG4gIC8vIHBvc2l0aW9uIHJlY2FsY3VsYXRlcyB3aGVuIGNoYW5nZXMgb2NjdXJcbiAgY29uc3QgW2lzUnRsLCBzZXRJc1J0bF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY2hlY2tEaXJlY3Rpb24gPSAoKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRSZWY/LmN1cnJlbnQ7XG4gICAgICBjb25zdCBlbCA9IHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgPyB0YXJnZXQgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICBzZXRJc1J0bChnZXRDb21wdXRlZFN0eWxlKGVsKS5kaXJlY3Rpb24gPT09ICdydGwnKTtcbiAgICB9O1xuXG4gICAgY2hlY2tEaXJlY3Rpb24oKTtcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2hlY2tEaXJlY3Rpb24pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7XG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgYXR0cmlidXRlRmlsdGVyOiBbJ2RpciddLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9LCBbdGFyZ2V0UmVmXSk7XG5cbiAgY29uc3QgcG9wb3ZlclBvc2l0aW9uID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZ2V0UG9zaXRpb24oe1xuICAgICAgICBhbGlnbm1lbnQsXG4gICAgICAgIGNvbnRhaW5lcjogcGFyZW50LFxuICAgICAgICBpbnZlcnRBeGlzLFxuICAgICAgICBpc1J0bCxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IHN0eWxlczoge30sIHBoeXNpY2FsU3R5bGVzOiB1bmRlZmluZWQgfTtcbiAgfSwgW3BhcmVudCwgeCwgeSwgb2Zmc2V0LCBhbGlnbm1lbnQsIGludmVydEF4aXMsIGlzUnRsXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRSZWY/LmN1cnJlbnQ7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICBzZXRDb250YWluZXJzKGdldENvbnRhaW5lcnModGFyZ2V0LCBpbmxpbmUsIHsgeDogd2luWCwgeTogd2luWSB9KSk7XG4gIH0sIFt0YXJnZXRSZWYsIGlubGluZSwgd2luVywgd2luSCwgd2luWCwgd2luWSwgdGFyZ2V0UmVjdF0pO1xuXG4gIC8vIFVwZGF0ZSB0YXJnZXQgcmVjdGFuZ2xlIHdoZW4gd2luZG93IHNpemUvc2Nyb2xsIGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRUYXJnZXRSZWN0KHRhcmdldFJlZj8uY3VycmVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICB9LCBbdGFyZ2V0UmVmLCBpc09wZW4sIHdpblcsIHdpbkgsIHdpblgsIHdpblldKTtcblxuICAvLyBVcGRhdGUgdGFyZ2V0IHJlY3RhbmdsZSB3aGVuIHBhcmVudCBzaXplL3Njcm9sbCBjaGFuZ2VzXG4gIGNvbnN0IHVwZGF0ZVRhcmdldFBvc2l0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKHJlY3Q/OiBET01SZWN0KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRSZWY/LmN1cnJlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBuZXdSZWN0ID0gcmVjdCB8fCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBzZXRUYXJnZXRSZWN0KG5ld1JlY3QpO1xuXG4gICAgICBjb25zdCBjdXJyZW50U2Nyb2xsWCA9XG4gICAgICAgIHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxZID1cbiAgICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG5cbiAgICAgIHNldENvbnRhaW5lcnMoXG4gICAgICAgIGdldENvbnRhaW5lcnModGFyZ2V0LCBpbmxpbmUsIHsgeDogY3VycmVudFNjcm9sbFgsIHk6IGN1cnJlbnRTY3JvbGxZIH0pXG4gICAgICApO1xuICAgIH0sXG4gICAgW3RhcmdldFJlZiwgaW5saW5lXVxuICApO1xuXG4gIHVzZVNjcm9sbGluZ1BhcmVudHNFZmZlY3QodGFyZ2V0UmVmLCB1cGRhdGVUYXJnZXRQb3NpdGlvbik7XG5cbiAgdXNlUmVzaXppbmdQYXJlbnRFZmZlY3QodGFyZ2V0UmVmLCBzZXRUYXJnZXRSZWN0KTtcblxuICAvLyBIYW5kbGUgY2xvc2VPblZpZXdwb3J0RXhpdCB3aXRoIGNhY2hlZCBzY3JvbGxpbmcgcGFyZW50cyBmb3IgcGVyZm9ybWFuY2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNsb3NlT25WaWV3cG9ydEV4aXQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0YXJnZXRSZWN0IHx8IGNvbnRhaW5lcnM/LnZpZXdwb3J0O1xuICAgIGlmICghcmVjdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXNPdXQgPSBpc091dE9mVmlldyhcbiAgICAgIHJlY3QsXG4gICAgICB0YXJnZXRSZWY/LmN1cnJlbnQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICBzY3JvbGxpbmdQYXJlbnRzXG4gICAgKTtcblxuICAgIGlmIChpc091dCAmJiAhaGFzUmVxdWVzdGVkQ2xvc2VSZWYuY3VycmVudCkge1xuICAgICAgaGFzUmVxdWVzdGVkQ2xvc2VSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICBvblJlcXVlc3RDbG9zZVJlZi5jdXJyZW50Py4oKTtcbiAgICB9IGVsc2UgaWYgKCFpc091dCkge1xuICAgICAgaGFzUmVxdWVzdGVkQ2xvc2VSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgfSwgW1xuICAgIHRhcmdldFJlY3QsXG4gICAgY29udGFpbmVycz8udmlld3BvcnQsXG4gICAgdGFyZ2V0UmVmLFxuICAgIGNsb3NlT25WaWV3cG9ydEV4aXQsXG4gICAgc2Nyb2xsaW5nUGFyZW50cyxcbiAgXSk7XG4gIC8qKlxuICAgKiBBbGxvd3MgdGFyZ2V0UmVmIHRvIGJlIG9yIGNvbnRhaW4gYSBidXR0b24gdGhhdCB0b2dnbGVzIHRoZSBwb3BvdmVyIG9wZW4gYW5kIGNsb3NlZC5cbiAgICogV2l0aG91dCB0aGlzIGNoZWNrIGl0IHdvdWxkIHRvZ2dsZSBjbG9zZWQgdGhlbiBiYWNrIG9wZW4gaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqL1xuICBjb25zdCBoYW5kbGVDbGlja091dHNpZGUgPSB1c2VDYWxsYmFjayhcbiAgICAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIE5vZGU7XG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0UmVmLmN1cnJlbnQ7XG5cbiAgICAgIGlmICghdGFyZ2V0RWxlbWVudCkgcmV0dXJuO1xuICAgICAgaWYgKHRhcmdldEVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuICAgICAgaWYgKHBvcG92ZXJSZWYuY3VycmVudD8uY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgaXQncyBhIGdlbnVpbmUgb3V0c2lkZSBjbGlja1xuICAgICAgb25SZXF1ZXN0Q2xvc2U/LigpO1xuICAgIH0sXG4gICAgW29uUmVxdWVzdENsb3NlLCB0YXJnZXRSZWZdXG4gICk7XG5cbiAgLyoqXG4gICAqIEJhY2t1cCBjbGljayBvdXRzaWRlIGhhbmRsZXIgZm9yIGNhc2VzIHdoZXJlIEZvY3VzVHJhcCBkZXRlY3Rpb24gbWlnaHQgYmUgaW50ZXJmZXJlZCB3aXRoXG4gICAqIGJ5IG91ciBvd24gZmxvYXRpbmcgZWxlbWVudHNcbiAgICovXG4gIGNvbnN0IGhhbmRsZUdsb2JhbENsaWNrT3V0c2lkZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBOb2RlO1xuICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IHRhcmdldFJlZi5jdXJyZW50O1xuXG4gICAgICBpZiAoIXRhcmdldEVsZW1lbnQgfHwgIWlzT3BlbikgcmV0dXJuO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRhcmdldEVsZW1lbnQuY29udGFpbnModGFyZ2V0KSB8fFxuICAgICAgICBwb3BvdmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKHRhcmdldClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2tlZCBlbGVtZW50IGlzIHdpdGhpbiBhbiBPdmVybGF5IGNvbXBvbmVudFxuICAgICAgY29uc3QgY2xpY2tlZEVsZW1lbnQgPSB0YXJnZXQgYXMgRWxlbWVudDtcbiAgICAgIGlmIChjbGlja2VkRWxlbWVudC5jbG9zZXN0KCdbZGF0YS1mbG9hdGluZz1cIm92ZXJsYXlcIl0nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjbGlja2VkIGVsZW1lbnQgaXMgd2l0aGluIGFub3RoZXIgUG9wb3ZlciBvciBQb3BvdmVyQ29udGFpbmVyXG4gICAgICBjb25zdCBpc0Zsb2F0aW5nRWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LmNsb3Nlc3QoXG4gICAgICAgICdbZGF0YS1mbG9hdGluZz1cInBvcG92ZXJcIl0nXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBpc0Zsb2F0aW5nRWxlbWVudCAmJlxuICAgICAgICAhcG9wb3ZlclJlZi5jdXJyZW50Py5jb250YWlucyhpc0Zsb2F0aW5nRWxlbWVudClcbiAgICAgICkge1xuICAgICAgICBvblJlcXVlc3RDbG9zZT8uKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb25SZXF1ZXN0Q2xvc2U/LigpO1xuICAgIH0sXG4gICAgW29uUmVxdWVzdENsb3NlLCB0YXJnZXRSZWYsIGlzT3Blbl1cbiAgKTtcblxuICAvLyBCYWNrdXAgZ2xvYmFsIGNsaWNrIGxpc3RlbmVyIGZvciB3aGVuIGEgUG9wb3ZlciBvciBQb3BvdmVyQ29udGFpbmVyIGlzIG9wZW5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAvLyBVc2UgYSBzbWFsbCBkZWxheSB0byBlbnN1cmUgdGhpcyBkb2Vzbid0IGludGVyZmVyZSB3aXRoIHRoZSBGb2N1c1RyYXAncyBvd24gZGV0ZWN0aW9uXG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlR2xvYmFsQ2xpY2tPdXRzaWRlLCB0cnVlKTtcbiAgICAgIH0sIDUwKTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ21vdXNlZG93bicsXG4gICAgICAgICAgaGFuZGxlR2xvYmFsQ2xpY2tPdXRzaWRlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbaXNPcGVuLCBoYW5kbGVHbG9iYWxDbGlja091dHNpZGVdKTtcblxuICBpZiAoIWlzT3BlbiB8fCAhdGFyZ2V0UmVmKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBjb250ZW50ID0gKFxuICAgIDxGb2N1c1RyYXBcbiAgICAgIGFsbG93UGFnZUludGVyYWN0aW9uPXtpbmxpbmUgfHwgYWxsb3dQYWdlSW50ZXJhY3Rpb259XG4gICAgICBmb2N1c09uUHJvcHM9e2ZvY3VzT25Qcm9wc31cbiAgICAgIG9uQ2xpY2tPdXRzaWRlPXtoYW5kbGVDbGlja091dHNpZGV9XG4gICAgICBvbkVzY2FwZUtleT17b25SZXF1ZXN0Q2xvc2V9XG4gICAgPlxuICAgICAgPFBvcG92ZXJDb250ZW50XG4gICAgICAgIGRhdGEtZmxvYXRpbmc9XCJwb3BvdmVyXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJwb3BvdmVyLWNvbnRlbnQtY29udGFpbmVyXCJcbiAgICAgICAgcG9zaXRpb249XCJhYnNvbHV0ZVwiXG4gICAgICAgIHJlZj17cG9wb3ZlclJlZn1cbiAgICAgICAgdGFiSW5kZXg9ey0xfVxuICAgICAgICB6SW5kZXg9e2lubGluZSA/IDUgOiAnaW5pdGlhbCd9XG4gICAgICAgIHsuLi5wb3BvdmVyUG9zaXRpb24uc3R5bGVzfVxuICAgICAgICAvKiBQaHlzaWNhbCBpbmxpbmUgc3R5bGUgZm9yIGNlbnRlcmVkIGFsaWdubWVudHMgKHRvcC9ib3R0b20pIHdoZXJlXG4gICAgICAgICAgIGluc2V0LWlubGluZS1zdGFydCB3b3VsZCBpbmNvcnJlY3RseSBmbGlwIHRoZSBjZW50ZXIgcG9pbnQgaW4gUlRMICovXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnYW11dC9uby1pbmxpbmUtc3R5bGUgKi9cbiAgICAgICAgc3R5bGU9e3BvcG92ZXJQb3NpdGlvbi5waHlzaWNhbFN0eWxlc31cbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAvPlxuICAgIDwvRm9jdXNUcmFwPlxuICApO1xuXG4gIGlmIChpbmxpbmUpIHJldHVybiBjb250ZW50O1xuXG4gIHJldHVybiA8Qm9keVBvcnRhbD57Y29udGVudH08L0JvZHlQb3J0YWw+O1xufTtcbiJdfQ== */");
|
|
20
20
|
export const PopoverContainer = ({
|
|
21
21
|
alignment = 'bottom-left',
|
|
22
22
|
offset = 20,
|
|
@@ -29,6 +29,7 @@ export const PopoverContainer = ({
|
|
|
29
29
|
targetRef,
|
|
30
30
|
allowPageInteraction,
|
|
31
31
|
closeOnViewportExit = false,
|
|
32
|
+
focusOnProps,
|
|
32
33
|
...rest
|
|
33
34
|
}) => {
|
|
34
35
|
const popoverRef = useRef(null);
|
|
@@ -189,6 +190,7 @@ export const PopoverContainer = ({
|
|
|
189
190
|
if (!isOpen || !targetRef) return null;
|
|
190
191
|
const content = /*#__PURE__*/_jsx(FocusTrap, {
|
|
191
192
|
allowPageInteraction: inline || allowPageInteraction,
|
|
193
|
+
focusOnProps: focusOnProps,
|
|
192
194
|
onClickOutside: handleClickOutside,
|
|
193
195
|
onEscapeKey: onRequestClose,
|
|
194
196
|
children: /*#__PURE__*/_jsx(PopoverContent, {
|
|
@@ -65,4 +65,9 @@ export interface PopoverContainerProps extends PopoverAlignment, WithChildrenPro
|
|
|
65
65
|
* Defaults to false.
|
|
66
66
|
*/
|
|
67
67
|
closeOnViewportExit?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Optional props passed to the internal FocusTrap (react-focus-on).
|
|
70
|
+
* Use e.g. { autoFocus: false, focusLock: false } to keep focus on the trigger when the popover opens.
|
|
71
|
+
*/
|
|
72
|
+
focusOnProps?: Partial<import('../FocusTrap').FocusTrapProps['focusOnProps']>;
|
|
68
73
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export * from './Card';
|
|
|
15
15
|
export * from './Coachmark';
|
|
16
16
|
export * from './ConnectedForm';
|
|
17
17
|
export * from './ContentContainer';
|
|
18
|
+
export * from './DatePicker';
|
|
18
19
|
export * from './DelayedRenderWrapper';
|
|
19
20
|
export * from './Disclosure';
|
|
20
21
|
export * from './DataList';
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,7 @@ export * from './Card';
|
|
|
14
14
|
export * from './Coachmark';
|
|
15
15
|
export * from './ConnectedForm';
|
|
16
16
|
export * from './ContentContainer';
|
|
17
|
+
export * from './DatePicker';
|
|
17
18
|
export * from './DelayedRenderWrapper';
|
|
18
19
|
export * from './Disclosure';
|
|
19
20
|
export * from './DataList';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codecademy/gamut",
|
|
3
3
|
"description": "Styleguide & Component library for Codecademy",
|
|
4
|
-
"version": "68.1.
|
|
4
|
+
"version": "68.1.3-alpha.77d8dc.0",
|
|
5
5
|
"author": "Codecademy Engineering <dev@codecademy.com>",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@codecademy/gamut-icons": "9.57.0",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"dist/**/[A-Z]**/[A-Z]*.js",
|
|
60
60
|
"dist/**/[A-Z]**/index.js"
|
|
61
61
|
],
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "2ff891f214b3edfdad6e3b31f43f024ca026e019"
|
|
63
63
|
}
|