@rpcbase/ui 0.177.0 → 0.178.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.
Files changed (345) hide show
  1. package/dist/components/HourPickerField/index.d.ts.map +1 -1
  2. package/dist/components/PhoneNumberInput/suggestions.d.ts.map +1 -1
  3. package/dist/index10.js +1 -1
  4. package/dist/index100.js +3 -3
  5. package/dist/index100.js.map +1 -1
  6. package/dist/index101.js +4 -6
  7. package/dist/index101.js.map +1 -1
  8. package/dist/index102.js +6 -145
  9. package/dist/index102.js.map +1 -1
  10. package/dist/index103.js +144 -38
  11. package/dist/index103.js.map +1 -1
  12. package/dist/index104.js +39 -4
  13. package/dist/index104.js.map +1 -1
  14. package/dist/index105.js +4 -7
  15. package/dist/index105.js.map +1 -1
  16. package/dist/index106.js +6 -12
  17. package/dist/index106.js.map +1 -1
  18. package/dist/index107.js +13 -13
  19. package/dist/index107.js.map +1 -1
  20. package/dist/index108.js +13 -7
  21. package/dist/index108.js.map +1 -1
  22. package/dist/index109.js +6 -30
  23. package/dist/index109.js.map +1 -1
  24. package/dist/index11.js +269 -269
  25. package/dist/index11.js.map +1 -1
  26. package/dist/index110.js +31 -10
  27. package/dist/index110.js.map +1 -1
  28. package/dist/index111.js +10 -10
  29. package/dist/index111.js.map +1 -1
  30. package/dist/index112.js +10 -8
  31. package/dist/index112.js.map +1 -1
  32. package/dist/index113.js +8 -13
  33. package/dist/index113.js.map +1 -1
  34. package/dist/index114.js +13 -101
  35. package/dist/index114.js.map +1 -1
  36. package/dist/index115.js +102 -20
  37. package/dist/index115.js.map +1 -1
  38. package/dist/index116.js +20 -54
  39. package/dist/index116.js.map +1 -1
  40. package/dist/index117.js +51 -70
  41. package/dist/index117.js.map +1 -1
  42. package/dist/index118.js +72 -9
  43. package/dist/index118.js.map +1 -1
  44. package/dist/index119.js +9 -20
  45. package/dist/index119.js.map +1 -1
  46. package/dist/index12.js +1 -1
  47. package/dist/index120.js +20 -16
  48. package/dist/index120.js.map +1 -1
  49. package/dist/index121.js +16 -23
  50. package/dist/index121.js.map +1 -1
  51. package/dist/index122.js +23 -6
  52. package/dist/index122.js.map +1 -1
  53. package/dist/index123.js +6 -5
  54. package/dist/index123.js.map +1 -1
  55. package/dist/index124.js +5 -23
  56. package/dist/index124.js.map +1 -1
  57. package/dist/index125.js +24 -35
  58. package/dist/index125.js.map +1 -1
  59. package/dist/index126.js +35 -16
  60. package/dist/index126.js.map +1 -1
  61. package/dist/index127.js +16 -7
  62. package/dist/index127.js.map +1 -1
  63. package/dist/index128.js +6 -4
  64. package/dist/index128.js.map +1 -1
  65. package/dist/index129.js +4 -4
  66. package/dist/index129.js.map +1 -1
  67. package/dist/index13.js +2 -2
  68. package/dist/index130.js +4 -4
  69. package/dist/index130.js.map +1 -1
  70. package/dist/index131.js +4 -4
  71. package/dist/index131.js.map +1 -1
  72. package/dist/index132.js +4 -3
  73. package/dist/index132.js.map +1 -1
  74. package/dist/index133.js +3 -6
  75. package/dist/index133.js.map +1 -1
  76. package/dist/index134.js +7 -24
  77. package/dist/index134.js.map +1 -1
  78. package/dist/index135.js +24 -8
  79. package/dist/index135.js.map +1 -1
  80. package/dist/index136.js +7 -6
  81. package/dist/index136.js.map +1 -1
  82. package/dist/index137.js +6 -5
  83. package/dist/index137.js.map +1 -1
  84. package/dist/index138.js +5 -3
  85. package/dist/index138.js.map +1 -1
  86. package/dist/index139.js +3 -3
  87. package/dist/index139.js.map +1 -1
  88. package/dist/index14.js +4 -4
  89. package/dist/index140.js +3 -4
  90. package/dist/index140.js.map +1 -1
  91. package/dist/index141.js +4 -3
  92. package/dist/index141.js.map +1 -1
  93. package/dist/index142.js +3 -4
  94. package/dist/index142.js.map +1 -1
  95. package/dist/index143.js +4 -3
  96. package/dist/index143.js.map +1 -1
  97. package/dist/index144.js +3 -3
  98. package/dist/index144.js.map +1 -1
  99. package/dist/index145.js +3 -3
  100. package/dist/index145.js.map +1 -1
  101. package/dist/index146.js +3 -46
  102. package/dist/index146.js.map +1 -1
  103. package/dist/index147.js +44 -51
  104. package/dist/index147.js.map +1 -1
  105. package/dist/index148.js +2 -2
  106. package/dist/index15.js +1 -1
  107. package/dist/index150.js +2 -2
  108. package/dist/index153.js +5 -605
  109. package/dist/index153.js.map +1 -1
  110. package/dist/index154.js +68 -5
  111. package/dist/index154.js.map +1 -1
  112. package/dist/index155.js +2 -69
  113. package/dist/index155.js.map +1 -1
  114. package/dist/index156.js +364 -2
  115. package/dist/index156.js.map +1 -1
  116. package/dist/index157.js +201 -303
  117. package/dist/index157.js.map +1 -1
  118. package/dist/index158.js +46 -247
  119. package/dist/index158.js.map +1 -1
  120. package/dist/index159.js +42 -56
  121. package/dist/index159.js.map +1 -1
  122. package/dist/index16.js +1 -1
  123. package/dist/index160.js +169 -46
  124. package/dist/index160.js.map +1 -1
  125. package/dist/index161.js +96 -156
  126. package/dist/index161.js.map +1 -1
  127. package/dist/index162.js +24 -109
  128. package/dist/index162.js.map +1 -1
  129. package/dist/index163.js +8 -25
  130. package/dist/index163.js.map +1 -1
  131. package/dist/index164.js +5 -8
  132. package/dist/index164.js.map +1 -1
  133. package/dist/index165.js +5 -4
  134. package/dist/index165.js.map +1 -1
  135. package/dist/index166.js +4 -5
  136. package/dist/index166.js.map +1 -1
  137. package/dist/index167.js +466 -4
  138. package/dist/index167.js.map +1 -1
  139. package/dist/index168.js +139 -420
  140. package/dist/index168.js.map +1 -1
  141. package/dist/index169.js +71 -149
  142. package/dist/index169.js.map +1 -1
  143. package/dist/index17.js +1 -1
  144. package/dist/index170.js +229 -74
  145. package/dist/index170.js.map +1 -1
  146. package/dist/index171.js +9 -262
  147. package/dist/index171.js.map +1 -1
  148. package/dist/index172.js +42 -9
  149. package/dist/index172.js.map +1 -1
  150. package/dist/index173.js +4 -42
  151. package/dist/index173.js.map +1 -1
  152. package/dist/index174.js +605 -4
  153. package/dist/index174.js.map +1 -1
  154. package/dist/index179.js +1 -1
  155. package/dist/index18.js +314 -312
  156. package/dist/index18.js.map +1 -1
  157. package/dist/index19.js +7 -7
  158. package/dist/index20.js +6 -6
  159. package/dist/index20.js.map +1 -1
  160. package/dist/index21.js +1 -1
  161. package/dist/index22.js +1 -1
  162. package/dist/index226.js +1 -1
  163. package/dist/index227.js +1 -1
  164. package/dist/index229.js +1 -1
  165. package/dist/index23.js +2 -2
  166. package/dist/index231.js +1 -1
  167. package/dist/index232.js +1 -1
  168. package/dist/index233.js +4 -4
  169. package/dist/index234.js +2 -2
  170. package/dist/index238.js +12 -66
  171. package/dist/index238.js.map +1 -1
  172. package/dist/index239.js +150 -176
  173. package/dist/index239.js.map +1 -1
  174. package/dist/index24.js +1 -1
  175. package/dist/index240.js +27 -43
  176. package/dist/index240.js.map +1 -1
  177. package/dist/index241.js +9 -13
  178. package/dist/index241.js.map +1 -1
  179. package/dist/index242.js +40 -147
  180. package/dist/index242.js.map +1 -1
  181. package/dist/index243.js +10 -29
  182. package/dist/index243.js.map +1 -1
  183. package/dist/index244.js +44 -9
  184. package/dist/index244.js.map +1 -1
  185. package/dist/index245.js +88 -40
  186. package/dist/index245.js.map +1 -1
  187. package/dist/index246.js +85 -10
  188. package/dist/index246.js.map +1 -1
  189. package/dist/index247.js +102 -41
  190. package/dist/index247.js.map +1 -1
  191. package/dist/index248.js +45 -88
  192. package/dist/index248.js.map +1 -1
  193. package/dist/index249.js +10 -85
  194. package/dist/index249.js.map +1 -1
  195. package/dist/index250.js +28 -96
  196. package/dist/index250.js.map +1 -1
  197. package/dist/index251.js +8 -52
  198. package/dist/index251.js.map +1 -1
  199. package/dist/index252.js +115 -10
  200. package/dist/index252.js.map +1 -1
  201. package/dist/index253.js +16 -36
  202. package/dist/index253.js.map +1 -1
  203. package/dist/index254.js +15 -8
  204. package/dist/index254.js.map +1 -1
  205. package/dist/index255.js +3 -116
  206. package/dist/index255.js.map +1 -1
  207. package/dist/index256.js +35 -16
  208. package/dist/index256.js.map +1 -1
  209. package/dist/index257.js +19 -14
  210. package/dist/index257.js.map +1 -1
  211. package/dist/index258.js +9 -3
  212. package/dist/index258.js.map +1 -1
  213. package/dist/index259.js +8 -36
  214. package/dist/index259.js.map +1 -1
  215. package/dist/index260.js +67 -20
  216. package/dist/index260.js.map +1 -1
  217. package/dist/index261.js +180 -9
  218. package/dist/index261.js.map +1 -1
  219. package/dist/index262.js +46 -8
  220. package/dist/index262.js.map +1 -1
  221. package/dist/index263.js +4 -4
  222. package/dist/index265.js +2 -2
  223. package/dist/index27.js +37 -3
  224. package/dist/index27.js.map +1 -1
  225. package/dist/index277.js +1 -1
  226. package/dist/index28.js +3 -125
  227. package/dist/index28.js.map +1 -1
  228. package/dist/index29.js +120 -227
  229. package/dist/index29.js.map +1 -1
  230. package/dist/index30.js +229 -21
  231. package/dist/index30.js.map +1 -1
  232. package/dist/index31.js +23 -50
  233. package/dist/index31.js.map +1 -1
  234. package/dist/index32.js +50 -2640
  235. package/dist/index32.js.map +1 -1
  236. package/dist/index33.js +2598 -351
  237. package/dist/index33.js.map +1 -1
  238. package/dist/index34.js +375 -214
  239. package/dist/index34.js.map +1 -1
  240. package/dist/index35.js +230 -19
  241. package/dist/index35.js.map +1 -1
  242. package/dist/index36.js +18 -138
  243. package/dist/index36.js.map +1 -1
  244. package/dist/index37.js +125 -170
  245. package/dist/index37.js.map +1 -1
  246. package/dist/index38.js +174 -64
  247. package/dist/index38.js.map +1 -1
  248. package/dist/index39.js +74 -88
  249. package/dist/index39.js.map +1 -1
  250. package/dist/index4.js +8 -8
  251. package/dist/index4.js.map +1 -1
  252. package/dist/index40.js +98 -5
  253. package/dist/index40.js.map +1 -1
  254. package/dist/index41.js +5 -843
  255. package/dist/index41.js.map +1 -1
  256. package/dist/index42.js +832 -54
  257. package/dist/index42.js.map +1 -1
  258. package/dist/index43.js +66 -37
  259. package/dist/index43.js.map +1 -1
  260. package/dist/index46.js +1 -1
  261. package/dist/index47.js +1 -1
  262. package/dist/index48.js +7 -205
  263. package/dist/index48.js.map +1 -1
  264. package/dist/index49.js +33 -6
  265. package/dist/index49.js.map +1 -1
  266. package/dist/index5.js +1 -1
  267. package/dist/index50.js +26 -33
  268. package/dist/index50.js.map +1 -1
  269. package/dist/index51.js +7 -26
  270. package/dist/index51.js.map +1 -1
  271. package/dist/index52.js +11 -7
  272. package/dist/index52.js.map +1 -1
  273. package/dist/index53.js +205 -12
  274. package/dist/index53.js.map +1 -1
  275. package/dist/index55.js +2 -2
  276. package/dist/index56.js +1 -1
  277. package/dist/index57.js +1 -1
  278. package/dist/index59.js +4 -4
  279. package/dist/index61.js +4 -4
  280. package/dist/index62.js +2 -2
  281. package/dist/index63.js +2 -2
  282. package/dist/index67.js +2 -2
  283. package/dist/index70.js +6 -2
  284. package/dist/index70.js.map +1 -1
  285. package/dist/index71.js +8 -2
  286. package/dist/index71.js.map +1 -1
  287. package/dist/index72.js +5 -5
  288. package/dist/index72.js.map +1 -1
  289. package/dist/index73.js +53 -7
  290. package/dist/index73.js.map +1 -1
  291. package/dist/index74.js +2 -6
  292. package/dist/index74.js.map +1 -1
  293. package/dist/index75.js +2 -52
  294. package/dist/index75.js.map +1 -1
  295. package/dist/index76.js +52 -5
  296. package/dist/index76.js.map +1 -1
  297. package/dist/index77.js +4 -4
  298. package/dist/index77.js.map +1 -1
  299. package/dist/index78.js +4 -15
  300. package/dist/index78.js.map +1 -1
  301. package/dist/index79.js +15 -5
  302. package/dist/index79.js.map +1 -1
  303. package/dist/index8.js +1 -1
  304. package/dist/index80.js +5 -7
  305. package/dist/index80.js.map +1 -1
  306. package/dist/index81.js +6 -15
  307. package/dist/index81.js.map +1 -1
  308. package/dist/index82.js +16 -4
  309. package/dist/index82.js.map +1 -1
  310. package/dist/index83.js +1 -1
  311. package/dist/index83.js.map +1 -1
  312. package/dist/index84.js +4 -5
  313. package/dist/index84.js.map +1 -1
  314. package/dist/index85.js +4 -4
  315. package/dist/index85.js.map +1 -1
  316. package/dist/index86.js +5 -4
  317. package/dist/index86.js.map +1 -1
  318. package/dist/index87.js +2 -2
  319. package/dist/index87.js.map +1 -1
  320. package/dist/index88.js +3 -5
  321. package/dist/index88.js.map +1 -1
  322. package/dist/index89.js +6 -24
  323. package/dist/index89.js.map +1 -1
  324. package/dist/index9.js +1 -1
  325. package/dist/index90.js +24 -6
  326. package/dist/index90.js.map +1 -1
  327. package/dist/index91.js +6 -4
  328. package/dist/index91.js.map +1 -1
  329. package/dist/index92.js +3 -5
  330. package/dist/index92.js.map +1 -1
  331. package/dist/index93.js +6 -5
  332. package/dist/index93.js.map +1 -1
  333. package/dist/index94.js +5 -4
  334. package/dist/index94.js.map +1 -1
  335. package/dist/index95.js +3 -4
  336. package/dist/index95.js.map +1 -1
  337. package/dist/index96.js +5 -4
  338. package/dist/index96.js.map +1 -1
  339. package/dist/index97.js +4 -8
  340. package/dist/index97.js.map +1 -1
  341. package/dist/index98.js +8 -5
  342. package/dist/index98.js.map +1 -1
  343. package/dist/index99.js +5 -4
  344. package/dist/index99.js.map +1 -1
  345. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index18.js","sources":["../src/components/HourPickerField/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\nimport { DismissableLayerBranch } from \"@radix-ui/react-dismissable-layer\"\nimport { createPortal } from \"react-dom\"\nimport { IMaskInput } from \"react-imask\"\nimport IMask, { InputMask } from \"imask\"\n\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/Select\"\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 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\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.scrollTop = 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 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\n const useIsomorphicLayoutEffect = typeof window === \"undefined\" ? React.useEffect : React.useLayoutEffect\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 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 document.addEventListener(\"pointerdown\", handlePointerDown, true)\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown, 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 useIsomorphicLayoutEffect(() => {\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 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 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 setDraftValueRef={setTriggerDraftValueRef}\n />\n\n {open ? (() => {\n const popover = (\n <DismissableLayerBranch>\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 </DismissableLayerBranch>\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 open,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerFieldProps) {\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 return (\n <div data-slot=\"hours-picker-field\" className={cn(\"w-[150px]\", className)}>\n <Select\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n value={value ?? \"\"}\n onValueChange={(next) => commitValue(next)}\n >\n <SelectTrigger\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n className={cn(\n \"transition-colors hover:bg-accent hover:text-accent-foreground\",\n !value && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n\n <SelectContent\n data-testid={contentTestId}\n autoScroll={\"firstEnabledWithContext\"}\n className=\"max-h-64 overflow-y-auto\"\n >\n {options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"block text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\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 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 setDraftValueRef: React.MutableRefObject<((value: string) => void) | null>\n}\n\nfunction HourPickerMaskedSelectTrigger({\n id,\n placeholder,\n value,\n onValueUpdate,\n onCommit,\n options,\n disabled,\n readOnly,\n open,\n setOpen,\n inputClassName,\n triggerTestId,\n isHydrated,\n highlightedValueRef,\n setHighlightedValue,\n markKeyboardNavigation,\n inputRef,\n setDraftValueRef,\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\n const [draft, setDraft] = React.useState(() => (value ? value : \"\"))\n\n React.useEffect(() => {\n setDraftValueRef.current = (nextValue) => {\n setDraft(nextValue)\n }\n return () => {\n setDraftValueRef.current = null\n }\n }, [setDraftValueRef])\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 const triggerClassName = cn(\n \"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 )\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) => {\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n setDraft(nextText)\n\n if (nextText.replace(/\\D/g, \"\").length !== 0) {\n return\n }\n\n if (value) {\n onCommit(null)\n }\n }}\n onComplete={(completed) => {\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 <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"],"names":["imaskAny","IMask","InputMask","pad2","value","parseTimeInput","raw","trimmed","match","hours","minutes","parseTimeInputWithSelectableOption","options","parsed","parsedOption","option","isOptionSelectable","timeStringToMinutes","findClosestSelectableOption","targetMinutes","bestOption","bestDiff","bestMinutes","optionMinutes","diff","HourPickerScrollButton","direction","viewportRef","speed","className","disabled","setDisabled","React","animationRef","lastTimeRef","isScrollingRef","checkScrollability","viewport","scrollTop","scrollHeight","clientHeight","tolerance","canScrollUp","canScrollDown","handleScroll","handleResize","resizeObserver","mutationObserver","stopScrolling","smoothScroll","currentTime","deltaTime","distance","oldScrollTop","maxScroll","newScrollTop","startScrolling","jsx","cn","ChevronUp","ChevronDown","HourPickerInput","id","onChange","onValueUpdate","placeholder","inputClassName","readOnly","openProp","onOpenChange","triggerTestId","contentTestId","isHydrated","reactId","triggerId","triggerInputRef","setTriggerDraftValueRef","highlightedValueRef","keyboardNavigationActiveRef","highlightedValue","setHighlightedValue","containerRef","desktopPopoverRef","desktopContentRef","desktopPopoverPosition","setDesktopPopoverPosition","uncontrolledOpen","setUncontrolledOpen","open","setOpen","useIsomorphicLayoutEffect","input","updateHighlightedValue","next","markKeyboardNavigation","currentOption","firstEnabled","updateValue","matchingOption","commitValue","handlePointerDown","event","target","container","popover","handleWheel","deltaY","maxScrollTop","atTop","atBottom","nextScrollTop","trigger","isActive","observer","entries","entry","updateDesktopPopoverPosition","rect","popoverHeight","viewportWidth","viewportHeight","padding","width","left","top","overflowBottom","aboveTop","rafId","raf","selected","targetTop","targetBottom","viewportBottom","all","lastDisabledBefore","el","offset","jsxs","HourPickerMaskedSelectTrigger","node","DismissableLayerBranch","isChecked","Check","createPortal","HourPickerSelectField","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","HourPickerField","props","useIsTouchDevice","onCommit","inputRef","setDraftValueRef","isEditingRef","pointerDownOnInputRef","inputWasFocusedOnPointerDownRef","ignoreNextMaskCommitValueRef","draft","setDraft","nextValue","moveSelection","base","baseIndex","nextIndex","nextOption","triggerClassName","IMaskInput","appended","dynamicMasked","digits","hourPrefix","accepted","nextText","completed","resolved","closestOption","highlightedOption","fallbackValue","shouldSelectAll","element"],"mappings":"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"}
1
+ {"version":3,"file":"index18.js","sources":["../src/components/HourPickerField/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\nimport { DismissableLayerBranch } from \"@radix-ui/react-dismissable-layer\"\nimport { createPortal } from \"react-dom\"\nimport { IMaskInput } from \"react-imask\"\nimport IMask, { InputMask } from \"imask\"\n\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/Select\"\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 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\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\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 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 document.addEventListener(\"pointerdown\", handlePointerDown, true)\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown, 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 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 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 <DismissableLayerBranch>\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 </DismissableLayerBranch>\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 open,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerFieldProps) {\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 return (\n <div data-slot=\"hours-picker-field\" className={cn(\"w-[150px]\", className)}>\n <Select\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n value={value ?? \"\"}\n onValueChange={(next) => commitValue(next)}\n >\n <SelectTrigger\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n className={cn(\n \"transition-colors hover:bg-accent hover:text-accent-foreground\",\n !value && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n\n <SelectContent\n data-testid={contentTestId}\n autoScroll={\"firstEnabledWithContext\"}\n className=\"max-h-64 overflow-y-auto\"\n >\n {options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n >\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"block text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\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 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 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\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 const triggerClassName = cn(\n \"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 )\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) => {\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n setDraft(nextText)\n\n if (nextText.replace(/\\D/g, \"\").length !== 0) {\n return\n }\n\n if (value) {\n onCommit(null)\n }\n }}\n onComplete={(completed) => {\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 <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"],"names":["imaskAny","IMask","InputMask","pad2","value","parseTimeInput","raw","trimmed","match","hours","minutes","parseTimeInputWithSelectableOption","options","parsed","parsedOption","option","isOptionSelectable","timeStringToMinutes","findClosestSelectableOption","targetMinutes","bestOption","bestDiff","bestMinutes","optionMinutes","diff","HourPickerScrollButton","direction","viewportRef","speed","className","disabled","setDisabled","React","animationRef","lastTimeRef","isScrollingRef","checkScrollability","viewport","scrollTop","scrollHeight","clientHeight","tolerance","canScrollUp","canScrollDown","handleScroll","handleResize","resizeObserver","mutationObserver","stopScrolling","smoothScroll","currentTime","deltaTime","distance","oldScrollTop","maxScroll","newScrollTop","startScrolling","jsx","cn","ChevronUp","ChevronDown","HourPickerInput","id","onChange","onValueUpdate","placeholder","inputClassName","readOnly","openProp","onOpenChange","triggerTestId","contentTestId","isHydrated","reactId","triggerId","triggerInputRef","setTriggerDraftValueRef","setTriggerDraftValueHandler","handler","highlightedValueRef","keyboardNavigationActiveRef","highlightedValue","setHighlightedValue","containerRef","desktopPopoverRef","desktopContentRef","desktopPopoverPosition","setDesktopPopoverPosition","uncontrolledOpen","setUncontrolledOpen","open","setOpen","input","updateHighlightedValue","next","markKeyboardNavigation","currentOption","firstEnabled","updateValue","matchingOption","commitValue","handlePointerDown","event","target","container","popover","handleWheel","deltaY","maxScrollTop","atTop","atBottom","nextScrollTop","trigger","isActive","observer","entries","entry","updateDesktopPopoverPosition","rect","popoverHeight","viewportWidth","viewportHeight","padding","width","left","top","overflowBottom","aboveTop","rafId","raf","selected","targetTop","targetBottom","viewportBottom","all","lastDisabledBefore","el","offset","jsxs","HourPickerMaskedSelectTrigger","node","DismissableLayerBranch","isChecked","Check","createPortal","HourPickerSelectField","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","HourPickerField","props","useIsTouchDevice","onCommit","inputRef","onDraftValueHandlerChange","isEditingRef","pointerDownOnInputRef","inputWasFocusedOnPointerDownRef","ignoreNextMaskCommitValueRef","draft","setDraft","nextValue","moveSelection","base","baseIndex","nextIndex","nextOption","triggerClassName","IMaskInput","appended","dynamicMasked","digits","hourPrefix","accepted","nextText","completed","resolved","closestOption","highlightedOption","fallbackValue","shouldSelectAll","element"],"mappings":"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"}
package/dist/index19.js CHANGED
@@ -1,13 +1,13 @@
1
- import { j as F } from "./index27.js";
1
+ import { j as F } from "./index28.js";
2
2
  import * as n from "react";
3
3
  import $t from "react-select";
4
4
  import { cn as Oe } from "./index2.js";
5
- import { resolveMessages as qt } from "./index35.js";
6
- import { getLocaleCacheKey as _t, parseLocaleCacheKey as Ut, getCachedCountryOptions as Qt, toSelectedCountry as Jt, buildFallbackSelectedCountry as Gt, getValidCountry as Yt, DEFAULT_COUNTRY as at, COMMON_IDD_PREFIXES as Xt, normalizeSearchValue as Zt, optionMatchIndex as it } from "./index36.js";
7
- import { normalizeInputValue as Te, formatWithAsYouType as ve, sanitizeDigits as T, detectNationalPrefixForDisplay as ee, getSuggestionState as Me, injectNationalPrefixDisplay as Le, shouldDisplayExplicitCountrySelection as ze, getLengthIssue as Be, stripPrefix as ut } from "./index37.js";
8
- import { captureSelectionSnapshot as en, resolveSelection as Se, skipFormattingCharactersLeft as ct, skipFormattingCharactersRight as tn } from "./index38.js";
9
- import { suggestionSelectStyles as nn, SuggestionOption as on, NullComponent as De, HiddenControl as rn, formatCountryOption as sn, SuggestionContext as ln } from "./index39.js";
10
- import { getCountryCallingCode as O } from "./index40.js";
5
+ import { resolveMessages as qt } from "./index36.js";
6
+ import { getLocaleCacheKey as _t, parseLocaleCacheKey as Ut, getCachedCountryOptions as Qt, toSelectedCountry as Jt, buildFallbackSelectedCountry as Gt, getValidCountry as Yt, DEFAULT_COUNTRY as at, COMMON_IDD_PREFIXES as Xt, normalizeSearchValue as Zt, optionMatchIndex as it } from "./index37.js";
7
+ import { normalizeInputValue as Te, formatWithAsYouType as ve, sanitizeDigits as T, detectNationalPrefixForDisplay as ee, getSuggestionState as Me, injectNationalPrefixDisplay as Le, shouldDisplayExplicitCountrySelection as ze, getLengthIssue as Be, stripPrefix as ut } from "./index38.js";
8
+ import { captureSelectionSnapshot as en, resolveSelection as Se, skipFormattingCharactersLeft as ct, skipFormattingCharactersRight as tn } from "./index39.js";
9
+ import { suggestionSelectStyles as nn, SuggestionOption as on, NullComponent as De, HiddenControl as rn, formatCountryOption as sn, SuggestionContext as ln } from "./index40.js";
10
+ import { getCountryCallingCode as O } from "./index41.js";
11
11
  const an = n.forwardRef(
12
12
  function(dt, ft) {
13
13
  const {
package/dist/index20.js CHANGED
@@ -1,7 +1,7 @@
1
- import { j as t } from "./index27.js";
1
+ import { j as t } from "./index28.js";
2
2
  import * as e from "react";
3
3
  import { ChevronDown as k, Check as q, ChevronUp as z } from "lucide-react";
4
- import { Root as F, Group as O, Value as U, Trigger as E, Icon as V, Portal as G, Content as D, Viewport as W, Label as M, Item as A, ItemIndicator as J, ItemText as K, Separator as B } from "./index41.js";
4
+ import { Root as F, Group as O, Value as U, Trigger as E, Icon as V, Portal as G, Content as D, Viewport as W, Label as M, Item as A, ItemIndicator as J, ItemText as K, Separator as B } from "./index42.js";
5
5
  import { cn as v } from "./index2.js";
6
6
  const re = F, ne = O, se = U, Q = e.forwardRef(({ className: n, children: a, ...s }, h) => /* @__PURE__ */ t.jsxs(
7
7
  E,
@@ -61,7 +61,7 @@ const H = e.createContext(null), T = e.forwardRef(
61
61
  }
62
62
  const i = o.scrollTop, N = o.scrollHeight - o.clientHeight;
63
63
  let g;
64
- n === "up" ? g = Math.max(0, i - c) : g = Math.min(N, i + c), o.scrollTop = g, b.current = r;
64
+ n === "up" ? g = Math.max(0, i - c) : g = Math.min(N, i + c), o.scrollTo({ top: g }), b.current = r;
65
65
  const R = 1;
66
66
  (n === "up" ? g > R : g < N - R) && Math.abs(g - i) > 0.01 ? x.current = requestAnimationFrame(y) : (m(), setTimeout(p, 16));
67
67
  },
@@ -109,11 +109,11 @@ const X = e.forwardRef(({ className: n, children: a, position: s = "popper", aut
109
109
  if (f instanceof HTMLElement) {
110
110
  const d = f.offsetTop - 8, c = f.offsetTop + f.offsetHeight + 8;
111
111
  if (d < l.scrollTop) {
112
- l.scrollTop = Math.max(0, d);
112
+ l.scrollTo({ top: Math.max(0, d) });
113
113
  return;
114
114
  }
115
115
  const i = l.scrollTop + l.clientHeight;
116
- c > i && (l.scrollTop = Math.max(0, c - l.clientHeight));
116
+ c > i && l.scrollTo({ top: Math.max(0, c - l.clientHeight) });
117
117
  return;
118
118
  }
119
119
  const o = Array.from(
@@ -130,7 +130,7 @@ const X = e.forwardRef(({ className: n, children: a, position: s = "popper", aut
130
130
  }
131
131
  if (!p) return;
132
132
  const j = Math.max(0, (h === "firstEnabledWithContext" && m ? m : p).offsetTop - 8);
133
- l.scrollTop = j;
133
+ l.scrollTo({ top: j });
134
134
  });
135
135
  return () => cancelAnimationFrame(b);
136
136
  }, [l, h]), /* @__PURE__ */ t.jsx(G, { children: /* @__PURE__ */ t.jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"index20.js","sources":["../src/components/Select/index.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\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 placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst ScrollContext = React.createContext<{\n viewport: HTMLElement | null\n setViewport: (vp: HTMLElement | null) => void\n} | null>(null)\n\ninterface ScrollButtonImplProps extends React.HTMLAttributes<HTMLDivElement> {\n direction: \"up\" | \"down\"\n speed?: number\n}\n\nconst ScrollButtonImpl = React.forwardRef<HTMLDivElement, ScrollButtonImplProps>(\n ({ direction, speed = 400, className, children, ...rest }, ref) => {\n const scrollContext = React.useContext(ScrollContext)\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 viewport = scrollContext?.viewport\n\n const checkScrollability = React.useCallback(() => {\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 }, [viewport, direction])\n\n React.useEffect(() => {\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 }, [viewport, 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 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.scrollTop = 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 [viewport, disabled, direction, speed, stopScrolling, checkScrollability],\n )\n\n const startScrolling = React.useCallback(() => {\n if (disabled || !viewport || isScrollingRef.current) return\n\n isScrollingRef.current = true\n lastTimeRef.current = undefined\n animationRef.current = requestAnimationFrame(smoothScroll)\n }, [disabled, viewport, smoothScroll])\n\n React.useEffect(() => {\n return () => stopScrolling()\n }, [stopScrolling])\n\n return (\n <div\n {...rest}\n ref={ref}\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={e => {\n rest.onPointerEnter?.(e)\n if (!disabled) startScrolling()\n }}\n onPointerMove={e => {\n rest.onPointerMove?.(e)\n if (!disabled && !isScrollingRef.current) startScrolling()\n }}\n onPointerLeave={e => {\n rest.onPointerLeave?.(e)\n stopScrolling()\n }}\n >\n {children}\n </div>\n )\n }\n)\nScrollButtonImpl.displayName = \"ScrollButtonImpl\"\n\nconst SelectScrollUpButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <ScrollButtonImpl ref={ref} direction=\"up\" className={className} {...props}>\n <ChevronUp className=\"h-4 w-4\" />\n </ScrollButtonImpl>\n))\nSelectScrollUpButton.displayName = \"SelectScrollUpButton\"\n\nconst SelectScrollDownButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <ScrollButtonImpl ref={ref} direction=\"down\" className={className} {...props}>\n <ChevronDown className=\"h-4 w-4\" />\n </ScrollButtonImpl>\n))\nSelectScrollDownButton.displayName = \"SelectScrollDownButton\"\n\ntype SelectContentProps = React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> & {\n autoScroll?: \"firstEnabled\" | \"firstEnabledWithContext\"\n}\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n SelectContentProps\n>(({ className, children, position = \"popper\", autoScroll, ...props }, ref) => {\n const [viewport, setViewport] = React.useState<HTMLElement | null>(null)\n const viewportRef = React.useCallback((node: HTMLElement | null) => {\n setViewport(node)\n }, [])\n\n React.useEffect(() => {\n if (!viewport || !autoScroll) 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(\n viewport.querySelectorAll(\"[role=\\\"option\\\"]\")\n ) as HTMLElement[]\n if (!all.length) return\n\n let firstEnabled: HTMLElement | undefined\n let lastDisabledBefore: HTMLElement | undefined\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 =\n autoScroll === \"firstEnabledWithContext\" && lastDisabledBefore\n ? lastDisabledBefore\n : 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 }, [viewport, autoScroll])\n\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-[60] max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <ScrollContext.Provider value={{ viewport, setViewport }}>\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n ref={viewportRef}\n className={cn(\n \"p-1 overflow-y-auto\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </ScrollContext.Provider>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n})\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\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 focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 cursor-pointer\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n"],"names":["Select","SelectPrimitive.Root","SelectGroup","SelectPrimitive.Group","SelectValue","SelectPrimitive.Value","SelectTrigger","React","className","children","props","ref","jsxs","SelectPrimitive.Trigger","cn","jsx","SelectPrimitive.Icon","ChevronDown","ScrollContext","ScrollButtonImpl","direction","speed","rest","scrollContext","disabled","setDisabled","animationRef","lastTimeRef","isScrollingRef","viewport","checkScrollability","scrollTop","scrollHeight","clientHeight","tolerance","canScrollUp","canScrollDown","handleScroll","handleResize","resizeObserver","mutationObserver","stopScrolling","smoothScroll","currentTime","deltaTime","distance","oldScrollTop","maxScroll","newScrollTop","startScrolling","e","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","autoScroll","setViewport","viewportRef","node","raf","selected","targetTop","targetBottom","viewportBottom","all","firstEnabled","lastDisabledBefore","el","offset","SelectPrimitive.Portal","SelectPrimitive.Content","SelectPrimitive.Viewport","SelectLabel","SelectPrimitive.Label","SelectItem","SelectPrimitive.Item","SelectPrimitive.ItemIndicator","Check","SelectPrimitive.ItemText","SelectSeparator","SelectPrimitive.Separator"],"mappings":"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"}
1
+ {"version":3,"file":"index20.js","sources":["../src/components/Select/index.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nconst Select = SelectPrimitive.Root\nconst SelectGroup = SelectPrimitive.Group\nconst SelectValue = SelectPrimitive.Value\n\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\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 placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst ScrollContext = React.createContext<{\n viewport: HTMLElement | null\n setViewport: (vp: HTMLElement | null) => void\n} | null>(null)\n\ninterface ScrollButtonImplProps extends React.HTMLAttributes<HTMLDivElement> {\n direction: \"up\" | \"down\"\n speed?: number\n}\n\nconst ScrollButtonImpl = React.forwardRef<HTMLDivElement, ScrollButtonImplProps>(\n ({ direction, speed = 400, className, children, ...rest }, ref) => {\n const scrollContext = React.useContext(ScrollContext)\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 viewport = scrollContext?.viewport\n\n const checkScrollability = React.useCallback(() => {\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 }, [viewport, direction])\n\n React.useEffect(() => {\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 }, [viewport, 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 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 [viewport, disabled, direction, speed, stopScrolling, checkScrollability],\n )\n\n const startScrolling = React.useCallback(() => {\n if (disabled || !viewport || isScrollingRef.current) return\n\n isScrollingRef.current = true\n lastTimeRef.current = undefined\n animationRef.current = requestAnimationFrame(smoothScroll)\n }, [disabled, viewport, smoothScroll])\n\n React.useEffect(() => {\n return () => stopScrolling()\n }, [stopScrolling])\n\n return (\n <div\n {...rest}\n ref={ref}\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={e => {\n rest.onPointerEnter?.(e)\n if (!disabled) startScrolling()\n }}\n onPointerMove={e => {\n rest.onPointerMove?.(e)\n if (!disabled && !isScrollingRef.current) startScrolling()\n }}\n onPointerLeave={e => {\n rest.onPointerLeave?.(e)\n stopScrolling()\n }}\n >\n {children}\n </div>\n )\n }\n)\nScrollButtonImpl.displayName = \"ScrollButtonImpl\"\n\nconst SelectScrollUpButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <ScrollButtonImpl ref={ref} direction=\"up\" className={className} {...props}>\n <ChevronUp className=\"h-4 w-4\" />\n </ScrollButtonImpl>\n))\nSelectScrollUpButton.displayName = \"SelectScrollUpButton\"\n\nconst SelectScrollDownButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <ScrollButtonImpl ref={ref} direction=\"down\" className={className} {...props}>\n <ChevronDown className=\"h-4 w-4\" />\n </ScrollButtonImpl>\n))\nSelectScrollDownButton.displayName = \"SelectScrollDownButton\"\n\ntype SelectContentProps = React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> & {\n autoScroll?: \"firstEnabled\" | \"firstEnabledWithContext\"\n}\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n SelectContentProps\n>(({ className, children, position = \"popper\", autoScroll, ...props }, ref) => {\n const [viewport, setViewport] = React.useState<HTMLElement | null>(null)\n const viewportRef = React.useCallback((node: HTMLElement | null) => {\n setViewport(node)\n }, [])\n\n React.useEffect(() => {\n if (!viewport || !autoScroll) 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.scrollTo({ top: Math.max(0, targetTop) })\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTo({ top: Math.max(0, targetBottom - viewport.clientHeight) })\n }\n return\n }\n\n const all = Array.from(\n viewport.querySelectorAll(\"[role=\\\"option\\\"]\")\n ) as HTMLElement[]\n if (!all.length) return\n\n let firstEnabled: HTMLElement | undefined\n let lastDisabledBefore: HTMLElement | undefined\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 =\n autoScroll === \"firstEnabledWithContext\" && lastDisabledBefore\n ? lastDisabledBefore\n : firstEnabled\n\n const offset = Math.max(0, target.offsetTop - 8)\n viewport.scrollTo({ top: offset })\n }\n\n const raf = requestAnimationFrame(run)\n return () => cancelAnimationFrame(raf)\n }, [viewport, autoScroll])\n\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-[60] max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <ScrollContext.Provider value={{ viewport, setViewport }}>\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n ref={viewportRef}\n className={cn(\n \"p-1 overflow-y-auto\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </ScrollContext.Provider>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n})\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\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 focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 cursor-pointer\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n"],"names":["Select","SelectPrimitive.Root","SelectGroup","SelectPrimitive.Group","SelectValue","SelectPrimitive.Value","SelectTrigger","React","className","children","props","ref","jsxs","SelectPrimitive.Trigger","cn","jsx","SelectPrimitive.Icon","ChevronDown","ScrollContext","ScrollButtonImpl","direction","speed","rest","scrollContext","disabled","setDisabled","animationRef","lastTimeRef","isScrollingRef","viewport","checkScrollability","scrollTop","scrollHeight","clientHeight","tolerance","canScrollUp","canScrollDown","handleScroll","handleResize","resizeObserver","mutationObserver","stopScrolling","smoothScroll","currentTime","deltaTime","distance","oldScrollTop","maxScroll","newScrollTop","startScrolling","e","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","SelectContent","position","autoScroll","setViewport","viewportRef","node","raf","selected","targetTop","targetBottom","viewportBottom","all","firstEnabled","lastDisabledBefore","el","offset","SelectPrimitive.Portal","SelectPrimitive.Content","SelectPrimitive.Viewport","SelectLabel","SelectPrimitive.Label","SelectItem","SelectPrimitive.Item","SelectPrimitive.ItemIndicator","Check","SelectPrimitive.ItemText","SelectSeparator","SelectPrimitive.Separator"],"mappings":";;;;;AAOA,MAAMA,KAASC,GACTC,KAAcC,GACdC,KAAcC,GAGdC,IAAgBC,EAAM,WAG1B,CAAC,EAAE,WAAAC,GAAW,UAAAC,GAAU,GAAGC,KAASC,MACpCC,gBAAAA,EAAAA;AAAAA,EAACC;AAAAA,EAAA;AAAA,IACC,KAAAF;AAAA,IACA,WAAWG;AAAA,MACT;AAAA,MACAN;AAAA,IAAA;AAAA,IAED,GAAGE;AAAA,IAEH,UAAA;AAAA,MAAAD;AAAA,MACDM,gBAAAA,EAAAA,IAACC,GAAA,EAAqB,SAAO,IAC3B,UAAAD,gBAAAA,EAAAA,IAACE,GAAA,EAAY,WAAU,qBAAA,CAAqB,EAAA,CAC9C;AAAA,IAAA;AAAA,EAAA;AACF,CACD;AACDX,EAAc,cAAcO,EAAwB;AAEpD,MAAMK,IAAgBX,EAAM,cAGlB,IAAI,GAORY,IAAmBZ,EAAM;AAAA,EAC7B,CAAC,EAAE,WAAAa,GAAW,OAAAC,IAAQ,KAAK,WAAAb,GAAW,UAAAC,GAAU,GAAGa,EAAA,GAAQX,MAAQ;AACjE,UAAMY,IAAgBhB,EAAM,WAAWW,CAAa,GAC9C,CAACM,GAAUC,CAAW,IAAIlB,EAAM,SAAS,EAAI,GAC7CmB,IAAenB,EAAM,OAA2B,MAAS,GACzDoB,IAAcpB,EAAM,OAA2B,MAAS,GACxDqB,IAAiBrB,EAAM,OAAO,EAAK,GAEnCsB,IAAWN,GAAe,UAE1BO,IAAqBvB,EAAM,YAAY,MAAM;AACjD,UAAI,CAACsB,GAAU;AACb,QAAAJ,EAAY,EAAI;AAChB;AAAA,MACF;AAEA,YAAM,EAAE,WAAAM,GAAW,cAAAC,GAAc,cAAAC,EAAA,IAAiBJ,GAC5CK,IAAY,GAEZC,IAAcJ,IAAYG,GAC1BE,IAAgBL,IAAaC,IAAeC,IAAeC;AAGjE,UAAI,EAFyBF,IAAeC,IAAeC,IAEhC;AACzB,QAAAT,EAAY,EAAI;AAChB;AAAA,MACF;AAGA,MAAAA,EADsBL,MAAc,OAAO,CAACe,IAAc,CAACC,CAClC;AAAA,IAC3B,GAAG,CAACP,GAAUT,CAAS,CAAC;AAExB,IAAAb,EAAM,UAAU,MAAM;AACpB,UAAI,CAACsB,EAAU;AAEf,MAAAC,EAAA;AAEA,YAAMO,IAAe,MAAMP,EAAA,GACrBQ,IAAe,MAAMR,EAAA;AAE3B,MAAAD,EAAS,iBAAiB,UAAUQ,GAAc,EAAE,SAAS,IAAM;AAEnE,YAAME,IAAiB,IAAI,eAAeD,CAAY;AACtD,MAAAC,EAAe,QAAQV,CAAQ;AAE/B,YAAMW,IAAmB,IAAI,iBAAiBF,CAAY;AAC1D,aAAAE,EAAiB,QAAQX,GAAU,EAAE,WAAW,IAAM,SAAS,IAAM,GAE9D,MAAM;AACX,QAAAA,EAAS,oBAAoB,UAAUQ,CAAY,GACnDE,EAAe,WAAA,GACfC,EAAiB,WAAA;AAAA,MACnB;AAAA,IACF,GAAG,CAACX,GAAUC,CAAkB,CAAC;AAEjC,UAAMW,IAAgBlC,EAAM,YAAY,MAAM;AAC5C,MAAImB,EAAa,YACf,qBAAqBA,EAAa,OAAO,GACzCA,EAAa,UAAU,SAEzBE,EAAe,UAAU,IACzBD,EAAY,UAAU;AAAA,IACxB,GAAG,CAAA,CAAE,GAECe,IAAenC,EAAM;AAAA,MACzB,CAACoC,MAAwB;AACvB,YAAI,CAACd,KAAYL,KAAY,CAACI,EAAe,SAAS;AACpD,UAAAa,EAAA;AACA;AAAA,QACF;AAEA,QAAKd,EAAY,YACfA,EAAY,UAAUgB;AAGxB,cAAMC,IAAYD,IAAchB,EAAY,SACtCkB,IAAYxB,IAAQuB,IAAa;AAEvC,YAAIC,IAAW,KAAK;AAClB,UAAAnB,EAAa,UAAU,sBAAsBgB,CAAY;AACzD;AAAA,QACF;AAEA,cAAMI,IAAejB,EAAS,WACxBkB,IAAYlB,EAAS,eAAeA,EAAS;AAEnD,YAAImB;AACJ,QAAI5B,MAAc,OAChB4B,IAAe,KAAK,IAAI,GAAGF,IAAeD,CAAQ,IAElDG,IAAe,KAAK,IAAID,GAAWD,IAAeD,CAAQ,GAG5DhB,EAAS,SAAS,EAAE,KAAKmB,EAAA,CAAc,GAEvCrB,EAAY,UAAUgB;AAEtB,cAAMT,IAAY;AAMlB,SAJEd,MAAc,OACV4B,IAAed,IACfc,IAAgBD,IAAYb,MAEf,KAAK,IAAIc,IAAeF,CAAY,IAAI,OACzDpB,EAAa,UAAU,sBAAsBgB,CAAY,KAEzDD,EAAA,GACA,WAAWX,GAAoB,EAAE;AAAA,MAErC;AAAA,MACA,CAACD,GAAUL,GAAUJ,GAAWC,GAAOoB,GAAeX,CAAkB;AAAA,IAAA,GAGpEmB,IAAiB1C,EAAM,YAAY,MAAM;AAC7C,MAAIiB,KAAY,CAACK,KAAYD,EAAe,YAE5CA,EAAe,UAAU,IACzBD,EAAY,UAAU,QACtBD,EAAa,UAAU,sBAAsBgB,CAAY;AAAA,IAC3D,GAAG,CAAClB,GAAUK,GAAUa,CAAY,CAAC;AAErC,WAAAnC,EAAM,UAAU,MACP,MAAMkC,EAAA,GACZ,CAACA,CAAa,CAAC,GAGhB1B,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACE,GAAGO;AAAA,QACJ,KAAAX;AAAA,QACA,WAAWG;AAAA,UACT;AAAA,UACAU,IAAW,8BAA8B;AAAA,UACzChB;AAAA,QAAA;AAAA,QAEF,gBAAgB,CAAA0C,MAAK;AACnB,UAAA5B,EAAK,iBAAiB4B,CAAC,GAClB1B,KAAUyB,EAAA;AAAA,QACjB;AAAA,QACA,eAAe,CAAAC,MAAK;AAClB,UAAA5B,EAAK,gBAAgB4B,CAAC,GAClB,CAAC1B,KAAY,CAACI,EAAe,WAASqB,EAAA;AAAA,QAC5C;AAAA,QACA,gBAAgB,CAAAC,MAAK;AACnB,UAAA5B,EAAK,iBAAiB4B,CAAC,GACvBT,EAAA;AAAA,QACF;AAAA,QAEC,UAAAhC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AACAU,EAAiB,cAAc;AAE/B,MAAMgC,IAAuB5C,EAAM,WAGjC,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAASC,MAC1BI,gBAAAA,MAACI,KAAiB,KAAAR,GAAU,WAAU,MAAK,WAAAH,GAAuB,GAAGE,GACnE,gCAAC0C,GAAA,EAAU,WAAU,UAAA,CAAU,EAAA,CACjC,CACD;AACDD,EAAqB,cAAc;AAEnC,MAAME,IAAyB9C,EAAM,WAGnC,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAASC,MAC1BI,gBAAAA,MAACI,KAAiB,KAAAR,GAAU,WAAU,QAAO,WAAAH,GAAuB,GAAGE,GACrE,gCAACO,GAAA,EAAY,WAAU,UAAA,CAAU,EAAA,CACnC,CACD;AACDoC,EAAuB,cAAc;AAMrC,MAAMC,IAAgB/C,EAAM,WAG1B,CAAC,EAAE,WAAAC,GAAW,UAAAC,GAAU,UAAA8C,IAAW,UAAU,YAAAC,GAAY,GAAG9C,EAAA,GAASC,MAAQ;AAC7E,QAAM,CAACkB,GAAU4B,CAAW,IAAIlD,EAAM,SAA6B,IAAI,GACjEmD,IAAcnD,EAAM,YAAY,CAACoD,MAA6B;AAClE,IAAAF,EAAYE,CAAI;AAAA,EAClB,GAAG,CAAA,CAAE;AAEL,SAAApD,EAAM,UAAU,MAAM;AACpB,QAAI,CAACsB,KAAY,CAAC2B,EAAY;AAgD9B,UAAMI,IAAM,sBA9CA,MAAM;AAChB,YAAMC,IAAWhC,EAAS,cAAc,uCAA2C;AACnF,UAAIgC,aAAoB,aAAa;AAEnC,cAAMC,IAAYD,EAAS,YAAY,GACjCE,IAAeF,EAAS,YAAYA,EAAS,eAAe;AAElE,YAAIC,IAAYjC,EAAS,WAAW;AAClC,UAAAA,EAAS,SAAS,EAAE,KAAK,KAAK,IAAI,GAAGiC,CAAS,GAAG;AACjD;AAAA,QACF;AAEA,cAAME,IAAiBnC,EAAS,YAAYA,EAAS;AACrD,QAAIkC,IAAeC,KACjBnC,EAAS,SAAS,EAAE,KAAK,KAAK,IAAI,GAAGkC,IAAelC,EAAS,YAAY,GAAG;AAE9E;AAAA,MACF;AAEA,YAAMoC,IAAM,MAAM;AAAA,QAChBpC,EAAS,iBAAiB,iBAAmB;AAAA,MAAA;AAE/C,UAAI,CAACoC,EAAI,OAAQ;AAEjB,UAAIC,GACAC;AACJ,iBAAWC,KAAMH,GAAK;AAEpB,YAAI,CADeG,EAAG,aAAa,eAAe,GACjC;AACf,UAAAF,IAAeE;AACf;AAAA,QACF;AACA,QAAAD,IAAqBC;AAAA,MACvB;AAEA,UAAI,CAACF,EAAc;AAOnB,YAAMG,IAAS,KAAK,IAAI,IAJtBb,MAAe,6BAA6BW,IACxCA,IACAD,GAE4B,YAAY,CAAC;AAC/C,MAAArC,EAAS,SAAS,EAAE,KAAKwC,EAAA,CAAQ;AAAA,IACnC,CAEqC;AACrC,WAAO,MAAM,qBAAqBT,CAAG;AAAA,EACvC,GAAG,CAAC/B,GAAU2B,CAAU,CAAC,GAGvBzC,gBAAAA,MAACuD,GAAA,EACC,UAAAvD,gBAAAA,EAAAA;AAAAA,IAACwD;AAAAA,IAAA;AAAA,MACC,KAAA5D;AAAA,MACA,WAAWG;AAAA,QACT;AAAA,QACAyC,MAAa,YACX;AAAA,QACF/C;AAAA,MAAA;AAAA,MAEF,UAAA+C;AAAA,MACC,GAAG7C;AAAA,MAEJ,UAAAE,gBAAAA,EAAAA,KAACM,EAAc,UAAd,EAAuB,OAAO,EAAE,UAAAW,GAAU,aAAA4B,KACzC,UAAA;AAAA,QAAA1C,gBAAAA,EAAAA,IAACoC,GAAA,EAAqB;AAAA,QACtBpC,gBAAAA,EAAAA;AAAAA,UAACyD;AAAAA,UAAA;AAAA,YACC,KAAKd;AAAA,YACL,WAAW5C;AAAA,cACT;AAAA,cACAyC,MAAa,YACX;AAAA,YAAA;AAAA,YAGH,UAAA9C;AAAA,UAAA;AAAA,QAAA;AAAA,8BAEF4C,GAAA,CAAA,CAAuB;AAAA,MAAA,EAAA,CAC1B;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ,CAAC;AACDC,EAAc,cAAciB,EAAwB;AAEpD,MAAME,IAAclE,EAAM,WAGxB,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAASC,MAC1BI,gBAAAA,EAAAA;AAAAA,EAAC2D;AAAAA,EAAA;AAAA,IACC,KAAA/D;AAAA,IACA,WAAWG,EAAG,0CAA0CN,CAAS;AAAA,IAChE,GAAGE;AAAA,EAAA;AACN,CACD;AACD+D,EAAY,cAAcC,EAAsB;AAEhD,MAAMC,IAAapE,EAAM,WAGvB,CAAC,EAAE,WAAAC,GAAW,UAAAC,GAAU,GAAGC,KAASC,MACpCC,gBAAAA,EAAAA;AAAAA,EAACgE;AAAAA,EAAA;AAAA,IACC,KAAAjE;AAAA,IACA,WAAWG;AAAA,MACT;AAAA,MACAN;AAAA,IAAA;AAAA,IAED,GAAGE;AAAA,IAEJ,UAAA;AAAA,MAAAK,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,gEACd,UAAAA,gBAAAA,EAAAA,IAAC8D,GAAA,EACC,UAAA9D,gBAAAA,EAAAA,IAAC+D,GAAA,EAAM,WAAU,UAAA,CAAU,EAAA,CAC7B,GACF;AAAA,MACA/D,gBAAAA,MAACgE,GAAA,EAA0B,UAAAtE,EAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AACtC,CACD;AACDkE,EAAW,cAAcC,EAAqB;AAE9C,MAAMI,IAAkBzE,EAAM,WAG5B,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAASC,MAC1BI,gBAAAA,EAAAA;AAAAA,EAACkE;AAAAA,EAAA;AAAA,IACC,KAAAtE;AAAA,IACA,WAAWG,EAAG,4BAA4BN,CAAS;AAAA,IAClD,GAAGE;AAAA,EAAA;AACN,CACD;AACDsE,EAAgB,cAAcC,EAA0B;"}
package/dist/index21.js CHANGED
@@ -1,4 +1,4 @@
1
- import { MenuPopover as o } from "./index42.js";
1
+ import { MenuPopover as o } from "./index43.js";
2
2
  const r = {
3
3
  MenuPopover: o
4
4
  };
package/dist/index22.js CHANGED
@@ -1,4 +1,4 @@
1
- import { j as e } from "./index27.js";
1
+ import { j as e } from "./index28.js";
2
2
  import { Bell as s } from "lucide-react";
3
3
  import { cn as l } from "./index2.js";
4
4
  function f({
package/dist/index226.js CHANGED
@@ -1,4 +1,4 @@
1
- import { DayFlag as s } from "./index115.js";
1
+ import { DayFlag as s } from "./index116.js";
2
2
  var d;
3
3
  (function(e) {
4
4
  e[e.Today = 0] = "Today", e[e.Selected = 1] = "Selected", e[e.LastFocused = 2] = "LastFocused", e[e.FocusedModifier = 3] = "FocusedModifier";
package/dist/index227.js CHANGED
@@ -1,4 +1,4 @@
1
- import { dateMatchModifiers as u } from "./index30.js";
1
+ import { dateMatchModifiers as u } from "./index31.js";
2
2
  import { getFocusableDate as g } from "./index268.js";
3
3
  import { CalendarDay as m } from "./index179.js";
4
4
  function h(t, i, a, d, f, e, n, s = 0) {
package/dist/index229.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useControlledValue as x } from "./index225.js";
2
- import { rangeIncludesDate as R } from "./index122.js";
2
+ import { rangeIncludesDate as R } from "./index123.js";
3
3
  import { addToRange as y } from "./index231.js";
4
4
  import { rangeContainsModifiers as C } from "./index233.js";
5
5
  function b(s, l) {
package/dist/index23.js CHANGED
@@ -1,7 +1,7 @@
1
- import { j as e } from "./index27.js";
1
+ import { j as e } from "./index28.js";
2
2
  import { useContext as H, createContext as Q, useState as p, useMemo as y, useCallback as W, useEffect as L } from "react";
3
3
  import * as b from "@radix-ui/react-dialog";
4
- import { Root as Z, Trigger as _, Portal as ee, Content as te, Item as E } from "./index48.js";
4
+ import { Root as Z, Trigger as _, Portal as ee, Content as te, Item as E } from "./index53.js";
5
5
  import { X as ne, Loader2 as se, MoreVertical as re } from "lucide-react";
6
6
  import { cn as w } from "./index2.js";
7
7
  const G = (t) => {
package/dist/index231.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defaultDateLib as D } from "./index102.js";
1
+ import { defaultDateLib as D } from "./index103.js";
2
2
  function w(f, g, n = 0, s = 0, l = !1, u = D) {
3
3
  const { from: o, to: i } = g || {}, { isSameDay: r, isAfter: m, isBefore: c } = u;
4
4
  let e;
package/dist/index232.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defaultDateLib as f } from "./index102.js";
1
+ import { defaultDateLib as f } from "./index103.js";
2
2
  function y(t, r, e = f) {
3
3
  const n = Array.isArray(r) ? r : [r];
4
4
  let a = t.from;
package/dist/index233.js CHANGED
@@ -1,9 +1,9 @@
1
- import { defaultDateLib as p } from "./index102.js";
2
- import { dateMatchModifiers as s } from "./index30.js";
1
+ import { defaultDateLib as p } from "./index103.js";
2
+ import { dateMatchModifiers as s } from "./index31.js";
3
3
  import { rangeContainsDayOfWeek as M } from "./index232.js";
4
- import { rangeIncludesDate as l } from "./index122.js";
4
+ import { rangeIncludesDate as l } from "./index123.js";
5
5
  import { rangeOverlaps as y } from "./index234.js";
6
- import { isDatesArray as a, isDateRange as A, isDayOfWeekType as C, isDateInterval as I, isDateAfterType as v, isDateBeforeType as F } from "./index124.js";
6
+ import { isDatesArray as a, isDateRange as A, isDayOfWeekType as C, isDateInterval as I, isDateAfterType as v, isDateBeforeType as F } from "./index125.js";
7
7
  function d(n, t, f = p) {
8
8
  const e = Array.isArray(t) ? t : [t];
9
9
  if (e.filter((o) => typeof o != "function").some((o) => typeof o == "boolean" ? o : f.isDate(o) ? l(n, o, !1, f) : a(o, f) ? o.some((r) => l(n, r, !1, f)) : A(o) ? o.from && o.to ? y(n, { from: o.from, to: o.to }, f) : !1 : C(o) ? M(n, o.dayOfWeek, f) : I(o) ? f.isAfter(o.before, o.after) ? y(n, {
package/dist/index234.js CHANGED
@@ -1,5 +1,5 @@
1
- import { rangeIncludesDate as m } from "./index122.js";
2
- import { defaultDateLib as r } from "./index102.js";
1
+ import { rangeIncludesDate as m } from "./index123.js";
2
+ import { defaultDateLib as r } from "./index103.js";
3
3
  function u(o, f, l = r) {
4
4
  return m(o, f.from, !1, l) || m(o, f.to, !1, l) || m(f, o.from, !1, l) || m(f, o.to, !1, l);
5
5
  }