@rpcbase/ui 0.281.0 → 0.283.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AddressAutocompleteInput/index.d.ts.map +1 -1
- package/dist/index13.js +0 -1
- package/dist/index13.js.map +1 -1
- package/dist/index14.js +88 -88
- package/dist/index14.js.map +1 -1
- package/dist/index15.js.map +1 -1
- package/dist/index16.js +45 -37
- package/dist/index16.js.map +1 -1
- package/dist/index182.js +162 -145
- package/dist/index182.js.map +1 -1
- package/dist/index294.js +27 -16
- package/dist/index294.js.map +1 -1
- package/dist/index296.js +83 -56
- package/dist/index296.js.map +1 -1
- package/dist/index298.js.map +1 -1
- package/dist/index299.js +18 -12
- package/dist/index299.js.map +1 -1
- package/dist/index300.js +352 -255
- package/dist/index300.js.map +1 -1
- package/dist/index301.js.map +1 -1
- package/dist/index356.js.map +1 -1
- package/dist/index358.js.map +1 -1
- package/dist/index361.js.map +1 -1
- package/dist/index362.js.map +1 -1
- package/dist/index4.js.map +1 -1
- package/dist/index416.js +62 -40
- package/dist/index416.js.map +1 -1
- package/dist/index417.js.map +1 -1
- package/dist/index419.js.map +1 -1
- package/dist/index420.js.map +1 -1
- package/dist/index421.js.map +1 -1
- package/dist/index6.js.map +1 -1
- package/dist/index7.js +133 -91
- package/dist/index7.js.map +1 -1
- package/dist/index8.js.map +1 -1
- package/dist/index9.js +19 -16
- package/dist/index9.js.map +1 -1
- package/package.json +3 -5
package/dist/index301.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index301.js","names":["viewport","tolerance","option","next","matchingOption","event","target","container","popover","trigger","padding","firstEnabled","targetTop","targetBottom","viewportBottom","baseIndex","nextText","resolved","targetMinutes","closestOption","id","triggerTestId","disabled","readOnly","inputRef","placeholder","draft","triggerClassName","selectedLabel"],"sources":["../src/components/HourPickerField/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { IMaskInput } from \"react-imask\"\nimport IMask, { InputMask } from \"imask\"\n\nimport { useIsTouchDevice } from \"@/helpers/useIsTouchDevice\"\nimport { cn } from \"@/lib/utils\"\n\n\n// WARNING: used to preserve input mask even with tree shaking\n// DO NOT REMOVE THIS CODE OR THIS COMMENT\nconst imaskAny = IMask as any\nif (typeof imaskAny.InputMask !== \"function\") {\n imaskAny.InputMask = InputMask\n}\n\n\nexport type HourPickerOption = {\n value: string\n label: string\n selectedLabel?: React.ReactNode\n disabled?: boolean\n description?: React.ReactNode\n}\n\nfunction pad2(value: number) {\n return String(value).padStart(2, \"0\")\n}\n\nfunction parseTimeInput(raw: string) {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(trimmed)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {\n return null\n }\n\n return `${pad2(hours)}:${pad2(minutes)}`\n}\n\nfunction getAcceptedInputSignature(raw: string) {\n const parsed = parseTimeInput(raw)\n if (parsed) {\n return `parsed:${parsed}`\n }\n\n const digits = raw.replace(/\\D/g, \"\")\n if (!digits) {\n return \"empty\"\n }\n\n if (digits.length <= 2) {\n return `hour:${Number(digits)}`\n }\n\n const minutePart = digits.slice(-2)\n const hourPart = digits.slice(0, -2)\n return `hour-minute:${Number(hourPart)}:${minutePart}`\n}\n\ntype ParsedTimeInputResult = {\n parsed: string\n selectableValue: string | null\n}\n\nfunction parseTimeInputWithSelectableOption(raw: string, options: HourPickerOption[]): ParsedTimeInputResult | null {\n const parsed = parseTimeInput(raw)\n if (!parsed) return null\n\n const parsedOption = options.find((option) => option.value === parsed)\n if (isOptionSelectable(parsedOption)) {\n return { parsed, selectableValue: parsed }\n }\n\n return { parsed, selectableValue: null }\n}\n\nfunction timeStringToMinutes(value: string) {\n const match = /^(\\d{2}):(\\d{2})$/.exec(value)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n return hours * 60 + minutes\n}\n\nfunction isOptionSelectable(option: HourPickerOption | undefined) {\n if (!option) return false\n return !option.disabled\n}\n\nfunction findClosestSelectableOption(targetMinutes: number, options: HourPickerOption[]) {\n let bestOption: HourPickerOption | null = null\n let bestDiff = Number.POSITIVE_INFINITY\n let bestMinutes = Number.NEGATIVE_INFINITY\n\n for (const option of options) {\n if (!isOptionSelectable(option)) continue\n const optionMinutes = timeStringToMinutes(option.value)\n if (optionMinutes == null) continue\n\n const diff = Math.abs(optionMinutes - targetMinutes)\n if (diff < bestDiff || (diff === bestDiff && optionMinutes > bestMinutes)) {\n bestOption = option\n bestDiff = diff\n bestMinutes = optionMinutes\n }\n }\n\n return bestOption\n}\n\ntype HourPickerScrollButtonDirection = \"up\" | \"down\"\n\ntype HourPickerScrollButtonProps = {\n direction: HourPickerScrollButtonDirection\n viewportRef: React.RefObject<HTMLElement | null>\n speed?: number\n className?: string\n}\n\nfunction HourPickerScrollButton({\n direction,\n viewportRef,\n speed = 400,\n className,\n}: HourPickerScrollButtonProps) {\n const [disabled, setDisabled] = React.useState(true)\n const animationRef = React.useRef<number | undefined>(undefined)\n const lastTimeRef = React.useRef<number | undefined>(undefined)\n const isScrollingRef = React.useRef(false)\n\n const checkScrollability = React.useCallback(() => {\n const viewport = viewportRef.current\n if (!viewport) {\n setDisabled(true)\n return\n }\n\n const { scrollTop, scrollHeight, clientHeight } = viewport\n const tolerance = 2\n\n const canScrollUp = scrollTop > tolerance\n const canScrollDown = scrollTop < (scrollHeight - clientHeight - tolerance)\n const hasScrollableContent = scrollHeight > clientHeight + tolerance\n\n if (!hasScrollableContent) {\n setDisabled(true)\n return\n }\n\n const shouldDisable = direction === \"up\" ? !canScrollUp : !canScrollDown\n setDisabled(shouldDisable)\n }, [direction, viewportRef])\n\n React.useEffect(() => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n checkScrollability()\n\n const handleScroll = () => checkScrollability()\n const handleResize = () => checkScrollability()\n\n viewport.addEventListener(\"scroll\", handleScroll, { passive: true })\n\n const resizeObserver = new ResizeObserver(handleResize)\n resizeObserver.observe(viewport)\n\n const mutationObserver = new MutationObserver(handleResize)\n mutationObserver.observe(viewport, { childList: true, subtree: true })\n\n return () => {\n viewport.removeEventListener(\"scroll\", handleScroll)\n resizeObserver.disconnect()\n mutationObserver.disconnect()\n }\n }, [viewportRef, checkScrollability])\n\n const stopScrolling = React.useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = undefined\n }\n isScrollingRef.current = false\n lastTimeRef.current = undefined\n }, [])\n\n const smoothScroll = React.useCallback(\n (currentTime: number) => {\n const viewport = viewportRef.current\n if (!viewport || disabled || !isScrollingRef.current) {\n stopScrolling()\n return\n }\n\n if (!lastTimeRef.current) {\n lastTimeRef.current = currentTime\n }\n\n const deltaTime = currentTime - lastTimeRef.current\n const distance = (speed * deltaTime) / 1000\n\n if (distance < 0.1) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n return\n }\n\n const oldScrollTop = viewport.scrollTop\n const maxScroll = viewport.scrollHeight - viewport.clientHeight\n\n let newScrollTop: number\n if (direction === \"up\") {\n newScrollTop = Math.max(0, oldScrollTop - distance)\n } else {\n newScrollTop = Math.min(maxScroll, oldScrollTop + distance)\n }\n\n viewport.scrollTo({ top: newScrollTop })\n\n lastTimeRef.current = currentTime\n\n const tolerance = 1\n const canContinue =\n direction === \"up\"\n ? newScrollTop > tolerance\n : newScrollTop < (maxScroll - tolerance)\n\n if (canContinue && Math.abs(newScrollTop - oldScrollTop) > 0.01) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n } else {\n stopScrolling()\n setTimeout(checkScrollability, 16)\n }\n },\n [checkScrollability, direction, disabled, speed, stopScrolling, viewportRef],\n )\n\n const startScrolling = React.useCallback(() => {\n if (disabled || !viewportRef.current || isScrollingRef.current) return\n\n isScrollingRef.current = true\n lastTimeRef.current = undefined\n animationRef.current = requestAnimationFrame(smoothScroll)\n }, [disabled, smoothScroll, viewportRef])\n\n React.useEffect(() => stopScrolling, [stopScrolling])\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center py-1 select-none\",\n disabled ? \"cursor-default opacity-40\" : \"cursor-pointer opacity-100 hover:bg-accent/20\",\n className\n )}\n onPointerEnter={() => {\n if (!disabled) startScrolling()\n }}\n onPointerMove={() => {\n if (!disabled && !isScrollingRef.current) startScrolling()\n }}\n onPointerLeave={() => {\n stopScrolling()\n }}\n >\n {direction === \"up\"\n ? <ChevronUp aria-hidden className=\"h-4 w-4 opacity-50\" />\n : <ChevronDown aria-hidden className=\"h-4 w-4 opacity-50\" />}\n </div>\n )\n}\n\nexport type HourPickerInputProps = {\n id?: string\n value: string | null\n onChange: (value: string | null) => void\n onValueUpdate?: (value: string | null) => void\n options: HourPickerOption[]\n placeholder?: string\n className?: string\n inputClassName?: string\n disabled?: boolean\n readOnly?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n triggerTestId?: string\n contentTestId?: string\n isHydrated?: boolean\n}\n\nexport function HourPickerInput({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open: openProp,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerInputProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerInputRef = React.useRef<HTMLInputElement | null>(null)\n const setTriggerDraftValueRef = React.useRef<((value: string) => void) | null>(null)\n const setTriggerDraftValueHandler = React.useCallback((handler: ((value: string) => void) | null) => {\n setTriggerDraftValueRef.current = handler\n }, [])\n const highlightedValueRef = React.useRef<string | null>(null)\n const keyboardNavigationActiveRef = React.useRef(false)\n const [highlightedValue, setHighlightedValue] = React.useState<string | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const desktopPopoverRef = React.useRef<HTMLDivElement | null>(null)\n const desktopContentRef = React.useRef<HTMLDivElement | null>(null)\n const [desktopPopoverPosition, setDesktopPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const open = openProp ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = open\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (disabled || readOnly) {\n return\n }\n\n const input = triggerInputRef.current\n if (!(input instanceof HTMLInputElement)) {\n return\n }\n if (typeof document !== \"undefined\" && document.activeElement === input) {\n return\n }\n\n input.focus({ preventScroll: true })\n }, [disabled, open, readOnly])\n\n const updateHighlightedValue = React.useCallback((next: string | null) => {\n highlightedValueRef.current = next\n setHighlightedValue(next)\n }, [])\n\n const markKeyboardNavigation = React.useCallback(() => {\n keyboardNavigationActiveRef.current = true\n }, [])\n\n React.useEffect(() => {\n if (!open) return\n\n const currentOption = options.find((option) => option.value === value)\n if (currentOption && isOptionSelectable(currentOption)) {\n updateHighlightedValue(currentOption.value)\n return\n }\n\n const firstEnabled = options.find((option) => isOptionSelectable(option))\n updateHighlightedValue(firstEnabled?.value ?? null)\n }, [open, options, updateHighlightedValue, value])\n\n const updateValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n },\n [onValueUpdate, options],\n )\n\n const commitValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n onChange(null)\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n React.useEffect(() => {\n if (!open) return\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (!container) {\n return\n }\n\n if (container.contains(target)) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return\n }\n if (!openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = desktopPopoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [open, setOpen])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (!popover) {\n return\n }\n\n const handleWheel = (event: WheelEvent) => {\n const viewport = desktopContentRef.current\n if (!viewport) {\n return\n }\n\n const deltaY = event.deltaY\n if (deltaY === 0) {\n return\n }\n\n const maxScrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight)\n const atTop = viewport.scrollTop <= 0\n const atBottom = viewport.scrollTop >= maxScrollTop\n\n const target = event.target\n const isWheelOverViewport = target instanceof Node && viewport.contains(target)\n\n if (isWheelOverViewport) {\n if ((deltaY < 0 && atTop) || (deltaY > 0 && atBottom)) {\n event.preventDefault()\n }\n return\n }\n\n event.preventDefault()\n const nextScrollTop = Math.min(maxScrollTop, Math.max(0, viewport.scrollTop + deltaY))\n viewport.scrollTop = nextScrollTop\n }\n\n popover.addEventListener(\"wheel\", handleWheel, { passive: false })\n return () => {\n popover.removeEventListener(\"wheel\", handleWheel)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (openProp !== undefined && !onOpenChange) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n if (!(\"IntersectionObserver\" in window)) {\n return\n }\n\n const trigger = triggerInputRef.current\n if (!(trigger instanceof HTMLElement)) {\n return\n }\n\n let isActive = true\n const observer = new IntersectionObserver(entries => {\n if (!isActive) {\n return\n }\n const entry = entries[0]\n if (entry && !entry.isIntersecting) {\n setOpen(false)\n }\n })\n observer.observe(trigger)\n return () => {\n isActive = false\n observer.disconnect()\n }\n }, [onOpenChange, open, openProp, setOpen])\n\n const updateDesktopPopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") return\n\n const trigger = triggerInputRef.current\n const popover = desktopPopoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) return\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setDesktopPopoverPosition({ left, top, width })\n }, [])\n\n // React Compiler rejects hook aliasing (useIsomorphicLayoutEffect pattern), so we\n // call useLayoutEffect directly and keep the SSR guard inside the effect.\n React.useLayoutEffect(() => {\n if (!open || disabled) return\n if (typeof window === \"undefined\") return\n\n updateDesktopPopoverPosition()\n const rafId = window.requestAnimationFrame(updateDesktopPopoverPosition)\n\n window.addEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.addEventListener(\"resize\", updateDesktopPopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.removeEventListener(\"resize\", updateDesktopPopoverPosition)\n }\n }, [disabled, open, updateDesktopPopoverPosition])\n\n React.useEffect(() => {\n if (!open) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const run = () => {\n const selected = viewport.querySelector(\"[role=\\\"option\\\"][data-state=\\\"checked\\\"]\")\n if (selected instanceof HTMLElement) {\n const padding = 8\n const targetTop = selected.offsetTop - padding\n const targetBottom = selected.offsetTop + selected.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n return\n }\n\n const all = Array.from(viewport.querySelectorAll(\"[role=\\\"option\\\"]\")) as HTMLElement[]\n if (!all.length) return\n\n let firstEnabled: HTMLElement | undefined\n let lastDisabledBefore: HTMLElement | undefined\n\n for (const el of all) {\n const isDisabled = el.hasAttribute(\"data-disabled\")\n if (!isDisabled) {\n firstEnabled = el\n break\n }\n lastDisabledBefore = el\n }\n\n if (!firstEnabled) return\n\n const target = lastDisabledBefore ? lastDisabledBefore : firstEnabled\n\n const offset = Math.max(0, target.offsetTop - 8)\n viewport.scrollTop = offset\n }\n\n const raf = requestAnimationFrame(run)\n return () => cancelAnimationFrame(raf)\n }, [open, options])\n\n React.useEffect(() => {\n if (!open) return\n if (!highlightedValue) return\n if (!keyboardNavigationActiveRef.current) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const target = viewport.querySelector(`[role=\"option\"][data-value=\"${highlightedValue}\"]`)\n if (!(target instanceof HTMLElement)) return\n\n const padding = 8\n const targetTop = target.offsetTop - padding\n const targetBottom = target.offsetTop + target.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n }, [highlightedValue, open])\n\n const selectedOption = options.find((option) => option.value === value)\n\n return (\n <div\n data-slot=\"hours-picker-input\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <div className=\"relative\">\n <HourPickerMaskedSelectTrigger\n id={triggerId}\n placeholder={placeholder}\n value={value}\n onValueUpdate={updateValue}\n onCommit={commitValue}\n options={options}\n selectedLabel={selectedOption?.selectedLabel}\n disabled={disabled}\n readOnly={readOnly}\n open={open}\n setOpen={setOpen}\n inputClassName={inputClassName}\n triggerTestId={triggerTestId}\n isHydrated={isHydrated}\n highlightedValueRef={highlightedValueRef}\n setHighlightedValue={updateHighlightedValue}\n markKeyboardNavigation={markKeyboardNavigation}\n inputRef={(node) => {\n triggerInputRef.current = node\n }}\n onDraftValueHandlerChange={setTriggerDraftValueHandler}\n />\n\n {open ? (() => {\n const popover = (\n <>\n <div\n ref={desktopPopoverRef}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"pointer-events-auto fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: desktopPopoverPosition.left,\n top: desktopPopoverPosition.top,\n width: desktopPopoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={desktopContentRef}\n />\n\n <div\n ref={desktopContentRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n highlightedValue === option.value && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled) return\n\n setTriggerDraftValueRef.current?.(option.value)\n updateHighlightedValue(option.value)\n triggerInputRef.current?.focus({ preventScroll: true })\n commitValue(option.value)\n setOpen(false)\n }}\n onPointerEnter={() => {\n if (keyboardNavigationActiveRef.current) return\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n onPointerMove={(event) => {\n if (keyboardNavigationActiveRef.current && event.movementX === 0 && event.movementY === 0) {\n return\n }\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={desktopContentRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return popover\n return createPortal(popover, document.body)\n })() : null}\n </div>\n </div>\n )\n}\n\nHourPickerInput.displayName = \"HourPickerInput\"\n\nexport type HourPickerFieldProps = HourPickerInputProps\n\nfunction HourPickerSelectField({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerFieldProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const popoverRef = React.useRef<HTMLDivElement | null>(null)\n const viewportRef = React.useRef<HTMLDivElement | null>(null)\n const [popoverPosition, setPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const resolvedOpen = open ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = resolvedOpen\n\n const commitValue = React.useCallback(\n (next: string) => {\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n const updatePopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") {\n return\n }\n\n const trigger = triggerRef.current\n const popover = popoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) {\n return\n }\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setPopoverPosition({ left, top, width })\n }, [])\n\n React.useLayoutEffect(() => {\n if (!resolvedOpen || disabled) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n\n updatePopoverPosition()\n const rafId = window.requestAnimationFrame(updatePopoverPosition)\n\n window.addEventListener(\"scroll\", updatePopoverPosition, true)\n window.addEventListener(\"resize\", updatePopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updatePopoverPosition, true)\n window.removeEventListener(\"resize\", updatePopoverPosition)\n }\n }, [disabled, resolvedOpen, updatePopoverPosition])\n\n React.useEffect(() => {\n if (!resolvedOpen) {\n return\n }\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (container?.contains(target)) {\n return\n }\n\n const popover = popoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = popoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [resolvedOpen, setOpen])\n\n const selectedOption = options.find((option) => option.value === value)\n const selectedLabel = selectedOption?.selectedLabel ?? selectedOption?.label ?? value\n\n return (\n <div\n data-slot=\"hours-picker-field\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={resolvedOpen}\n aria-controls={`${triggerId}-content`}\n disabled={disabled}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n \"hover:bg-accent hover:text-accent-foreground\",\n !value && \"text-muted-foreground\",\n resolvedOpen && \"ring-2 ring-primary ring-offset-2\",\n inputClassName,\n )}\n onClick={() => {\n if (disabled || readOnly) {\n return\n }\n setOpen(!resolvedOpen)\n }}\n >\n <span className=\"line-clamp-1 text-left\">\n {value ? selectedLabel : placeholder}\n </span>\n <ChevronDown aria-hidden className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n\n {resolvedOpen ? (() => {\n const popover = (\n <>\n <div\n ref={popoverRef}\n id={`${triggerId}-content`}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: popoverPosition.left,\n top: popoverPosition.top,\n width: popoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={viewportRef}\n />\n\n <div\n ref={viewportRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n isChecked && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled || readOnly) {\n return\n }\n\n commitValue(option.value)\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={viewportRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") {\n return popover\n }\n\n return createPortal(popover, document.body)\n })() : null}\n </div>\n )\n}\n\nexport function HourPickerField(props: HourPickerFieldProps) {\n const isTouchDevice = useIsTouchDevice()\n\n if (isTouchDevice) {\n return <HourPickerSelectField {...props} />\n }\n\n return <HourPickerInput {...props} />\n}\n\nHourPickerField.displayName = \"HourPickerField\"\n\ntype HourPickerMaskedSelectTriggerProps = {\n id: string\n placeholder: string\n value: string | null\n onValueUpdate: (value: string | null) => void\n onCommit: (value: string | null) => void\n options: HourPickerOption[]\n selectedLabel?: React.ReactNode\n disabled?: boolean\n readOnly?: boolean\n open: boolean\n setOpen: (open: boolean) => void\n inputClassName?: string\n triggerTestId?: string\n isHydrated?: boolean\n highlightedValueRef: React.MutableRefObject<string | null>\n setHighlightedValue: (value: string | null) => void\n markKeyboardNavigation: () => void\n inputRef: (node: HTMLInputElement | null) => void\n onDraftValueHandlerChange: (handler: ((value: string) => void) | null) => void\n}\n\nfunction HourPickerMaskedSelectTrigger({\n id,\n placeholder,\n value,\n onValueUpdate,\n onCommit,\n options,\n selectedLabel,\n disabled,\n readOnly,\n open,\n setOpen,\n inputClassName,\n triggerTestId,\n isHydrated,\n highlightedValueRef,\n setHighlightedValue,\n markKeyboardNavigation,\n inputRef,\n onDraftValueHandlerChange,\n}: HourPickerMaskedSelectTriggerProps) {\n const isEditingRef = React.useRef(false)\n const pointerDownOnInputRef = React.useRef(false)\n const inputWasFocusedOnPointerDownRef = React.useRef(false)\n const ignoreNextMaskCommitValueRef = React.useRef<string | null>(null)\n const lastAcceptedSignatureRef = React.useRef<string | null>(null)\n const clearCommitPendingRef = React.useRef(false)\n\n const [draft, setDraft] = React.useState(() => (value ? value : \"\"))\n\n React.useEffect(() => {\n onDraftValueHandlerChange((nextValue) => {\n setDraft(nextValue)\n })\n return () => {\n onDraftValueHandlerChange(null)\n }\n }, [onDraftValueHandlerChange])\n\n const moveSelection = React.useCallback(\n (direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n },\n [highlightedValueRef, onValueUpdate, options, setHighlightedValue, value],\n )\n\n React.useEffect(() => {\n if (isEditingRef.current) return\n setDraft(value ? value : \"\")\n }, [value])\n\n React.useEffect(() => {\n lastAcceptedSignatureRef.current = getAcceptedInputSignature(draft)\n }, [draft])\n\n React.useEffect(() => {\n if (value === null) {\n clearCommitPendingRef.current = false\n }\n }, [value])\n\n const triggerClassName = cn(\n \"peer flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"transition-colors group-hover:bg-accent group-hover:text-accent-foreground\",\n !draft && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n value && selectedLabel != null && \"text-transparent focus:text-foreground\",\n )\n\n return (\n <div className=\"relative group\">\n <IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />\n\n {value && selectedLabel != null ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"hours-picker-input-selected-label\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n </span>\n ) : null}\n\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index301.js","names":["<HourPickerSelectField {...props} />","<HourPickerInput {...props} />","{\n id,\n placeholder,\n value,\n onValueUpdate,\n onCommit,\n options,\n selectedLabel,\n disabled,\n readOnly,\n open,\n setOpen,\n inputClassName,\n triggerTestId,\n isHydrated,\n highlightedValueRef,\n setHighlightedValue,\n markKeyboardNavigation,\n inputRef,\n onDraftValueHandlerChange,\n}: HourPickerMaskedSelectTriggerProps","() => (value ? value : \"\")","() => {\n onDraftValueHandlerChange((nextValue) => {\n setDraft(nextValue)\n })\n return () => {\n onDraftValueHandlerChange(null)\n }\n }","[onDraftValueHandlerChange]","(direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n }","highlightedValueRef.current","React.useCallback(\n (direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n },\n [highlightedValueRef, onValueUpdate, options, setHighlightedValue, value],\n )","() => {\n if (isEditingRef.current) return\n setDraft(value ? value : \"\")\n }","[value]","() => {\n lastAcceptedSignatureRef.current = getAcceptedInputSignature(draft)\n }","[draft]","() => {\n if (value === null) {\n clearCommitPendingRef.current = false\n }\n }","cn(\n \"peer flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"transition-colors group-hover:bg-accent group-hover:text-accent-foreground\",\n !draft && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n value && selectedLabel != null && \"text-transparent focus:text-foreground\",\n )","!draft && \"text-muted-foreground\"","open && \"ring-2 ring-primary ring-offset-2\"","value && selectedLabel != null && \"text-transparent focus:text-foreground\"","[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]","(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }","option","(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }","(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }","event","nextText","() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }","(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }","() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }","(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }","resolved","(option) => isOptionSelectable(option)","targetMinutes","closestOption","(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }","() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }","<IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />","isHydrated ? \"true\" : undefined","value && selectedLabel != null ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"hours-picker-input-selected-label\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n </span>\n ) : null","cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )","() => {\n if (disabled) return\n setOpen(!open)\n }","<ChevronDown aria-hidden className=\"size-4\" />","<button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>","open ? \"Close time picker\" : \"Open time picker\"","(event) => {\n event.preventDefault()\n }","<div className=\"relative group\">\n <IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />\n\n {value && selectedLabel != null ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"hours-picker-input-selected-label\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n </span>\n ) : null}\n\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>\n </div>"],"sources":["../src/components/HourPickerField/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { IMaskInput } from \"react-imask\"\nimport IMask, { InputMask } from \"imask\"\n\nimport { useIsTouchDevice } from \"@/helpers/useIsTouchDevice\"\nimport { cn } from \"@/lib/utils\"\n\n\n// WARNING: used to preserve input mask even with tree shaking\n// DO NOT REMOVE THIS CODE OR THIS COMMENT\nconst imaskAny = IMask as any\nif (typeof imaskAny.InputMask !== \"function\") {\n imaskAny.InputMask = InputMask\n}\n\n\nexport type HourPickerOption = {\n value: string\n label: string\n selectedLabel?: React.ReactNode\n disabled?: boolean\n description?: React.ReactNode\n}\n\nfunction pad2(value: number) {\n return String(value).padStart(2, \"0\")\n}\n\nfunction parseTimeInput(raw: string) {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(trimmed)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {\n return null\n }\n\n return `${pad2(hours)}:${pad2(minutes)}`\n}\n\nfunction getAcceptedInputSignature(raw: string) {\n const parsed = parseTimeInput(raw)\n if (parsed) {\n return `parsed:${parsed}`\n }\n\n const digits = raw.replace(/\\D/g, \"\")\n if (!digits) {\n return \"empty\"\n }\n\n if (digits.length <= 2) {\n return `hour:${Number(digits)}`\n }\n\n const minutePart = digits.slice(-2)\n const hourPart = digits.slice(0, -2)\n return `hour-minute:${Number(hourPart)}:${minutePart}`\n}\n\ntype ParsedTimeInputResult = {\n parsed: string\n selectableValue: string | null\n}\n\nfunction parseTimeInputWithSelectableOption(raw: string, options: HourPickerOption[]): ParsedTimeInputResult | null {\n const parsed = parseTimeInput(raw)\n if (!parsed) return null\n\n const parsedOption = options.find((option) => option.value === parsed)\n if (isOptionSelectable(parsedOption)) {\n return { parsed, selectableValue: parsed }\n }\n\n return { parsed, selectableValue: null }\n}\n\nfunction timeStringToMinutes(value: string) {\n const match = /^(\\d{2}):(\\d{2})$/.exec(value)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n return hours * 60 + minutes\n}\n\nfunction isOptionSelectable(option: HourPickerOption | undefined) {\n if (!option) return false\n return !option.disabled\n}\n\nfunction findClosestSelectableOption(targetMinutes: number, options: HourPickerOption[]) {\n let bestOption: HourPickerOption | null = null\n let bestDiff = Number.POSITIVE_INFINITY\n let bestMinutes = Number.NEGATIVE_INFINITY\n\n for (const option of options) {\n if (!isOptionSelectable(option)) continue\n const optionMinutes = timeStringToMinutes(option.value)\n if (optionMinutes == null) continue\n\n const diff = Math.abs(optionMinutes - targetMinutes)\n if (diff < bestDiff || (diff === bestDiff && optionMinutes > bestMinutes)) {\n bestOption = option\n bestDiff = diff\n bestMinutes = optionMinutes\n }\n }\n\n return bestOption\n}\n\ntype HourPickerScrollButtonDirection = \"up\" | \"down\"\n\ntype HourPickerScrollButtonProps = {\n direction: HourPickerScrollButtonDirection\n viewportRef: React.RefObject<HTMLElement | null>\n speed?: number\n className?: string\n}\n\nfunction HourPickerScrollButton({\n direction,\n viewportRef,\n speed = 400,\n className,\n}: HourPickerScrollButtonProps) {\n const [disabled, setDisabled] = React.useState(true)\n const animationRef = React.useRef<number | undefined>(undefined)\n const lastTimeRef = React.useRef<number | undefined>(undefined)\n const isScrollingRef = React.useRef(false)\n\n const checkScrollability = React.useCallback(() => {\n const viewport = viewportRef.current\n if (!viewport) {\n setDisabled(true)\n return\n }\n\n const { scrollTop, scrollHeight, clientHeight } = viewport\n const tolerance = 2\n\n const canScrollUp = scrollTop > tolerance\n const canScrollDown = scrollTop < (scrollHeight - clientHeight - tolerance)\n const hasScrollableContent = scrollHeight > clientHeight + tolerance\n\n if (!hasScrollableContent) {\n setDisabled(true)\n return\n }\n\n const shouldDisable = direction === \"up\" ? !canScrollUp : !canScrollDown\n setDisabled(shouldDisable)\n }, [direction, viewportRef])\n\n React.useEffect(() => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n checkScrollability()\n\n const handleScroll = () => checkScrollability()\n const handleResize = () => checkScrollability()\n\n viewport.addEventListener(\"scroll\", handleScroll, { passive: true })\n\n const resizeObserver = new ResizeObserver(handleResize)\n resizeObserver.observe(viewport)\n\n const mutationObserver = new MutationObserver(handleResize)\n mutationObserver.observe(viewport, { childList: true, subtree: true })\n\n return () => {\n viewport.removeEventListener(\"scroll\", handleScroll)\n resizeObserver.disconnect()\n mutationObserver.disconnect()\n }\n }, [viewportRef, checkScrollability])\n\n const stopScrolling = React.useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = undefined\n }\n isScrollingRef.current = false\n lastTimeRef.current = undefined\n }, [])\n\n const smoothScroll = React.useCallback(\n (currentTime: number) => {\n const viewport = viewportRef.current\n if (!viewport || disabled || !isScrollingRef.current) {\n stopScrolling()\n return\n }\n\n if (!lastTimeRef.current) {\n lastTimeRef.current = currentTime\n }\n\n const deltaTime = currentTime - lastTimeRef.current\n const distance = (speed * deltaTime) / 1000\n\n if (distance < 0.1) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n return\n }\n\n const oldScrollTop = viewport.scrollTop\n const maxScroll = viewport.scrollHeight - viewport.clientHeight\n\n let newScrollTop: number\n if (direction === \"up\") {\n newScrollTop = Math.max(0, oldScrollTop - distance)\n } else {\n newScrollTop = Math.min(maxScroll, oldScrollTop + distance)\n }\n\n viewport.scrollTo({ top: newScrollTop })\n\n lastTimeRef.current = currentTime\n\n const tolerance = 1\n const canContinue =\n direction === \"up\"\n ? newScrollTop > tolerance\n : newScrollTop < (maxScroll - tolerance)\n\n if (canContinue && Math.abs(newScrollTop - oldScrollTop) > 0.01) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n } else {\n stopScrolling()\n setTimeout(checkScrollability, 16)\n }\n },\n [checkScrollability, direction, disabled, speed, stopScrolling, viewportRef],\n )\n\n const startScrolling = React.useCallback(() => {\n if (disabled || !viewportRef.current || isScrollingRef.current) return\n\n isScrollingRef.current = true\n lastTimeRef.current = undefined\n animationRef.current = requestAnimationFrame(smoothScroll)\n }, [disabled, smoothScroll, viewportRef])\n\n React.useEffect(() => stopScrolling, [stopScrolling])\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center py-1 select-none\",\n disabled ? \"cursor-default opacity-40\" : \"cursor-pointer opacity-100 hover:bg-accent/20\",\n className\n )}\n onPointerEnter={() => {\n if (!disabled) startScrolling()\n }}\n onPointerMove={() => {\n if (!disabled && !isScrollingRef.current) startScrolling()\n }}\n onPointerLeave={() => {\n stopScrolling()\n }}\n >\n {direction === \"up\"\n ? <ChevronUp aria-hidden className=\"h-4 w-4 opacity-50\" />\n : <ChevronDown aria-hidden className=\"h-4 w-4 opacity-50\" />}\n </div>\n )\n}\n\nexport type HourPickerInputProps = {\n id?: string\n value: string | null\n onChange: (value: string | null) => void\n onValueUpdate?: (value: string | null) => void\n options: HourPickerOption[]\n placeholder?: string\n className?: string\n inputClassName?: string\n disabled?: boolean\n readOnly?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n triggerTestId?: string\n contentTestId?: string\n isHydrated?: boolean\n}\n\nexport function HourPickerInput({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open: openProp,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerInputProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerInputRef = React.useRef<HTMLInputElement | null>(null)\n const setTriggerDraftValueRef = React.useRef<((value: string) => void) | null>(null)\n const setTriggerDraftValueHandler = React.useCallback((handler: ((value: string) => void) | null) => {\n setTriggerDraftValueRef.current = handler\n }, [])\n const highlightedValueRef = React.useRef<string | null>(null)\n const keyboardNavigationActiveRef = React.useRef(false)\n const [highlightedValue, setHighlightedValue] = React.useState<string | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const desktopPopoverRef = React.useRef<HTMLDivElement | null>(null)\n const desktopContentRef = React.useRef<HTMLDivElement | null>(null)\n const [desktopPopoverPosition, setDesktopPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const open = openProp ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = open\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (disabled || readOnly) {\n return\n }\n\n const input = triggerInputRef.current\n if (!(input instanceof HTMLInputElement)) {\n return\n }\n if (typeof document !== \"undefined\" && document.activeElement === input) {\n return\n }\n\n input.focus({ preventScroll: true })\n }, [disabled, open, readOnly])\n\n const updateHighlightedValue = React.useCallback((next: string | null) => {\n highlightedValueRef.current = next\n setHighlightedValue(next)\n }, [])\n\n const markKeyboardNavigation = React.useCallback(() => {\n keyboardNavigationActiveRef.current = true\n }, [])\n\n React.useEffect(() => {\n if (!open) return\n\n const currentOption = options.find((option) => option.value === value)\n if (currentOption && isOptionSelectable(currentOption)) {\n updateHighlightedValue(currentOption.value)\n return\n }\n\n const firstEnabled = options.find((option) => isOptionSelectable(option))\n updateHighlightedValue(firstEnabled?.value ?? null)\n }, [open, options, updateHighlightedValue, value])\n\n const updateValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n },\n [onValueUpdate, options],\n )\n\n const commitValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n onChange(null)\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n React.useEffect(() => {\n if (!open) return\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (!container) {\n return\n }\n\n if (container.contains(target)) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return\n }\n if (!openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = desktopPopoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [open, setOpen])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (!popover) {\n return\n }\n\n const handleWheel = (event: WheelEvent) => {\n const viewport = desktopContentRef.current\n if (!viewport) {\n return\n }\n\n const deltaY = event.deltaY\n if (deltaY === 0) {\n return\n }\n\n const maxScrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight)\n const atTop = viewport.scrollTop <= 0\n const atBottom = viewport.scrollTop >= maxScrollTop\n\n const target = event.target\n const isWheelOverViewport = target instanceof Node && viewport.contains(target)\n\n if (isWheelOverViewport) {\n if ((deltaY < 0 && atTop) || (deltaY > 0 && atBottom)) {\n event.preventDefault()\n }\n return\n }\n\n event.preventDefault()\n const nextScrollTop = Math.min(maxScrollTop, Math.max(0, viewport.scrollTop + deltaY))\n viewport.scrollTop = nextScrollTop\n }\n\n popover.addEventListener(\"wheel\", handleWheel, { passive: false })\n return () => {\n popover.removeEventListener(\"wheel\", handleWheel)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (openProp !== undefined && !onOpenChange) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n if (!(\"IntersectionObserver\" in window)) {\n return\n }\n\n const trigger = triggerInputRef.current\n if (!(trigger instanceof HTMLElement)) {\n return\n }\n\n let isActive = true\n const observer = new IntersectionObserver(entries => {\n if (!isActive) {\n return\n }\n const entry = entries[0]\n if (entry && !entry.isIntersecting) {\n setOpen(false)\n }\n })\n observer.observe(trigger)\n return () => {\n isActive = false\n observer.disconnect()\n }\n }, [onOpenChange, open, openProp, setOpen])\n\n const updateDesktopPopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") return\n\n const trigger = triggerInputRef.current\n const popover = desktopPopoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) return\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setDesktopPopoverPosition({ left, top, width })\n }, [])\n\n // React Compiler rejects hook aliasing (useIsomorphicLayoutEffect pattern), so we\n // call useLayoutEffect directly and keep the SSR guard inside the effect.\n React.useLayoutEffect(() => {\n if (!open || disabled) return\n if (typeof window === \"undefined\") return\n\n updateDesktopPopoverPosition()\n const rafId = window.requestAnimationFrame(updateDesktopPopoverPosition)\n\n window.addEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.addEventListener(\"resize\", updateDesktopPopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.removeEventListener(\"resize\", updateDesktopPopoverPosition)\n }\n }, [disabled, open, updateDesktopPopoverPosition])\n\n React.useEffect(() => {\n if (!open) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const run = () => {\n const selected = viewport.querySelector(\"[role=\\\"option\\\"][data-state=\\\"checked\\\"]\")\n if (selected instanceof HTMLElement) {\n const padding = 8\n const targetTop = selected.offsetTop - padding\n const targetBottom = selected.offsetTop + selected.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n return\n }\n\n const all = Array.from(viewport.querySelectorAll(\"[role=\\\"option\\\"]\")) as HTMLElement[]\n if (!all.length) return\n\n let firstEnabled: HTMLElement | undefined\n let lastDisabledBefore: HTMLElement | undefined\n\n for (const el of all) {\n const isDisabled = el.hasAttribute(\"data-disabled\")\n if (!isDisabled) {\n firstEnabled = el\n break\n }\n lastDisabledBefore = el\n }\n\n if (!firstEnabled) return\n\n const target = lastDisabledBefore ? lastDisabledBefore : firstEnabled\n\n const offset = Math.max(0, target.offsetTop - 8)\n viewport.scrollTop = offset\n }\n\n const raf = requestAnimationFrame(run)\n return () => cancelAnimationFrame(raf)\n }, [open, options])\n\n React.useEffect(() => {\n if (!open) return\n if (!highlightedValue) return\n if (!keyboardNavigationActiveRef.current) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const target = viewport.querySelector(`[role=\"option\"][data-value=\"${highlightedValue}\"]`)\n if (!(target instanceof HTMLElement)) return\n\n const padding = 8\n const targetTop = target.offsetTop - padding\n const targetBottom = target.offsetTop + target.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n }, [highlightedValue, open])\n\n const selectedOption = options.find((option) => option.value === value)\n\n return (\n <div\n data-slot=\"hours-picker-input\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <div className=\"relative\">\n <HourPickerMaskedSelectTrigger\n id={triggerId}\n placeholder={placeholder}\n value={value}\n onValueUpdate={updateValue}\n onCommit={commitValue}\n options={options}\n selectedLabel={selectedOption?.selectedLabel}\n disabled={disabled}\n readOnly={readOnly}\n open={open}\n setOpen={setOpen}\n inputClassName={inputClassName}\n triggerTestId={triggerTestId}\n isHydrated={isHydrated}\n highlightedValueRef={highlightedValueRef}\n setHighlightedValue={updateHighlightedValue}\n markKeyboardNavigation={markKeyboardNavigation}\n inputRef={(node) => {\n triggerInputRef.current = node\n }}\n onDraftValueHandlerChange={setTriggerDraftValueHandler}\n />\n\n {open ? (() => {\n const popover = (\n <>\n <div\n ref={desktopPopoverRef}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"pointer-events-auto fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: desktopPopoverPosition.left,\n top: desktopPopoverPosition.top,\n width: desktopPopoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={desktopContentRef}\n />\n\n <div\n ref={desktopContentRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n highlightedValue === option.value && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled) return\n\n setTriggerDraftValueRef.current?.(option.value)\n updateHighlightedValue(option.value)\n triggerInputRef.current?.focus({ preventScroll: true })\n commitValue(option.value)\n setOpen(false)\n }}\n onPointerEnter={() => {\n if (keyboardNavigationActiveRef.current) return\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n onPointerMove={(event) => {\n if (keyboardNavigationActiveRef.current && event.movementX === 0 && event.movementY === 0) {\n return\n }\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={desktopContentRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return popover\n return createPortal(popover, document.body)\n })() : null}\n </div>\n </div>\n )\n}\n\nHourPickerInput.displayName = \"HourPickerInput\"\n\nexport type HourPickerFieldProps = HourPickerInputProps\n\nfunction HourPickerSelectField({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerFieldProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const popoverRef = React.useRef<HTMLDivElement | null>(null)\n const viewportRef = React.useRef<HTMLDivElement | null>(null)\n const [popoverPosition, setPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const resolvedOpen = open ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = resolvedOpen\n\n const commitValue = React.useCallback(\n (next: string) => {\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n const updatePopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") {\n return\n }\n\n const trigger = triggerRef.current\n const popover = popoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) {\n return\n }\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setPopoverPosition({ left, top, width })\n }, [])\n\n React.useLayoutEffect(() => {\n if (!resolvedOpen || disabled) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n\n updatePopoverPosition()\n const rafId = window.requestAnimationFrame(updatePopoverPosition)\n\n window.addEventListener(\"scroll\", updatePopoverPosition, true)\n window.addEventListener(\"resize\", updatePopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updatePopoverPosition, true)\n window.removeEventListener(\"resize\", updatePopoverPosition)\n }\n }, [disabled, resolvedOpen, updatePopoverPosition])\n\n React.useEffect(() => {\n if (!resolvedOpen) {\n return\n }\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (container?.contains(target)) {\n return\n }\n\n const popover = popoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = popoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [resolvedOpen, setOpen])\n\n const selectedOption = options.find((option) => option.value === value)\n const selectedLabel = selectedOption?.selectedLabel ?? selectedOption?.label ?? value\n\n return (\n <div\n data-slot=\"hours-picker-field\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={resolvedOpen}\n aria-controls={`${triggerId}-content`}\n disabled={disabled}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n \"hover:bg-accent hover:text-accent-foreground\",\n !value && \"text-muted-foreground\",\n resolvedOpen && \"ring-2 ring-primary ring-offset-2\",\n inputClassName,\n )}\n onClick={() => {\n if (disabled || readOnly) {\n return\n }\n setOpen(!resolvedOpen)\n }}\n >\n <span className=\"line-clamp-1 text-left\">\n {value ? selectedLabel : placeholder}\n </span>\n <ChevronDown aria-hidden className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n\n {resolvedOpen ? (() => {\n const popover = (\n <>\n <div\n ref={popoverRef}\n id={`${triggerId}-content`}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: popoverPosition.left,\n top: popoverPosition.top,\n width: popoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={viewportRef}\n />\n\n <div\n ref={viewportRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n isChecked && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled || readOnly) {\n return\n }\n\n commitValue(option.value)\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={viewportRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") {\n return popover\n }\n\n return createPortal(popover, document.body)\n })() : null}\n </div>\n )\n}\n\nexport function HourPickerField(props: HourPickerFieldProps) {\n const isTouchDevice = useIsTouchDevice()\n\n if (isTouchDevice) {\n return <HourPickerSelectField {...props} />\n }\n\n return <HourPickerInput {...props} />\n}\n\nHourPickerField.displayName = \"HourPickerField\"\n\ntype HourPickerMaskedSelectTriggerProps = {\n id: string\n placeholder: string\n value: string | null\n onValueUpdate: (value: string | null) => void\n onCommit: (value: string | null) => void\n options: HourPickerOption[]\n selectedLabel?: React.ReactNode\n disabled?: boolean\n readOnly?: boolean\n open: boolean\n setOpen: (open: boolean) => void\n inputClassName?: string\n triggerTestId?: string\n isHydrated?: boolean\n highlightedValueRef: React.MutableRefObject<string | null>\n setHighlightedValue: (value: string | null) => void\n markKeyboardNavigation: () => void\n inputRef: (node: HTMLInputElement | null) => void\n onDraftValueHandlerChange: (handler: ((value: string) => void) | null) => void\n}\n\nfunction HourPickerMaskedSelectTrigger({\n id,\n placeholder,\n value,\n onValueUpdate,\n onCommit,\n options,\n selectedLabel,\n disabled,\n readOnly,\n open,\n setOpen,\n inputClassName,\n triggerTestId,\n isHydrated,\n highlightedValueRef,\n setHighlightedValue,\n markKeyboardNavigation,\n inputRef,\n onDraftValueHandlerChange,\n}: HourPickerMaskedSelectTriggerProps) {\n const isEditingRef = React.useRef(false)\n const pointerDownOnInputRef = React.useRef(false)\n const inputWasFocusedOnPointerDownRef = React.useRef(false)\n const ignoreNextMaskCommitValueRef = React.useRef<string | null>(null)\n const lastAcceptedSignatureRef = React.useRef<string | null>(null)\n const clearCommitPendingRef = React.useRef(false)\n\n const [draft, setDraft] = React.useState(() => (value ? value : \"\"))\n\n React.useEffect(() => {\n onDraftValueHandlerChange((nextValue) => {\n setDraft(nextValue)\n })\n return () => {\n onDraftValueHandlerChange(null)\n }\n }, [onDraftValueHandlerChange])\n\n const moveSelection = React.useCallback(\n (direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n },\n [highlightedValueRef, onValueUpdate, options, setHighlightedValue, value],\n )\n\n React.useEffect(() => {\n if (isEditingRef.current) return\n setDraft(value ? value : \"\")\n }, [value])\n\n React.useEffect(() => {\n lastAcceptedSignatureRef.current = getAcceptedInputSignature(draft)\n }, [draft])\n\n React.useEffect(() => {\n if (value === null) {\n clearCommitPendingRef.current = false\n }\n }, [value])\n\n const triggerClassName = cn(\n \"peer flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"transition-colors group-hover:bg-accent group-hover:text-accent-foreground\",\n !draft && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n value && selectedLabel != null && \"text-transparent focus:text-foreground\",\n )\n\n return (\n <div className=\"relative group\">\n <IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />\n\n {value && selectedLabel != null ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"hours-picker-input-selected-label\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n </span>\n ) : null}\n\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>\n </div>\n )\n}\n"],"mappings":"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"}
|
package/dist/index356.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index356.js","names":[],"sources":["../src/components/PhoneNumberInput/messages.ts"],"sourcesContent":["import type { PhoneNumberInputMessages } from \"./types\"\n\n\nconst MESSAGE_DICTIONARY: Record<string, PhoneNumberInputMessages> = {\n en: {\n lengthTooLong: (country) =>\n country ? `This number looks too long for ${country}.` : \"This number looks too long.\",\n noMatches: \"No matching countries\",\n selectCountryLabel: \"Select a country\",\n selectedCountryLabel: (country) => (country ? `${country} flag` : \"Selected country\"),\n },\n fr: {\n lengthTooLong: (country) =>\n country\n ? `This number looks too long for ${country}.`\n : \"This number looks too long.\",\n noMatches: \"Aucun pays correspondant\",\n selectCountryLabel: \"Select a country\",\n selectedCountryLabel: (country) => (country ? `${country} flag` : \"Selected country\"),\n },\n}\n\nexport function resolveMessages(\n locale: string | string[] | undefined,\n overrides?: Partial<PhoneNumberInputMessages>\n): PhoneNumberInputMessages {\n const locales = Array.isArray(locale) ? locale : locale ? [locale] : []\n const preferred = locales\n .map((entry) => entry.split(\"-\")[0]?.toLowerCase())\n .find((code) => code && MESSAGE_DICTIONARY[code])\n const base = MESSAGE_DICTIONARY[preferred ?? \"en\"] ?? MESSAGE_DICTIONARY.en\n return {\n ...base,\n ...(overrides ?? {}),\n }\n}\n\n"],"mappings":";AAGA,IAAM,IAA+D;CACnE,IAAI;EACF,gBAAgB,MACd,IAAU,kCAAkC,
|
|
1
|
+
{"version":3,"file":"index356.js","names":[],"sources":["../src/components/PhoneNumberInput/messages.ts"],"sourcesContent":["import type { PhoneNumberInputMessages } from \"./types\"\n\n\nconst MESSAGE_DICTIONARY: Record<string, PhoneNumberInputMessages> = {\n en: {\n lengthTooLong: (country) =>\n country ? `This number looks too long for ${country}.` : \"This number looks too long.\",\n noMatches: \"No matching countries\",\n selectCountryLabel: \"Select a country\",\n selectedCountryLabel: (country) => (country ? `${country} flag` : \"Selected country\"),\n },\n fr: {\n lengthTooLong: (country) =>\n country\n ? `This number looks too long for ${country}.`\n : \"This number looks too long.\",\n noMatches: \"Aucun pays correspondant\",\n selectCountryLabel: \"Select a country\",\n selectedCountryLabel: (country) => (country ? `${country} flag` : \"Selected country\"),\n },\n}\n\nexport function resolveMessages(\n locale: string | string[] | undefined,\n overrides?: Partial<PhoneNumberInputMessages>\n): PhoneNumberInputMessages {\n const locales = Array.isArray(locale) ? locale : locale ? [locale] : []\n const preferred = locales\n .map((entry) => entry.split(\"-\")[0]?.toLowerCase())\n .find((code) => code && MESSAGE_DICTIONARY[code])\n const base = MESSAGE_DICTIONARY[preferred ?? \"en\"] ?? MESSAGE_DICTIONARY.en\n return {\n ...base,\n ...(overrides ?? {}),\n }\n}\n\n"],"mappings":";AAGA,IAAM,IAA+D;CACnE,IAAI;EACF,gBAAgB,MACd,IAAU,kCAAkC,EAAQ,KAAK;EAC3D,WAAW;EACX,oBAAoB;EACpB,uBAAuB,MAAa,IAAU,GAAG,EAAQ,SAAS;CACpE;CACA,IAAI;EACF,gBAAgB,MACd,IACI,kCAAkC,EAAQ,KAC1C;EACN,WAAW;EACX,oBAAoB;EACpB,uBAAuB,MAAa,IAAU,GAAG,EAAQ,SAAS;CACpE;AACF;AAEA,SAAgB,EACd,GACA,GAC0B;CAM1B,OAAO;EACL,GAFW,GAJG,MAAM,QAAQ,CAAM,IAAI,IAAS,IAAS,CAAC,CAAM,IAAI,CAAC,EAAA,CAEnE,KAAK,MAAU,EAAM,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAClD,MAAM,MAAS,KAAQ,EAAmB,EACb,KAAa,SAAS,EAAmB;EAGvE,GAAI,KAAa,CAAC;CACpB;AACF"}
|
package/dist/index358.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index358.js","names":[],"sources":["../src/components/PhoneNumberInput/country-options.ts"],"sourcesContent":["import type { CountryCode } from \"libphonenumber-js\"\nimport { getCountryCallingCode } from \"libphonenumber-js\"\n\nimport type { CountryOption, PhoneNumberSelectedCountry } from \"./types\"\nimport { getCountryList } from \"./countries\"\n\n\nexport const DEFAULT_COUNTRY: CountryCode = \"US\"\nconst COUNTRY_OPTIONS = getCountryList()\n\nconst COUNTRY_OPTIONS_CACHE = new Map<string, CountryOption[]>()\nconst DEFAULT_LOCALE_CACHE_KEY = \"__default_locale__\"\nexport const COUNTRY_DIAL_CODES = Array.from(\n new Set(COUNTRY_OPTIONS.map((code) => getCountryCallingCode(code)))\n).sort((a, b) => b.length - a.length)\nexport const MAX_DIAL_CODE_LENGTH = COUNTRY_DIAL_CODES.reduce(\n (max, dial) => Math.max(max, dial.length),\n 0\n)\nexport const COMMON_IDD_PREFIXES = [\"0011\", \"001\", \"011\", \"00\", \"810\"]\n\nexport function getValidCountry(input: CountryCode | undefined) {\n if (!input) {\n return DEFAULT_COUNTRY\n }\n\n return COUNTRY_OPTIONS.includes(input) ? input : DEFAULT_COUNTRY\n}\n\nfunction createDisplayNames(locale?: string | string[]) {\n if (typeof Intl === \"undefined\" || typeof Intl.DisplayNames === \"undefined\") {\n return null\n }\n\n try {\n const locales = Array.isArray(locale) ? locale : locale ? [locale] : undefined\n return new Intl.DisplayNames(locales, { type: \"region\" })\n } catch {\n return null\n }\n}\n\nfunction buildCountryOptions(locale?: string | string[]) {\n const displayNames = createDisplayNames(locale)\n const englishDisplayNames = createDisplayNames(\"en\")\n\n return COUNTRY_OPTIONS\n .map((country) => {\n const dialCode = getCountryCallingCode(country)\n const localizedName = displayNames?.of(country) ?? englishDisplayNames?.of(country) ?? country\n const englishName = englishDisplayNames?.of(country) ?? localizedName\n const aliasTokens = getCountryAliases(country)\n const searchableTokens = Array.from(\n new Set(\n [localizedName, englishName, country.toUpperCase(), country.toLowerCase(), ...aliasTokens].filter(\n Boolean\n )\n )\n ) as string[]\n return {\n value: country,\n name: localizedName,\n dialCode,\n label: `${localizedName} (+${dialCode})`,\n flag: countryCodeToFlagEmoji(country),\n searchableTokens,\n normalizedSearchableTokens: searchableTokens.map((token) => normalizeSearchValue(token)),\n }\n })\n .sort((a, b) => {\n const priorityA = getCountryPriority(a.value)\n const priorityB = getCountryPriority(b.value)\n if (priorityA !== priorityB) {\n return priorityA - priorityB\n }\n return a.name.localeCompare(b.name)\n })\n}\n\nfunction getCountryPriority(code: CountryCode) {\n if (code === \"US\") return 0\n if (code === \"CA\") return 1\n if (getCountryCallingCode(code) === \"1\") return 2\n return 3\n}\n\nexport function getLocaleCacheKey(locale?: string | string[]) {\n if (!locale) {\n return DEFAULT_LOCALE_CACHE_KEY\n }\n if (Array.isArray(locale)) {\n return locale.join(\"\\u0000\")\n }\n return locale\n}\n\nexport function parseLocaleCacheKey(cacheKey: string): string | string[] | undefined {\n if (cacheKey === DEFAULT_LOCALE_CACHE_KEY) {\n return undefined\n }\n\n if (cacheKey.includes(\"\\u0000\")) {\n const parts = cacheKey.split(\"\\u0000\").filter(Boolean)\n if (parts.length === 0) {\n return undefined\n }\n if (parts.length === 1) {\n return parts[0] ?? undefined\n }\n return parts\n }\n\n return cacheKey\n}\n\nexport function getCachedCountryOptions(locale: string | string[] | undefined, cacheKey: string) {\n const cached = COUNTRY_OPTIONS_CACHE.get(cacheKey)\n if (cached) {\n return cached\n }\n const built = buildCountryOptions(locale)\n COUNTRY_OPTIONS_CACHE.set(cacheKey, built)\n return built\n}\n\nexport function toSelectedCountry(option: CountryOption): PhoneNumberSelectedCountry {\n return {\n code: option.value,\n name: option.name,\n dialCode: option.dialCode,\n flag: option.flag,\n }\n}\n\nexport function buildFallbackSelectedCountry(country: CountryCode): PhoneNumberSelectedCountry {\n return {\n code: country,\n name: country,\n dialCode: getCountryCallingCode(country),\n flag: countryCodeToFlagEmoji(country),\n }\n}\n\nfunction countryCodeToFlagEmoji(country: CountryCode) {\n const upper = country?.toUpperCase()\n\n if (!upper || upper.length !== 2 || /[^A-Z]/.test(upper)) {\n return \"\"\n }\n\n const base = 127397\n return String.fromCodePoint(\n upper.charCodeAt(0) + base,\n upper.charCodeAt(1) + base\n )\n}\n\nconst DIACRITICS_REGEX = /[\\u0300-\\u036f]/g\n\nfunction stripDiacritics(value: string) {\n return value.normalize(\"NFD\").replace(DIACRITICS_REGEX, \"\")\n}\n\nexport function normalizeSearchValue(value: string) {\n return stripDiacritics(value).toLowerCase()\n}\n\nexport function optionMatchIndex(tokens: string[], query: string) {\n let best = Number.MAX_SAFE_INTEGER\n for (const token of tokens) {\n const index = token.indexOf(query)\n if (index >= 0 && index < best) {\n best = index\n }\n }\n return best === Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : best\n}\n\nfunction getCountryAliases(code: CountryCode): string[] {\n switch (code) {\n case \"US\":\n return [\"USA\", \"United States\", \"America\", \"United States of America\"]\n case \"GB\":\n return [\"UK\", \"United Kingdom\", \"Great Britain\", \"England\"]\n case \"AE\":\n return [\"UAE\", \"United Arab Emirates\"]\n case \"KR\":\n return [\"South Korea\", \"Korea\"]\n case \"CN\":\n return [\"China\", \"PRC\"]\n case \"CD\":\n return [\"DRC\", \"Congo-Kinshasa\"]\n case \"CG\":\n return [\"Congo-Brazzaville\"]\n case \"BR\":\n return [\"Brazil\"]\n default:\n return []\n }\n}\n\n"],"mappings":";;AAQA,IAAM,IAAkB,EAAe,GAEjC,oBAAwB,IAAI,IAA6B,GACzD,IAA2B,sBACpB,IAAqB,MAAM,KACtC,IAAI,IAAI,EAAgB,KAAK,MAAS,EAAsB,CAAI,CAAC,CAAC,CACpE,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AACA,EAAmB,QACpD,GAAK,MAAS,KAAK,IAAI,GAAK,EAAK,MAAM,GACxC,CACF;AACA,IAAa,IAAsB;CAAC;CAAQ;CAAO;CAAO;CAAM;AAAK;AAErE,SAAgB,EAAgB,GAAgC;CAK9D,OAJK,KAIE,EAAgB,SAAS,CAAK,IAAI,IAAA;AAC3C;AAEA,SAAS,EAAmB,GAA4B;CACtD,IAAI,OAAO,OAAS,OAAsB,KAAK,iBAAiB,QAC9D,OAAO;CAGT,IAAI;EACF,IAAM,IAAU,MAAM,QAAQ,CAAM,IAAI,IAAS,IAAS,CAAC,CAAM,IAAI,KAAA;EACrE,OAAO,IAAI,KAAK,aAAa,GAAS,EAAE,MAAM,SAAS,CAAC;CAC1D,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,EAAoB,GAA4B;CACvD,IAAM,IAAe,EAAmB,CAAM,GACxC,IAAsB,EAAmB,IAAI;CAEnD,OAAO,EACJ,KAAK,MAAY;EAChB,IAAM,IAAW,EAAsB,CAAO,GACxC,IAAgB,GAAc,GAAG,CAAO,KAAK,GAAqB,GAAG,CAAO,KAAK,GACjF,IAAc,GAAqB,GAAG,CAAO,KAAK,GAClD,IAAc,EAAkB,CAAO,GACvC,IAAmB,MAAM,KAC7B,IAAI,IACF;GAAC;GAAe;GAAa,EAAQ,YAAY;GAAG,EAAQ,YAAY;GAAG,GAAG;EAAW,CAAC,CAAC,OACzF,OACF,CACF,CACF;EACA,OAAO;GACL,OAAO;GACP,MAAM;GACN;GACA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"index358.js","names":[],"sources":["../src/components/PhoneNumberInput/country-options.ts"],"sourcesContent":["import type { CountryCode } from \"libphonenumber-js\"\nimport { getCountryCallingCode } from \"libphonenumber-js\"\n\nimport type { CountryOption, PhoneNumberSelectedCountry } from \"./types\"\nimport { getCountryList } from \"./countries\"\n\n\nexport const DEFAULT_COUNTRY: CountryCode = \"US\"\nconst COUNTRY_OPTIONS = getCountryList()\n\nconst COUNTRY_OPTIONS_CACHE = new Map<string, CountryOption[]>()\nconst DEFAULT_LOCALE_CACHE_KEY = \"__default_locale__\"\nexport const COUNTRY_DIAL_CODES = Array.from(\n new Set(COUNTRY_OPTIONS.map((code) => getCountryCallingCode(code)))\n).sort((a, b) => b.length - a.length)\nexport const MAX_DIAL_CODE_LENGTH = COUNTRY_DIAL_CODES.reduce(\n (max, dial) => Math.max(max, dial.length),\n 0\n)\nexport const COMMON_IDD_PREFIXES = [\"0011\", \"001\", \"011\", \"00\", \"810\"]\n\nexport function getValidCountry(input: CountryCode | undefined) {\n if (!input) {\n return DEFAULT_COUNTRY\n }\n\n return COUNTRY_OPTIONS.includes(input) ? input : DEFAULT_COUNTRY\n}\n\nfunction createDisplayNames(locale?: string | string[]) {\n if (typeof Intl === \"undefined\" || typeof Intl.DisplayNames === \"undefined\") {\n return null\n }\n\n try {\n const locales = Array.isArray(locale) ? locale : locale ? [locale] : undefined\n return new Intl.DisplayNames(locales, { type: \"region\" })\n } catch {\n return null\n }\n}\n\nfunction buildCountryOptions(locale?: string | string[]) {\n const displayNames = createDisplayNames(locale)\n const englishDisplayNames = createDisplayNames(\"en\")\n\n return COUNTRY_OPTIONS\n .map((country) => {\n const dialCode = getCountryCallingCode(country)\n const localizedName = displayNames?.of(country) ?? englishDisplayNames?.of(country) ?? country\n const englishName = englishDisplayNames?.of(country) ?? localizedName\n const aliasTokens = getCountryAliases(country)\n const searchableTokens = Array.from(\n new Set(\n [localizedName, englishName, country.toUpperCase(), country.toLowerCase(), ...aliasTokens].filter(\n Boolean\n )\n )\n ) as string[]\n return {\n value: country,\n name: localizedName,\n dialCode,\n label: `${localizedName} (+${dialCode})`,\n flag: countryCodeToFlagEmoji(country),\n searchableTokens,\n normalizedSearchableTokens: searchableTokens.map((token) => normalizeSearchValue(token)),\n }\n })\n .sort((a, b) => {\n const priorityA = getCountryPriority(a.value)\n const priorityB = getCountryPriority(b.value)\n if (priorityA !== priorityB) {\n return priorityA - priorityB\n }\n return a.name.localeCompare(b.name)\n })\n}\n\nfunction getCountryPriority(code: CountryCode) {\n if (code === \"US\") return 0\n if (code === \"CA\") return 1\n if (getCountryCallingCode(code) === \"1\") return 2\n return 3\n}\n\nexport function getLocaleCacheKey(locale?: string | string[]) {\n if (!locale) {\n return DEFAULT_LOCALE_CACHE_KEY\n }\n if (Array.isArray(locale)) {\n return locale.join(\"\\u0000\")\n }\n return locale\n}\n\nexport function parseLocaleCacheKey(cacheKey: string): string | string[] | undefined {\n if (cacheKey === DEFAULT_LOCALE_CACHE_KEY) {\n return undefined\n }\n\n if (cacheKey.includes(\"\\u0000\")) {\n const parts = cacheKey.split(\"\\u0000\").filter(Boolean)\n if (parts.length === 0) {\n return undefined\n }\n if (parts.length === 1) {\n return parts[0] ?? undefined\n }\n return parts\n }\n\n return cacheKey\n}\n\nexport function getCachedCountryOptions(locale: string | string[] | undefined, cacheKey: string) {\n const cached = COUNTRY_OPTIONS_CACHE.get(cacheKey)\n if (cached) {\n return cached\n }\n const built = buildCountryOptions(locale)\n COUNTRY_OPTIONS_CACHE.set(cacheKey, built)\n return built\n}\n\nexport function toSelectedCountry(option: CountryOption): PhoneNumberSelectedCountry {\n return {\n code: option.value,\n name: option.name,\n dialCode: option.dialCode,\n flag: option.flag,\n }\n}\n\nexport function buildFallbackSelectedCountry(country: CountryCode): PhoneNumberSelectedCountry {\n return {\n code: country,\n name: country,\n dialCode: getCountryCallingCode(country),\n flag: countryCodeToFlagEmoji(country),\n }\n}\n\nfunction countryCodeToFlagEmoji(country: CountryCode) {\n const upper = country?.toUpperCase()\n\n if (!upper || upper.length !== 2 || /[^A-Z]/.test(upper)) {\n return \"\"\n }\n\n const base = 127397\n return String.fromCodePoint(\n upper.charCodeAt(0) + base,\n upper.charCodeAt(1) + base\n )\n}\n\nconst DIACRITICS_REGEX = /[\\u0300-\\u036f]/g\n\nfunction stripDiacritics(value: string) {\n return value.normalize(\"NFD\").replace(DIACRITICS_REGEX, \"\")\n}\n\nexport function normalizeSearchValue(value: string) {\n return stripDiacritics(value).toLowerCase()\n}\n\nexport function optionMatchIndex(tokens: string[], query: string) {\n let best = Number.MAX_SAFE_INTEGER\n for (const token of tokens) {\n const index = token.indexOf(query)\n if (index >= 0 && index < best) {\n best = index\n }\n }\n return best === Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : best\n}\n\nfunction getCountryAliases(code: CountryCode): string[] {\n switch (code) {\n case \"US\":\n return [\"USA\", \"United States\", \"America\", \"United States of America\"]\n case \"GB\":\n return [\"UK\", \"United Kingdom\", \"Great Britain\", \"England\"]\n case \"AE\":\n return [\"UAE\", \"United Arab Emirates\"]\n case \"KR\":\n return [\"South Korea\", \"Korea\"]\n case \"CN\":\n return [\"China\", \"PRC\"]\n case \"CD\":\n return [\"DRC\", \"Congo-Kinshasa\"]\n case \"CG\":\n return [\"Congo-Brazzaville\"]\n case \"BR\":\n return [\"Brazil\"]\n default:\n return []\n }\n}\n\n"],"mappings":"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"}
|
package/dist/index361.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index361.js","names":["assignRef","handleMouseMove","innerRef","children"],"sources":["../src/components/PhoneNumberInput/suggestions.tsx"],"sourcesContent":["import * as React from \"react\"\nimport type { CountryCode } from \"libphonenumber-js\"\nimport type { ControlProps, OptionProps, StylesConfig } from \"react-select\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport type { CountryOption } from \"./types\"\n\n\nexport type SuggestionContextValue = {\n highlightedValue: CountryCode | null\n setHighlightedOption: (option: CountryOption) => void\n renderOptionLabel: (option: CountryOption) => React.ReactNode\n consumeScrollBehavior: () => ScrollBehavior\n}\n\nexport const SuggestionContext = React.createContext<SuggestionContextValue | null>(null)\n\nfunction assignOptionRef(ref: React.Ref<HTMLDivElement> | undefined, node: HTMLDivElement | null) {\n if (typeof ref === \"function\") {\n ref(node)\n return\n }\n if (ref && typeof ref === \"object\") {\n Reflect.set(ref, \"current\", node)\n }\n}\n\nexport const SuggestionOption = (props: OptionProps<CountryOption, false>) => {\n const context = React.useContext(SuggestionContext)\n const isActive = context?.highlightedValue === props.data.value\n const { onMouseMove, className: receivedClassName, ...restInnerProps } = props.innerProps\n const renderLabel =\n context?.renderOptionLabel ?? ((option: CountryOption) => formatCountryOption(option))\n const optionRef = React.useRef<HTMLDivElement | null>(null)\n const { innerRef } = props\n\n const assignRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n optionRef.current = node\n assignOptionRef(innerRef, node)\n },\n [innerRef]\n )\n\n React.useEffect(() => {\n if (!isActive) {\n return\n }\n\n const consumeScrollBehavior = context?.consumeScrollBehavior\n const behavior = consumeScrollBehavior ? consumeScrollBehavior() : \"smooth\"\n\n const target = optionRef.current\n if (!target) {\n return\n }\n\n const parent = target.parentElement\n if (!parent) {\n return\n }\n\n const top = target.offsetTop\n const bottom = top + target.offsetHeight\n const viewTop = parent.scrollTop\n const viewBottom = viewTop + parent.clientHeight\n\n if (top >= viewTop && bottom <= viewBottom) {\n return\n }\n\n target.scrollIntoView({\n block: \"nearest\",\n behavior,\n })\n }, [context, isActive])\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseMove?.(event)\n context?.setHighlightedOption(props.data)\n }\n\n return (\n <div\n ref={assignRef}\n {...restInnerProps}\n onMouseMove={handleMouseMove}\n className={cn(\n \"flex cursor-pointer items-center justify-between gap-3 px-3 py-2 text-sm\",\n receivedClassName,\n isActive ? \"bg-muted text-foreground\" : \"text-foreground hover:bg-muted\"\n )}\n >\n {renderLabel(props.data)}\n </div>\n )\n}\n\nexport const suggestionSelectStyles: StylesConfig<CountryOption, false> = {\n control: () => ({\n display: \"none\",\n }),\n menu: (provided) => ({\n ...provided,\n marginTop: 4,\n borderRadius: \"var(--radius)\",\n boxShadow: \"0 18px 36px rgba(15, 23, 42, 0.18)\",\n backgroundColor: \"hsl(var(--popover))\",\n overflow: \"hidden\",\n zIndex: 20,\n }),\n menuList: (provided) => ({\n ...provided,\n maxHeight: 240,\n padding: 0,\n }),\n option: (provided, state) => ({\n ...provided,\n fontSize: \"0.875rem\",\n backgroundColor: state.isFocused\n ? \"hsl(var(--muted))\"\n : state.isSelected\n ? \"hsl(var(--accent))\"\n : \"transparent\",\n color: state.isSelected\n ? \"hsl(var(--accent-foreground))\"\n : \"hsl(var(--foreground))\",\n cursor: \"pointer\",\n }),\n noOptionsMessage: (provided) => ({\n ...provided,\n fontSize: \"0.875rem\",\n color: \"hsl(var(--muted-foreground))\",\n }),\n}\n\nexport const HiddenControl = (props: ControlProps<CountryOption, false>) => {\n const { children, innerProps, innerRef } = props\n\n return (\n <div\n {...innerProps}\n ref={innerRef}\n style={{\n height: 0,\n minHeight: 0,\n opacity: 0,\n overflow: \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n {children}\n </div>\n )\n}\n\nexport const NullComponent = () => null\n\nexport function formatCountryOption(option: CountryOption) {\n return (\n <>\n <span className=\"flex min-w-0 items-center gap-2\">\n {option.flag ? (\n <span aria-hidden=\"true\" className=\"text-lg leading-none\">\n {option.flag}\n </span>\n ) : null}\n <span className=\"truncate\">{option.name}</span>\n </span>\n <span className=\"text-xs text-muted-foreground\">+{option.dialCode}</span>\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index361.js","names":["innerProps","context?.renderOptionLabel ?? ((option: CountryOption) => formatCountryOption(option))","renderOptionLabel","(option: CountryOption) => formatCountryOption(option)","(node: HTMLDivElement | null) => {\n optionRef.current = node\n assignOptionRef(innerRef, node)\n }","React.useCallback(\n (node: HTMLDivElement | null) => {\n optionRef.current = node\n assignOptionRef(innerRef, node)\n },\n [innerRef]\n )","() => {\n if (!isActive) {\n return\n }\n\n const consumeScrollBehavior = context?.consumeScrollBehavior\n const behavior = consumeScrollBehavior ? consumeScrollBehavior() : \"smooth\"\n\n const target = optionRef.current\n if (!target) {\n return\n }\n\n const parent = target.parentElement\n if (!parent) {\n return\n }\n\n const top = target.offsetTop\n const bottom = top + target.offsetHeight\n const viewTop = parent.scrollTop\n const viewBottom = viewTop + parent.clientHeight\n\n if (top >= viewTop && bottom <= viewBottom) {\n return\n }\n\n target.scrollIntoView({\n block: \"nearest\",\n behavior,\n })\n }","consumeScrollBehavior","[context, isActive]","(event: React.MouseEvent<HTMLDivElement>) => {\n onMouseMove?.(event)\n context?.setHighlightedOption(props.data)\n }","context?.setHighlightedOption","data","cn(\n \"flex cursor-pointer items-center justify-between gap-3 px-3 py-2 text-sm\",\n receivedClassName,\n isActive ? \"bg-muted text-foreground\" : \"text-foreground hover:bg-muted\"\n )","isActive ? \"bg-muted text-foreground\" : \"text-foreground hover:bg-muted\"","renderLabel(props.data)","<div\n ref={assignRef}\n {...restInnerProps}\n onMouseMove={handleMouseMove}\n className={cn(\n \"flex cursor-pointer items-center justify-between gap-3 px-3 py-2 text-sm\",\n receivedClassName,\n isActive ? \"bg-muted text-foreground\" : \"text-foreground hover:bg-muted\"\n )}\n >\n {renderLabel(props.data)}\n </div>","{\n height: 0,\n minHeight: 0,\n opacity: 0,\n overflow: \"hidden\",\n pointerEvents: \"none\",\n }","<div\n {...innerProps}\n ref={innerRef}\n style={{\n height: 0,\n minHeight: 0,\n opacity: 0,\n overflow: \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n {children}\n </div>"],"sources":["../src/components/PhoneNumberInput/suggestions.tsx"],"sourcesContent":["import * as React from \"react\"\nimport type { CountryCode } from \"libphonenumber-js\"\nimport type { ControlProps, OptionProps, StylesConfig } from \"react-select\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport type { CountryOption } from \"./types\"\n\n\nexport type SuggestionContextValue = {\n highlightedValue: CountryCode | null\n setHighlightedOption: (option: CountryOption) => void\n renderOptionLabel: (option: CountryOption) => React.ReactNode\n consumeScrollBehavior: () => ScrollBehavior\n}\n\nexport const SuggestionContext = React.createContext<SuggestionContextValue | null>(null)\n\nfunction assignOptionRef(ref: React.Ref<HTMLDivElement> | undefined, node: HTMLDivElement | null) {\n if (typeof ref === \"function\") {\n ref(node)\n return\n }\n if (ref && typeof ref === \"object\") {\n Reflect.set(ref, \"current\", node)\n }\n}\n\nexport const SuggestionOption = (props: OptionProps<CountryOption, false>) => {\n const context = React.useContext(SuggestionContext)\n const isActive = context?.highlightedValue === props.data.value\n const { onMouseMove, className: receivedClassName, ...restInnerProps } = props.innerProps\n const renderLabel =\n context?.renderOptionLabel ?? ((option: CountryOption) => formatCountryOption(option))\n const optionRef = React.useRef<HTMLDivElement | null>(null)\n const { innerRef } = props\n\n const assignRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n optionRef.current = node\n assignOptionRef(innerRef, node)\n },\n [innerRef]\n )\n\n React.useEffect(() => {\n if (!isActive) {\n return\n }\n\n const consumeScrollBehavior = context?.consumeScrollBehavior\n const behavior = consumeScrollBehavior ? consumeScrollBehavior() : \"smooth\"\n\n const target = optionRef.current\n if (!target) {\n return\n }\n\n const parent = target.parentElement\n if (!parent) {\n return\n }\n\n const top = target.offsetTop\n const bottom = top + target.offsetHeight\n const viewTop = parent.scrollTop\n const viewBottom = viewTop + parent.clientHeight\n\n if (top >= viewTop && bottom <= viewBottom) {\n return\n }\n\n target.scrollIntoView({\n block: \"nearest\",\n behavior,\n })\n }, [context, isActive])\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseMove?.(event)\n context?.setHighlightedOption(props.data)\n }\n\n return (\n <div\n ref={assignRef}\n {...restInnerProps}\n onMouseMove={handleMouseMove}\n className={cn(\n \"flex cursor-pointer items-center justify-between gap-3 px-3 py-2 text-sm\",\n receivedClassName,\n isActive ? \"bg-muted text-foreground\" : \"text-foreground hover:bg-muted\"\n )}\n >\n {renderLabel(props.data)}\n </div>\n )\n}\n\nexport const suggestionSelectStyles: StylesConfig<CountryOption, false> = {\n control: () => ({\n display: \"none\",\n }),\n menu: (provided) => ({\n ...provided,\n marginTop: 4,\n borderRadius: \"var(--radius)\",\n boxShadow: \"0 18px 36px rgba(15, 23, 42, 0.18)\",\n backgroundColor: \"hsl(var(--popover))\",\n overflow: \"hidden\",\n zIndex: 20,\n }),\n menuList: (provided) => ({\n ...provided,\n maxHeight: 240,\n padding: 0,\n }),\n option: (provided, state) => ({\n ...provided,\n fontSize: \"0.875rem\",\n backgroundColor: state.isFocused\n ? \"hsl(var(--muted))\"\n : state.isSelected\n ? \"hsl(var(--accent))\"\n : \"transparent\",\n color: state.isSelected\n ? \"hsl(var(--accent-foreground))\"\n : \"hsl(var(--foreground))\",\n cursor: \"pointer\",\n }),\n noOptionsMessage: (provided) => ({\n ...provided,\n fontSize: \"0.875rem\",\n color: \"hsl(var(--muted-foreground))\",\n }),\n}\n\nexport const HiddenControl = (props: ControlProps<CountryOption, false>) => {\n const { children, innerProps, innerRef } = props\n\n return (\n <div\n {...innerProps}\n ref={innerRef}\n style={{\n height: 0,\n minHeight: 0,\n opacity: 0,\n overflow: \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n {children}\n </div>\n )\n}\n\nexport const NullComponent = () => null\n\nexport function formatCountryOption(option: CountryOption) {\n return (\n <>\n <span className=\"flex min-w-0 items-center gap-2\">\n {option.flag ? (\n <span aria-hidden=\"true\" className=\"text-lg leading-none\">\n {option.flag}\n </span>\n ) : null}\n <span className=\"truncate\">{option.name}</span>\n </span>\n <span className=\"text-xs text-muted-foreground\">+{option.dialCode}</span>\n </>\n )\n}\n"],"mappings":"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"}
|