@wow-two-beta/ui 0.0.57 → 0.0.58
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/actions/button/Button.d.ts +0 -9
- package/dist/actions/buttonGroup/ButtonGroup.d.ts +2 -2
- package/dist/actions/disclosureButton/DisclosureButton.d.ts +1 -1
- package/dist/actions/index.js +4 -4
- package/dist/actions/speedDial/SpeedDial.d.ts +2 -2
- package/dist/actions/toggleButton/ToggleButton.d.ts +1 -1
- package/dist/actions/toggleButtonGroup/ToggleButtonGroup.d.ts +1 -1
- package/dist/{chunk-VR5HH4SX.js → chunk-4XWLEKH2.js} +10 -4
- package/dist/chunk-4XWLEKH2.js.map +1 -0
- package/dist/{chunk-3GZOE7JF.js → chunk-577JZ2A2.js} +3 -3
- package/dist/{chunk-3GZOE7JF.js.map → chunk-577JZ2A2.js.map} +1 -1
- package/dist/{chunk-BI6JZY2O.js → chunk-DJJOQWOG.js} +6 -6
- package/dist/chunk-DJJOQWOG.js.map +1 -0
- package/dist/{chunk-FEXH7YWU.js → chunk-EEHJHPAP.js} +30 -30
- package/dist/chunk-EEHJHPAP.js.map +1 -0
- package/dist/{chunk-5Y43MUOK.js → chunk-EJCO7AWR.js} +11 -11
- package/dist/chunk-EJCO7AWR.js.map +1 -0
- package/dist/{chunk-ZFNGOAHR.js → chunk-EX4AOJCN.js} +58 -58
- package/dist/chunk-EX4AOJCN.js.map +1 -0
- package/dist/{chunk-4WYHY6KV.js → chunk-FNSC4LAL.js} +3 -3
- package/dist/{chunk-4WYHY6KV.js.map → chunk-FNSC4LAL.js.map} +1 -1
- package/dist/{chunk-WOKIYORV.js → chunk-FYG23O4O.js} +262 -28
- package/dist/chunk-FYG23O4O.js.map +1 -0
- package/dist/{chunk-WPTF6ZRR.js → chunk-GSAOM2ZR.js} +67 -38
- package/dist/chunk-GSAOM2ZR.js.map +1 -0
- package/dist/{chunk-JOOE4KS5.js → chunk-HG7NX6GP.js} +509 -380
- package/dist/chunk-HG7NX6GP.js.map +1 -0
- package/dist/{chunk-XDP6GEBA.js → chunk-JYGC5SRP.js} +39 -5
- package/dist/chunk-JYGC5SRP.js.map +1 -0
- package/dist/{chunk-4QOCAFCA.js → chunk-MTD4RTGO.js} +19 -19
- package/dist/chunk-MTD4RTGO.js.map +1 -0
- package/dist/{chunk-USGZGMLY.js → chunk-NR5DYKSJ.js} +3 -3
- package/dist/{chunk-USGZGMLY.js.map → chunk-NR5DYKSJ.js.map} +1 -1
- package/dist/{chunk-VYOQYXK6.js → chunk-OBW7JUNL.js} +12 -12
- package/dist/chunk-OBW7JUNL.js.map +1 -0
- package/dist/{chunk-UI4RT5JF.js → chunk-TTSJZEL7.js} +25 -25
- package/dist/chunk-TTSJZEL7.js.map +1 -0
- package/dist/{chunk-5PMOT5MD.js → chunk-V267IMBH.js} +86 -4
- package/dist/chunk-V267IMBH.js.map +1 -0
- package/dist/{chunk-ZH6BB54G.js → chunk-XDATW7NF.js} +3 -3
- package/dist/{chunk-ZH6BB54G.js.map → chunk-XDATW7NF.js.map} +1 -1
- package/dist/{chunk-4OKJVYBV.js → chunk-Y5GS4CLT.js} +221 -186
- package/dist/chunk-Y5GS4CLT.js.map +1 -0
- package/dist/display/accordion/Accordion.d.ts +15 -11
- package/dist/display/activityFeed/ActivityFeed.d.ts +2 -2
- package/dist/display/annotationMarker/AnnotationMarker.d.ts +6 -7
- package/dist/display/audioPlayer/AudioPlayer.d.ts +1 -1
- package/dist/display/audioWaveform/AudioWaveform.d.ts +1 -1
- package/dist/display/avatar/Avatar.d.ts +1 -1
- package/dist/display/badgeOverlay/BadgeOverlay.d.ts +1 -1
- package/dist/display/carousel/Carousel.d.ts +1 -1
- package/dist/display/chatBubble/ChatBubble.d.ts +2 -2
- package/dist/display/collapsible/Collapsible.d.ts +2 -2
- package/dist/display/commentThread/CommentThread.d.ts +1 -1
- package/dist/display/confetti/Confetti.d.ts +2 -2
- package/dist/display/countBadge/CountBadge.d.ts +3 -4
- package/dist/display/countUp/CountUp.d.ts +2 -2
- package/dist/display/dataGrid/DataGrid.d.ts +2 -2
- package/dist/display/dataTable/DataTable.d.ts +5 -5
- package/dist/display/diffViewer/DiffViewer.d.ts +1 -1
- package/dist/display/eventCalendar/EventCalendar.d.ts +1 -1
- package/dist/display/gantt/Gantt.d.ts +1 -1
- package/dist/display/gradientText/GradientText.d.ts +2 -2
- package/dist/display/heatmapCalendar/HeatmapCalendar.d.ts +1 -1
- package/dist/display/highlight/Highlight.d.ts +2 -2
- package/dist/display/index.js +6 -6
- package/dist/display/list/List.d.ts +2 -2
- package/dist/display/marquee/Marquee.d.ts +1 -1
- package/dist/display/messageList/MessageList.d.ts +3 -3
- package/dist/display/notificationDot/NotificationDot.d.ts +1 -1
- package/dist/display/pdfViewer/PDFViewer.d.ts +1 -1
- package/dist/display/reactionBar/ReactionBar.d.ts +6 -6
- package/dist/display/scrollReveal/ScrollReveal.d.ts +1 -1
- package/dist/display/sectionHeader/SectionHeader.d.ts +1 -1
- package/dist/display/separator/Separator.d.ts +2 -3
- package/dist/display/sparkline/Sparkline.d.ts +1 -1
- package/dist/display/status/Status.d.ts +1 -1
- package/dist/display/swipeActions/SwipeActions.d.ts +1 -1
- package/dist/display/table/Table.d.ts +17 -5
- package/dist/display/table/index.d.ts +1 -1
- package/dist/display/tabs/Tabs.d.ts +1 -1
- package/dist/display/text/Text.variants.d.ts +14 -14
- package/dist/display/threadView/ThreadView.d.ts +2 -2
- package/dist/display/tilt/Tilt.d.ts +2 -3
- package/dist/display/tooltip/Tooltip.d.ts +2 -2
- package/dist/display/tree/Tree.d.ts +2 -2
- package/dist/display/typewriter/Typewriter.d.ts +2 -2
- package/dist/feedback/index.js +6 -6
- package/dist/feedback/liveCursor/LiveCursor.d.ts +4 -6
- package/dist/feedback/loadingOverlay/LoadingOverlay.d.ts +5 -6
- package/dist/feedback/notificationCenter/NotificationCenter.d.ts +1 -1
- package/dist/feedback/onboardingChecklist/OnboardingChecklist.d.ts +3 -3
- package/dist/feedback/presenceIndicator/PresenceIndicator.d.ts +1 -1
- package/dist/feedback/statusIndicator/StatusIndicator.d.ts +1 -1
- package/dist/feedback/toaster/Toaster.d.ts +2 -2
- package/dist/feedback/tour/Tour.d.ts +2 -2
- package/dist/feedback/trendIndicator/TrendIndicator.d.ts +2 -2
- package/dist/feedback/typingIndicator/TypingIndicator.d.ts +1 -1
- package/dist/feedback/undoBar/UndoBar.d.ts +4 -4
- package/dist/forms/addressForm/AddressForm.d.ts +3 -3
- package/dist/forms/characterCount/CharacterCount.d.ts +1 -1
- package/dist/forms/chatComposer/ChatComposer.d.ts +2 -2
- package/dist/forms/checkbox/Checkbox.d.ts +1 -1
- package/dist/forms/checkboxGroup/CheckboxGroup.d.ts +1 -1
- package/dist/forms/codeEditor/CodeEditor.d.ts +2 -2
- package/dist/forms/colorArea/ColorArea.d.ts +1 -1
- package/dist/forms/colorField/ColorField.d.ts +1 -1
- package/dist/forms/colorPicker/ColorPicker.d.ts +2 -2
- package/dist/forms/colorSlider/ColorSlider.d.ts +1 -1
- package/dist/forms/colorSwatch/ColorSwatch.variants.d.ts +14 -14
- package/dist/forms/colorSwatchPicker/ColorSwatchPicker.d.ts +2 -2
- package/dist/forms/colorWheel/ColorWheel.d.ts +1 -1
- package/dist/forms/combobox/Combobox.d.ts +4 -4
- package/dist/forms/cronInput/CronInput.d.ts +2 -2
- package/dist/forms/datePicker/DatePicker.d.ts +1 -1
- package/dist/forms/dateRangePicker/DateRangePicker.d.ts +1 -1
- package/dist/forms/editable/Editable.d.ts +7 -7
- package/dist/forms/emojiPicker/EmojiPicker.d.ts +1 -1
- package/dist/forms/fileUpload/FileUpload.d.ts +1 -1
- package/dist/forms/fontPicker/FontPicker.d.ts +1 -1
- package/dist/forms/gradientPicker/GradientPicker.d.ts +1 -1
- package/dist/forms/iconPicker/IconPicker.d.ts +1 -1
- package/dist/forms/index.js +11 -11
- package/dist/forms/jsonEditor/JSONEditor.d.ts +3 -3
- package/dist/forms/knob/Knob.d.ts +2 -2
- package/dist/forms/label/Label.d.ts +1 -1
- package/dist/forms/listbox/Listbox.d.ts +8 -4
- package/dist/forms/markdownEditor/MarkdownEditor.d.ts +1 -1
- package/dist/forms/multiSelect/MultiSelect.d.ts +4 -4
- package/dist/forms/passwordInput/PasswordInput.d.ts +1 -1
- package/dist/forms/passwordStrength/PasswordStrength.d.ts +1 -1
- package/dist/forms/phoneInput/PhoneInput.d.ts +3 -3
- package/dist/forms/pinInput/PinInput.d.ts +2 -2
- package/dist/forms/radioGroup/RadioGroup.d.ts +1 -1
- package/dist/forms/reactionPicker/ReactionPicker.d.ts +1 -1
- package/dist/forms/recurrenceEditor/RecurrenceEditor.d.ts +2 -2
- package/dist/forms/searchInput/SearchInput.d.ts +1 -1
- package/dist/forms/select/Select.d.ts +14 -7
- package/dist/forms/select/Select.variants.d.ts +46 -3
- package/dist/forms/stepper/Stepper.d.ts +1 -1
- package/dist/forms/tagsInput/TagsInput.d.ts +2 -2
- package/dist/forms/timePicker/TimePicker.d.ts +1 -1
- package/dist/forms/wizard/Wizard.d.ts +5 -5
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useTypeahead.d.ts +37 -0
- package/dist/icons/index.js +1 -1
- package/dist/index.js +18 -18
- package/dist/layout/appShell/AppShell.d.ts +2 -2
- package/dist/layout/frame/Frame.d.ts +1 -1
- package/dist/layout/grid/Grid.d.ts +17 -5
- package/dist/layout/grid/Grid.variants.d.ts +15 -0
- package/dist/layout/grid/index.d.ts +1 -1
- package/dist/layout/index.d.ts +2 -0
- package/dist/layout/index.js +9 -9
- package/dist/layout/inline/Inline.d.ts +5 -0
- package/dist/layout/navbar/Navbar.d.ts +37 -0
- package/dist/layout/navbar/Navbar.variants.d.ts +76 -0
- package/dist/layout/navbar/index.d.ts +2 -0
- package/dist/layout/pullToRefresh/PullToRefresh.d.ts +1 -1
- package/dist/layout/resizablePanels/ResizablePanels.d.ts +1 -1
- package/dist/layout/section/Section.d.ts +26 -0
- package/dist/layout/section/Section.variants.d.ts +62 -0
- package/dist/layout/section/index.d.ts +2 -0
- package/dist/nav/commandPalette/CommandPalette.d.ts +1 -1
- package/dist/nav/contextMenu/ContextMenu.d.ts +1 -1
- package/dist/nav/index.js +8 -8
- package/dist/nav/menu/Menu.d.ts +1 -1
- package/dist/nav/navItem/NavItem.d.ts +2 -3
- package/dist/nav/tableOfContents/TableOfContents.d.ts +1 -1
- package/dist/overlays/actionSheet/ActionSheet.d.ts +1 -1
- package/dist/overlays/backdrop/Backdrop.d.ts +3 -6
- package/dist/overlays/dialog/Dialog.d.ts +1 -1
- package/dist/overlays/drawer/Drawer.d.ts +1 -1
- package/dist/overlays/index.js +8 -8
- package/dist/overlays/popover/Popover.d.ts +1 -1
- package/dist/primitives/anchoredPositioner/AnchoredPositioner.d.ts +1 -1
- package/dist/primitives/dismissableLayer/DismissableLayer.d.ts +2 -2
- package/dist/primitives/index.js +1 -1
- package/dist/primitives/presence/Presence.d.ts +3 -3
- package/dist/primitives/rovingFocusGroup/RovingFocusGroup.d.ts +3 -6
- package/dist/primitives/scrollLockProvider/ScrollLockProvider.d.ts +2 -2
- package/dist/utils/Environment.d.ts +8 -0
- package/dist/utils/SurfaceStyles.d.ts +7 -0
- package/dist/utils/Tones.d.ts +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-4OKJVYBV.js.map +0 -1
- package/dist/chunk-4QOCAFCA.js.map +0 -1
- package/dist/chunk-5PMOT5MD.js.map +0 -1
- package/dist/chunk-5Y43MUOK.js.map +0 -1
- package/dist/chunk-BI6JZY2O.js.map +0 -1
- package/dist/chunk-FEXH7YWU.js.map +0 -1
- package/dist/chunk-JOOE4KS5.js.map +0 -1
- package/dist/chunk-UI4RT5JF.js.map +0 -1
- package/dist/chunk-VR5HH4SX.js.map +0 -1
- package/dist/chunk-VYOQYXK6.js.map +0 -1
- package/dist/chunk-WOKIYORV.js.map +0 -1
- package/dist/chunk-WPTF6ZRR.js.map +0 -1
- package/dist/chunk-XDP6GEBA.js.map +0 -1
- package/dist/chunk-ZFNGOAHR.js.map +0 -1
|
@@ -112,14 +112,14 @@ function getTotalDurationMs(node) {
|
|
|
112
112
|
maxOf(parseTimes(cs.animationDuration), parseTimes(cs.animationDelay))
|
|
113
113
|
);
|
|
114
114
|
}
|
|
115
|
-
function Presence({
|
|
116
|
-
const [rendered, setRendered] = useState(
|
|
115
|
+
function Presence({ isPresent, children }) {
|
|
116
|
+
const [rendered, setRendered] = useState(isPresent);
|
|
117
117
|
const [dataState, setDataState] = useState("closed");
|
|
118
118
|
const ref = useRef(null);
|
|
119
119
|
const child = isValidElement(children) ? children : null;
|
|
120
120
|
const composedRef = useComposedRefs(ref, child?.ref);
|
|
121
121
|
useEffect(() => {
|
|
122
|
-
if (!
|
|
122
|
+
if (!isPresent) return;
|
|
123
123
|
if (!rendered) {
|
|
124
124
|
setRendered(true);
|
|
125
125
|
return;
|
|
@@ -133,9 +133,9 @@ function Presence({ present, children }) {
|
|
|
133
133
|
cancelAnimationFrame(raf1);
|
|
134
134
|
cancelAnimationFrame(raf2);
|
|
135
135
|
};
|
|
136
|
-
}, [
|
|
136
|
+
}, [isPresent, rendered, dataState]);
|
|
137
137
|
useEffect(() => {
|
|
138
|
-
if (
|
|
138
|
+
if (isPresent) return;
|
|
139
139
|
const node = ref.current;
|
|
140
140
|
if (!node) {
|
|
141
141
|
setRendered(false);
|
|
@@ -175,7 +175,7 @@ function Presence({ present, children }) {
|
|
|
175
175
|
cancelAnimationFrame(raf2);
|
|
176
176
|
if (timer !== void 0) window.clearTimeout(timer);
|
|
177
177
|
};
|
|
178
|
-
}, [
|
|
178
|
+
}, [isPresent]);
|
|
179
179
|
if (!rendered || !child) return null;
|
|
180
180
|
return cloneElement(child, {
|
|
181
181
|
ref: composedRef,
|
|
@@ -202,7 +202,7 @@ function AccessibleIcon({ label, children }) {
|
|
|
202
202
|
var FocusScope = FocusScope$1;
|
|
203
203
|
var layerStack = [];
|
|
204
204
|
var DismissableLayer = forwardRef(
|
|
205
|
-
({ onEscape, onOutsidePointerDown,
|
|
205
|
+
({ onEscape, onOutsidePointerDown, isEscapeDisabled, isOutsideClickDisabled, ...props }, forwardedRef) => {
|
|
206
206
|
const ref = useRef(null);
|
|
207
207
|
const onEscapeRef = useRef(onEscape);
|
|
208
208
|
const onOutsidePointerDownRef = useRef(onOutsidePointerDown);
|
|
@@ -225,7 +225,7 @@ var DismissableLayer = forwardRef(
|
|
|
225
225
|
};
|
|
226
226
|
}, []);
|
|
227
227
|
useEffect(() => {
|
|
228
|
-
if (
|
|
228
|
+
if (isEscapeDisabled) return;
|
|
229
229
|
const onKeyDown = (e) => {
|
|
230
230
|
if (e.key !== "Escape") return;
|
|
231
231
|
const top = layerStack[layerStack.length - 1];
|
|
@@ -233,9 +233,9 @@ var DismissableLayer = forwardRef(
|
|
|
233
233
|
};
|
|
234
234
|
document.addEventListener("keydown", onKeyDown);
|
|
235
235
|
return () => document.removeEventListener("keydown", onKeyDown);
|
|
236
|
-
}, [
|
|
236
|
+
}, [isEscapeDisabled]);
|
|
237
237
|
useEffect(() => {
|
|
238
|
-
if (
|
|
238
|
+
if (isOutsideClickDisabled) return;
|
|
239
239
|
const onPointer = (e) => {
|
|
240
240
|
const top = layerStack[layerStack.length - 1];
|
|
241
241
|
if (!top || top.node !== ref.current) return;
|
|
@@ -245,16 +245,16 @@ var DismissableLayer = forwardRef(
|
|
|
245
245
|
};
|
|
246
246
|
document.addEventListener("pointerdown", onPointer, true);
|
|
247
247
|
return () => document.removeEventListener("pointerdown", onPointer, true);
|
|
248
|
-
}, [
|
|
248
|
+
}, [isOutsideClickDisabled]);
|
|
249
249
|
const composedRef = useComposedRefs(forwardedRef, ref);
|
|
250
250
|
return /* @__PURE__ */ jsx("div", { ref: composedRef, ...props });
|
|
251
251
|
}
|
|
252
252
|
);
|
|
253
253
|
DismissableLayer.displayName = "DismissableLayer";
|
|
254
254
|
var AnchoredPositioner = forwardRef(
|
|
255
|
-
({ anchor, placement = "bottom", offset: offset$1 = 8,
|
|
255
|
+
({ anchor, placement = "bottom", offset: offset$1 = 8, isOpen = true, children, style, ...props }, forwardedRef) => {
|
|
256
256
|
const { refs, floatingStyles } = useFloating({
|
|
257
|
-
open,
|
|
257
|
+
open: isOpen,
|
|
258
258
|
placement,
|
|
259
259
|
middleware: [
|
|
260
260
|
offset(offset$1),
|
|
@@ -273,7 +273,7 @@ var AnchoredPositioner = forwardRef(
|
|
|
273
273
|
whileElementsMounted: autoUpdate,
|
|
274
274
|
elements: { reference: anchor }
|
|
275
275
|
});
|
|
276
|
-
if (!
|
|
276
|
+
if (!isOpen) return null;
|
|
277
277
|
return /* @__PURE__ */ jsx(
|
|
278
278
|
"div",
|
|
279
279
|
{
|
|
@@ -288,7 +288,7 @@ var AnchoredPositioner = forwardRef(
|
|
|
288
288
|
AnchoredPositioner.displayName = "AnchoredPositioner";
|
|
289
289
|
var RovingFocusContext = createContext(null);
|
|
290
290
|
var RovingFocusGroup = forwardRef(
|
|
291
|
-
function RovingFocusGroup2({ orientation = "horizontal",
|
|
291
|
+
function RovingFocusGroup2({ orientation = "horizontal", canLoop = true, children, ...props }, ref) {
|
|
292
292
|
const items = useRef([]);
|
|
293
293
|
const [focusedId, setFocusedId] = useState(null);
|
|
294
294
|
const interactedRef = useRef(false);
|
|
@@ -337,10 +337,10 @@ var RovingFocusGroup = forwardRef(
|
|
|
337
337
|
let next = idx;
|
|
338
338
|
if (event.key === nextHorizKey && isHoriz || event.key === "ArrowDown" && isVert) {
|
|
339
339
|
next = idx + 1;
|
|
340
|
-
if (next >= list.length) next =
|
|
340
|
+
if (next >= list.length) next = canLoop ? 0 : list.length - 1;
|
|
341
341
|
} else if (event.key === prevHorizKey && isHoriz || event.key === "ArrowUp" && isVert) {
|
|
342
342
|
next = idx - 1;
|
|
343
|
-
if (next < 0) next =
|
|
343
|
+
if (next < 0) next = canLoop ? list.length - 1 : 0;
|
|
344
344
|
} else if (event.key === "Home") {
|
|
345
345
|
next = 0;
|
|
346
346
|
} else if (event.key === "End") {
|
|
@@ -353,7 +353,7 @@ var RovingFocusGroup = forwardRef(
|
|
|
353
353
|
const entry = list[next];
|
|
354
354
|
if (entry) setFocusedId(entry.id);
|
|
355
355
|
},
|
|
356
|
-
[orientation,
|
|
356
|
+
[orientation, canLoop, direction]
|
|
357
357
|
);
|
|
358
358
|
const value = useMemo(
|
|
359
359
|
() => ({
|
|
@@ -371,7 +371,7 @@ var RovingFocusGroup = forwardRef(
|
|
|
371
371
|
}
|
|
372
372
|
);
|
|
373
373
|
function useRovingFocusItem(options = {}) {
|
|
374
|
-
const {
|
|
374
|
+
const { isActive = false } = options;
|
|
375
375
|
const context = useContext(RovingFocusContext);
|
|
376
376
|
const id = useId();
|
|
377
377
|
const ref = useRef(null);
|
|
@@ -391,7 +391,7 @@ function useRovingFocusItem(options = {}) {
|
|
|
391
391
|
const setFocusedId = context?.setFocusedId;
|
|
392
392
|
const groupRef = context?.groupRef;
|
|
393
393
|
useEffect(() => {
|
|
394
|
-
if (!
|
|
394
|
+
if (!isActive || !setFocusedId || !groupRef) return;
|
|
395
395
|
const groupNode = groupRef.current;
|
|
396
396
|
if (!groupNode || !groupNode.contains(document.activeElement)) setFocusedId(id);
|
|
397
397
|
const onFocusOut = (event) => {
|
|
@@ -400,7 +400,7 @@ function useRovingFocusItem(options = {}) {
|
|
|
400
400
|
};
|
|
401
401
|
groupNode?.addEventListener("focusout", onFocusOut);
|
|
402
402
|
return () => groupNode?.removeEventListener("focusout", onFocusOut);
|
|
403
|
-
}, [
|
|
403
|
+
}, [isActive, setFocusedId, groupRef, id]);
|
|
404
404
|
return {
|
|
405
405
|
ref: (node) => {
|
|
406
406
|
ref.current = node;
|
|
@@ -463,8 +463,8 @@ function FormControlProvider({
|
|
|
463
463
|
function useFormControl() {
|
|
464
464
|
return useContext(Context);
|
|
465
465
|
}
|
|
466
|
-
function ScrollLockProvider({
|
|
467
|
-
useScrollLock(
|
|
466
|
+
function ScrollLockProvider({ isEnabled = true, children }) {
|
|
467
|
+
useScrollLock(isEnabled);
|
|
468
468
|
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
469
469
|
}
|
|
470
470
|
var OverlayArrow = forwardRef(
|
|
@@ -505,5 +505,5 @@ var Announce = forwardRef(
|
|
|
505
505
|
Announce.displayName = "Announce";
|
|
506
506
|
|
|
507
507
|
export { AccessibleIcon, AnchoredPositioner, Announce, DirectionProvider, DismissableLayer, FocusScope, FormControlProvider, OverlayArrow, Portal, Presence, RovingFocusGroup, ScrollLockProvider, Slot, VisuallyHidden, createCollection, primitives_exports, useDirection, useFormControl, useRovingFocusItem };
|
|
508
|
-
//# sourceMappingURL=chunk-
|
|
509
|
-
//# sourceMappingURL=chunk-
|
|
508
|
+
//# sourceMappingURL=chunk-TTSJZEL7.js.map
|
|
509
|
+
//# sourceMappingURL=chunk-TTSJZEL7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/index.ts","../src/primitives/slot/Slot.tsx","../src/primitives/portal/Portal.tsx","../src/primitives/visuallyHidden/VisuallyHidden.tsx","../src/primitives/presence/Presence.tsx","../src/primitives/directionProvider/DirectionProvider.tsx","../src/primitives/accessibleIcon/AccessibleIcon.tsx","../src/primitives/focusScope/FocusScope.tsx","../src/primitives/dismissableLayer/DismissableLayer.tsx","../src/primitives/anchoredPositioner/AnchoredPositioner.tsx","../src/primitives/rovingFocusGroup/RovingFocusGroup.tsx","../src/primitives/collection/Collection.tsx","../src/primitives/formControlContext/FormControlContext.tsx","../src/primitives/scrollLockProvider/ScrollLockProvider.tsx","../src/primitives/overlayArrow/OverlayArrow.tsx","../src/primitives/announce/Announce.tsx"],"names":["forwardRef","jsx","useState","isValidElement","useEffect","cloneElement","RadixFocusScope","useRef","offset","offsetMiddleware","sizeMiddleware","createContext","RovingFocusGroup","useContext","useId","useCallback","useMemo","Fragment","OverlayArrow"],"mappings":";;;;;;;;;;AAAA,IAAA,kBAAA,GAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;ACkBA,SAAS,UAAA,CAAW,WAAqB,UAAA,EAAgC;AACvE,EAAA,MAAM,MAAA,GAAmB,EAAE,GAAG,UAAA,EAAW;AACzC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,OAAA,GAAU,UAAU,GAAG,CAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,MAAA,CAAO,SAAA,GAAY,CAAC,OAAA,EAAS,QAAQ,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IACjE,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,MAAA,CAAO,KAAA,GAAQ,EAAE,GAAI,OAAA,EAA2B,GAAI,QAAA,EAA2B;AAAA,IACjF,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AAC/B,MAAA,MAAM,MAAA,GAAS,OAAA;AACf,MAAA,MAAM,OAAA,GAAU,QAAA;AAChB,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,GAAI,IAAA,KAAoB;AACpC,UAAA,OAAA,CAAQ,GAAG,IAAI,CAAA;AACf,UAAA,MAAA,CAAO,GAAG,IAAI,CAAA;AAAA,QAChB,CAAA;AAAA,MACF,WAAW,MAAA,EAAQ;AACjB,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA;AAAA,MAChB;AAAA,IACF,CAAA,MAAA,IAAW,aAAa,MAAA,EAAW;AACjC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,OAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAWO,IAAM,IAAA,GAAO,UAAA;AAAA,EAClB,CAAC,EAAE,QAAA,EAAU,GAAG,SAAA,IAAa,YAAA,KAAiB;AAC5C,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAQ,CAAA,GAChC,QAAA,GACD,IAAA;AACJ,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,YAAA,EAAc,KAAA,EAAO,GAAG,CAAA;AAC5D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,QAAA,CAAS,MAAM,QAAQ,CAAA,GAAI,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,IAC9D;AACA,IAAA,MAAM,SAAS,UAAA,CAAW,SAAA,EAAwB,KAAA,CAAM,KAAA,IAAS,EAAe,CAAA;AAChF,IAAA,OAAO,aAAa,KAAA,EAAO;AAAA,MACzB,GAAG,MAAA;AAAA,MACH,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AACF;AACA,IAAA,CAAK,WAAA,GAAc,MAAA;ACvDZ,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,SAAA,EAAW,MAAK,EAA2B;AAC5E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,MAAA,GAAS,aAAa,QAAA,CAAS,IAAA;AACrC,EAAA,OAAO,6BAAa,GAAA,CAAC,KAAA,EAAA,EAAI,oBAAkB,IAAA,EAAO,QAAA,EAAS,GAAQ,MAAM,CAAA;AAC3E;ACdO,IAAM,cAAA,GAAiBA,UAAAA;AAAA,EAC5B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,wBACxBC,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,mEAAA;AAAA,QACA,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA;AAGV;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA;ACL7B,SAAS,WAAW,KAAA,EAAyB;AAC3C,EAAA,OAAO,MAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACpC,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GAAI,WAAW,OAAO,CAAA,GAAI,UAAA,CAAW,OAAO,CAAA,GAAI,GAAA;AAChF,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,EAAA,GAAK,CAAA;AAAA,EACpC,CAAC,CAAA;AACH;AAGA,SAAS,mBAAmB,IAAA,EAA2B;AACrD,EAAA,MAAM,EAAA,GAAK,iBAAiB,IAAI,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,CAAC,SAAA,EAAqB,MAAA,KAClC,SAAA,CAAU,MAAA;AAAA,IACR,CAAC,GAAA,EAAK,QAAA,EAAU,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,QAAA,IAAY,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/E;AAAA,GACF;AACF,EAAA,OAAO,IAAA,CAAK,GAAA;AAAA,IACV,KAAA,CAAM,WAAW,EAAA,CAAG,kBAAkB,GAAG,UAAA,CAAW,EAAA,CAAG,eAAe,CAAC,CAAA;AAAA,IACvE,KAAA,CAAM,WAAW,EAAA,CAAG,iBAAiB,GAAG,UAAA,CAAW,EAAA,CAAG,cAAc,CAAC;AAAA,GACvE;AACF;AAWO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,QAAA,EAAS,EAAuC;AACpF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,SAAS,SAAS,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA4B,QAAQ,CAAA;AACtE,EAAA,MAAM,GAAA,GAAM,OAA2B,IAAI,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAQC,cAAAA,CAAe,QAAQ,CAAA,GAChC,QAAA,GACD,IAAA;AACJ,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAInD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,cAAc,MAAA,EAAQ;AAC1B,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,MAAM,IAAA,GAAO,sBAAsB,MAAM;AACvC,MAAA,IAAA,GAAO,qBAAA,CAAsB,MAAM,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,IACzD,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,IAC3B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,QAAA,EAAU,SAAS,CAAC,CAAA;AAKnC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAiB;AAChC,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,IAAA,EAAM,OAAA,GAAU,IAAA;AAAA,IACvC,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAiB;AAC9B,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,IAAA,EAAM,WAAA,CAAY,KAAK,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,kBAAkB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAiB,OAAO,CAAA;AAC9C,IAAA,IAAA,CAAK,gBAAA,CAAiB,gBAAgB,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAiB,KAAK,CAAA;AAG5C,IAAA,IAAA,CAAK,YAAA,CAAa,cAAc,QAAQ,CAAA;AACxC,IAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,IAAA,MAAM,IAAA,GAAO,sBAAsB,MAAM;AACvC,MAAA,IAAA,GAAO,sBAAsB,MAAM;AACjC,QAAA,MAAM,YAAY,OAAA,IAAA,CAAY,IAAA,CAAK,aAAA,IAAgB,CAAE,UAAU,CAAA,IAAK,CAAA;AACpE,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA;AAAA,QACF;AACA,QAAA,KAAA,GAAQ,MAAA,CAAO,WAAW,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG,kBAAA,CAAmB,IAAI,CAAA,GAAI,GAAG,CAAA;AAAA,MACpF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,kBAAkB,OAAO,CAAA;AAClD,MAAA,IAAA,CAAK,mBAAA,CAAoB,iBAAiB,OAAO,CAAA;AACjD,MAAA,IAAA,CAAK,mBAAA,CAAoB,gBAAgB,KAAK,CAAA;AAC9C,MAAA,IAAA,CAAK,mBAAA,CAAoB,iBAAiB,KAAK,CAAA;AAC/C,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAAA,IACpD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO,OAAO,IAAA;AAChC,EAAA,OAAOC,aAAa,KAAA,EAAO;AAAA,IACzB,GAAA,EAAK,WAAA;AAAA,IACL,YAAA,EAAc;AAAA,GACgB,CAAA;AAClC;AC/HA,IAAM,gBAAA,GAAmB,cAAyB,KAAK,CAAA;AAWhD,SAAS,iBAAA,CAAkB,EAAE,GAAA,EAAK,QAAA,EAAS,EAA2B;AAC3E,EAAA,uBAAOJ,GAAAA,CAAC,gBAAA,CAAiB,UAAjB,EAA0B,KAAA,EAAO,KAAM,QAAA,EAAS,CAAA;AAC1D;AAEO,SAAS,YAAA,GAA0B;AACxC,EAAA,OAAO,WAAW,gBAAgB,CAAA;AACpC;ACPO,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAS,EAAwB;AACvE,EAAA,MAAM,IAAA,GAAOE,cAAAA,CAAe,QAAQ,CAAA,GAChCE,aAAa,QAAA,EAAoF;AAAA,IAC/F,aAAA,EAAe,MAAA;AAAA,IACf,SAAA,EAAW;AAAA,GACZ,CAAA,GACD,QAAA;AACJ,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBACDJ,GAAAA,CAAC,cAAA,EAAA,EAAgB,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EACzB,CAAA;AAEJ;AChBO,IAAM,UAAA,GAAaK;ACG1B,IAAM,aAA2B,EAAC;AAkB3B,IAAM,gBAAA,GAAmBN,UAAAA;AAAA,EAC9B,CACE,EAAE,QAAA,EAAU,oBAAA,EAAsB,kBAAkB,sBAAA,EAAwB,GAAG,KAAA,EAAM,EACrF,YAAA,KACG;AACH,IAAA,MAAM,GAAA,GAAMO,OAA8B,IAAI,CAAA;AAI9C,IAAA,MAAM,WAAA,GAAcA,OAAO,QAAQ,CAAA;AACnC,IAAA,MAAM,uBAAA,GAA0BA,OAAO,oBAAoB,CAAA;AAC3D,IAAAH,UAAU,MAAM;AACd,MAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,MAAA,uBAAA,CAAwB,OAAA,GAAU,oBAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAAA,UAAU,MAAM;AACd,MAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,KAAA,GAAoB;AAAA,QACxB,IAAA;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,KAAU,WAAA,CAAY,UAAU,KAAK,CAAA;AAAA,QAChD,oBAAA,EAAsB,CAAC,KAAA,KAAU,uBAAA,CAAwB,UAAU,KAAK;AAAA,OAC1E;AACA,MAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AACrB,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACpC,QAAA,IAAI,GAAA,IAAO,CAAA,EAAG,UAAA,CAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACxC,CAAA;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAAA,UAAU,MAAM;AACd,MAAA,IAAI,gBAAA,EAAkB;AACtB,MAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACxB,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC5C,QAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,IAAI,OAAA,EAAS,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,MACvD,CAAA;AACA,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,IAChE,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,IAAAA,UAAU,MAAM;AACd,MAAA,IAAI,sBAAA,EAAwB;AAC5B,MAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAoB;AACrC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC5C,QAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,IAAI,OAAA,EAAS;AACtC,QAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,QAAA,IAAI,CAAC,MAAA,IAAU,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9C,QAAA,GAAA,CAAI,uBAAuB,CAAC,CAAA;AAAA,MAC9B,CAAA;AACA,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,SAAA,EAAW,IAAI,CAAA;AACxD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,WAAW,IAAI,CAAA;AAAA,IAC1E,CAAA,EAAG,CAAC,sBAAsB,CAAC,CAAA;AAE3B,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,YAAA,EAAc,GAAG,CAAA;AACrD,IAAA,uBAAOH,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAA,EAAc,GAAG,KAAA,EAAO,CAAA;AAAA,EAC3C;AACF;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACtDxB,IAAM,kBAAA,GAAqBD,UAAAA;AAAA,EAChC,CACE,EAAE,MAAA,EAAQ,SAAA,GAAY,kBAAUQ,QAAA,GAAS,CAAA,EAAG,MAAA,GAAS,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,GAAG,KAAA,IAC/E,YAAA,KACG;AACH,IAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAe,GAAI,WAAA,CAAY;AAAA,MAC3C,IAAA,EAAM,MAAA;AAAA,MACN,SAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACVC,OAAiBD,QAAM,CAAA;AAAA,QACvB,IAAA,EAAK;AAAA,QACL,KAAA,CAAM,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,QACpBE,IAAA,CAAe;AAAA,UACb,KAAA,CAAM,EAAE,KAAA,EAAO,QAAA,EAAS,EAAG;AACzB,YAAA,QAAA,CAAS,QAAA,CAAS,MAAM,WAAA,CAAY,gBAAA,EAAkB,GAAG,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAA,CAAI,CAAA;AAClF,YAAA,QAAA,CAAS,SAAS,KAAA,CAAM,WAAA;AAAA,cACtB,iBAAA;AAAA,cACA,CAAA,EAAG,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,EAAA;AAAA,aAC3B;AAAA,UACF;AAAA,SACD;AAAA,OACH;AAAA,MACA,oBAAA,EAAsB,UAAA;AAAA,MACtB,QAAA,EAAU,EAAE,SAAA,EAAW,MAAA;AAAO,KAC/B,CAAA;AAED,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,uBACET,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA,CAAY,YAAA,EAAc,IAAA,CAAK,WAAW,CAAA;AAAA,QAC/C,KAAA,EAAO,EAAE,GAAG,cAAA,EAAgB,GAAG,KAAA,EAAM;AAAA,QACpC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,kBAAA,CAAmB,WAAA,GAAc,oBAAA;ACxCjC,IAAM,kBAAA,GAAqBU,cAA8C,IAAI,CAAA;AAatE,IAAM,gBAAA,GAAmBX,UAAAA;AAAA,EAC9B,SAASY,iBAAAA,CACP,EAAE,WAAA,GAAc,YAAA,EAAc,OAAA,GAAU,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EACjE,GAAA,EACA;AACA,IAAA,MAAM,KAAA,GAAQL,MAAAA,CAAoB,EAAE,CAAA;AACpC,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIL,SAAwB,IAAI,CAAA;AAC9D,IAAA,MAAM,aAAA,GAAgBK,OAAO,KAAK,CAAA;AAClC,IAAA,MAAM,QAAA,GAAWA,OAA8B,IAAI,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,GAAA,EAAK,QAAQ,CAAA;AACjD,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,EAAA,EAAY,IAAA,KAA6B;AACrE,MAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,EAAE,CAAA,EAAG;AACjD,QAAA,MAAM,KAAA,GAAmB,EAAE,EAAA,EAAI,IAAA,EAAK;AAGpC,QAAA,MAAM,KAAA,GAAQ,IAAA,GACV,KAAA,CAAM,OAAA,CAAQ,SAAA;AAAA,UACZ,CAAC,IAAA,KACC,IAAA,CAAK,IAAA,KAAS,IAAA,IAAA,CACb,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,2BAAA,MAAiC;AAAA,SACrF,GACA,EAAA;AACJ,QAAA,IAAI,KAAA,KAAU,EAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,aACrC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,GAAG,KAAK,CAAA;AAAA,MAC3C;AACA,MAAA,YAAA,CAAa,CAAC,OAAA,KAAY,OAAA,IAAW,EAAE,CAAA;AAAA,IACzC,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,EAAA,KAAe;AAC7C,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,EAAE,CAAA;AAC5D,MAAA,KAAA,CAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,EAAE,CAAA;AAG7D,MAAA,YAAA,CAAa,CAAC,OAAA,KAAY;AACxB,QAAA,IAAI,OAAA,KAAY,IAAI,OAAO,OAAA;AAC3B,QAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AAClD,QAAA,OAAO,IAAA,GAAO,KAAK,EAAA,GAAK,IAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,EAAE,CAAA;AAIL,IAAAH,UAAU,MAAM;AACd,MAAA,MAAM,OAAO,QAAA,CAAS,OAAA;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAsB;AACxC,QAAA,MAAM,OAAO,KAAA,CAAM,aAAA;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAA,CAAK,SAAS,IAAI,CAAA,gBAAiB,OAAA,GAAU,KAAA;AAAA,MAC7D,CAAA;AACA,MAAA,IAAA,CAAK,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC5C,MAAA,OAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,UAAA,EAAY,UAAU,CAAA;AAAA,IAC9D,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,MACpB,CAAC,OAAsB,EAAA,KAAe;AACpC,QAAA,MAAM,OAAO,KAAA,CAAM,OAAA;AACnB,QAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,EAAE,CAAA;AACnD,QAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,QAAA,MAAM,MAAA,GAAS,WAAA,KAAgB,UAAA,IAAc,WAAA,KAAgB,MAAA;AAC7D,QAAA,MAAM,OAAA,GAAU,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,MAAA;AAEhE,QAAA,MAAM,YAAA,GAAe,SAAA,KAAc,KAAA,GAAQ,WAAA,GAAc,YAAA;AACzD,QAAA,MAAM,YAAA,GAAe,SAAA,KAAc,KAAA,GAAQ,YAAA,GAAe,WAAA;AAC1D,QAAA,IAAI,IAAA,GAAO,GAAA;AACX,QAAA,IAAK,MAAM,GAAA,KAAQ,YAAA,IAAgB,WAAa,KAAA,CAAM,GAAA,KAAQ,eAAe,MAAA,EAAS;AACpF,UAAA,IAAA,GAAO,GAAA,GAAM,CAAA;AACb,UAAA,IAAI,QAAQ,IAAA,CAAK,MAAA,SAAe,OAAA,GAAU,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA;AAAA,QAC9D,CAAA,MAAA,IAAY,MAAM,GAAA,KAAQ,YAAA,IAAgB,WAAa,KAAA,CAAM,GAAA,KAAQ,aAAa,MAAA,EAAS;AACzF,UAAA,IAAA,GAAO,GAAA,GAAM,CAAA;AACb,UAAA,IAAI,OAAO,CAAA,EAAG,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,SAAS,CAAA,GAAI,CAAA;AAAA,QACnD,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,MAAA,EAAQ;AAC/B,UAAA,IAAA,GAAO,CAAA;AAAA,QACT,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,KAAA,EAAO;AAC9B,UAAA,IAAA,GAAO,KAAK,MAAA,GAAS,CAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA;AAAA,QACF;AACA,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,QAAA,MAAM,KAAA,GAAQ,KAAK,IAAI,CAAA;AACvB,QAAA,IAAI,KAAA,EAAO,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA;AAAA,MAClC,CAAA;AAAA,MACA,CAAC,WAAA,EAAa,OAAA,EAAS,SAAS;AAAA,KAClC;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,MACZ,OAAO;AAAA,QACL,QAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,aAAa;AAAA,KACjD;AAEA,IAAA,uBACEH,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAC3B,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,aAAa,IAAA,EAAK,OAAA,EAAS,GAAG,KAAA,EACrC,UACH,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAmBO,SAAS,kBAAA,CACd,OAAA,GAAqC,EAAC,EACZ;AAC1B,EAAA,MAAM,EAAE,QAAA,GAAW,KAAA,EAAM,GAAI,OAAA;AAC7B,EAAA,MAAM,OAAA,GAAUY,WAAW,kBAAkB,CAAA;AAC7C,EAAA,MAAM,KAAKC,KAAAA,EAAM;AACjB,EAAA,MAAM,GAAA,GAAMP,OAA2B,IAAI,CAAA;AAE3C,EAAA,MAAM,WAAW,OAAA,EAAS,QAAA;AAC1B,EAAA,MAAM,aAAa,OAAA,EAAS,UAAA;AAC5B,EAAAH,UAAU,MAAM;AACd,IAAA,QAAA,GAAW,EAAA,EAAI,IAAI,OAAO,CAAA;AAC1B,IAAA,OAAO,MAAM,aAAa,EAAE,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,QAAA,EAAU,UAAA,EAAY,EAAE,CAAC,CAAA;AAG7B,EAAA,MAAM,YAAY,OAAA,EAAS,SAAA;AAC3B,EAAA,MAAM,gBAAgB,OAAA,EAAS,aAAA;AAC/B,EAAAA,UAAU,MAAM;AACd,IAAA,IACE,SAAA,KAAc,MACd,aAAA,EAAe,OAAA,IACf,IAAI,OAAA,IACJ,QAAA,CAAS,aAAA,KAAkB,GAAA,CAAI,OAAA,EAC/B;AACA,MAAA,GAAA,CAAI,QAAQ,KAAA,EAAM;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,aAAA,EAAe,EAAE,CAAC,CAAA;AAIjC,EAAA,MAAM,eAAe,OAAA,EAAS,YAAA;AAC9B,EAAA,MAAM,WAAW,OAAA,EAAS,QAAA;AAC1B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,IAAgB,CAAC,QAAA,EAAU;AAC7C,IAAA,MAAM,YAAY,QAAA,CAAS,OAAA;AAC3B,IAAA,IAAI,CAAC,aAAa,CAAC,SAAA,CAAU,SAAS,QAAA,CAAS,aAAa,CAAA,EAAG,YAAA,CAAa,EAAE,CAAA;AAC9E,IAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAsB;AACxC,MAAA,MAAM,OAAO,KAAA,CAAM,aAAA;AACnB,MAAA,IAAI,CAAC,QAAQ,CAAC,SAAA,EAAW,SAAS,IAAI,CAAA,eAAgB,EAAE,CAAA;AAAA,IAC1D,CAAA;AACA,IAAA,SAAA,EAAW,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAClD,IAAA,OAAO,MAAM,SAAA,EAAW,mBAAA,CAAoB,UAAA,EAAY,UAAU,CAAA;AAAA,EACpE,GAAG,CAAC,QAAA,EAAU,YAAA,EAAc,QAAA,EAAU,EAAE,CAAC,CAAA;AAEzC,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,MAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,IAChB,CAAA;AAAA,IACA,UAAU,CAAC,OAAA,IAAW,OAAA,CAAQ,SAAA,KAAc,KAAK,CAAA,GAAI,EAAA;AAAA,IACrD,WAAW,CAAC,CAAA,KAAM,OAAA,EAAS,aAAA,CAAc,GAAG,EAAE,CAAA;AAAA,IAC9C,SAAS,MAAM;AACb,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,CAAQ,cAAc,OAAA,GAAU,IAAA;AAChC,MAAA,OAAA,CAAQ,aAAa,EAAE,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,wBAAA,EAA0B;AAAA,GAC5B;AACF;ACrNO,SAAS,gBAAA,GAId;AACA,EAAA,MAAM,iBAAA,GAAoBO,cAAgD,IAAI,CAAA;AAE9E,EAAA,SAAS,QAAA,CAAS,EAAE,QAAA,EAAS,EAA4B;AACvD,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIT,QAAAA,CAAc,EAAE,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAWa,WAAAA,CAAY,CAAC,IAAA,KAAY;AACxC,MAAA,QAAA,CAAS,CAAC,IAAA,KAAU,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,GAAG,IAAA,EAAM,IAAI,CAAE,CAAA;AAAA,IACnE,CAAA,EAAG,EAAE,CAAA;AACL,IAAA,MAAM,UAAA,GAAaA,WAAAA,CAAY,CAAC,IAAA,KAAY;AAC1C,MAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,IACnD,CAAA,EAAG,EAAE,CAAA;AACL,IAAA,MAAM,KAAA,GAAQC,OAAAA,CAAQ,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,UAAA,EAAW,CAAA,EAAI,CAAC,KAAA,EAAO,QAAA,EAAU,UAAU,CAAC,CAAA;AAC5F,IAAA,uBAAOf,GAAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OAAe,QAAA,EAAS,CAAA;AAAA,EAC7D;AAEA,EAAA,SAAS,aAAA,GAA2C;AAClD,IAAA,MAAM,GAAA,GAAMY,WAAW,iBAAiB,CAAA;AACxC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,OAAA,EAAS,iBAAA,EAAkB;AAC/D;ACnCA,IAAM,OAAA,GAAUF,cAA8C,IAAI,CAAA;AAiB3D,SAAS,mBAAA,CAAoB;AAAA,EAClC,EAAA,EAAI,UAAA;AAAA,EACJ,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,cAAcG,OAAA,EAAM;AAC1B,EAAA,MAAM,KAAK,UAAA,IAAc,WAAA;AACzB,EAAA,MAAM,KAAA,GAAiC;AAAA,IACrC,EAAA;AAAA,IACA,OAAA,EAAS,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,IACd,QAAA,EAAU,GAAG,EAAE,CAAA,OAAA,CAAA;AAAA,IACf,OAAA,EAAS,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,IACd,SAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,uBAAOb,GAAAA,CAAC,OAAA,CAAQ,QAAA,EAAR,EAAiB,OAAe,QAAA,EAAS,CAAA;AACnD;AAMO,SAAS,cAAA,GAAiD;AAC/D,EAAA,OAAOY,WAAW,OAAO,CAAA;AAC3B;AC/CO,SAAS,kBAAA,CAAmB,EAAE,SAAA,GAAY,IAAA,EAAM,UAAS,EAA4B;AAC1F,EAAA,aAAA,CAAc,SAAS,CAAA;AACvB,EAAA,uBAAOZ,GAAAA,CAAAgB,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;ACGO,IAAM,YAAA,GAAejB,UAAAA;AAAA,EAC1B,SAASkB,aAAAA,CAAa,EAAE,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,cAAA,EAAgB,GAAG,IAAA,EAAK,EAAG,GAAA,EAAK;AACrF,IAAA,uBACEjB,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,QAC/B,mBAAA,EAAoB,MAAA;AAAA,QACpB,aAAA,EAAY,MAAA;AAAA,QACX,GAAG,IAAA;AAAA,QAEJ,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAQ,CAAA,IAAA,EAAO,KAAK,CAAA,GAAA,EAAM,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,IAAA,EAAY;AAAA;AAAA,KACxE;AAAA,EAEJ;AACF;ACrBO,IAAM,QAAA,GAAWD,UAAAA;AAAA,EACtB,CAAC,EAAE,UAAA,GAAa,QAAA,EAAU,SAAA,EAAW,UAAU,GAAG,IAAA,EAAK,EAAG,GAAA,qBACxDC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAM,UAAA,KAAe,WAAA,GAAc,OAAA,GAAU,QAAA;AAAA,MAC7C,WAAA,EAAW,UAAA;AAAA,MACX,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,mEAAA;AAAA,QACA,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA;AAGP;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-TTSJZEL7.js","sourcesContent":["// L2 — headless primitives. Behavior + a11y, no visual styling beyond layout.\n// Foundation layer; cannot import upward (enforced by ESLint boundaries).\n\nexport * from './slot';\nexport * from './portal';\nexport * from './visuallyHidden';\nexport * from './presence';\nexport * from './directionProvider';\nexport * from './accessibleIcon';\nexport * from './focusScope';\nexport * from './dismissableLayer';\nexport * from './anchoredPositioner';\nexport * from './rovingFocusGroup';\nexport * from './collection';\nexport * from './formControlContext';\nexport * from './scrollLockProvider';\nexport * from './overlayArrow';\nexport * from './announce';\n","import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type CSSProperties,\n type HTMLAttributes,\n type ReactElement,\n type Ref,\n} from 'react';\nimport { useComposedRefs } from '../../utils/composeRefs';\n\nexport interface SlotProps extends HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\ntype AnyProps = Record<string, unknown>;\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n const merged: AnyProps = { ...childProps };\n for (const key of Object.keys(slotProps)) {\n const slotVal = slotProps[key];\n const childVal = childProps[key];\n if (key === 'className') {\n merged.className = [slotVal, childVal].filter(Boolean).join(' ');\n } else if (key === 'style') {\n merged.style = { ...(slotVal as CSSProperties), ...(childVal as CSSProperties) };\n } else if (/^on[A-Z]/.test(key)) {\n const slotFn = slotVal as ((...args: unknown[]) => void) | undefined;\n const childFn = childVal as ((...args: unknown[]) => void) | undefined;\n if (slotFn && childFn) {\n merged[key] = (...args: unknown[]) => {\n childFn(...args);\n slotFn(...args);\n };\n } else if (slotFn) {\n merged[key] = slotFn;\n }\n } else if (childVal === undefined) {\n merged[key] = slotVal;\n }\n }\n return merged;\n}\n\n/**\n * Polymorphic slot — renders the single child element with the parent's props\n * merged in (className concatenated, handlers chained, refs composed).\n *\n * Use to enable an `asChild` API on a component:\n * ```tsx\n * <Button asChild><a href=\"/x\">Open</a></Button>\n * ```\n */\nexport const Slot = forwardRef<HTMLElement, SlotProps>(\n ({ children, ...slotProps }, forwardedRef) => {\n const child = isValidElement(children)\n ? (children as ReactElement<AnyProps> & { ref?: Ref<HTMLElement> })\n : null;\n const composedRef = useComposedRefs(forwardedRef, child?.ref);\n if (!child) {\n return Children.count(children) > 1 ? Children.only(null) : null;\n }\n const merged = mergeProps(slotProps as AnyProps, (child.props ?? {}) as AnyProps);\n return cloneElement(child, {\n ...merged,\n ref: composedRef,\n });\n },\n);\nSlot.displayName = 'Slot';\n","import { useEffect, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface PortalProps {\n children: ReactNode;\n /** Container to render into. Default: `document.body`. */\n container?: HTMLElement | null;\n /** Optional named layer — sets `data-portal-name` on the wrapper. */\n name?: string;\n}\n\n/**\n * Render children into a different DOM node (default `document.body`).\n * SSR-inert — renders nothing on the server, portals in after mount on the client.\n */\nexport function Portal({ children, container, name }: PortalProps): ReactNode {\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) return null;\n const target = container ?? document.body;\n return createPortal(<div data-portal-name={name}>{children}</div>, target);\n}\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type VisuallyHiddenProps = HTMLAttributes<HTMLSpanElement>;\n\n/**\n * Visually hidden span — content removed from the visual layout but still\n * announced to screen readers. Use for accessible labels on icon-only\n * affordances and live-region announcements.\n */\nexport const VisuallyHidden = forwardRef<HTMLSpanElement, VisuallyHiddenProps>(\n ({ className, ...props }, ref) => (\n <span\n ref={ref}\n className={cn(\n 'absolute h-px w-px overflow-hidden whitespace-nowrap border-0 p-0',\n 'm-[-1px] [clip:rect(0_0_0_0)] [clip-path:inset(50%)]',\n className,\n )}\n {...props}\n />\n ),\n);\nVisuallyHidden.displayName = 'VisuallyHidden';\n","import {\n cloneElement,\n isValidElement,\n useEffect,\n useRef,\n useState,\n type ReactElement,\n type Ref,\n} from 'react';\nimport { useComposedRefs } from '../../utils/composeRefs';\n\nexport interface PresenceProps {\n /** Whether the content should be present. Toggle false to trigger exit. */\n isPresent: boolean;\n /** Single React element child — receives `ref` and `data-state` (\"open\" | \"closed\"). */\n children: ReactElement;\n}\n\nfunction parseTimes(value: string): number[] {\n return value.split(',').map((part) => {\n const trimmed = part.trim();\n const ms = trimmed.endsWith('ms') ? parseFloat(trimmed) : parseFloat(trimmed) * 1000;\n return Number.isFinite(ms) ? ms : 0;\n });\n}\n\n/** Longest computed transition/animation (duration + delay) in ms. */\nfunction getTotalDurationMs(node: HTMLElement): number {\n const cs = getComputedStyle(node);\n const maxOf = (durations: number[], delays: number[]) =>\n durations.reduce(\n (max, duration, i) => Math.max(max, duration + (delays[i % delays.length] ?? 0)),\n 0,\n );\n return Math.max(\n maxOf(parseTimes(cs.transitionDuration), parseTimes(cs.transitionDelay)),\n maxOf(parseTimes(cs.animationDuration), parseTimes(cs.animationDelay)),\n );\n}\n\n/**\n * Defer unmount until the child's exit animation/transition finishes.\n * Pass `isPresent={false}` to start the exit; the child stays mounted with\n * `data-state=\"closed\"` until its own `animationend`/`transitionend` fires\n * (or a computed-duration timeout as a fallback). If no exit animation\n * actually starts, the child unmounts immediately. On enter, the child\n * mounts with `data-state=\"closed\"` and flips to `\"open\"` on the next\n * frame so enter transitions play.\n */\nexport function Presence({ isPresent, children }: PresenceProps): ReactElement | null {\n const [rendered, setRendered] = useState(isPresent);\n const [dataState, setDataState] = useState<'open' | 'closed'>('closed');\n const ref = useRef<HTMLElement | null>(null);\n\n const child = isValidElement(children)\n ? (children as ReactElement<{ ref?: Ref<HTMLElement> }> & { ref?: Ref<HTMLElement> })\n : null;\n const composedRef = useComposedRefs(ref, child?.ref);\n\n // Enter — mount closed, then flip to open on the next frame (double rAF\n // so the closed styles are committed and painted first) to run transitions.\n useEffect(() => {\n if (!isPresent) return;\n if (!rendered) {\n setRendered(true);\n return;\n }\n if (dataState === 'open') return;\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setDataState('open'));\n });\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n };\n }, [isPresent, rendered, dataState]);\n\n // Exit — flip to closed, then unmount when the child's own exit\n // animation/transition ends; immediately if none starts within a frame\n // window; or after the computed total duration as a safety net.\n useEffect(() => {\n if (isPresent) return;\n const node = ref.current;\n if (!node) {\n setRendered(false);\n return;\n }\n let started = false;\n let timer: number | undefined;\n let raf2 = 0;\n const onStart = (event: Event) => {\n if (event.target === node) started = true;\n };\n const onEnd = (event: Event) => {\n if (event.target === node) setRendered(false);\n };\n node.addEventListener('animationstart', onStart);\n node.addEventListener('transitionrun', onStart);\n node.addEventListener('animationend', onEnd);\n node.addEventListener('transitionend', onEnd);\n // Flip the DOM synchronously so the start-detection window below is\n // deterministic; React re-renders to the same value via setDataState.\n node.setAttribute('data-state', 'closed');\n setDataState('closed');\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => {\n const animating = started || (node.getAnimations?.().length ?? 0) > 0;\n if (!animating) {\n setRendered(false);\n return;\n }\n timer = window.setTimeout(() => setRendered(false), getTotalDurationMs(node) + 100);\n });\n });\n return () => {\n node.removeEventListener('animationstart', onStart);\n node.removeEventListener('transitionrun', onStart);\n node.removeEventListener('animationend', onEnd);\n node.removeEventListener('transitionend', onEnd);\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n if (timer !== undefined) window.clearTimeout(timer);\n };\n }, [isPresent]);\n\n if (!rendered || !child) return null;\n return cloneElement(child, {\n ref: composedRef,\n 'data-state': dataState,\n } as Partial<typeof child.props>);\n}\n","import { createContext, useContext, type ReactNode } from 'react';\n\nexport type Direction = 'ltr' | 'rtl';\n\nconst DirectionContext = createContext<Direction>('ltr');\n\nexport interface DirectionProviderProps {\n dir: Direction;\n children: ReactNode;\n}\n\n/**\n * Provide reading direction to descendants. Components that mirror in RTL\n * (Tabs arrow keys, Slider, Carousel, etc.) read this via `useDirection()`.\n */\nexport function DirectionProvider({ dir, children }: DirectionProviderProps) {\n return <DirectionContext.Provider value={dir}>{children}</DirectionContext.Provider>;\n}\n\nexport function useDirection(): Direction {\n return useContext(DirectionContext);\n}\n","import { cloneElement, isValidElement, type ReactElement } from 'react';\nimport { VisuallyHidden } from '../visuallyHidden/VisuallyHidden';\n\nexport interface AccessibleIconProps {\n /** Required accessible label for the icon. */\n label: string;\n /** Single icon element — will receive `aria-hidden` so SR reads only the label. */\n children: ReactElement;\n}\n\n/**\n * Wrap an icon-only element with an accessible label. The icon is hidden\n * from assistive tech and a `VisuallyHidden` sibling provides the label.\n */\nexport function AccessibleIcon({ label, children }: AccessibleIconProps) {\n const icon = isValidElement(children)\n ? cloneElement(children as ReactElement<{ 'aria-hidden'?: boolean | string; focusable?: string }>, {\n 'aria-hidden': 'true',\n focusable: 'false',\n })\n : children;\n return (\n <>\n {icon}\n <VisuallyHidden>{label}</VisuallyHidden>\n </>\n );\n}\n","import { FocusScope as RadixFocusScope } from '@radix-ui/react-focus-scope';\n\nexport type FocusScopeProps = React.ComponentProps<typeof RadixFocusScope>;\n\n/**\n * Trap focus within children. On unmount, returns focus to the previously\n * focused element. Pass `loop` to wrap Tab navigation; `trapped` to enable\n * the trap (default true while mounted).\n *\n * Wraps `@radix-ui/react-focus-scope` — battle-tested implementation.\n */\nexport const FocusScope = RadixFocusScope;\n","import {\n forwardRef,\n useEffect,\n useRef,\n type HTMLAttributes,\n} from 'react';\nimport { useComposedRefs } from '../../utils/composeRefs';\n\ninterface LayerEntry {\n node: HTMLElement;\n onEscape?: (event: KeyboardEvent) => void;\n onOutsidePointerDown?: (event: PointerEvent) => void;\n}\n\nconst layerStack: LayerEntry[] = [];\n\nexport interface DismissableLayerProps extends HTMLAttributes<HTMLDivElement> {\n /** Called when Escape is pressed and this is the topmost layer. */\n onEscape?: (event: KeyboardEvent) => void;\n /** Called when a pointerdown lands outside this layer's DOM and this is topmost. */\n onOutsidePointerDown?: (event: PointerEvent) => void;\n /** Disable the Escape listener for this layer. */\n isEscapeDisabled?: boolean;\n /** Disable the outside-pointer-down listener for this layer. */\n isOutsideClickDisabled?: boolean;\n}\n\n/**\n * Stack-aware dismissal layer. Multiple layers may stack (modal > popover);\n * only the topmost reacts to Escape / outside click. Used as the base of\n * Modal, Drawer, Popover, Menu, HoverCard, ContextMenu.\n */\nexport const DismissableLayer = forwardRef<HTMLDivElement, DismissableLayerProps>(\n (\n { onEscape, onOutsidePointerDown, isEscapeDisabled, isOutsideClickDisabled, ...props },\n forwardedRef,\n ) => {\n const ref = useRef<HTMLDivElement | null>(null);\n\n // Keep callbacks in refs so registration runs once on mount; re-registering\n // on identity change would reorder the stack and corrupt dismissal ordering.\n const onEscapeRef = useRef(onEscape);\n const onOutsidePointerDownRef = useRef(onOutsidePointerDown);\n useEffect(() => {\n onEscapeRef.current = onEscape;\n onOutsidePointerDownRef.current = onOutsidePointerDown;\n });\n\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n const entry: LayerEntry = {\n node,\n onEscape: (event) => onEscapeRef.current?.(event),\n onOutsidePointerDown: (event) => onOutsidePointerDownRef.current?.(event),\n };\n layerStack.push(entry);\n return () => {\n const idx = layerStack.indexOf(entry);\n if (idx >= 0) layerStack.splice(idx, 1);\n };\n }, []);\n\n useEffect(() => {\n if (isEscapeDisabled) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n const top = layerStack[layerStack.length - 1];\n if (top && top.node === ref.current) top.onEscape?.(e);\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [isEscapeDisabled]);\n\n useEffect(() => {\n if (isOutsideClickDisabled) return;\n const onPointer = (e: PointerEvent) => {\n const top = layerStack[layerStack.length - 1];\n if (!top || top.node !== ref.current) return;\n const target = e.target as Node | null;\n if (!target || ref.current?.contains(target)) return;\n top.onOutsidePointerDown?.(e);\n };\n document.addEventListener('pointerdown', onPointer, true);\n return () => document.removeEventListener('pointerdown', onPointer, true);\n }, [isOutsideClickDisabled]);\n\n const composedRef = useComposedRefs(forwardedRef, ref);\n return <div ref={composedRef} {...props} />;\n },\n);\nDismissableLayer.displayName = 'DismissableLayer';\n","import {\n autoUpdate,\n flip,\n offset as offsetMiddleware,\n shift,\n size as sizeMiddleware,\n useFloating,\n type Placement,\n} from '@floating-ui/react';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { composeRefs } from '../../utils/composeRefs';\n\nexport interface AnchoredPositionerProps extends HTMLAttributes<HTMLDivElement> {\n /** The element the floating layer should be anchored to. */\n anchor: HTMLElement | null;\n /** Floating UI placement. Default `bottom`. */\n placement?: Placement;\n /** Distance between anchor and floating element in px. Default 8. */\n offset?: number;\n /** Render the floating element only when open. */\n isOpen?: boolean;\n children: ReactNode;\n}\n\n/**\n * Position children relative to an anchor element using Floating UI.\n * Auto-flips and shifts to stay in viewport. Use as the positioning surface\n * for Tooltip, Popover, Menu, HoverCard.\n *\n * Exposes the anchor's measured size as CSS variables on the floating\n * element, enabling consumers to size content relative to the trigger:\n *\n * style=\"--anchor-width: 240px; --anchor-height: 36px;\"\n *\n * Common pattern: `min-w-[var(--anchor-width)]` on a Select dropdown so\n * the panel never narrows below the trigger.\n */\nexport const AnchoredPositioner = forwardRef<HTMLDivElement, AnchoredPositionerProps>(\n (\n { anchor, placement = 'bottom', offset = 8, isOpen = true, children, style, ...props },\n forwardedRef,\n ) => {\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement,\n middleware: [\n offsetMiddleware(offset),\n flip(),\n shift({ padding: 8 }),\n sizeMiddleware({\n apply({ rects, elements }) {\n elements.floating.style.setProperty('--anchor-width', `${rects.reference.width}px`);\n elements.floating.style.setProperty(\n '--anchor-height',\n `${rects.reference.height}px`,\n );\n },\n }),\n ],\n whileElementsMounted: autoUpdate,\n elements: { reference: anchor },\n });\n\n if (!isOpen) return null;\n\n return (\n <div\n ref={composeRefs(forwardedRef, refs.setFloating)}\n style={{ ...floatingStyles, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\nAnchoredPositioner.displayName = 'AnchoredPositioner';\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { useComposedRefs } from '../../utils/composeRefs';\nimport { useDirection } from '../directionProvider';\n\nexport type Orientation = 'horizontal' | 'vertical' | 'both';\n\ninterface ItemEntry {\n id: string;\n node: HTMLElement | null;\n}\n\ninterface RovingFocusContextValue {\n register: (id: string, node: HTMLElement | null) => void;\n unregister: (id: string) => void;\n focusedId: string | null;\n setFocusedId: (id: string) => void;\n onItemKeyDown: (event: KeyboardEvent, id: string) => void;\n /** True once the user has interacted with the group; reset when focus leaves. */\n interactedRef: RefObject<boolean>;\n groupRef: RefObject<HTMLDivElement | null>;\n}\n\nconst RovingFocusContext = createContext<RovingFocusContextValue | null>(null);\n\nexport interface RovingFocusGroupProps extends HTMLAttributes<HTMLDivElement> {\n orientation?: Orientation;\n canLoop?: boolean;\n children: ReactNode;\n}\n\n/**\n * Provide arrow-key navigation for a group of focusable children. Children\n * call `useRovingFocusItem()` to register and receive `tabIndex` / event\n * handlers. Used by Tabs, ToggleGroup, RadioGroup, Menu.\n */\nexport const RovingFocusGroup = forwardRef<HTMLDivElement, RovingFocusGroupProps>(\n function RovingFocusGroup(\n { orientation = 'horizontal', canLoop = true, children, ...props },\n ref,\n ) {\n const items = useRef<ItemEntry[]>([]);\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const interactedRef = useRef(false);\n const groupRef = useRef<HTMLDivElement | null>(null);\n const composedRef = useComposedRefs(ref, groupRef);\n const direction = useDirection();\n\n const register = useCallback((id: string, node: HTMLElement | null) => {\n if (!items.current.some((item) => item.id === id)) {\n const entry: ItemEntry = { id, node };\n // Insert by DOM order (not mount order) so dynamically inserted\n // items navigate in visual order.\n const index = node\n ? items.current.findIndex(\n (item) =>\n item.node !== null &&\n (node.compareDocumentPosition(item.node) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0,\n )\n : -1;\n if (index === -1) items.current.push(entry);\n else items.current.splice(index, 0, entry);\n }\n setFocusedId((current) => current ?? id);\n }, []);\n\n const unregister = useCallback((id: string) => {\n const idx = items.current.findIndex((item) => item.id === id);\n items.current = items.current.filter((item) => item.id !== id);\n // If the tab stop unmounts, advance to the next remaining item (or\n // the first) so the group keeps exactly one tabbable item.\n setFocusedId((current) => {\n if (current !== id) return current;\n const next = items.current[idx] ?? items.current[0];\n return next ? next.id : null;\n });\n }, []);\n\n // Reset the interaction flag when focus leaves the group so tab-stop\n // bookkeeping (focusedId updates) never steals focus back.\n useEffect(() => {\n const node = groupRef.current;\n if (!node) return;\n const onFocusOut = (event: FocusEvent) => {\n const next = event.relatedTarget as Node | null;\n if (!next || !node.contains(next)) interactedRef.current = false;\n };\n node.addEventListener('focusout', onFocusOut);\n return () => node.removeEventListener('focusout', onFocusOut);\n }, []);\n\n const onItemKeyDown = useCallback(\n (event: KeyboardEvent, id: string) => {\n const list = items.current;\n const idx = list.findIndex((item) => item.id === id);\n if (idx === -1) return;\n const isVert = orientation === 'vertical' || orientation === 'both';\n const isHoriz = orientation === 'horizontal' || orientation === 'both';\n // Horizontal arrows mirror in RTL.\n const nextHorizKey = direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const prevHorizKey = direction === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n let next = idx;\n if ((event.key === nextHorizKey && isHoriz) || (event.key === 'ArrowDown' && isVert)) {\n next = idx + 1;\n if (next >= list.length) next = canLoop ? 0 : list.length - 1;\n } else if ((event.key === prevHorizKey && isHoriz) || (event.key === 'ArrowUp' && isVert)) {\n next = idx - 1;\n if (next < 0) next = canLoop ? list.length - 1 : 0;\n } else if (event.key === 'Home') {\n next = 0;\n } else if (event.key === 'End') {\n next = list.length - 1;\n } else {\n return;\n }\n event.preventDefault();\n interactedRef.current = true;\n const entry = list[next];\n if (entry) setFocusedId(entry.id);\n },\n [orientation, canLoop, direction],\n );\n\n const value = useMemo(\n () => ({\n register,\n unregister,\n focusedId,\n setFocusedId,\n onItemKeyDown,\n interactedRef,\n groupRef,\n }),\n [register, unregister, focusedId, onItemKeyDown],\n );\n\n return (\n <RovingFocusContext.Provider value={value}>\n <div ref={composedRef} role=\"group\" {...props}>\n {children}\n </div>\n </RovingFocusContext.Provider>\n );\n },\n);\n\nexport interface UseRovingFocusItemOptions {\n /** Preferred tab stop while focus is outside the group (e.g. the selected tab) — APG composite-widget pattern. */\n isActive?: boolean;\n}\n\nexport interface UseRovingFocusItemReturn {\n ref: (node: HTMLElement | null) => void;\n tabIndex: 0 | -1;\n onKeyDown: (event: KeyboardEvent) => void;\n onFocus: () => void;\n 'data-roving-focus-item': boolean;\n}\n\n/**\n * Inside a `RovingFocusGroup`, returns props to spread onto a focusable item.\n * Outside, returns inert props (tabIndex 0).\n */\nexport function useRovingFocusItem(\n options: UseRovingFocusItemOptions = {},\n): UseRovingFocusItemReturn {\n const { isActive = false } = options;\n const context = useContext(RovingFocusContext);\n const id = useId();\n const ref = useRef<HTMLElement | null>(null);\n\n const register = context?.register;\n const unregister = context?.unregister;\n useEffect(() => {\n register?.(id, ref.current);\n return () => unregister?.(id);\n }, [register, unregister, id]);\n\n // Move DOM focus only after user interaction — never on initial mount.\n const focusedId = context?.focusedId;\n const interactedRef = context?.interactedRef;\n useEffect(() => {\n if (\n focusedId === id &&\n interactedRef?.current &&\n ref.current &&\n document.activeElement !== ref.current\n ) {\n ref.current.focus();\n }\n }, [focusedId, interactedRef, id]);\n\n // Keep the active item (e.g. selected tab) as the tab stop whenever focus\n // is outside the group.\n const setFocusedId = context?.setFocusedId;\n const groupRef = context?.groupRef;\n useEffect(() => {\n if (!isActive || !setFocusedId || !groupRef) return;\n const groupNode = groupRef.current;\n if (!groupNode || !groupNode.contains(document.activeElement)) setFocusedId(id);\n const onFocusOut = (event: FocusEvent) => {\n const next = event.relatedTarget as Node | null;\n if (!next || !groupNode?.contains(next)) setFocusedId(id);\n };\n groupNode?.addEventListener('focusout', onFocusOut);\n return () => groupNode?.removeEventListener('focusout', onFocusOut);\n }, [isActive, setFocusedId, groupRef, id]);\n\n return {\n ref: (node) => {\n ref.current = node;\n },\n tabIndex: !context || context.focusedId === id ? 0 : -1,\n onKeyDown: (e) => context?.onItemKeyDown(e, id),\n onFocus: () => {\n if (!context) return;\n context.interactedRef.current = true;\n context.setFocusedId(id);\n },\n 'data-roving-focus-item': true,\n };\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type Context,\n type ReactNode,\n} from 'react';\n\nexport interface CollectionContextValue<T> {\n items: T[];\n register: (item: T) => void;\n unregister: (item: T) => void;\n}\n\n/**\n * Factory for a typed children-registry context. Compound components\n * (Menu, Tabs, Listbox) use this so the parent can iterate ordered children\n * without prop-drilling.\n */\nexport function createCollection<T>(): {\n Provider: (props: { children: ReactNode }) => ReactNode;\n useCollection: () => CollectionContextValue<T>;\n Context: Context<CollectionContextValue<T> | null>;\n} {\n const CollectionContext = createContext<CollectionContextValue<T> | null>(null);\n\n function Provider({ children }: { children: ReactNode }) {\n const [items, setItems] = useState<T[]>([]);\n const register = useCallback((item: T) => {\n setItems((prev) => (prev.includes(item) ? prev : [...prev, item]));\n }, []);\n const unregister = useCallback((item: T) => {\n setItems((prev) => prev.filter((i) => i !== item));\n }, []);\n const value = useMemo(() => ({ items, register, unregister }), [items, register, unregister]);\n return <CollectionContext.Provider value={value}>{children}</CollectionContext.Provider>;\n }\n\n function useCollection(): CollectionContextValue<T> {\n const ctx = useContext(CollectionContext);\n if (!ctx) {\n throw new Error('useCollection must be used inside its Provider');\n }\n return ctx;\n }\n\n return { Provider, useCollection, Context: CollectionContext };\n}\n","import { createContext, useContext, type ReactNode } from 'react';\nimport { useId } from '../../hooks/useId';\n\nexport interface FormControlContextValue {\n id: string;\n labelId: string;\n helperId: string;\n errorId: string;\n isInvalid: boolean;\n isDisabled: boolean;\n isRequired: boolean;\n isReadOnly: boolean;\n}\n\nconst Context = createContext<FormControlContextValue | null>(null);\n\nexport interface FormControlProviderProps {\n /** Override the auto-generated id (also used as control's `id`). */\n id?: string;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n isReadOnly?: boolean;\n children: ReactNode;\n}\n\n/**\n * Wires Label ↔ control ↔ HelperText/ErrorMessage via stable IDs and shared\n * state flags. Used by `FormField` (L4) — atoms (Input, Label, etc.) read\n * via `useFormControl()` to get the right `id`/`htmlFor`/`aria-describedby`.\n */\nexport function FormControlProvider({\n id: providedId,\n isInvalid = false,\n isDisabled = false,\n isRequired = false,\n isReadOnly = false,\n children,\n}: FormControlProviderProps) {\n const generatedId = useId();\n const id = providedId ?? generatedId;\n const value: FormControlContextValue = {\n id,\n labelId: `${id}-label`,\n helperId: `${id}-helper`,\n errorId: `${id}-error`,\n isInvalid,\n isDisabled,\n isRequired,\n isReadOnly,\n };\n return <Context.Provider value={value}>{children}</Context.Provider>;\n}\n\n/**\n * Read the surrounding form-control context. Returns `null` when used\n * outside a provider — atoms gracefully degrade to standalone mode.\n */\nexport function useFormControl(): FormControlContextValue | null {\n return useContext(Context);\n}\n","import { type ReactNode } from 'react';\nimport { useScrollLock } from '../../hooks/useScrollLock';\n\nexport interface ScrollLockProviderProps {\n isEnabled?: boolean;\n children: ReactNode;\n}\n\n/**\n * Component wrapper around `useScrollLock` — handy when scroll lock should\n * follow a child's mount lifecycle (e.g. inside a Modal's portal).\n * Multiple wrappers stack; lock releases when the count reaches zero.\n */\nexport function ScrollLockProvider({ isEnabled = true, children }: ScrollLockProviderProps) {\n useScrollLock(isEnabled);\n return <>{children}</>;\n}\n","import { forwardRef, type SVGAttributes } from 'react';\n\nexport interface OverlayArrowProps extends SVGAttributes<SVGSVGElement> {\n /** Arrow width in px. Default 12. */\n width?: number;\n /** Arrow height in px. Default 6. */\n height?: number;\n}\n\n/**\n * Tip-arrow primitive for floating overlays (Tooltip, Popover, HoverCard).\n *\n * Renders a minimal SVG triangle with `fill=\"currentColor\"` — color follows\n * the consuming overlay's background via Tailwind's `text-*` utilities.\n *\n * Pair with Floating UI's `arrow()` middleware to position. The middleware\n * exposes the arrow's `x` / `y` offset on the resolved data; consumers apply\n * those as inline styles to the wrapping span.\n */\nexport const OverlayArrow = forwardRef<SVGSVGElement, OverlayArrowProps>(\n function OverlayArrow({ width = 12, height = 6, fill = 'currentColor', ...rest }, ref) {\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n {...rest}\n >\n <polygon points={`0,0 ${width},0 ${width / 2},${height}`} fill={fill} />\n </svg>\n );\n },\n);\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface AnnounceProps extends HTMLAttributes<HTMLDivElement> {\n /** `polite` → `role=\"status\"`, `assertive` → `role=\"alert\"`. Default `polite`. */\n politeness?: 'polite' | 'assertive';\n children?: ReactNode;\n}\n\n/**\n * Visually-hidden ARIA live region. Children are announced by screen readers\n * whenever they change. Pair with a stable mount + swappable children for\n * lightweight transient announcements (status updates, toast messages, etc.).\n */\nexport const Announce = forwardRef<HTMLDivElement, AnnounceProps>(\n ({ politeness = 'polite', className, children, ...rest }, ref) => (\n <div\n ref={ref}\n role={politeness === 'assertive' ? 'alert' : 'status'}\n aria-live={politeness}\n aria-atomic=\"true\"\n className={cn(\n 'absolute h-px w-px overflow-hidden whitespace-nowrap border-0 p-0',\n 'm-[-1px] [clip:rect(0_0_0_0)] [clip-path:inset(50%)]',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n ),\n);\nAnnounce.displayName = 'Announce';\n"]}
|
|
@@ -17,7 +17,8 @@ __export(hooks_exports, {
|
|
|
17
17
|
useOutsideClick: () => useOutsideClick,
|
|
18
18
|
useReducedMotion: () => useReducedMotion,
|
|
19
19
|
useResizeObserver: () => useResizeObserver,
|
|
20
|
-
useScrollLock: () => useScrollLock
|
|
20
|
+
useScrollLock: () => useScrollLock,
|
|
21
|
+
useTypeahead: () => useTypeahead
|
|
21
22
|
});
|
|
22
23
|
function useControlled({
|
|
23
24
|
controlled,
|
|
@@ -247,7 +248,88 @@ function useDebounceHandler(handler, ms) {
|
|
|
247
248
|
[handler, ms]
|
|
248
249
|
);
|
|
249
250
|
}
|
|
251
|
+
function isPrintableKey(event) {
|
|
252
|
+
if (event.ctrlKey || event.metaKey || event.altKey) return false;
|
|
253
|
+
return event.key.length === 1;
|
|
254
|
+
}
|
|
255
|
+
function isAllSameChar(buffer) {
|
|
256
|
+
return buffer.length > 0 && [...buffer].every((c) => c === buffer[0]);
|
|
257
|
+
}
|
|
258
|
+
function useTypeahead(options) {
|
|
259
|
+
const { enabled = true } = options;
|
|
260
|
+
const optsRef = useRef(options);
|
|
261
|
+
optsRef.current = options;
|
|
262
|
+
const bufferRef = useRef("");
|
|
263
|
+
const timerRef = useRef(null);
|
|
264
|
+
const clearTimer = useCallback(() => {
|
|
265
|
+
if (timerRef.current !== null) {
|
|
266
|
+
clearTimeout(timerRef.current);
|
|
267
|
+
timerRef.current = null;
|
|
268
|
+
}
|
|
269
|
+
}, []);
|
|
270
|
+
const reset = useCallback(() => {
|
|
271
|
+
bufferRef.current = "";
|
|
272
|
+
clearTimer();
|
|
273
|
+
}, [clearTimer]);
|
|
274
|
+
useEffect(() => clearTimer, [clearTimer]);
|
|
275
|
+
const onKeyDown = useCallback(
|
|
276
|
+
(event) => {
|
|
277
|
+
const o = optsRef.current;
|
|
278
|
+
if (o.enabled === false) return false;
|
|
279
|
+
if (!isPrintableKey(event)) return false;
|
|
280
|
+
const isSpace = event.key === " ";
|
|
281
|
+
const hasBuffer = bufferRef.current.length > 0;
|
|
282
|
+
if (isSpace && !hasBuffer) return false;
|
|
283
|
+
const resolved = typeof o.items === "function" ? o.items() : o.items;
|
|
284
|
+
const list = resolved;
|
|
285
|
+
if (list.length === 0) return false;
|
|
286
|
+
const nextBuffer = bufferRef.current + event.key;
|
|
287
|
+
bufferRef.current = nextBuffer;
|
|
288
|
+
clearTimer();
|
|
289
|
+
timerRef.current = setTimeout(() => {
|
|
290
|
+
bufferRef.current = "";
|
|
291
|
+
timerRef.current = null;
|
|
292
|
+
}, o.timeout ?? 500);
|
|
293
|
+
const labelOf = (item) => o.getLabel(item).toLowerCase();
|
|
294
|
+
const disabledOf = (item) => o.isDisabled ? o.isDisabled(item) : false;
|
|
295
|
+
const startFrom = o.getActiveIndex ? o.getActiveIndex() : -1;
|
|
296
|
+
let matchIndex = -1;
|
|
297
|
+
if (isAllSameChar(nextBuffer)) {
|
|
298
|
+
const char = nextBuffer[0].toLowerCase();
|
|
299
|
+
for (let step = 1; step <= list.length; step += 1) {
|
|
300
|
+
const idx = (startFrom + step + list.length) % list.length;
|
|
301
|
+
const item = list[idx];
|
|
302
|
+
if (!disabledOf(item) && labelOf(item).startsWith(char)) {
|
|
303
|
+
matchIndex = idx;
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
} else {
|
|
308
|
+
const prefix = nextBuffer.toLowerCase();
|
|
309
|
+
const begin = startFrom < 0 ? 0 : startFrom;
|
|
310
|
+
for (let step = 0; step < list.length; step += 1) {
|
|
311
|
+
const idx = (begin + step) % list.length;
|
|
312
|
+
const item = list[idx];
|
|
313
|
+
if (!disabledOf(item) && labelOf(item).startsWith(prefix)) {
|
|
314
|
+
matchIndex = idx;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (matchIndex >= 0) {
|
|
320
|
+
o.onMatch(list[matchIndex], matchIndex);
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
return true;
|
|
324
|
+
},
|
|
325
|
+
[clearTimer]
|
|
326
|
+
);
|
|
327
|
+
useEffect(() => {
|
|
328
|
+
if (!enabled) reset();
|
|
329
|
+
}, [enabled, reset]);
|
|
330
|
+
return { onKeyDown, reset };
|
|
331
|
+
}
|
|
250
332
|
|
|
251
|
-
export { hooks_exports, useClipboard, useControlled, useDebounceHandler, useDisclosure, useEscape, useEventListener, useFocusTrap, useMediaQuery, useOutsideClick, useReducedMotion, useResizeObserver };
|
|
252
|
-
//# sourceMappingURL=chunk-
|
|
253
|
-
//# sourceMappingURL=chunk-
|
|
333
|
+
export { hooks_exports, useClipboard, useControlled, useDebounceHandler, useDisclosure, useEscape, useEventListener, useFocusTrap, useMediaQuery, useOutsideClick, useReducedMotion, useResizeObserver, useTypeahead };
|
|
334
|
+
//# sourceMappingURL=chunk-V267IMBH.js.map
|
|
335
|
+
//# sourceMappingURL=chunk-V267IMBH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/index.ts","../src/hooks/useControlled.ts","../src/hooks/useDisclosure.ts","../src/hooks/useEventListener.ts","../src/hooks/useOutsideClick.ts","../src/hooks/useEscape.ts","../src/hooks/useFocusTrap.ts","../src/hooks/useResizeObserver.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useReducedMotion.ts","../src/hooks/useClipboard.ts","../src/hooks/useDebounceHandler.ts","../src/hooks/useTypeahead.ts"],"names":["useState","useCallback","useRef","useLayoutEffect","useEffect"],"mappings":"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","file":"chunk-V267IMBH.js","sourcesContent":["export { useId } from './useId';\nexport { useControlled } from './useControlled';\nexport { useDisclosure, type DisclosureControls } from './useDisclosure';\nexport { useEventListener } from './useEventListener';\nexport { useOutsideClick } from './useOutsideClick';\nexport { useEscape } from './useEscape';\nexport { useFocusTrap } from './useFocusTrap';\nexport { useScrollLock } from './useScrollLock';\nexport { useResizeObserver } from './useResizeObserver';\nexport { useMediaQuery } from './useMediaQuery';\nexport { useReducedMotion } from './useReducedMotion';\nexport { useClipboard, type UseClipboardOptions, type ClipboardControls } from './useClipboard';\nexport { useDebounceHandler } from './useDebounceHandler';\nexport {\n useTypeahead,\n type UseTypeaheadOptions,\n type UseTypeaheadReturn,\n} from './useTypeahead';\n","import { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\ninterface UseControlledOptions<T> {\n controlled: T | undefined;\n default: T;\n onChange?: (value: T) => void;\n}\n\n/**\n * Standard controlled/uncontrolled pattern.\n *\n * - If `controlled` is defined, the component is controlled — internal state is\n * ignored, `setValue` only fires `onChange`.\n * - Otherwise the component owns its state, `setValue` updates it, and `onChange`\n * still fires for consumers that want to observe changes.\n */\nexport function useControlled<T>({\n controlled,\n default: defaultValue,\n onChange,\n}: UseControlledOptions<T>): [T, (value: T) => void] {\n const [uncontrolled, setUncontrolled] = useState<T>(defaultValue);\n const onChangeRef = useRef(onChange);\n useLayoutEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n const isControlled = controlled !== undefined;\n const value = isControlled ? controlled : uncontrolled;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) setUncontrolled(next);\n onChangeRef.current?.(next);\n },\n [isControlled],\n );\n\n return [value, setValue];\n}\n","import { useCallback, useState } from 'react';\n\nexport interface DisclosureControls {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setOpen: (next: boolean) => void;\n}\n\n/**\n * Minimal open/close state with stable callbacks. The standard backbone for\n * Modal, Drawer, Popover, Menu, Accordion, etc. Use `useControlled` underneath\n * when the consumer may also pass a controlled `open` prop.\n */\nexport function useDisclosure(initial = false): DisclosureControls {\n const [isOpen, setIsOpen] = useState(initial);\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((o) => !o), []);\n return { isOpen, open, close, toggle, setOpen: setIsOpen };\n}\n","import { useEffect, useLayoutEffect, useRef } from 'react';\n\ntype Target = Window | Document | HTMLElement | null;\n\n/**\n * Add an event listener and clean it up automatically. Handler is read from\n * a ref so consumers don't need to memoize it.\n */\nexport function useEventListener<K extends string>(\n event: K,\n handler: (event: Event) => void,\n target: Target = document,\n options?: boolean | AddEventListenerOptions,\n): void {\n const handlerRef = useRef(handler);\n const optionsRef = useRef(options);\n useLayoutEffect(() => {\n handlerRef.current = handler;\n optionsRef.current = options;\n }, [handler, options]);\n\n useEffect(() => {\n if (!target) return;\n // Capture options at attach time — remove must use the same capture flag.\n const listenerOptions = optionsRef.current;\n const listener = (e: Event) => handlerRef.current(e);\n target.addEventListener(event, listener, listenerOptions);\n return () => target.removeEventListener(event, listener, listenerOptions);\n }, [event, target]);\n}\n","import { useEffect, useLayoutEffect, useRef, type RefObject } from 'react';\n\n/**\n * Fire `handler` when the user clicks outside any of the provided refs.\n * Uses `pointerdown` so it fires before focus shifts (avoids losing focus\n * inside an overlay before a click on a trigger registers).\n */\nexport function useOutsideClick(\n refs: RefObject<HTMLElement | null> | RefObject<HTMLElement | null>[],\n handler: (event: PointerEvent) => void,\n enabled = true,\n): void {\n const handlerRef = useRef(handler);\n const refsRef = useRef(refs);\n useLayoutEffect(() => {\n handlerRef.current = handler;\n refsRef.current = refs;\n }, [handler, refs]);\n\n useEffect(() => {\n if (!enabled) return;\n\n const onPointerDown = (e: PointerEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n const refList = Array.isArray(refsRef.current) ? refsRef.current : [refsRef.current];\n for (const ref of refList) {\n if (ref.current && ref.current.contains(target)) return;\n }\n handlerRef.current(e);\n };\n\n document.addEventListener('pointerdown', onPointerDown, true);\n return () => document.removeEventListener('pointerdown', onPointerDown, true);\n }, [enabled]);\n}\n","import { useEffect, useLayoutEffect, useRef } from 'react';\n\n/**\n * Fire `handler` when the Escape key is pressed at the document level.\n * For nested overlays, the topmost should call `event.stopPropagation()` in\n * its handler — `DismissableLayer` handles this stack-style.\n */\nexport function useEscape(handler: (event: KeyboardEvent) => void, enabled = true): void {\n const handlerRef = useRef(handler);\n useLayoutEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n\n useEffect(() => {\n if (!enabled) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handlerRef.current(e);\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [enabled]);\n}\n","import { useEffect, type RefObject } from 'react';\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(',');\n\nfunction isVisible(el: HTMLElement): boolean {\n // checkVisibility covers display/visibility/content-visibility; the\n // getClientRects fallback (older engines) still includes position:fixed\n // elements, which `offsetParent !== null` would wrongly exclude.\n return el.checkVisibility?.() ?? el.getClientRects().length > 0;\n}\n\nfunction getFocusable(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (el) => el.getAttribute('aria-hidden') !== 'true' && isVisible(el),\n );\n}\n\n/**\n * Trap Tab / Shift+Tab focus inside the referenced element. On mount, focuses\n * the first focusable child (unless already focused inside). On unmount,\n * returns focus to the element that had it before mounting.\n *\n * For richer behavior (sentinels, nested traps), wrap `FocusScope` instead —\n * this hook is the lower primitive.\n */\nexport function useFocusTrap(ref: RefObject<HTMLElement | null>, enabled = true): void {\n useEffect(() => {\n if (!enabled || !ref.current) return;\n const container = ref.current;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n const previousTabIndex = container.getAttribute('tabindex');\n let tabIndexMutated = false;\n\n const focusables = getFocusable(container);\n if (focusables.length > 0 && !container.contains(document.activeElement)) {\n focusables[0]?.focus();\n } else if (focusables.length === 0) {\n container.tabIndex = -1;\n tabIndexMutated = true;\n container.focus();\n }\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const items = getFocusable(container);\n if (items.length === 0) {\n e.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n if (!first || !last) return;\n const active = document.activeElement;\n if (e.shiftKey && active === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n };\n\n container.addEventListener('keydown', onKeyDown);\n return () => {\n container.removeEventListener('keydown', onKeyDown);\n if (tabIndexMutated) {\n if (previousTabIndex === null) container.removeAttribute('tabindex');\n else container.setAttribute('tabindex', previousTabIndex);\n }\n previouslyFocused?.focus?.();\n };\n }, [ref, enabled]);\n}\n","import { useEffect, useLayoutEffect, useRef, type RefObject } from 'react';\n\n/**\n * Run `callback` whenever the referenced element's size changes. Returns\n * synchronously after layout, before paint. Cleans up automatically.\n */\nexport function useResizeObserver<T extends HTMLElement>(\n ref: RefObject<T | null>,\n callback: (entry: ResizeObserverEntry) => void,\n enabled = true,\n): void {\n const callbackRef = useRef(callback);\n useLayoutEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (!enabled || !ref.current || typeof ResizeObserver === 'undefined') return;\n const element = ref.current;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) callbackRef.current(entry);\n });\n observer.observe(element);\n return () => observer.disconnect();\n }, [ref, enabled]);\n}\n","import { useCallback, useSyncExternalStore } from 'react';\n\n/**\n * Reactively follow a CSS media query. Pass a query string like\n * `'(min-width: 768px)'` or `'(prefers-reduced-motion: reduce)'`.\n * SSR-safe — renders `false` on the server, syncs to the real value on the client.\n */\nexport function useMediaQuery(query: string): boolean {\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const mql = window.matchMedia(query);\n mql.addEventListener('change', onStoreChange);\n return () => mql.removeEventListener('change', onStoreChange);\n },\n [query],\n );\n\n return useSyncExternalStore(\n subscribe,\n () => window.matchMedia(query).matches,\n () => false,\n );\n}\n","import { useMediaQuery } from './useMediaQuery';\n\n/**\n * Returns `true` when the user has requested reduced motion via OS settings.\n * Components should short-circuit looping/transitional animations to a\n * static final state when this is `true`.\n */\nexport function useReducedMotion(): boolean {\n return useMediaQuery('(prefers-reduced-motion: reduce)');\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseClipboardOptions {\n /** Reset `copied` back to false after this many ms. Default 2000. Set 0 to keep state until explicitly reset. */\n resetAfter?: number;\n}\n\nexport interface ClipboardControls {\n /** True for `resetAfter` ms after a successful copy. */\n copied: boolean;\n /** Last error from `navigator.clipboard.writeText`, if any. */\n error: Error | null;\n /** Write `text` to the system clipboard. Returns the promise. */\n copy: (text: string) => Promise<void>;\n /** Force-clear the `copied` flag. */\n reset: () => void;\n}\n\n/**\n * Wraps `navigator.clipboard.writeText` with a transient `copied` flag for\n * post-action UI (icon swap, \"Copied!\" tooltip). Pass `resetAfter: 0` to\n * keep `copied` true until you call `reset()`.\n */\nexport function useClipboard({ resetAfter = 2000 }: UseClipboardOptions = {}): ClipboardControls {\n const [copied, setCopied] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const reset = useCallback(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n setCopied(false);\n setError(null);\n }, []);\n\n const copy = useCallback(\n async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setError(null);\n setCopied(true);\n if (resetAfter > 0) {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => setCopied(false), resetAfter);\n }\n } catch (err) {\n setCopied(false);\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n },\n [resetAfter],\n );\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n return { copied, error, copy, reset };\n}\n","import { useCallback, useRef } from 'react';\nimport type { SyntheticEvent } from 'react';\n\n/**\n * Throttle a React event handler. First call in a `ms` window fires; subsequent\n * within the window are swallowed via `event.preventDefault()`. When `ms` is\n * `undefined`, the handler passes through unchanged. Use to prevent rapid-fire\n * gestures (double-clicks, double-submits, repeated touches) without wiring\n * timer state in the consumer.\n *\n * Functionally a *throttle* (first wins). The `Debounce` naming is kept for\n * vocabulary consistency with the `debounceMs` props on consuming components.\n */\nexport function useDebounceHandler<E extends SyntheticEvent>(\n handler: ((event: E) => void) | undefined,\n ms: number | undefined,\n): (event: E) => void {\n const lastTimeRef = useRef(0);\n return useCallback(\n (event: E) => {\n if (ms !== undefined) {\n const now = Date.now();\n if (now - lastTimeRef.current < ms) {\n event.preventDefault();\n return;\n }\n lastTimeRef.current = now;\n }\n handler?.(event);\n },\n [handler, ms],\n );\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { KeyboardEvent } from 'react';\n\n/** Resolves the typeahead item pool — a static array or a getter read lazily on each keystroke. */\ntype ItemSource<T> = readonly T[] | (() => readonly T[]);\n\n/** Configures {@link useTypeahead}. `T` is the item type the caller stores per option. */\nexport interface UseTypeaheadOptions<T> {\n /** Supplies the items to match against; a function is re-read on every keystroke (live lists). */\n items: ItemSource<T>;\n /** Extracts the comparable label from an item. Matching is case-insensitive on this string. */\n getLabel: (item: T) => string;\n /** Reports whether an item is disabled; disabled items are skipped during matching. */\n isDisabled?: (item: T) => boolean;\n /** Fires with the matched item and its index in the (live) item array when a keystroke resolves. */\n onMatch: (item: T, index: number) => void;\n /** Returns the index of the currently-active item — same-letter cycling starts after it. */\n getActiveIndex?: () => number;\n /** Disables the matcher when `false`; every key falls through unhandled. Defaults to `true`. */\n enabled?: boolean;\n /** Idle time (ms) after which the typed buffer resets. Defaults to `500`. */\n timeout?: number;\n}\n\n/** The keyboard handler + manual reset returned by {@link useTypeahead}. */\nexport interface UseTypeaheadReturn {\n /** Feeds a keydown into the matcher. Returns `true` when consumed (caller should stop), else `false`. */\n onKeyDown: (event: KeyboardEvent) => boolean;\n /** Clears the typed buffer immediately (e.g. on blur / close). */\n reset: () => void;\n}\n\n/** Reports whether a key event carries a single printable character (and no command modifier). */\nfunction isPrintableKey(event: KeyboardEvent): boolean {\n if (event.ctrlKey || event.metaKey || event.altKey) return false;\n // Printable keys surface as a single char in `key`; named keys (Enter, ArrowDown…) are multi-char.\n return event.key.length === 1;\n}\n\n/** Reports whether every char in the buffer is the same letter — the \"cycle\" case (e.g. \"aaa\"). */\nfunction isAllSameChar(buffer: string): boolean {\n return buffer.length > 0 && [...buffer].every((c) => c === buffer[0]);\n}\n\n/**\n * APG-correct type-to-select matcher (WAI-ARIA listbox/combobox typeahead). Accumulates printable\n * chars into a buffer (resets after `timeout` ms idle): a repeated single char cycles to the next\n * label starting with it (after `getActiveIndex()`, wrap-around), else prefix-matches the whole\n * buffer case-insensitively; disabled items skipped. On a hit `onMatch(item, index)` fires; consumed\n * keys return `true`, others `false` to fall through. Space is typeable only while buffering (a\n * leading Space reaches the caller). SSR-safe; reset timer cleared on unmount.\n */\nexport function useTypeahead<T>(options: UseTypeaheadOptions<T>): UseTypeaheadReturn {\n const { enabled = true } = options;\n\n /* Consumer fns/values read through a ref so `onKeyDown` stays referentially stable\n (callers wire it into their own memoised keydown handlers). */\n const optsRef = useRef(options);\n optsRef.current = options;\n\n const bufferRef = useRef('');\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimer = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const reset = useCallback(() => {\n bufferRef.current = '';\n clearTimer();\n }, [clearTimer]);\n\n /* Clears the pending reset timer on unmount (no stale fire after teardown). */\n useEffect(() => clearTimer, [clearTimer]);\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent): boolean => {\n const o = optsRef.current;\n if (o.enabled === false) return false;\n if (!isPrintableKey(event)) return false;\n\n const isSpace = event.key === ' ';\n const hasBuffer = bufferRef.current.length > 0;\n /* Reserve Space: with no active buffer, hand it back so the caller can select; while typing,\n a Space is a real character (matches labels with spaces) and is consumed. */\n if (isSpace && !hasBuffer) return false;\n\n const resolved = typeof o.items === 'function' ? o.items() : o.items;\n const list = resolved as readonly T[];\n if (list.length === 0) return false;\n\n const nextBuffer = bufferRef.current + event.key;\n bufferRef.current = nextBuffer;\n\n /* Restart the idle window on every accepted keystroke. */\n clearTimer();\n timerRef.current = setTimeout(() => {\n bufferRef.current = '';\n timerRef.current = null;\n }, o.timeout ?? 500);\n\n const labelOf = (item: T) => o.getLabel(item).toLowerCase();\n const disabledOf = (item: T) => (o.isDisabled ? o.isDisabled(item) : false);\n const startFrom = o.getActiveIndex ? o.getActiveIndex() : -1;\n\n let matchIndex = -1;\n if (isAllSameChar(nextBuffer)) {\n /* Same-letter repeat → cycle to the next label starting with that letter, after the active one. */\n const char = nextBuffer[0]!.toLowerCase();\n for (let step = 1; step <= list.length; step += 1) {\n const idx = (startFrom + step + list.length) % list.length;\n const item = list[idx]!;\n if (!disabledOf(item) && labelOf(item).startsWith(char)) {\n matchIndex = idx;\n break;\n }\n }\n } else {\n /* Multi-char buffer → prefix-match the whole buffer; scan from the current item forward so a\n refining sequence stays put when the active item still matches. */\n const prefix = nextBuffer.toLowerCase();\n const begin = startFrom < 0 ? 0 : startFrom;\n for (let step = 0; step < list.length; step += 1) {\n const idx = (begin + step) % list.length;\n const item = list[idx]!;\n if (!disabledOf(item) && labelOf(item).startsWith(prefix)) {\n matchIndex = idx;\n break;\n }\n }\n }\n\n if (matchIndex >= 0) {\n o.onMatch(list[matchIndex]!, matchIndex);\n return true;\n }\n /* No label matched, but the char was consumed into the buffer (and Space, once buffering,\n must not double as select) — report handled so the caller doesn't also act on it. */\n return true;\n },\n [clearTimer],\n );\n\n /* `enabled` toggling off mid-type should not leave a stale buffer/timer armed. */\n useEffect(() => {\n if (!enabled) reset();\n }, [enabled, reset]);\n\n return { onKeyDown, reset };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Icon } from './chunk-MVMDDGW7.js';
|
|
2
|
-
import { tv } from './chunk-
|
|
2
|
+
import { tv } from './chunk-JYGC5SRP.js';
|
|
3
3
|
import { cn } from './chunk-X2MYOHOB.js';
|
|
4
4
|
import { forwardRef } from 'react';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
@@ -159,5 +159,5 @@ function isInRange(d, start, end) {
|
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
export { Kbd, MONTHS_LONG, Tag, WEEKDAYS_SHORT, addDays, addMonths, buildMonthGrid, formatISODate, formatISOTime, isDateDisabled, isInRange, isSameDay, isToday, parseISODate, parseISOTime, startOfDay, startOfMonth, tagVariants };
|
|
162
|
-
//# sourceMappingURL=chunk-
|
|
163
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-XDATW7NF.js.map
|
|
163
|
+
//# sourceMappingURL=chunk-XDATW7NF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/display/kbd/Kbd.tsx","../src/display/tag/Tag.variants.ts","../src/display/tag/Tag.tsx","../src/forms/DateExtensions.ts"],"names":["forwardRef","jsx"],"mappings":"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","file":"chunk-ZH6BB54G.js","sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { cn } from '../../utils';\n\nexport type KbdProps = ComponentPropsWithoutRef<'kbd'>;\n\n/**\n * Keyboard key affordance — `<kbd>` styled with subtle border and inset\n * shadow. Single key per `<Kbd>`; chain via `<Kbd>⌘</Kbd> + <Kbd>K</Kbd>`.\n */\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(({ className, ...props }, ref) => (\n <kbd\n ref={ref}\n className={cn(\n 'inline-flex h-5 min-w-5 items-center justify-center rounded-sm border border-border',\n 'bg-muted px-1.5 font-mono text-xs text-muted-foreground shadow-[inset_0_-1px_0_0_rgb(0_0_0/0.05)]',\n className,\n )}\n {...props}\n />\n));\nKbd.displayName = 'Kbd';\n","import { tv, type VariantProps } from '../../utils';\n\nexport const tagVariants = tv({\n base: 'inline-flex items-center gap-1 rounded-md border border-border bg-card px-2 py-0.5 text-xs font-medium text-card-foreground',\n variants: {\n variant: {\n neutral: '',\n brand: 'border-transparent bg-primary-soft text-primary-soft-foreground',\n success: 'border-transparent bg-success-soft text-success-soft-foreground',\n warning: 'border-transparent bg-warning-soft text-warning-soft-foreground',\n danger: 'border-transparent bg-destructive-soft text-destructive-soft-foreground',\n info: 'border-transparent bg-info-soft text-info-soft-foreground',\n },\n },\n defaultVariants: {\n variant: 'neutral',\n },\n});\n\nexport type TagVariants = VariantProps<typeof tagVariants>;\n","import { forwardRef, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils';\nimport { Icon } from '../../icons';\nimport { tagVariants, type TagVariants } from './Tag.variants';\n\nexport interface TagProps\n extends Omit<ComponentPropsWithoutRef<'span'>, 'children'>,\n TagVariants {\n children?: ReactNode;\n /** Show a close (×) button. Pass a handler to receive the click. */\n onClose?: () => void;\n /** Accessible label for the close button. Default `\"Remove\"`. */\n closeLabel?: string;\n}\n\n/**\n * Pill with an optional close button. The close button is a raw `<button>`\n * to keep the strict atom rule (Tag is L3, so importing Button would make\n * this an atom-on-atom composition).\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(\n ({ children, onClose, closeLabel = 'Remove', variant, className, ...props }, ref) => (\n <span ref={ref} className={cn(tagVariants({ variant }), className)} {...props}>\n {children}\n {onClose && (\n <button\n type=\"button\"\n aria-label={closeLabel}\n onClick={onClose}\n className=\"-mr-1 inline-flex h-4 w-4 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <Icon icon={X} size={12} />\n </button>\n )}\n </span>\n ),\n);\nTag.displayName = 'Tag';\n","// Shared date helpers for Calendar / DatePicker / DateField / RangeCalendar.\n// Co-located in `forms/` so imports stay within-domain.\n//\n// Native Date only — no date-fns / luxon dependency. All helpers operate on\n// local time (no UTC math) since calendar UIs are inherently local.\n\nexport const WEEKDAYS_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nexport const MONTHS_LONG = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport function startOfDay(d: Date): Date {\n const c = new Date(d);\n c.setHours(0, 0, 0, 0);\n return c;\n}\n\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function isToday(d: Date): boolean {\n return isSameDay(d, new Date());\n}\n\nexport function addMonths(d: Date, n: number): Date {\n const c = new Date(d);\n const month = d.getMonth() + n;\n // Clamp to the target month's last day (Jan 31 +1 → Feb 28, not Mar 3).\n c.setMonth(month, Math.min(d.getDate(), daysInMonth(d.getFullYear(), month)));\n return c;\n}\n\nexport function addDays(d: Date, n: number): Date {\n const c = new Date(d);\n c.setDate(c.getDate() + n);\n return c;\n}\n\nexport function startOfMonth(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), 1);\n}\n\nexport function daysInMonth(year: number, month: number): number {\n // month is 0-indexed; setting day 0 of next month gives last day of month.\n return new Date(year, month + 1, 0).getDate();\n}\n\n/**\n * Build the 6-week (42-cell) grid that the calendar UI renders.\n * Cells outside the target month carry `outOfMonth: true`.\n */\nexport function buildMonthGrid(year: number, month: number): { date: Date; outOfMonth: boolean }[] {\n const first = new Date(year, month, 1);\n const firstWeekday = first.getDay(); // 0 (Sun) – 6 (Sat)\n const start = addDays(first, -firstWeekday);\n const cells: { date: Date; outOfMonth: boolean }[] = [];\n for (let i = 0; i < 42; i++) {\n const date = addDays(start, i);\n cells.push({ date, outOfMonth: date.getMonth() !== month });\n }\n return cells;\n}\n\n/** Format Date → \"YYYY-MM-DD\" for native `<input type=\"date\">` value. */\nexport function formatISODate(d: Date | null | undefined): string {\n if (!d) return '';\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/** Parse \"YYYY-MM-DD\" → Date (local time). Returns null for invalid input. */\nexport function parseISODate(s: string | null | undefined): Date | null {\n if (!s) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n if (!m) return null;\n const [, y, mo, d] = m;\n if (!y || !mo || !d) return null;\n const date = new Date(Number(y), Number(mo) - 1, Number(d));\n if (isNaN(date.getTime())) return null;\n return date;\n}\n\n/** Format Date → \"HH:MM\" for native `<input type=\"time\">` value. */\nexport function formatISOTime(d: Date | null | undefined): string {\n if (!d) return '';\n const h = String(d.getHours()).padStart(2, '0');\n const m = String(d.getMinutes()).padStart(2, '0');\n return `${h}:${m}`;\n}\n\n/** Parse \"HH:MM\" → { hours, minutes }. Returns null for invalid input. */\nexport function parseISOTime(s: string | null | undefined): { hours: number; minutes: number } | null {\n if (!s) return null;\n const m = /^(\\d{2}):(\\d{2})$/.exec(s);\n if (!m) return null;\n const [, h, mi] = m;\n if (!h || !mi) return null;\n const hours = Number(h);\n const minutes = Number(mi);\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null;\n return { hours, minutes };\n}\n\nexport function clampDate(d: Date, min?: Date | null, max?: Date | null): Date {\n if (min && d < min) return min;\n if (max && d > max) return max;\n return d;\n}\n\nexport function isDateDisabled(\n d: Date,\n options: { min?: Date | null; max?: Date | null; isDisabled?: (d: Date) => boolean },\n): boolean {\n const { min, max, isDisabled } = options;\n if (min && startOfDay(d) < startOfDay(min)) return true;\n if (max && startOfDay(d) > startOfDay(max)) return true;\n if (isDisabled?.(d)) return true;\n return false;\n}\n\nexport function isInRange(\n d: Date,\n start: Date | null | undefined,\n end: Date | null | undefined,\n): boolean {\n if (!start || !end) return false;\n const t = startOfDay(d).getTime();\n const s = startOfDay(start).getTime();\n const e = startOfDay(end).getTime();\n return t >= Math.min(s, e) && t <= Math.max(s, e);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/display/kbd/Kbd.tsx","../src/display/tag/Tag.variants.ts","../src/display/tag/Tag.tsx","../src/forms/DateExtensions.ts"],"names":["forwardRef","jsx"],"mappings":"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","file":"chunk-XDATW7NF.js","sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { cn } from '../../utils';\n\nexport type KbdProps = ComponentPropsWithoutRef<'kbd'>;\n\n/**\n * Keyboard key affordance — `<kbd>` styled with subtle border and inset\n * shadow. Single key per `<Kbd>`; chain via `<Kbd>⌘</Kbd> + <Kbd>K</Kbd>`.\n */\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(({ className, ...props }, ref) => (\n <kbd\n ref={ref}\n className={cn(\n 'inline-flex h-5 min-w-5 items-center justify-center rounded-sm border border-border',\n 'bg-muted px-1.5 font-mono text-xs text-muted-foreground shadow-[inset_0_-1px_0_0_rgb(0_0_0/0.05)]',\n className,\n )}\n {...props}\n />\n));\nKbd.displayName = 'Kbd';\n","import { tv, type VariantProps } from '../../utils';\n\nexport const tagVariants = tv({\n base: 'inline-flex items-center gap-1 rounded-md border border-border bg-card px-2 py-0.5 text-xs font-medium text-card-foreground',\n variants: {\n variant: {\n neutral: '',\n brand: 'border-transparent bg-primary-soft text-primary-soft-foreground',\n success: 'border-transparent bg-success-soft text-success-soft-foreground',\n warning: 'border-transparent bg-warning-soft text-warning-soft-foreground',\n danger: 'border-transparent bg-destructive-soft text-destructive-soft-foreground',\n info: 'border-transparent bg-info-soft text-info-soft-foreground',\n },\n },\n defaultVariants: {\n variant: 'neutral',\n },\n});\n\nexport type TagVariants = VariantProps<typeof tagVariants>;\n","import { forwardRef, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils';\nimport { Icon } from '../../icons';\nimport { tagVariants, type TagVariants } from './Tag.variants';\n\nexport interface TagProps\n extends Omit<ComponentPropsWithoutRef<'span'>, 'children'>,\n TagVariants {\n children?: ReactNode;\n /** Show a close (×) button. Pass a handler to receive the click. */\n onClose?: () => void;\n /** Accessible label for the close button. Default `\"Remove\"`. */\n closeLabel?: string;\n}\n\n/**\n * Pill with an optional close button. The close button is a raw `<button>`\n * to keep the strict atom rule (Tag is L3, so importing Button would make\n * this an atom-on-atom composition).\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(\n ({ children, onClose, closeLabel = 'Remove', variant, className, ...props }, ref) => (\n <span ref={ref} className={cn(tagVariants({ variant }), className)} {...props}>\n {children}\n {onClose && (\n <button\n type=\"button\"\n aria-label={closeLabel}\n onClick={onClose}\n className=\"-mr-1 inline-flex h-4 w-4 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <Icon icon={X} size={12} />\n </button>\n )}\n </span>\n ),\n);\nTag.displayName = 'Tag';\n","// Shared date helpers for Calendar / DatePicker / DateField / RangeCalendar.\n// Co-located in `forms/` so imports stay within-domain.\n//\n// Native Date only — no date-fns / luxon dependency. All helpers operate on\n// local time (no UTC math) since calendar UIs are inherently local.\n\nexport const WEEKDAYS_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nexport const MONTHS_LONG = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport function startOfDay(d: Date): Date {\n const c = new Date(d);\n c.setHours(0, 0, 0, 0);\n return c;\n}\n\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function isToday(d: Date): boolean {\n return isSameDay(d, new Date());\n}\n\nexport function addMonths(d: Date, n: number): Date {\n const c = new Date(d);\n const month = d.getMonth() + n;\n // Clamp to the target month's last day (Jan 31 +1 → Feb 28, not Mar 3).\n c.setMonth(month, Math.min(d.getDate(), daysInMonth(d.getFullYear(), month)));\n return c;\n}\n\nexport function addDays(d: Date, n: number): Date {\n const c = new Date(d);\n c.setDate(c.getDate() + n);\n return c;\n}\n\nexport function startOfMonth(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), 1);\n}\n\nexport function daysInMonth(year: number, month: number): number {\n // month is 0-indexed; setting day 0 of next month gives last day of month.\n return new Date(year, month + 1, 0).getDate();\n}\n\n/**\n * Build the 6-week (42-cell) grid that the calendar UI renders.\n * Cells outside the target month carry `outOfMonth: true`.\n */\nexport function buildMonthGrid(year: number, month: number): { date: Date; outOfMonth: boolean }[] {\n const first = new Date(year, month, 1);\n const firstWeekday = first.getDay(); // 0 (Sun) – 6 (Sat)\n const start = addDays(first, -firstWeekday);\n const cells: { date: Date; outOfMonth: boolean }[] = [];\n for (let i = 0; i < 42; i++) {\n const date = addDays(start, i);\n cells.push({ date, outOfMonth: date.getMonth() !== month });\n }\n return cells;\n}\n\n/** Format Date → \"YYYY-MM-DD\" for native `<input type=\"date\">` value. */\nexport function formatISODate(d: Date | null | undefined): string {\n if (!d) return '';\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/** Parse \"YYYY-MM-DD\" → Date (local time). Returns null for invalid input. */\nexport function parseISODate(s: string | null | undefined): Date | null {\n if (!s) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n if (!m) return null;\n const [, y, mo, d] = m;\n if (!y || !mo || !d) return null;\n const date = new Date(Number(y), Number(mo) - 1, Number(d));\n if (isNaN(date.getTime())) return null;\n return date;\n}\n\n/** Format Date → \"HH:MM\" for native `<input type=\"time\">` value. */\nexport function formatISOTime(d: Date | null | undefined): string {\n if (!d) return '';\n const h = String(d.getHours()).padStart(2, '0');\n const m = String(d.getMinutes()).padStart(2, '0');\n return `${h}:${m}`;\n}\n\n/** Parse \"HH:MM\" → { hours, minutes }. Returns null for invalid input. */\nexport function parseISOTime(s: string | null | undefined): { hours: number; minutes: number } | null {\n if (!s) return null;\n const m = /^(\\d{2}):(\\d{2})$/.exec(s);\n if (!m) return null;\n const [, h, mi] = m;\n if (!h || !mi) return null;\n const hours = Number(h);\n const minutes = Number(mi);\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null;\n return { hours, minutes };\n}\n\nexport function clampDate(d: Date, min?: Date | null, max?: Date | null): Date {\n if (min && d < min) return min;\n if (max && d > max) return max;\n return d;\n}\n\nexport function isDateDisabled(\n d: Date,\n options: { min?: Date | null; max?: Date | null; isDisabled?: (d: Date) => boolean },\n): boolean {\n const { min, max, isDisabled } = options;\n if (min && startOfDay(d) < startOfDay(min)) return true;\n if (max && startOfDay(d) > startOfDay(max)) return true;\n if (isDisabled?.(d)) return true;\n return false;\n}\n\nexport function isInRange(\n d: Date,\n start: Date | null | undefined,\n end: Date | null | undefined,\n): boolean {\n if (!start || !end) return false;\n const t = startOfDay(d).getTime();\n const s = startOfDay(start).getTime();\n const e = startOfDay(end).getTime();\n return t >= Math.min(s, e) && t <= Math.max(s, e);\n}\n"]}
|