@plexui/ui 0.18.1 → 0.18.4
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/es/components/DatePicker/Calendar.js +13 -16
- package/dist/es/components/DatePicker/Calendar.js.map +1 -1
- package/dist/es/components/DatePicker/Calendar.module.css +2 -31
- package/dist/es/components/DatePicker/DatePicker.js +2 -2
- package/dist/es/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/es/components/Select/Select.js +19 -12
- package/dist/es/components/Select/Select.js.map +1 -1
- package/dist/es/components/Select/Select.module.css +4 -1
- package/dist/types/components/DatePicker/DatePicker.d.ts +1 -1
- package/dist/types/components/Select/Select.d.ts +2 -1
- package/package.json +2 -2
|
@@ -7,6 +7,7 @@ import { waitForAnimationFrame } from "../../lib/helpers";
|
|
|
7
7
|
import { Button } from "../Button";
|
|
8
8
|
import { ChevronLeft, ChevronRight } from "../Icon";
|
|
9
9
|
import { usePopoverClose } from "../Popover/usePopoverController";
|
|
10
|
+
import { Select } from "../Select";
|
|
10
11
|
import { TransitionGroup } from "../Transition";
|
|
11
12
|
import s from "./Calendar.module.css";
|
|
12
13
|
import { useDateContext } from "./context";
|
|
@@ -145,23 +146,13 @@ const DropdownCaption = ({ date, onMonthChange, onYearChange, min, max, yearRang
|
|
|
145
146
|
}
|
|
146
147
|
return result;
|
|
147
148
|
}, [minYear, maxYear]);
|
|
148
|
-
return (_jsxs("div", { className: s.DropdownCaption, children: [_jsx("
|
|
149
|
+
return (_jsxs("div", { className: s.DropdownCaption, children: [_jsx(Select, { "aria-label": "Month", listMinWidth: "auto", listWidth: "auto", variant: "ghost", size: "sm", dropdownIconType: "chevronDown", value: String(date.month), options: SHORT_MONTH_NAMES.map((label, index) => ({ value: String(index + 1), label })), onChange: (option) => onMonthChange(Number(option.value)) }), _jsx(Select, { "aria-label": "Year", listMinWidth: "auto", listWidth: "auto", variant: "ghost", size: "sm", dropdownIconType: "chevronDown", value: String(date.year), options: years.map((year) => ({ value: String(year), label: String(year) })), onChange: (option) => onYearChange(Number(option.value)) })] }));
|
|
149
150
|
};
|
|
150
151
|
const TimeInput = ({ hour, minute, onChange }) => {
|
|
151
152
|
const hourRef = useRef(null);
|
|
152
153
|
const minuteRef = useRef(null);
|
|
153
|
-
const [hourText, setHourText] = useState(
|
|
154
|
-
const [minuteText, setMinuteText] = useState(
|
|
155
|
-
useEffect(() => {
|
|
156
|
-
if (document.activeElement !== hourRef.current) {
|
|
157
|
-
setHourText(String(hour).padStart(2, "0"));
|
|
158
|
-
}
|
|
159
|
-
}, [hour]);
|
|
160
|
-
useEffect(() => {
|
|
161
|
-
if (document.activeElement !== minuteRef.current) {
|
|
162
|
-
setMinuteText(String(minute).padStart(2, "0"));
|
|
163
|
-
}
|
|
164
|
-
}, [minute]);
|
|
154
|
+
const [hourText, setHourText] = useState(null);
|
|
155
|
+
const [minuteText, setMinuteText] = useState(null);
|
|
165
156
|
const handleHourChange = (e) => {
|
|
166
157
|
const raw = e.target.value.replace(/\D/g, "").slice(0, 2);
|
|
167
158
|
setHourText(raw);
|
|
@@ -175,7 +166,7 @@ const TimeInput = ({ hour, minute, onChange }) => {
|
|
|
175
166
|
const raw = e.currentTarget.value.replace(/\D/g, "").slice(0, 2);
|
|
176
167
|
const h = Math.min(23, Number(raw) || 0);
|
|
177
168
|
onChange(h, minute);
|
|
178
|
-
setHourText(
|
|
169
|
+
setHourText(null);
|
|
179
170
|
};
|
|
180
171
|
const handleMinuteChange = (e) => {
|
|
181
172
|
const raw = e.target.value.replace(/\D/g, "").slice(0, 2);
|
|
@@ -188,7 +179,7 @@ const TimeInput = ({ hour, minute, onChange }) => {
|
|
|
188
179
|
const raw = e.currentTarget.value.replace(/\D/g, "").slice(0, 2);
|
|
189
180
|
const m = Math.min(59, Number(raw) || 0);
|
|
190
181
|
onChange(hour, m);
|
|
191
|
-
setMinuteText(
|
|
182
|
+
setMinuteText(null);
|
|
192
183
|
};
|
|
193
184
|
const handleKeyDown = (e, type) => {
|
|
194
185
|
const step = e.shiftKey ? 10 : 1;
|
|
@@ -219,7 +210,13 @@ const TimeInput = ({ hour, minute, onChange }) => {
|
|
|
219
210
|
}
|
|
220
211
|
}
|
|
221
212
|
};
|
|
222
|
-
return (_jsxs("div", { className: s.TimeFooter, children: [_jsx("span", { className: s.TimeLabel, children: "Time" }), _jsxs("div", { className: s.TimeInputGroup, children: [_jsx("input", { ref: hourRef, className: s.TimeField, type: "text", inputMode: "numeric", value: hourText
|
|
213
|
+
return (_jsxs("div", { className: s.TimeFooter, children: [_jsx("span", { className: s.TimeLabel, children: "Time" }), _jsxs("div", { className: s.TimeInputGroup, children: [_jsx("input", { ref: hourRef, className: s.TimeField, type: "text", inputMode: "numeric", value: hourText ?? String(hour).padStart(2, "0"), onChange: handleHourChange, onBlur: handleHourBlur, onFocus: (e) => {
|
|
214
|
+
setHourText(e.target.value);
|
|
215
|
+
e.target.select();
|
|
216
|
+
}, onKeyDown: (e) => handleKeyDown(e, "hour"), maxLength: 2, "aria-label": "Hour" }), _jsx("span", { className: s.TimeSeparator, children: ":" }), _jsx("input", { ref: minuteRef, className: s.TimeField, type: "text", inputMode: "numeric", value: minuteText ?? String(minute).padStart(2, "0"), onChange: handleMinuteChange, onBlur: handleMinuteBlur, onFocus: (e) => {
|
|
217
|
+
setMinuteText(e.target.value);
|
|
218
|
+
e.target.select();
|
|
219
|
+
}, onKeyDown: (e) => handleKeyDown(e, "minute"), maxLength: 2, "aria-label": "Minute" })] })] }));
|
|
223
220
|
};
|
|
224
221
|
const daysOfTheWeekLabels = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
|
|
225
222
|
const CalendarView = ({ date, selectedDate, min, max, onDateSelect, stepPosition, hideMonthLabel = false, }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/Calendar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,CAAC,MAAM,uBAAuB,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAC7B,MAAM,eAAe,GAAG,EAAE,CAAA;AAC1B,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,eAAe,CAAA;AAE5D,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5D,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAW,CAC3C,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAAA;IAC7F,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,oBAAoB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAA;IAChE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAA;IAC7D,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAA;IAC3E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE,CAAC,KAAK,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;IAEzF,MAAM,UAAU,GAAG,aAAa,KAAK,UAAU,CAAA;IAE/C,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IACtE,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAA;IAEvE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;IAC/E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAS,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAA;IAEpF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,EAAE,CAAC;YACV,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC1B,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,UAAU,EAAE,CAAC;YACf,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAC/C,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YAC9B,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,UAAU,EAAE,CAAC;YACf,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAChD,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YAC9B,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAClD,CAAC;IACH,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,CAAC,YAAsB,EAAE,EAAE;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;QACrF,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YACjC,YAAY,EAAE,CAAA;QAChB,CAAC;IACH,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;QACxD,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACxB,IAAI,KAAK,EAAE,CAAC;YACV,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAClD,CAAC;IACH,CAAC,CAAA;IAED,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAE,EAAE;QAClD,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5D,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAE,EAAE;QAChD,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5D,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,+EAA+E;IAC/E,SAAS,CAAC,GAAG,EAAE;QACb,4BAA4B;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED,wDAAwD;QACxD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CACzC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAC7B,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAC5B,CAAA;QACD,MAAM,wBAAwB,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC7D,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC9B,yCAAyC;YACzC,gBAAgB,CAAC,CAAC,CAAC,CAAA;YACnB,eAAe,CAAC,KAAK,CAAC,CAAA;YACtB,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACvC,CAAC;QACD,mGAAmG;IACrG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,wDAAwD;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,qBAAqB,CAAC,GAAG,EAAE;YACzB,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAA;YAE9C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAM;YACR,CAAC;YAED,IAAI,SAAS,GAAG,CAAC,QAAQ,CAAA;YAEzB,4BAA4B;YAC5B,SAAS,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACjE,yGAAyG;gBACzG,iFAAiF;gBACjF,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAA;gBAEnC,oCAAoC;gBACpC,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;oBACrC,OAAM;gBACR,CAAC;gBAED,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;oBACvB,SAAS,GAAG,MAAM,CAAA;gBACpB,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,SAAS,IAAI,CAAA;YAEzC,oCAAoC;YACpC,8EAA8E;YAC9E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBAChC,qBAAqB,CAAC,GAAG,EAAE;oBACzB,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,gCAAgC,CAAA;gBAC/D,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAElB,OAAO,CACL,eAAK,SAAS,EAAE,CAAC,CAAC,eAAe,aAC/B,eAAK,GAAG,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAC,iBAAiB,mBAAiB,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,aACxG,cAAK,SAAS,EAAE,CAAC,CAAC,QAAQ,YACxB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,KAAK,EAAC,WAAW,EACjB,IAAI,EAAC,IAAI,EACT,UAAU,EAAC,KAAK,EAChB,IAAI,EAAE,KAAK,EACX,QAAQ,EAAC,IAAI,EACb,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,CAAC,SAAS,YAEpB,KAAC,WAAW,KAAG,GACR,GACL,EACN,cAAK,SAAS,EAAE,CAAC,CAAC,IAAI,YACpB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,KAAK,EAAC,WAAW,EACjB,IAAI,EAAC,IAAI,EACT,UAAU,EAAC,KAAK,EAChB,IAAI,EAAE,KAAK,EACX,QAAQ,EAAC,IAAI,EACb,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,CAAC,YAAY,YAEvB,KAAC,YAAY,KAAG,GACT,GACL,EACL,UAAU,IAAI,CACb,KAAC,eAAe,IACd,IAAI,EAAE,YAAY,EAClB,aAAa,EAAE,yBAAyB,EACxC,YAAY,EAAE,wBAAwB,EACtC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,GACpB,CACH,EACD,cACE,SAAS,EAAE,CAAC,CAAC,aAAa,EAC1B,KAAK,EACH,CAAC,UAAU;4BACT,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,aAAa,GAAG,CAAC,CAAC,GAAG,gBAAgB,QAAQ,EAAE;4BAC3E,CAAC,CAAC,SAAS,YAGd,CAAC,UAAU,CAAC,CAAC,CAAC,CACb,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,YACpD,KAAC,YAAY,IAKX,YAAY,EAAE,aAAa,EAC3B,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,KAAK,EACnB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,gBAAgB,EAC9B,cAAc,EAAE,KAAK,IAVhB,YAAY,CAAC,cAAc,CAAC;gCAC/B,KAAK,EAAE,MAAM;gCACb,IAAI,EAAE,SAAS;6BAChB,CAAC,CAQF,GACc,CACnB,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IAKX,YAAY,EAAE,CAAC,EACf,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,KAAK,EACnB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,gBAAgB,EAC9B,cAAc,UAVT,YAAY,CAAC,cAAc,CAAC;4BAC/B,KAAK,EAAE,MAAM;4BACb,IAAI,EAAE,SAAS;yBAChB,CAAC,CAQF,CACH,GACG,IACF,EACL,QAAQ,IAAI,CACX,KAAC,SAAS,IACR,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,gBAAgB,GAC1B,CACH,KAvFqC,eAAe,oBAAoB,EAAE,CAwFvE,CACP,CAAA;AACH,CAAC,CAAA;AAWD,MAAM,eAAe,GAAG,CAAC,EACvB,IAAI,EACJ,aAAa,EACb,YAAY,EACZ,GAAG,EACH,GAAG,EACH,SAAS,GACY,EAAE,EAAE;IACzB,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAA;IACvC,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,IAAI,WAAW,GAAG,GAAG,CAAA;IAChE,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,IAAI,WAAW,CAAA;IAE1D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChB,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IAEtB,OAAO,CACL,eAAK,SAAS,EAAE,CAAC,CAAC,eAAe,aAC/B,iBACE,SAAS,EAAE,CAAC,CAAC,cAAc,EAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAErD,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAClC,iBAAmB,KAAK,EAAE,CAAC,GAAG,CAAC,YAC5B,IAAI,IADM,IAAI,CAER,CACV,CAAC,GACK,EACT,iBACE,SAAS,EAAE,CAAC,CAAC,cAAc,EAC3B,KAAK,EAAE,IAAI,CAAC,IAAI,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAEpD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,iBAAgB,KAAK,EAAE,CAAC,YACrB,CAAC,IADS,CAAC,CAEL,CACV,CAAC,GACK,IACL,CACP,CAAA;AACH,CAAC,CAAA;AAQD,MAAM,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAkB,EAAE,EAAE;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAC7E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAEnF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,aAAa,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/C,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YACjD,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAChD,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,MAAM,gBAAgB,GAAG,CAAC,CAAsC,EAAE,EAAE;QAClE,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACzD,WAAW,CAAC,GAAG,CAAC,CAAA;QAChB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;YAC3C,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;YAC1B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;QAC7B,CAAC;IACH,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,CAAC,CAAqC,EAAE,EAAE;QAC/D,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAChE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QACxC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACnB,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IACzC,CAAC,CAAA;IAED,MAAM,kBAAkB,GAAG,CAAC,CAAsC,EAAE,EAAE;QACpE,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACzD,aAAa,CAAC,GAAG,CAAC,CAAA;QAClB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,CAAC,CAAqC,EAAE,EAAE;QACjE,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAChE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QACxC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACjB,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,CACpB,CAAwC,EACxC,IAAuB,EACvB,EAAE;QACF,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAChC,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACxB,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBAC5B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;gBACnB,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBAC9B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;gBACjB,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACjC,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,EAAE,CAAA;gBACjC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;gBACnB,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,EAAE,CAAA;gBACnC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;gBACjB,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAE,CAAC,CAAC,UAAU,aAC1B,eAAM,SAAS,EAAE,CAAC,CAAC,SAAS,qBAAa,EACzC,eAAK,SAAS,EAAE,CAAC,CAAC,cAAc,aAC9B,gBACE,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,CAAC,CAAC,SAAS,EACtB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EACjC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,EAC1C,SAAS,EAAE,CAAC,gBACD,MAAM,GACjB,EACF,eAAM,SAAS,EAAE,CAAC,CAAC,aAAa,kBAAU,EAC1C,gBACE,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,CAAC,CAAC,SAAS,EACtB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EACjC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,EAC5C,SAAS,EAAE,CAAC,gBACD,QAAQ,GACnB,IACE,IACF,CACP,CAAA;AACH,CAAC,CAAA;AAYD,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAEtE,MAAM,YAAY,GAAG,CAAC,EACpB,IAAI,EACJ,YAAY,EACZ,GAAG,EACH,GAAG,EACH,YAAY,EACZ,YAAY,EACZ,cAAc,GAAG,KAAK,GACJ,EAAE,EAAE;IACtB,sDAAsD;IACtD,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IACzC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAEtC,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,WAAW,CAAC,CAAA;QAEpD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,IAAI,UAAU,EAAE,GAAG,IAAI,UAAU,CAAC,CAAA;QAExF,OAAO;YACL,YAAY,EAAE,UAAU;YACxB,UAAU;YACV,KAAK,EAAE,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC;YACvC,eAAe,EAAE,mBAAmB;SACrC,CAAA;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IAEpB,OAAO,CACL,eACE,SAAS,EAAE,CAAC,CAAC,QAAQ,EACrB,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,gBAAgB,EAAE,wCAE5D,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,aAE3C,cAAc,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAE,CAAC,CAAC,gBAAgB,iBAAc,MAAM,GAAG,CAC1D,CAAC,CAAC,CAAC,CACF,aAAG,SAAS,EAAE,CAAC,CAAC,UAAU,aACvB,YAAY,CAAC,SAAS,OAAG,YAAY,CAAC,IAAI,IACzC,CACL,EACD,cAAK,SAAS,EAAE,CAAC,CAAC,IAAI,YACnB,mBAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAChC,cAAe,SAAS,EAAE,CAAC,CAAC,QAAQ,YACjC,GAAG,IADI,GAAG,CAEP,CACP,CAAC,GACE,EACL,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAC9B,cAAK,SAAS,EAAE,CAAC,CAAC,IAAI,YACnB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE;oBACxB,IAAI,CAAC,CAAC,EAAE,CAAC;wBACP,OAAO,cAAK,SAAS,EAAE,CAAC,CAAC,GAAG,IAAO,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAI,CAAA;oBACnE,CAAC;oBAED,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;oBAC3C,MAAM,UAAU,GAAG,OAAO,IAAI,YAAY,IAAI,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;oBACxE,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;oBAE7B,OAAO,CACL,cAAK,SAAS,EAAE,CAAC,CAAC,GAAG,sBAAmC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,YACjF,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,CAAC,CAAC,cAAc,EAC3B,QAAQ,EAAE,CAAC,OAAO,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,aAEpC,CAAC,CAAC,GAAG,EACL,UAAU,IAAI,eAAM,SAAS,EAAE,CAAC,CAAC,QAAQ,GAAI,IACvC,IATiB,QAAQ,CAU9B,CACP,CAAA;gBACH,CAAC,CAAC,IAvByB,SAAS,CAwBhC,CACP,CAAC,IACE,CACP,CAAA;AACH,CAAC,CAAA","sourcesContent":["\"use client\"\n\nimport { DateTime, Interval } from \"luxon\"\nimport { useEffect, useMemo, useRef, useState } from \"react\"\nimport { chunkIntoWeeks, getDaysOfMonth, isBefore, isSameDay, isToday } from \"../../lib/dateUtils\"\nimport { waitForAnimationFrame } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { ChevronLeft, ChevronRight } from \"../Icon\"\nimport { usePopoverClose } from \"../Popover/usePopoverController\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Calendar.module.css\"\nimport { useDateContext } from \"./context\"\n\nconst CALENDAR_WIDTH_PX = 210\nconst CALENDAR_GAP_PX = 32\nconst STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX\n\nconst SHORT_MONTH_NAMES = Array.from({ length: 12 }, (_, i) =>\n DateTime.local(2024, i + 1, 1).monthShort!,\n)\n\nexport const DateCalendar = () => {\n const { value, min, max, onChangeRef, captionLayout, showTime, yearRange } = useDateContext()\n const closePopover = usePopoverClose()\n const calendarContainerRef = useRef<HTMLDivElement | null>(null)\n const [calendarSteps, setCalendarSteps] = useState<number>(0)\n const [forceRenderIncrement, setForceRenderIncrement] = useState<number>(0)\n const [calendarDate, setCalendarDate] = useState<DateTime>(() => value ?? DateTime.now())\n\n const isDropdown = captionLayout === \"dropdown\"\n\n const canGoBack = !min || isBefore(min, calendarDate.startOf(\"month\"))\n const canGoForward = !max || isBefore(calendarDate.endOf(\"month\"), max)\n\n const [pendingHour, setPendingHour] = useState<number>(() => value?.hour ?? 12)\n const [pendingMinute, setPendingMinute] = useState<number>(() => value?.minute ?? 0)\n\n useEffect(() => {\n if (value) {\n setPendingHour(value.hour)\n setPendingMinute(value.minute)\n }\n }, [value])\n\n const handleNext = () => {\n if (isDropdown) {\n setCalendarDate((dt) => dt.plus({ months: 1 }))\n setForceRenderIncrement((c) => c + 1)\n } else {\n setCalendarSteps((c) => c + 1)\n setCalendarDate((dt) => dt.plus({ months: 1 }))\n }\n }\n\n const handlePrevious = () => {\n if (isDropdown) {\n setCalendarDate((dt) => dt.minus({ months: 1 }))\n setForceRenderIncrement((c) => c + 1)\n } else {\n setCalendarSteps((c) => c - 1)\n setCalendarDate((dt) => dt.minus({ months: 1 }))\n }\n }\n\n const handleDateSelect = (selectedDate: DateTime) => {\n if (showTime) {\n onChangeRef.current(selectedDate.set({ hour: pendingHour, minute: pendingMinute }))\n } else {\n onChangeRef.current(selectedDate)\n closePopover()\n }\n }\n\n const handleTimeChange = (hour: number, minute: number) => {\n setPendingHour(hour)\n setPendingMinute(minute)\n if (value) {\n onChangeRef.current(value.set({ hour, minute }))\n }\n }\n\n const handleDropdownMonthChange = (month: number) => {\n setCalendarDate(DateTime.local(calendarDate.year, month, 1))\n setForceRenderIncrement((c) => c + 1)\n }\n\n const handleDropdownYearChange = (year: number) => {\n setCalendarDate(DateTime.local(year, calendarDate.month, 1))\n setForceRenderIncrement((c) => c + 1)\n }\n\n // Force re-renders when `value` changes out of band from direct user-selection\n useEffect(() => {\n // No-op when value is empty\n if (!value) {\n return\n }\n\n // Check if `value` is still within view of our calendar\n const viewInterval = Interval.fromDateTimes(\n calendarDate.startOf(\"month\"),\n calendarDate.endOf(\"month\"),\n )\n const isValueInRangeOfCalendar = viewInterval.contains(value)\n if (!isValueInRangeOfCalendar) {\n // Reset state the calendar view entirely\n setCalendarSteps(0)\n setCalendarDate(value)\n setForceRenderIncrement((c) => c + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Only re-run this hook when value changes\n }, [value])\n\n // Detect height changes when new calendars are rendered\n useEffect(() => {\n waitForAnimationFrame(() => {\n const container = calendarContainerRef.current\n\n if (!container) {\n return\n }\n\n let maxHeight = -Infinity\n\n // Find the tallest calendar\n container.querySelectorAll(\"[data-calendar]\")?.forEach((element) => {\n // NOTE: clientHeight does not respect the scale() that popover uses to animate in, which is what we want\n // We want to know the full height of the element, without any transform applied.\n const height = element.clientHeight\n\n // Ignore calendars that are exiting\n if (element.closest(\"[data-exiting\")) {\n return\n }\n\n if (height > maxHeight) {\n maxHeight = height\n }\n })\n\n container.style.height = `${maxHeight}px`\n\n // Don't animate the initial height.\n // This is relevant when the calendar opens to a larger size than the default.\n if (!container.style.transition) {\n waitForAnimationFrame(() => {\n container.style.transition = `height 0.25s var(--cubic-move)`\n })\n }\n })\n }, [calendarDate])\n\n return (\n <div className={s.CalendarWrapper} key={`stable-view-${forceRenderIncrement}`}>\n <div ref={calendarContainerRef} className={s.CalendarContainer} data-dropdown={isDropdown ? \"\" : undefined}>\n <div className={s.Previous}>\n <Button\n variant=\"ghost\"\n color=\"secondary\"\n size=\"sm\"\n gutterSize=\"2xs\"\n pill={false}\n iconSize=\"sm\"\n onClick={handlePrevious}\n disabled={!canGoBack}\n >\n <ChevronLeft />\n </Button>\n </div>\n <div className={s.Next}>\n <Button\n variant=\"ghost\"\n color=\"secondary\"\n size=\"sm\"\n gutterSize=\"2xs\"\n pill={false}\n iconSize=\"sm\"\n onClick={handleNext}\n disabled={!canGoForward}\n >\n <ChevronRight />\n </Button>\n </div>\n {isDropdown && (\n <DropdownCaption\n date={calendarDate}\n onMonthChange={handleDropdownMonthChange}\n onYearChange={handleDropdownYearChange}\n min={min}\n max={max}\n yearRange={yearRange}\n />\n )}\n <div\n className={s.CalendarRange}\n style={\n !isDropdown\n ? { transform: `translate(${calendarSteps * -1 * STEP_DISTANCE_PX}px, 0)` }\n : undefined\n }\n >\n {!isDropdown ? (\n <TransitionGroup enterDuration={400} exitDuration={400}>\n <CalendarView\n key={calendarDate.toLocaleString({\n month: \"long\",\n year: \"numeric\",\n })}\n stepPosition={calendarSteps}\n date={calendarDate}\n selectedDate={value}\n min={min}\n max={max}\n onDateSelect={handleDateSelect}\n hideMonthLabel={false}\n />\n </TransitionGroup>\n ) : (\n <CalendarView\n key={calendarDate.toLocaleString({\n month: \"long\",\n year: \"numeric\",\n })}\n stepPosition={0}\n date={calendarDate}\n selectedDate={value}\n min={min}\n max={max}\n onDateSelect={handleDateSelect}\n hideMonthLabel\n />\n )}\n </div>\n </div>\n {showTime && (\n <TimeInput\n hour={pendingHour}\n minute={pendingMinute}\n onChange={handleTimeChange}\n />\n )}\n </div>\n )\n}\n\ntype DropdownCaptionProps = {\n date: DateTime\n onMonthChange: (month: number) => void\n onYearChange: (year: number) => void\n min?: DateTime\n max?: DateTime\n yearRange?: [number, number]\n}\n\nconst DropdownCaption = ({\n date,\n onMonthChange,\n onYearChange,\n min,\n max,\n yearRange,\n}: DropdownCaptionProps) => {\n const currentYear = DateTime.now().year\n const minYear = yearRange?.[0] ?? min?.year ?? currentYear - 120\n const maxYear = yearRange?.[1] ?? max?.year ?? currentYear\n\n const years = useMemo(() => {\n const result: number[] = []\n for (let y = maxYear; y >= minYear; y--) {\n result.push(y)\n }\n return result\n }, [minYear, maxYear])\n\n return (\n <div className={s.DropdownCaption}>\n <select\n className={s.DropdownSelect}\n value={date.month}\n onChange={(e) => onMonthChange(Number(e.target.value))}\n >\n {SHORT_MONTH_NAMES.map((name, i) => (\n <option key={name} value={i + 1}>\n {name}\n </option>\n ))}\n </select>\n <select\n className={s.DropdownSelect}\n value={date.year}\n onChange={(e) => onYearChange(Number(e.target.value))}\n >\n {years.map((y) => (\n <option key={y} value={y}>\n {y}\n </option>\n ))}\n </select>\n </div>\n )\n}\n\ntype TimeInputProps = {\n hour: number\n minute: number\n onChange: (hour: number, minute: number) => void\n}\n\nconst TimeInput = ({ hour, minute, onChange }: TimeInputProps) => {\n const hourRef = useRef<HTMLInputElement>(null)\n const minuteRef = useRef<HTMLInputElement>(null)\n const [hourText, setHourText] = useState(() => String(hour).padStart(2, \"0\"))\n const [minuteText, setMinuteText] = useState(() => String(minute).padStart(2, \"0\"))\n\n useEffect(() => {\n if (document.activeElement !== hourRef.current) {\n setHourText(String(hour).padStart(2, \"0\"))\n }\n }, [hour])\n\n useEffect(() => {\n if (document.activeElement !== minuteRef.current) {\n setMinuteText(String(minute).padStart(2, \"0\"))\n }\n }, [minute])\n\n const handleHourChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, \"\").slice(0, 2)\n setHourText(raw)\n if (raw.length === 2) {\n onChange(Math.min(23, Number(raw)), minute)\n minuteRef.current?.focus()\n minuteRef.current?.select()\n }\n }\n\n const handleHourBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const raw = e.currentTarget.value.replace(/\\D/g, \"\").slice(0, 2)\n const h = Math.min(23, Number(raw) || 0)\n onChange(h, minute)\n setHourText(String(h).padStart(2, \"0\"))\n }\n\n const handleMinuteChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, \"\").slice(0, 2)\n setMinuteText(raw)\n if (raw.length === 2) {\n onChange(hour, Math.min(59, Number(raw)))\n }\n }\n\n const handleMinuteBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const raw = e.currentTarget.value.replace(/\\D/g, \"\").slice(0, 2)\n const m = Math.min(59, Number(raw) || 0)\n onChange(hour, m)\n setMinuteText(String(m).padStart(2, \"0\"))\n }\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n type: \"hour\" | \"minute\",\n ) => {\n const step = e.shiftKey ? 10 : 1\n if (e.key === \"ArrowUp\") {\n e.preventDefault()\n if (type === \"hour\") {\n const h = (hour + step) % 24\n onChange(h, minute)\n setHourText(String(h).padStart(2, \"0\"))\n } else {\n const m = (minute + step) % 60\n onChange(hour, m)\n setMinuteText(String(m).padStart(2, \"0\"))\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault()\n if (type === \"hour\") {\n const h = (hour - step + 24) % 24\n onChange(h, minute)\n setHourText(String(h).padStart(2, \"0\"))\n } else {\n const m = (minute - step + 60) % 60\n onChange(hour, m)\n setMinuteText(String(m).padStart(2, \"0\"))\n }\n }\n }\n\n return (\n <div className={s.TimeFooter}>\n <span className={s.TimeLabel}>Time</span>\n <div className={s.TimeInputGroup}>\n <input\n ref={hourRef}\n className={s.TimeField}\n type=\"text\"\n inputMode=\"numeric\"\n value={hourText}\n onChange={handleHourChange}\n onBlur={handleHourBlur}\n onFocus={(e) => e.target.select()}\n onKeyDown={(e) => handleKeyDown(e, \"hour\")}\n maxLength={2}\n aria-label=\"Hour\"\n />\n <span className={s.TimeSeparator}>:</span>\n <input\n ref={minuteRef}\n className={s.TimeField}\n type=\"text\"\n inputMode=\"numeric\"\n value={minuteText}\n onChange={handleMinuteChange}\n onBlur={handleMinuteBlur}\n onFocus={(e) => e.target.select()}\n onKeyDown={(e) => handleKeyDown(e, \"minute\")}\n maxLength={2}\n aria-label=\"Minute\"\n />\n </div>\n </div>\n )\n}\n\ntype CalendarViewProps = {\n date: DateTime\n selectedDate?: DateTime | null\n onDateSelect?: (dt: DateTime) => void\n min?: DateTime\n max?: DateTime\n stepPosition: number\n hideMonthLabel?: boolean\n}\n\nconst daysOfTheWeekLabels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\n\nconst CalendarView = ({\n date,\n selectedDate,\n min,\n max,\n onDateSelect,\n stepPosition,\n hideMonthLabel = false,\n}: CalendarViewProps) => {\n // Lock position on mount and don't respond to changes\n const [position] = useState(stepPosition)\n const { startOfMonth, weeks, enabledInterval } = useMemo(() => {\n const monthStart = date.startOf(\"month\")\n const endOfMonth = date.endOf(\"month\")\n\n const daysBeforeMonthStart = monthStart.weekday % 7\n const blankDays = new Array(daysBeforeMonthStart).fill(null)\n const daysInMonth = getDaysOfMonth(monthStart)\n const calendarCells = [...blankDays, ...daysInMonth]\n\n const enabledDateInterval = Interval.fromDateTimes(min || monthStart, max || endOfMonth)\n\n return {\n startOfMonth: monthStart,\n endOfMonth,\n weeks: chunkIntoWeeks(calendarCells, 7),\n enabledInterval: enabledDateInterval,\n }\n }, [date, min, max])\n\n return (\n <div\n className={s.Calendar}\n style={hideMonthLabel ? undefined : { left: position * STEP_DISTANCE_PX }}\n data-calendar\n data-static={hideMonthLabel ? \"\" : undefined}\n >\n {hideMonthLabel ? (\n <div className={s.MonthLabelSpacer} aria-hidden=\"true\" />\n ) : (\n <p className={s.MonthLabel}>\n {startOfMonth.monthLong} {startOfMonth.year}\n </p>\n )}\n <div className={s.Week}>\n {daysOfTheWeekLabels.map((day) => (\n <div key={day} className={s.DayLabel}>\n {day}\n </div>\n ))}\n </div>\n {weeks.map((week, weekIndex) => (\n <div className={s.Week} key={weekIndex}>\n {week.map((d, dayIndex) => {\n if (!d) {\n return <div className={s.Day} key={`${weekIndex}-${dayIndex}`} />\n }\n\n const enabled = enabledInterval.contains(d)\n const isSelected = enabled && selectedDate && isSameDay(d, selectedDate)\n const dayIsToday = isToday(d)\n\n return (\n <div className={s.Day} key={dayIndex} data-is-selected={isSelected ? \"\" : undefined}>\n <button\n type=\"button\"\n className={s.InteractiveDay}\n disabled={!enabled}\n onClick={() => d && onDateSelect?.(d)}\n >\n {d.day}\n {dayIsToday && <span className={s.TodayDot} />}\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/Calendar.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DateTime, Interval } from \"luxon\"\nimport { useEffect, useMemo, useRef, useState } from \"react\"\nimport { chunkIntoWeeks, getDaysOfMonth, isBefore, isSameDay, isToday } from \"../../lib/dateUtils\"\nimport { waitForAnimationFrame } from \"../../lib/helpers\"\nimport { Button } from \"../Button\"\nimport { ChevronLeft, ChevronRight } from \"../Icon\"\nimport { usePopoverClose } from \"../Popover/usePopoverController\"\nimport { Select } from \"../Select\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Calendar.module.css\"\nimport { useDateContext } from \"./context\"\n\nconst CALENDAR_WIDTH_PX = 210\nconst CALENDAR_GAP_PX = 32\nconst STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX\n\nconst SHORT_MONTH_NAMES = Array.from(\n { length: 12 },\n (_, i) => DateTime.local(2024, i + 1, 1).monthShort!,\n)\n\nexport const DateCalendar = () => {\n const { value, min, max, onChangeRef, captionLayout, showTime, yearRange } = useDateContext()\n const closePopover = usePopoverClose()\n const calendarContainerRef = useRef<HTMLDivElement | null>(null)\n const [calendarSteps, setCalendarSteps] = useState<number>(0)\n const [forceRenderIncrement, setForceRenderIncrement] = useState<number>(0)\n const [calendarDate, setCalendarDate] = useState<DateTime>(() => value ?? DateTime.now())\n\n const isDropdown = captionLayout === \"dropdown\"\n\n const canGoBack = !min || isBefore(min, calendarDate.startOf(\"month\"))\n const canGoForward = !max || isBefore(calendarDate.endOf(\"month\"), max)\n\n const [pendingHour, setPendingHour] = useState<number>(() => value?.hour ?? 12)\n const [pendingMinute, setPendingMinute] = useState<number>(() => value?.minute ?? 0)\n\n useEffect(() => {\n if (value) {\n setPendingHour(value.hour)\n setPendingMinute(value.minute)\n }\n }, [value])\n\n const handleNext = () => {\n if (isDropdown) {\n setCalendarDate((dt) => dt.plus({ months: 1 }))\n setForceRenderIncrement((c) => c + 1)\n } else {\n setCalendarSteps((c) => c + 1)\n setCalendarDate((dt) => dt.plus({ months: 1 }))\n }\n }\n\n const handlePrevious = () => {\n if (isDropdown) {\n setCalendarDate((dt) => dt.minus({ months: 1 }))\n setForceRenderIncrement((c) => c + 1)\n } else {\n setCalendarSteps((c) => c - 1)\n setCalendarDate((dt) => dt.minus({ months: 1 }))\n }\n }\n\n const handleDateSelect = (selectedDate: DateTime) => {\n if (showTime) {\n onChangeRef.current(selectedDate.set({ hour: pendingHour, minute: pendingMinute }))\n } else {\n onChangeRef.current(selectedDate)\n closePopover()\n }\n }\n\n const handleTimeChange = (hour: number, minute: number) => {\n setPendingHour(hour)\n setPendingMinute(minute)\n if (value) {\n onChangeRef.current(value.set({ hour, minute }))\n }\n }\n\n const handleDropdownMonthChange = (month: number) => {\n setCalendarDate(DateTime.local(calendarDate.year, month, 1))\n setForceRenderIncrement((c) => c + 1)\n }\n\n const handleDropdownYearChange = (year: number) => {\n setCalendarDate(DateTime.local(year, calendarDate.month, 1))\n setForceRenderIncrement((c) => c + 1)\n }\n\n // Force re-renders when `value` changes out of band from direct user-selection\n useEffect(() => {\n // No-op when value is empty\n if (!value) {\n return\n }\n\n // Check if `value` is still within view of our calendar\n const viewInterval = Interval.fromDateTimes(\n calendarDate.startOf(\"month\"),\n calendarDate.endOf(\"month\"),\n )\n const isValueInRangeOfCalendar = viewInterval.contains(value)\n if (!isValueInRangeOfCalendar) {\n // Reset state the calendar view entirely\n setCalendarSteps(0)\n setCalendarDate(value)\n setForceRenderIncrement((c) => c + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Only re-run this hook when value changes\n }, [value])\n\n // Detect height changes when new calendars are rendered\n useEffect(() => {\n waitForAnimationFrame(() => {\n const container = calendarContainerRef.current\n\n if (!container) {\n return\n }\n\n let maxHeight = -Infinity\n\n // Find the tallest calendar\n container.querySelectorAll(\"[data-calendar]\")?.forEach((element) => {\n // NOTE: clientHeight does not respect the scale() that popover uses to animate in, which is what we want\n // We want to know the full height of the element, without any transform applied.\n const height = element.clientHeight\n\n // Ignore calendars that are exiting\n if (element.closest(\"[data-exiting\")) {\n return\n }\n\n if (height > maxHeight) {\n maxHeight = height\n }\n })\n\n container.style.height = `${maxHeight}px`\n\n // Don't animate the initial height.\n // This is relevant when the calendar opens to a larger size than the default.\n if (!container.style.transition) {\n waitForAnimationFrame(() => {\n container.style.transition = `height 0.25s var(--cubic-move)`\n })\n }\n })\n }, [calendarDate])\n\n return (\n <div className={s.CalendarWrapper} key={`stable-view-${forceRenderIncrement}`}>\n <div\n ref={calendarContainerRef}\n className={s.CalendarContainer}\n data-dropdown={isDropdown ? \"\" : undefined}\n >\n <div className={s.Previous}>\n <Button\n variant=\"ghost\"\n color=\"secondary\"\n size=\"sm\"\n gutterSize=\"2xs\"\n pill={false}\n iconSize=\"sm\"\n onClick={handlePrevious}\n disabled={!canGoBack}\n >\n <ChevronLeft />\n </Button>\n </div>\n <div className={s.Next}>\n <Button\n variant=\"ghost\"\n color=\"secondary\"\n size=\"sm\"\n gutterSize=\"2xs\"\n pill={false}\n iconSize=\"sm\"\n onClick={handleNext}\n disabled={!canGoForward}\n >\n <ChevronRight />\n </Button>\n </div>\n {isDropdown && (\n <DropdownCaption\n date={calendarDate}\n onMonthChange={handleDropdownMonthChange}\n onYearChange={handleDropdownYearChange}\n min={min}\n max={max}\n yearRange={yearRange}\n />\n )}\n <div\n className={s.CalendarRange}\n style={\n !isDropdown\n ? { transform: `translate(${calendarSteps * -1 * STEP_DISTANCE_PX}px, 0)` }\n : undefined\n }\n >\n {!isDropdown ? (\n <TransitionGroup enterDuration={400} exitDuration={400}>\n <CalendarView\n key={calendarDate.toLocaleString({\n month: \"long\",\n year: \"numeric\",\n })}\n stepPosition={calendarSteps}\n date={calendarDate}\n selectedDate={value}\n min={min}\n max={max}\n onDateSelect={handleDateSelect}\n hideMonthLabel={false}\n />\n </TransitionGroup>\n ) : (\n <CalendarView\n key={calendarDate.toLocaleString({\n month: \"long\",\n year: \"numeric\",\n })}\n stepPosition={0}\n date={calendarDate}\n selectedDate={value}\n min={min}\n max={max}\n onDateSelect={handleDateSelect}\n hideMonthLabel\n />\n )}\n </div>\n </div>\n {showTime && (\n <TimeInput hour={pendingHour} minute={pendingMinute} onChange={handleTimeChange} />\n )}\n </div>\n )\n}\n\ntype DropdownCaptionProps = {\n date: DateTime\n onMonthChange: (month: number) => void\n onYearChange: (year: number) => void\n min?: DateTime\n max?: DateTime\n yearRange?: [number, number]\n}\n\nconst DropdownCaption = ({\n date,\n onMonthChange,\n onYearChange,\n min,\n max,\n yearRange,\n}: DropdownCaptionProps) => {\n const currentYear = DateTime.now().year\n const minYear = yearRange?.[0] ?? min?.year ?? currentYear - 120\n const maxYear = yearRange?.[1] ?? max?.year ?? currentYear\n\n const years = useMemo(() => {\n const result: number[] = []\n for (let y = maxYear; y >= minYear; y--) {\n result.push(y)\n }\n return result\n }, [minYear, maxYear])\n\n return (\n <div className={s.DropdownCaption}>\n <Select\n aria-label=\"Month\"\n listMinWidth=\"auto\"\n listWidth=\"auto\"\n variant=\"ghost\"\n size=\"sm\"\n dropdownIconType=\"chevronDown\"\n value={String(date.month)}\n options={SHORT_MONTH_NAMES.map((label, index) => ({ value: String(index + 1), label }))}\n onChange={(option) => onMonthChange(Number(option.value))}\n />\n <Select\n aria-label=\"Year\"\n listMinWidth=\"auto\"\n listWidth=\"auto\"\n variant=\"ghost\"\n size=\"sm\"\n dropdownIconType=\"chevronDown\"\n value={String(date.year)}\n options={years.map((year) => ({ value: String(year), label: String(year) }))}\n onChange={(option) => onYearChange(Number(option.value))}\n />\n </div>\n )\n}\n\ntype TimeInputProps = {\n hour: number\n minute: number\n onChange: (hour: number, minute: number) => void\n}\n\nconst TimeInput = ({ hour, minute, onChange }: TimeInputProps) => {\n const hourRef = useRef<HTMLInputElement>(null)\n const minuteRef = useRef<HTMLInputElement>(null)\n const [hourText, setHourText] = useState<string | null>(null)\n const [minuteText, setMinuteText] = useState<string | null>(null)\n\n const handleHourChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, \"\").slice(0, 2)\n setHourText(raw)\n if (raw.length === 2) {\n onChange(Math.min(23, Number(raw)), minute)\n minuteRef.current?.focus()\n minuteRef.current?.select()\n }\n }\n\n const handleHourBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const raw = e.currentTarget.value.replace(/\\D/g, \"\").slice(0, 2)\n const h = Math.min(23, Number(raw) || 0)\n onChange(h, minute)\n setHourText(null)\n }\n\n const handleMinuteChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, \"\").slice(0, 2)\n setMinuteText(raw)\n if (raw.length === 2) {\n onChange(hour, Math.min(59, Number(raw)))\n }\n }\n\n const handleMinuteBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const raw = e.currentTarget.value.replace(/\\D/g, \"\").slice(0, 2)\n const m = Math.min(59, Number(raw) || 0)\n onChange(hour, m)\n setMinuteText(null)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, type: \"hour\" | \"minute\") => {\n const step = e.shiftKey ? 10 : 1\n if (e.key === \"ArrowUp\") {\n e.preventDefault()\n if (type === \"hour\") {\n const h = (hour + step) % 24\n onChange(h, minute)\n setHourText(String(h).padStart(2, \"0\"))\n } else {\n const m = (minute + step) % 60\n onChange(hour, m)\n setMinuteText(String(m).padStart(2, \"0\"))\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault()\n if (type === \"hour\") {\n const h = (hour - step + 24) % 24\n onChange(h, minute)\n setHourText(String(h).padStart(2, \"0\"))\n } else {\n const m = (minute - step + 60) % 60\n onChange(hour, m)\n setMinuteText(String(m).padStart(2, \"0\"))\n }\n }\n }\n\n return (\n <div className={s.TimeFooter}>\n <span className={s.TimeLabel}>Time</span>\n <div className={s.TimeInputGroup}>\n <input\n ref={hourRef}\n className={s.TimeField}\n type=\"text\"\n inputMode=\"numeric\"\n value={hourText ?? String(hour).padStart(2, \"0\")}\n onChange={handleHourChange}\n onBlur={handleHourBlur}\n onFocus={(e) => {\n setHourText(e.target.value)\n e.target.select()\n }}\n onKeyDown={(e) => handleKeyDown(e, \"hour\")}\n maxLength={2}\n aria-label=\"Hour\"\n />\n <span className={s.TimeSeparator}>:</span>\n <input\n ref={minuteRef}\n className={s.TimeField}\n type=\"text\"\n inputMode=\"numeric\"\n value={minuteText ?? String(minute).padStart(2, \"0\")}\n onChange={handleMinuteChange}\n onBlur={handleMinuteBlur}\n onFocus={(e) => {\n setMinuteText(e.target.value)\n e.target.select()\n }}\n onKeyDown={(e) => handleKeyDown(e, \"minute\")}\n maxLength={2}\n aria-label=\"Minute\"\n />\n </div>\n </div>\n )\n}\n\ntype CalendarViewProps = {\n date: DateTime\n selectedDate?: DateTime | null\n onDateSelect?: (dt: DateTime) => void\n min?: DateTime\n max?: DateTime\n stepPosition: number\n hideMonthLabel?: boolean\n}\n\nconst daysOfTheWeekLabels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\n\nconst CalendarView = ({\n date,\n selectedDate,\n min,\n max,\n onDateSelect,\n stepPosition,\n hideMonthLabel = false,\n}: CalendarViewProps) => {\n // Lock position on mount and don't respond to changes\n const [position] = useState(stepPosition)\n const { startOfMonth, weeks, enabledInterval } = useMemo(() => {\n const monthStart = date.startOf(\"month\")\n const endOfMonth = date.endOf(\"month\")\n\n const daysBeforeMonthStart = monthStart.weekday % 7\n const blankDays = new Array(daysBeforeMonthStart).fill(null)\n const daysInMonth = getDaysOfMonth(monthStart)\n const calendarCells = [...blankDays, ...daysInMonth]\n\n const enabledDateInterval = Interval.fromDateTimes(min || monthStart, max || endOfMonth)\n\n return {\n startOfMonth: monthStart,\n endOfMonth,\n weeks: chunkIntoWeeks(calendarCells, 7),\n enabledInterval: enabledDateInterval,\n }\n }, [date, min, max])\n\n return (\n <div\n className={s.Calendar}\n style={hideMonthLabel ? undefined : { left: position * STEP_DISTANCE_PX }}\n data-calendar\n data-static={hideMonthLabel ? \"\" : undefined}\n >\n {hideMonthLabel ? (\n <div className={s.MonthLabelSpacer} aria-hidden=\"true\" />\n ) : (\n <p className={s.MonthLabel}>\n {startOfMonth.monthLong} {startOfMonth.year}\n </p>\n )}\n <div className={s.Week}>\n {daysOfTheWeekLabels.map((day) => (\n <div key={day} className={s.DayLabel}>\n {day}\n </div>\n ))}\n </div>\n {weeks.map((week, weekIndex) => (\n <div className={s.Week} key={weekIndex}>\n {week.map((d, dayIndex) => {\n if (!d) {\n return <div className={s.Day} key={`${weekIndex}-${dayIndex}`} />\n }\n\n const enabled = enabledInterval.contains(d)\n const isSelected = enabled && selectedDate && isSameDay(d, selectedDate)\n const dayIsToday = isToday(d)\n\n return (\n <div className={s.Day} key={dayIndex} data-is-selected={isSelected ? \"\" : undefined}>\n <button\n type=\"button\"\n className={s.InteractiveDay}\n disabled={!enabled}\n onClick={() => d && onDateSelect?.(d)}\n >\n {d.day}\n {dayIsToday && <span className={s.TodayDot} />}\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )\n}\n"]}
|
|
@@ -214,38 +214,9 @@ background-color: var(--alpha-08);
|
|
|
214
214
|
gap: 2px;
|
|
215
215
|
height: 28px;
|
|
216
216
|
pointer-events: none;
|
|
217
|
-
}.
|
|
218
|
-
height: 28px;
|
|
219
|
-
padding: 0 18px 0 8px;
|
|
220
|
-
border: 0;
|
|
221
|
-
border-radius: var(--radius-sm);
|
|
222
|
-
-webkit-appearance: none;
|
|
223
|
-
-moz-appearance: none;
|
|
224
|
-
appearance: none;
|
|
225
|
-
background-color: transparent;
|
|
226
|
-
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' fill='none'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23999' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
|
|
227
|
-
background-position: right 4px center;
|
|
228
|
-
background-repeat: no-repeat;
|
|
229
|
-
color: var(--color-text);
|
|
230
|
-
cursor: pointer;
|
|
231
|
-
font-size: 13px;
|
|
232
|
-
font-weight: var(--font-weight-semibold);
|
|
217
|
+
}.DropdownCaption > * {
|
|
233
218
|
pointer-events: auto;
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
@media (hover: hover) and (pointer: fine) {.DropdownSelect:hover, :where([data-theme="light"]) .DropdownSelect:hover {
|
|
238
|
-
background-color: var(--alpha-04);
|
|
239
|
-
}:where([data-theme="dark"]) .DropdownSelect:hover {
|
|
240
|
-
background-color: var(--alpha-06);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
.DropdownSelect:focus-visible {
|
|
245
|
-
border-radius: var(--radius-sm);
|
|
246
|
-
outline: 2px solid var(--color-focus-ring);
|
|
247
|
-
outline-offset: -2px;
|
|
248
|
-
}.TimeFooter {
|
|
219
|
+
}.TimeFooter {
|
|
249
220
|
display: flex;
|
|
250
221
|
align-items: center;
|
|
251
222
|
justify-content: space-between;
|
|
@@ -10,7 +10,7 @@ import { SelectControl } from "../SelectControl";
|
|
|
10
10
|
import { DateCalendar } from "./Calendar";
|
|
11
11
|
import { DateContext } from "./context";
|
|
12
12
|
export const DatePicker = (props) => {
|
|
13
|
-
const { id, value, onChange, min, max, side = "bottom", sideOffset = 8, align = "center", alignOffset, variant = "outline", size = "md", clearable = false, disabled = false, dropdownIconType, placeholder = "Select date...", pill = true, block = false, triggerClassName, triggerShowIcon = true, captionLayout = "buttons", showTime = false, yearRange, triggerDateFormat = showTime ? "MM/dd/yy HH:mm" : "MM/dd/yy", } = props;
|
|
13
|
+
const { id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, value, onChange, min, max, side = "bottom", sideOffset = 8, align = "center", alignOffset, variant = "outline", size = "md", clearable = false, disabled = false, dropdownIconType, placeholder = "Select date...", pill = true, block = false, triggerClassName, triggerShowIcon = true, captionLayout = "buttons", showTime = false, yearRange, triggerDateFormat = showTime ? "MM/dd/yy HH:mm" : "MM/dd/yy", } = props;
|
|
14
14
|
if (min && max && !isBefore(min, max)) {
|
|
15
15
|
throw new Error("DatePicker error: `min` date must be before the `max` date");
|
|
16
16
|
}
|
|
@@ -58,6 +58,6 @@ export const DatePicker = (props) => {
|
|
|
58
58
|
const handleClearClick = () => {
|
|
59
59
|
onChangeRef.current(null);
|
|
60
60
|
};
|
|
61
|
-
return (_jsx(DateContext, { value: store, children: _jsxs(Popover, { children: [_jsx(Popover.Trigger, { children: _jsx(SelectControl, { id: id, className: triggerClassName, selected: !!value, variant: variant, pill: pill, block: block, size: size, disabled: disabled, StartIcon: triggerShowIcon ? Calendar : undefined, dropdownIconType: dropdownIconType, onClearClick: clearable ? handleClearClick : undefined, children: value?.toFormat(triggerDateFormat) ?? placeholder }) }), _jsx(Popover.Content, { minWidth: 230, side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset ?? (align === "center" ? 0 : -5), children: _jsx(DateCalendar, {}) })] }) }));
|
|
61
|
+
return (_jsx(DateContext, { value: store, children: _jsxs(Popover, { children: [_jsx(Popover.Trigger, { children: _jsx(SelectControl, { id: id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy ? `${ariaLabelledBy} ${id}-value` : undefined, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, className: triggerClassName, selected: !!value, variant: variant, pill: pill, block: block, size: size, disabled: disabled, StartIcon: triggerShowIcon ? Calendar : undefined, dropdownIconType: dropdownIconType, onClearClick: clearable ? handleClearClick : undefined, children: ariaLabelledBy ? (_jsx("span", { id: `${id}-value`, children: value?.toFormat(triggerDateFormat) ?? placeholder })) : value?.toFormat(triggerDateFormat) ?? placeholder }) }), _jsx(Popover.Content, { minWidth: 230, side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset ?? (align === "center" ? 0 : -5), children: _jsx(DateCalendar, {}) })] }) }));
|
|
62
62
|
};
|
|
63
63
|
//# sourceMappingURL=DatePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,OAAO,EAA4B,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,aAAa,EAA2B,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,WAAW,EAAyB,MAAM,WAAW,CAAA;AAwH9D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAsB,EAAE,EAAE;IACnD,MAAM,EACJ,EAAE,EACF,KAAK,EACL,QAAQ,EACR,GAAG,EACH,GAAG,EACH,IAAI,GAAG,QAAQ,EACf,UAAU,GAAG,CAAC,EACd,KAAK,GAAG,QAAQ,EAChB,WAAW,EACX,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,KAAK,EACjB,QAAQ,GAAG,KAAK,EAChB,gBAAgB,EAChB,WAAW,GAAG,gBAAgB,EAC9B,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,KAAK,EACb,gBAAgB,EAChB,eAAe,GAAG,IAAI,EACtB,aAAa,GAAG,SAAS,EACzB,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,iBAAiB,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,GAC7D,GAAG,KAAK,CAAA;IAET,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAC/E,CAAC;IAED,qFAAqF;IACrF,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IAE5C,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,KAAK;QACL,GAAG;QACH,GAAG;QACH,OAAO;QACP,IAAI;QACJ,gBAAgB;QAChB,SAAS;QACT,QAAQ;QACR,WAAW;QACX,KAAK;QACL,IAAI;QACJ,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,aAAa;QACb,QAAQ;QACR,SAAS;QACT,WAAW;KACZ,CAAC,EACF;QACE,KAAK;QACL,GAAG;QACH,GAAG;QACH,OAAO;QACP,IAAI;QACJ,gBAAgB;QAChB,SAAS;QACT,QAAQ;QACR,WAAW;QACX,KAAK;QACL,IAAI;QACJ,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,aAAa;QACb,QAAQ;QACR,SAAS;QACT,WAAW;KACZ,CACF,CAAA;IAED,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC,CAAA;IAED,OAAO,CACL,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,YACvB,MAAC,OAAO,eACN,KAAC,OAAO,CAAC,OAAO,cACd,KAAC,aAAa,IACZ,EAAE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport { DateTime } from \"luxon\"\nimport { useMemo } from \"react\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { isBefore } from \"../../lib/dateUtils\"\nimport { Calendar } from \"../Icon\"\nimport { Popover, type PopoverContentProps } from \"../Popover\"\nimport { SelectControl, type SelectControlProps } from \"../SelectControl\"\nimport { DateCalendar } from \"./Calendar\"\nimport { DateContext, type DateContextValue } from \"./context\"\n\nexport type DatePickerProps = Pick<SelectControlProps, \"aria-label\" | \"aria-labelledby\" | \"aria-describedby\" | \"aria-invalid\"> & {\n /**\n * Allow targeting the input for forms and accessibility.\n */\n id: string\n /**\n * The selected date value.\n */\n value: DateTime | null\n /**\n * Handler that is triggered when the date changes.\n */\n onChange: (nextValue: DateTime | null) => void\n /**\n * Defines the earliest selectable date (inclusive).\n */\n min?: DateTime\n /**\n * Defines the latest selectable date (inclusive).\n */\n max?: DateTime\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: PopoverContentProps[\"side\"]\n /**\n * The distance in pixels from the trigger.\n * @default 8\n */\n sideOffset?: PopoverContentProps[\"sideOffset\"]\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: PopoverContentProps[\"align\"]\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: PopoverContentProps[\"alignOffset\"]\n\n /**\n * Disables the select visually and from interactions\n * @default false\n */\n disabled?: boolean\n /**\n * Placeholder text for the select\n * @default Select date...\n */\n placeholder?: string\n /**\n * Style variant for the select trigger\n * @default outline\n */\n variant?: SelectControlProps[\"variant\"]\n /**\n * Determines if the select trigger should be a fully rounded pill shape\n * @default false\n */\n pill?: boolean\n /**\n * Determines size of the size and spacing of the control.\n *\n * | 3xs | 2xs | xs | sm | md | lg | xl | 2xl | 3xl |\n * | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |\n * | `22px` | `24px` | `26px` | `28px` | `32px` | `36px` | `40px` | `44px` | `48px` |\n * @default md\n */\n size?: SelectControlProps[\"size\"]\n /**\n * Icon displayed in the far right of the select trigger\n * @default dropdown\n */\n dropdownIconType?: SelectControlProps[\"dropdownIconType\"]\n /**\n * Custom class applied to the select trigger\n */\n triggerClassName?: string\n /**\n * Display calendar icon at the start of the trigger\n * @default true\n */\n triggerShowIcon?: boolean\n /**\n * Format of dates displayed in the trigger\n */\n triggerDateFormat: string\n /**\n * Display a clear action that allows the select to be unset.\n * @default false\n */\n clearable?: boolean\n /**\n * Extends select to 100% of available width.\n * @default true\n */\n block?: boolean\n /**\n * Controls how the calendar header is rendered.\n * - `\"buttons\"` — Arrow navigation between months (default)\n * - `\"dropdown\"` — Month and year dropdown selects (ideal for date of birth)\n * @default buttons\n */\n captionLayout?: \"buttons\" | \"dropdown\"\n /**\n * Show time input below the calendar for combined date and time selection.\n * @default false\n */\n showTime?: boolean\n /**\n * Range of selectable years when `captionLayout` is `\"dropdown\"`.\n * @default [currentYear - 120, currentYear]\n */\n yearRange?: [number, number]\n}\n\nexport const DatePicker = (props: DatePickerProps) => {\n const {\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n value,\n onChange,\n min,\n max,\n side = \"bottom\",\n sideOffset = 8,\n align = \"center\",\n alignOffset,\n variant = \"outline\",\n size = \"md\",\n clearable = false,\n disabled = false,\n dropdownIconType,\n placeholder = \"Select date...\",\n pill = true,\n block = false,\n triggerClassName,\n triggerShowIcon = true,\n captionLayout = \"buttons\",\n showTime = false,\n yearRange,\n triggerDateFormat = showTime ? \"MM/dd/yy HH:mm\" : \"MM/dd/yy\",\n } = props\n\n if (min && max && !isBefore(min, max)) {\n throw new Error(\"DatePicker error: `min` date must be before the `max` date\")\n }\n\n // Create stable, mutable references to avoid memoization requirements from consumers\n const onChangeRef = useLatestValue(onChange)\n\n const store = useMemo<DateContextValue>(\n () => ({\n value,\n min,\n max,\n variant,\n size,\n dropdownIconType,\n clearable,\n disabled,\n placeholder,\n block,\n pill,\n triggerClassName,\n triggerShowIcon,\n triggerDateFormat,\n captionLayout,\n showTime,\n yearRange,\n onChangeRef,\n }),\n [\n value,\n min,\n max,\n variant,\n size,\n dropdownIconType,\n clearable,\n disabled,\n placeholder,\n block,\n pill,\n triggerClassName,\n triggerShowIcon,\n triggerDateFormat,\n captionLayout,\n showTime,\n yearRange,\n onChangeRef,\n ],\n )\n\n const handleClearClick = () => {\n onChangeRef.current(null)\n }\n\n return (\n <DateContext value={store}>\n <Popover>\n <Popover.Trigger>\n <SelectControl\n id={id}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ? `${ariaLabelledBy} ${id}-value` : undefined}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n className={triggerClassName}\n selected={!!value}\n variant={variant}\n pill={pill}\n block={block}\n size={size}\n disabled={disabled}\n StartIcon={triggerShowIcon ? Calendar : undefined}\n dropdownIconType={dropdownIconType}\n onClearClick={clearable ? handleClearClick : undefined}\n >\n {ariaLabelledBy ? (\n <span id={`${id}-value`}>{value?.toFormat(triggerDateFormat) ?? placeholder}</span>\n ) : value?.toFormat(triggerDateFormat) ?? placeholder}\n </SelectControl>\n </Popover.Trigger>\n <Popover.Content\n minWidth={230}\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset ?? (align === \"center\" ? 0 : -5)}\n >\n <DateCalendar />\n </Popover.Content>\n </Popover>\n </DateContext>\n )\n}\n"]}
|
|
@@ -34,7 +34,7 @@ const DefaultMultiTriggerView = ({ values, selectedAll, }) => {
|
|
|
34
34
|
return _jsx(_Fragment, { children: displayValue });
|
|
35
35
|
};
|
|
36
36
|
export const Select = (props) => {
|
|
37
|
-
const { id, required, value, name, multiple, variant = "outline", size = "md", dropdownIconType = "dropdown", loading = false, clearable = false, disabled = false, placeholder = "Select...", loadingPlaceholder = "Loading...", pill = false, listWidth, options, actions: propActions = [], side = "bottom", avoidCollisions = true, onChange, optionClassName, OptionView = DefaultOptionView, TriggerStartIcon, triggerClassName, opticallyAlign, TriggerView: TriggerViewFromProps, searchPlaceholder = "", searchPredicate = defaultSearchPredicate, searchEmptyMessage = "No results found.", listMaxWidth = "auto", trigger, checkPosition = 'start', } = props;
|
|
37
|
+
const { id, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, required, value, name, multiple, variant = "outline", size = "md", dropdownIconType = "dropdown", loading = false, clearable = false, disabled = false, placeholder = "Select...", loadingPlaceholder = "Loading...", pill = false, listWidth, options, actions: propActions = [], side = "bottom", avoidCollisions = true, onChange, optionClassName, OptionView = DefaultOptionView, TriggerStartIcon, triggerClassName, opticallyAlign, TriggerView: TriggerViewFromProps, searchPlaceholder = "", searchPredicate = defaultSearchPredicate, searchEmptyMessage = "No results found.", listMaxWidth = "auto", trigger, checkPosition = 'start', } = props;
|
|
38
38
|
// Block default is dynamic, based on `variant`
|
|
39
39
|
const block = props.block ?? variant !== "ghost";
|
|
40
40
|
// Align default is dynamic, based on `block`
|
|
@@ -105,6 +105,10 @@ export const Select = (props) => {
|
|
|
105
105
|
...dynamicContextProps,
|
|
106
106
|
triggerId,
|
|
107
107
|
id,
|
|
108
|
+
"aria-label": ariaLabel,
|
|
109
|
+
"aria-labelledby": ariaLabelledBy,
|
|
110
|
+
"aria-describedby": ariaDescribedBy,
|
|
111
|
+
"aria-invalid": ariaInvalid,
|
|
108
112
|
// Forward props
|
|
109
113
|
name,
|
|
110
114
|
required,
|
|
@@ -145,6 +149,10 @@ export const Select = (props) => {
|
|
|
145
149
|
dynamicContextProps,
|
|
146
150
|
triggerId,
|
|
147
151
|
id,
|
|
152
|
+
ariaLabel,
|
|
153
|
+
ariaLabelledBy,
|
|
154
|
+
ariaDescribedBy,
|
|
155
|
+
ariaInvalid,
|
|
148
156
|
required,
|
|
149
157
|
name,
|
|
150
158
|
options,
|
|
@@ -186,7 +194,7 @@ export const Select = (props) => {
|
|
|
186
194
|
_jsx(SelectContext.Provider, { value: store, children: _jsx(CustomSelect, {}) }));
|
|
187
195
|
};
|
|
188
196
|
export const SelectTrigger = (props) => {
|
|
189
|
-
const { triggerId, id, required, value, multiple, options, loading, disabled, clearable, name, variant, pill, size, dropdownIconType, placeholder, loadingPlaceholder, block, opticallyAlign, triggerClassName, TriggerStartIcon, TriggerView, onSelectRef, } = useSelectContext();
|
|
197
|
+
const { triggerId, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, id, required, value, multiple, options, loading, disabled, clearable, name, variant, pill, size, dropdownIconType, placeholder, loadingPlaceholder, block, opticallyAlign, triggerClassName, TriggerStartIcon, TriggerView, onSelectRef, } = useSelectContext();
|
|
190
198
|
const { onOpenChange,
|
|
191
199
|
// pass along props from Radix
|
|
192
200
|
...restProps } = props;
|
|
@@ -238,7 +246,7 @@ export const SelectTrigger = (props) => {
|
|
|
238
246
|
// Ensure open state is closed
|
|
239
247
|
onOpenChange?.(false);
|
|
240
248
|
};
|
|
241
|
-
return (_jsxs(SelectControl, { id: triggerId, className: triggerClassName, selected: !isPlaceholder, variant: variant, pill: pill, block: block, size: size, disabled: disabled, loading: loading, StartIcon: TriggerStartIcon, opticallyAlign: opticallyAlign, dropdownIconType: dropdownIconType, onClearClick: clearable ? handleClearClick : undefined, onInteract: onOpenChange, onKeyDown: handleKeyDown, ...restProps, children: [multiple ? _jsx(TriggerView, { ...multipleTriggerViewProps }) : _jsx(TriggerView, { ...selectedItem }), (name || id) && (_jsx("input", { id: id, name: name, value: firstValue, tabIndex: -1, onFocus: () => {
|
|
249
|
+
return (_jsxs(SelectControl, { id: triggerId, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy ? `${ariaLabelledBy} ${triggerId}-value` : undefined, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, className: triggerClassName, selected: !isPlaceholder, variant: variant, pill: pill, block: block, size: size, disabled: disabled, loading: loading, StartIcon: TriggerStartIcon, opticallyAlign: opticallyAlign, dropdownIconType: dropdownIconType, onClearClick: clearable ? handleClearClick : undefined, onInteract: onOpenChange, onKeyDown: handleKeyDown, ...restProps, children: [ariaLabelledBy ? (_jsx("span", { id: `${triggerId}-value`, children: multiple ? _jsx(TriggerView, { ...multipleTriggerViewProps }) : _jsx(TriggerView, { ...selectedItem }) })) : multiple ? _jsx(TriggerView, { ...multipleTriggerViewProps }) : _jsx(TriggerView, { ...selectedItem }), (name || id) && (_jsx("input", { id: id, name: name, value: firstValue, tabIndex: -1, onFocus: () => {
|
|
242
250
|
document.getElementById(triggerId)?.focus();
|
|
243
251
|
},
|
|
244
252
|
// keep react from complaining - don't make this readOnly because that
|
|
@@ -283,7 +291,7 @@ const CustomSelect = () => {
|
|
|
283
291
|
return;
|
|
284
292
|
}
|
|
285
293
|
handleOpenChange(nextState);
|
|
286
|
-
}, modal: false, children: [_jsx(Popover.Trigger, { asChild: true, children: trigger ? trigger({ open, onToggle: () =>
|
|
294
|
+
}, modal: false, children: [_jsx(Popover.Trigger, { asChild: true, children: trigger ? trigger({ open, onToggle: () => setOpen((current) => !current) }) : _jsx(SelectTrigger, { onOpenChange: handleOpenChange }) }), _jsx(Popover.Portal, { forceMount: true, children: _jsx(TransitionGroup, { className: s.Menu, enterDuration: 350, exitDuration: 200, disableAnimations: true, children: open && (_jsx(Popover.Content, { ref: selectContentRef, forceMount: true, className: s.MenuList, side: side, sideOffset: 5, align: align, alignOffset: alignOffset, avoidCollisions: avoidCollisions, collisionPadding: { bottom: 30, top: 30 },
|
|
287
295
|
// Prevent Radix auto focus so we can handle our own from within <CustomSelectMenu />
|
|
288
296
|
onOpenAutoFocus: preventDefaultHandler,
|
|
289
297
|
// Radix waits until the animation completes before directing focus, which is janky.
|
|
@@ -316,8 +324,8 @@ const CustomSelectMenu = ({ onOpenChange }) => {
|
|
|
316
324
|
const internalListId = useId();
|
|
317
325
|
const listId = `select-list-${internalListId}`;
|
|
318
326
|
// Lock `value` for a given open to prevent janky change during close animation
|
|
319
|
-
//
|
|
320
|
-
const
|
|
327
|
+
// MultiSelect reads its live selection instead of this per-open snapshot.
|
|
328
|
+
const [openingValue] = useState(() => multiple ? "" : value);
|
|
321
329
|
// Trim and lowercase search value
|
|
322
330
|
const literalSearchTerm = useMemo(() => searchTerm.trim().toLocaleLowerCase(), [searchTerm]);
|
|
323
331
|
const filteredOptions = useMemo(() => filterOptions(options, literalSearchTerm, searchPredicateRef.current), [options, literalSearchTerm, searchPredicateRef]);
|
|
@@ -448,7 +456,7 @@ const CustomSelectMenu = ({ onOpenChange }) => {
|
|
|
448
456
|
}
|
|
449
457
|
};
|
|
450
458
|
const store = useMemo(() => ({
|
|
451
|
-
|
|
459
|
+
openingValue,
|
|
452
460
|
listId,
|
|
453
461
|
highlightedValue,
|
|
454
462
|
setHighlightedValue,
|
|
@@ -457,7 +465,7 @@ const CustomSelectMenu = ({ onOpenChange }) => {
|
|
|
457
465
|
setSearchTerm,
|
|
458
466
|
searchInputRef,
|
|
459
467
|
listRef,
|
|
460
|
-
}), [listId, highlightedValue, setHighlightedValue, searchTerm, setSearchTerm]);
|
|
468
|
+
}), [openingValue, listId, highlightedValue, setHighlightedValue, searchTerm, setSearchTerm]);
|
|
461
469
|
// On mount behavior
|
|
462
470
|
useEffect(() => {
|
|
463
471
|
// Ensure initial highlighted option is in view
|
|
@@ -588,12 +596,11 @@ const CustomSelectExpandableLimit = ({ value, label, onPointerUp, }) => {
|
|
|
588
596
|
const INTERNAL_DOM_SELECTION_DATA_ATTR = "data-option-id";
|
|
589
597
|
const CustomSelectOption = (option) => {
|
|
590
598
|
const { optionClassName, OptionView, value: propsValue, multiple, onSelectRef, checkPosition, } = useSelectContext();
|
|
591
|
-
const {
|
|
599
|
+
const { openingValue, requestCloseRef, highlightedValue, setHighlightedValue } = useCustomSelectMenuContext();
|
|
592
600
|
const { value, disabled, tooltip } = option;
|
|
593
|
-
// NOTE: SingleSelect mode
|
|
601
|
+
// NOTE: SingleSelect mode keeps the opening value instead of the live `propsValue`
|
|
594
602
|
// to avoid selecting the item as the select closes.
|
|
595
|
-
const
|
|
596
|
-
const isSelected = multiple ? propsValue.includes(value) : value === currentValue;
|
|
603
|
+
const isSelected = multiple ? propsValue.includes(value) : value === openingValue;
|
|
597
604
|
const isHighlighted = value === highlightedValue;
|
|
598
605
|
const handlePointerUp = () => {
|
|
599
606
|
if (multiple) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../../src/components/Select/Select.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport clsx from \"clsx\"\nimport { Popover } from \"radix-ui\"\nimport React, {\n createContext,\n type ReactNode,\n use,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { useEscCloseStack } from \"../../hooks/useEscCloseStack\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { preventDefaultHandler, toCssVariables, waitForAnimationFrame } from \"../../lib/helpers\"\nimport { Check, Info, Search } from \"../Icon\"\nimport { Input } from \"../Input\"\nimport { SelectControl, type SelectControlProps } from \"../SelectControl\"\nimport { Tooltip } from \"../Tooltip\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Select.module.css\"\n\nexport type Option<T extends string = string> = {\n value: T\n label: string\n /** Disable the option */\n disabled?: boolean\n /** Displayed as secondary text below the option `label` */\n description?: React.ReactNode\n tooltip?: {\n content: React.ReactNode\n maxWidth?: number\n }\n}\n\nexport type OptionGroup<T extends Option> = {\n label: string\n options: T[]\n optionsLimit?: {\n label: string\n limit: number\n }\n}\n\nexport type Options<T extends Option> = T[] | OptionGroup<T>[]\n\ntype CallbackWithOption<T extends Option> = (option: T) => void\ntype CallbackWithOptions<T extends Option> = (options: T[]) => void\ntype CallbackWithActionId = (actionId: string) => void\ntype SearchPredicate<T extends Option> = (option: T, searchTerm: string) => boolean\n\ntype Action = {\n /** Unique ID to identify the action with */\n id: string\n /** Label display for the action */\n label: string\n /** Icon displayed to the left of the action */\n Icon?: React.ComponentType<React.SVGProps<SVGSVGElement>>\n /** Custom class applied to the action container */\n className?: string\n /** Callback invoked when the action is pressed */\n onSelect: CallbackWithActionId\n}\n\ntype Actions = Action[]\n\nexport type PopoverSide = \"top\" | \"bottom\"\nexport type PopoverAlign = \"start\" | \"center\" | \"end\"\n\ntype SingleSelectProps<T extends Option> = {\n /**\n * Determines if the select should support multiple selection\n * @default false\n */\n multiple?: false\n value: string\n onChange: CallbackWithOption<T>\n /**\n * Customize the rendered output of the trigger\n * NOTE: Must be passed as a stable reference, not created inline.\n */\n TriggerView?: React.FC<T>\n}\n\ntype MultiSelectTriggerViewProps<T extends Option> = {\n values: T[]\n selectedAll: boolean\n}\n\ntype MultiSelectProps<T extends Option> = {\n /**\n * Determines if the select should support multiple selection\n * @default false\n */\n multiple: true\n value: string[]\n onChange: CallbackWithOptions<T>\n /**\n * Customize the rendered output of the trigger\n * NOTE: Must be passed as a stable reference, not created line.\n */\n TriggerView?: React.FC<MultiSelectTriggerViewProps<T>>\n}\n\nexport type SelectProps<T extends Option> = (SingleSelectProps<T> | MultiSelectProps<T>) & {\n options: Options<T> // Should be passed as a stable reference\n /**\n * Disables the select visually and from interactions\n * @default false\n */\n disabled?: boolean\n /**\n * Allows the select to be targeted with htmlFor\n */\n id?: string\n /**\n * Marks the select as a required field when using native form submission\n */\n required?: boolean\n /**\n * Creates the ability to query the value with `[name=\"${name}\"]`\n */\n name?: string\n /**\n * Placeholder text for the select\n * @default Select...\n */\n placeholder?: string\n /**\n * Placeholder text for the select while loading. Behaves exactly like `placeholder`, and `value` will be shown if provided.\n * @default Loading...\n */\n loadingPlaceholder?: string\n /**\n * Displays loading indicator on top of button contents\n * @default false\n */\n loading?: boolean\n /**\n * Style variant for the select trigger\n * @default outline\n */\n variant?: SelectControlProps[\"variant\"]\n /**\n * Determines if the select trigger should be a fully rounded pill shape\n * @default false\n */\n pill?: boolean\n /**\n * Controls size of the select trigger, and several other aspects of trigger styling.\n *\n * | 3xs | 2xs | xs | sm | md | lg | xl | 2xl | 3xl |\n * | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |\n * | `22px` | `24px` | `26px` | `28px` | `32px` | `36px` | `40px` | `44px` | `48px` |\n * @default md\n */\n size?: SelectControlProps[\"size\"]\n /**\n * Icon displayed in the far right of the select trigger\n * @default dropdown\n */\n dropdownIconType?: SelectControlProps[\"dropdownIconType\"]\n /**\n * Actions to display below the options list.\n */\n actions?: Actions // Memoized by length, don't assume dynamic changes are supported\n /** Custom class applied to option containers */\n optionClassName?: string\n /**\n * Customize the rendered output of individual options\n * NOTE: Must be passed as a stable reference, not created line.\n */\n OptionView?: React.FC<T>\n /** Icon displayed at the start of the select trigger */\n TriggerStartIcon?: SelectControlProps[\"StartIcon\"]\n /**\n * Custom class applied to the select trigger\n */\n triggerClassName?: string // If consumers need deep customization of the trigger\n /**\n * Applies a negative margin using the current gutter to optically align the trigger\n * with surrounding content.\n */\n opticallyAlign?: \"start\" | \"end\"\n /**\n * Display a clear action that allows the select to be unset.\n * @default false\n */\n clearable?: boolean\n /**\n * Extends select to 100% of available width.\n * @default true\n */\n block?: boolean\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: PopoverSide\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: PopoverAlign\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: number\n /**\n * Prevents collision detection in the custom menu. Use with caution.\n * @default true\n */\n avoidCollisions?: boolean\n /**\n * Set the width of the custom select menu\n * @default auto\n */\n listWidth?: number | \"auto\"\n /**\n * Defines the `min-width` property of the custom select menu, in pixels.\n * @default auto\n */\n listMinWidth?: number | \"auto\"\n /**\n * Defines the `max-width` property of the custom select menu, in pixels.\n * @default auto\n */\n listMaxWidth?: number | \"auto\"\n /** Predicate used to filter searches */\n searchPredicate?: SearchPredicate<T>\n /** Placeholder of the search input */\n searchPlaceholder?: string\n /**\n * Message displayed when search results are empty. Can be a simple string, or custom JSX.\n */\n searchEmptyMessage?: ReactNode\n /**\n * Render a custom trigger element instead of the default `SelectControl`.\n * Receives open state and a toggle callback. The returned element is wrapped\n * in a Radix `Popover.Trigger`.\n *\n * NOTE: Must be passed as a stable reference, not created inline.\n */\n /**\n * Position of the check indicator in the option list\n * @default start\n */\n checkPosition?: 'start' | 'end'\n trigger?: (props: { open: boolean; onToggle: () => void }) => ReactNode\n}\n\ntype SingleSelectContextValue<T extends Option> = {\n multiple: false\n value: string\n TriggerView: React.FC<T>\n}\n\ntype MultiSelectContextValue<T extends Option> = {\n multiple: true\n value: string[]\n TriggerView: React.FC<MultiSelectTriggerViewProps<T>>\n}\n\ntype SelectContextValue<T extends Option> = (\n | SingleSelectContextValue<T>\n | MultiSelectContextValue<T>\n) & {\n triggerId: string\n // Props\n name?: string\n id?: string\n required?: boolean\n options: Options<T>\n disabled: boolean\n variant: SelectControlProps[\"variant\"]\n pill: boolean\n size: SelectControlProps[\"size\"]\n dropdownIconType: SelectControlProps[\"dropdownIconType\"]\n loading: boolean\n clearable: boolean\n placeholder: string\n loadingPlaceholder: string\n searchEmptyMessage: ReactNode\n searchPlaceholder: string\n TriggerStartIcon?: SelectControlProps[\"StartIcon\"]\n triggerClassName?: string\n opticallyAlign?: \"start\" | \"end\"\n optionClassName?: string\n OptionView: React.FC<T>\n actions: Actions\n onActionSelect: CallbackWithActionId\n block: boolean\n side: PopoverSide\n align: PopoverAlign\n alignOffset: number\n avoidCollisions: boolean\n listWidth?: number | \"auto\" // Default when not passed is to match the width of the trigger\n listMinWidth: number | \"auto\"\n listMaxWidth?: number | \"auto\"\n // References\n onSelectRef: React.MutableRefObject<(option: T, removeOption?: boolean) => void>\n searchPredicateRef: React.MutableRefObject<SearchPredicate<T>>\n // Derived\n searchable: boolean\n checkPosition: 'start' | 'end'\n // Custom trigger\n trigger?: (props: { open: boolean; onToggle: () => void }) => ReactNode\n}\n\nconst SelectContext = createContext<SelectContextValue<Option> | null>(null)\n\nconst useSelectContext = () => {\n const context = use(SelectContext)\n\n if (!context) {\n throw new Error(\"Select components must be wrapped in <Select />\")\n }\n\n return context\n}\n\nconst DefaultOptionView = ({ label }: { label: string }) => <>{label}</>\nconst DefaultSingleTriggerView = ({ label }: { label: string }) => <>{label}</>\nconst DefaultMultiTriggerView = <T extends Option>({\n values,\n selectedAll,\n}: MultiSelectTriggerViewProps<T>) => {\n const displayValue = selectedAll\n ? \"All selected\"\n : values.length === 0\n ? // NOTE: Zero length is impossible - an empty option with `placeholder` is always returned\n \"Select...\"\n : values.length === 1\n ? values[0].label\n : `${values.length} selected`\n\n return <>{displayValue}</>\n}\n\nexport const Select = <T extends Option>(props: SelectProps<T>) => {\n const {\n id,\n required,\n value,\n name,\n multiple,\n variant = \"outline\",\n size = \"md\",\n dropdownIconType = \"dropdown\",\n loading = false,\n clearable = false,\n disabled = false,\n placeholder = \"Select...\",\n loadingPlaceholder = \"Loading...\",\n pill = false,\n listWidth,\n options,\n actions: propActions = [],\n side = \"bottom\",\n avoidCollisions = true,\n onChange,\n optionClassName,\n OptionView = DefaultOptionView,\n TriggerStartIcon,\n triggerClassName,\n opticallyAlign,\n TriggerView: TriggerViewFromProps,\n searchPlaceholder = \"\",\n searchPredicate = defaultSearchPredicate,\n searchEmptyMessage = \"No results found.\",\n listMaxWidth = \"auto\",\n trigger,\n checkPosition = 'start',\n } = props\n // Block default is dynamic, based on `variant`\n const block = props.block ?? variant !== \"ghost\"\n // Align default is dynamic, based on `block`\n const align = props.align ?? (block ? \"center\" : \"start\")\n const alignOffset = props.alignOffset ?? (align === \"center\" ? 0 : -5)\n // Default to \"auto\" for block selects and 300 for inline selects.\n const listMinWidth = props.listMinWidth ?? (block ? \"auto\" : 300)\n\n // Create stable, mutable references to avoid memoization requirements from consumers\n const onSelectRef = useLatestValue((selectedOption: T, removeOption?: boolean) => {\n if (multiple) {\n // When clearing values, the value is an\n if (!selectedOption.value) {\n onChange([])\n return\n }\n\n if (removeOption) {\n const nextValues = value.filter((v) => v !== selectedOption.value)\n const currentSelectedOptions = getOptionsByValues(options, nextValues)\n onChange(currentSelectedOptions)\n } else {\n const currentSelectedOptions = getOptionsByValues(options, value)\n onChange(currentSelectedOptions.concat(selectedOption))\n }\n } else {\n onChange(selectedOption)\n }\n })\n\n const searchPredicateRef = useRef<SearchPredicate<T>>(searchPredicate)\n searchPredicateRef.current = searchPredicate\n\n // It should be exceedingly uncommon to change actions dynamically, and they are unlikely to be a stable array reference from consumers\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Intentionally limiting when this stable value changes to length of actions\n const actions = useMemo<Actions>(() => propActions, [propActions.length])\n // We need to ensure that when action callbacks are called, we have fresh function references, even if the other action details did not change.\n const propActionsRef = useRef<Actions>(propActions)\n propActionsRef.current = propActions\n const onActionSelect = useCallback<CallbackWithActionId>((actionId: string) => {\n propActionsRef.current.find((a) => a.id === actionId)?.onSelect(actionId)\n }, [])\n\n // Determine when custom selects should be used\n const optionsCount = useMemo(\n () =>\n isOptionGroupArray(options)\n ? options.reduce((acc: number, group) => {\n return acc + group.options.length\n }, 0)\n : options.length,\n [options],\n )\n\n // Using ID for DOM selection instead of passing around and merging a ref. Pick your poison.\n const internalTriggerId = useId()\n const triggerId = `select-trigger-${internalTriggerId}`\n\n // Locking down searchable count to a single value. Could make this customizable in the future, but would want guardrails.\n const searchable = optionsCount > 15\n\n // Narrow known values for context\n const dynamicContextProps = useMemo<\n SingleSelectContextValue<T> | MultiSelectContextValue<T>\n >(() => {\n if (multiple) {\n return {\n multiple: true,\n value: value as string[],\n TriggerView: TriggerViewFromProps ?? DefaultMultiTriggerView,\n }\n }\n\n return {\n multiple: false,\n value: value as string,\n TriggerView: TriggerViewFromProps ?? DefaultSingleTriggerView,\n }\n }, [multiple, value, TriggerViewFromProps])\n\n const store = useMemo<SelectContextValue<T>>(\n () => ({\n ...dynamicContextProps,\n triggerId,\n id,\n // Forward props\n name,\n required,\n options,\n placeholder,\n loadingPlaceholder,\n loading,\n clearable,\n variant,\n pill,\n size,\n dropdownIconType,\n block,\n align,\n alignOffset,\n side,\n avoidCollisions,\n listWidth,\n listMinWidth,\n listMaxWidth,\n searchPlaceholder,\n searchEmptyMessage,\n TriggerStartIcon,\n triggerClassName,\n opticallyAlign,\n optionClassName,\n OptionView,\n actions,\n onActionSelect,\n onSelectRef,\n searchPredicateRef,\n // Derived state\n searchable,\n disabled,\n trigger,\n checkPosition,\n }),\n [\n dynamicContextProps,\n triggerId,\n id,\n required,\n name,\n options,\n placeholder,\n loadingPlaceholder,\n loading,\n clearable,\n variant,\n pill,\n size,\n dropdownIconType,\n block,\n align,\n alignOffset,\n side,\n avoidCollisions,\n listWidth,\n listMinWidth,\n listMaxWidth,\n searchPlaceholder,\n searchEmptyMessage,\n TriggerStartIcon,\n triggerClassName,\n opticallyAlign,\n optionClassName,\n OptionView,\n actions,\n onActionSelect,\n onSelectRef,\n searchable,\n disabled,\n trigger,\n checkPosition,\n ],\n )\n\n return (\n // NOTE: Cannot peacefully coerce SelectContextValue into a generic, so casting to any here.\n // This is safe because `store` is strongly typed above.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <SelectContext.Provider value={store as any}>\n <CustomSelect />\n </SelectContext.Provider>\n )\n}\n\n// ============================================================\n// Trigger\n// ============================================================\ntype SelectTriggerProps = {\n onOpenChange?: (maybeNextState?: boolean) => void\n tabIndex?: number\n [\"aria-hidden\"]?: \"false\" | \"true\"\n ref?: React.Ref<HTMLButtonElement | null>\n}\n\nexport const SelectTrigger = (props: SelectTriggerProps) => {\n const {\n triggerId,\n id,\n required,\n value,\n multiple,\n options,\n loading,\n disabled,\n clearable,\n name,\n variant,\n pill,\n size,\n dropdownIconType,\n placeholder,\n loadingPlaceholder,\n block,\n opticallyAlign,\n triggerClassName,\n TriggerStartIcon,\n TriggerView,\n onSelectRef,\n } = useSelectContext()\n const {\n onOpenChange,\n // pass along props from Radix\n ...restProps\n } = props\n const firstValue = multiple ? value[0] : value\n const placeholderValue = loading ? loadingPlaceholder : placeholder\n\n const selectedItem = useMemo<Option>(\n () =>\n getOptionByValue(options, firstValue) || {\n value: \"\",\n label: placeholderValue,\n },\n [firstValue, options, placeholderValue],\n )\n const hasSelectedValue = multiple ? value.length > 0 : !!value\n const isPlaceholder = loading || !hasSelectedValue\n\n const typeahead = useMemo(() => createTypeahead(), [])\n\n const multipleTriggerViewProps = useMemo<MultiSelectTriggerViewProps<Option>>(() => {\n if (!multiple) {\n return { values: [], selectedAll: false }\n }\n\n const currentSelectedOptions = getOptionsByValues(options, value)\n const flatOptions = options.flatMap((o) => (\"options\" in o ? o.options : o))\n\n return {\n values: currentSelectedOptions.length\n ? currentSelectedOptions\n : [\n {\n value: \"\",\n label: placeholderValue,\n },\n ],\n selectedAll: flatOptions.length <= value.length,\n }\n }, [multiple, options, value, placeholderValue])\n\n const handleKeyDown = (evt: React.KeyboardEvent<HTMLButtonElement>) => {\n const key = evt.key\n\n // If not a command, check for typeahead\n // NOTE: Typeahead not supported in multi-select\n if (!multiple && isValidTypeaheadChar(key)) {\n const currentTypeaheadValue = typeahead(key)\n // Stop other listeners from reacting\n evt.stopPropagation()\n\n // Attempt to filter options based on the value\n // NOTE: We don't look at current highlighted value as a means to start the search\n const firstMatchingOption = getTypeaheadOption(options, currentTypeaheadValue, firstValue)\n\n if (firstMatchingOption) {\n onSelectRef.current(firstMatchingOption)\n }\n }\n }\n\n const handleClearClick = () => {\n onSelectRef.current({ value: \"\", label: \"\" })\n // Ensure open state is closed\n onOpenChange?.(false)\n }\n\n return (\n <SelectControl\n id={triggerId}\n className={triggerClassName}\n selected={!isPlaceholder}\n variant={variant}\n pill={pill}\n block={block}\n size={size}\n disabled={disabled}\n loading={loading}\n StartIcon={TriggerStartIcon}\n opticallyAlign={opticallyAlign}\n dropdownIconType={dropdownIconType}\n onClearClick={clearable ? handleClearClick : undefined}\n onInteract={onOpenChange}\n onKeyDown={handleKeyDown}\n {...restProps}\n >\n {multiple ? <TriggerView {...multipleTriggerViewProps} /> : <TriggerView {...selectedItem} />}\n {(name || id) && (\n <input\n id={id}\n name={name}\n value={firstValue}\n tabIndex={-1}\n onFocus={() => {\n document.getElementById(triggerId)?.focus()\n }}\n // keep react from complaining - don't make this readOnly because that\n // prevents the value from being required\n onChange={() => {}}\n required={required}\n className=\"sr-only w-full h-0 left-0 bottom-0 pointer-events-none\"\n aria-hidden=\"true\"\n />\n )}\n </SelectControl>\n )\n}\n\n// ============================================================\n// Custom Select\n// ============================================================\nconst CustomSelect = () => {\n const {\n triggerId,\n loading,\n side,\n align,\n alignOffset,\n avoidCollisions,\n listWidth,\n listMinWidth,\n listMaxWidth,\n trigger,\n } = useSelectContext()\n const [open, setOpen] = useState<boolean>(false)\n const selectContentRef = useRef<HTMLDivElement>(null)\n\n const handleOpenChange = (maybeNextState?: boolean) => {\n // Toggle the current state when called without a specific state\n const nextState = maybeNextState === undefined ? !open : maybeNextState\n setOpen(nextState)\n\n // When we're closing, manage focus back to trigger manually\n if (!nextState) {\n // Wait until the next tick to determine if another element has become focused\n setTimeout(() => {\n // This should never happen because TransitionGroup should keep the select content in the DOM long\n // enough for this callback to run. However, in the event that the ref is null, not focusing is safer.\n if (!selectContentRef.current) {\n return\n }\n\n const activeElement = document.activeElement\n\n // Don't restore focus to the trigger if focus has moved outside of the select menu\n if (activeElement && !selectContentRef.current.contains(activeElement)) {\n return\n }\n\n document.getElementById(triggerId)?.focus()\n })\n }\n }\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n })\n\n return (\n <Popover.Root\n open={open}\n onOpenChange={(nextState) => {\n // Prevent opening while loading\n if (loading && nextState) {\n return\n }\n\n handleOpenChange(nextState)\n }}\n modal={false}\n >\n <Popover.Trigger asChild>\n {trigger ? trigger({ open, onToggle: () => handleOpenChange() }) : <SelectTrigger onOpenChange={handleOpenChange} />}\n </Popover.Trigger>\n <Popover.Portal forceMount>\n <TransitionGroup\n className={s.Menu}\n enterDuration={350}\n exitDuration={200}\n disableAnimations\n >\n {open && (\n <Popover.Content\n key=\"dropdown\"\n ref={selectContentRef}\n forceMount\n className={s.MenuList}\n side={side}\n sideOffset={5}\n align={align}\n alignOffset={alignOffset}\n avoidCollisions={avoidCollisions}\n collisionPadding={{ bottom: 30, top: 30 }}\n // Prevent Radix auto focus so we can handle our own from within <CustomSelectMenu />\n onOpenAutoFocus={preventDefaultHandler}\n // Radix waits until the animation completes before directing focus, which is janky.\n onCloseAutoFocus={preventDefaultHandler}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"select-list-width\": listWidth,\n \"select-list-min-width\": listMinWidth,\n \"select-list-max-width\": listMaxWidth,\n })}\n >\n <CustomSelectMenu onOpenChange={handleOpenChange} />\n </Popover.Content>\n )}\n </TransitionGroup>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\ntype CustomSelectMenuContextValue = {\n valueRef: React.RefObject<string | null>\n listId: string\n requestCloseRef: React.RefObject<() => void | null>\n listRef: React.RefObject<HTMLDivElement | null>\n // Highlighting\n highlightedValue: string\n setHighlightedValue: React.Dispatch<React.SetStateAction<string>>\n // Search\n searchTerm: string\n setSearchTerm: React.Dispatch<React.SetStateAction<string>>\n searchInputRef: React.RefObject<HTMLInputElement | null>\n}\n\nconst CustomSelectMenuContext = createContext<CustomSelectMenuContextValue | null>(null)\n\nconst useCustomSelectMenuContext = () => {\n const context = use(CustomSelectMenuContext)\n\n if (!context) {\n throw new Error(\"CustomSelectMenu components must be wrapped in <CustomSelectMenu />\")\n }\n\n return context\n}\n\ntype CustomSelectMenuProps = {\n onOpenChange: (maybeNextState?: boolean) => void\n}\n\nconst CustomSelectMenu = ({ onOpenChange }: CustomSelectMenuProps) => {\n const { multiple, value, options, searchable, searchPredicateRef } = useSelectContext()\n const requestCloseRef = useRef<() => void>(() => onOpenChange(false))\n const menuRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const searchInputRef = useRef<HTMLInputElement>(null)\n const [searchTerm, setSearchTerm] = useState(\"\")\n const [highlightedValue, setHighlightedValue] = useState<string>(() => {\n const selectedValue = multiple ? value[0] : value\n return (selectedValue || getFirstValidOption(options)?.value) ?? \"\"\n })\n const typeahead = useMemo(() => createTypeahead(), [])\n const internalListId = useId()\n const listId = `select-list-${internalListId}`\n\n // Lock `value` for a given open to prevent janky change during close animation\n // NOTE: This ref has no use in MultiSelect cases, set to empty string as a no-op\n const valueRef = useRef<string>(multiple ? \"\" : value)\n\n // Trim and lowercase search value\n const literalSearchTerm = useMemo(() => searchTerm.trim().toLocaleLowerCase(), [searchTerm])\n const filteredOptions = useMemo(\n () => filterOptions(options, literalSearchTerm, searchPredicateRef.current),\n [options, literalSearchTerm, searchPredicateRef],\n )\n const firstOption = useMemo(() => getFirstValidOption(filteredOptions), [filteredOptions])\n\n // Regrettable requirement for running an effect *after* mount\n const isMountStableRef = useRef<boolean>(false)\n\n const handleKeyDown = (evt: React.KeyboardEvent) => {\n const key = evt.key\n const firstValue = multiple ? value[0] : value\n const targetValue = highlightedValue || firstOption?.value || firstValue\n const isFocusedInSearch = document.activeElement === searchInputRef.current\n\n const menuElement = menuRef.current\n\n // Should be generally impossible for menuRef.current to not exist\n // unless we've unmounted and manage to fire this handler.\n if (!menuElement) {\n return\n }\n\n const triggerHighlightedOption = () => {\n const pointerUpEvent = new PointerEvent(\"pointerup\", {\n bubbles: true,\n cancelable: true,\n pointerType: \"mouse\",\n })\n\n // Find the current highlighted option\n const selectedOption = findOptionByValue(highlightedValue, menuElement)\n selectedOption?.dispatchEvent(pointerUpEvent)\n }\n\n const highlightOption = (val: string, element: Element) => {\n setHighlightedValue(val)\n element.scrollIntoView({ block: \"nearest\" })\n }\n\n const highlightSelectedOrFirstOption = () => {\n // Attempt to move highlight to selected item\n const maybeFirstValue = multiple ? value[0] : value\n\n if (maybeFirstValue) {\n const selectedElement = findOptionByValue(maybeFirstValue, menuElement)\n\n if (selectedElement) {\n highlightOption(maybeFirstValue, selectedElement)\n return\n }\n }\n\n // If value isn't set, or the selected node wasn't found in the DOM,\n // attempt to move focus to the first valid option.\n const firstValidOption = getFirstValidOption(options)\n\n if (firstValidOption) {\n const firstValidOptionElement = findOptionByValue(firstValidOption.value, menuElement)\n if (firstValidOptionElement) {\n highlightOption(firstValidOption.value, firstValidOptionElement)\n }\n }\n }\n\n // Commands\n switch (key) {\n case \"ArrowDown\": {\n evt.preventDefault()\n\n // If there's no highlighted value, or the highlighted value is not in the DOM\n if (!highlightedValue || !findOptionByValue(highlightedValue, menuElement)) {\n // Attempt to move highlight to selected item\n highlightSelectedOrFirstOption()\n\n // Short-circuit because we have no highlighted value to advance from\n return\n }\n\n // Otherwise, move to the next option\n const nextElement = findNextOption(highlightedValue, menuElement)\n const nextValue = nextElement?.getAttribute(\"data-option-id\")\n if (nextElement && nextValue) {\n highlightOption(nextValue, nextElement)\n }\n\n return\n }\n case \"ArrowUp\": {\n evt.preventDefault()\n\n // If there's no highlighted value, or the highlighted value is not in the DOM\n if (!highlightedValue || !findOptionByValue(highlightedValue, menuElement)) {\n // Attempt to move highlight to selected item\n highlightSelectedOrFirstOption()\n\n // Short-circuit because we have no highlighted value to advance from\n return\n }\n\n const previousElement = findPreviousOption(targetValue, menuElement)\n const previousValue = previousElement?.getAttribute(\"data-option-id\")\n if (previousElement && previousValue) {\n highlightOption(previousValue, previousElement)\n }\n\n return\n }\n case \"Enter\":\n // Prevent default enter behavior from the search input, if present\n evt.preventDefault()\n\n // Send a pointerDown event into the currently highlighted option\n triggerHighlightedOption()\n\n return\n case \" \":\n // Allow spaces in search, and don't treat as enter\n // if there is a valid literalSearchTerm.\n if (literalSearchTerm && isFocusedInSearch) {\n return\n }\n\n // Prevent space from entering search input\n evt.preventDefault()\n\n // Send a pointerDown event into the currently highlighted option\n triggerHighlightedOption()\n\n return\n default:\n break\n }\n\n // If not a command, check for typeahead\n if (isValidTypeaheadChar(key)) {\n // Skip typeahead logic when we're focused in the search input\n if (isFocusedInSearch) {\n return\n }\n\n // Extend the current typeahead and get the latest value\n const currentTypeaheadValue = typeahead(key)\n\n // Stop other listeners from reacting\n evt.stopPropagation()\n\n // Attempt to filter options based on the value, starting at the highlighted value\n const firstMatchingOption = getTypeaheadOption(\n options,\n currentTypeaheadValue,\n highlightedValue,\n )\n\n if (firstMatchingOption) {\n const matchedNode = findOptionByValue(firstMatchingOption.value, menuElement)\n\n // Only change the highlight if we found the actual node\n if (matchedNode) {\n setHighlightedValue(firstMatchingOption.value)\n // Ensure the newly highlighted option is scrolled into view\n matchedNode.scrollIntoView({ block: \"nearest\" })\n }\n }\n }\n }\n\n const store = useMemo(\n () => ({\n valueRef,\n listId,\n highlightedValue,\n setHighlightedValue,\n requestCloseRef,\n searchTerm,\n setSearchTerm,\n searchInputRef,\n listRef,\n }),\n [listId, highlightedValue, setHighlightedValue, searchTerm, setSearchTerm],\n )\n\n // On mount behavior\n useEffect(() => {\n // Ensure initial highlighted option is in view\n // NOTE: Allowing for a render frame ensures content is positioned correctly before scrolling it into view.\n waitForAnimationFrame(() => {\n if (!menuRef.current) {\n return\n }\n\n // Ensure the highlighted option is in view\n const currentOption = findOptionByValue(highlightedValue, menuRef.current)\n // Scroll the selected item into view, and its bottom edge.\n currentOption?.scrollIntoView({ block: \"center\" })\n })\n\n // Send initial focus to the menu container or search input, to capture key events\n const autoFocusTarget = searchInputRef.current || menuRef.current\n autoFocusTarget?.focus({ preventScroll: true })\n\n // Required for <StrictMode>, because we need to unset this token\n // when the hooks are re-run. It's an imperative effect that we need to manage.\n return () => {\n isMountStableRef.current = false\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Intentionally an onMount effect\n }, [])\n\n // On search behavior\n useLayoutEffect(() => {\n // This effect will run on mount, but we want to skip it.\n // The on mount effect is responsible for handling mount behavior,\n // but this effect is specifically responsible for handling search changes\n if (!isMountStableRef.current) {\n isMountStableRef.current = true\n return\n }\n\n // Impossible while mounted, list ref will exist\n if (!listRef.current) {\n return\n }\n\n // Reset scroll position to the top\n listRef.current.scrollTop = 0\n\n // Highlight first item in the list\n const maybeFirstOption = getFirstValidOption(filteredOptions)\n if (maybeFirstOption) setHighlightedValue(maybeFirstOption.value)\n }, [filteredOptions])\n\n return (\n <CustomSelectMenuContext value={store}>\n <div id={listId} className={s.MenuInner} onKeyDown={handleKeyDown} ref={menuRef} tabIndex={0}>\n {searchable && <CustomSelectSearch value={searchTerm} onChange={setSearchTerm} />}\n <CustomSelectList filteredOptions={filteredOptions} />\n <CustomSelectActions />\n </div>\n </CustomSelectMenuContext>\n )\n}\n\ntype CustomSelectSearchProps = {\n value: string\n onChange: (nextSearchTerm: string) => void\n}\n\nconst CustomSelectSearch = ({ value, onChange }: CustomSelectSearchProps) => {\n const { searchPlaceholder } = useSelectContext()\n const { listId, searchInputRef } = useCustomSelectMenuContext()\n\n const handleChange = (evt: React.ChangeEvent<HTMLInputElement>) => {\n onChange(evt.target.value)\n }\n\n return (\n <div className={s.Search}>\n <Input\n startAdornment={\n <Search\n width={16}\n height={16}\n className=\"fill-secondary\"\n fill=\"var(--color-text-secondary)\"\n />\n }\n ref={searchInputRef}\n value={value}\n placeholder={searchPlaceholder}\n onChange={handleChange}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n aria-autocomplete=\"list\"\n role=\"combobox\"\n aria-controls={listId}\n aria-expanded\n />\n </div>\n )\n}\n\nconst isOptionGroup = <T extends Option>(\n mixedOption: T | OptionGroup<T>,\n): mixedOption is OptionGroup<T> => {\n return \"options\" in mixedOption\n}\n\nconst isOptionGroupArray = <T extends Option>(arr: Options<T>): arr is OptionGroup<T>[] => {\n return arr[0] && isOptionGroup(arr[0])\n}\n\nconst HARD_OPTIONS_LIMIT = 300\n\nconst CustomSelectList = <T extends Option>({\n filteredOptions,\n}: {\n filteredOptions: Options<T>\n}) => {\n const { searchEmptyMessage } = useSelectContext()\n const { listRef } = useCustomSelectMenuContext()\n\n if (!filteredOptions.length) {\n return typeof searchEmptyMessage === \"string\" ? (\n <p className={s.SearchEmpty} data-text-only>\n {searchEmptyMessage}\n </p>\n ) : (\n <div className={s.SearchEmpty}>{searchEmptyMessage}</div>\n )\n }\n\n // We hard limit within groups, so at this level we will only limit flat arrays\n const isGrouped = isOptionGroupArray(filteredOptions)\n const hasHardLimit = !isGrouped && filteredOptions.length > HARD_OPTIONS_LIMIT\n\n const options = isGrouped\n ? filteredOptions.map((group) => <CustomSelectGroup key={group.label} {...group} />)\n : filteredOptions\n .slice(0, HARD_OPTIONS_LIMIT)\n .map((option) => <CustomSelectOption key={option.value} {...option} />)\n\n return (\n <div className={s.OptionsList} ref={listRef}>\n {options}\n {hasHardLimit && (\n <CustomSelectHardLimit numHidden={filteredOptions.length - HARD_OPTIONS_LIMIT} />\n )}\n </div>\n )\n}\n\nconst DEFAULT_OPTIONS_LIMIT = {\n limit: 100,\n label: \"Show all\",\n}\n\nconst CustomSelectGroup = <T extends Option>({\n label,\n options,\n optionsLimit = DEFAULT_OPTIONS_LIMIT,\n}: OptionGroup<T>) => {\n const groupId = useId()\n const { searchTerm, setHighlightedValue } = useCustomSelectMenuContext()\n const [limitExpanded, setLimitExpanded] = useState<boolean>(false)\n\n const hasExpandableLimit = optionsLimit.limit < options.length && !searchTerm && !limitExpanded\n const hasHardLimit = HARD_OPTIONS_LIMIT < options.length && !hasExpandableLimit\n\n let maybeLimitedOptions = options\n if (hasExpandableLimit) {\n maybeLimitedOptions = options.slice(0, optionsLimit.limit)\n } else if (hasHardLimit) {\n maybeLimitedOptions = options.slice(0, HARD_OPTIONS_LIMIT)\n }\n\n const handleLimitExpanded = () => {\n // Expand options\n setLimitExpanded(true)\n\n // Set highlight to the first option from the newly expanded list\n setHighlightedValue(options[optionsLimit.limit].value)\n }\n\n return (\n // NOTE: Important for crawling that groups are flat\n <>\n <div className={s.OptionGroupHeading}>\n <div className={s.OptionIndicatorSlot} />\n {label}\n </div>\n {maybeLimitedOptions.map((limitedOptions) => (\n <CustomSelectOption key={limitedOptions.value} {...limitedOptions} />\n ))}\n {hasExpandableLimit && (\n <CustomSelectExpandableLimit\n value={`group-limit-${groupId}`}\n label={optionsLimit.label}\n onPointerUp={handleLimitExpanded}\n />\n )}\n {hasHardLimit && <CustomSelectHardLimit numHidden={options.length - HARD_OPTIONS_LIMIT} />}\n </>\n )\n}\n\ntype CustomSelectHardLimitProps = {\n numHidden: number\n}\n\nconst CustomSelectHardLimit = ({ numHidden }: CustomSelectHardLimitProps) => {\n return (\n <div className={s.OptionHardLimitHeading}>\n <div className={s.OptionIndicatorSlot} />\n {`…and ${numHidden.toLocaleString()} more options. Use search to refine results further.`}\n </div>\n )\n}\n\ntype CustomSelectExpandableLimitProps = {\n value: string\n label: string\n onPointerUp: () => void\n}\n\nconst CustomSelectExpandableLimit = ({\n value,\n label,\n onPointerUp,\n}: CustomSelectExpandableLimitProps) => {\n const { highlightedValue, setHighlightedValue } = useCustomSelectMenuContext()\n\n const isHighlighted = value === highlightedValue\n\n const handlePointerMove = () => {\n if (isHighlighted) {\n return\n }\n\n setHighlightedValue(value)\n }\n\n const handlePointerLeave = () => {\n setHighlightedValue((currentHighlightedValue) => {\n // If the current value is not this one, don't do anything\n // Otherwise, clear the value, removing the active highlight on the menu.\n return currentHighlightedValue !== value ? currentHighlightedValue : \"\"\n })\n }\n\n // This component acts a LOT like an Option, but has enough bespoke behavior\n // that it cannot literally be one. We copy the important parts of Option for\n // keyboard navigation, UX, etc.\n return (\n <div\n className={clsx(s.Option, s.OptionsLimit)}\n data-option-id={value}\n data-highlight={isHighlighted ? \"\" : undefined}\n role=\"option\"\n aria-selected={isHighlighted}\n onPointerUp={onPointerUp}\n onPointerMove={handlePointerMove}\n onPointerLeave={handlePointerLeave}\n >\n <div className={clsx(s.PressableInner, s.OptionInner)}>\n <div className={s.OptionIndicatorSlot} />\n {label}\n </div>\n </div>\n )\n}\n\nconst INTERNAL_DOM_SELECTION_DATA_ATTR = \"data-option-id\"\n\nconst CustomSelectOption = (option: Option) => {\n const {\n optionClassName,\n OptionView,\n value: propsValue,\n multiple,\n onSelectRef,\n checkPosition,\n } = useSelectContext()\n const { valueRef, requestCloseRef, highlightedValue, setHighlightedValue } =\n useCustomSelectMenuContext()\n const { value, disabled, tooltip } = option\n\n // NOTE: SingleSelect mode looks at the ref instead of the live `propValue` intentionally\n // to avoid selecting the item as the select closes.\n const currentValue = valueRef.current\n const isSelected = multiple ? propsValue.includes(value) : value === currentValue\n const isHighlighted = value === highlightedValue\n\n const handlePointerUp = () => {\n if (multiple) {\n // Trigger the change ref, optionally as a remove\n onSelectRef.current(option, isSelected)\n } else {\n // Trigger the change ref\n onSelectRef.current(option)\n // Request the dropdown to close\n requestCloseRef.current?.()\n }\n }\n\n const handlePointerMove = () => {\n if (isHighlighted) {\n return\n }\n\n setHighlightedValue(value)\n }\n\n const handlePointerLeave = () => {\n setHighlightedValue((currentHighlightedValue) => {\n // If the current value is not this one, don't do anything\n // Otherwise, clear the value, removing the active highlight on the menu.\n return currentHighlightedValue !== value ? currentHighlightedValue : \"\"\n })\n }\n\n return (\n <div\n className={clsx(s.Option, optionClassName)}\n data-highlight={isHighlighted ? \"\" : undefined}\n role=\"option\"\n aria-selected={isHighlighted}\n data-selected={isSelected ? \"\" : undefined}\n // Internal attribute for selecting DOM nodes\n {...{ [INTERNAL_DOM_SELECTION_DATA_ATTR]: value }}\n // Allow options to behave like a native select, when you can open and select an item in a single click\n onPointerUp={disabled ? undefined : handlePointerUp}\n // Pointer move allows us to prevent contention from keyboard presses and a still mouse\n // which does trigger events like onMouseEnter, creating weird battles with mouse and keyboard focus.\n onPointerMove={disabled ? undefined : handlePointerMove}\n onPointerLeave={disabled ? undefined : handlePointerLeave}\n aria-disabled={disabled}\n data-disabled={disabled ? \"\" : undefined}\n >\n <div className={s.PressableInner}>\n {checkPosition === 'start' && (\n <div className={s.OptionIndicatorSlot} data-position=\"start\">\n {isSelected && <Check className={s.OptionCheck} />}\n </div>\n )}\n <div className={s.OptionLeading}>\n <div className={s.OptionInner}>\n <OptionView {...option} />\n {tooltip && (\n <Tooltip content={tooltip.content} maxWidth={tooltip.maxWidth} side=\"right\">\n <Info />\n </Tooltip>\n )}\n </div>\n {option.description && (\n <div className={clsx(s.OptionInner, s.OptionDescription)}>\n {option.description}\n </div>\n )}\n </div>\n {checkPosition === 'end' && (\n <div className={s.OptionIndicatorSlot} data-position=\"end\">\n {isSelected && <Check className={s.OptionCheck} />}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nconst CustomSelectActions = () => {\n const { actions } = useSelectContext()\n\n if (actions.length === 0) {\n return null\n }\n\n return (\n <div className={s.ActionsContainer}>\n {actions.map((action) => (\n <CustomSelectAction key={action.id} {...action} />\n ))}\n </div>\n )\n}\n\nconst CustomSelectAction = ({ id, label, Icon, className }: Action) => {\n const { onActionSelect } = useSelectContext()\n const { requestCloseRef } = useCustomSelectMenuContext()\n\n const handleKeyDown = (evt: React.KeyboardEvent<HTMLDivElement>) => {\n const key = evt.key\n\n switch (key) {\n case \"Tab\":\n // Allow tabbing to pass propagation as normal,\n // which bubbles up to the focus trap of Radix Popover\n break\n case \"Enter\":\n case \" \":\n evt.stopPropagation()\n handlePointerUp()\n break\n default:\n evt.stopPropagation()\n }\n }\n\n const handlePointerUp = () => {\n // Trigger the action's through our context helper, not the method on this action (it may be a stale reference)\n onActionSelect(id)\n // Request to close the dropdown\n requestCloseRef.current?.()\n }\n\n return (\n <div className={s.Action} onPointerUp={handlePointerUp} onKeyDown={handleKeyDown} tabIndex={0}>\n <div className={clsx(s.ActionInner, className)}>\n {Icon && <Icon role=\"presentation\" />}\n {label}\n </div>\n </div>\n )\n}\n\n// ============================================================\n// Utilities\n// ============================================================\nconst defaultSearchPredicate = (option: Option, searchTerm: string) =>\n option.label.toLowerCase().includes(searchTerm)\n\nconst filterOptions = <T extends Option>(\n options: Options<T>,\n searchTerm: string,\n searchIterator: SearchPredicate<T>,\n): Options<T> => {\n const searchValue = searchTerm.trim().toLocaleLowerCase()\n\n if (!searchValue) {\n return options\n }\n\n const filterOption = (option: T): boolean => searchIterator(option, searchValue)\n\n if (isOptionGroupArray(options)) {\n return options.reduce((acc, group) => {\n const filtered = group.options.filter(filterOption)\n\n if (filtered.length) {\n acc.push({\n ...group,\n options: filtered,\n })\n }\n return acc\n }, [] as OptionGroup<T>[])\n } else {\n return options.reduce((acc, option) => {\n if (filterOption(option)) acc.push(option)\n return acc\n }, [] as T[])\n }\n}\n\nconst getFirstValidOption = <T extends Option>(options: Options<T>): T | undefined => {\n if (!options.length) {\n return undefined\n }\n\n let found: T | undefined\n\n for (const opt of options) {\n if (isOptionGroup(opt)) {\n const firstNonDisabled = opt.options.find((i) => !i.disabled)\n if (firstNonDisabled) {\n found = firstNonDisabled\n break\n }\n } else {\n if (!opt.disabled) {\n found = opt\n break\n }\n }\n }\n\n return found\n}\n\nconst getOptionByValue = <T extends Option>(options: Options<T>, value: string): T | undefined => {\n let found: T | undefined\n\n for (const opt of options) {\n if (isOptionGroup(opt)) {\n const exists = opt.options.find((i) => i.value === value)\n if (exists) {\n found = exists\n break\n }\n } else {\n if (opt.value === value) {\n found = opt\n break\n }\n }\n }\n\n return found\n}\n\nconst getOptionsByValues = <T extends Option>(options: Options<T>, values: string[]): T[] => {\n let found: T[] = []\n const lookup = new Set(values)\n\n for (const opt of options) {\n if (isOptionGroup(opt)) {\n const exists = opt.options.filter((i) => lookup.has(i.value))\n found = found.concat(exists)\n } else {\n if (lookup.has(opt.value)) {\n found.push(opt)\n }\n }\n }\n\n return found\n}\n\nconst MAX_DOM_CRAWLS = 40\n\nconst findOptionByValue = (currentValue: string, container: HTMLElement) =>\n container.querySelector(`[data-option-id=\"${currentValue}\"]`)\n\nconst isValidOptionNode = (node: Element) => node.matches(\"[data-option-id]:not([data-disabled])\")\n\nconst findNextOption = (currentValue: string, container: HTMLElement) => {\n const currentOption = findOptionByValue(currentValue, container)\n\n let nextNode = currentOption?.nextElementSibling\n let maxSteps = 0\n\n while (nextNode && maxSteps < MAX_DOM_CRAWLS) {\n if (isValidOptionNode(nextNode)) {\n return nextNode\n }\n\n nextNode = nextNode.nextElementSibling\n maxSteps += 1\n }\n}\n\nconst findPreviousOption = (currentValue: string, container: HTMLElement) => {\n const currentOption = findOptionByValue(currentValue, container)\n\n let nextNode = currentOption?.previousElementSibling\n let maxSteps = 0\n\n while (nextNode && maxSteps < MAX_DOM_CRAWLS) {\n if (isValidOptionNode(nextNode)) {\n return nextNode\n }\n\n nextNode = nextNode.previousElementSibling\n maxSteps += 1\n }\n}\n\nconst createTypeahead = () => {\n let currentValue: string = \"\"\n let timeoutId: ReturnType<typeof setTimeout>\n\n return (char: string) => {\n // Searching is case-insensitive\n char = char.toLowerCase()\n\n // Add the new character to the current value\n currentValue += char\n\n // Clear the previous timeout if there was one\n if (timeoutId) clearTimeout(timeoutId)\n\n // Reset the value after a brief delay\n timeoutId = setTimeout(() => {\n currentValue = \"\"\n }, 500)\n\n // When a user is typing the same value, like \"llll\", assume they are cycling through items starting with \"l\"\n // We continue to build up the string in case another letter is typed, and then release the full value.\n // For example, if the user types \"ooog\", it will return \"o\", until \"g\" is typed, and then return the \"ooog\".\n const isCycling = char.repeat(currentValue.length) === currentValue\n\n // Return the typeahead value\n return isCycling ? char : currentValue\n }\n}\n\nconst isValidTypeaheadChar = (char: string): boolean => /^[a-zA-Z0-9]$/.test(char)\n\nconst getTypeaheadOption = <T extends Option>(\n options: Options<T>,\n typeaheadValue: string,\n currentHighlightValue?: string,\n): T | undefined => {\n // Ensure options actually exist\n if (!options.length) {\n return undefined\n }\n\n let matchBeforeHighlight: T | undefined\n let matchAfterHighlight: T | undefined\n // If we' aren't provided a highlighted value, start from the top (e.g., act like it's found)\n let foundHighlightedValue: boolean = !currentHighlightValue\n\n const optionValidAndMatches = ({ disabled, label, value }: T) => {\n // Side effect of looping\n if (value === currentHighlightValue) {\n foundHighlightedValue = true\n // Don't return highlighted value\n return false\n }\n\n return !disabled && label.toLowerCase().startsWith(typeaheadValue)\n }\n\n for (const opt of options) {\n if (isOptionGroup(opt)) {\n for (const option of opt.options) {\n if (optionValidAndMatches(option)) {\n if (foundHighlightedValue) {\n matchAfterHighlight = option\n // We're done after we've found an after match\n break\n } else {\n // Keep the first found \"before\" match\n matchBeforeHighlight = matchBeforeHighlight || option\n }\n }\n }\n } else {\n if (optionValidAndMatches(opt)) {\n if (foundHighlightedValue) {\n matchAfterHighlight = opt\n // We're done after we've found an after match\n break\n } else {\n // Keep the first found \"before\" match\n matchBeforeHighlight = matchBeforeHighlight || opt\n }\n }\n }\n }\n\n return matchAfterHighlight || matchBeforeHighlight\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../../src/components/Select/Select.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport clsx from \"clsx\"\nimport { Popover } from \"radix-ui\"\nimport React, {\n createContext,\n type ReactNode,\n use,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { useEscCloseStack } from \"../../hooks/useEscCloseStack\"\nimport { useLatestValue } from \"../../hooks/useLatestValue\"\nimport { preventDefaultHandler, toCssVariables, waitForAnimationFrame } from \"../../lib/helpers\"\nimport { Check, Info, Search } from \"../Icon\"\nimport { Input } from \"../Input\"\nimport { SelectControl, type SelectControlProps } from \"../SelectControl\"\nimport { Tooltip } from \"../Tooltip\"\nimport { TransitionGroup } from \"../Transition\"\nimport s from \"./Select.module.css\"\n\nexport type Option<T extends string = string> = {\n value: T\n label: string\n /** Disable the option */\n disabled?: boolean\n /** Displayed as secondary text below the option `label` */\n description?: React.ReactNode\n tooltip?: {\n content: React.ReactNode\n maxWidth?: number\n }\n}\n\nexport type OptionGroup<T extends Option> = {\n label: string\n options: T[]\n optionsLimit?: {\n label: string\n limit: number\n }\n}\n\nexport type Options<T extends Option> = T[] | OptionGroup<T>[]\n\ntype CallbackWithOption<T extends Option> = (option: T) => void\ntype CallbackWithOptions<T extends Option> = (options: T[]) => void\ntype CallbackWithActionId = (actionId: string) => void\ntype SearchPredicate<T extends Option> = (option: T, searchTerm: string) => boolean\n\ntype Action = {\n /** Unique ID to identify the action with */\n id: string\n /** Label display for the action */\n label: string\n /** Icon displayed to the left of the action */\n Icon?: React.ComponentType<React.SVGProps<SVGSVGElement>>\n /** Custom class applied to the action container */\n className?: string\n /** Callback invoked when the action is pressed */\n onSelect: CallbackWithActionId\n}\n\ntype Actions = Action[]\n\nexport type PopoverSide = \"top\" | \"bottom\"\nexport type PopoverAlign = \"start\" | \"center\" | \"end\"\n\ntype SingleSelectProps<T extends Option> = {\n /**\n * Determines if the select should support multiple selection\n * @default false\n */\n multiple?: false\n value: string\n onChange: CallbackWithOption<T>\n /**\n * Customize the rendered output of the trigger\n * NOTE: Must be passed as a stable reference, not created inline.\n */\n TriggerView?: React.FC<T>\n}\n\ntype MultiSelectTriggerViewProps<T extends Option> = {\n values: T[]\n selectedAll: boolean\n}\n\ntype MultiSelectProps<T extends Option> = {\n /**\n * Determines if the select should support multiple selection\n * @default false\n */\n multiple: true\n value: string[]\n onChange: CallbackWithOptions<T>\n /**\n * Customize the rendered output of the trigger\n * NOTE: Must be passed as a stable reference, not created line.\n */\n TriggerView?: React.FC<MultiSelectTriggerViewProps<T>>\n}\n\ntype SelectAccessibilityProps = Pick<SelectControlProps, \"aria-label\" | \"aria-labelledby\" | \"aria-describedby\" | \"aria-invalid\">\n\nexport type SelectProps<T extends Option> = (SingleSelectProps<T> | MultiSelectProps<T>) & SelectAccessibilityProps & {\n options: Options<T> // Should be passed as a stable reference\n /**\n * Disables the select visually and from interactions\n * @default false\n */\n disabled?: boolean\n /**\n * Allows the select to be targeted with htmlFor\n */\n id?: string\n /**\n * Marks the select as a required field when using native form submission\n */\n required?: boolean\n /**\n * Creates the ability to query the value with `[name=\"${name}\"]`\n */\n name?: string\n /**\n * Placeholder text for the select\n * @default Select...\n */\n placeholder?: string\n /**\n * Placeholder text for the select while loading. Behaves exactly like `placeholder`, and `value` will be shown if provided.\n * @default Loading...\n */\n loadingPlaceholder?: string\n /**\n * Displays loading indicator on top of button contents\n * @default false\n */\n loading?: boolean\n /**\n * Style variant for the select trigger\n * @default outline\n */\n variant?: SelectControlProps[\"variant\"]\n /**\n * Determines if the select trigger should be a fully rounded pill shape\n * @default false\n */\n pill?: boolean\n /**\n * Controls size of the select trigger, and several other aspects of trigger styling.\n *\n * | 3xs | 2xs | xs | sm | md | lg | xl | 2xl | 3xl |\n * | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- |\n * | `22px` | `24px` | `26px` | `28px` | `32px` | `36px` | `40px` | `44px` | `48px` |\n * @default md\n */\n size?: SelectControlProps[\"size\"]\n /**\n * Icon displayed in the far right of the select trigger\n * @default dropdown\n */\n dropdownIconType?: SelectControlProps[\"dropdownIconType\"]\n /**\n * Actions to display below the options list.\n */\n actions?: Actions // Memoized by length, don't assume dynamic changes are supported\n /** Custom class applied to option containers */\n optionClassName?: string\n /**\n * Customize the rendered output of individual options\n * NOTE: Must be passed as a stable reference, not created line.\n */\n OptionView?: React.FC<T>\n /** Icon displayed at the start of the select trigger */\n TriggerStartIcon?: SelectControlProps[\"StartIcon\"]\n /**\n * Custom class applied to the select trigger\n */\n triggerClassName?: string // If consumers need deep customization of the trigger\n /**\n * Applies a negative margin using the current gutter to optically align the trigger\n * with surrounding content.\n */\n opticallyAlign?: \"start\" | \"end\"\n /**\n * Display a clear action that allows the select to be unset.\n * @default false\n */\n clearable?: boolean\n /**\n * Extends select to 100% of available width.\n * @default true\n */\n block?: boolean\n /**\n * The preferred side of the trigger to render against when open. Will be reversed when collisions occur.\n * @default bottom\n */\n side?: PopoverSide\n /**\n * The preferred alignment against the trigger. May change when collisions occur.\n * @default center\n */\n align?: PopoverAlign\n /**\n * An offset in pixels from the \"start\" or \"end\" alignment options.\n * @default 0\n */\n alignOffset?: number\n /**\n * Prevents collision detection in the custom menu. Use with caution.\n * @default true\n */\n avoidCollisions?: boolean\n /**\n * Set the width of the custom select menu\n * @default auto\n */\n listWidth?: number | \"auto\"\n /**\n * Defines the `min-width` property of the custom select menu, in pixels.\n * @default auto\n */\n listMinWidth?: number | \"auto\"\n /**\n * Defines the `max-width` property of the custom select menu, in pixels.\n * @default auto\n */\n listMaxWidth?: number | \"auto\"\n /** Predicate used to filter searches */\n searchPredicate?: SearchPredicate<T>\n /** Placeholder of the search input */\n searchPlaceholder?: string\n /**\n * Message displayed when search results are empty. Can be a simple string, or custom JSX.\n */\n searchEmptyMessage?: ReactNode\n /**\n * Render a custom trigger element instead of the default `SelectControl`.\n * Receives open state and a toggle callback. The returned element is wrapped\n * in a Radix `Popover.Trigger`.\n *\n * NOTE: Must be passed as a stable reference, not created inline.\n */\n /**\n * Position of the check indicator in the option list\n * @default start\n */\n checkPosition?: 'start' | 'end'\n trigger?: (props: { open: boolean; onToggle: () => void }) => ReactNode\n}\n\ntype SingleSelectContextValue<T extends Option> = {\n multiple: false\n value: string\n TriggerView: React.FC<T>\n}\n\ntype MultiSelectContextValue<T extends Option> = {\n multiple: true\n value: string[]\n TriggerView: React.FC<MultiSelectTriggerViewProps<T>>\n}\n\ntype SelectContextValue<T extends Option> = (\n | SingleSelectContextValue<T>\n | MultiSelectContextValue<T>\n) & SelectAccessibilityProps & {\n triggerId: string\n // Props\n name?: string\n id?: string\n required?: boolean\n options: Options<T>\n disabled: boolean\n variant: SelectControlProps[\"variant\"]\n pill: boolean\n size: SelectControlProps[\"size\"]\n dropdownIconType: SelectControlProps[\"dropdownIconType\"]\n loading: boolean\n clearable: boolean\n placeholder: string\n loadingPlaceholder: string\n searchEmptyMessage: ReactNode\n searchPlaceholder: string\n TriggerStartIcon?: SelectControlProps[\"StartIcon\"]\n triggerClassName?: string\n opticallyAlign?: \"start\" | \"end\"\n optionClassName?: string\n OptionView: React.FC<T>\n actions: Actions\n onActionSelect: CallbackWithActionId\n block: boolean\n side: PopoverSide\n align: PopoverAlign\n alignOffset: number\n avoidCollisions: boolean\n listWidth?: number | \"auto\" // Default when not passed is to match the width of the trigger\n listMinWidth: number | \"auto\"\n listMaxWidth?: number | \"auto\"\n // References\n onSelectRef: React.MutableRefObject<(option: T, removeOption?: boolean) => void>\n searchPredicateRef: React.MutableRefObject<SearchPredicate<T>>\n // Derived\n searchable: boolean\n checkPosition: 'start' | 'end'\n // Custom trigger\n trigger?: (props: { open: boolean; onToggle: () => void }) => ReactNode\n}\n\nconst SelectContext = createContext<SelectContextValue<Option> | null>(null)\n\nconst useSelectContext = () => {\n const context = use(SelectContext)\n\n if (!context) {\n throw new Error(\"Select components must be wrapped in <Select />\")\n }\n\n return context\n}\n\nconst DefaultOptionView = ({ label }: { label: string }) => <>{label}</>\nconst DefaultSingleTriggerView = ({ label }: { label: string }) => <>{label}</>\nconst DefaultMultiTriggerView = <T extends Option>({\n values,\n selectedAll,\n}: MultiSelectTriggerViewProps<T>) => {\n const displayValue = selectedAll\n ? \"All selected\"\n : values.length === 0\n ? // NOTE: Zero length is impossible - an empty option with `placeholder` is always returned\n \"Select...\"\n : values.length === 1\n ? values[0].label\n : `${values.length} selected`\n\n return <>{displayValue}</>\n}\n\nexport const Select = <T extends Option>(props: SelectProps<T>) => {\n const {\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n required,\n value,\n name,\n multiple,\n variant = \"outline\",\n size = \"md\",\n dropdownIconType = \"dropdown\",\n loading = false,\n clearable = false,\n disabled = false,\n placeholder = \"Select...\",\n loadingPlaceholder = \"Loading...\",\n pill = false,\n listWidth,\n options,\n actions: propActions = [],\n side = \"bottom\",\n avoidCollisions = true,\n onChange,\n optionClassName,\n OptionView = DefaultOptionView,\n TriggerStartIcon,\n triggerClassName,\n opticallyAlign,\n TriggerView: TriggerViewFromProps,\n searchPlaceholder = \"\",\n searchPredicate = defaultSearchPredicate,\n searchEmptyMessage = \"No results found.\",\n listMaxWidth = \"auto\",\n trigger,\n checkPosition = 'start',\n } = props\n // Block default is dynamic, based on `variant`\n const block = props.block ?? variant !== \"ghost\"\n // Align default is dynamic, based on `block`\n const align = props.align ?? (block ? \"center\" : \"start\")\n const alignOffset = props.alignOffset ?? (align === \"center\" ? 0 : -5)\n // Default to \"auto\" for block selects and 300 for inline selects.\n const listMinWidth = props.listMinWidth ?? (block ? \"auto\" : 300)\n\n // Create stable, mutable references to avoid memoization requirements from consumers\n const onSelectRef = useLatestValue((selectedOption: T, removeOption?: boolean) => {\n if (multiple) {\n // When clearing values, the value is an\n if (!selectedOption.value) {\n onChange([])\n return\n }\n\n if (removeOption) {\n const nextValues = value.filter((v) => v !== selectedOption.value)\n const currentSelectedOptions = getOptionsByValues(options, nextValues)\n onChange(currentSelectedOptions)\n } else {\n const currentSelectedOptions = getOptionsByValues(options, value)\n onChange(currentSelectedOptions.concat(selectedOption))\n }\n } else {\n onChange(selectedOption)\n }\n })\n\n const searchPredicateRef = useRef<SearchPredicate<T>>(searchPredicate)\n searchPredicateRef.current = searchPredicate\n\n // It should be exceedingly uncommon to change actions dynamically, and they are unlikely to be a stable array reference from consumers\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Intentionally limiting when this stable value changes to length of actions\n const actions = useMemo<Actions>(() => propActions, [propActions.length])\n // We need to ensure that when action callbacks are called, we have fresh function references, even if the other action details did not change.\n const propActionsRef = useRef<Actions>(propActions)\n propActionsRef.current = propActions\n const onActionSelect = useCallback<CallbackWithActionId>((actionId: string) => {\n propActionsRef.current.find((a) => a.id === actionId)?.onSelect(actionId)\n }, [])\n\n // Determine when custom selects should be used\n const optionsCount = useMemo(\n () =>\n isOptionGroupArray(options)\n ? options.reduce((acc: number, group) => {\n return acc + group.options.length\n }, 0)\n : options.length,\n [options],\n )\n\n // Using ID for DOM selection instead of passing around and merging a ref. Pick your poison.\n const internalTriggerId = useId()\n const triggerId = `select-trigger-${internalTriggerId}`\n\n // Locking down searchable count to a single value. Could make this customizable in the future, but would want guardrails.\n const searchable = optionsCount > 15\n\n // Narrow known values for context\n const dynamicContextProps = useMemo<\n SingleSelectContextValue<T> | MultiSelectContextValue<T>\n >(() => {\n if (multiple) {\n return {\n multiple: true,\n value: value as string[],\n TriggerView: TriggerViewFromProps ?? DefaultMultiTriggerView,\n }\n }\n\n return {\n multiple: false,\n value: value as string,\n TriggerView: TriggerViewFromProps ?? DefaultSingleTriggerView,\n }\n }, [multiple, value, TriggerViewFromProps])\n\n const store = useMemo<SelectContextValue<T>>(\n () => ({\n ...dynamicContextProps,\n triggerId,\n id,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n // Forward props\n name,\n required,\n options,\n placeholder,\n loadingPlaceholder,\n loading,\n clearable,\n variant,\n pill,\n size,\n dropdownIconType,\n block,\n align,\n alignOffset,\n side,\n avoidCollisions,\n listWidth,\n listMinWidth,\n listMaxWidth,\n searchPlaceholder,\n searchEmptyMessage,\n TriggerStartIcon,\n triggerClassName,\n opticallyAlign,\n optionClassName,\n OptionView,\n actions,\n onActionSelect,\n onSelectRef,\n searchPredicateRef,\n // Derived state\n searchable,\n disabled,\n trigger,\n checkPosition,\n }),\n [\n dynamicContextProps,\n triggerId,\n id,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n ariaInvalid,\n required,\n name,\n options,\n placeholder,\n loadingPlaceholder,\n loading,\n clearable,\n variant,\n pill,\n size,\n dropdownIconType,\n block,\n align,\n alignOffset,\n side,\n avoidCollisions,\n listWidth,\n listMinWidth,\n listMaxWidth,\n searchPlaceholder,\n searchEmptyMessage,\n TriggerStartIcon,\n triggerClassName,\n opticallyAlign,\n optionClassName,\n OptionView,\n actions,\n onActionSelect,\n onSelectRef,\n searchable,\n disabled,\n trigger,\n checkPosition,\n ],\n )\n\n return (\n // NOTE: Cannot peacefully coerce SelectContextValue into a generic, so casting to any here.\n // This is safe because `store` is strongly typed above.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <SelectContext.Provider value={store as any}>\n <CustomSelect />\n </SelectContext.Provider>\n )\n}\n\n// ============================================================\n// Trigger\n// ============================================================\ntype SelectTriggerProps = {\n onOpenChange?: (maybeNextState?: boolean) => void\n tabIndex?: number\n [\"aria-hidden\"]?: \"false\" | \"true\"\n ref?: React.Ref<HTMLButtonElement | null>\n}\n\nexport const SelectTrigger = (props: SelectTriggerProps) => {\n const {\n triggerId,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n id,\n required,\n value,\n multiple,\n options,\n loading,\n disabled,\n clearable,\n name,\n variant,\n pill,\n size,\n dropdownIconType,\n placeholder,\n loadingPlaceholder,\n block,\n opticallyAlign,\n triggerClassName,\n TriggerStartIcon,\n TriggerView,\n onSelectRef,\n } = useSelectContext()\n const {\n onOpenChange,\n // pass along props from Radix\n ...restProps\n } = props\n const firstValue = multiple ? value[0] : value\n const placeholderValue = loading ? loadingPlaceholder : placeholder\n\n const selectedItem = useMemo<Option>(\n () =>\n getOptionByValue(options, firstValue) || {\n value: \"\",\n label: placeholderValue,\n },\n [firstValue, options, placeholderValue],\n )\n const hasSelectedValue = multiple ? value.length > 0 : !!value\n const isPlaceholder = loading || !hasSelectedValue\n\n const typeahead = useMemo(() => createTypeahead(), [])\n\n const multipleTriggerViewProps = useMemo<MultiSelectTriggerViewProps<Option>>(() => {\n if (!multiple) {\n return { values: [], selectedAll: false }\n }\n\n const currentSelectedOptions = getOptionsByValues(options, value)\n const flatOptions = options.flatMap((o) => (\"options\" in o ? o.options : o))\n\n return {\n values: currentSelectedOptions.length\n ? currentSelectedOptions\n : [\n {\n value: \"\",\n label: placeholderValue,\n },\n ],\n selectedAll: flatOptions.length <= value.length,\n }\n }, [multiple, options, value, placeholderValue])\n\n const handleKeyDown = (evt: React.KeyboardEvent<HTMLButtonElement>) => {\n const key = evt.key\n\n // If not a command, check for typeahead\n // NOTE: Typeahead not supported in multi-select\n if (!multiple && isValidTypeaheadChar(key)) {\n const currentTypeaheadValue = typeahead(key)\n // Stop other listeners from reacting\n evt.stopPropagation()\n\n // Attempt to filter options based on the value\n // NOTE: We don't look at current highlighted value as a means to start the search\n const firstMatchingOption = getTypeaheadOption(options, currentTypeaheadValue, firstValue)\n\n if (firstMatchingOption) {\n onSelectRef.current(firstMatchingOption)\n }\n }\n }\n\n const handleClearClick = () => {\n onSelectRef.current({ value: \"\", label: \"\" })\n // Ensure open state is closed\n onOpenChange?.(false)\n }\n\n return (\n <SelectControl\n id={triggerId}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy ? `${ariaLabelledBy} ${triggerId}-value` : undefined}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n className={triggerClassName}\n selected={!isPlaceholder}\n variant={variant}\n pill={pill}\n block={block}\n size={size}\n disabled={disabled}\n loading={loading}\n StartIcon={TriggerStartIcon}\n opticallyAlign={opticallyAlign}\n dropdownIconType={dropdownIconType}\n onClearClick={clearable ? handleClearClick : undefined}\n onInteract={onOpenChange}\n onKeyDown={handleKeyDown}\n {...restProps}\n >\n {ariaLabelledBy ? (\n <span id={`${triggerId}-value`}>\n {multiple ? <TriggerView {...multipleTriggerViewProps} /> : <TriggerView {...selectedItem} />}\n </span>\n ) : multiple ? <TriggerView {...multipleTriggerViewProps} /> : <TriggerView {...selectedItem} />}\n {(name || id) && (\n <input\n id={id}\n name={name}\n value={firstValue}\n tabIndex={-1}\n onFocus={() => {\n document.getElementById(triggerId)?.focus()\n }}\n // keep react from complaining - don't make this readOnly because that\n // prevents the value from being required\n onChange={() => {}}\n required={required}\n className=\"sr-only w-full h-0 left-0 bottom-0 pointer-events-none\"\n aria-hidden=\"true\"\n />\n )}\n </SelectControl>\n )\n}\n\n// ============================================================\n// Custom Select\n// ============================================================\nconst CustomSelect = () => {\n const {\n triggerId,\n loading,\n side,\n align,\n alignOffset,\n avoidCollisions,\n listWidth,\n listMinWidth,\n listMaxWidth,\n trigger,\n } = useSelectContext()\n const [open, setOpen] = useState<boolean>(false)\n const selectContentRef = useRef<HTMLDivElement>(null)\n\n const handleOpenChange = (maybeNextState?: boolean) => {\n // Toggle the current state when called without a specific state\n const nextState = maybeNextState === undefined ? !open : maybeNextState\n setOpen(nextState)\n\n // When we're closing, manage focus back to trigger manually\n if (!nextState) {\n // Wait until the next tick to determine if another element has become focused\n setTimeout(() => {\n // This should never happen because TransitionGroup should keep the select content in the DOM long\n // enough for this callback to run. However, in the event that the ref is null, not focusing is safer.\n if (!selectContentRef.current) {\n return\n }\n\n const activeElement = document.activeElement\n\n // Don't restore focus to the trigger if focus has moved outside of the select menu\n if (activeElement && !selectContentRef.current.contains(activeElement)) {\n return\n }\n\n document.getElementById(triggerId)?.focus()\n })\n }\n }\n\n useEscCloseStack(open, () => {\n handleOpenChange(false)\n })\n\n return (\n <Popover.Root\n open={open}\n onOpenChange={(nextState) => {\n // Prevent opening while loading\n if (loading && nextState) {\n return\n }\n\n handleOpenChange(nextState)\n }}\n modal={false}\n >\n <Popover.Trigger asChild>\n {trigger ? trigger({ open, onToggle: () => setOpen((current) => !current) }) : <SelectTrigger onOpenChange={handleOpenChange} />}\n </Popover.Trigger>\n <Popover.Portal forceMount>\n <TransitionGroup\n className={s.Menu}\n enterDuration={350}\n exitDuration={200}\n disableAnimations\n >\n {open && (\n <Popover.Content\n key=\"dropdown\"\n ref={selectContentRef}\n forceMount\n className={s.MenuList}\n side={side}\n sideOffset={5}\n align={align}\n alignOffset={alignOffset}\n avoidCollisions={avoidCollisions}\n collisionPadding={{ bottom: 30, top: 30 }}\n // Prevent Radix auto focus so we can handle our own from within <CustomSelectMenu />\n onOpenAutoFocus={preventDefaultHandler}\n // Radix waits until the animation completes before directing focus, which is janky.\n onCloseAutoFocus={preventDefaultHandler}\n onEscapeKeyDown={preventDefaultHandler}\n style={toCssVariables({\n \"select-list-width\": listWidth,\n \"select-list-min-width\": listMinWidth,\n \"select-list-max-width\": listMaxWidth,\n })}\n >\n <CustomSelectMenu onOpenChange={handleOpenChange} />\n </Popover.Content>\n )}\n </TransitionGroup>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\ntype CustomSelectMenuContextValue = {\n openingValue: string\n listId: string\n requestCloseRef: React.RefObject<() => void | null>\n listRef: React.RefObject<HTMLDivElement | null>\n // Highlighting\n highlightedValue: string\n setHighlightedValue: React.Dispatch<React.SetStateAction<string>>\n // Search\n searchTerm: string\n setSearchTerm: React.Dispatch<React.SetStateAction<string>>\n searchInputRef: React.RefObject<HTMLInputElement | null>\n}\n\nconst CustomSelectMenuContext = createContext<CustomSelectMenuContextValue | null>(null)\n\nconst useCustomSelectMenuContext = () => {\n const context = use(CustomSelectMenuContext)\n\n if (!context) {\n throw new Error(\"CustomSelectMenu components must be wrapped in <CustomSelectMenu />\")\n }\n\n return context\n}\n\ntype CustomSelectMenuProps = {\n onOpenChange: (maybeNextState?: boolean) => void\n}\n\nconst CustomSelectMenu = ({ onOpenChange }: CustomSelectMenuProps) => {\n const { multiple, value, options, searchable, searchPredicateRef } = useSelectContext()\n const requestCloseRef = useRef<() => void>(() => onOpenChange(false))\n const menuRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n const searchInputRef = useRef<HTMLInputElement>(null)\n const [searchTerm, setSearchTerm] = useState(\"\")\n const [highlightedValue, setHighlightedValue] = useState<string>(() => {\n const selectedValue = multiple ? value[0] : value\n return (selectedValue || getFirstValidOption(options)?.value) ?? \"\"\n })\n const typeahead = useMemo(() => createTypeahead(), [])\n const internalListId = useId()\n const listId = `select-list-${internalListId}`\n\n // Lock `value` for a given open to prevent janky change during close animation\n // MultiSelect reads its live selection instead of this per-open snapshot.\n const [openingValue] = useState<string>(() => multiple ? \"\" : value)\n\n // Trim and lowercase search value\n const literalSearchTerm = useMemo(() => searchTerm.trim().toLocaleLowerCase(), [searchTerm])\n const filteredOptions = useMemo(\n () => filterOptions(options, literalSearchTerm, searchPredicateRef.current),\n [options, literalSearchTerm, searchPredicateRef],\n )\n const firstOption = useMemo(() => getFirstValidOption(filteredOptions), [filteredOptions])\n\n // Regrettable requirement for running an effect *after* mount\n const isMountStableRef = useRef<boolean>(false)\n\n const handleKeyDown = (evt: React.KeyboardEvent) => {\n const key = evt.key\n const firstValue = multiple ? value[0] : value\n const targetValue = highlightedValue || firstOption?.value || firstValue\n const isFocusedInSearch = document.activeElement === searchInputRef.current\n\n const menuElement = menuRef.current\n\n // Should be generally impossible for menuRef.current to not exist\n // unless we've unmounted and manage to fire this handler.\n if (!menuElement) {\n return\n }\n\n const triggerHighlightedOption = () => {\n const pointerUpEvent = new PointerEvent(\"pointerup\", {\n bubbles: true,\n cancelable: true,\n pointerType: \"mouse\",\n })\n\n // Find the current highlighted option\n const selectedOption = findOptionByValue(highlightedValue, menuElement)\n selectedOption?.dispatchEvent(pointerUpEvent)\n }\n\n const highlightOption = (val: string, element: Element) => {\n setHighlightedValue(val)\n element.scrollIntoView({ block: \"nearest\" })\n }\n\n const highlightSelectedOrFirstOption = () => {\n // Attempt to move highlight to selected item\n const maybeFirstValue = multiple ? value[0] : value\n\n if (maybeFirstValue) {\n const selectedElement = findOptionByValue(maybeFirstValue, menuElement)\n\n if (selectedElement) {\n highlightOption(maybeFirstValue, selectedElement)\n return\n }\n }\n\n // If value isn't set, or the selected node wasn't found in the DOM,\n // attempt to move focus to the first valid option.\n const firstValidOption = getFirstValidOption(options)\n\n if (firstValidOption) {\n const firstValidOptionElement = findOptionByValue(firstValidOption.value, menuElement)\n if (firstValidOptionElement) {\n highlightOption(firstValidOption.value, firstValidOptionElement)\n }\n }\n }\n\n // Commands\n switch (key) {\n case \"ArrowDown\": {\n evt.preventDefault()\n\n // If there's no highlighted value, or the highlighted value is not in the DOM\n if (!highlightedValue || !findOptionByValue(highlightedValue, menuElement)) {\n // Attempt to move highlight to selected item\n highlightSelectedOrFirstOption()\n\n // Short-circuit because we have no highlighted value to advance from\n return\n }\n\n // Otherwise, move to the next option\n const nextElement = findNextOption(highlightedValue, menuElement)\n const nextValue = nextElement?.getAttribute(\"data-option-id\")\n if (nextElement && nextValue) {\n highlightOption(nextValue, nextElement)\n }\n\n return\n }\n case \"ArrowUp\": {\n evt.preventDefault()\n\n // If there's no highlighted value, or the highlighted value is not in the DOM\n if (!highlightedValue || !findOptionByValue(highlightedValue, menuElement)) {\n // Attempt to move highlight to selected item\n highlightSelectedOrFirstOption()\n\n // Short-circuit because we have no highlighted value to advance from\n return\n }\n\n const previousElement = findPreviousOption(targetValue, menuElement)\n const previousValue = previousElement?.getAttribute(\"data-option-id\")\n if (previousElement && previousValue) {\n highlightOption(previousValue, previousElement)\n }\n\n return\n }\n case \"Enter\":\n // Prevent default enter behavior from the search input, if present\n evt.preventDefault()\n\n // Send a pointerDown event into the currently highlighted option\n triggerHighlightedOption()\n\n return\n case \" \":\n // Allow spaces in search, and don't treat as enter\n // if there is a valid literalSearchTerm.\n if (literalSearchTerm && isFocusedInSearch) {\n return\n }\n\n // Prevent space from entering search input\n evt.preventDefault()\n\n // Send a pointerDown event into the currently highlighted option\n triggerHighlightedOption()\n\n return\n default:\n break\n }\n\n // If not a command, check for typeahead\n if (isValidTypeaheadChar(key)) {\n // Skip typeahead logic when we're focused in the search input\n if (isFocusedInSearch) {\n return\n }\n\n // Extend the current typeahead and get the latest value\n const currentTypeaheadValue = typeahead(key)\n\n // Stop other listeners from reacting\n evt.stopPropagation()\n\n // Attempt to filter options based on the value, starting at the highlighted value\n const firstMatchingOption = getTypeaheadOption(\n options,\n currentTypeaheadValue,\n highlightedValue,\n )\n\n if (firstMatchingOption) {\n const matchedNode = findOptionByValue(firstMatchingOption.value, menuElement)\n\n // Only change the highlight if we found the actual node\n if (matchedNode) {\n setHighlightedValue(firstMatchingOption.value)\n // Ensure the newly highlighted option is scrolled into view\n matchedNode.scrollIntoView({ block: \"nearest\" })\n }\n }\n }\n }\n\n const store = useMemo(\n () => ({\n openingValue,\n listId,\n highlightedValue,\n setHighlightedValue,\n requestCloseRef,\n searchTerm,\n setSearchTerm,\n searchInputRef,\n listRef,\n }),\n [openingValue, listId, highlightedValue, setHighlightedValue, searchTerm, setSearchTerm],\n )\n\n // On mount behavior\n useEffect(() => {\n // Ensure initial highlighted option is in view\n // NOTE: Allowing for a render frame ensures content is positioned correctly before scrolling it into view.\n waitForAnimationFrame(() => {\n if (!menuRef.current) {\n return\n }\n\n // Ensure the highlighted option is in view\n const currentOption = findOptionByValue(highlightedValue, menuRef.current)\n // Scroll the selected item into view, and its bottom edge.\n currentOption?.scrollIntoView({ block: \"center\" })\n })\n\n // Send initial focus to the menu container or search input, to capture key events\n const autoFocusTarget = searchInputRef.current || menuRef.current\n autoFocusTarget?.focus({ preventScroll: true })\n\n // Required for <StrictMode>, because we need to unset this token\n // when the hooks are re-run. It's an imperative effect that we need to manage.\n return () => {\n isMountStableRef.current = false\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Intentionally an onMount effect\n }, [])\n\n // On search behavior\n useLayoutEffect(() => {\n // This effect will run on mount, but we want to skip it.\n // The on mount effect is responsible for handling mount behavior,\n // but this effect is specifically responsible for handling search changes\n if (!isMountStableRef.current) {\n isMountStableRef.current = true\n return\n }\n\n // Impossible while mounted, list ref will exist\n if (!listRef.current) {\n return\n }\n\n // Reset scroll position to the top\n listRef.current.scrollTop = 0\n\n // Highlight first item in the list\n const maybeFirstOption = getFirstValidOption(filteredOptions)\n if (maybeFirstOption) setHighlightedValue(maybeFirstOption.value)\n }, [filteredOptions])\n\n return (\n <CustomSelectMenuContext value={store}>\n <div id={listId} className={s.MenuInner} onKeyDown={handleKeyDown} ref={menuRef} tabIndex={0}>\n {searchable && <CustomSelectSearch value={searchTerm} onChange={setSearchTerm} />}\n <CustomSelectList filteredOptions={filteredOptions} />\n <CustomSelectActions />\n </div>\n </CustomSelectMenuContext>\n )\n}\n\ntype CustomSelectSearchProps = {\n value: string\n onChange: (nextSearchTerm: string) => void\n}\n\nconst CustomSelectSearch = ({ value, onChange }: CustomSelectSearchProps) => {\n const { searchPlaceholder } = useSelectContext()\n const { listId, searchInputRef } = useCustomSelectMenuContext()\n\n const handleChange = (evt: React.ChangeEvent<HTMLInputElement>) => {\n onChange(evt.target.value)\n }\n\n return (\n <div className={s.Search}>\n <Input\n startAdornment={\n <Search\n width={16}\n height={16}\n className=\"fill-secondary\"\n fill=\"var(--color-text-secondary)\"\n />\n }\n ref={searchInputRef}\n value={value}\n placeholder={searchPlaceholder}\n onChange={handleChange}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n aria-autocomplete=\"list\"\n role=\"combobox\"\n aria-controls={listId}\n aria-expanded\n />\n </div>\n )\n}\n\nconst isOptionGroup = <T extends Option>(\n mixedOption: T | OptionGroup<T>,\n): mixedOption is OptionGroup<T> => {\n return \"options\" in mixedOption\n}\n\nconst isOptionGroupArray = <T extends Option>(arr: Options<T>): arr is OptionGroup<T>[] => {\n return arr[0] && isOptionGroup(arr[0])\n}\n\nconst HARD_OPTIONS_LIMIT = 300\n\nconst CustomSelectList = <T extends Option>({\n filteredOptions,\n}: {\n filteredOptions: Options<T>\n}) => {\n const { searchEmptyMessage } = useSelectContext()\n const { listRef } = useCustomSelectMenuContext()\n\n if (!filteredOptions.length) {\n return typeof searchEmptyMessage === \"string\" ? (\n <p className={s.SearchEmpty} data-text-only>\n {searchEmptyMessage}\n </p>\n ) : (\n <div className={s.SearchEmpty}>{searchEmptyMessage}</div>\n )\n }\n\n // We hard limit within groups, so at this level we will only limit flat arrays\n const isGrouped = isOptionGroupArray(filteredOptions)\n const hasHardLimit = !isGrouped && filteredOptions.length > HARD_OPTIONS_LIMIT\n\n const options = isGrouped\n ? filteredOptions.map((group) => <CustomSelectGroup key={group.label} {...group} />)\n : filteredOptions\n .slice(0, HARD_OPTIONS_LIMIT)\n .map((option) => <CustomSelectOption key={option.value} {...option} />)\n\n return (\n <div className={s.OptionsList} ref={listRef}>\n {options}\n {hasHardLimit && (\n <CustomSelectHardLimit numHidden={filteredOptions.length - HARD_OPTIONS_LIMIT} />\n )}\n </div>\n )\n}\n\nconst DEFAULT_OPTIONS_LIMIT = {\n limit: 100,\n label: \"Show all\",\n}\n\nconst CustomSelectGroup = <T extends Option>({\n label,\n options,\n optionsLimit = DEFAULT_OPTIONS_LIMIT,\n}: OptionGroup<T>) => {\n const groupId = useId()\n const { searchTerm, setHighlightedValue } = useCustomSelectMenuContext()\n const [limitExpanded, setLimitExpanded] = useState<boolean>(false)\n\n const hasExpandableLimit = optionsLimit.limit < options.length && !searchTerm && !limitExpanded\n const hasHardLimit = HARD_OPTIONS_LIMIT < options.length && !hasExpandableLimit\n\n let maybeLimitedOptions = options\n if (hasExpandableLimit) {\n maybeLimitedOptions = options.slice(0, optionsLimit.limit)\n } else if (hasHardLimit) {\n maybeLimitedOptions = options.slice(0, HARD_OPTIONS_LIMIT)\n }\n\n const handleLimitExpanded = () => {\n // Expand options\n setLimitExpanded(true)\n\n // Set highlight to the first option from the newly expanded list\n setHighlightedValue(options[optionsLimit.limit].value)\n }\n\n return (\n // NOTE: Important for crawling that groups are flat\n <>\n <div className={s.OptionGroupHeading}>\n <div className={s.OptionIndicatorSlot} />\n {label}\n </div>\n {maybeLimitedOptions.map((limitedOptions) => (\n <CustomSelectOption key={limitedOptions.value} {...limitedOptions} />\n ))}\n {hasExpandableLimit && (\n <CustomSelectExpandableLimit\n value={`group-limit-${groupId}`}\n label={optionsLimit.label}\n onPointerUp={handleLimitExpanded}\n />\n )}\n {hasHardLimit && <CustomSelectHardLimit numHidden={options.length - HARD_OPTIONS_LIMIT} />}\n </>\n )\n}\n\ntype CustomSelectHardLimitProps = {\n numHidden: number\n}\n\nconst CustomSelectHardLimit = ({ numHidden }: CustomSelectHardLimitProps) => {\n return (\n <div className={s.OptionHardLimitHeading}>\n <div className={s.OptionIndicatorSlot} />\n {`…and ${numHidden.toLocaleString()} more options. Use search to refine results further.`}\n </div>\n )\n}\n\ntype CustomSelectExpandableLimitProps = {\n value: string\n label: string\n onPointerUp: () => void\n}\n\nconst CustomSelectExpandableLimit = ({\n value,\n label,\n onPointerUp,\n}: CustomSelectExpandableLimitProps) => {\n const { highlightedValue, setHighlightedValue } = useCustomSelectMenuContext()\n\n const isHighlighted = value === highlightedValue\n\n const handlePointerMove = () => {\n if (isHighlighted) {\n return\n }\n\n setHighlightedValue(value)\n }\n\n const handlePointerLeave = () => {\n setHighlightedValue((currentHighlightedValue) => {\n // If the current value is not this one, don't do anything\n // Otherwise, clear the value, removing the active highlight on the menu.\n return currentHighlightedValue !== value ? currentHighlightedValue : \"\"\n })\n }\n\n // This component acts a LOT like an Option, but has enough bespoke behavior\n // that it cannot literally be one. We copy the important parts of Option for\n // keyboard navigation, UX, etc.\n return (\n <div\n className={clsx(s.Option, s.OptionsLimit)}\n data-option-id={value}\n data-highlight={isHighlighted ? \"\" : undefined}\n role=\"option\"\n aria-selected={isHighlighted}\n onPointerUp={onPointerUp}\n onPointerMove={handlePointerMove}\n onPointerLeave={handlePointerLeave}\n >\n <div className={clsx(s.PressableInner, s.OptionInner)}>\n <div className={s.OptionIndicatorSlot} />\n {label}\n </div>\n </div>\n )\n}\n\nconst INTERNAL_DOM_SELECTION_DATA_ATTR = \"data-option-id\"\n\nconst CustomSelectOption = (option: Option) => {\n const {\n optionClassName,\n OptionView,\n value: propsValue,\n multiple,\n onSelectRef,\n checkPosition,\n } = useSelectContext()\n const { openingValue, requestCloseRef, highlightedValue, setHighlightedValue } =\n useCustomSelectMenuContext()\n const { value, disabled, tooltip } = option\n\n // NOTE: SingleSelect mode keeps the opening value instead of the live `propsValue`\n // to avoid selecting the item as the select closes.\n const isSelected = multiple ? propsValue.includes(value) : value === openingValue\n const isHighlighted = value === highlightedValue\n\n const handlePointerUp = () => {\n if (multiple) {\n // Trigger the change ref, optionally as a remove\n onSelectRef.current(option, isSelected)\n } else {\n // Trigger the change ref\n onSelectRef.current(option)\n // Request the dropdown to close\n requestCloseRef.current?.()\n }\n }\n\n const handlePointerMove = () => {\n if (isHighlighted) {\n return\n }\n\n setHighlightedValue(value)\n }\n\n const handlePointerLeave = () => {\n setHighlightedValue((currentHighlightedValue) => {\n // If the current value is not this one, don't do anything\n // Otherwise, clear the value, removing the active highlight on the menu.\n return currentHighlightedValue !== value ? currentHighlightedValue : \"\"\n })\n }\n\n return (\n <div\n className={clsx(s.Option, optionClassName)}\n data-highlight={isHighlighted ? \"\" : undefined}\n role=\"option\"\n aria-selected={isHighlighted}\n data-selected={isSelected ? \"\" : undefined}\n // Internal attribute for selecting DOM nodes\n {...{ [INTERNAL_DOM_SELECTION_DATA_ATTR]: value }}\n // Allow options to behave like a native select, when you can open and select an item in a single click\n onPointerUp={disabled ? undefined : handlePointerUp}\n // Pointer move allows us to prevent contention from keyboard presses and a still mouse\n // which does trigger events like onMouseEnter, creating weird battles with mouse and keyboard focus.\n onPointerMove={disabled ? undefined : handlePointerMove}\n onPointerLeave={disabled ? undefined : handlePointerLeave}\n aria-disabled={disabled}\n data-disabled={disabled ? \"\" : undefined}\n >\n <div className={s.PressableInner}>\n {checkPosition === 'start' && (\n <div className={s.OptionIndicatorSlot} data-position=\"start\">\n {isSelected && <Check className={s.OptionCheck} />}\n </div>\n )}\n <div className={s.OptionLeading}>\n <div className={s.OptionInner}>\n <OptionView {...option} />\n {tooltip && (\n <Tooltip content={tooltip.content} maxWidth={tooltip.maxWidth} side=\"right\">\n <Info />\n </Tooltip>\n )}\n </div>\n {option.description && (\n <div className={clsx(s.OptionInner, s.OptionDescription)}>\n {option.description}\n </div>\n )}\n </div>\n {checkPosition === 'end' && (\n <div className={s.OptionIndicatorSlot} data-position=\"end\">\n {isSelected && <Check className={s.OptionCheck} />}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nconst CustomSelectActions = () => {\n const { actions } = useSelectContext()\n\n if (actions.length === 0) {\n return null\n }\n\n return (\n <div className={s.ActionsContainer}>\n {actions.map((action) => (\n <CustomSelectAction key={action.id} {...action} />\n ))}\n </div>\n )\n}\n\nconst CustomSelectAction = ({ id, label, Icon, className }: Action) => {\n const { onActionSelect } = useSelectContext()\n const { requestCloseRef } = useCustomSelectMenuContext()\n\n const handleKeyDown = (evt: React.KeyboardEvent<HTMLDivElement>) => {\n const key = evt.key\n\n switch (key) {\n case \"Tab\":\n // Allow tabbing to pass propagation as normal,\n // which bubbles up to the focus trap of Radix Popover\n break\n case \"Enter\":\n case \" \":\n evt.stopPropagation()\n handlePointerUp()\n break\n default:\n evt.stopPropagation()\n }\n }\n\n const handlePointerUp = () => {\n // Trigger the action's through our context helper, not the method on this action (it may be a stale reference)\n onActionSelect(id)\n // Request to close the dropdown\n requestCloseRef.current?.()\n }\n\n return (\n <div className={s.Action} onPointerUp={handlePointerUp} onKeyDown={handleKeyDown} tabIndex={0}>\n <div className={clsx(s.ActionInner, className)}>\n {Icon && <Icon role=\"presentation\" />}\n {label}\n </div>\n </div>\n )\n}\n\n// ============================================================\n// Utilities\n// ============================================================\nconst defaultSearchPredicate = (option: Option, searchTerm: string) =>\n option.label.toLowerCase().includes(searchTerm)\n\nconst filterOptions = <T extends Option>(\n options: Options<T>,\n searchTerm: string,\n searchIterator: SearchPredicate<T>,\n): Options<T> => {\n const searchValue = searchTerm.trim().toLocaleLowerCase()\n\n if (!searchValue) {\n return options\n }\n\n const filterOption = (option: T): boolean => searchIterator(option, searchValue)\n\n if (isOptionGroupArray(options)) {\n return options.reduce((acc, group) => {\n const filtered = group.options.filter(filterOption)\n\n if (filtered.length) {\n acc.push({\n ...group,\n options: filtered,\n })\n }\n return acc\n }, [] as OptionGroup<T>[])\n } else {\n return options.reduce((acc, option) => {\n if (filterOption(option)) acc.push(option)\n return acc\n }, [] as T[])\n }\n}\n\nconst getFirstValidOption = <T extends Option>(options: Options<T>): T | undefined => {\n if (!options.length) {\n return undefined\n }\n\n let found: T | undefined\n\n for (const opt of options) {\n if (isOptionGroup(opt)) {\n const firstNonDisabled = opt.options.find((i) => !i.disabled)\n if (firstNonDisabled) {\n found = firstNonDisabled\n break\n }\n } else {\n if (!opt.disabled) {\n found = opt\n break\n }\n }\n }\n\n return found\n}\n\nconst getOptionByValue = <T extends Option>(options: Options<T>, value: string): T | undefined => {\n let found: T | undefined\n\n for (const opt of options) {\n if (isOptionGroup(opt)) {\n const exists = opt.options.find((i) => i.value === value)\n if (exists) {\n found = exists\n break\n }\n } else {\n if (opt.value === value) {\n found = opt\n break\n }\n }\n }\n\n return found\n}\n\nconst getOptionsByValues = <T extends Option>(options: Options<T>, values: string[]): T[] => {\n let found: T[] = []\n const lookup = new Set(values)\n\n for (const opt of options) {\n if (isOptionGroup(opt)) {\n const exists = opt.options.filter((i) => lookup.has(i.value))\n found = found.concat(exists)\n } else {\n if (lookup.has(opt.value)) {\n found.push(opt)\n }\n }\n }\n\n return found\n}\n\nconst MAX_DOM_CRAWLS = 40\n\nconst findOptionByValue = (currentValue: string, container: HTMLElement) =>\n container.querySelector(`[data-option-id=\"${currentValue}\"]`)\n\nconst isValidOptionNode = (node: Element) => node.matches(\"[data-option-id]:not([data-disabled])\")\n\nconst findNextOption = (currentValue: string, container: HTMLElement) => {\n const currentOption = findOptionByValue(currentValue, container)\n\n let nextNode = currentOption?.nextElementSibling\n let maxSteps = 0\n\n while (nextNode && maxSteps < MAX_DOM_CRAWLS) {\n if (isValidOptionNode(nextNode)) {\n return nextNode\n }\n\n nextNode = nextNode.nextElementSibling\n maxSteps += 1\n }\n}\n\nconst findPreviousOption = (currentValue: string, container: HTMLElement) => {\n const currentOption = findOptionByValue(currentValue, container)\n\n let nextNode = currentOption?.previousElementSibling\n let maxSteps = 0\n\n while (nextNode && maxSteps < MAX_DOM_CRAWLS) {\n if (isValidOptionNode(nextNode)) {\n return nextNode\n }\n\n nextNode = nextNode.previousElementSibling\n maxSteps += 1\n }\n}\n\nconst createTypeahead = () => {\n let currentValue: string = \"\"\n let timeoutId: ReturnType<typeof setTimeout>\n\n return (char: string) => {\n // Searching is case-insensitive\n char = char.toLowerCase()\n\n // Add the new character to the current value\n currentValue += char\n\n // Clear the previous timeout if there was one\n if (timeoutId) clearTimeout(timeoutId)\n\n // Reset the value after a brief delay\n timeoutId = setTimeout(() => {\n currentValue = \"\"\n }, 500)\n\n // When a user is typing the same value, like \"llll\", assume they are cycling through items starting with \"l\"\n // We continue to build up the string in case another letter is typed, and then release the full value.\n // For example, if the user types \"ooog\", it will return \"o\", until \"g\" is typed, and then return the \"ooog\".\n const isCycling = char.repeat(currentValue.length) === currentValue\n\n // Return the typeahead value\n return isCycling ? char : currentValue\n }\n}\n\nconst isValidTypeaheadChar = (char: string): boolean => /^[a-zA-Z0-9]$/.test(char)\n\nconst getTypeaheadOption = <T extends Option>(\n options: Options<T>,\n typeaheadValue: string,\n currentHighlightValue?: string,\n): T | undefined => {\n // Ensure options actually exist\n if (!options.length) {\n return undefined\n }\n\n let matchBeforeHighlight: T | undefined\n let matchAfterHighlight: T | undefined\n // If we' aren't provided a highlighted value, start from the top (e.g., act like it's found)\n let foundHighlightedValue: boolean = !currentHighlightValue\n\n const optionValidAndMatches = ({ disabled, label, value }: T) => {\n // Side effect of looping\n if (value === currentHighlightValue) {\n foundHighlightedValue = true\n // Don't return highlighted value\n return false\n }\n\n return !disabled && label.toLowerCase().startsWith(typeaheadValue)\n }\n\n for (const opt of options) {\n if (isOptionGroup(opt)) {\n for (const option of opt.options) {\n if (optionValidAndMatches(option)) {\n if (foundHighlightedValue) {\n matchAfterHighlight = option\n // We're done after we've found an after match\n break\n } else {\n // Keep the first found \"before\" match\n matchBeforeHighlight = matchBeforeHighlight || option\n }\n }\n }\n } else {\n if (optionValidAndMatches(opt)) {\n if (foundHighlightedValue) {\n matchAfterHighlight = opt\n // We're done after we've found an after match\n break\n } else {\n // Keep the first found \"before\" match\n matchBeforeHighlight = matchBeforeHighlight || opt\n }\n }\n }\n }\n\n return matchAfterHighlight || matchBeforeHighlight\n}\n"]}
|
|
@@ -146,10 +146,13 @@
|
|
|
146
146
|
width: 16px;
|
|
147
147
|
height: 16px;
|
|
148
148
|
}.OptionIndicatorSlot {
|
|
149
|
+
display: flex;
|
|
150
|
+
align-items: center;
|
|
149
151
|
flex-grow: 0;
|
|
150
152
|
flex-shrink: 0;
|
|
151
153
|
width: 16px;
|
|
152
|
-
height
|
|
154
|
+
/* Follow the title's first line box, independently of description height. */
|
|
155
|
+
height: 1lh;
|
|
153
156
|
}.OptionDescription {
|
|
154
157
|
font-weight: var(--font-weight-normal);
|
|
155
158
|
color: var(--color-text-secondary);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DateTime } from "luxon";
|
|
2
2
|
import { type PopoverContentProps } from "../Popover";
|
|
3
3
|
import { type SelectControlProps } from "../SelectControl";
|
|
4
|
-
export type DatePickerProps = {
|
|
4
|
+
export type DatePickerProps = Pick<SelectControlProps, "aria-label" | "aria-labelledby" | "aria-describedby" | "aria-invalid"> & {
|
|
5
5
|
/**
|
|
6
6
|
* Allow targeting the input for forms and accessibility.
|
|
7
7
|
*/
|
|
@@ -72,7 +72,8 @@ type MultiSelectProps<T extends Option> = {
|
|
|
72
72
|
*/
|
|
73
73
|
TriggerView?: React.FC<MultiSelectTriggerViewProps<T>>;
|
|
74
74
|
};
|
|
75
|
-
|
|
75
|
+
type SelectAccessibilityProps = Pick<SelectControlProps, "aria-label" | "aria-labelledby" | "aria-describedby" | "aria-invalid">;
|
|
76
|
+
export type SelectProps<T extends Option> = (SingleSelectProps<T> | MultiSelectProps<T>) & SelectAccessibilityProps & {
|
|
76
77
|
options: Options<T>;
|
|
77
78
|
/**
|
|
78
79
|
* Disables the select visually and from interactions
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plexui/ui",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.4",
|
|
4
4
|
"description": "Modern design system for building high-quality applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"homepage": "https://plexui.com",
|
|
12
12
|
"repository": {
|
|
13
13
|
"type": "git",
|
|
14
|
-
"url": "https://github.com/plex-ui/
|
|
14
|
+
"url": "https://github.com/plex-ui/ui.git",
|
|
15
15
|
"directory": "packages/ui"
|
|
16
16
|
},
|
|
17
17
|
"keywords": [
|