@rpcbase/ui 0.280.0 → 0.281.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AddressAutocompleteInput/index.d.ts +1 -1
- package/dist/components/AddressAutocompleteInput/index.d.ts.map +1 -1
- package/dist/components/ApplePayButton/index.d.ts +1 -1
- package/dist/components/ApplePayButton/index.d.ts.map +1 -1
- package/dist/components/Checkbox/index.d.ts +1 -1
- package/dist/components/Checkbox/index.d.ts.map +1 -1
- package/dist/components/DayPickerField/index.d.ts +2 -2
- package/dist/components/DayPickerField/index.d.ts.map +1 -1
- package/dist/components/Dialog/index.d.ts +9 -9
- package/dist/components/Dialog/index.d.ts.map +1 -1
- package/dist/components/FilesUploadField/index.d.ts +1 -1
- package/dist/components/FilesUploadField/index.d.ts.map +1 -1
- package/dist/components/HourPickerField/index.d.ts +2 -2
- package/dist/components/HourPickerField/index.d.ts.map +1 -1
- package/dist/components/I18nField/index.d.ts +1 -1
- package/dist/components/I18nField/index.d.ts.map +1 -1
- package/dist/components/Image/index.d.ts +1 -1
- package/dist/components/Image/index.d.ts.map +1 -1
- package/dist/components/ImagesField/index.d.ts +1 -1
- package/dist/components/ImagesField/index.d.ts.map +1 -1
- package/dist/components/Input/index.d.ts +1 -1
- package/dist/components/Input/index.d.ts.map +1 -1
- package/dist/components/Notifications/NotificationsButton.d.ts +1 -1
- package/dist/components/Notifications/NotificationsButton.d.ts.map +1 -1
- package/dist/components/Notifications/NotificationsDrawer.d.ts +1 -1
- package/dist/components/Notifications/NotificationsDrawer.d.ts.map +1 -1
- package/dist/components/Notifications/NotificationsSettings.d.ts +1 -1
- package/dist/components/Notifications/NotificationsSettings.d.ts.map +1 -1
- package/dist/components/PhoneNumberInput/suggestions.d.ts +3 -3
- package/dist/components/PhoneNumberInput/suggestions.d.ts.map +1 -1
- package/dist/components/Select/index.d.ts +2 -2
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/header/MenuPopover/index.d.ts +1 -1
- package/dist/components/header/MenuPopover/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index10.js +6 -4
- package/dist/index10.js.map +1 -1
- package/dist/index12.js.map +1 -1
- package/dist/index13.js.map +1 -1
- package/dist/index14.js.map +1 -1
- package/dist/index15.js.map +1 -1
- package/dist/index154.js +19 -7
- package/dist/index154.js.map +1 -1
- package/dist/index16.js +36 -45
- package/dist/index16.js.map +1 -1
- package/dist/index160.js +3 -3
- package/dist/index160.js.map +1 -1
- package/dist/index166.js +5 -5
- package/dist/index166.js.map +1 -1
- package/dist/index172.js +27 -25
- package/dist/index172.js.map +1 -1
- package/dist/index181.js +1 -1
- package/dist/index181.js.map +1 -1
- package/dist/index182.js +145 -162
- package/dist/index182.js.map +1 -1
- package/dist/index184.js +6 -8
- package/dist/index184.js.map +1 -1
- package/dist/index186.js +2 -8
- package/dist/index186.js.map +1 -1
- package/dist/index19.js +1 -1
- package/dist/index19.js.map +1 -1
- package/dist/index195.js +1 -1
- package/dist/index195.js.map +1 -1
- package/dist/index196.js +2 -2
- package/dist/index196.js.map +1 -1
- package/dist/index197.js +1 -1
- package/dist/index197.js.map +1 -1
- package/dist/index198.js +16 -15
- package/dist/index198.js.map +1 -1
- package/dist/index199.js +13 -17
- package/dist/index199.js.map +1 -1
- package/dist/index200.js +3 -2
- package/dist/index200.js.map +1 -1
- package/dist/index207.js +5 -90
- package/dist/index207.js.map +1 -1
- package/dist/index208.js +15 -3
- package/dist/index208.js.map +1 -1
- package/dist/index209.js +102 -22
- package/dist/index209.js.map +1 -1
- package/dist/index210.js +3 -28
- package/dist/index210.js.map +1 -1
- package/dist/index211.js +23 -19
- package/dist/index211.js.map +1 -1
- package/dist/index212.js +27 -6
- package/dist/index212.js.map +1 -1
- package/dist/index213.js +19 -14
- package/dist/index213.js.map +1 -1
- package/dist/index214.js +5 -6
- package/dist/index214.js.map +1 -1
- package/dist/index215.js +14 -26
- package/dist/index215.js.map +1 -1
- package/dist/index216.js +7 -22
- package/dist/index216.js.map +1 -1
- package/dist/index217.js +27 -6
- package/dist/index217.js.map +1 -1
- package/dist/index218.js +23 -5
- package/dist/index218.js.map +1 -1
- package/dist/index219.js +6 -4
- package/dist/index219.js.map +1 -1
- package/dist/index220.js +5 -4
- package/dist/index220.js.map +1 -1
- package/dist/index221.js +4 -24
- package/dist/index221.js.map +1 -1
- package/dist/index222.js +4 -3
- package/dist/index222.js.map +1 -1
- package/dist/index223.js +21 -21
- package/dist/index223.js.map +1 -1
- package/dist/index224.js +3 -23
- package/dist/index224.js.map +1 -1
- package/dist/index225.js +23 -6
- package/dist/index225.js.map +1 -1
- package/dist/index226.js +22 -9
- package/dist/index226.js.map +1 -1
- package/dist/index227.js +5 -17
- package/dist/index227.js.map +1 -1
- package/dist/index228.js +8 -49
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +18 -5
- package/dist/index229.js.map +1 -1
- package/dist/index230.js +50 -19
- package/dist/index230.js.map +1 -1
- package/dist/index231.js +20 -28
- package/dist/index231.js.map +1 -1
- package/dist/index232.js +27 -104
- package/dist/index232.js.map +1 -1
- package/dist/index233.js +98 -33
- package/dist/index233.js.map +1 -1
- package/dist/index234.js +28 -113
- package/dist/index234.js.map +1 -1
- package/dist/index235.js +117 -11
- package/dist/index235.js.map +1 -1
- package/dist/index236.js +12 -4
- package/dist/index236.js.map +1 -1
- package/dist/index237.js +4 -15
- package/dist/index237.js.map +1 -1
- package/dist/index238.js +13 -62
- package/dist/index238.js.map +1 -1
- package/dist/index239.js +64 -9
- package/dist/index239.js.map +1 -1
- package/dist/index240.js +10 -106
- package/dist/index240.js.map +1 -1
- package/dist/index241.js +107 -13
- package/dist/index241.js.map +1 -1
- package/dist/index242.js +16 -13
- package/dist/index242.js.map +1 -1
- package/dist/index243.js +13 -5
- package/dist/index243.js.map +1 -1
- package/dist/index244.js +4 -316
- package/dist/index244.js.map +1 -1
- package/dist/index245.js +315 -58
- package/dist/index245.js.map +1 -1
- package/dist/index246.js +58 -223
- package/dist/index246.js.map +1 -1
- package/dist/index247.js +215 -318
- package/dist/index247.js.map +1 -1
- package/dist/index248.js +250 -306
- package/dist/index248.js.map +1 -1
- package/dist/index249.js +308 -173
- package/dist/index249.js.map +1 -1
- package/dist/index250.js +178 -7
- package/dist/index250.js.map +1 -1
- package/dist/index251.js +8 -15
- package/dist/index251.js.map +1 -1
- package/dist/index252.js +41 -5
- package/dist/index252.js.map +1 -1
- package/dist/index253.js +46 -38
- package/dist/index253.js.map +1 -1
- package/dist/index254.js +7 -50
- package/dist/index254.js.map +1 -1
- package/dist/index255.js +49 -6
- package/dist/index255.js.map +1 -1
- package/dist/index256.js +48 -46
- package/dist/index256.js.map +1 -1
- package/dist/index257.js +6 -51
- package/dist/index257.js.map +1 -1
- package/dist/index258.js +10 -9
- package/dist/index258.js.map +1 -1
- package/dist/index259.js +60 -8
- package/dist/index259.js.map +1 -1
- package/dist/index26.js.map +1 -1
- package/dist/index260.js +41 -60
- package/dist/index260.js.map +1 -1
- package/dist/index261.js +88 -34
- package/dist/index261.js.map +1 -1
- package/dist/index262.js +47 -94
- package/dist/index262.js.map +1 -1
- package/dist/index263.js +36 -49
- package/dist/index263.js.map +1 -1
- package/dist/index264.js +45 -32
- package/dist/index264.js.map +1 -1
- package/dist/index265.js +47 -46
- package/dist/index265.js.map +1 -1
- package/dist/index266.js +18 -48
- package/dist/index266.js.map +1 -1
- package/dist/index267.js +174 -15
- package/dist/index267.js.map +1 -1
- package/dist/index268.js +47 -169
- package/dist/index268.js.map +1 -1
- package/dist/index269.js +17 -34
- package/dist/index269.js.map +1 -1
- package/dist/index270.js +59 -10
- package/dist/index270.js.map +1 -1
- package/dist/index271.js +10 -66
- package/dist/index271.js.map +1 -1
- package/dist/index272.js +4 -4
- package/dist/index273.js +71 -69
- package/dist/index273.js.map +1 -1
- package/dist/index274.js +158 -152
- package/dist/index274.js.map +1 -1
- package/dist/index275.js +7 -13
- package/dist/index275.js.map +1 -1
- package/dist/index276.js +12 -5
- package/dist/index276.js.map +1 -1
- package/dist/index277.js +12 -6
- package/dist/index277.js.map +1 -1
- package/dist/index278.js +11 -12
- package/dist/index278.js.map +1 -1
- package/dist/index279.js +65 -9
- package/dist/index279.js.map +1 -1
- package/dist/index280.js +6 -74
- package/dist/index280.js.map +1 -1
- package/dist/index281.js +25 -6
- package/dist/index281.js.map +1 -1
- package/dist/index282.js +24 -24
- package/dist/index282.js.map +1 -1
- package/dist/index283.js +125 -24
- package/dist/index283.js.map +1 -1
- package/dist/index284.js +52 -115
- package/dist/index284.js.map +1 -1
- package/dist/index285.js +59 -55
- package/dist/index285.js.map +1 -1
- package/dist/index286.js +48 -61
- package/dist/index286.js.map +1 -1
- package/dist/index287.js +5 -48
- package/dist/index287.js.map +1 -1
- package/dist/index288.js +14 -8
- package/dist/index288.js.map +1 -1
- package/dist/index289.js +18 -14
- package/dist/index289.js.map +1 -1
- package/dist/index290.js +10 -17
- package/dist/index290.js.map +1 -1
- package/dist/index291.js +23 -11
- package/dist/index291.js.map +1 -1
- package/dist/index292.js +52 -25
- package/dist/index292.js.map +1 -1
- package/dist/index293.js +6 -52
- package/dist/index293.js.map +1 -1
- package/dist/index294.js +137 -5
- package/dist/index294.js.map +1 -1
- package/dist/index295.js +59 -149
- package/dist/index295.js.map +1 -1
- package/dist/index296.js +90 -49
- package/dist/index296.js.map +1 -1
- package/dist/index297.js +11 -117
- package/dist/index297.js.map +1 -1
- package/dist/index298.js +863 -11
- package/dist/index298.js.map +1 -1
- package/dist/index299.js +21 -865
- package/dist/index299.js.map +1 -1
- package/dist/index3.js.map +1 -1
- package/dist/index300.js +417 -27
- package/dist/index300.js.map +1 -1
- package/dist/index301.js +774 -483
- package/dist/index301.js.map +1 -1
- package/dist/index302.js +7436 -803
- package/dist/index302.js.map +1 -1
- package/dist/index303.js +7 -7429
- package/dist/index303.js.map +1 -1
- package/dist/index304.js +12 -6
- package/dist/index304.js.map +1 -1
- package/dist/index305.js +5 -12
- package/dist/index305.js.map +1 -1
- package/dist/index306.js +3 -3
- package/dist/index306.js.map +1 -1
- package/dist/index307.js +469 -5
- package/dist/index307.js.map +1 -1
- package/dist/index308.js +32 -464
- package/dist/index308.js.map +1 -1
- package/dist/index309.js +18 -36
- package/dist/index309.js.map +1 -1
- package/dist/index310.js +28 -17
- package/dist/index310.js.map +1 -1
- package/dist/index311.js +4 -30
- package/dist/index311.js.map +1 -1
- package/dist/index312.js +59 -4
- package/dist/index312.js.map +1 -1
- package/dist/index313.js +11 -59
- package/dist/index313.js.map +1 -1
- package/dist/index314.js +5 -9
- package/dist/index314.js.map +1 -1
- package/dist/index315.js +9 -5
- package/dist/index315.js.map +1 -1
- package/dist/index316.js +12 -9
- package/dist/index316.js.map +1 -1
- package/dist/index317.js +3 -13
- package/dist/index317.js.map +1 -1
- package/dist/index318.js +17 -3
- package/dist/index318.js.map +1 -1
- package/dist/index319.js +23 -14
- package/dist/index319.js.map +1 -1
- package/dist/index320.js +39 -23
- package/dist/index320.js.map +1 -1
- package/dist/index321.js +5 -41
- package/dist/index321.js.map +1 -1
- package/dist/index322.js +25 -5
- package/dist/index322.js.map +1 -1
- package/dist/index323.js +18 -24
- package/dist/index323.js.map +1 -1
- package/dist/index324.js +32 -17
- package/dist/index324.js.map +1 -1
- package/dist/index325.js +5 -34
- package/dist/index325.js.map +1 -1
- package/dist/index326.js +9 -5
- package/dist/index326.js.map +1 -1
- package/dist/index327.js +7 -8
- package/dist/index327.js.map +1 -1
- package/dist/index328.js +9 -8
- package/dist/index328.js.map +1 -1
- package/dist/index329.js +10 -9
- package/dist/index329.js.map +1 -1
- package/dist/index330.js +7 -10
- package/dist/index330.js.map +1 -1
- package/dist/index331.js +75 -7
- package/dist/index331.js.map +1 -1
- package/dist/index332.js +153 -66
- package/dist/index332.js.map +1 -1
- package/dist/index333.js +99 -147
- package/dist/index333.js.map +1 -1
- package/dist/index334.js +13 -113
- package/dist/index334.js.map +1 -1
- package/dist/index335.js +78 -12
- package/dist/index335.js.map +1 -1
- package/dist/index336.js +23 -57
- package/dist/index336.js.map +1 -1
- package/dist/index337.js +12 -45
- package/dist/index337.js.map +1 -1
- package/dist/index338.js +16 -13
- package/dist/index338.js.map +1 -1
- package/dist/index339.js +100 -15
- package/dist/index339.js.map +1 -1
- package/dist/index340.js +50 -95
- package/dist/index340.js.map +1 -1
- package/dist/index341.js +57 -5
- package/dist/index341.js.map +1 -1
- package/dist/index342.js +41 -78
- package/dist/index342.js.map +1 -1
- package/dist/index343.js +100 -58
- package/dist/index343.js.map +1 -1
- package/dist/index344.js +46 -104
- package/dist/index344.js.map +1 -1
- package/dist/index345.js +39 -51
- package/dist/index345.js.map +1 -1
- package/dist/index346.js +143 -42
- package/dist/index346.js.map +1 -1
- package/dist/index347.js +122 -123
- package/dist/index347.js.map +1 -1
- package/dist/index348.js +224 -108
- package/dist/index348.js.map +1 -1
- package/dist/index349.js +158 -174
- package/dist/index349.js.map +1 -1
- package/dist/index350.js +213 -144
- package/dist/index350.js.map +1 -1
- package/dist/index351.js +5 -309
- package/dist/index351.js.map +1 -1
- package/dist/index352.js +6 -5
- package/dist/index352.js.map +1 -1
- package/dist/index353.js +7 -6
- package/dist/index353.js.map +1 -1
- package/dist/index354.js +4 -5
- package/dist/index354.js.map +1 -1
- package/dist/index355.js +4 -4
- package/dist/index355.js.map +1 -1
- package/dist/index356.js +21 -6
- package/dist/index356.js.map +1 -1
- package/dist/index357.js +10 -21
- package/dist/index357.js.map +1 -1
- package/dist/index358.js +128 -10
- package/dist/index358.js.map +1 -1
- package/dist/index359.js +36 -122
- package/dist/index359.js.map +1 -1
- package/dist/index360.js +64 -38
- package/dist/index360.js.map +1 -1
- package/dist/index361.js +115 -66
- package/dist/index361.js.map +1 -1
- package/dist/index362.js +485 -112
- package/dist/index362.js.map +1 -1
- package/dist/index363.js +7 -490
- package/dist/index363.js.map +1 -1
- package/dist/index364.js +1 -1
- package/dist/index364.js.map +1 -1
- package/dist/index367.js +2 -9
- package/dist/index367.js.map +1 -1
- package/dist/index368.js +26 -5
- package/dist/index368.js.map +1 -1
- package/dist/index369.js +43 -27
- package/dist/index369.js.map +1 -1
- package/dist/index370.js +35 -46
- package/dist/index370.js.map +1 -1
- package/dist/index371.js +16 -27
- package/dist/index371.js.map +1 -1
- package/dist/index372.js +41 -16
- package/dist/index372.js.map +1 -1
- package/dist/index373.js +11 -42
- package/dist/index373.js.map +1 -1
- package/dist/index374.js +10 -14
- package/dist/index374.js.map +1 -1
- package/dist/index375.js +51 -9
- package/dist/index375.js.map +1 -1
- package/dist/index376.js +40 -53
- package/dist/index376.js.map +1 -1
- package/dist/index377.js +17 -43
- package/dist/index377.js.map +1 -1
- package/dist/index378.js +4 -15
- package/dist/index378.js.map +1 -1
- package/dist/index379.js +4 -4
- package/dist/index379.js.map +1 -1
- package/dist/index380.js +9 -4
- package/dist/index380.js.map +1 -1
- package/dist/index381.js +304 -9
- package/dist/index381.js.map +1 -1
- package/dist/index382.js +4 -339
- package/dist/index382.js.map +1 -1
- package/dist/index383.js +21 -5
- package/dist/index383.js.map +1 -1
- package/dist/index384.js +106 -16
- package/dist/index384.js.map +1 -1
- package/dist/index385.js +19 -109
- package/dist/index385.js.map +1 -1
- package/dist/index386.js +18 -18
- package/dist/index386.js.map +1 -1
- package/dist/index387.js +14 -19
- package/dist/index387.js.map +1 -1
- package/dist/index388.js +12 -4
- package/dist/index388.js.map +1 -1
- package/dist/index389.js +113 -20
- package/dist/index389.js.map +1 -1
- package/dist/index390.js +5 -11
- package/dist/index390.js.map +1 -1
- package/dist/index391.js +28 -85
- package/dist/index391.js.map +1 -1
- package/dist/index392.js +9 -9
- package/dist/index392.js.map +1 -1
- package/dist/index393.js +6 -29
- package/dist/index393.js.map +1 -1
- package/dist/index394.js +254 -10
- package/dist/index394.js.map +1 -1
- package/dist/index395.js +12 -6
- package/dist/index395.js.map +1 -1
- package/dist/index396.js +11 -252
- package/dist/index396.js.map +1 -1
- package/dist/index397.js +6 -11
- package/dist/index397.js.map +1 -1
- package/dist/index398.js +22 -10
- package/dist/index398.js.map +1 -1
- package/dist/index399.js +22 -6
- package/dist/index399.js.map +1 -1
- package/dist/index4.js.map +1 -1
- package/dist/index400.js +103 -21
- package/dist/index400.js.map +1 -1
- package/dist/index401.js +15 -23
- package/dist/index401.js.map +1 -1
- package/dist/index402.js +11 -108
- package/dist/index402.js.map +1 -1
- package/dist/index403.js +10 -15
- package/dist/index403.js.map +1 -1
- package/dist/index404.js +237 -10
- package/dist/index404.js.map +1 -1
- package/dist/index405.js +27 -9
- package/dist/index405.js.map +1 -1
- package/dist/index406.js +33 -238
- package/dist/index406.js.map +1 -1
- package/dist/index407.js +11 -30
- package/dist/index407.js.map +1 -1
- package/dist/index408.js +118 -48
- package/dist/index408.js.map +1 -1
- package/dist/index409.js +39 -11
- package/dist/index409.js.map +1 -1
- package/dist/index410.js +18 -121
- package/dist/index410.js.map +1 -1
- package/dist/index411.js +11 -39
- package/dist/index411.js.map +1 -1
- package/dist/index412.js +21 -24
- package/dist/index412.js.map +1 -1
- package/dist/index413.js +17 -11
- package/dist/index413.js.map +1 -1
- package/dist/index414.js +10 -20
- package/dist/index414.js.map +1 -1
- package/dist/index415.js +4 -17
- package/dist/index415.js.map +1 -1
- package/dist/index416.js +300 -14
- package/dist/index416.js.map +1 -1
- package/dist/index417.js +61 -323
- package/dist/index417.js.map +1 -1
- package/dist/index418.js +4 -63
- package/dist/index418.js.map +1 -1
- package/dist/index419.js +28 -4
- package/dist/index419.js.map +1 -1
- package/dist/index420.js +468 -25
- package/dist/index420.js.map +1 -1
- package/dist/index421.js +250 -452
- package/dist/index421.js.map +1 -1
- package/dist/index6.js.map +1 -1
- package/dist/index7.js +91 -133
- package/dist/index7.js.map +1 -1
- package/dist/index70.js +2 -2
- package/dist/index70.js.map +1 -1
- package/dist/index71.js +11 -4
- package/dist/index71.js.map +1 -1
- package/dist/index72.js +1 -3
- package/dist/index72.js.map +1 -1
- package/dist/index8.js.map +1 -1
- package/dist/index9.js +16 -19
- package/dist/index9.js.map +1 -1
- package/dist/test-only/TestCoverageTestBadge/index.d.ts +1 -1
- package/dist/test-only/TestCoverageTestBadge/index.d.ts.map +1 -1
- package/package.json +15 -15
- package/dist/index422.js +0 -272
- package/dist/index422.js.map +0 -1
package/dist/index299.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index299.js","names":["useEffect","useMemo","useRef","useState","ReactNode","createPortal","DragEndEvent","DragStartEvent","DropAnimation","DndContext","DragOverlay","KeyboardSensor","PointerSensor","closestCenter","defaultDropAnimationSideEffects","useSensor","useSensors","SortableContext","arrayMove","rectSortingStrategy","sortableKeyboardCoordinates","useSortable","CSS","Loader2","Maximize2","Plus","X","cn","Image","getImageSrcSet","isRpcbaseFileImageSrc","withImageWidth","Sha256Worker","FilesUploadFieldFile","id","url","alt","uploadKey","FileUploadsInitResponse","ok","error","uploadId","chunkSize","chunksTotal","fileId","deduplicated","FileUploadsStatusResponse","status","received","FileUploadsCompleteResponse","sha256Hex","data","ArrayBuffer","Promise","crypto","subtle","digest","bytes","Array","from","Uint8Array","map","b","toString","padStart","join","HashWorkerResponse","hash","sha256FileHex","file","File","signal","AbortSignal","Worker","Error","resolve","reject","worker","cleanup","removeEventListener","handleAbort","terminate","name","aborted","addEventListener","once","onerror","onmessage","event","MessageEvent","postMessage","postJson","body","options","headers","Record","T","response","fetch","method","credentials","JSON","stringify","payload","json","catch","getJson","putOctetStream","sha256","defaultUpload","FilesUploadFieldUploadHandler","onProgress","deduplicationNamespace","trim","fileHash","initRes","filename","mimeType","type","accessScope","isPublic","deduplication","namespace","algorithm","totalSize","size","deduplicatedFileId","String","deduplicatedUploadKey","encodeURIComponent","Number","doUploadChunk","index","start","end","Math","min","slice","arrayBuffer","sha","res","undefined","uploadChunks","indices","alreadyUploaded","uploaded","idx","pct","floor","allIndices","length","_","i","complete","completeRes","code","statusRes","isArray","present","Set","missing","has","push","SortableTile","t0","$","_c","item","isHovered","enableImagePreview","renderItem","onHoverEnter","onHoverLeave","onRemove","onRetry","startFullscreen","isUploading","isError","tileClasses","disabled","isDraggingExternal","removeButtonAriaLabel","t1","setNodeRef","attributes","listeners","transform","transition","isDragging","tileRef","previewRef","previewPosition","setPreviewPosition","t2","Symbol","for","el","current","rect","getBoundingClientRect","left","width","top","updatePreviewPosition","t3","t4","raf","schedule","cancelAnimationFrame","requestAnimationFrame","window","t5","Transform","t6","style","t7","fileName","previewUrl","progress","tileContent","t8","node","t9","t10","t11","t12","t13","t14","t15","t16","next","relatedTarget","Node","contains","t17","t18","t19","t20","preview","event_0","next_0","document","t21","t22","errorMessage","getErrorLabel","t23","UploadResult","FileUploadAccessScope","FilesUploadFieldUploadOptions","FilesUploadFieldRenderItemProps","FilesUploadFieldBaseProps","initialFiles","onChange","files","upload","uploadDeduplicationNamespace","maxFiles","onUploadingChange","accept","renderHeader","props","addButtonAriaLabel","variant","FilesUploadFieldVisibilityProps","uploadAccessScope","uploadIsPublic","FilesUploadFieldProps","FileWithState","renderKey","toPreview","URL","createObjectURL","preloadImagePreview","src","image","createElement","srcSet","srcset","sizes","decode","onload","getErrorMessage","message","startsWith","IMAGE_FILE_NAME_RE","DROP_ANIMATION_FALLBACK_MS","hideDraggedTileDropSideEffects","styles","active","opacity","isImageItem","test","FilesUploadField","fileInputRef","HTMLInputElement","images","setImages","dragActive","setDragActive","fullscreenIndex","setFullscreenIndex","hoveredId","setHoveredId","activeId","setActiveId","dropAnimatingId","setDropAnimatingId","hoverTimeoutRef","dropAnimationFallbackRef","timeout","hasDragOverlayRef","clearDropAnimationRef","dropAnimationRef","sideEffects","args","fallback","clearTimeout","skipNotifyRef","imagesRef","lastInitialImagesRef","onChangeRef","onUploadingChangeRef","replacedIdRef","Map","fileRef","abortRef","AbortController","objectUrlRef","sensors","activationConstraint","distance","coordinateGetter","controller","values","abort","clear","revokeObjectURL","cursor","previous","samePropValue","every","img","renderKeysById","prepared","get","preparedRawIds","tempId","finalId","entries","delete","currentIds","hasStaleInitialImages","some","mapped","preparedIds","tempUrl","sameLength","sameContent","handleKey","KeyboardEvent","key","handleFiles","FileList","normalizedMaxFiles","isFinite","remaining","POSITIVE_INFINITY","max","list","uploads","randomUUID","set","updateProgress","value","nextValue","finalize","result","console","allSettled","onFileInputChange","React","ChangeEvent","target","openFileDialog","click","removeImage","filter","retryUpload","existingController","findIndex","clearPendingDropAnimation","scheduleDropAnimationFallback","setTimeout","finishDrag","handleDragStart","handleDragEnd","over","overId","oldIndex","newIndex","handleDragCancel","clearHoverTimeout","fullscreenImage","containerClasses","tileBaseClasses","acceptAttr","tokens","split","Boolean","token","canPreviewItem","canAddFiles","statusItem","find","uploadStatusMessage","toRenderItemProps","dragOverlayContent","activeItem","rendered","hasDragOverlay","hiddenDraggedTileId","preventDefault","dataTransfer","overlay"],"sources":["../src/components/FilesUploadField/index.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport type { DragEndEvent, DragStartEvent, DropAnimation } from \"@dnd-kit/core\"\nimport {\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n defaultDropAnimationSideEffects,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\"\nimport {\n SortableContext,\n arrayMove,\n rectSortingStrategy,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport { Loader2, Maximize2, Plus, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { Image, getImageSrcSet, isRpcbaseFileImageSrc, withImageWidth } from \"../Image\"\nimport Sha256Worker from \"./sha256.worker.ts?worker&inline\"\n\n\nexport type FilesUploadFieldFile = {\n id: string\n url: string\n alt?: string\n uploadKey?: string\n}\n\ntype FileUploadsInitResponse = {\n ok: boolean\n error?: string\n uploadId?: string\n uploadKey?: string\n chunkSize?: number\n chunksTotal?: number\n fileId?: string\n deduplicated?: boolean\n}\n\ntype FileUploadsStatusResponse = {\n ok: boolean\n error?: string\n status?: \"uploading\" | \"assembling\" | \"done\" | \"error\"\n chunkSize?: number\n chunksTotal?: number\n received?: number[]\n fileId?: string\n}\n\ntype FileUploadsCompleteResponse = {\n ok: boolean\n error?: string\n fileId?: string\n}\n\nconst sha256Hex = async (data: ArrayBuffer): Promise<string | null> => {\n if (typeof crypto === \"undefined\" || typeof crypto.subtle === \"undefined\") return null\n try {\n const digest = await crypto.subtle.digest(\"SHA-256\", data)\n const bytes = Array.from(new Uint8Array(digest))\n return bytes.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n } catch {\n return null\n }\n}\n\ntype HashWorkerResponse =\n | { ok: true; hash: string }\n | { ok: false; error: string }\n\nconst sha256FileHex = async (file: File, signal?: AbortSignal): Promise<string> => {\n if (typeof Worker === \"undefined\") {\n throw new Error(\"File hashing is not supported in this browser\")\n }\n\n return new Promise((resolve, reject) => {\n const worker = new Sha256Worker()\n\n const cleanup = () => {\n signal?.removeEventListener(\"abort\", handleAbort)\n worker.terminate()\n }\n\n const handleAbort = () => {\n cleanup()\n const error = new Error(\"Upload aborted\")\n error.name = \"AbortError\"\n reject(error)\n }\n\n if (signal?.aborted) {\n handleAbort()\n return\n }\n\n signal?.addEventListener(\"abort\", handleAbort, { once: true })\n worker.onerror = () => {\n cleanup()\n reject(new Error(\"Unable to hash file\"))\n }\n worker.onmessage = (event: MessageEvent<HashWorkerResponse>) => {\n cleanup()\n if (event.data.ok) {\n resolve(event.data.hash)\n return\n }\n reject(new Error(event.data.error === \"hash_unavailable\" ? \"File hashing is not supported in this browser\" : \"Unable to hash file\"))\n }\n worker.postMessage(file)\n })\n}\n\nconst postJson = async <T,>(\n url: string,\n body: unknown,\n options?: { headers?: Record<string, string>; signal?: AbortSignal },\n): Promise<{ ok: boolean; status: number; data: T }> => {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...(options?.headers ?? {}) },\n credentials: \"include\",\n body: JSON.stringify(body),\n signal: options?.signal,\n })\n\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, status: response.status, data: payload as T }\n}\n\nconst getJson = async <T,>(\n url: string,\n options?: { headers?: Record<string, string>; signal?: AbortSignal },\n): Promise<{ ok: boolean; status: number; data: T }> => {\n const response = await fetch(url, {\n credentials: \"include\",\n headers: options?.headers,\n signal: options?.signal,\n })\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, status: response.status, data: payload as T }\n}\n\nconst putOctetStream = async ({\n url,\n body,\n sha256,\n uploadKey,\n signal,\n}: {\n url: string\n body: ArrayBuffer\n sha256?: string\n uploadKey?: string\n signal?: AbortSignal\n}): Promise<{ ok: boolean; status: number }> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/octet-stream\",\n }\n if (sha256) headers[\"X-Chunk-SHA256\"] = sha256\n if (uploadKey) headers[\"X-Upload-Key\"] = uploadKey\n\n const response = await fetch(url, {\n method: \"PUT\",\n credentials: \"include\",\n headers,\n body,\n signal,\n })\n\n return { ok: response.ok, status: response.status }\n}\n\nconst defaultUpload: FilesUploadFieldUploadHandler = async (file, onProgress, options) => {\n const deduplicationNamespace = options?.deduplicationNamespace?.trim()\n const fileHash = deduplicationNamespace\n ? await sha256FileHex(file, options?.signal)\n : null\n\n const initRes = await postJson<FileUploadsInitResponse>(\n \"/api/rb/file-uploads\",\n {\n filename: file.name,\n mimeType: file.type || \"application/octet-stream\",\n ...(options?.accessScope\n ? { accessScope: options.accessScope }\n : typeof options?.isPublic === \"boolean\"\n ? { isPublic: options.isPublic }\n : {}),\n ...(deduplicationNamespace && fileHash\n ? {\n deduplication: {\n namespace: deduplicationNamespace,\n algorithm: \"sha256\",\n hash: fileHash,\n },\n }\n : {}),\n totalSize: file.size,\n },\n { signal: options?.signal },\n )\n\n if (!initRes.ok || !(initRes.data as any)?.ok) {\n throw new Error((initRes.data as any)?.error ?? `Init failed (${initRes.status})`)\n }\n\n const deduplicatedFileId = String((initRes.data as any)?.fileId ?? \"\").trim()\n if ((initRes.data as any)?.deduplicated === true && deduplicatedFileId) {\n const deduplicatedUploadKey = typeof (initRes.data as any)?.uploadKey === \"string\"\n ? String((initRes.data as any).uploadKey)\n : null\n onProgress(100)\n return {\n id: deduplicatedFileId,\n url: `/api/rb/files/${encodeURIComponent(deduplicatedFileId)}`,\n alt: file.name,\n ...(deduplicatedUploadKey ? { uploadKey: deduplicatedUploadKey } : {}),\n }\n }\n\n const uploadId = String((initRes.data as any)?.uploadId ?? \"\")\n const uploadKey = typeof (initRes.data as any)?.uploadKey === \"string\" ? String((initRes.data as any).uploadKey) : null\n const chunkSize = Number((initRes.data as any)?.chunkSize ?? 0)\n const chunksTotal = Number((initRes.data as any)?.chunksTotal ?? 0)\n\n if (!uploadId || !chunkSize || !chunksTotal) {\n throw new Error(\"Upload init missing required fields\")\n }\n\n const doUploadChunk = async (index: number) => {\n const start = index * chunkSize\n const end = Math.min(file.size, start + chunkSize)\n const slice = file.slice(start, end)\n const body = await slice.arrayBuffer()\n const sha = await sha256Hex(body)\n\n const res = await putOctetStream({\n url: `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/chunks/${index}`,\n body,\n sha256: sha ?? undefined,\n uploadKey: uploadKey ?? undefined,\n signal: options?.signal,\n })\n\n if (res.status === 204) return\n throw new Error(`Chunk ${index} failed (${res.status})`)\n }\n\n const uploadChunks = async (indices: number[], alreadyUploaded = 0) => {\n let uploaded = alreadyUploaded\n\n for (const idx of indices) {\n await doUploadChunk(idx)\n uploaded += 1\n const pct = Math.min(99, Math.floor((uploaded / chunksTotal) * 99))\n onProgress(pct)\n }\n }\n\n const allIndices = Array.from({ length: chunksTotal }, (_, i) => i)\n await uploadChunks(allIndices, 0)\n\n const complete = async (): Promise<string> => {\n const completeRes = await postJson<FileUploadsCompleteResponse>(\n `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/complete`,\n {},\n { headers: uploadKey ? { \"X-Upload-Key\": uploadKey } : undefined, signal: options?.signal },\n )\n\n if (completeRes.ok && (completeRes.data as any)?.ok) {\n const fileId = String((completeRes.data as any)?.fileId ?? \"\")\n if (!fileId) throw new Error(\"Upload completed without fileId\")\n return fileId\n }\n\n const code = String((completeRes.data as any)?.error ?? \"\")\n if (completeRes.status !== 409 || code !== \"missing_chunks\") {\n throw new Error(code || `Complete failed (${completeRes.status})`)\n }\n\n const statusRes = await getJson<FileUploadsStatusResponse>(\n `/api/rb/file-uploads/${encodeURIComponent(uploadId)}/status`,\n { headers: uploadKey ? { \"X-Upload-Key\": uploadKey } : undefined, signal: options?.signal },\n )\n\n if (!statusRes.ok || !(statusRes.data as any)?.ok) {\n throw new Error((statusRes.data as any)?.error ?? `Status failed (${statusRes.status})`)\n }\n\n const received = Array.isArray((statusRes.data as any)?.received) ? (statusRes.data as any).received : []\n const present = new Set<number>(received)\n const missing: number[] = []\n for (let i = 0; i < chunksTotal; i += 1) {\n if (!present.has(i)) missing.push(i)\n }\n\n if (!missing.length) {\n throw new Error(\"missing_chunks\")\n }\n\n await uploadChunks(missing, present.size)\n return complete()\n }\n\n const fileId = await complete()\n\n onProgress(100)\n return {\n id: fileId,\n url: `/api/rb/files/${encodeURIComponent(fileId)}`,\n alt: file.name,\n ...(uploadKey ? { uploadKey } : {}),\n }\n}\n\nfunction SortableTile({\n item,\n isHovered,\n enableImagePreview,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n onRetry,\n startFullscreen,\n isUploading,\n isError,\n tileClasses,\n disabled,\n isDraggingExternal,\n removeButtonAriaLabel,\n}: {\n item: FileWithState\n isHovered: boolean\n enableImagePreview: boolean\n renderItem?: (props: FilesUploadFieldRenderItemProps) => ReactNode\n onHoverEnter: () => void\n onHoverLeave: () => void\n onRemove: (id: string) => void\n onRetry: (id: string) => void\n startFullscreen: (id: string) => void\n isUploading: boolean\n isError: boolean\n tileClasses: string\n disabled: boolean\n isDraggingExternal: boolean\n removeButtonAriaLabel: string\n}) {\n const { setNodeRef, attributes, listeners, transform, transition, isDragging } = useSortable({\n id: item.id,\n disabled,\n })\n\n const tileRef = useRef<HTMLDivElement | null>(null)\n const previewRef = useRef<HTMLDivElement | null>(null)\n const [previewPosition, setPreviewPosition] = useState<{ left: number; top: number } | null>(null)\n\n const updatePreviewPosition = () => {\n const el = tileRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n setPreviewPosition({ left: rect.left + rect.width / 2, top: rect.top - 10 })\n }\n\n useEffect(() => {\n if (!enableImagePreview || !isHovered) {\n setPreviewPosition(null)\n return\n }\n\n updatePreviewPosition()\n\n let raf = 0\n const schedule = () => {\n if (raf) cancelAnimationFrame(raf)\n raf = requestAnimationFrame(() => {\n raf = 0\n updatePreviewPosition()\n })\n }\n\n window.addEventListener(\"resize\", schedule)\n window.addEventListener(\"scroll\", schedule, true)\n return () => {\n if (raf) cancelAnimationFrame(raf)\n window.removeEventListener(\"resize\", schedule)\n window.removeEventListener(\"scroll\", schedule, true)\n }\n }, [enableImagePreview, isHovered])\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n const tileContent = renderItem\n ? renderItem({\n file: { id: item.id, url: item.url, alt: item.alt, uploadKey: item.uploadKey },\n previewUrl: item.previewUrl,\n status: item.status,\n progress: item.progress,\n fileName: item.fileName,\n })\n : enableImagePreview\n ? (\n <Image\n src={item.previewUrl}\n alt={item.alt ?? \"Uploaded file\"}\n sizes=\"96px\"\n className={cn(\n \"size-full rounded-md object-cover\",\n isUploading && \"opacity-75\",\n isError && \"grayscale\"\n )}\n />\n )\n : (\n <div className=\"flex size-full items-center justify-center rounded-md bg-slate-100 px-2 text-center text-[10px] font-medium text-slate-700 dark:bg-slate-800 dark:text-slate-200\">\n <span className=\"w-full truncate\">{item.fileName ?? item.alt ?? \"Fichier\"}</span>\n </div>\n )\n\n return (\n <div\n ref={(node) => {\n tileRef.current = node\n setNodeRef(node)\n }}\n style={style}\n className={cn(\n tileClasses,\n isDragging && \"z-20 ring-2 ring-primary shadow-xl\",\n isDraggingExternal && \"opacity-0\",\n !disabled && \"cursor-grab active:cursor-grabbing\",\n isDragging && \"cursor-grabbing\",\n disabled && \"cursor-default\"\n )}\n onMouseEnter={() => {\n updatePreviewPosition()\n onHoverEnter()\n }}\n onMouseLeave={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && previewRef.current?.contains(next)) return\n onHoverLeave()\n }}\n {...attributes}\n {...listeners}\n >\n {tileContent}\n\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return\n onRemove(item.id)\n }}\n disabled={disabled}\n className=\"absolute right-1 top-1 inline-flex size-6 items-center justify-center rounded-full bg-white text-slate-700 shadow-sm transition hover:scale-105 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:bg-slate-900 dark:text-slate-200\"\n aria-label={removeButtonAriaLabel}\n >\n <X className=\"h-4 w-4\" />\n </button>\n\n {enableImagePreview &&\n isHovered &&\n previewPosition &&\n (() => {\n const preview = (\n <>\n <div\n ref={previewRef}\n className=\"pointer-events-auto fixed z-[60] w-52 -translate-x-1/2 -translate-y-full rounded-xl border border-slate-200 bg-white/95 p-3 shadow-2xl backdrop-blur dark:border-slate-700 dark:bg-slate-900/95\"\n style={{ left: previewPosition.left, top: previewPosition.top }}\n onMouseEnter={() => {\n updatePreviewPosition()\n onHoverEnter()\n }}\n onMouseLeave={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && tileRef.current?.contains(next)) return\n onHoverLeave()\n }}\n >\n <div className=\"relative overflow-hidden rounded-lg\">\n <Image src={item.url} alt={item.alt ?? \"Preview\"} sizes=\"208px\" className=\"h-40 w-full object-cover\" />\n <button\n type=\"button\"\n onClick={() => startFullscreen(item.id)}\n className=\"absolute right-2 top-2 inline-flex items-center justify-center rounded-full bg-black/70 p-2 text-white transition hover:bg-black\"\n aria-label=\"Plein écran\"\n >\n <Maximize2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </>\n )\n\n if (typeof document === \"undefined\") return preview\n return createPortal(preview, document.body)\n })()}\n\n {isUploading && (\n <div\n className=\"absolute inset-0 z-20 flex flex-col items-center justify-center gap-2 rounded-lg bg-black/40 text-white\"\n role=\"progressbar\"\n aria-label={item.fileName ?? item.alt ?? \"File\"}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={item.progress}\n >\n <Loader2 className=\"h-5 w-5 animate-spin\" aria-hidden=\"true\" />\n <div className=\"h-1.5 w-5/6 rounded-full bg-white/20\">\n <div className=\"h-full rounded-full bg-primary\" style={{ width: `${item.progress}%` }} />\n </div>\n <div className=\"text-xs font-semibold\">{item.progress}%</div>\n </div>\n )}\n\n {isError && (\n <div\n className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-lg bg-red-600/70 text-white\"\n role=\"alert\"\n >\n <div className=\"max-w-[92%] break-words text-center text-[10px] font-semibold leading-tight\" title={item.errorMessage}>\n {getErrorLabel(item.errorMessage)}\n </div>\n <button\n type=\"button\"\n onClick={() => onRetry(item.id)}\n disabled={disabled}\n className=\"rounded-full bg-white/90 px-3 py-1 text-xs font-semibold text-red-700 shadow-sm transition hover:bg-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n >\n Réessayer\n </button>\n </div>\n )}\n </div>\n )\n}\n\ntype UploadResult = FilesUploadFieldFile | Promise<FilesUploadFieldFile>\n\nexport type FileUploadAccessScope = \"owner\" | \"tenant\" | \"public\"\n\nexport type FilesUploadFieldUploadOptions = {\n signal?: AbortSignal\n isPublic?: boolean\n accessScope?: FileUploadAccessScope\n deduplicationNamespace?: string\n}\n\nexport type FilesUploadFieldUploadHandler = (\n file: File,\n onProgress: (progress: number) => void,\n options?: FilesUploadFieldUploadOptions,\n) => UploadResult\n\nexport type FilesUploadFieldRenderItemProps = {\n file: FilesUploadFieldFile\n previewUrl: string\n status: \"uploaded\" | \"uploading\" | \"error\"\n progress: number\n fileName?: string\n}\n\ntype FilesUploadFieldBaseProps = {\n initialFiles?: FilesUploadFieldFile[]\n onChange?: (files: FilesUploadFieldFile[]) => void\n upload?: FilesUploadFieldUploadHandler\n uploadDeduplicationNamespace?: string\n maxFiles?: number\n disabled?: boolean\n onUploadingChange?: (isUploading: boolean) => void\n accept?: string | string[]\n renderHeader?: () => ReactNode\n renderItem?: (props: FilesUploadFieldRenderItemProps) => ReactNode\n addButtonAriaLabel?: string\n removeButtonAriaLabel?: string\n variant?: \"card\" | \"bare\"\n}\n\ntype FilesUploadFieldVisibilityProps =\n | { uploadAccessScope?: never; uploadIsPublic?: boolean }\n | { uploadAccessScope: FileUploadAccessScope; uploadIsPublic?: never }\n\nexport type FilesUploadFieldProps = FilesUploadFieldBaseProps & FilesUploadFieldVisibilityProps\n\ntype FileWithState = FilesUploadFieldFile & {\n renderKey: string\n previewUrl: string\n status: \"uploaded\" | \"uploading\" | \"error\"\n progress: number\n fileName?: string\n mimeType?: string\n errorMessage?: string\n}\n\nfunction toPreview(file: File) {\n return URL.createObjectURL(file)\n}\n\nasync function preloadImagePreview(src: string) {\n const image = document.createElement(\"img\")\n const srcSet = getImageSrcSet(src)\n if (srcSet) {\n image.srcset = srcSet\n image.sizes = \"96px\"\n }\n image.src = isRpcbaseFileImageSrc(src) ? withImageWidth(src, 960) : src\n if (typeof image.decode === \"function\") {\n await image.decode().catch(() => undefined)\n return\n }\n if (image.complete) return\n\n await new Promise<void>((resolve) => {\n image.onload = () => resolve()\n image.onerror = () => resolve()\n })\n}\n\nconst getErrorMessage = (error: unknown): string => {\n if (error instanceof Error) return error.message\n if (typeof error === \"string\") return error\n return \"Upload failed\"\n}\n\nconst getErrorLabel = (message: string | undefined): string => {\n if (!message) return \"Échec\"\n if (message.startsWith(\"heif_decode_unsupported\")) return \"HEIC/HEVC non supporté\"\n return message\n}\n\nconst IMAGE_FILE_NAME_RE = /\\.(png|jpe?g|gif|webp|avif|heic|heif|svg|bmp)$/i\nconst DROP_ANIMATION_FALLBACK_MS = 350\n\nconst hideDraggedTileDropSideEffects = defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: \"0\",\n },\n },\n})\n\nconst isImageItem = (item: FileWithState): boolean => {\n if (item.mimeType) return item.mimeType.startsWith(\"image/\")\n return IMAGE_FILE_NAME_RE.test(item.fileName ?? item.alt ?? \"\")\n}\n\nexport function FilesUploadField({\n initialFiles = [],\n onChange,\n upload = defaultUpload,\n uploadIsPublic,\n uploadAccessScope,\n uploadDeduplicationNamespace,\n maxFiles,\n disabled = false,\n onUploadingChange,\n accept,\n renderHeader,\n renderItem,\n addButtonAriaLabel = \"Ajouter un fichier\",\n removeButtonAriaLabel = \"Supprimer le fichier\",\n variant = \"card\",\n}: FilesUploadFieldProps) {\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [images, setImages] = useState<FileWithState[]>(() =>\n initialFiles.map((file) => ({\n ...file,\n renderKey: file.id,\n previewUrl: file.url,\n status: \"uploaded\",\n progress: 100,\n }))\n )\n const [dragActive, setDragActive] = useState(false)\n const [fullscreenIndex, setFullscreenIndex] = useState<number | null>(null)\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n const [activeId, setActiveId] = useState<string | null>(null)\n const [dropAnimatingId, setDropAnimatingId] = useState<string | null>(null)\n const hoverTimeoutRef = useRef<number | null>(null)\n const dropAnimationFallbackRef = useRef<{ id: string; timeout: number } | null>(null)\n const hasDragOverlayRef = useRef(false)\n const clearDropAnimationRef = useRef<(id: string) => void>(() => {})\n const dropAnimationRef = useRef<DropAnimation>({\n sideEffects(args) {\n const id = String(args.active.id)\n const fallback = dropAnimationFallbackRef.current\n if (fallback?.id === id) {\n window.clearTimeout(fallback.timeout)\n dropAnimationFallbackRef.current = null\n }\n\n const cleanup = hideDraggedTileDropSideEffects(args)\n\n return () => {\n cleanup?.()\n clearDropAnimationRef.current(id)\n }\n },\n })\n const skipNotifyRef = useRef(true)\n const imagesRef = useRef<FileWithState[]>([])\n const lastInitialImagesRef = useRef<FilesUploadFieldFile[]>(initialFiles)\n const onChangeRef = useRef(onChange)\n const onUploadingChangeRef = useRef(onUploadingChange)\n const replacedIdRef = useRef<Map<string, string>>(new Map())\n const fileRef = useRef<Map<string, File>>(new Map())\n const abortRef = useRef<Map<string, AbortController>>(new Map())\n const objectUrlRef = useRef<Map<string, string>>(new Map())\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n )\n\n useEffect(() => {\n return () => {\n for (const controller of abortRef.current.values()) {\n try {\n controller.abort()\n } catch {\n //\n }\n }\n abortRef.current.clear()\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n dropAnimationFallbackRef.current = null\n }\n fileRef.current.clear()\n replacedIdRef.current.clear()\n\n for (const url of objectUrlRef.current.values()) {\n if (typeof URL !== \"undefined\") {\n try {\n URL.revokeObjectURL(url)\n } catch {\n //\n }\n }\n }\n objectUrlRef.current.clear()\n }\n }, [])\n\n clearDropAnimationRef.current = (id: string) => {\n const fallback = dropAnimationFallbackRef.current\n if (fallback?.id === id) {\n window.clearTimeout(fallback.timeout)\n dropAnimationFallbackRef.current = null\n }\n\n setDropAnimatingId((current) => (current === id ? null : current))\n }\n\n useEffect(() => {\n if (typeof document === \"undefined\") return\n if (activeId) {\n document.body.style.cursor = \"grabbing\"\n return () => {\n document.body.style.cursor = \"\"\n }\n }\n document.body.style.cursor = \"\"\n }, [activeId])\n\n useEffect(() => {\n imagesRef.current = images\n }, [images])\n\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n useEffect(() => {\n onUploadingChangeRef.current = onUploadingChange\n }, [onUploadingChange])\n\n useEffect(() => {\n const previous = lastInitialImagesRef.current\n const samePropValue =\n previous.length === initialFiles.length &&\n previous.every((img, index) => {\n const next = initialFiles[index]\n return next && img.id === next.id && img.url === next.url && img.alt === next.alt\n })\n\n if (samePropValue) return\n lastInitialImagesRef.current = initialFiles\n\n const renderKeysById = new Map(imagesRef.current.map((img) => [img.id, img.renderKey]))\n const prepared: FileWithState[] = initialFiles.map((img) => ({\n ...img,\n renderKey: renderKeysById.get(img.id) ?? img.id,\n previewUrl: img.url,\n status: \"uploaded\",\n progress: 100,\n }))\n\n const preparedRawIds = new Set(prepared.map((img) => img.id))\n for (const [tempId, finalId] of replacedIdRef.current.entries()) {\n if (preparedRawIds.has(finalId)) {\n replacedIdRef.current.delete(tempId)\n }\n }\n\n const currentIds = new Set(imagesRef.current.map((img) => img.id))\n const hasStaleInitialImages = prepared.some((img) => {\n const mapped = replacedIdRef.current.get(img.id)\n return mapped ? currentIds.has(mapped) : false\n })\n if (hasStaleInitialImages) return\n\n const preparedIds = new Set(prepared.map((img) => img.id))\n for (const img of imagesRef.current) {\n if (preparedIds.has(img.id)) continue\n\n const controller = abortRef.current.get(img.id)\n if (controller) {\n abortRef.current.delete(img.id)\n try {\n controller.abort()\n } catch {\n //\n }\n }\n\n fileRef.current.delete(img.id)\n\n const tempUrl = objectUrlRef.current.get(img.id)\n if (tempUrl) {\n objectUrlRef.current.delete(img.id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n }\n\n setImages((current) => {\n const sameLength = current.length === prepared.length\n const sameContent =\n sameLength &&\n current.every((item, index) => {\n const next = prepared[index]\n return next && item.id === next.id && item.url === next.url && item.alt === next.alt && item.uploadKey === next.uploadKey\n })\n\n if (sameContent) return current\n\n skipNotifyRef.current = true\n return prepared\n })\n }, [initialFiles])\n\n useEffect(() => {\n if (skipNotifyRef.current) {\n skipNotifyRef.current = false\n return\n }\n\n onChangeRef.current?.(images.map(({ id, url, alt, uploadKey }) => ({ id, url, alt, uploadKey })))\n }, [images])\n\n useEffect(() => {\n onUploadingChangeRef.current?.(images.some((img) => img.status === \"uploading\"))\n }, [images])\n\n useEffect(() => {\n if (fullscreenIndex === null) {\n return\n }\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setFullscreenIndex(null)\n return\n }\n\n if (event.key === \"ArrowRight\") {\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current + 1) % images.length\n })\n return\n }\n\n if (event.key === \"ArrowLeft\") {\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current - 1 + images.length) % images.length\n })\n }\n }\n\n window.addEventListener(\"keydown\", handleKey)\n return () => window.removeEventListener(\"keydown\", handleKey)\n }, [fullscreenIndex, images.length])\n\n const handleFiles = async (files: FileList | File[]) => {\n if (disabled) return\n const normalizedMaxFiles = typeof maxFiles === \"number\" && Number.isFinite(maxFiles) && maxFiles > 0\n ? Math.floor(maxFiles)\n : null\n const remaining = normalizedMaxFiles === null\n ? Number.POSITIVE_INFINITY\n : Math.max(0, normalizedMaxFiles - imagesRef.current.length)\n const list = Array.from(files).slice(0, remaining)\n if (!list.length) return\n\n const uploads = list.map((file) => {\n const previewUrl = toPreview(file)\n const tempId = crypto.randomUUID()\n\n objectUrlRef.current.set(tempId, previewUrl)\n fileRef.current.set(tempId, file)\n\n const next: FileWithState = {\n id: tempId,\n url: previewUrl,\n renderKey: tempId,\n previewUrl,\n alt: file.name,\n status: \"uploading\",\n progress: 0,\n fileName: file.name,\n mimeType: file.type,\n }\n\n setImages((current) => [...current, next])\n\n const updateProgress = (value: number) => {\n const nextValue = Math.max(0, Math.min(99, value))\n setImages((current) =>\n current.map((item) =>\n item.id === tempId ? { ...item, progress: nextValue, status: \"uploading\" } : item\n )\n )\n }\n\n const finalize = async () => {\n const controller = new AbortController()\n abortRef.current.set(tempId, controller)\n\n try {\n const result = await upload(file, updateProgress, {\n signal: controller.signal,\n ...(uploadAccessScope ? { accessScope: uploadAccessScope } : { isPublic: uploadIsPublic ?? false }),\n ...(uploadDeduplicationNamespace ? { deduplicationNamespace: uploadDeduplicationNamespace } : {}),\n })\n replacedIdRef.current.set(tempId, result.id)\n\n const tempUrl = objectUrlRef.current.get(tempId)\n if (file.type.startsWith(\"image/\")) {\n await preloadImagePreview(result.url)\n }\n\n abortRef.current.delete(tempId)\n fileRef.current.delete(tempId)\n\n setImages((current) =>\n current.map((item) =>\n item.id === tempId\n ? {\n ...item,\n ...result,\n previewUrl: result.url,\n url: result.url,\n status: \"uploaded\",\n progress: 100,\n errorMessage: undefined,\n }\n : item\n )\n )\n\n if (tempUrl) {\n objectUrlRef.current.delete(tempId)\n window.requestAnimationFrame(() => URL.revokeObjectURL(tempUrl))\n }\n } catch (error) {\n abortRef.current.delete(tempId)\n if (controller.signal.aborted) {\n fileRef.current.delete(tempId)\n const tempUrl = objectUrlRef.current.get(tempId)\n if (tempUrl) {\n objectUrlRef.current.delete(tempId)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n return\n }\n console.error(\"Upload failed\", error)\n const errorMessage = getErrorMessage(error)\n setImages((current) =>\n current.map((item) =>\n item.id === tempId\n ? { ...item, status: \"error\", progress: Math.max(0, Math.min(99, item.progress)), errorMessage }\n : item\n )\n )\n }\n }\n\n return finalize()\n })\n\n await Promise.allSettled(uploads)\n }\n\n const onFileInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!event.target.files) return\n void handleFiles(event.target.files)\n event.target.value = \"\"\n }\n\n const openFileDialog = () => {\n if (disabled) return\n fileInputRef.current?.click()\n }\n\n const removeImage = (id: string) => {\n const controller = abortRef.current.get(id)\n if (controller) {\n abortRef.current.delete(id)\n try {\n controller.abort()\n } catch {\n //\n }\n }\n\n fileRef.current.delete(id)\n\n const tempUrl = objectUrlRef.current.get(id)\n if (tempUrl) {\n objectUrlRef.current.delete(id)\n try {\n URL.revokeObjectURL(tempUrl)\n } catch {\n //\n }\n }\n\n setImages((current) => current.filter((item) => item.id !== id))\n }\n\n const retryUpload = (id: string) => {\n if (disabled) return\n const file = fileRef.current.get(id)\n if (!file) return\n\n const existingController = abortRef.current.get(id)\n if (existingController) {\n try {\n existingController.abort()\n } catch {\n //\n }\n abortRef.current.delete(id)\n }\n\n setImages((current) =>\n current.map((item) => (item.id === id ? { ...item, status: \"uploading\", progress: 0, errorMessage: undefined } : item))\n )\n\n const updateProgress = (value: number) => {\n const nextValue = Math.max(0, Math.min(99, value))\n setImages((current) =>\n current.map((item) => (item.id === id ? { ...item, progress: nextValue, status: \"uploading\" } : item))\n )\n }\n\n const controller = new AbortController()\n abortRef.current.set(id, controller)\n\n void (async () => {\n try {\n const result = await upload(file, updateProgress, {\n signal: controller.signal,\n ...(uploadAccessScope ? { accessScope: uploadAccessScope } : { isPublic: uploadIsPublic ?? false }),\n ...(uploadDeduplicationNamespace ? { deduplicationNamespace: uploadDeduplicationNamespace } : {}),\n })\n replacedIdRef.current.set(id, result.id)\n\n const tempUrl = objectUrlRef.current.get(id)\n if (file.type.startsWith(\"image/\")) {\n await preloadImagePreview(result.url)\n }\n\n abortRef.current.delete(id)\n fileRef.current.delete(id)\n\n setImages((current) =>\n current.map((item) =>\n item.id === id\n ? { ...item, ...result, previewUrl: result.url, url: result.url, status: \"uploaded\", progress: 100, errorMessage: undefined }\n : item\n )\n )\n\n if (tempUrl) {\n objectUrlRef.current.delete(id)\n window.requestAnimationFrame(() => URL.revokeObjectURL(tempUrl))\n }\n } catch (error) {\n abortRef.current.delete(id)\n if (controller.signal.aborted) return\n console.error(\"Retry failed\", error)\n const errorMessage = getErrorMessage(error)\n setImages((current) => current.map((item) => (item.id === id ? { ...item, status: \"error\", errorMessage } : item)))\n }\n })()\n }\n\n const startFullscreen = (id: string) => {\n const index = images.findIndex((item) => item.id === id)\n if (index !== -1) {\n setFullscreenIndex(index)\n }\n }\n\n const clearPendingDropAnimation = () => {\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n dropAnimationFallbackRef.current = null\n }\n setDropAnimatingId(null)\n }\n\n const scheduleDropAnimationFallback = (id: string) => {\n if (dropAnimationFallbackRef.current !== null) {\n window.clearTimeout(dropAnimationFallbackRef.current.timeout)\n }\n\n dropAnimationFallbackRef.current = {\n id,\n timeout: window.setTimeout(() => {\n dropAnimationFallbackRef.current = null\n setDropAnimatingId((current) => (current === id ? null : current))\n }, DROP_ANIMATION_FALLBACK_MS),\n }\n }\n\n const finishDrag = (id: string) => {\n if (hasDragOverlayRef.current) {\n setDropAnimatingId(id)\n scheduleDropAnimationFallback(id)\n }\n setActiveId(null)\n }\n\n const handleDragStart = (event: DragStartEvent) => {\n clearPendingDropAnimation()\n setActiveId(String(event.active.id))\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n const activeId = String(active.id)\n\n if (!over) {\n finishDrag(activeId)\n return\n }\n\n const overId = String(over.id)\n\n if (activeId !== overId) {\n setImages((current) => {\n const oldIndex = current.findIndex((item) => item.id === activeId)\n const newIndex = current.findIndex((item) => item.id === overId)\n if (oldIndex === -1 || newIndex === -1) return current\n return arrayMove(current, oldIndex, newIndex)\n })\n }\n\n finishDrag(activeId)\n }\n\n const handleDragCancel = () => {\n if (activeId) {\n finishDrag(activeId)\n return\n }\n\n setActiveId(null)\n }\n\n const clearHoverTimeout = () => {\n if (hoverTimeoutRef.current !== null) {\n window.clearTimeout(hoverTimeoutRef.current)\n hoverTimeoutRef.current = null\n }\n }\n\n const fullscreenImage = useMemo(() => {\n if (fullscreenIndex === null) return null\n return images[fullscreenIndex] ?? null\n }, [fullscreenIndex, images])\n\n const containerClasses = cn(\n variant === \"bare\"\n ? \"rounded-lg transition-colors\"\n : \"rounded-xl border border-dashed border-slate-300 bg-white/70 p-4 shadow-sm transition-colors dark:border-slate-700 dark:bg-slate-900/60\",\n dragActive && (variant === \"bare\" ? \"bg-primary/5 ring-2 ring-primary/50\" : \"border-primary ring-2 ring-primary/50\"),\n disabled && \"opacity-70\"\n )\n\n const tileBaseClasses = \"group relative size-20 overflow-visible rounded-lg border border-slate-200 bg-slate-50 shadow-inner transition hover:shadow md:size-24 dark:border-slate-700 dark:bg-slate-800\"\n\n const acceptAttr = useMemo(() => {\n if (!accept) return undefined\n if (Array.isArray(accept)) return accept.join(\",\")\n return accept\n }, [accept])\n\n const enableImagePreview = useMemo(() => {\n if (renderItem) return false\n if (!acceptAttr) return false\n const tokens = acceptAttr.split(\",\").map((value) => value.trim()).filter(Boolean)\n if (!tokens.length) return false\n return tokens.every((token) =>\n token === \"image/*\" ||\n token.startsWith(\"image/\") ||\n token === \".heic\" ||\n token === \".heif\" ||\n token === \".heics\" ||\n token === \".heifs\"\n )\n }, [acceptAttr, renderItem])\n\n const canPreviewItem = (item: FileWithState) => enableImagePreview || (!renderItem && isImageItem(item))\n const normalizedMaxFiles = typeof maxFiles === \"number\" && Number.isFinite(maxFiles) && maxFiles > 0\n ? Math.floor(maxFiles)\n : null\n const canAddFiles = !disabled && (normalizedMaxFiles === null || images.length < normalizedMaxFiles)\n const statusItem = images.find((item) => item.status === \"error\") ??\n images.find((item) => item.status === \"uploading\")\n const uploadStatusMessage = statusItem\n ? statusItem.status === \"error\"\n ? getErrorLabel(statusItem.errorMessage)\n : `${statusItem.fileName ?? statusItem.alt ?? \"File\"}: ${statusItem.progress}%`\n : \"\"\n\n const toRenderItemProps = (item: FileWithState): FilesUploadFieldRenderItemProps => ({\n file: { id: item.id, url: item.url, alt: item.alt, uploadKey: item.uploadKey },\n previewUrl: item.previewUrl,\n status: item.status,\n progress: item.progress,\n fileName: item.fileName,\n })\n\n const dragOverlayContent = activeId\n ? (() => {\n const activeItem = images.find((item) => item.id === activeId)\n if (!activeItem) return null\n\n if (renderItem) {\n const rendered = renderItem(toRenderItemProps(activeItem))\n if (rendered === null || rendered === undefined || rendered === false) return null\n return (\n <div className=\"pointer-events-none\">\n <div className=\"h-24 w-24 overflow-hidden rounded-lg shadow-2xl\">{rendered}</div>\n </div>\n )\n }\n\n if (!canPreviewItem(activeItem)) return null\n return (\n <div className=\"pointer-events-none\">\n <Image\n src={activeItem.previewUrl}\n alt={activeItem.alt ?? \"Dragged image\"}\n sizes=\"96px\"\n className=\"h-24 w-24 rounded-lg object-cover shadow-2xl\"\n />\n </div>\n )\n })()\n : null\n\n const hasDragOverlay = dragOverlayContent !== null && dragOverlayContent !== undefined\n const hiddenDraggedTileId = hasDragOverlay ? activeId : dropAnimatingId\n hasDragOverlayRef.current = hasDragOverlay\n\n return (\n <div\n onDragOver={(event) => {\n event.preventDefault()\n if (canAddFiles) {\n setDragActive(true)\n }\n }}\n onDragLeave={() => setDragActive(false)}\n onDrop={(event) => {\n event.preventDefault()\n setDragActive(false)\n if (canAddFiles && event.dataTransfer.files?.length) {\n void handleFiles(event.dataTransfer.files)\n }\n }}\n className={containerClasses}\n >\n {renderHeader ? <div className=\"mb-3\">{renderHeader()}</div> : null}\n <div role=\"status\" className=\"sr-only\">{uploadStatusMessage}</div>\n\n <DndContext\n sensors={disabled ? undefined : sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <SortableContext items={images.map((item) => item.id)} strategy={rectSortingStrategy}>\n <div className=\"flex flex-wrap gap-3\">\n {images.map((item) => {\n const isUploading = item.status === \"uploading\"\n const isError = item.status === \"error\"\n\n return (\n <SortableTile\n key={item.renderKey}\n item={item}\n isHovered={hoveredId === item.id}\n enableImagePreview={canPreviewItem(item)}\n renderItem={renderItem}\n onHoverEnter={() => {\n clearHoverTimeout()\n setHoveredId(item.id)\n }}\n onHoverLeave={() => {\n clearHoverTimeout()\n hoverTimeoutRef.current = window.setTimeout(() => {\n setHoveredId((current) => (current === item.id ? null : current))\n hoverTimeoutRef.current = null\n }, 120)\n }}\n onRemove={removeImage}\n onRetry={retryUpload}\n startFullscreen={startFullscreen}\n isUploading={isUploading}\n isError={isError}\n tileClasses={tileBaseClasses}\n disabled={disabled}\n isDraggingExternal={hiddenDraggedTileId === item.id}\n removeButtonAriaLabel={removeButtonAriaLabel}\n />\n )\n })}\n\n {canAddFiles && (variant === \"bare\" && images.length === 0 ? (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className=\"flex w-full flex-col items-center justify-center gap-1 rounded-lg border border-dashed border-slate-300 px-4 py-6 text-slate-500 transition-colors hover:border-slate-400 hover:bg-slate-50 hover:text-slate-600 dark:border-slate-700 dark:hover:bg-slate-800/50\"\n aria-label={addButtonAriaLabel}\n >\n <Plus className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium\">{addButtonAriaLabel}</span>\n <span className=\"text-[11px] text-slate-400 dark:text-slate-500\">ou glissez-déposez ici</span>\n </button>\n ) : variant === \"bare\" ? (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className=\"flex size-20 items-center justify-center rounded-lg border border-dashed border-slate-300 text-slate-400 transition-colors hover:border-slate-400 hover:bg-slate-50 hover:text-slate-600 md:size-24 dark:border-slate-700 dark:hover:bg-slate-800/50 dark:hover:text-slate-300\"\n aria-label={addButtonAriaLabel}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <Plus className=\"h-4 w-4\" />\n <span className=\"text-[11px] font-medium\">Ajouter</span>\n </div>\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={openFileDialog}\n disabled={disabled}\n className={cn(\n tileBaseClasses,\n \"flex items-center justify-center border-dashed bg-white text-slate-500 hover:border-slate-300 dark:bg-slate-900\"\n )}\n aria-label={addButtonAriaLabel}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <div className=\"flex size-9 items-center justify-center rounded-full border border-slate-300 bg-slate-100 text-slate-600 shadow-inner dark:border-slate-700 dark:bg-slate-800 dark:text-slate-200\">\n <Plus className=\"h-5 w-5\" />\n </div>\n <span className=\"text-xs font-medium\">Ajouter</span>\n </div>\n </button>\n ))}\n </div>\n </SortableContext>\n {(() => {\n const overlay = <DragOverlay dropAnimation={dropAnimationRef.current}>{dragOverlayContent}</DragOverlay>\n\n if (typeof document === \"undefined\") return overlay\n return createPortal(overlay, document.body)\n })()}\n </DndContext>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptAttr}\n multiple={normalizedMaxFiles !== 1}\n disabled={!canAddFiles}\n className=\"hidden\"\n onChange={onFileInputChange}\n aria-hidden\n />\n\n {fullscreenImage && canPreviewItem(fullscreenImage) && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/90\">\n <button\n type=\"button\"\n className=\"absolute left-6 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white shadow-lg transition hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() =>\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current - 1 + images.length) % images.length\n })\n }\n aria-label=\"Précédent\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\">\n <path d=\"M15 18l-6-6 6-6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n <div className=\"relative max-h-[80vh] max-w-4xl\">\n <Image\n src={fullscreenImage.url}\n alt={fullscreenImage.alt ?? \"Fullscreen\"}\n sizes=\"(max-width: 1024px) 100vw, 1024px\"\n className=\"max-h-[80vh] max-w-full rounded-lg object-contain shadow-2xl\"\n />\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex size-9 items-center justify-center rounded-full bg-black/70 text-white transition hover:bg-black focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() => setFullscreenIndex(null)}\n aria-label=\"Fermer\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <button\n type=\"button\"\n className=\"absolute right-6 top-1/2 -translate-y-1/2 rounded-full bg-white/10 p-3 text-white shadow-lg transition hover:bg-white/20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white\"\n onClick={() =>\n setFullscreenIndex((current) => {\n if (current === null) return current\n return (current + 1) % images.length\n })\n }\n aria-label=\"Suivant\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-6 w-6\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\">\n <path d=\"M9 6l6 6-6 6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index299.js","names":[],"sources":["../src/components/ImagesField/index.tsx"],"sourcesContent":["import type { FilesUploadFieldFile, FilesUploadFieldProps } from \"../FilesUploadField\"\nimport { FilesUploadField } from \"../FilesUploadField\"\n\n\nexport type ImagesFieldImage = FilesUploadFieldFile\n\ntype ToImagesFieldProps<T> = T extends unknown\n ? Omit<T, \"initialFiles\" | \"onChange\"> & {\n initialImages?: ImagesFieldImage[]\n onChange?: (images: ImagesFieldImage[]) => void\n }\n : never\n\nexport type ImagesFieldProps = ToImagesFieldProps<FilesUploadFieldProps>\n\nconst defaultImageAccept = [\"image/*\", \".heic\", \".heif\", \"image/heic\", \"image/heif\", \"image/heic-sequence\", \"image/heif-sequence\"]\n\nexport function ImagesField({\n initialImages = [],\n onChange,\n accept = defaultImageAccept,\n addButtonAriaLabel = \"Ajouter une image\",\n removeButtonAriaLabel = \"Supprimer l'image\",\n ...props\n}: ImagesFieldProps) {\n return (\n <FilesUploadField\n initialFiles={initialImages}\n onChange={onChange}\n accept={accept}\n addButtonAriaLabel={addButtonAriaLabel}\n removeButtonAriaLabel={removeButtonAriaLabel}\n {...props}\n />\n )\n}\n"],"mappings":";;;AAeA,IAAM,IAAqB;CAAC;CAAW;CAAS;CAAS;CAAc;CAAc;CAAuB;AAAqB;AAEjI,SAAgB,EAAY,EAC1B,mBAAgB,CAAA,GAChB,aACA,YAAS,GACT,wBAAqB,qBACrB,2BAAwB,qBACxB,GAAG,KACgB;CACnB,OACE,kBAAC,GAAD;EACE,cAAc;EACJ;EACF;EACY;EACG;EACvB,GAAI;CAAM,CAAA;AAGhB"}
|
package/dist/index3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index3.js","names":[
|
|
1
|
+
{"version":3,"file":"index3.js","names":[],"sources":["../src/helpers/isMobileDevice.ts"],"sourcesContent":["export const isMobileDevice = () => {\n if (typeof navigator === \"undefined\") return false\n return /Android|iPhone|iPad|iPod/i.test(navigator.userAgent)\n}\n"],"mappings":";AAAA,IAAa,UACP,OAAO,YAAc,MAAoB,KACtC,4BAA4B,KAAK,UAAU,SAAS"}
|