@rpcbase/ui 0.287.0 → 0.289.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/sha256.worker-DNtOSCbM.js.map +1 -0
- package/dist/components/FilesUploadField/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index10.js.map +1 -1
- package/dist/index100.js.map +1 -1
- package/dist/index101.js.map +1 -1
- package/dist/index102.js.map +1 -1
- package/dist/index103.js.map +1 -1
- package/dist/index104.js.map +1 -1
- package/dist/index105.js.map +1 -1
- package/dist/index106.js.map +1 -1
- package/dist/index107.js.map +1 -1
- package/dist/index108.js.map +1 -1
- package/dist/index109.js.map +1 -1
- package/dist/index11.js +96 -17
- package/dist/index11.js.map +1 -1
- package/dist/index110.js.map +1 -1
- package/dist/index111.js.map +1 -1
- package/dist/index112.js.map +1 -1
- package/dist/index113.js.map +1 -1
- package/dist/index114.js.map +1 -1
- package/dist/index115.js.map +1 -1
- package/dist/index116.js.map +1 -1
- package/dist/index117.js.map +1 -1
- package/dist/index118.js.map +1 -1
- package/dist/index119.js.map +1 -1
- package/dist/index12.js.map +1 -1
- package/dist/index120.js.map +1 -1
- package/dist/index121.js.map +1 -1
- package/dist/index122.js.map +1 -1
- package/dist/index123.js +1 -1
- package/dist/index123.js.map +1 -1
- package/dist/index124.js.map +1 -1
- package/dist/index125.js.map +1 -1
- package/dist/index126.js.map +1 -1
- package/dist/index127.js.map +1 -1
- package/dist/index128.js.map +1 -1
- package/dist/index129.js.map +1 -1
- package/dist/index13.js.map +1 -1
- package/dist/index130.js.map +1 -1
- package/dist/index131.js.map +1 -1
- package/dist/index132.js.map +1 -1
- package/dist/index133.js.map +1 -1
- package/dist/index134.js.map +1 -1
- package/dist/index135.js.map +1 -1
- package/dist/index136.js.map +1 -1
- package/dist/index137.js.map +1 -1
- package/dist/index138.js.map +1 -1
- package/dist/index139.js.map +1 -1
- package/dist/index14.js.map +1 -1
- package/dist/index140.js.map +1 -1
- package/dist/index141.js.map +1 -1
- package/dist/index142.js.map +1 -1
- package/dist/index143.js.map +1 -1
- package/dist/index144.js.map +1 -1
- package/dist/index145.js.map +1 -1
- package/dist/index146.js.map +1 -1
- package/dist/index147.js.map +1 -1
- package/dist/index148.js.map +1 -1
- package/dist/index149.js.map +1 -1
- package/dist/index15.js.map +1 -1
- package/dist/index150.js.map +1 -1
- package/dist/index151.js.map +1 -1
- package/dist/index152.js.map +1 -1
- package/dist/index153.js.map +1 -1
- package/dist/index154.js +4 -4
- package/dist/index154.js.map +1 -1
- package/dist/index155.js.map +1 -1
- package/dist/index156.js.map +1 -1
- package/dist/index157.js.map +1 -1
- package/dist/index158.js.map +1 -1
- package/dist/index159.js.map +1 -1
- package/dist/index16.js.map +1 -1
- package/dist/index160.js.map +1 -1
- package/dist/index161.js.map +1 -1
- package/dist/index162.js.map +1 -1
- package/dist/index163.js.map +1 -1
- package/dist/index164.js.map +1 -1
- package/dist/index165.js.map +1 -1
- package/dist/index166.js.map +1 -1
- package/dist/index167.js.map +1 -1
- package/dist/index168.js.map +1 -1
- package/dist/index169.js.map +1 -1
- package/dist/index17.js.map +1 -1
- package/dist/index170.js +18 -12
- package/dist/index170.js.map +1 -1
- package/dist/index171.js.map +1 -1
- package/dist/index172.js.map +1 -1
- package/dist/index173.js.map +1 -1
- package/dist/index174.js.map +1 -1
- package/dist/index175.js.map +1 -1
- package/dist/index176.js.map +1 -1
- package/dist/index177.js.map +1 -1
- package/dist/index178.js.map +1 -1
- package/dist/index179.js.map +1 -1
- package/dist/index18.js.map +1 -1
- package/dist/index180.js.map +1 -1
- package/dist/index181.js +1 -1
- package/dist/index181.js.map +1 -1
- package/dist/index182.js +3 -3
- package/dist/index182.js.map +1 -1
- package/dist/index183.js.map +1 -1
- package/dist/index184.js.map +1 -1
- package/dist/index185.js.map +1 -1
- package/dist/index186.js.map +1 -1
- package/dist/index187.js.map +1 -1
- package/dist/index188.js.map +1 -1
- package/dist/index189.js.map +1 -1
- package/dist/index19.js.map +1 -1
- package/dist/index190.js +9 -7
- package/dist/index190.js.map +1 -1
- package/dist/index191.js +4 -4
- package/dist/index191.js.map +1 -1
- package/dist/index192.js +4 -15
- package/dist/index192.js.map +1 -1
- package/dist/index193.js +13 -3
- package/dist/index193.js.map +1 -1
- package/dist/index194.js +2 -2
- package/dist/index194.js.map +1 -1
- package/dist/index195.js +4 -85
- package/dist/index195.js.map +1 -1
- package/dist/index196.js +79 -54
- package/dist/index196.js.map +1 -1
- package/dist/index197.js +68 -7
- package/dist/index197.js.map +1 -1
- package/dist/index198.js +3 -23
- package/dist/index198.js.map +1 -1
- package/dist/index199.js +6 -28
- package/dist/index199.js.map +1 -1
- package/dist/index20.js.map +1 -1
- package/dist/index200.js +4 -97
- package/dist/index200.js.map +1 -1
- package/dist/index201.js +3 -4
- package/dist/index201.js.map +1 -1
- package/dist/index202.js +23 -24
- package/dist/index202.js.map +1 -1
- package/dist/index203.js +28 -10
- package/dist/index203.js.map +1 -1
- package/dist/index204.js +97 -4
- package/dist/index204.js.map +1 -1
- package/dist/index205.js +4 -12
- package/dist/index205.js.map +1 -1
- package/dist/index206.js +22 -19
- package/dist/index206.js.map +1 -1
- package/dist/index207.js +4 -6
- package/dist/index207.js.map +1 -1
- package/dist/index208.js +4 -15
- package/dist/index208.js.map +1 -1
- package/dist/index209.js +10 -102
- package/dist/index209.js.map +1 -1
- package/dist/index210.js +21 -3
- package/dist/index210.js.map +1 -1
- package/dist/index211.js +5 -23
- package/dist/index211.js.map +1 -1
- package/dist/index212.js +15 -28
- package/dist/index212.js.map +1 -1
- package/dist/index213.js +101 -17
- package/dist/index213.js.map +1 -1
- package/dist/index214.js +3 -7
- package/dist/index214.js.map +1 -1
- package/dist/index215.js +24 -15
- package/dist/index215.js.map +1 -1
- package/dist/index216.js +27 -7
- package/dist/index216.js.map +1 -1
- package/dist/index217.js +17 -24
- package/dist/index217.js.map +1 -1
- package/dist/index218.js +6 -22
- package/dist/index218.js.map +1 -1
- package/dist/index219.js +15 -6
- package/dist/index219.js.map +1 -1
- package/dist/index220.js +8 -5
- package/dist/index220.js.map +1 -1
- package/dist/index221.js +27 -4
- package/dist/index221.js.map +1 -1
- package/dist/index222.js +23 -4
- package/dist/index222.js.map +1 -1
- package/dist/index223.js +6 -24
- package/dist/index223.js.map +1 -1
- package/dist/index224.js +5 -3
- package/dist/index224.js.map +1 -1
- package/dist/index225.js +4 -24
- package/dist/index225.js.map +1 -1
- package/dist/index226.js +4 -23
- package/dist/index226.js.map +1 -1
- package/dist/index227.js +23 -6
- package/dist/index227.js.map +1 -1
- package/dist/index228.js +22 -8
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +3 -19
- package/dist/index229.js.map +1 -1
- package/dist/index23.js.map +1 -1
- package/dist/index230.js +22 -50
- package/dist/index230.js.map +1 -1
- package/dist/index231.js +7 -20
- package/dist/index231.js.map +1 -1
- package/dist/index232.js +9 -27
- package/dist/index232.js.map +1 -1
- package/dist/index233.js +17 -97
- package/dist/index233.js.map +1 -1
- package/dist/index234.js +50 -33
- package/dist/index234.js.map +1 -1
- package/dist/index235.js +20 -119
- package/dist/index235.js.map +1 -1
- package/dist/index236.js +28 -13
- package/dist/index236.js.map +1 -1
- package/dist/index237.js +98 -4
- package/dist/index237.js.map +1 -1
- package/dist/index238.js +33 -15
- package/dist/index238.js.map +1 -1
- package/dist/index239.js +116 -62
- package/dist/index239.js.map +1 -1
- package/dist/index24.js.map +1 -1
- package/dist/index240.js +13 -10
- package/dist/index240.js.map +1 -1
- package/dist/index241.js +4 -109
- package/dist/index241.js.map +1 -1
- package/dist/index242.js +14 -14
- package/dist/index242.js.map +1 -1
- package/dist/index243.js +64 -12
- package/dist/index243.js.map +1 -1
- package/dist/index244.js +10 -5
- package/dist/index244.js.map +1 -1
- package/dist/index245.js +104 -318
- package/dist/index245.js.map +1 -1
- package/dist/index246.js +14 -66
- package/dist/index246.js.map +1 -1
- package/dist/index247.js +12 -232
- package/dist/index247.js.map +1 -1
- package/dist/index248.js +4 -270
- package/dist/index248.js.map +1 -1
- package/dist/index249.js +313 -309
- package/dist/index249.js.map +1 -1
- package/dist/index25.js.map +1 -1
- package/dist/index250.js +60 -171
- package/dist/index250.js.map +1 -1
- package/dist/index251.js +252 -8
- package/dist/index251.js.map +1 -1
- package/dist/index252.js +268 -41
- package/dist/index252.js.map +1 -1
- package/dist/index253.js +316 -47
- package/dist/index253.js.map +1 -1
- package/dist/index254.js +179 -9
- package/dist/index254.js.map +1 -1
- package/dist/index255.js +6 -50
- package/dist/index255.js.map +1 -1
- package/dist/index256.js +41 -51
- package/dist/index256.js.map +1 -1
- package/dist/index257.js +50 -7
- package/dist/index257.js.map +1 -1
- package/dist/index258.js +9 -10
- package/dist/index258.js.map +1 -1
- package/dist/index259.js +51 -61
- package/dist/index259.js.map +1 -1
- package/dist/index26.js.map +1 -1
- package/dist/index260.js +53 -42
- package/dist/index260.js.map +1 -1
- package/dist/index261.js +9 -97
- package/dist/index261.js.map +1 -1
- package/dist/index262.js +31 -47
- package/dist/index262.js.map +1 -1
- package/dist/index263.js +61 -36
- package/dist/index263.js.map +1 -1
- package/dist/index264.js +43 -47
- package/dist/index264.js.map +1 -1
- package/dist/index265.js +92 -46
- package/dist/index265.js.map +1 -1
- package/dist/index266.js +48 -20
- package/dist/index266.js.map +1 -1
- package/dist/index267.js +33 -176
- package/dist/index267.js.map +1 -1
- package/dist/index268.js +49 -48
- package/dist/index268.js.map +1 -1
- package/dist/index269.js +68 -15
- package/dist/index269.js.map +1 -1
- package/dist/index27.js.map +1 -1
- package/dist/index270.js +20 -65
- package/dist/index270.js.map +1 -1
- package/dist/index271.js +202 -9
- package/dist/index271.js.map +1 -1
- package/dist/index272.js +48 -40
- package/dist/index272.js.map +1 -1
- package/dist/index273.js +60 -91
- package/dist/index273.js.map +1 -1
- package/dist/index274.js +9 -278
- package/dist/index274.js.map +1 -1
- package/dist/index275.js +38 -55
- package/dist/index275.js.map +1 -1
- package/dist/index276.js +91 -10
- package/dist/index276.js.map +1 -1
- package/dist/index277.js +278 -12
- package/dist/index277.js.map +1 -1
- package/dist/index278.js +58 -11
- package/dist/index278.js.map +1 -1
- package/dist/index279.js +11 -64
- package/dist/index279.js.map +1 -1
- package/dist/index28.js +5 -5
- package/dist/index28.js.map +1 -1
- package/dist/index280.js +12 -6
- package/dist/index280.js.map +1 -1
- package/dist/index281.js +3 -25
- package/dist/index281.js.map +1 -1
- package/dist/index282.js +3 -25
- package/dist/index282.js.map +1 -1
- package/dist/index283.js +12 -126
- package/dist/index283.js.map +1 -1
- package/dist/index284.js +63 -51
- package/dist/index284.js.map +1 -1
- package/dist/index285.js +5 -60
- package/dist/index285.js.map +1 -1
- package/dist/index286.js +24 -48
- package/dist/index286.js.map +1 -1
- package/dist/index287.js +24 -6
- package/dist/index287.js.map +1 -1
- package/dist/index288.js +125 -14
- package/dist/index288.js.map +1 -1
- package/dist/index289.js +51 -16
- package/dist/index289.js.map +1 -1
- package/dist/index29.js +5 -7
- package/dist/index29.js.map +1 -1
- package/dist/index290.js +56 -11
- package/dist/index290.js.map +1 -1
- package/dist/index291.js +47 -24
- package/dist/index291.js.map +1 -1
- package/dist/index292.js +7 -51
- package/dist/index292.js.map +1 -1
- package/dist/index293.js +15 -6
- package/dist/index293.js.map +1 -1
- package/dist/index294.js +18 -148
- package/dist/index294.js.map +1 -1
- package/dist/index295.js +12 -59
- package/dist/index295.js.map +1 -1
- package/dist/index296.js +25 -120
- package/dist/index296.js.map +1 -1
- package/dist/index297.js +54 -15
- package/dist/index297.js.map +1 -1
- package/dist/index298.js +5 -866
- package/dist/index298.js.map +1 -1
- package/dist/index299.js +148 -28
- package/dist/index299.js.map +1 -1
- package/dist/index3.js.map +1 -1
- package/dist/index30.js +6 -8
- package/dist/index30.js.map +1 -1
- package/dist/index300.js +55 -512
- package/dist/index300.js.map +1 -1
- package/dist/index301.js +111 -794
- package/dist/index301.js.map +1 -1
- package/dist/index302.js +14 -7436
- package/dist/index302.js.map +1 -1
- package/dist/index303.js +862 -6
- package/dist/index303.js.map +1 -1
- package/dist/index304.js +28 -12
- package/dist/index304.js.map +1 -1
- package/dist/index305.js +515 -5
- package/dist/index305.js.map +1 -1
- package/dist/index306.js +803 -5
- package/dist/index306.js.map +1 -1
- package/dist/index307.js +7426 -468
- package/dist/index307.js.map +1 -1
- package/dist/index308.js +6 -37
- package/dist/index308.js.map +1 -1
- package/dist/index309.js +12 -19
- package/dist/index309.js.map +1 -1
- package/dist/index31.js +5 -11
- package/dist/index31.js.map +1 -1
- package/dist/index310.js +5 -30
- package/dist/index310.js.map +1 -1
- package/dist/index311.js +5 -4
- package/dist/index311.js.map +1 -1
- package/dist/index312.js +461 -51
- package/dist/index312.js.map +1 -1
- package/dist/index313.js +36 -10
- package/dist/index313.js.map +1 -1
- package/dist/index314.js +19 -5
- package/dist/index314.js.map +1 -1
- package/dist/index315.js +29 -8
- package/dist/index315.js.map +1 -1
- package/dist/index316.js +4 -12
- package/dist/index316.js.map +1 -1
- package/dist/index317.js +60 -3
- package/dist/index317.js.map +1 -1
- package/dist/index318.js +10 -15
- package/dist/index318.js.map +1 -1
- package/dist/index319.js +5 -25
- package/dist/index319.js.map +1 -1
- package/dist/index32.js +5 -5
- package/dist/index32.js.map +1 -1
- package/dist/index320.js +9 -41
- package/dist/index320.js.map +1 -1
- package/dist/index321.js +11 -4
- package/dist/index321.js.map +1 -1
- package/dist/index322.js +3 -26
- package/dist/index322.js.map +1 -1
- package/dist/index323.js +15 -18
- package/dist/index323.js.map +1 -1
- package/dist/index324.js +22 -31
- package/dist/index324.js.map +1 -1
- package/dist/index325.js +41 -5
- package/dist/index325.js.map +1 -1
- package/dist/index326.js +4 -8
- package/dist/index326.js.map +1 -1
- package/dist/index327.js +25 -8
- package/dist/index327.js.map +1 -1
- package/dist/index328.js +19 -9
- package/dist/index328.js.map +1 -1
- package/dist/index329.js +34 -10
- package/dist/index329.js.map +1 -1
- package/dist/index33.js +9 -6
- package/dist/index33.js.map +1 -1
- package/dist/index330.js +5 -7
- package/dist/index330.js.map +1 -1
- package/dist/index331.js +9 -75
- package/dist/index331.js.map +1 -1
- package/dist/index332.js +8 -162
- package/dist/index332.js.map +1 -1
- package/dist/index333.js +9 -114
- package/dist/index333.js.map +1 -1
- package/dist/index334.js +10 -14
- package/dist/index334.js.map +1 -1
- package/dist/index335.js +7 -80
- package/dist/index335.js.map +1 -1
- package/dist/index336.js +68 -39
- package/dist/index336.js.map +1 -1
- package/dist/index337.js +160 -11
- package/dist/index337.js.map +1 -1
- package/dist/index338.js +113 -15
- package/dist/index338.js.map +1 -1
- package/dist/index339.js +13 -100
- package/dist/index339.js.map +1 -1
- package/dist/index34.js +6 -6
- package/dist/index34.js.map +1 -1
- package/dist/index340.js +73 -49
- package/dist/index340.js.map +1 -1
- package/dist/index341.js +34 -96
- package/dist/index341.js.map +1 -1
- package/dist/index342.js +12 -70
- package/dist/index342.js.map +1 -1
- package/dist/index343.js +14 -111
- package/dist/index343.js.map +1 -1
- package/dist/index344.js +94 -48
- package/dist/index344.js.map +1 -1
- package/dist/index345.js +50 -37
- package/dist/index345.js.map +1 -1
- package/dist/index346.js +89 -125
- package/dist/index346.js.map +1 -1
- package/dist/index347.js +52 -123
- package/dist/index347.js.map +1 -1
- package/dist/index348.js +54 -197
- package/dist/index348.js.map +1 -1
- package/dist/index349.js +44 -229
- package/dist/index349.js.map +1 -1
- package/dist/index35.js +9 -9
- package/dist/index35.js.map +1 -1
- package/dist/index350.js +42 -308
- package/dist/index350.js.map +1 -1
- package/dist/index351.js +144 -5
- package/dist/index351.js.map +1 -1
- package/dist/index352.js +142 -6
- package/dist/index352.js.map +1 -1
- package/dist/index353.js +257 -7
- package/dist/index353.js.map +1 -1
- package/dist/index354.js +241 -6
- package/dist/index354.js.map +1 -1
- package/dist/index355.js +309 -6
- package/dist/index355.js.map +1 -1
- package/dist/index356.js +5 -21
- package/dist/index356.js.map +1 -1
- package/dist/index357.js +6 -10
- package/dist/index357.js.map +1 -1
- package/dist/index358.js +7 -128
- package/dist/index358.js.map +1 -1
- package/dist/index359.js +6 -42
- package/dist/index359.js.map +1 -1
- package/dist/index36.js +12 -7
- package/dist/index36.js.map +1 -1
- package/dist/index360.js +6 -68
- package/dist/index360.js.map +1 -1
- package/dist/index361.js +20 -116
- package/dist/index361.js.map +1 -1
- package/dist/index362.js +10 -490
- package/dist/index362.js.map +1 -1
- package/dist/index363.js +128 -7
- package/dist/index363.js.map +1 -1
- package/dist/index364.js +42 -13
- package/dist/index364.js.map +1 -1
- package/dist/index365.js +67 -3
- package/dist/index365.js.map +1 -1
- package/dist/index366.js +115 -45
- package/dist/index366.js.map +1 -1
- package/dist/index367.js +490 -11
- package/dist/index367.js.map +1 -1
- package/dist/index368.js +8 -26
- package/dist/index368.js.map +1 -1
- package/dist/index369.js +12 -41
- package/dist/index369.js.map +1 -1
- package/dist/index37.js +13 -5
- package/dist/index37.js.map +1 -1
- package/dist/index370.js +4 -36
- package/dist/index370.js.map +1 -1
- package/dist/index371.js +45 -15
- package/dist/index371.js.map +1 -1
- package/dist/index372.js +24 -41
- package/dist/index372.js.map +1 -1
- package/dist/index373.js +3 -12
- package/dist/index373.js.map +1 -1
- package/dist/index374.js +27 -11
- package/dist/index374.js.map +1 -1
- package/dist/index375.js +40 -50
- package/dist/index375.js.map +1 -1
- package/dist/index376.js +37 -40
- package/dist/index376.js.map +1 -1
- package/dist/index377.js +12 -10
- package/dist/index377.js.map +1 -1
- package/dist/index378.js +40 -4
- package/dist/index378.js.map +1 -1
- package/dist/index379.js +7 -4
- package/dist/index379.js.map +1 -1
- package/dist/index38.js +5 -5
- package/dist/index38.js.map +1 -1
- package/dist/index380.js +29 -8
- package/dist/index380.js.map +1 -1
- package/dist/index381.js +9 -303
- package/dist/index381.js.map +1 -1
- package/dist/index382.js +57 -4
- package/dist/index382.js.map +1 -1
- package/dist/index383.js +40 -22
- package/dist/index383.js.map +1 -1
- package/dist/index384.js +15 -105
- package/dist/index384.js.map +1 -1
- package/dist/index385.js +5 -22
- package/dist/index385.js.map +1 -1
- package/dist/index386.js +10 -22
- package/dist/index386.js.map +1 -1
- package/dist/index387.js +289 -16
- package/dist/index387.js.map +1 -1
- package/dist/index388.js +4 -12
- package/dist/index388.js.map +1 -1
- package/dist/index389.js +20 -112
- package/dist/index389.js.map +1 -1
- package/dist/index39.js +6 -10
- package/dist/index39.js.map +1 -1
- package/dist/index390.js +3 -9
- package/dist/index390.js.map +1 -1
- package/dist/index391.js +104 -27
- package/dist/index391.js.map +1 -1
- package/dist/index392.js +20 -9
- package/dist/index392.js.map +1 -1
- package/dist/index393.js +20 -6
- package/dist/index393.js.map +1 -1
- package/dist/index394.js +14 -253
- package/dist/index394.js.map +1 -1
- package/dist/index395.js +12 -10
- package/dist/index395.js.map +1 -1
- package/dist/index396.js +117 -11
- package/dist/index396.js.map +1 -1
- package/dist/index397.js +8 -6
- package/dist/index397.js.map +1 -1
- package/dist/index398.js +32 -22
- package/dist/index398.js.map +1 -1
- package/dist/index399.js +9 -23
- package/dist/index399.js.map +1 -1
- package/dist/index4.js.map +1 -1
- package/dist/index40.js +8 -11
- package/dist/index40.js.map +1 -1
- package/dist/index400.js +6 -105
- package/dist/index400.js.map +1 -1
- package/dist/index401.js +3 -15
- package/dist/index401.js.map +1 -1
- package/dist/index402.js +251 -10
- package/dist/index402.js.map +1 -1
- package/dist/index403.js +9 -7
- package/dist/index403.js.map +1 -1
- package/dist/index404.js +11 -239
- package/dist/index404.js.map +1 -1
- package/dist/index405.js +7 -28
- package/dist/index405.js.map +1 -1
- package/dist/index406.js +21 -37
- package/dist/index406.js.map +1 -1
- package/dist/index407.js +21 -10
- package/dist/index407.js.map +1 -1
- package/dist/index408.js +97 -117
- package/dist/index408.js.map +1 -1
- package/dist/index409.js +15 -40
- package/dist/index409.js.map +1 -1
- package/dist/index41.js +6 -7
- package/dist/index41.js.map +1 -1
- package/dist/index410.js +11 -25
- package/dist/index410.js.map +1 -1
- package/dist/index411.js +7 -9
- package/dist/index411.js.map +1 -1
- package/dist/index412.js +3 -24
- package/dist/index412.js.map +1 -1
- package/dist/index413.js +226 -15
- package/dist/index413.js.map +1 -1
- package/dist/index414.js +24 -11
- package/dist/index414.js.map +1 -1
- package/dist/index415.js +38 -4
- package/dist/index415.js.map +1 -1
- package/dist/index416.js +11 -324
- package/dist/index416.js.map +1 -1
- package/dist/index417.js +119 -62
- package/dist/index417.js.map +1 -1
- package/dist/index418.js +42 -4
- package/dist/index418.js.map +1 -1
- package/dist/index419.js +25 -28
- package/dist/index419.js.map +1 -1
- package/dist/index42.js +6 -4
- package/dist/index42.js.map +1 -1
- package/dist/index420.js +11 -470
- package/dist/index420.js.map +1 -1
- package/dist/index421.js +23 -268
- package/dist/index421.js.map +1 -1
- package/dist/index422.js +24 -0
- package/dist/index422.js.map +1 -0
- package/dist/index423.js +17 -0
- package/dist/index423.js.map +1 -0
- package/dist/index424.js +8 -0
- package/dist/index424.js.map +1 -0
- package/dist/index425.js +328 -0
- package/dist/index425.js.map +1 -0
- package/dist/index426.js +66 -0
- package/dist/index426.js.map +1 -0
- package/dist/index427.js +7 -0
- package/dist/index427.js.map +1 -0
- package/dist/index428.js +31 -0
- package/dist/index428.js.map +1 -0
- package/dist/index429.js +474 -0
- package/dist/index429.js.map +1 -0
- package/dist/index43.js +68 -7
- package/dist/index43.js.map +1 -1
- package/dist/index430.js +272 -0
- package/dist/index430.js.map +1 -0
- package/dist/index44.js +7 -6
- package/dist/index44.js.map +1 -1
- package/dist/index45.js +31 -7
- package/dist/index45.js.map +1 -1
- package/dist/index46.js +10 -10
- package/dist/index46.js.map +1 -1
- package/dist/index47.js +15 -13
- package/dist/index47.js.map +1 -1
- package/dist/index48.js +201 -7
- package/dist/index48.js.map +1 -1
- package/dist/index49.js +20 -6
- package/dist/index49.js.map +1 -1
- package/dist/index5.js.map +1 -1
- package/dist/index50.js +16 -6
- package/dist/index50.js.map +1 -1
- package/dist/index51.js +123 -14
- package/dist/index51.js.map +1 -1
- package/dist/index52.js +19 -8
- package/dist/index52.js.map +1 -1
- package/dist/index53.js +5 -7
- package/dist/index53.js.map +1 -1
- package/dist/index54.js +9 -68
- package/dist/index54.js.map +1 -1
- package/dist/index55.js +7 -7
- package/dist/index55.js.map +1 -1
- package/dist/index56.js +9 -31
- package/dist/index56.js.map +1 -1
- package/dist/index57.js +13 -10
- package/dist/index57.js.map +1 -1
- package/dist/index58.js +8 -15
- package/dist/index58.js.map +1 -1
- package/dist/index59.js +10 -201
- package/dist/index59.js.map +1 -1
- package/dist/index6.js.map +1 -1
- package/dist/index60.js +13 -20
- package/dist/index60.js.map +1 -1
- package/dist/index61.js +9 -16
- package/dist/index61.js.map +1 -1
- package/dist/index62.js +10 -123
- package/dist/index62.js.map +1 -1
- package/dist/index63.js +5 -19
- package/dist/index63.js.map +1 -1
- package/dist/index64.js +42 -9
- package/dist/index64.js.map +1 -1
- package/dist/index65.js +387 -9
- package/dist/index65.js.map +1 -1
- package/dist/index66.js +37 -14
- package/dist/index66.js.map +1 -1
- package/dist/index67.js +21 -9
- package/dist/index67.js.map +1 -1
- package/dist/index68.js +4 -9
- package/dist/index68.js.map +1 -1
- package/dist/index69.js +6 -4
- package/dist/index69.js.map +1 -1
- package/dist/index7.js +3 -3
- package/dist/index7.js.map +1 -1
- package/dist/index70.js +57 -41
- package/dist/index70.js.map +1 -1
- package/dist/index71.js +5 -387
- package/dist/index71.js.map +1 -1
- package/dist/index72.js +6 -37
- package/dist/index72.js.map +1 -1
- package/dist/index73.js +5 -21
- package/dist/index73.js.map +1 -1
- package/dist/index74.js +4 -56
- package/dist/index74.js.map +1 -1
- package/dist/index75.js +7 -7
- package/dist/index75.js.map +1 -1
- package/dist/index76.js +6 -5
- package/dist/index76.js.map +1 -1
- package/dist/index77.js +6 -5
- package/dist/index77.js.map +1 -1
- package/dist/index78.js +11 -5
- package/dist/index78.js.map +1 -1
- package/dist/index79.js +11 -5
- package/dist/index79.js.map +1 -1
- package/dist/index8.js.map +1 -1
- package/dist/index80.js +7 -6
- package/dist/index80.js.map +1 -1
- package/dist/index81.js +10 -6
- package/dist/index81.js.map +1 -1
- package/dist/index82.js +5 -8
- package/dist/index82.js.map +1 -1
- package/dist/index83.js +6 -7
- package/dist/index83.js.map +1 -1
- package/dist/index84.js.map +1 -1
- package/dist/index85.js.map +1 -1
- package/dist/index86.js.map +1 -1
- package/dist/index87.js +2 -2
- package/dist/index87.js.map +1 -1
- package/dist/index88.js +31 -31
- package/dist/index88.js.map +1 -1
- package/dist/index89.js +1 -1
- package/dist/index89.js.map +1 -1
- package/dist/index9.js.map +1 -1
- package/dist/index90.js.map +1 -1
- package/dist/index91.js.map +1 -1
- package/dist/index92.js.map +1 -1
- package/dist/index93.js.map +1 -1
- package/dist/index94.js.map +1 -1
- package/dist/index95.js.map +1 -1
- package/dist/index96.js.map +1 -1
- package/dist/index97.js.map +1 -1
- package/dist/index98.js.map +1 -1
- package/dist/index99.js.map +1 -1
- package/package.json +13 -13
- package/dist/assets/sha256.worker-BEf4_Y9w.js.map +0 -1
package/dist/index301.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index301.js","names":["<HourPickerSelectField {...props} />","<HourPickerInput {...props} />","{\n id,\n placeholder,\n value,\n onValueUpdate,\n onCommit,\n options,\n selectedLabel,\n disabled,\n readOnly,\n open,\n setOpen,\n inputClassName,\n triggerTestId,\n isHydrated,\n highlightedValueRef,\n setHighlightedValue,\n markKeyboardNavigation,\n inputRef,\n onDraftValueHandlerChange,\n}: HourPickerMaskedSelectTriggerProps","() => (value ? value : \"\")","() => {\n onDraftValueHandlerChange((nextValue) => {\n setDraft(nextValue)\n })\n return () => {\n onDraftValueHandlerChange(null)\n }\n }","[onDraftValueHandlerChange]","(direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n }","highlightedValueRef.current","React.useCallback(\n (direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n },\n [highlightedValueRef, onValueUpdate, options, setHighlightedValue, value],\n )","() => {\n if (isEditingRef.current) return\n setDraft(value ? value : \"\")\n }","[value]","() => {\n lastAcceptedSignatureRef.current = getAcceptedInputSignature(draft)\n }","[draft]","() => {\n if (value === null) {\n clearCommitPendingRef.current = false\n }\n }","cn(\n \"peer flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"transition-colors group-hover:bg-accent group-hover:text-accent-foreground\",\n !draft && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n value && selectedLabel != null && \"text-transparent focus:text-foreground\",\n )","!draft && \"text-muted-foreground\"","open && \"ring-2 ring-primary ring-offset-2\"","value && selectedLabel != null && \"text-transparent focus:text-foreground\"","[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]","(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }","option","(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }","(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }","event","nextText","() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }","(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }","() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }","(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }","resolved","(option) => isOptionSelectable(option)","targetMinutes","closestOption","(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }","() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }","<IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />","isHydrated ? \"true\" : undefined","value && selectedLabel != null ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"hours-picker-input-selected-label\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n </span>\n ) : null","cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )","() => {\n if (disabled) return\n setOpen(!open)\n }","<ChevronDown aria-hidden className=\"size-4\" />","<button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>","open ? \"Close time picker\" : \"Open time picker\"","(event) => {\n event.preventDefault()\n }","<div className=\"relative group\">\n <IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />\n\n {value && selectedLabel != null ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"hours-picker-input-selected-label\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n </span>\n ) : null}\n\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>\n </div>"],"sources":["../src/components/HourPickerField/index.tsx"],"sourcesContent":["import { Check, ChevronDown, ChevronUp } from \"lucide-react\"\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { IMaskInput } from \"react-imask\"\nimport IMask, { InputMask } from \"imask\"\n\nimport { useIsTouchDevice } from \"@/helpers/useIsTouchDevice\"\nimport { cn } from \"@/lib/utils\"\n\n\n// WARNING: used to preserve input mask even with tree shaking\n// DO NOT REMOVE THIS CODE OR THIS COMMENT\nconst imaskAny = IMask as any\nif (typeof imaskAny.InputMask !== \"function\") {\n imaskAny.InputMask = InputMask\n}\n\n\nexport type HourPickerOption = {\n value: string\n label: string\n selectedLabel?: React.ReactNode\n disabled?: boolean\n description?: React.ReactNode\n}\n\nfunction pad2(value: number) {\n return String(value).padStart(2, \"0\")\n}\n\nfunction parseTimeInput(raw: string) {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(trimmed)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {\n return null\n }\n\n return `${pad2(hours)}:${pad2(minutes)}`\n}\n\nfunction getAcceptedInputSignature(raw: string) {\n const parsed = parseTimeInput(raw)\n if (parsed) {\n return `parsed:${parsed}`\n }\n\n const digits = raw.replace(/\\D/g, \"\")\n if (!digits) {\n return \"empty\"\n }\n\n if (digits.length <= 2) {\n return `hour:${Number(digits)}`\n }\n\n const minutePart = digits.slice(-2)\n const hourPart = digits.slice(0, -2)\n return `hour-minute:${Number(hourPart)}:${minutePart}`\n}\n\ntype ParsedTimeInputResult = {\n parsed: string\n selectableValue: string | null\n}\n\nfunction parseTimeInputWithSelectableOption(raw: string, options: HourPickerOption[]): ParsedTimeInputResult | null {\n const parsed = parseTimeInput(raw)\n if (!parsed) return null\n\n const parsedOption = options.find((option) => option.value === parsed)\n if (isOptionSelectable(parsedOption)) {\n return { parsed, selectableValue: parsed }\n }\n\n return { parsed, selectableValue: null }\n}\n\nfunction timeStringToMinutes(value: string) {\n const match = /^(\\d{2}):(\\d{2})$/.exec(value)\n if (!match) {\n return null\n }\n\n const hours = Number(match[1])\n const minutes = Number(match[2])\n\n if (!Number.isFinite(hours) || !Number.isFinite(minutes)) {\n return null\n }\n\n return hours * 60 + minutes\n}\n\nfunction isOptionSelectable(option: HourPickerOption | undefined) {\n if (!option) return false\n return !option.disabled\n}\n\nfunction findClosestSelectableOption(targetMinutes: number, options: HourPickerOption[]) {\n let bestOption: HourPickerOption | null = null\n let bestDiff = Number.POSITIVE_INFINITY\n let bestMinutes = Number.NEGATIVE_INFINITY\n\n for (const option of options) {\n if (!isOptionSelectable(option)) continue\n const optionMinutes = timeStringToMinutes(option.value)\n if (optionMinutes == null) continue\n\n const diff = Math.abs(optionMinutes - targetMinutes)\n if (diff < bestDiff || (diff === bestDiff && optionMinutes > bestMinutes)) {\n bestOption = option\n bestDiff = diff\n bestMinutes = optionMinutes\n }\n }\n\n return bestOption\n}\n\ntype HourPickerScrollButtonDirection = \"up\" | \"down\"\n\ntype HourPickerScrollButtonProps = {\n direction: HourPickerScrollButtonDirection\n viewportRef: React.RefObject<HTMLElement | null>\n speed?: number\n className?: string\n}\n\nfunction HourPickerScrollButton({\n direction,\n viewportRef,\n speed = 400,\n className,\n}: HourPickerScrollButtonProps) {\n const [disabled, setDisabled] = React.useState(true)\n const animationRef = React.useRef<number | undefined>(undefined)\n const lastTimeRef = React.useRef<number | undefined>(undefined)\n const isScrollingRef = React.useRef(false)\n\n const checkScrollability = React.useCallback(() => {\n const viewport = viewportRef.current\n if (!viewport) {\n setDisabled(true)\n return\n }\n\n const { scrollTop, scrollHeight, clientHeight } = viewport\n const tolerance = 2\n\n const canScrollUp = scrollTop > tolerance\n const canScrollDown = scrollTop < (scrollHeight - clientHeight - tolerance)\n const hasScrollableContent = scrollHeight > clientHeight + tolerance\n\n if (!hasScrollableContent) {\n setDisabled(true)\n return\n }\n\n const shouldDisable = direction === \"up\" ? !canScrollUp : !canScrollDown\n setDisabled(shouldDisable)\n }, [direction, viewportRef])\n\n React.useEffect(() => {\n const viewport = viewportRef.current\n if (!viewport) return\n\n checkScrollability()\n\n const handleScroll = () => checkScrollability()\n const handleResize = () => checkScrollability()\n\n viewport.addEventListener(\"scroll\", handleScroll, { passive: true })\n\n const resizeObserver = new ResizeObserver(handleResize)\n resizeObserver.observe(viewport)\n\n const mutationObserver = new MutationObserver(handleResize)\n mutationObserver.observe(viewport, { childList: true, subtree: true })\n\n return () => {\n viewport.removeEventListener(\"scroll\", handleScroll)\n resizeObserver.disconnect()\n mutationObserver.disconnect()\n }\n }, [viewportRef, checkScrollability])\n\n const stopScrolling = React.useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = undefined\n }\n isScrollingRef.current = false\n lastTimeRef.current = undefined\n }, [])\n\n const smoothScroll = React.useCallback(\n (currentTime: number) => {\n const viewport = viewportRef.current\n if (!viewport || disabled || !isScrollingRef.current) {\n stopScrolling()\n return\n }\n\n if (!lastTimeRef.current) {\n lastTimeRef.current = currentTime\n }\n\n const deltaTime = currentTime - lastTimeRef.current\n const distance = (speed * deltaTime) / 1000\n\n if (distance < 0.1) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n return\n }\n\n const oldScrollTop = viewport.scrollTop\n const maxScroll = viewport.scrollHeight - viewport.clientHeight\n\n let newScrollTop: number\n if (direction === \"up\") {\n newScrollTop = Math.max(0, oldScrollTop - distance)\n } else {\n newScrollTop = Math.min(maxScroll, oldScrollTop + distance)\n }\n\n viewport.scrollTo({ top: newScrollTop })\n\n lastTimeRef.current = currentTime\n\n const tolerance = 1\n const canContinue =\n direction === \"up\"\n ? newScrollTop > tolerance\n : newScrollTop < (maxScroll - tolerance)\n\n if (canContinue && Math.abs(newScrollTop - oldScrollTop) > 0.01) {\n animationRef.current = requestAnimationFrame(smoothScroll)\n } else {\n stopScrolling()\n setTimeout(checkScrollability, 16)\n }\n },\n [checkScrollability, direction, disabled, speed, stopScrolling, viewportRef],\n )\n\n const startScrolling = React.useCallback(() => {\n if (disabled || !viewportRef.current || isScrollingRef.current) return\n\n isScrollingRef.current = true\n lastTimeRef.current = undefined\n animationRef.current = requestAnimationFrame(smoothScroll)\n }, [disabled, smoothScroll, viewportRef])\n\n React.useEffect(() => stopScrolling, [stopScrolling])\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center py-1 select-none\",\n disabled ? \"cursor-default opacity-40\" : \"cursor-pointer opacity-100 hover:bg-accent/20\",\n className\n )}\n onPointerEnter={() => {\n if (!disabled) startScrolling()\n }}\n onPointerMove={() => {\n if (!disabled && !isScrollingRef.current) startScrolling()\n }}\n onPointerLeave={() => {\n stopScrolling()\n }}\n >\n {direction === \"up\"\n ? <ChevronUp aria-hidden className=\"h-4 w-4 opacity-50\" />\n : <ChevronDown aria-hidden className=\"h-4 w-4 opacity-50\" />}\n </div>\n )\n}\n\nexport type HourPickerInputProps = {\n id?: string\n value: string | null\n onChange: (value: string | null) => void\n onValueUpdate?: (value: string | null) => void\n options: HourPickerOption[]\n placeholder?: string\n className?: string\n inputClassName?: string\n disabled?: boolean\n readOnly?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n triggerTestId?: string\n contentTestId?: string\n isHydrated?: boolean\n}\n\nexport function HourPickerInput({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open: openProp,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerInputProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerInputRef = React.useRef<HTMLInputElement | null>(null)\n const setTriggerDraftValueRef = React.useRef<((value: string) => void) | null>(null)\n const setTriggerDraftValueHandler = React.useCallback((handler: ((value: string) => void) | null) => {\n setTriggerDraftValueRef.current = handler\n }, [])\n const highlightedValueRef = React.useRef<string | null>(null)\n const keyboardNavigationActiveRef = React.useRef(false)\n const [highlightedValue, setHighlightedValue] = React.useState<string | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const desktopPopoverRef = React.useRef<HTMLDivElement | null>(null)\n const desktopContentRef = React.useRef<HTMLDivElement | null>(null)\n const [desktopPopoverPosition, setDesktopPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const open = openProp ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = open\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (disabled || readOnly) {\n return\n }\n\n const input = triggerInputRef.current\n if (!(input instanceof HTMLInputElement)) {\n return\n }\n if (typeof document !== \"undefined\" && document.activeElement === input) {\n return\n }\n\n input.focus({ preventScroll: true })\n }, [disabled, open, readOnly])\n\n const updateHighlightedValue = React.useCallback((next: string | null) => {\n highlightedValueRef.current = next\n setHighlightedValue(next)\n }, [])\n\n const markKeyboardNavigation = React.useCallback(() => {\n keyboardNavigationActiveRef.current = true\n }, [])\n\n React.useEffect(() => {\n if (!open) return\n\n const currentOption = options.find((option) => option.value === value)\n if (currentOption && isOptionSelectable(currentOption)) {\n updateHighlightedValue(currentOption.value)\n return\n }\n\n const firstEnabled = options.find((option) => isOptionSelectable(option))\n updateHighlightedValue(firstEnabled?.value ?? null)\n }, [open, options, updateHighlightedValue, value])\n\n const updateValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n },\n [onValueUpdate, options],\n )\n\n const commitValue = React.useCallback(\n (next: string | null) => {\n if (next === null) {\n if (onValueUpdate) {\n onValueUpdate(null)\n }\n onChange(null)\n return\n }\n\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n React.useEffect(() => {\n if (!open) return\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (!container) {\n return\n }\n\n if (container.contains(target)) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return\n }\n if (!openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = desktopPopoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [open, setOpen])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n\n const popover = desktopPopoverRef.current\n if (!popover) {\n return\n }\n\n const handleWheel = (event: WheelEvent) => {\n const viewport = desktopContentRef.current\n if (!viewport) {\n return\n }\n\n const deltaY = event.deltaY\n if (deltaY === 0) {\n return\n }\n\n const maxScrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight)\n const atTop = viewport.scrollTop <= 0\n const atBottom = viewport.scrollTop >= maxScrollTop\n\n const target = event.target\n const isWheelOverViewport = target instanceof Node && viewport.contains(target)\n\n if (isWheelOverViewport) {\n if ((deltaY < 0 && atTop) || (deltaY > 0 && atBottom)) {\n event.preventDefault()\n }\n return\n }\n\n event.preventDefault()\n const nextScrollTop = Math.min(maxScrollTop, Math.max(0, viewport.scrollTop + deltaY))\n viewport.scrollTop = nextScrollTop\n }\n\n popover.addEventListener(\"wheel\", handleWheel, { passive: false })\n return () => {\n popover.removeEventListener(\"wheel\", handleWheel)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!open) {\n return\n }\n if (openProp !== undefined && !onOpenChange) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n if (!(\"IntersectionObserver\" in window)) {\n return\n }\n\n const trigger = triggerInputRef.current\n if (!(trigger instanceof HTMLElement)) {\n return\n }\n\n let isActive = true\n const observer = new IntersectionObserver(entries => {\n if (!isActive) {\n return\n }\n const entry = entries[0]\n if (entry && !entry.isIntersecting) {\n setOpen(false)\n }\n })\n observer.observe(trigger)\n return () => {\n isActive = false\n observer.disconnect()\n }\n }, [onOpenChange, open, openProp, setOpen])\n\n const updateDesktopPopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") return\n\n const trigger = triggerInputRef.current\n const popover = desktopPopoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) return\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setDesktopPopoverPosition({ left, top, width })\n }, [])\n\n // React Compiler rejects hook aliasing (useIsomorphicLayoutEffect pattern), so we\n // call useLayoutEffect directly and keep the SSR guard inside the effect.\n React.useLayoutEffect(() => {\n if (!open || disabled) return\n if (typeof window === \"undefined\") return\n\n updateDesktopPopoverPosition()\n const rafId = window.requestAnimationFrame(updateDesktopPopoverPosition)\n\n window.addEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.addEventListener(\"resize\", updateDesktopPopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updateDesktopPopoverPosition, true)\n window.removeEventListener(\"resize\", updateDesktopPopoverPosition)\n }\n }, [disabled, open, updateDesktopPopoverPosition])\n\n React.useEffect(() => {\n if (!open) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const run = () => {\n const selected = viewport.querySelector(\"[role=\\\"option\\\"][data-state=\\\"checked\\\"]\")\n if (selected instanceof HTMLElement) {\n const padding = 8\n const targetTop = selected.offsetTop - padding\n const targetBottom = selected.offsetTop + selected.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n return\n }\n\n const all = Array.from(viewport.querySelectorAll(\"[role=\\\"option\\\"]\")) as HTMLElement[]\n if (!all.length) return\n\n let firstEnabled: HTMLElement | undefined\n let lastDisabledBefore: HTMLElement | undefined\n\n for (const el of all) {\n const isDisabled = el.hasAttribute(\"data-disabled\")\n if (!isDisabled) {\n firstEnabled = el\n break\n }\n lastDisabledBefore = el\n }\n\n if (!firstEnabled) return\n\n const target = lastDisabledBefore ? lastDisabledBefore : firstEnabled\n\n const offset = Math.max(0, target.offsetTop - 8)\n viewport.scrollTop = offset\n }\n\n const raf = requestAnimationFrame(run)\n return () => cancelAnimationFrame(raf)\n }, [open, options])\n\n React.useEffect(() => {\n if (!open) return\n if (!highlightedValue) return\n if (!keyboardNavigationActiveRef.current) return\n\n const viewport = desktopContentRef.current\n if (!viewport) return\n\n const target = viewport.querySelector(`[role=\"option\"][data-value=\"${highlightedValue}\"]`)\n if (!(target instanceof HTMLElement)) return\n\n const padding = 8\n const targetTop = target.offsetTop - padding\n const targetBottom = target.offsetTop + target.offsetHeight + padding\n\n if (targetTop < viewport.scrollTop) {\n viewport.scrollTop = Math.max(0, targetTop)\n return\n }\n\n const viewportBottom = viewport.scrollTop + viewport.clientHeight\n if (targetBottom > viewportBottom) {\n viewport.scrollTop = Math.max(0, targetBottom - viewport.clientHeight)\n }\n }, [highlightedValue, open])\n\n const selectedOption = options.find((option) => option.value === value)\n\n return (\n <div\n data-slot=\"hours-picker-input\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <div className=\"relative\">\n <HourPickerMaskedSelectTrigger\n id={triggerId}\n placeholder={placeholder}\n value={value}\n onValueUpdate={updateValue}\n onCommit={commitValue}\n options={options}\n selectedLabel={selectedOption?.selectedLabel}\n disabled={disabled}\n readOnly={readOnly}\n open={open}\n setOpen={setOpen}\n inputClassName={inputClassName}\n triggerTestId={triggerTestId}\n isHydrated={isHydrated}\n highlightedValueRef={highlightedValueRef}\n setHighlightedValue={updateHighlightedValue}\n markKeyboardNavigation={markKeyboardNavigation}\n inputRef={(node) => {\n triggerInputRef.current = node\n }}\n onDraftValueHandlerChange={setTriggerDraftValueHandler}\n />\n\n {open ? (() => {\n const popover = (\n <>\n <div\n ref={desktopPopoverRef}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"pointer-events-auto fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: desktopPopoverPosition.left,\n top: desktopPopoverPosition.top,\n width: desktopPopoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={desktopContentRef}\n />\n\n <div\n ref={desktopContentRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n highlightedValue === option.value && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled) return\n\n setTriggerDraftValueRef.current?.(option.value)\n updateHighlightedValue(option.value)\n triggerInputRef.current?.focus({ preventScroll: true })\n commitValue(option.value)\n setOpen(false)\n }}\n onPointerEnter={() => {\n if (keyboardNavigationActiveRef.current) return\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n onPointerMove={(event) => {\n if (keyboardNavigationActiveRef.current && event.movementX === 0 && event.movementY === 0) {\n return\n }\n keyboardNavigationActiveRef.current = false\n updateHighlightedValue(option.value)\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={desktopContentRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return popover\n return createPortal(popover, document.body)\n })() : null}\n </div>\n </div>\n )\n}\n\nHourPickerInput.displayName = \"HourPickerInput\"\n\nexport type HourPickerFieldProps = HourPickerInputProps\n\nfunction HourPickerSelectField({\n id,\n value,\n onChange,\n onValueUpdate,\n options,\n placeholder = \"Select time\",\n className,\n inputClassName,\n disabled,\n readOnly,\n open,\n onOpenChange,\n triggerTestId,\n contentTestId,\n isHydrated,\n}: HourPickerFieldProps) {\n const reactId = React.useId()\n const triggerId = id ?? `hours-picker-${reactId}`\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const popoverRef = React.useRef<HTMLDivElement | null>(null)\n const viewportRef = React.useRef<HTMLDivElement | null>(null)\n const [popoverPosition, setPopoverPosition] = React.useState(() => ({\n left: 0,\n top: 0,\n width: 0,\n }))\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false)\n const resolvedOpen = open ?? uncontrolledOpen\n const setOpen = onOpenChange ?? setUncontrolledOpen\n const openRef = React.useRef(false)\n openRef.current = resolvedOpen\n\n const commitValue = React.useCallback(\n (next: string) => {\n const matchingOption = options.find((option) => option.value === next)\n if (!isOptionSelectable(matchingOption)) {\n return\n }\n\n if (onValueUpdate) {\n onValueUpdate(next)\n }\n onChange(next)\n },\n [onChange, onValueUpdate, options],\n )\n\n const updatePopoverPosition = React.useCallback(() => {\n if (typeof window === \"undefined\") {\n return\n }\n\n const trigger = triggerRef.current\n const popover = popoverRef.current\n if (!(trigger instanceof HTMLElement) || !popover) {\n return\n }\n\n const rect = trigger.getBoundingClientRect()\n const popoverHeight = popover.offsetHeight\n const viewportWidth = window.innerWidth ?? 0\n const viewportHeight = window.innerHeight ?? 0\n const padding = 8\n const width = rect.width\n\n let left = rect.left\n if (left + width > viewportWidth - padding) {\n left = Math.max(padding, viewportWidth - width - padding)\n }\n if (left < padding) {\n left = padding\n }\n\n let top = rect.bottom + padding\n const overflowBottom = top + popoverHeight > viewportHeight - padding\n const aboveTop = rect.top - popoverHeight - padding\n if (overflowBottom && aboveTop >= padding) {\n top = aboveTop\n }\n\n if (top < padding) {\n top = padding\n }\n if (top + popoverHeight > viewportHeight - padding) {\n top = Math.max(padding, viewportHeight - popoverHeight - padding)\n }\n\n setPopoverPosition({ left, top, width })\n }, [])\n\n React.useLayoutEffect(() => {\n if (!resolvedOpen || disabled) {\n return\n }\n if (typeof window === \"undefined\") {\n return\n }\n\n updatePopoverPosition()\n const rafId = window.requestAnimationFrame(updatePopoverPosition)\n\n window.addEventListener(\"scroll\", updatePopoverPosition, true)\n window.addEventListener(\"resize\", updatePopoverPosition)\n return () => {\n window.cancelAnimationFrame(rafId)\n window.removeEventListener(\"scroll\", updatePopoverPosition, true)\n window.removeEventListener(\"resize\", updatePopoverPosition)\n }\n }, [disabled, resolvedOpen, updatePopoverPosition])\n\n React.useEffect(() => {\n if (!resolvedOpen) {\n return\n }\n\n const ownerDocument = containerRef.current?.ownerDocument ?? document\n const ownerWindow = ownerDocument.defaultView ?? window\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n if (container?.contains(target)) {\n return\n }\n\n const popover = popoverRef.current\n if (popover?.contains(target)) {\n return\n }\n\n setOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !openRef.current) {\n return\n }\n\n const target = event.target\n if (!(target instanceof Node)) {\n return\n }\n\n const container = containerRef.current\n const popover = popoverRef.current\n if (!container?.contains(target) && !popover?.contains(target)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }\n\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.addEventListener(\"keydown\", handleKeyDown, true)\n return () => {\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown, true)\n ownerWindow.removeEventListener(\"keydown\", handleKeyDown, true)\n }\n }, [resolvedOpen, setOpen])\n\n const selectedOption = options.find((option) => option.value === value)\n const selectedLabel = selectedOption?.selectedLabel ?? selectedOption?.label ?? value\n\n return (\n <div\n data-slot=\"hours-picker-field\"\n className={cn(\"w-[150px]\", className)}\n ref={containerRef}\n >\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={resolvedOpen}\n aria-controls={`${triggerId}-content`}\n disabled={disabled}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n \"hover:bg-accent hover:text-accent-foreground\",\n !value && \"text-muted-foreground\",\n resolvedOpen && \"ring-2 ring-primary ring-offset-2\",\n inputClassName,\n )}\n onClick={() => {\n if (disabled || readOnly) {\n return\n }\n setOpen(!resolvedOpen)\n }}\n >\n <span className=\"line-clamp-1 text-left\">\n {value ? selectedLabel : placeholder}\n </span>\n <ChevronDown aria-hidden className=\"h-4 w-4 shrink-0 opacity-50\" />\n </button>\n\n {resolvedOpen ? (() => {\n const popover = (\n <>\n <div\n ref={popoverRef}\n id={`${triggerId}-content`}\n data-testid={contentTestId}\n data-state=\"open\"\n className={cn(\n \"fixed z-[60] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n )}\n style={{\n left: popoverPosition.left,\n top: popoverPosition.top,\n width: popoverPosition.width,\n }}\n >\n <HourPickerScrollButton\n direction=\"up\"\n viewportRef={viewportRef}\n />\n\n <div\n ref={viewportRef}\n role=\"listbox\"\n className=\"max-h-64 overflow-y-auto p-1 [overscroll-behavior:contain] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\"\n >\n {options.map((option) => {\n const isChecked = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isChecked}\n data-value={option.value}\n data-state={isChecked ? \"checked\" : \"unchecked\"}\n data-disabled={option.disabled ? \"\" : undefined}\n className={cn(\n \"relative flex w-full select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none cursor-pointer\",\n option.disabled && \"pointer-events-none opacity-50\",\n isChecked && \"bg-accent text-accent-foreground\",\n )}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (option.disabled || readOnly) {\n return\n }\n\n commitValue(option.value)\n setOpen(false)\n triggerRef.current?.focus({ preventScroll: true })\n }}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {isChecked ? <Check aria-hidden className=\"h-4 w-4\" /> : null}\n </span>\n\n <div className=\"flex flex-col\">\n <span>{option.label}</span>\n {option.description != null ? (\n <span data-slot=\"description\" className=\"text-xs text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n\n <HourPickerScrollButton\n direction=\"down\"\n viewportRef={viewportRef}\n />\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") {\n return popover\n }\n\n return createPortal(popover, document.body)\n })() : null}\n </div>\n )\n}\n\nexport function HourPickerField(props: HourPickerFieldProps) {\n const isTouchDevice = useIsTouchDevice()\n\n if (isTouchDevice) {\n return <HourPickerSelectField {...props} />\n }\n\n return <HourPickerInput {...props} />\n}\n\nHourPickerField.displayName = \"HourPickerField\"\n\ntype HourPickerMaskedSelectTriggerProps = {\n id: string\n placeholder: string\n value: string | null\n onValueUpdate: (value: string | null) => void\n onCommit: (value: string | null) => void\n options: HourPickerOption[]\n selectedLabel?: React.ReactNode\n disabled?: boolean\n readOnly?: boolean\n open: boolean\n setOpen: (open: boolean) => void\n inputClassName?: string\n triggerTestId?: string\n isHydrated?: boolean\n highlightedValueRef: React.MutableRefObject<string | null>\n setHighlightedValue: (value: string | null) => void\n markKeyboardNavigation: () => void\n inputRef: (node: HTMLInputElement | null) => void\n onDraftValueHandlerChange: (handler: ((value: string) => void) | null) => void\n}\n\nfunction HourPickerMaskedSelectTrigger({\n id,\n placeholder,\n value,\n onValueUpdate,\n onCommit,\n options,\n selectedLabel,\n disabled,\n readOnly,\n open,\n setOpen,\n inputClassName,\n triggerTestId,\n isHydrated,\n highlightedValueRef,\n setHighlightedValue,\n markKeyboardNavigation,\n inputRef,\n onDraftValueHandlerChange,\n}: HourPickerMaskedSelectTriggerProps) {\n const isEditingRef = React.useRef(false)\n const pointerDownOnInputRef = React.useRef(false)\n const inputWasFocusedOnPointerDownRef = React.useRef(false)\n const ignoreNextMaskCommitValueRef = React.useRef<string | null>(null)\n const lastAcceptedSignatureRef = React.useRef<string | null>(null)\n const clearCommitPendingRef = React.useRef(false)\n\n const [draft, setDraft] = React.useState(() => (value ? value : \"\"))\n\n React.useEffect(() => {\n onDraftValueHandlerChange((nextValue) => {\n setDraft(nextValue)\n })\n return () => {\n onDraftValueHandlerChange(null)\n }\n }, [onDraftValueHandlerChange])\n\n const moveSelection = React.useCallback(\n (direction: -1 | 1) => {\n const base = highlightedValueRef.current ?? value ?? \"\"\n\n let baseIndex = options.findIndex((option) => option.value === base)\n if (baseIndex === -1) {\n baseIndex = direction === 1 ? -1 : options.length\n }\n\n for (let nextIndex = baseIndex + direction; nextIndex >= 0 && nextIndex < options.length; nextIndex += direction) {\n const nextOption = options[nextIndex]\n if (!isOptionSelectable(nextOption)) continue\n\n setHighlightedValue(nextOption.value)\n ignoreNextMaskCommitValueRef.current = nextOption.value\n setDraft(nextOption.value)\n onValueUpdate(nextOption.value)\n return\n }\n },\n [highlightedValueRef, onValueUpdate, options, setHighlightedValue, value],\n )\n\n React.useEffect(() => {\n if (isEditingRef.current) return\n setDraft(value ? value : \"\")\n }, [value])\n\n React.useEffect(() => {\n lastAcceptedSignatureRef.current = getAcceptedInputSignature(draft)\n }, [draft])\n\n React.useEffect(() => {\n if (value === null) {\n clearCommitPendingRef.current = false\n }\n }, [value])\n\n const triggerClassName = cn(\n \"peer flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 pr-10 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"transition-colors group-hover:bg-accent group-hover:text-accent-foreground\",\n !draft && \"text-muted-foreground\",\n open && \"ring-2 ring-primary ring-offset-2\",\n \"[&_[data-slot='description']]:hidden\",\n inputClassName,\n value && selectedLabel != null && \"text-transparent focus:text-foreground\",\n )\n\n return (\n <div className=\"relative group\">\n <IMaskInput\n id={id}\n data-testid={triggerTestId}\n data-hydrated={isHydrated ? \"true\" : undefined}\n type=\"text\"\n disabled={disabled}\n readOnly={readOnly}\n inputRef={inputRef}\n autoComplete={\"off\"}\n mask={[\n { mask: \"00:00\", lazy: true },\n { mask: \"0:00\", lazy: true },\n ]}\n dispatch={(appended, dynamicMasked) => {\n const digits = (dynamicMasked.value + appended).replace(/\\D/g, \"\")\n if (digits.length <= 2) return dynamicMasked.compiledMasks[0]\n if (digits.length >= 4) return dynamicMasked.compiledMasks[0]\n\n const hourPrefix = pad2(Number(digits.slice(0, 2)))\n const hasTwoDigitHour = options.some((option) => option.value.startsWith(`${hourPrefix}:`))\n if (hasTwoDigitHour) return dynamicMasked.compiledMasks[0]\n\n return dynamicMasked.compiledMasks[1]\n }}\n placeholder={placeholder}\n value={draft}\n className={triggerClassName}\n onAccept={(accepted, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof accepted === \"string\" ? accepted : String(accepted ?? \"\")\n const nextDigits = nextText.replace(/\\D/g, \"\")\n const nextSignature = getAcceptedInputSignature(nextText)\n if (lastAcceptedSignatureRef.current === nextSignature) {\n return\n }\n lastAcceptedSignatureRef.current = nextSignature\n setDraft(nextText)\n\n if (nextDigits.length !== 0) {\n clearCommitPendingRef.current = false\n return\n }\n\n if (value && !clearCommitPendingRef.current) {\n clearCommitPendingRef.current = true\n onCommit(null)\n }\n }}\n onComplete={(completed, _mask, event) => {\n if (!event) {\n return\n }\n const nextText = typeof completed === \"string\" ? completed : String(completed ?? \"\")\n if (ignoreNextMaskCommitValueRef.current === nextText) {\n ignoreNextMaskCommitValueRef.current = null\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(nextText, options)\n if (!resolved) {\n return\n }\n\n if (resolved.selectableValue) {\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n\n if (value === resolved.selectableValue) {\n return\n }\n\n onCommit(resolved.selectableValue)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n setHighlightedValue(closestOption.value)\n }}\n onPointerDown={() => {\n pointerDownOnInputRef.current = true\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onMouseDown={(event) => {\n pointerDownOnInputRef.current = true\n inputWasFocusedOnPointerDownRef.current = typeof document !== \"undefined\" && document.activeElement === event.currentTarget\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onClick={() => {\n if (disabled) return\n if (!open) {\n setOpen(true)\n }\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return\n }\n\n if (event.key === \"Tab\" && open && !event.defaultPrevented) {\n setOpen(false)\n return\n }\n\n if (event.key === \"Escape\") {\n if (!open) {\n return\n }\n event.preventDefault()\n setOpen(false)\n return\n }\n\n if (!open && !event.defaultPrevented) {\n const shouldReopen =\n (event.key.length === 1 || event.key === \"Backspace\" || event.key === \"Delete\") &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n\n if (shouldReopen) {\n setOpen(true)\n }\n }\n\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n markKeyboardNavigation()\n event.preventDefault()\n\n if (!open) {\n setOpen(true)\n return\n }\n\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1)\n return\n }\n\n if (event.key === \"Enter\") {\n markKeyboardNavigation()\n const resolved = parseTimeInputWithSelectableOption(draft, options)\n if (!resolved) {\n if (!open) {\n return\n }\n\n if (draft.trim() !== \"\") {\n return\n }\n\n const highlightedOption = options.find((option) => option.value === highlightedValueRef.current)\n const fallbackValue =\n (isOptionSelectable(highlightedOption) ? highlightedOption?.value : undefined) ??\n options.find((option) => isOptionSelectable(option))?.value\n\n if (!fallbackValue) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(fallbackValue)\n setDraft(fallbackValue)\n onCommit(fallbackValue)\n setOpen(false)\n return\n }\n\n if (resolved.selectableValue) {\n event.preventDefault()\n setHighlightedValue(resolved.selectableValue)\n setDraft(resolved.selectableValue)\n onCommit(resolved.selectableValue)\n setOpen(false)\n return\n }\n\n const targetMinutes = timeStringToMinutes(resolved.parsed)\n if (targetMinutes == null) {\n return\n }\n\n const closestOption = findClosestSelectableOption(targetMinutes, options)\n if (!closestOption) {\n return\n }\n\n event.preventDefault()\n setHighlightedValue(closestOption.value)\n setDraft(closestOption.value)\n onCommit(closestOption.value)\n setOpen(false)\n return\n }\n }}\n onFocus={(event) => {\n const shouldSelectAll = !pointerDownOnInputRef.current || !inputWasFocusedOnPointerDownRef.current\n pointerDownOnInputRef.current = false\n inputWasFocusedOnPointerDownRef.current = false\n isEditingRef.current = true\n if (shouldSelectAll) {\n const element = event.currentTarget\n requestAnimationFrame(() => element.select())\n }\n\n if (disabled) {\n return\n }\n\n if (open) {\n return\n }\n\n setOpen(true)\n }}\n onBlur={() => {\n isEditingRef.current = false\n\n const trimmed = draft.trim()\n if (!trimmed) {\n setDraft(value ? value : \"\")\n return\n }\n\n const resolved = parseTimeInputWithSelectableOption(trimmed, options)\n if (!resolved) {\n setDraft(value ? value : \"\")\n return\n }\n\n if (!resolved.selectableValue) {\n setDraft(value ? value : \"\")\n return\n }\n\n setDraft(resolved.selectableValue)\n if (value !== resolved.selectableValue) {\n onCommit(resolved.selectableValue)\n }\n }}\n />\n\n {value && selectedLabel != null ? (\n <span\n aria-hidden=\"true\"\n data-slot=\"hours-picker-input-selected-label\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-3 right-10 flex min-w-0 items-center text-base peer-focus:hidden md:text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n <span className=\"min-w-0 truncate\">{selectedLabel}</span>\n </span>\n ) : null}\n\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"hours-picker-input-toggle\"\n className={cn(\n \"absolute right-1 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n )}\n aria-label={open ? \"Close time picker\" : \"Open time picker\"}\n onPointerDown={(event) => {\n event.preventDefault()\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n onClick={() => {\n if (disabled) return\n setOpen(!open)\n }}\n >\n <ChevronDown aria-hidden className=\"size-4\" />\n </button>\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index301.js","names":["alt = \"\"","widths = defaultImageWidths","loading = \"lazy\"","decoding = \"async\"","{\n src,\n hash,\n alt = \"\",\n className,\n containerClassName,\n imgClassName,\n widths = defaultImageWidths,\n responsive,\n sizes,\n srcSet,\n loading = \"lazy\",\n decoding = \"async\",\n style,\n onLoad,\n onError,\n ...props\n}: ImageProps","responsive ?? isRpcbaseFileImageSrc(src)","srcSet ?? (shouldBuildResponsiveSrc ? getImageSrcSet(src, widths) : undefined)","shouldBuildResponsiveSrc ? withImageWidth(src, 960) : src","() => {\n if (!hash) {\n setBlurhashUrl(null)\n return\n }\n\n const [width, height, buffer] = hash\n const pixels = decode(buffer, width, height)\n const canvas = document.createElement(\"canvas\")\n const ctx = canvas.getContext(\"2d\")\n\n if (!ctx) return\n\n canvas.width = width\n canvas.height = height\n ctx.putImageData(new ImageData(new Uint8ClampedArray(pixels), width, height), 0, 0)\n setBlurhashUrl(canvas.toDataURL())\n }","[hash]","() => {\n setImageLoaded(false)\n if (imgRef.current?.complete) {\n setImageLoaded(true)\n }\n }","[fallbackSrc, resolvedSrcSet]","hash\n ? {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n display: imageLoaded ? \"block\" : \"none\",\n position: \"absolute\",\n top: 0,\n left: 0,\n ...style,\n }\n : style","(event) => {\n setImageLoaded(true)\n onLoad?.(event)\n }","(event) => {\n onError?.(event)\n }","event","<img\n {...props}\n ref={imgRef}\n src={fallbackSrc}\n srcSet={resolvedSrcSet}\n sizes={resolvedSrcSet ? sizes ?? \"100vw\" : sizes}\n alt={alt}\n className={hash ? imgClassName : imgClassName ?? className}\n loading={loading}\n decoding={decoding}\n style={hash\n ? {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n display: imageLoaded ? \"block\" : \"none\",\n position: \"absolute\",\n top: 0,\n left: 0,\n ...style,\n }\n : style}\n onLoad={(event) => {\n setImageLoaded(true)\n onLoad?.(event)\n }}\n onError={(event) => {\n onError?.(event)\n }}\n />","resolvedSrcSet ? sizes ?? \"100vw\" : sizes","hash ? imgClassName : imgClassName ?? className","{ position: \"relative\", overflow: \"hidden\" }","blurhashUrl && !imageLoaded ? (\n <img\n src={blurhashUrl}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n ) : null","<div style={{ position: \"relative\", overflow: \"hidden\" }} className={containerClassName ?? className}>\n {blurhashUrl && !imageLoaded ? (\n <img\n src={blurhashUrl}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n ) : null}\n {image}\n </div>","containerClassName ?? className","_c","decode","j","defaultImageWidths","filePathPattern","normalizeWidths","widths","width","a","b","isRpcbaseFileImageSrc","src","url","withImageWidth","getImageSrcSet","normalized","Image","$","c","className","containerClassName","hash","imgClassName","onError","onLoad","props","responsive","sizes","srcSet","style","t1","t2","t3","t4","t0","alt","loading","decoding","imageLoaded","setImageLoaded","useState","blurhashUrl","setBlurhashUrl","imgRef","useRef","t5","shouldBuildResponsiveSrc","t6","resolvedSrcSet","t7","fallbackSrc","t8","t9","height","buffer","pixels","canvas","ctx","useEffect","t10","t11","t12","t13","t14","t15","event","t16","event_0","t17","image","t18","t19","t20","t21"],"sources":["../src/components/Image/index.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ImgHTMLAttributes } from \"react\"\nimport { decode } from \"blurhash\"\n\n\nexport const defaultImageWidths = [320, 640, 960, 1600]\n\nexport type ImageBlurHash = [number, number, string]\n\nexport type ImageProps = Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> & {\n src: string\n hash?: ImageBlurHash\n widths?: number[]\n responsive?: boolean\n containerClassName?: string\n imgClassName?: string\n}\n\nconst filePathPattern = /^\\/api\\/rb\\/files\\/[^/?#]+/\n\nconst normalizeWidths = (widths: number[]): number[] => [...new Set(\n widths\n .map((width) => Math.floor(width))\n .filter((width) => Number.isFinite(width) && width > 0),\n)].sort((a, b) => a - b)\n\nexport const isRpcbaseFileImageSrc = (src: string): boolean => {\n if (filePathPattern.test(src)) return true\n\n try {\n const url = new URL(src)\n return filePathPattern.test(url.pathname)\n } catch {\n return false\n }\n}\n\nexport const withImageWidth = (src: string, width: number): string => {\n if (src.startsWith(\"/\")) {\n const url = new URL(src, \"http://rpcbase.local\")\n url.searchParams.set(\"w\", String(width))\n return `${url.pathname}${url.search}${url.hash}`\n }\n\n try {\n const url = new URL(src)\n url.searchParams.set(\"w\", String(width))\n return url.toString()\n } catch {\n return src\n }\n}\n\nexport const getImageSrcSet = (src: string, widths = defaultImageWidths): string | undefined => {\n if (!isRpcbaseFileImageSrc(src)) return undefined\n const normalized = normalizeWidths(widths)\n if (!normalized.length) return undefined\n return normalized.map((width) => `${withImageWidth(src, width)} ${width}w`).join(\", \")\n}\n\nexport function Image({\n src,\n hash,\n alt = \"\",\n className,\n containerClassName,\n imgClassName,\n widths = defaultImageWidths,\n responsive,\n sizes,\n srcSet,\n loading = \"lazy\",\n decoding = \"async\",\n style,\n onLoad,\n onError,\n ...props\n}: ImageProps) {\n const [imageLoaded, setImageLoaded] = useState(false)\n const [blurhashUrl, setBlurhashUrl] = useState<string | null>(null)\n const imgRef = useRef<HTMLImageElement>(null)\n const shouldBuildResponsiveSrc = responsive ?? isRpcbaseFileImageSrc(src)\n const resolvedSrcSet = srcSet ?? (shouldBuildResponsiveSrc ? getImageSrcSet(src, widths) : undefined)\n const fallbackSrc = shouldBuildResponsiveSrc ? withImageWidth(src, 960) : src\n\n useEffect(() => {\n if (!hash) {\n setBlurhashUrl(null)\n return\n }\n\n const [width, height, buffer] = hash\n const pixels = decode(buffer, width, height)\n const canvas = document.createElement(\"canvas\")\n const ctx = canvas.getContext(\"2d\")\n\n if (!ctx) return\n\n canvas.width = width\n canvas.height = height\n ctx.putImageData(new ImageData(new Uint8ClampedArray(pixels), width, height), 0, 0)\n setBlurhashUrl(canvas.toDataURL())\n }, [hash])\n\n useEffect(() => {\n setImageLoaded(false)\n if (imgRef.current?.complete) {\n setImageLoaded(true)\n }\n }, [fallbackSrc, resolvedSrcSet])\n\n const image = (\n <img\n {...props}\n ref={imgRef}\n src={fallbackSrc}\n srcSet={resolvedSrcSet}\n sizes={resolvedSrcSet ? sizes ?? \"100vw\" : sizes}\n alt={alt}\n className={hash ? imgClassName : imgClassName ?? className}\n loading={loading}\n decoding={decoding}\n style={hash\n ? {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n display: imageLoaded ? \"block\" : \"none\",\n position: \"absolute\",\n top: 0,\n left: 0,\n ...style,\n }\n : style}\n onLoad={(event) => {\n setImageLoaded(true)\n onLoad?.(event)\n }}\n onError={(event) => {\n onError?.(event)\n }}\n />\n )\n\n if (!hash) return image\n\n return (\n <div style={{ position: \"relative\", overflow: \"hidden\" }} className={containerClassName ?? className}>\n {blurhashUrl && !imageLoaded ? (\n <img\n src={blurhashUrl}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n ) : null}\n {image}\n </div>\n )\n}\n"],"mappings":"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"}
|