tempest-react-sdk 0.77.0 → 0.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1623) hide show
  1. package/README.md +6 -6
  2. package/bin/lib/alias/collect.mjs +20 -3
  3. package/bin/lib/alias/index.mjs +12 -1
  4. package/bin/lib/alias/index.test.mjs +24 -0
  5. package/bin/lib/css/analyze.test.mjs +21 -1
  6. package/bin/lib/css/collect.mjs +14 -0
  7. package/bin/lib/css/extract.mjs +63 -5
  8. package/bin/lib/css/extract.test.mjs +110 -1
  9. package/bin/lib/css/fix.e2e.test.mjs +50 -0
  10. package/bin/lib/css/index.mjs +6 -1
  11. package/bin/lib/fs/contain.mjs +50 -0
  12. package/bin/lib/icons/generate.mjs +28 -3
  13. package/bin/lib/icons/generate.test.mjs +57 -1
  14. package/bin/lib/openapi/escape.mjs +20 -6
  15. package/bin/lib/openapi/generate.encode.test.mjs +120 -0
  16. package/bin/lib/openapi/generate.hostile.test.mjs +38 -9
  17. package/bin/lib/openapi/generate.mjs +203 -64
  18. package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
  19. package/bin/lib/openapi/generate.test.mjs +270 -3
  20. package/bin/lib/openapi/schema-to-zod.mjs +5 -3
  21. package/bin/tempest-gen.test.mjs +188 -0
  22. package/bin/tempest.mjs +120 -44
  23. package/dist/access/Can.cjs.map +1 -1
  24. package/dist/access/Can.js.map +1 -1
  25. package/dist/access/access-control-context.cjs.map +1 -1
  26. package/dist/access/access-control-context.js.map +1 -1
  27. package/dist/access/create-role-access-control.cjs.map +1 -1
  28. package/dist/access/create-role-access-control.js.map +1 -1
  29. package/dist/access/permissions-from-token.cjs.map +1 -1
  30. package/dist/access/permissions-from-token.js.map +1 -1
  31. package/dist/access/use-can.cjs.map +1 -1
  32. package/dist/access/use-can.js.map +1 -1
  33. package/dist/app/AppProviders.cjs.map +1 -1
  34. package/dist/app/AppProviders.js.map +1 -1
  35. package/dist/audio/audio-bus.cjs.map +1 -1
  36. package/dist/audio/audio-bus.js.map +1 -1
  37. package/dist/audio/audio-output.cjs.map +1 -1
  38. package/dist/audio/audio-output.js.map +1 -1
  39. package/dist/audio/audio-player.cjs.map +1 -1
  40. package/dist/audio/audio-player.js.map +1 -1
  41. package/dist/audio/audio-recorder.cjs.map +1 -1
  42. package/dist/audio/audio-recorder.js.map +1 -1
  43. package/dist/audio/duration.cjs.map +1 -1
  44. package/dist/audio/duration.js.map +1 -1
  45. package/dist/audio/level-meter.cjs.map +1 -1
  46. package/dist/audio/level-meter.js.map +1 -1
  47. package/dist/audio/media-access.cjs.map +1 -1
  48. package/dist/audio/media-access.js.map +1 -1
  49. package/dist/audio/noise-floor.cjs.map +1 -1
  50. package/dist/audio/noise-floor.js.map +1 -1
  51. package/dist/audio/sfx-pool.cjs.map +1 -1
  52. package/dist/audio/sfx-pool.js.map +1 -1
  53. package/dist/audio/use-audio-bus.cjs.map +1 -1
  54. package/dist/audio/use-audio-bus.js.map +1 -1
  55. package/dist/audio/use-audio-recorder.cjs.map +1 -1
  56. package/dist/audio/use-audio-recorder.js.map +1 -1
  57. package/dist/audio/use-audio.cjs.map +1 -1
  58. package/dist/audio/use-audio.js.map +1 -1
  59. package/dist/audio/use-microphone.cjs +1 -1
  60. package/dist/audio/use-microphone.cjs.map +1 -1
  61. package/dist/audio/use-microphone.js +1 -5
  62. package/dist/audio/use-microphone.js.map +1 -1
  63. package/dist/audio/use-sfx-pool.cjs.map +1 -1
  64. package/dist/audio/use-sfx-pool.js.map +1 -1
  65. package/dist/audio/voice-activity.cjs.map +1 -1
  66. package/dist/audio/voice-activity.js.map +1 -1
  67. package/dist/audio/voice-chain-stages.cjs.map +1 -1
  68. package/dist/audio/voice-chain-stages.js.map +1 -1
  69. package/dist/audio/voice-chain.cjs.map +1 -1
  70. package/dist/audio/voice-chain.js.map +1 -1
  71. package/dist/audio/wav.cjs.map +1 -1
  72. package/dist/audio/wav.js.map +1 -1
  73. package/dist/auth/AuthGuard.cjs.map +1 -1
  74. package/dist/auth/AuthGuard.js.map +1 -1
  75. package/dist/auth/create-auth-store.cjs.map +1 -1
  76. package/dist/auth/create-auth-store.js.map +1 -1
  77. package/dist/auth/create-tempest-auth.cjs +1 -1
  78. package/dist/auth/create-tempest-auth.cjs.map +1 -1
  79. package/dist/auth/create-tempest-auth.js +185 -114
  80. package/dist/auth/create-tempest-auth.js.map +1 -1
  81. package/dist/auth/jwt.cjs.map +1 -1
  82. package/dist/auth/jwt.js.map +1 -1
  83. package/dist/auth/lazy-with-retry.cjs.map +1 -1
  84. package/dist/auth/lazy-with-retry.js.map +1 -1
  85. package/dist/auth/passkey.cjs.map +1 -1
  86. package/dist/auth/passkey.js.map +1 -1
  87. package/dist/auth/refresh-queue.cjs.map +1 -1
  88. package/dist/auth/refresh-queue.js.map +1 -1
  89. package/dist/auth/use-passkey.cjs +1 -1
  90. package/dist/auth/use-passkey.cjs.map +1 -1
  91. package/dist/auth/use-passkey.js +1 -1
  92. package/dist/auth/use-passkey.js.map +1 -1
  93. package/dist/br/BrazilMap.cjs.map +1 -1
  94. package/dist/br/BrazilMap.js.map +1 -1
  95. package/dist/br/BrazilMap.module.cjs.map +1 -1
  96. package/dist/br/BrazilMap.module.js.map +1 -1
  97. package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
  98. package/dist/br/BrazilStateCitySelect.js.map +1 -1
  99. package/dist/br/BrazilStateMap.cjs.map +1 -1
  100. package/dist/br/BrazilStateMap.js.map +1 -1
  101. package/dist/br/MapLegend.cjs.map +1 -1
  102. package/dist/br/MapLegend.js.map +1 -1
  103. package/dist/br/MapLegend.module.cjs.map +1 -1
  104. package/dist/br/MapLegend.module.js.map +1 -1
  105. package/dist/br/MapMarkers.cjs.map +1 -1
  106. package/dist/br/MapMarkers.js.map +1 -1
  107. package/dist/br/MapTooltip.cjs.map +1 -1
  108. package/dist/br/MapTooltip.js.map +1 -1
  109. package/dist/br/MunicipalitySearch.cjs +1 -1
  110. package/dist/br/MunicipalitySearch.cjs.map +1 -1
  111. package/dist/br/MunicipalitySearch.js +2 -5
  112. package/dist/br/MunicipalitySearch.js.map +1 -1
  113. package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
  114. package/dist/br/MunicipalitySearch.module.js.map +1 -1
  115. package/dist/br/PixQRCode.cjs.map +1 -1
  116. package/dist/br/PixQRCode.js.map +1 -1
  117. package/dist/br/PixQRCode.module.cjs.map +1 -1
  118. package/dist/br/PixQRCode.module.js.map +1 -1
  119. package/dist/br/boleto.cjs.map +1 -1
  120. package/dist/br/boleto.js.map +1 -1
  121. package/dist/br/br-geo.cjs.map +1 -1
  122. package/dist/br/br-geo.js.map +1 -1
  123. package/dist/br/data/br-centroids.cjs.map +1 -1
  124. package/dist/br/data/br-centroids.js.map +1 -1
  125. package/dist/br/data/br-locations.cjs.map +1 -1
  126. package/dist/br/data/br-locations.js.map +1 -1
  127. package/dist/br/data/br-uf-geo.cjs.map +1 -1
  128. package/dist/br/data/br-uf-geo.js.map +1 -1
  129. package/dist/br/data/mun/AC.cjs.map +1 -1
  130. package/dist/br/data/mun/AC.js.map +1 -1
  131. package/dist/br/data/mun/AL.cjs.map +1 -1
  132. package/dist/br/data/mun/AL.js.map +1 -1
  133. package/dist/br/data/mun/AM.cjs.map +1 -1
  134. package/dist/br/data/mun/AM.js.map +1 -1
  135. package/dist/br/data/mun/AP.cjs.map +1 -1
  136. package/dist/br/data/mun/AP.js.map +1 -1
  137. package/dist/br/data/mun/BA.cjs.map +1 -1
  138. package/dist/br/data/mun/BA.js.map +1 -1
  139. package/dist/br/data/mun/CE.cjs.map +1 -1
  140. package/dist/br/data/mun/CE.js.map +1 -1
  141. package/dist/br/data/mun/DF.cjs.map +1 -1
  142. package/dist/br/data/mun/DF.js.map +1 -1
  143. package/dist/br/data/mun/ES.cjs.map +1 -1
  144. package/dist/br/data/mun/ES.js.map +1 -1
  145. package/dist/br/data/mun/GO.cjs.map +1 -1
  146. package/dist/br/data/mun/GO.js.map +1 -1
  147. package/dist/br/data/mun/MA.cjs.map +1 -1
  148. package/dist/br/data/mun/MA.js.map +1 -1
  149. package/dist/br/data/mun/MG.cjs.map +1 -1
  150. package/dist/br/data/mun/MG.js.map +1 -1
  151. package/dist/br/data/mun/MS.cjs.map +1 -1
  152. package/dist/br/data/mun/MS.js.map +1 -1
  153. package/dist/br/data/mun/MT.cjs.map +1 -1
  154. package/dist/br/data/mun/MT.js.map +1 -1
  155. package/dist/br/data/mun/PA.cjs.map +1 -1
  156. package/dist/br/data/mun/PA.js.map +1 -1
  157. package/dist/br/data/mun/PB.cjs.map +1 -1
  158. package/dist/br/data/mun/PB.js.map +1 -1
  159. package/dist/br/data/mun/PE.cjs.map +1 -1
  160. package/dist/br/data/mun/PE.js.map +1 -1
  161. package/dist/br/data/mun/PI.cjs.map +1 -1
  162. package/dist/br/data/mun/PI.js.map +1 -1
  163. package/dist/br/data/mun/PR.cjs.map +1 -1
  164. package/dist/br/data/mun/PR.js.map +1 -1
  165. package/dist/br/data/mun/RJ.cjs.map +1 -1
  166. package/dist/br/data/mun/RJ.js.map +1 -1
  167. package/dist/br/data/mun/RN.cjs.map +1 -1
  168. package/dist/br/data/mun/RN.js.map +1 -1
  169. package/dist/br/data/mun/RO.cjs.map +1 -1
  170. package/dist/br/data/mun/RO.js.map +1 -1
  171. package/dist/br/data/mun/RR.cjs.map +1 -1
  172. package/dist/br/data/mun/RR.js.map +1 -1
  173. package/dist/br/data/mun/RS.cjs.map +1 -1
  174. package/dist/br/data/mun/RS.js.map +1 -1
  175. package/dist/br/data/mun/SC.cjs.map +1 -1
  176. package/dist/br/data/mun/SC.js.map +1 -1
  177. package/dist/br/data/mun/SE.cjs.map +1 -1
  178. package/dist/br/data/mun/SE.js.map +1 -1
  179. package/dist/br/data/mun/SP.cjs.map +1 -1
  180. package/dist/br/data/mun/SP.js.map +1 -1
  181. package/dist/br/data/mun/TO.cjs.map +1 -1
  182. package/dist/br/data/mun/TO.js.map +1 -1
  183. package/dist/br/geocode.cjs.map +1 -1
  184. package/dist/br/geocode.js.map +1 -1
  185. package/dist/br/holidays.cjs.map +1 -1
  186. package/dist/br/holidays.js.map +1 -1
  187. package/dist/br/locations.cjs.map +1 -1
  188. package/dist/br/locations.js.map +1 -1
  189. package/dist/br/nfe.cjs.map +1 -1
  190. package/dist/br/nfe.js.map +1 -1
  191. package/dist/br/pix.cjs +1 -1
  192. package/dist/br/pix.cjs.map +1 -1
  193. package/dist/br/pix.js +108 -71
  194. package/dist/br/pix.js.map +1 -1
  195. package/dist/br/regions.cjs.map +1 -1
  196. package/dist/br/regions.js.map +1 -1
  197. package/dist/br/scales.cjs.map +1 -1
  198. package/dist/br/scales.js.map +1 -1
  199. package/dist/br/state-geo.cjs.map +1 -1
  200. package/dist/br/state-geo.js.map +1 -1
  201. package/dist/br/svg-utils.cjs.map +1 -1
  202. package/dist/br/svg-utils.js.map +1 -1
  203. package/dist/br/use-map-hover.cjs.map +1 -1
  204. package/dist/br/use-map-hover.js.map +1 -1
  205. package/dist/br/use-map-zoom.cjs.map +1 -1
  206. package/dist/br/use-map-zoom.js.map +1 -1
  207. package/dist/br/whatsapp.cjs.map +1 -1
  208. package/dist/br/whatsapp.js.map +1 -1
  209. package/dist/br.cjs.map +1 -1
  210. package/dist/br.d.ts +16 -5
  211. package/dist/br.js.map +1 -1
  212. package/dist/capture/barcode.cjs.map +1 -1
  213. package/dist/capture/barcode.js.map +1 -1
  214. package/dist/capture/media-recorder.cjs.map +1 -1
  215. package/dist/capture/media-recorder.js.map +1 -1
  216. package/dist/capture/use-barcode-scanner.cjs.map +1 -1
  217. package/dist/capture/use-barcode-scanner.js.map +1 -1
  218. package/dist/capture/use-screen-capture.cjs +1 -1
  219. package/dist/capture/use-screen-capture.cjs.map +1 -1
  220. package/dist/capture/use-screen-capture.js +1 -7
  221. package/dist/capture/use-screen-capture.js.map +1 -1
  222. package/dist/capture/use-speech-recognition.cjs +1 -1
  223. package/dist/capture/use-speech-recognition.cjs.map +1 -1
  224. package/dist/capture/use-speech-recognition.js +35 -36
  225. package/dist/capture/use-speech-recognition.js.map +1 -1
  226. package/dist/capture/use-torch.cjs.map +1 -1
  227. package/dist/capture/use-torch.js.map +1 -1
  228. package/dist/capture/use-video-recorder.cjs.map +1 -1
  229. package/dist/capture/use-video-recorder.js.map +1 -1
  230. package/dist/capture/video-recorder.cjs.map +1 -1
  231. package/dist/capture/video-recorder.js.map +1 -1
  232. package/dist/charts/AreaChart.cjs.map +1 -1
  233. package/dist/charts/AreaChart.js.map +1 -1
  234. package/dist/charts/BarChart.cjs.map +1 -1
  235. package/dist/charts/BarChart.js.map +1 -1
  236. package/dist/charts/LineChart.cjs.map +1 -1
  237. package/dist/charts/LineChart.js.map +1 -1
  238. package/dist/charts/PieChart.cjs.map +1 -1
  239. package/dist/charts/PieChart.js.map +1 -1
  240. package/dist/charts/RadarChart.cjs.map +1 -1
  241. package/dist/charts/RadarChart.js.map +1 -1
  242. package/dist/charts/palette.cjs.map +1 -1
  243. package/dist/charts/palette.js.map +1 -1
  244. package/dist/charts/scales.cjs.map +1 -1
  245. package/dist/charts/scales.js.map +1 -1
  246. package/dist/charts/types.cjs.map +1 -1
  247. package/dist/charts/types.js.map +1 -1
  248. package/dist/charts/use-chart-colors.cjs.map +1 -1
  249. package/dist/charts/use-chart-colors.js.map +1 -1
  250. package/dist/components/AIChat/AIChat.cjs +1 -1
  251. package/dist/components/AIChat/AIChat.cjs.map +1 -1
  252. package/dist/components/AIChat/AIChat.js +1 -5
  253. package/dist/components/AIChat/AIChat.js.map +1 -1
  254. package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
  255. package/dist/components/AIChat/AIChat.module.js.map +1 -1
  256. package/dist/components/AIChat/AIChatComposer.cjs +1 -1
  257. package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
  258. package/dist/components/AIChat/AIChatComposer.js +1 -7
  259. package/dist/components/AIChat/AIChatComposer.js.map +1 -1
  260. package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
  261. package/dist/components/AIChat/AIChatTurn.js.map +1 -1
  262. package/dist/components/AIChat/ai-chat-turns.cjs.map +1 -1
  263. package/dist/components/AIChat/ai-chat-turns.js.map +1 -1
  264. package/dist/components/Accordion/Accordion.cjs.map +1 -1
  265. package/dist/components/Accordion/Accordion.js.map +1 -1
  266. package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
  267. package/dist/components/Accordion/Accordion.module.js.map +1 -1
  268. package/dist/components/Alert/Alert.cjs.map +1 -1
  269. package/dist/components/Alert/Alert.js.map +1 -1
  270. package/dist/components/Alert/Alert.module.cjs.map +1 -1
  271. package/dist/components/Alert/Alert.module.js.map +1 -1
  272. package/dist/components/AppBar/AppBar.cjs.map +1 -1
  273. package/dist/components/AppBar/AppBar.js.map +1 -1
  274. package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
  275. package/dist/components/AppBar/AppBar.module.js.map +1 -1
  276. package/dist/components/AppBar/use-sticky-body-warning.cjs +1 -1
  277. package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
  278. package/dist/components/AppBar/use-sticky-body-warning.js +1 -1
  279. package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
  280. package/dist/components/AppShell/AppShell.cjs.map +1 -1
  281. package/dist/components/AppShell/AppShell.js.map +1 -1
  282. package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
  283. package/dist/components/AppShell/AppShell.module.js.map +1 -1
  284. package/dist/components/AspectRatio/AspectRatio.cjs.map +1 -1
  285. package/dist/components/AspectRatio/AspectRatio.js.map +1 -1
  286. package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
  287. package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
  288. package/dist/components/AudioPlayer/AudioPlayer.cjs +1 -1
  289. package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
  290. package/dist/components/AudioPlayer/AudioPlayer.js +1 -7
  291. package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
  292. package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
  293. package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
  294. package/dist/components/AudioRecorder/AudioRecorder.cjs +1 -1
  295. package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
  296. package/dist/components/AudioRecorder/AudioRecorder.js +16 -21
  297. package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
  298. package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
  299. package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
  300. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  301. package/dist/components/Avatar/Avatar.js.map +1 -1
  302. package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
  303. package/dist/components/Avatar/Avatar.module.js.map +1 -1
  304. package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
  305. package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
  306. package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
  307. package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
  308. package/dist/components/Badge/Badge.cjs.map +1 -1
  309. package/dist/components/Badge/Badge.js.map +1 -1
  310. package/dist/components/Badge/Badge.module.cjs.map +1 -1
  311. package/dist/components/Badge/Badge.module.js.map +1 -1
  312. package/dist/components/Banner/Banner.cjs.map +1 -1
  313. package/dist/components/Banner/Banner.js.map +1 -1
  314. package/dist/components/Banner/Banner.module.cjs.map +1 -1
  315. package/dist/components/Banner/Banner.module.js.map +1 -1
  316. package/dist/components/BarList/BarList.cjs.map +1 -1
  317. package/dist/components/BarList/BarList.js.map +1 -1
  318. package/dist/components/BarList/BarList.module.cjs.map +1 -1
  319. package/dist/components/BarList/BarList.module.js.map +1 -1
  320. package/dist/components/BarList/bar-list-model.cjs.map +1 -1
  321. package/dist/components/BarList/bar-list-model.js.map +1 -1
  322. package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
  323. package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
  324. package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
  325. package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
  326. package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
  327. package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
  328. package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
  329. package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
  330. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  331. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  332. package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
  333. package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
  334. package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
  335. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  336. package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
  337. package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
  338. package/dist/components/Button/Button.cjs.map +1 -1
  339. package/dist/components/Button/Button.js.map +1 -1
  340. package/dist/components/Button/Button.module.cjs.map +1 -1
  341. package/dist/components/Button/Button.module.js.map +1 -1
  342. package/dist/components/Button/ButtonContent.cjs.map +1 -1
  343. package/dist/components/Button/ButtonContent.js.map +1 -1
  344. package/dist/components/Button/ButtonSlot.cjs.map +1 -1
  345. package/dist/components/Button/ButtonSlot.js.map +1 -1
  346. package/dist/components/Button/button-class.cjs.map +1 -1
  347. package/dist/components/Button/button-class.js.map +1 -1
  348. package/dist/components/Button/link-rel.cjs.map +1 -1
  349. package/dist/components/Button/link-rel.js.map +1 -1
  350. package/dist/components/Button/slot.cjs.map +1 -1
  351. package/dist/components/Button/slot.js.map +1 -1
  352. package/dist/components/Calendar/Calendar.cjs.map +1 -1
  353. package/dist/components/Calendar/Calendar.js.map +1 -1
  354. package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
  355. package/dist/components/Calendar/Calendar.module.js.map +1 -1
  356. package/dist/components/Card/Card.cjs.map +1 -1
  357. package/dist/components/Card/Card.js.map +1 -1
  358. package/dist/components/Card/Card.module.cjs.map +1 -1
  359. package/dist/components/Card/Card.module.js.map +1 -1
  360. package/dist/components/Carousel/Carousel.cjs.map +1 -1
  361. package/dist/components/Carousel/Carousel.js.map +1 -1
  362. package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
  363. package/dist/components/Carousel/Carousel.module.js.map +1 -1
  364. package/dist/components/Center/Center.cjs.map +1 -1
  365. package/dist/components/Center/Center.js.map +1 -1
  366. package/dist/components/Center/Center.module.cjs.map +1 -1
  367. package/dist/components/Center/Center.module.js.map +1 -1
  368. package/dist/components/Chat/Chat.cjs.map +1 -1
  369. package/dist/components/Chat/Chat.js.map +1 -1
  370. package/dist/components/Chat/Chat.module.cjs.map +1 -1
  371. package/dist/components/Chat/Chat.module.js.map +1 -1
  372. package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -1
  373. package/dist/components/Chat/ChatActionsMenu.js.map +1 -1
  374. package/dist/components/Chat/ChatAttachments.cjs.map +1 -1
  375. package/dist/components/Chat/ChatAttachments.js.map +1 -1
  376. package/dist/components/Chat/ChatBubble.cjs.map +1 -1
  377. package/dist/components/Chat/ChatBubble.js.map +1 -1
  378. package/dist/components/Chat/ChatComposer.cjs.map +1 -1
  379. package/dist/components/Chat/ChatComposer.js.map +1 -1
  380. package/dist/components/Chat/chat-groups.cjs +1 -1
  381. package/dist/components/Chat/chat-groups.cjs.map +1 -1
  382. package/dist/components/Chat/chat-groups.js +2 -6
  383. package/dist/components/Chat/chat-groups.js.map +1 -1
  384. package/dist/components/Chat/chat-receipt.cjs.map +1 -1
  385. package/dist/components/Chat/chat-receipt.js.map +1 -1
  386. package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
  387. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  388. package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
  389. package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
  390. package/dist/components/ChipInput/ChipInput.cjs +1 -1
  391. package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
  392. package/dist/components/ChipInput/ChipInput.js +2 -12
  393. package/dist/components/ChipInput/ChipInput.js.map +1 -1
  394. package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
  395. package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
  396. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  397. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  398. package/dist/components/CodeBlock/CodeBlock.cjs +1 -1
  399. package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
  400. package/dist/components/CodeBlock/CodeBlock.js +1 -1
  401. package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
  402. package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
  403. package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
  404. package/dist/components/CodeBlock/tokenize.cjs +1 -1
  405. package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
  406. package/dist/components/CodeBlock/tokenize.js +54 -25
  407. package/dist/components/CodeBlock/tokenize.js.map +1 -1
  408. package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
  409. package/dist/components/Collapsible/Collapsible.js.map +1 -1
  410. package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
  411. package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
  412. package/dist/components/Combobox/Combobox.cjs.map +1 -1
  413. package/dist/components/Combobox/Combobox.js.map +1 -1
  414. package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
  415. package/dist/components/Combobox/Combobox.module.js.map +1 -1
  416. package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -1
  417. package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -1
  418. package/dist/components/Command/Command.cjs +1 -1
  419. package/dist/components/Command/Command.cjs.map +1 -1
  420. package/dist/components/Command/Command.js +4 -11
  421. package/dist/components/Command/Command.js.map +1 -1
  422. package/dist/components/Command/Command.module.cjs.map +1 -1
  423. package/dist/components/Command/Command.module.js.map +1 -1
  424. package/dist/components/ConditionalWrapper/ConditionalWrapper.cjs.map +1 -1
  425. package/dist/components/ConditionalWrapper/ConditionalWrapper.js.map +1 -1
  426. package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  427. package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
  428. package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
  429. package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
  430. package/dist/components/ContextMenu/ContextMenu.js +1 -1
  431. package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
  432. package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
  433. package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
  434. package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
  435. package/dist/components/CopyButton/CopyButton.js.map +1 -1
  436. package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
  437. package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
  438. package/dist/components/DataList/DataList.cjs.map +1 -1
  439. package/dist/components/DataList/DataList.js.map +1 -1
  440. package/dist/components/DataList/DataList.module.cjs.map +1 -1
  441. package/dist/components/DataList/DataList.module.js.map +1 -1
  442. package/dist/components/DataTable/DataTable.cjs +1 -1
  443. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  444. package/dist/components/DataTable/DataTable.js +6 -14
  445. package/dist/components/DataTable/DataTable.js.map +1 -1
  446. package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
  447. package/dist/components/DataTable/DataTable.module.js.map +1 -1
  448. package/dist/components/DataTable/EditableCell.cjs +1 -1
  449. package/dist/components/DataTable/EditableCell.cjs.map +1 -1
  450. package/dist/components/DataTable/EditableCell.js +1 -9
  451. package/dist/components/DataTable/EditableCell.js.map +1 -1
  452. package/dist/components/DataTable/LoadingRows.cjs.map +1 -1
  453. package/dist/components/DataTable/LoadingRows.js.map +1 -1
  454. package/dist/components/DataTable/edit-labels.cjs.map +1 -1
  455. package/dist/components/DataTable/edit-labels.js.map +1 -1
  456. package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
  457. package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
  458. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  459. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  460. package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
  461. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  462. package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
  463. package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
  464. package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
  465. package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
  466. package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
  467. package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
  468. package/dist/components/Divider/Divider.cjs.map +1 -1
  469. package/dist/components/Divider/Divider.js.map +1 -1
  470. package/dist/components/Divider/Divider.module.cjs.map +1 -1
  471. package/dist/components/Divider/Divider.module.js.map +1 -1
  472. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  473. package/dist/components/Drawer/Drawer.js.map +1 -1
  474. package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
  475. package/dist/components/Drawer/Drawer.module.js.map +1 -1
  476. package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
  477. package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  478. package/dist/components/DropdownMenu/DropdownMenu.js +2 -14
  479. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  480. package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
  481. package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
  482. package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
  483. package/dist/components/Dropzone/Dropzone.js.map +1 -1
  484. package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
  485. package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
  486. package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
  487. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  488. package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
  489. package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
  490. package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
  491. package/dist/components/ErrorState/ErrorState.js.map +1 -1
  492. package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
  493. package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
  494. package/dist/components/ErrorText/ErrorText.cjs.map +1 -1
  495. package/dist/components/ErrorText/ErrorText.js.map +1 -1
  496. package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
  497. package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
  498. package/dist/components/FileUpload/FileUpload.cjs +1 -1
  499. package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
  500. package/dist/components/FileUpload/FileUpload.js +7 -17
  501. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  502. package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
  503. package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
  504. package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
  505. package/dist/components/FilterBar/FilterBar.js.map +1 -1
  506. package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
  507. package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
  508. package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
  509. package/dist/components/FilterBar/filter-apply.js.map +1 -1
  510. package/dist/components/FilterBar/filter-model.cjs.map +1 -1
  511. package/dist/components/FilterBar/filter-model.js.map +1 -1
  512. package/dist/components/FilterBar/filter-query.cjs +1 -1
  513. package/dist/components/FilterBar/filter-query.cjs.map +1 -1
  514. package/dist/components/FilterBar/filter-query.js +2 -5
  515. package/dist/components/FilterBar/filter-query.js.map +1 -1
  516. package/dist/components/FilterPanel/FilterPanel.cjs.map +1 -1
  517. package/dist/components/FilterPanel/FilterPanel.js.map +1 -1
  518. package/dist/components/FilterPanel/FilterPanel.module.cjs.map +1 -1
  519. package/dist/components/FilterPanel/FilterPanel.module.js.map +1 -1
  520. package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
  521. package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
  522. package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
  523. package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
  524. package/dist/components/For/For.cjs.map +1 -1
  525. package/dist/components/For/For.js.map +1 -1
  526. package/dist/components/Form/Form.cjs.map +1 -1
  527. package/dist/components/Form/Form.js.map +1 -1
  528. package/dist/components/Form/Form.module.cjs.map +1 -1
  529. package/dist/components/Form/Form.module.js.map +1 -1
  530. package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
  531. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  532. package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
  533. package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
  534. package/dist/components/Image/Image.cjs.map +1 -1
  535. package/dist/components/Image/Image.js.map +1 -1
  536. package/dist/components/Image/Image.module.cjs.map +1 -1
  537. package/dist/components/Image/Image.module.js.map +1 -1
  538. package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
  539. package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
  540. package/dist/components/ImageCropper/ImageCropper.js +4 -8
  541. package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
  542. package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
  543. package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
  544. package/dist/components/ImageCropper/crop-geometry.cjs.map +1 -1
  545. package/dist/components/ImageCropper/crop-geometry.js.map +1 -1
  546. package/dist/components/Input/Input.cjs.map +1 -1
  547. package/dist/components/Input/Input.js.map +1 -1
  548. package/dist/components/Input/Input.module.cjs.map +1 -1
  549. package/dist/components/Input/Input.module.js.map +1 -1
  550. package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
  551. package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
  552. package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
  553. package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
  554. package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
  555. package/dist/components/InstallButton/InstallButton.js.map +1 -1
  556. package/dist/components/InstallButton/InstallButton.module.cjs.map +1 -1
  557. package/dist/components/InstallButton/InstallButton.module.js.map +1 -1
  558. package/dist/components/InstallButton/install-hints.cjs.map +1 -1
  559. package/dist/components/InstallButton/install-hints.js.map +1 -1
  560. package/dist/components/Kanban/Kanban.cjs.map +1 -1
  561. package/dist/components/Kanban/Kanban.js.map +1 -1
  562. package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
  563. package/dist/components/Kanban/Kanban.module.js.map +1 -1
  564. package/dist/components/Kbd/Kbd.cjs.map +1 -1
  565. package/dist/components/Kbd/Kbd.js.map +1 -1
  566. package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
  567. package/dist/components/Kbd/Kbd.module.js.map +1 -1
  568. package/dist/components/Label/Label.cjs.map +1 -1
  569. package/dist/components/Label/Label.js.map +1 -1
  570. package/dist/components/Label/Label.module.cjs.map +1 -1
  571. package/dist/components/Label/Label.module.js.map +1 -1
  572. package/dist/components/Layout/Layout.cjs.map +1 -1
  573. package/dist/components/Layout/Layout.js.map +1 -1
  574. package/dist/components/Layout/Layout.module.cjs.map +1 -1
  575. package/dist/components/Layout/Layout.module.js.map +1 -1
  576. package/dist/components/Lightbox/Lightbox.cjs +1 -1
  577. package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
  578. package/dist/components/Lightbox/Lightbox.js +1 -1
  579. package/dist/components/Lightbox/Lightbox.js.map +1 -1
  580. package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
  581. package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
  582. package/dist/components/ListTile/ListTile.cjs.map +1 -1
  583. package/dist/components/ListTile/ListTile.js.map +1 -1
  584. package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
  585. package/dist/components/ListTile/ListTile.module.js.map +1 -1
  586. package/dist/components/Markdown/Markdown.cjs.map +1 -1
  587. package/dist/components/Markdown/Markdown.js.map +1 -1
  588. package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
  589. package/dist/components/Markdown/Markdown.module.js.map +1 -1
  590. package/dist/components/Markdown/markdown-parse.cjs +6 -6
  591. package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
  592. package/dist/components/Markdown/markdown-parse.js +94 -96
  593. package/dist/components/Markdown/markdown-parse.js.map +1 -1
  594. package/dist/components/Masonry/Masonry.cjs.map +1 -1
  595. package/dist/components/Masonry/Masonry.js.map +1 -1
  596. package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
  597. package/dist/components/Masonry/Masonry.module.js.map +1 -1
  598. package/dist/components/Masonry/masonry-layout.cjs.map +1 -1
  599. package/dist/components/Masonry/masonry-layout.js.map +1 -1
  600. package/dist/components/Menubar/Menubar.cjs.map +1 -1
  601. package/dist/components/Menubar/Menubar.js.map +1 -1
  602. package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
  603. package/dist/components/Menubar/Menubar.module.js.map +1 -1
  604. package/dist/components/Modal/Modal.cjs.map +1 -1
  605. package/dist/components/Modal/Modal.js.map +1 -1
  606. package/dist/components/Modal/Modal.module.cjs.map +1 -1
  607. package/dist/components/Modal/Modal.module.js.map +1 -1
  608. package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
  609. package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
  610. package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
  611. package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
  612. package/dist/components/Money/Money.cjs.map +1 -1
  613. package/dist/components/Money/Money.js.map +1 -1
  614. package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
  615. package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
  616. package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
  617. package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
  618. package/dist/components/NProgress/NProgress.cjs.map +1 -1
  619. package/dist/components/NProgress/NProgress.js.map +1 -1
  620. package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
  621. package/dist/components/NProgress/NProgress.module.js.map +1 -1
  622. package/dist/components/Navbar/Navbar.cjs.map +1 -1
  623. package/dist/components/Navbar/Navbar.js.map +1 -1
  624. package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
  625. package/dist/components/Navbar/Navbar.module.js.map +1 -1
  626. package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
  627. package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
  628. package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
  629. package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
  630. package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
  631. package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
  632. package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
  633. package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
  634. package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
  635. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
  636. package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
  637. package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
  638. package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
  639. package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -1
  640. package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
  641. package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
  642. package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
  643. package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
  644. package/dist/components/Page/Page.cjs.map +1 -1
  645. package/dist/components/Page/Page.js.map +1 -1
  646. package/dist/components/Page/Page.module.cjs.map +1 -1
  647. package/dist/components/Page/Page.module.js.map +1 -1
  648. package/dist/components/Pagination/Pagination.cjs.map +1 -1
  649. package/dist/components/Pagination/Pagination.js.map +1 -1
  650. package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
  651. package/dist/components/Pagination/Pagination.module.js.map +1 -1
  652. package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
  653. package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
  654. package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
  655. package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
  656. package/dist/components/PinInput/PinInput.cjs.map +1 -1
  657. package/dist/components/PinInput/PinInput.js.map +1 -1
  658. package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
  659. package/dist/components/PinInput/PinInput.module.js.map +1 -1
  660. package/dist/components/Popover/Popover.cjs.map +1 -1
  661. package/dist/components/Popover/Popover.js.map +1 -1
  662. package/dist/components/Popover/Popover.module.cjs.map +1 -1
  663. package/dist/components/Popover/Popover.module.js.map +1 -1
  664. package/dist/components/Portal/Portal.cjs.map +1 -1
  665. package/dist/components/Portal/Portal.js.map +1 -1
  666. package/dist/components/Portal/anchor-position.cjs.map +1 -1
  667. package/dist/components/Portal/anchor-position.js.map +1 -1
  668. package/dist/components/Portal/escape-layer.cjs.map +1 -1
  669. package/dist/components/Portal/escape-layer.js.map +1 -1
  670. package/dist/components/Portal/portal-host.cjs.map +1 -1
  671. package/dist/components/Portal/portal-host.js.map +1 -1
  672. package/dist/components/Portal/tab-bridge.cjs +1 -1
  673. package/dist/components/Portal/tab-bridge.cjs.map +1 -1
  674. package/dist/components/Portal/tab-bridge.js +1 -5
  675. package/dist/components/Portal/tab-bridge.js.map +1 -1
  676. package/dist/components/Progress/Progress.cjs.map +1 -1
  677. package/dist/components/Progress/Progress.js.map +1 -1
  678. package/dist/components/Progress/Progress.module.cjs.map +1 -1
  679. package/dist/components/Progress/Progress.module.js.map +1 -1
  680. package/dist/components/QRCode/QRCode.cjs.map +1 -1
  681. package/dist/components/QRCode/QRCode.js.map +1 -1
  682. package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
  683. package/dist/components/QRCode/QRCode.module.js.map +1 -1
  684. package/dist/components/QRCode/qr-encode.cjs +1 -1
  685. package/dist/components/QRCode/qr-encode.cjs.map +1 -1
  686. package/dist/components/QRCode/qr-encode.js +7 -13
  687. package/dist/components/QRCode/qr-encode.js.map +1 -1
  688. package/dist/components/QRCode/qr-tables.cjs.map +1 -1
  689. package/dist/components/QRCode/qr-tables.js.map +1 -1
  690. package/dist/components/Radio/Radio.cjs.map +1 -1
  691. package/dist/components/Radio/Radio.js.map +1 -1
  692. package/dist/components/Radio/Radio.module.cjs.map +1 -1
  693. package/dist/components/Radio/Radio.module.js.map +1 -1
  694. package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
  695. package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
  696. package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
  697. package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
  698. package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
  699. package/dist/components/RatingStars/RatingStars.js.map +1 -1
  700. package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
  701. package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
  702. package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
  703. package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
  704. package/dist/components/RefreshIndicator/RefreshIndicator.js +10 -18
  705. package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
  706. package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
  707. package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
  708. package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
  709. package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
  710. package/dist/components/Resizable/Resizable.cjs +1 -1
  711. package/dist/components/Resizable/Resizable.cjs.map +1 -1
  712. package/dist/components/Resizable/Resizable.js +1 -9
  713. package/dist/components/Resizable/Resizable.js.map +1 -1
  714. package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
  715. package/dist/components/Resizable/Resizable.module.js.map +1 -1
  716. package/dist/components/Responsive/Responsive.cjs.map +1 -1
  717. package/dist/components/Responsive/Responsive.js.map +1 -1
  718. package/dist/components/Reveal/Reveal.cjs.map +1 -1
  719. package/dist/components/Reveal/Reveal.js.map +1 -1
  720. package/dist/components/Reveal/Reveal.module.cjs.map +1 -1
  721. package/dist/components/Reveal/Reveal.module.js.map +1 -1
  722. package/dist/components/Reveal/reveal-threshold.cjs.map +1 -1
  723. package/dist/components/Reveal/reveal-threshold.js.map +1 -1
  724. package/dist/components/SafeArea/SafeArea.cjs.map +1 -1
  725. package/dist/components/SafeArea/SafeArea.js.map +1 -1
  726. package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
  727. package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
  728. package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
  729. package/dist/components/Scheduler/Scheduler.js.map +1 -1
  730. package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
  731. package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
  732. package/dist/components/Scheduler/scheduler-layout.cjs.map +1 -1
  733. package/dist/components/Scheduler/scheduler-layout.js.map +1 -1
  734. package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
  735. package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
  736. package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
  737. package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
  738. package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
  739. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  740. package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
  741. package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
  742. package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -1
  743. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  744. package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -1
  745. package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -1
  746. package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
  747. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  748. package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
  749. package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
  750. package/dist/components/Select/CaretIcon.cjs.map +1 -1
  751. package/dist/components/Select/CaretIcon.js.map +1 -1
  752. package/dist/components/Select/Select.cjs.map +1 -1
  753. package/dist/components/Select/Select.js.map +1 -1
  754. package/dist/components/Select/Select.module.cjs.map +1 -1
  755. package/dist/components/Select/Select.module.js.map +1 -1
  756. package/dist/components/Select/options.cjs.map +1 -1
  757. package/dist/components/Select/options.js.map +1 -1
  758. package/dist/components/Sidebar/Sidebar.cjs +1 -1
  759. package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
  760. package/dist/components/Sidebar/Sidebar.js +13 -23
  761. package/dist/components/Sidebar/Sidebar.js.map +1 -1
  762. package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
  763. package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
  764. package/dist/components/Sidebar/SidebarEntry.cjs.map +1 -1
  765. package/dist/components/Sidebar/SidebarEntry.js.map +1 -1
  766. package/dist/components/Sidebar/active-nav-key.cjs.map +1 -1
  767. package/dist/components/Sidebar/active-nav-key.js.map +1 -1
  768. package/dist/components/SignaturePad/SignaturePad.cjs +1 -1
  769. package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
  770. package/dist/components/SignaturePad/SignaturePad.js +1 -5
  771. package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
  772. package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
  773. package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
  774. package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
  775. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  776. package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
  777. package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
  778. package/dist/components/Slider/Slider.cjs.map +1 -1
  779. package/dist/components/Slider/Slider.js.map +1 -1
  780. package/dist/components/Slider/Slider.module.cjs.map +1 -1
  781. package/dist/components/Slider/Slider.module.js.map +1 -1
  782. package/dist/components/Spacer/Spacer.cjs.map +1 -1
  783. package/dist/components/Spacer/Spacer.js.map +1 -1
  784. package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
  785. package/dist/components/Spacer/Spacer.module.js.map +1 -1
  786. package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
  787. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  788. package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
  789. package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
  790. package/dist/components/Sparkline/sparkline-geometry.cjs.map +1 -1
  791. package/dist/components/Sparkline/sparkline-geometry.js.map +1 -1
  792. package/dist/components/Spinner/Spinner.cjs.map +1 -1
  793. package/dist/components/Spinner/Spinner.js.map +1 -1
  794. package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
  795. package/dist/components/Spinner/Spinner.module.js.map +1 -1
  796. package/dist/components/Stat/Stat.cjs.map +1 -1
  797. package/dist/components/Stat/Stat.js.map +1 -1
  798. package/dist/components/Stat/Stat.module.cjs.map +1 -1
  799. package/dist/components/Stat/Stat.module.js.map +1 -1
  800. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  801. package/dist/components/Stepper/Stepper.js.map +1 -1
  802. package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
  803. package/dist/components/Stepper/Stepper.module.js.map +1 -1
  804. package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
  805. package/dist/components/StepperInput/StepperInput.js.map +1 -1
  806. package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
  807. package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
  808. package/dist/components/Switch/Switch.cjs.map +1 -1
  809. package/dist/components/Switch/Switch.js.map +1 -1
  810. package/dist/components/Switch/Switch.module.cjs.map +1 -1
  811. package/dist/components/Switch/Switch.module.js.map +1 -1
  812. package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
  813. package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
  814. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
  815. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
  816. package/dist/components/Table/Table.cjs.map +1 -1
  817. package/dist/components/Table/Table.js.map +1 -1
  818. package/dist/components/Table/Table.module.cjs.map +1 -1
  819. package/dist/components/Table/Table.module.js.map +1 -1
  820. package/dist/components/Tabs/Tabs.cjs.map +1 -1
  821. package/dist/components/Tabs/Tabs.js.map +1 -1
  822. package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
  823. package/dist/components/Tabs/Tabs.module.js.map +1 -1
  824. package/dist/components/Tag/Tag.cjs.map +1 -1
  825. package/dist/components/Tag/Tag.js.map +1 -1
  826. package/dist/components/Tag/Tag.module.cjs.map +1 -1
  827. package/dist/components/Tag/Tag.module.js.map +1 -1
  828. package/dist/components/Textarea/Textarea.cjs.map +1 -1
  829. package/dist/components/Textarea/Textarea.js.map +1 -1
  830. package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
  831. package/dist/components/Textarea/Textarea.module.js.map +1 -1
  832. package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
  833. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  834. package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
  835. package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
  836. package/dist/components/Timeline/Timeline.cjs.map +1 -1
  837. package/dist/components/Timeline/Timeline.js.map +1 -1
  838. package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
  839. package/dist/components/Timeline/Timeline.module.js.map +1 -1
  840. package/dist/components/Toast/Toast.module.cjs.map +1 -1
  841. package/dist/components/Toast/Toast.module.js.map +1 -1
  842. package/dist/components/Toast/ToastProvider.cjs.map +1 -1
  843. package/dist/components/Toast/ToastProvider.js.map +1 -1
  844. package/dist/components/Toggle/Toggle.cjs.map +1 -1
  845. package/dist/components/Toggle/Toggle.js.map +1 -1
  846. package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
  847. package/dist/components/Toggle/Toggle.module.js.map +1 -1
  848. package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
  849. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  850. package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
  851. package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
  852. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  853. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  854. package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
  855. package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
  856. package/dist/components/Tour/Tour.cjs +1 -1
  857. package/dist/components/Tour/Tour.cjs.map +1 -1
  858. package/dist/components/Tour/Tour.js +1 -5
  859. package/dist/components/Tour/Tour.js.map +1 -1
  860. package/dist/components/Tour/Tour.module.cjs.map +1 -1
  861. package/dist/components/Tour/Tour.module.js.map +1 -1
  862. package/dist/components/Tour/tour-position.cjs.map +1 -1
  863. package/dist/components/Tour/tour-position.js.map +1 -1
  864. package/dist/components/Transfer/Transfer.cjs.map +1 -1
  865. package/dist/components/Transfer/Transfer.js.map +1 -1
  866. package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
  867. package/dist/components/Transfer/Transfer.module.js.map +1 -1
  868. package/dist/components/Transfer/transfer-state.cjs.map +1 -1
  869. package/dist/components/Transfer/transfer-state.js.map +1 -1
  870. package/dist/components/TreeView/TreeView.cjs.map +1 -1
  871. package/dist/components/TreeView/TreeView.js.map +1 -1
  872. package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
  873. package/dist/components/TreeView/TreeView.module.js.map +1 -1
  874. package/dist/components/TruncateText/TruncateText.cjs.map +1 -1
  875. package/dist/components/TruncateText/TruncateText.js.map +1 -1
  876. package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
  877. package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
  878. package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
  879. package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
  880. package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
  881. package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
  882. package/dist/components/VideoPlayer/VideoPlayer.cjs +1 -1
  883. package/dist/components/VideoPlayer/VideoPlayer.cjs.map +1 -1
  884. package/dist/components/VideoPlayer/VideoPlayer.js +1 -7
  885. package/dist/components/VideoPlayer/VideoPlayer.js.map +1 -1
  886. package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
  887. package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
  888. package/dist/components/VideoPlayer/playback-rates.cjs.map +1 -1
  889. package/dist/components/VideoPlayer/playback-rates.js.map +1 -1
  890. package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
  891. package/dist/components/VirtualList/VirtualList.js.map +1 -1
  892. package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
  893. package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
  894. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
  895. package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
  896. package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
  897. package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
  898. package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
  899. package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
  900. package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
  901. package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
  902. package/dist/components/Wizard/Wizard.cjs +1 -1
  903. package/dist/components/Wizard/Wizard.cjs.map +1 -1
  904. package/dist/components/Wizard/Wizard.js +4 -11
  905. package/dist/components/Wizard/Wizard.js.map +1 -1
  906. package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
  907. package/dist/components/Wizard/Wizard.module.js.map +1 -1
  908. package/dist/data/create-data-provider.cjs.map +1 -1
  909. package/dist/data/create-data-provider.js.map +1 -1
  910. package/dist/data/data-provider-context.cjs.map +1 -1
  911. package/dist/data/data-provider-context.js.map +1 -1
  912. package/dist/data/use-resource.cjs.map +1 -1
  913. package/dist/data/use-resource.js.map +1 -1
  914. package/dist/editor/RichTextEditor.cjs.map +1 -1
  915. package/dist/editor/RichTextEditor.js.map +1 -1
  916. package/dist/editor/RichTextEditor.module.cjs.map +1 -1
  917. package/dist/editor/RichTextEditor.module.js.map +1 -1
  918. package/dist/editor.js +1 -2
  919. package/dist/error-boundary/ErrorBoundary.cjs.map +1 -1
  920. package/dist/error-boundary/ErrorBoundary.js.map +1 -1
  921. package/dist/error-boundary/use-error-handler.cjs.map +1 -1
  922. package/dist/error-boundary/use-error-handler.js.map +1 -1
  923. package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
  924. package/dist/feature-flags/FeatureFlagsProvider.js.map +1 -1
  925. package/dist/feature-flags/growthbook-adapter.cjs.map +1 -1
  926. package/dist/feature-flags/growthbook-adapter.js.map +1 -1
  927. package/dist/feature-flags/in-memory-adapter.cjs.map +1 -1
  928. package/dist/feature-flags/in-memory-adapter.js.map +1 -1
  929. package/dist/feature-flags/launchdarkly-adapter.cjs.map +1 -1
  930. package/dist/feature-flags/launchdarkly-adapter.js.map +1 -1
  931. package/dist/forms/FormField.cjs.map +1 -1
  932. package/dist/forms/FormField.js.map +1 -1
  933. package/dist/forms/br-validators.cjs.map +1 -1
  934. package/dist/forms/br-validators.js.map +1 -1
  935. package/dist/forms/masked-inputs.cjs.map +1 -1
  936. package/dist/forms/masked-inputs.js.map +1 -1
  937. package/dist/forms/use-viacep.cjs.map +1 -1
  938. package/dist/forms/use-viacep.js.map +1 -1
  939. package/dist/forms/use-zod-form.cjs.map +1 -1
  940. package/dist/forms/use-zod-form.js.map +1 -1
  941. package/dist/forms/validate-form.cjs.map +1 -1
  942. package/dist/forms/validate-form.js.map +1 -1
  943. package/dist/forms/zod-resolver.cjs.map +1 -1
  944. package/dist/forms/zod-resolver.js.map +1 -1
  945. package/dist/geo/TrajectoryMap.cjs.map +1 -1
  946. package/dist/geo/TrajectoryMap.js.map +1 -1
  947. package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
  948. package/dist/geo/TrajectoryMap.module.js.map +1 -1
  949. package/dist/geo/bounds.cjs.map +1 -1
  950. package/dist/geo/bounds.js.map +1 -1
  951. package/dist/geo/create-position-tracker.cjs +1 -1
  952. package/dist/geo/create-position-tracker.cjs.map +1 -1
  953. package/dist/geo/create-position-tracker.js +1 -7
  954. package/dist/geo/create-position-tracker.js.map +1 -1
  955. package/dist/geo/distance.cjs.map +1 -1
  956. package/dist/geo/distance.js.map +1 -1
  957. package/dist/geo/estimate.cjs.map +1 -1
  958. package/dist/geo/estimate.js.map +1 -1
  959. package/dist/geo/leaflet-map.cjs.map +1 -1
  960. package/dist/geo/leaflet-map.js.map +1 -1
  961. package/dist/geo/projection.cjs.map +1 -1
  962. package/dist/geo/projection.js.map +1 -1
  963. package/dist/geo/routing.cjs.map +1 -1
  964. package/dist/geo/routing.js.map +1 -1
  965. package/dist/geo/types.cjs.map +1 -1
  966. package/dist/geo/types.js.map +1 -1
  967. package/dist/geo/use-position-tracker.cjs.map +1 -1
  968. package/dist/geo/use-position-tracker.js.map +1 -1
  969. package/dist/hooks/pwa-env.cjs.map +1 -1
  970. package/dist/hooks/pwa-env.js.map +1 -1
  971. package/dist/hooks/tab-sequence.cjs.map +1 -1
  972. package/dist/hooks/tab-sequence.js.map +1 -1
  973. package/dist/hooks/use-announce.cjs +1 -1
  974. package/dist/hooks/use-announce.cjs.map +1 -1
  975. package/dist/hooks/use-announce.js +2 -2
  976. package/dist/hooks/use-announce.js.map +1 -1
  977. package/dist/hooks/use-async.cjs.map +1 -1
  978. package/dist/hooks/use-async.js.map +1 -1
  979. package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
  980. package/dist/hooks/use-before-install-prompt.js.map +1 -1
  981. package/dist/hooks/use-breakpoint.cjs.map +1 -1
  982. package/dist/hooks/use-breakpoint.js.map +1 -1
  983. package/dist/hooks/use-click-outside.cjs.map +1 -1
  984. package/dist/hooks/use-click-outside.js.map +1 -1
  985. package/dist/hooks/use-client-filter.cjs.map +1 -1
  986. package/dist/hooks/use-client-filter.js.map +1 -1
  987. package/dist/hooks/use-clipboard.cjs.map +1 -1
  988. package/dist/hooks/use-clipboard.js.map +1 -1
  989. package/dist/hooks/use-countdown.cjs.map +1 -1
  990. package/dist/hooks/use-countdown.js.map +1 -1
  991. package/dist/hooks/use-counter.cjs.map +1 -1
  992. package/dist/hooks/use-counter.js.map +1 -1
  993. package/dist/hooks/use-debounce.cjs.map +1 -1
  994. package/dist/hooks/use-debounce.js.map +1 -1
  995. package/dist/hooks/use-deep-memo.cjs.map +1 -1
  996. package/dist/hooks/use-deep-memo.js.map +1 -1
  997. package/dist/hooks/use-disclosure.cjs.map +1 -1
  998. package/dist/hooks/use-disclosure.js.map +1 -1
  999. package/dist/hooks/use-document-title.cjs.map +1 -1
  1000. package/dist/hooks/use-document-title.js.map +1 -1
  1001. package/dist/hooks/use-document-visibility.cjs.map +1 -1
  1002. package/dist/hooks/use-document-visibility.js.map +1 -1
  1003. package/dist/hooks/use-draft-filters.cjs.map +1 -1
  1004. package/dist/hooks/use-draft-filters.js.map +1 -1
  1005. package/dist/hooks/use-event-listener.cjs.map +1 -1
  1006. package/dist/hooks/use-event-listener.js.map +1 -1
  1007. package/dist/hooks/use-favicon.cjs.map +1 -1
  1008. package/dist/hooks/use-favicon.js.map +1 -1
  1009. package/dist/hooks/use-focus-trap.cjs.map +1 -1
  1010. package/dist/hooks/use-focus-trap.js.map +1 -1
  1011. package/dist/hooks/use-fullscreen-element.cjs.map +1 -1
  1012. package/dist/hooks/use-fullscreen-element.js.map +1 -1
  1013. package/dist/hooks/use-fullscreen.cjs +1 -1
  1014. package/dist/hooks/use-fullscreen.cjs.map +1 -1
  1015. package/dist/hooks/use-fullscreen.js +7 -23
  1016. package/dist/hooks/use-fullscreen.js.map +1 -1
  1017. package/dist/hooks/use-geolocation.cjs.map +1 -1
  1018. package/dist/hooks/use-geolocation.js.map +1 -1
  1019. package/dist/hooks/use-hover.cjs.map +1 -1
  1020. package/dist/hooks/use-hover.js.map +1 -1
  1021. package/dist/hooks/use-idle.cjs.map +1 -1
  1022. package/dist/hooks/use-idle.js.map +1 -1
  1023. package/dist/hooks/use-install-prompt.cjs +1 -1
  1024. package/dist/hooks/use-install-prompt.cjs.map +1 -1
  1025. package/dist/hooks/use-install-prompt.js +1 -1
  1026. package/dist/hooks/use-install-prompt.js.map +1 -1
  1027. package/dist/hooks/use-intersection-observer.cjs.map +1 -1
  1028. package/dist/hooks/use-intersection-observer.js.map +1 -1
  1029. package/dist/hooks/use-interval.cjs.map +1 -1
  1030. package/dist/hooks/use-interval.js.map +1 -1
  1031. package/dist/hooks/use-is-first-render.cjs.map +1 -1
  1032. package/dist/hooks/use-is-first-render.js.map +1 -1
  1033. package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
  1034. package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
  1035. package/dist/hooks/use-latest-ref.cjs.map +1 -1
  1036. package/dist/hooks/use-latest-ref.js.map +1 -1
  1037. package/dist/hooks/use-list-state.cjs.map +1 -1
  1038. package/dist/hooks/use-list-state.js.map +1 -1
  1039. package/dist/hooks/use-local-storage.cjs +1 -1
  1040. package/dist/hooks/use-local-storage.cjs.map +1 -1
  1041. package/dist/hooks/use-local-storage.js +2 -5
  1042. package/dist/hooks/use-local-storage.js.map +1 -1
  1043. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  1044. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  1045. package/dist/hooks/use-long-press.cjs.map +1 -1
  1046. package/dist/hooks/use-long-press.js.map +1 -1
  1047. package/dist/hooks/use-map.cjs.map +1 -1
  1048. package/dist/hooks/use-map.js.map +1 -1
  1049. package/dist/hooks/use-media-devices.cjs.map +1 -1
  1050. package/dist/hooks/use-media-devices.js.map +1 -1
  1051. package/dist/hooks/use-media-permission.cjs +1 -1
  1052. package/dist/hooks/use-media-permission.cjs.map +1 -1
  1053. package/dist/hooks/use-media-permission.js +2 -5
  1054. package/dist/hooks/use-media-permission.js.map +1 -1
  1055. package/dist/hooks/use-media-query.cjs.map +1 -1
  1056. package/dist/hooks/use-media-query.js.map +1 -1
  1057. package/dist/hooks/use-object-url.cjs.map +1 -1
  1058. package/dist/hooks/use-object-url.js.map +1 -1
  1059. package/dist/hooks/use-online.cjs.map +1 -1
  1060. package/dist/hooks/use-online.js.map +1 -1
  1061. package/dist/hooks/use-pagination.cjs.map +1 -1
  1062. package/dist/hooks/use-pagination.js.map +1 -1
  1063. package/dist/hooks/use-previous.cjs.map +1 -1
  1064. package/dist/hooks/use-previous.js.map +1 -1
  1065. package/dist/hooks/use-push-to-talk.cjs.map +1 -1
  1066. package/dist/hooks/use-push-to-talk.js.map +1 -1
  1067. package/dist/hooks/use-queue.cjs.map +1 -1
  1068. package/dist/hooks/use-queue.js.map +1 -1
  1069. package/dist/hooks/use-resize-observer.cjs.map +1 -1
  1070. package/dist/hooks/use-resize-observer.js.map +1 -1
  1071. package/dist/hooks/use-scroll-lock.cjs.map +1 -1
  1072. package/dist/hooks/use-scroll-lock.js.map +1 -1
  1073. package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
  1074. package/dist/hooks/use-scroll-overflow.js.map +1 -1
  1075. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  1076. package/dist/hooks/use-service-worker-update.js.map +1 -1
  1077. package/dist/hooks/use-set.cjs.map +1 -1
  1078. package/dist/hooks/use-set.js.map +1 -1
  1079. package/dist/hooks/use-sortable.cjs.map +1 -1
  1080. package/dist/hooks/use-sortable.js.map +1 -1
  1081. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  1082. package/dist/hooks/use-stable-callback.js.map +1 -1
  1083. package/dist/hooks/use-storage-estimate.cjs.map +1 -1
  1084. package/dist/hooks/use-storage-estimate.js.map +1 -1
  1085. package/dist/hooks/use-throttle.cjs.map +1 -1
  1086. package/dist/hooks/use-throttle.js.map +1 -1
  1087. package/dist/hooks/use-timeout.cjs.map +1 -1
  1088. package/dist/hooks/use-timeout.js.map +1 -1
  1089. package/dist/hooks/use-toggle.cjs.map +1 -1
  1090. package/dist/hooks/use-toggle.js.map +1 -1
  1091. package/dist/hooks/use-typewriter.cjs.map +1 -1
  1092. package/dist/hooks/use-typewriter.js.map +1 -1
  1093. package/dist/hooks/use-window-size.cjs.map +1 -1
  1094. package/dist/hooks/use-window-size.js.map +1 -1
  1095. package/dist/http/api-client.cjs.map +1 -1
  1096. package/dist/http/api-client.js.map +1 -1
  1097. package/dist/http/build-url.cjs.map +1 -1
  1098. package/dist/http/build-url.js.map +1 -1
  1099. package/dist/http/credential-scope.cjs.map +1 -1
  1100. package/dist/http/credential-scope.js.map +1 -1
  1101. package/dist/http/csrf.cjs.map +1 -1
  1102. package/dist/http/csrf.js.map +1 -1
  1103. package/dist/http/decode-response.cjs.map +1 -1
  1104. package/dist/http/decode-response.js.map +1 -1
  1105. package/dist/http/describe-api-error.cjs.map +1 -1
  1106. package/dist/http/describe-api-error.js.map +1 -1
  1107. package/dist/http/errors.cjs.map +1 -1
  1108. package/dist/http/errors.js.map +1 -1
  1109. package/dist/http/idempotency.cjs.map +1 -1
  1110. package/dist/http/idempotency.js.map +1 -1
  1111. package/dist/http/parse-response.cjs.map +1 -1
  1112. package/dist/http/parse-response.js.map +1 -1
  1113. package/dist/http/resumable-upload.cjs +1 -1
  1114. package/dist/http/resumable-upload.cjs.map +1 -1
  1115. package/dist/http/resumable-upload.js +141 -105
  1116. package/dist/http/resumable-upload.js.map +1 -1
  1117. package/dist/http/retry.cjs +1 -1
  1118. package/dist/http/retry.cjs.map +1 -1
  1119. package/dist/http/retry.js +5 -6
  1120. package/dist/http/retry.js.map +1 -1
  1121. package/dist/http/timeout.cjs.map +1 -1
  1122. package/dist/http/timeout.js.map +1 -1
  1123. package/dist/http/upload-with-progress.cjs +1 -1
  1124. package/dist/http/upload-with-progress.cjs.map +1 -1
  1125. package/dist/http/upload-with-progress.js +2 -7
  1126. package/dist/http/upload-with-progress.js.map +1 -1
  1127. package/dist/http/use-describe-api-error.cjs.map +1 -1
  1128. package/dist/http/use-describe-api-error.js.map +1 -1
  1129. package/dist/http/use-poll.cjs +1 -1
  1130. package/dist/http/use-poll.cjs.map +1 -1
  1131. package/dist/http/use-poll.js +2 -5
  1132. package/dist/http/use-poll.js.map +1 -1
  1133. package/dist/i18n/I18nProvider.cjs.map +1 -1
  1134. package/dist/i18n/I18nProvider.js.map +1 -1
  1135. package/dist/i18n/create-i18n.cjs.map +1 -1
  1136. package/dist/i18n/create-i18n.js.map +1 -1
  1137. package/dist/icons/Icon.cjs.map +1 -1
  1138. package/dist/icons/Icon.js.map +1 -1
  1139. package/dist/icons/IconPicker.cjs.map +1 -1
  1140. package/dist/icons/IconPicker.js.map +1 -1
  1141. package/dist/icons/IconPicker.module.cjs.map +1 -1
  1142. package/dist/icons/IconPicker.module.js.map +1 -1
  1143. package/dist/icons/IconProvider.cjs.map +1 -1
  1144. package/dist/icons/IconProvider.js.map +1 -1
  1145. package/dist/icons/alias.cjs.map +1 -1
  1146. package/dist/icons/alias.js.map +1 -1
  1147. package/dist/icons/generated/aliases.cjs.map +1 -1
  1148. package/dist/icons/generated/aliases.js.map +1 -1
  1149. package/dist/icons/generated/icon-names.cjs.map +1 -1
  1150. package/dist/icons/generated/icon-names.js.map +1 -1
  1151. package/dist/icons/generated/loaders.cjs.map +1 -1
  1152. package/dist/icons/generated/loaders.js.map +1 -1
  1153. package/dist/icons/generated/shard-00.cjs.map +1 -1
  1154. package/dist/icons/generated/shard-00.js.map +1 -1
  1155. package/dist/icons/generated/shard-01.cjs.map +1 -1
  1156. package/dist/icons/generated/shard-01.js.map +1 -1
  1157. package/dist/icons/generated/shard-02.cjs.map +1 -1
  1158. package/dist/icons/generated/shard-02.js.map +1 -1
  1159. package/dist/icons/generated/shard-03.cjs.map +1 -1
  1160. package/dist/icons/generated/shard-03.js.map +1 -1
  1161. package/dist/icons/generated/shard-04.cjs.map +1 -1
  1162. package/dist/icons/generated/shard-04.js.map +1 -1
  1163. package/dist/icons/generated/shard-05.cjs.map +1 -1
  1164. package/dist/icons/generated/shard-05.js.map +1 -1
  1165. package/dist/icons/generated/shard-06.cjs.map +1 -1
  1166. package/dist/icons/generated/shard-06.js.map +1 -1
  1167. package/dist/icons/generated/shard-07.cjs.map +1 -1
  1168. package/dist/icons/generated/shard-07.js.map +1 -1
  1169. package/dist/icons/generated/shard-08.cjs.map +1 -1
  1170. package/dist/icons/generated/shard-08.js.map +1 -1
  1171. package/dist/icons/generated/shard-09.cjs.map +1 -1
  1172. package/dist/icons/generated/shard-09.js.map +1 -1
  1173. package/dist/icons/generated/shard-10.cjs.map +1 -1
  1174. package/dist/icons/generated/shard-10.js.map +1 -1
  1175. package/dist/icons/generated/shard-11.cjs.map +1 -1
  1176. package/dist/icons/generated/shard-11.js.map +1 -1
  1177. package/dist/icons/generated/shard-12.cjs.map +1 -1
  1178. package/dist/icons/generated/shard-12.js.map +1 -1
  1179. package/dist/icons/generated/shard-13.cjs.map +1 -1
  1180. package/dist/icons/generated/shard-13.js.map +1 -1
  1181. package/dist/icons/generated/shard-14.cjs.map +1 -1
  1182. package/dist/icons/generated/shard-14.js.map +1 -1
  1183. package/dist/icons/generated/shard-15.cjs.map +1 -1
  1184. package/dist/icons/generated/shard-15.js.map +1 -1
  1185. package/dist/icons/generated/shard-16.cjs.map +1 -1
  1186. package/dist/icons/generated/shard-16.js.map +1 -1
  1187. package/dist/icons/generated/shard-17.cjs.map +1 -1
  1188. package/dist/icons/generated/shard-17.js.map +1 -1
  1189. package/dist/icons/generated/shard-18.cjs.map +1 -1
  1190. package/dist/icons/generated/shard-18.js.map +1 -1
  1191. package/dist/icons/generated/shard-19.cjs.map +1 -1
  1192. package/dist/icons/generated/shard-19.js.map +1 -1
  1193. package/dist/icons/generated/shard-20.cjs.map +1 -1
  1194. package/dist/icons/generated/shard-20.js.map +1 -1
  1195. package/dist/icons/generated/shard-21.cjs.map +1 -1
  1196. package/dist/icons/generated/shard-21.js.map +1 -1
  1197. package/dist/icons/generated/shard-22.cjs.map +1 -1
  1198. package/dist/icons/generated/shard-22.js.map +1 -1
  1199. package/dist/icons/generated/shard-23.cjs.map +1 -1
  1200. package/dist/icons/generated/shard-23.js.map +1 -1
  1201. package/dist/icons/generated/shard-24.cjs.map +1 -1
  1202. package/dist/icons/generated/shard-24.js.map +1 -1
  1203. package/dist/icons/generated/shard-25.cjs.map +1 -1
  1204. package/dist/icons/generated/shard-25.js.map +1 -1
  1205. package/dist/icons/generated/shard-26.cjs.map +1 -1
  1206. package/dist/icons/generated/shard-26.js.map +1 -1
  1207. package/dist/icons/generated/shard-27.cjs.map +1 -1
  1208. package/dist/icons/generated/shard-27.js.map +1 -1
  1209. package/dist/icons/generated/shard-28.cjs.map +1 -1
  1210. package/dist/icons/generated/shard-28.js.map +1 -1
  1211. package/dist/icons/generated/shard-29.cjs.map +1 -1
  1212. package/dist/icons/generated/shard-29.js.map +1 -1
  1213. package/dist/icons/generated/shard-30.cjs.map +1 -1
  1214. package/dist/icons/generated/shard-30.js.map +1 -1
  1215. package/dist/icons/generated/shard-31.cjs.map +1 -1
  1216. package/dist/icons/generated/shard-31.js.map +1 -1
  1217. package/dist/icons/generated/shard-32.cjs.map +1 -1
  1218. package/dist/icons/generated/shard-32.js.map +1 -1
  1219. package/dist/icons/generated/shard-33.cjs.map +1 -1
  1220. package/dist/icons/generated/shard-33.js.map +1 -1
  1221. package/dist/icons/generated/shard-34.cjs.map +1 -1
  1222. package/dist/icons/generated/shard-34.js.map +1 -1
  1223. package/dist/icons/generated/shard-35.cjs.map +1 -1
  1224. package/dist/icons/generated/shard-35.js.map +1 -1
  1225. package/dist/icons/generated/shard-36.cjs.map +1 -1
  1226. package/dist/icons/generated/shard-36.js.map +1 -1
  1227. package/dist/icons/generated/shard-37.cjs.map +1 -1
  1228. package/dist/icons/generated/shard-37.js.map +1 -1
  1229. package/dist/icons/generated/shard-38.cjs.map +1 -1
  1230. package/dist/icons/generated/shard-38.js.map +1 -1
  1231. package/dist/icons/generated/shard-39.cjs.map +1 -1
  1232. package/dist/icons/generated/shard-39.js.map +1 -1
  1233. package/dist/icons/generated/shard-40.cjs.map +1 -1
  1234. package/dist/icons/generated/shard-40.js.map +1 -1
  1235. package/dist/icons/generated/shard-41.cjs.map +1 -1
  1236. package/dist/icons/generated/shard-41.js.map +1 -1
  1237. package/dist/icons/generated/shard-42.cjs.map +1 -1
  1238. package/dist/icons/generated/shard-42.js.map +1 -1
  1239. package/dist/icons/generated/shard-43.cjs.map +1 -1
  1240. package/dist/icons/generated/shard-43.js.map +1 -1
  1241. package/dist/icons/generated/shard-44.cjs.map +1 -1
  1242. package/dist/icons/generated/shard-44.js.map +1 -1
  1243. package/dist/icons/generated/shard-45.cjs.map +1 -1
  1244. package/dist/icons/generated/shard-45.js.map +1 -1
  1245. package/dist/icons/icon-context.cjs.map +1 -1
  1246. package/dist/icons/icon-context.js.map +1 -1
  1247. package/dist/icons/is-icon-name.cjs.map +1 -1
  1248. package/dist/icons/is-icon-name.js.map +1 -1
  1249. package/dist/icons/material-symbols.cjs.map +1 -1
  1250. package/dist/icons/material-symbols.js.map +1 -1
  1251. package/dist/icons/normalize-icon-name.cjs.map +1 -1
  1252. package/dist/icons/normalize-icon-name.js.map +1 -1
  1253. package/dist/icons/shard-cache.cjs +1 -1
  1254. package/dist/icons/shard-cache.cjs.map +1 -1
  1255. package/dist/icons/shard-cache.js +2 -5
  1256. package/dist/icons/shard-cache.js.map +1 -1
  1257. package/dist/icons/use-icon.cjs.map +1 -1
  1258. package/dist/icons/use-icon.js.map +1 -1
  1259. package/dist/icons/validate-icon-name.cjs.map +1 -1
  1260. package/dist/icons/validate-icon-name.js.map +1 -1
  1261. package/dist/icons-virtual.cjs.map +1 -1
  1262. package/dist/icons-virtual.js.map +1 -1
  1263. package/dist/imaging/canvas.cjs.map +1 -1
  1264. package/dist/imaging/canvas.js.map +1 -1
  1265. package/dist/imaging/compress.cjs.map +1 -1
  1266. package/dist/imaging/compress.js.map +1 -1
  1267. package/dist/imaging/decode.cjs.map +1 -1
  1268. package/dist/imaging/decode.js.map +1 -1
  1269. package/dist/imaging/encode.cjs.map +1 -1
  1270. package/dist/imaging/encode.js.map +1 -1
  1271. package/dist/imaging/exceptions.cjs.map +1 -1
  1272. package/dist/imaging/exceptions.js.map +1 -1
  1273. package/dist/imaging/frame.cjs.map +1 -1
  1274. package/dist/imaging/frame.js.map +1 -1
  1275. package/dist/imaging/thumbnails.cjs.map +1 -1
  1276. package/dist/imaging/thumbnails.js.map +1 -1
  1277. package/dist/imaging/transform.cjs.map +1 -1
  1278. package/dist/imaging/transform.js.map +1 -1
  1279. package/dist/imaging/use-image-processing.cjs.map +1 -1
  1280. package/dist/imaging/use-image-processing.js.map +1 -1
  1281. package/dist/logger/logger.cjs.map +1 -1
  1282. package/dist/logger/logger.js.map +1 -1
  1283. package/dist/neural.cjs.map +1 -1
  1284. package/dist/neural.js.map +1 -1
  1285. package/dist/oauth/GoogleSignIn.cjs +1 -1
  1286. package/dist/oauth/GoogleSignIn.cjs.map +1 -1
  1287. package/dist/oauth/GoogleSignIn.js +6 -9
  1288. package/dist/oauth/GoogleSignIn.js.map +1 -1
  1289. package/dist/oauth/callback.cjs.map +1 -1
  1290. package/dist/oauth/callback.js.map +1 -1
  1291. package/dist/oauth/use-oauth-callback.cjs.map +1 -1
  1292. package/dist/oauth/use-oauth-callback.js.map +1 -1
  1293. package/dist/offline/conflict.cjs.map +1 -1
  1294. package/dist/offline/conflict.js.map +1 -1
  1295. package/dist/offline/create-offline-database.cjs.map +1 -1
  1296. package/dist/offline/create-offline-database.js.map +1 -1
  1297. package/dist/offline/create-offline-store.cjs +1 -1
  1298. package/dist/offline/create-offline-store.cjs.map +1 -1
  1299. package/dist/offline/create-offline-store.js +1 -5
  1300. package/dist/offline/create-offline-store.js.map +1 -1
  1301. package/dist/offline/create-offline-sync.cjs +1 -1
  1302. package/dist/offline/create-offline-sync.cjs.map +1 -1
  1303. package/dist/offline/create-offline-sync.js +9 -14
  1304. package/dist/offline/create-offline-sync.js.map +1 -1
  1305. package/dist/offline/use-offline-sync.cjs.map +1 -1
  1306. package/dist/offline/use-offline-sync.js.map +1 -1
  1307. package/dist/perf/cache-size.cjs.map +1 -1
  1308. package/dist/perf/cache-size.js.map +1 -1
  1309. package/dist/perf/device.cjs.map +1 -1
  1310. package/dist/perf/device.js.map +1 -1
  1311. package/dist/perf/format.cjs.map +1 -1
  1312. package/dist/perf/format.js.map +1 -1
  1313. package/dist/perf/profiler.cjs.map +1 -1
  1314. package/dist/perf/profiler.js.map +1 -1
  1315. package/dist/push/use-push-subscription.cjs.map +1 -1
  1316. package/dist/push/use-push-subscription.js.map +1 -1
  1317. package/dist/push/utils.cjs.map +1 -1
  1318. package/dist/push/utils.js.map +1 -1
  1319. package/dist/push/web-push-client.cjs.map +1 -1
  1320. package/dist/push/web-push-client.js.map +1 -1
  1321. package/dist/query/QueryProvider.cjs.map +1 -1
  1322. package/dist/query/QueryProvider.js.map +1 -1
  1323. package/dist/query/constants.cjs.map +1 -1
  1324. package/dist/query/constants.js.map +1 -1
  1325. package/dist/query/create-query-keys.cjs.map +1 -1
  1326. package/dist/query/create-query-keys.js.map +1 -1
  1327. package/dist/query/foreign-client-warning.cjs.map +1 -1
  1328. package/dist/query/foreign-client-warning.js.map +1 -1
  1329. package/dist/query/offline-persistence.cjs +1 -1
  1330. package/dist/query/offline-persistence.cjs.map +1 -1
  1331. package/dist/query/offline-persistence.js +2 -10
  1332. package/dist/query/offline-persistence.js.map +1 -1
  1333. package/dist/query/optimistic.cjs.map +1 -1
  1334. package/dist/query/optimistic.js.map +1 -1
  1335. package/dist/query/pagination.cjs.map +1 -1
  1336. package/dist/query/pagination.js.map +1 -1
  1337. package/dist/query/retry-policy.cjs.map +1 -1
  1338. package/dist/query/retry-policy.js.map +1 -1
  1339. package/dist/query/use-cursor-query.cjs.map +1 -1
  1340. package/dist/query/use-cursor-query.js.map +1 -1
  1341. package/dist/query/use-offline-mutation.cjs.map +1 -1
  1342. package/dist/query/use-offline-mutation.js.map +1 -1
  1343. package/dist/query/use-paginated-query.cjs.map +1 -1
  1344. package/dist/query/use-paginated-query.js.map +1 -1
  1345. package/dist/router/AppRouter.cjs.map +1 -1
  1346. package/dist/router/AppRouter.js.map +1 -1
  1347. package/dist/router/RouteGuard.cjs.map +1 -1
  1348. package/dist/router/RouteGuard.js.map +1 -1
  1349. package/dist/router/index.js +2 -2
  1350. package/dist/share/share-or-download.cjs.map +1 -1
  1351. package/dist/share/share-or-download.js.map +1 -1
  1352. package/dist/share/share.cjs.map +1 -1
  1353. package/dist/share/share.js.map +1 -1
  1354. package/dist/sse/create-event-stream.cjs.map +1 -1
  1355. package/dist/sse/create-event-stream.js.map +1 -1
  1356. package/dist/sse/use-event-stream.cjs.map +1 -1
  1357. package/dist/sse/use-event-stream.js.map +1 -1
  1358. package/dist/store/create-selectors.cjs.map +1 -1
  1359. package/dist/store/create-selectors.js.map +1 -1
  1360. package/dist/store/create-store.cjs.map +1 -1
  1361. package/dist/store/create-store.js.map +1 -1
  1362. package/dist/sw/background-sync.cjs +1 -1
  1363. package/dist/sw/background-sync.cjs.map +1 -1
  1364. package/dist/sw/background-sync.js +32 -31
  1365. package/dist/sw/background-sync.js.map +1 -1
  1366. package/dist/sw/cache-inspect.cjs.map +1 -1
  1367. package/dist/sw/cache-inspect.js.map +1 -1
  1368. package/dist/sw/cache.cjs +1 -1
  1369. package/dist/sw/cache.cjs.map +1 -1
  1370. package/dist/sw/cache.js +2 -6
  1371. package/dist/sw/cache.js.map +1 -1
  1372. package/dist/sw/create-push-handler.cjs.map +1 -1
  1373. package/dist/sw/create-push-handler.js.map +1 -1
  1374. package/dist/sw/credential-headers.cjs.map +1 -1
  1375. package/dist/sw/credential-headers.js.map +1 -1
  1376. package/dist/sw/periodic-sync.cjs.map +1 -1
  1377. package/dist/sw/periodic-sync.js.map +1 -1
  1378. package/dist/sw/register-service-worker.cjs.map +1 -1
  1379. package/dist/sw/register-service-worker.js.map +1 -1
  1380. package/dist/sw/session-data.cjs.map +1 -1
  1381. package/dist/sw/session-data.js.map +1 -1
  1382. package/dist/sw.d.ts +46 -8
  1383. package/dist/tabular/assets.cjs.map +1 -1
  1384. package/dist/tabular/assets.js.map +1 -1
  1385. package/dist/tabular/cache.cjs.map +1 -1
  1386. package/dist/tabular/cache.js.map +1 -1
  1387. package/dist/tabular/compact.cjs.map +1 -1
  1388. package/dist/tabular/compact.js.map +1 -1
  1389. package/dist/tabular/exceptions.cjs.map +1 -1
  1390. package/dist/tabular/exceptions.js.map +1 -1
  1391. package/dist/tabular/manifest.cjs.map +1 -1
  1392. package/dist/tabular/manifest.js.map +1 -1
  1393. package/dist/tabular/predictor.cjs.map +1 -1
  1394. package/dist/tabular/predictor.js.map +1 -1
  1395. package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
  1396. package/dist/tabular/use-tabular-predictor.js.map +1 -1
  1397. package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
  1398. package/dist/telemetry/TelemetryProvider.js.map +1 -1
  1399. package/dist/telemetry/app-error-adapter.cjs.map +1 -1
  1400. package/dist/telemetry/app-error-adapter.js.map +1 -1
  1401. package/dist/telemetry/app-error-queue.cjs.map +1 -1
  1402. package/dist/telemetry/app-error-queue.js.map +1 -1
  1403. package/dist/telemetry/app-error-reporter.cjs +1 -1
  1404. package/dist/telemetry/app-error-reporter.cjs.map +1 -1
  1405. package/dist/telemetry/app-error-reporter.js +1 -1
  1406. package/dist/telemetry/app-error-reporter.js.map +1 -1
  1407. package/dist/telemetry/app-error-schema.cjs.map +1 -1
  1408. package/dist/telemetry/app-error-schema.js.map +1 -1
  1409. package/dist/telemetry/app-error-transport.cjs.map +1 -1
  1410. package/dist/telemetry/app-error-transport.js.map +1 -1
  1411. package/dist/telemetry/console-adapter.cjs.map +1 -1
  1412. package/dist/telemetry/console-adapter.js.map +1 -1
  1413. package/dist/telemetry/describe-app-error.cjs.map +1 -1
  1414. package/dist/telemetry/describe-app-error.js.map +1 -1
  1415. package/dist/telemetry/posthog-adapter.cjs +1 -1
  1416. package/dist/telemetry/posthog-adapter.cjs.map +1 -1
  1417. package/dist/telemetry/posthog-adapter.js +1 -5
  1418. package/dist/telemetry/posthog-adapter.js.map +1 -1
  1419. package/dist/telemetry/sentry-adapter.cjs.map +1 -1
  1420. package/dist/telemetry/sentry-adapter.js.map +1 -1
  1421. package/dist/tempest-react-sdk.cjs +1 -1
  1422. package/dist/tempest-react-sdk.d.ts +448 -15
  1423. package/dist/tempest-react-sdk.js +119 -119
  1424. package/dist/testing/create-mock-handlers.cjs.map +1 -1
  1425. package/dist/testing/create-mock-handlers.js.map +1 -1
  1426. package/dist/testing.js +1 -2
  1427. package/dist/theme/ThemeProvider.cjs.map +1 -1
  1428. package/dist/theme/ThemeProvider.js.map +1 -1
  1429. package/dist/theme/apply-theme.cjs.map +1 -1
  1430. package/dist/theme/apply-theme.js.map +1 -1
  1431. package/dist/theme/color.cjs.map +1 -1
  1432. package/dist/theme/color.js.map +1 -1
  1433. package/dist/theme/create-theme.cjs.map +1 -1
  1434. package/dist/theme/create-theme.js.map +1 -1
  1435. package/dist/theme/data-viz-ramps.cjs.map +1 -1
  1436. package/dist/theme/data-viz-ramps.js.map +1 -1
  1437. package/dist/theme/initial-theme.cjs.map +1 -1
  1438. package/dist/theme/initial-theme.js.map +1 -1
  1439. package/dist/theme/inverse-render.cjs.map +1 -1
  1440. package/dist/theme/inverse-render.js.map +1 -1
  1441. package/dist/theme/inverse-restore.cjs.map +1 -1
  1442. package/dist/theme/inverse-restore.js.map +1 -1
  1443. package/dist/theme/inverse-surface.cjs.map +1 -1
  1444. package/dist/theme/inverse-surface.js.map +1 -1
  1445. package/dist/theme/status-tokens.cjs.map +1 -1
  1446. package/dist/theme/status-tokens.js.map +1 -1
  1447. package/dist/theme/theme-presets.cjs.map +1 -1
  1448. package/dist/theme/theme-presets.js.map +1 -1
  1449. package/dist/utils/absent.cjs.map +1 -1
  1450. package/dist/utils/absent.js.map +1 -1
  1451. package/dist/utils/arrays.cjs.map +1 -1
  1452. package/dist/utils/arrays.js.map +1 -1
  1453. package/dist/utils/base64.cjs.map +1 -1
  1454. package/dist/utils/base64.js.map +1 -1
  1455. package/dist/utils/cn.cjs.map +1 -1
  1456. package/dist/utils/cn.js.map +1 -1
  1457. package/dist/utils/compare-values.cjs.map +1 -1
  1458. package/dist/utils/compare-values.js.map +1 -1
  1459. package/dist/utils/compressed-storage.cjs.map +1 -1
  1460. package/dist/utils/compressed-storage.js.map +1 -1
  1461. package/dist/utils/csv.cjs +3 -3
  1462. package/dist/utils/csv.cjs.map +1 -1
  1463. package/dist/utils/csv.js +11 -10
  1464. package/dist/utils/csv.js.map +1 -1
  1465. package/dist/utils/dev-mode.cjs.map +1 -1
  1466. package/dist/utils/dev-mode.js.map +1 -1
  1467. package/dist/utils/duplicate-instance.cjs.map +1 -1
  1468. package/dist/utils/duplicate-instance.js.map +1 -1
  1469. package/dist/utils/format.cjs.map +1 -1
  1470. package/dist/utils/format.js.map +1 -1
  1471. package/dist/utils/functions.cjs +1 -1
  1472. package/dist/utils/functions.cjs.map +1 -1
  1473. package/dist/utils/functions.js +1 -1
  1474. package/dist/utils/functions.js.map +1 -1
  1475. package/dist/utils/guards.cjs.map +1 -1
  1476. package/dist/utils/guards.js.map +1 -1
  1477. package/dist/utils/ids.cjs.map +1 -1
  1478. package/dist/utils/ids.js.map +1 -1
  1479. package/dist/utils/intl-cache.cjs.map +1 -1
  1480. package/dist/utils/intl-cache.js.map +1 -1
  1481. package/dist/utils/json-frame.cjs.map +1 -1
  1482. package/dist/utils/json-frame.js.map +1 -1
  1483. package/dist/utils/numbers.cjs.map +1 -1
  1484. package/dist/utils/numbers.js.map +1 -1
  1485. package/dist/utils/objects.cjs.map +1 -1
  1486. package/dist/utils/objects.js.map +1 -1
  1487. package/dist/{telemetry/app-error-owner.cjs → utils/owner-fingerprint.cjs} +2 -2
  1488. package/dist/utils/owner-fingerprint.cjs.map +1 -0
  1489. package/dist/{telemetry/app-error-owner.js → utils/owner-fingerprint.js} +3 -3
  1490. package/dist/utils/owner-fingerprint.js.map +1 -0
  1491. package/dist/utils/promises.cjs.map +1 -1
  1492. package/dist/utils/promises.js.map +1 -1
  1493. package/dist/utils/relative-time.cjs.map +1 -1
  1494. package/dist/utils/relative-time.js.map +1 -1
  1495. package/dist/utils/safe-url.cjs.map +1 -1
  1496. package/dist/utils/safe-url.js.map +1 -1
  1497. package/dist/utils/schema-like.cjs.map +1 -1
  1498. package/dist/utils/schema-like.js.map +1 -1
  1499. package/dist/utils/storage.cjs +1 -1
  1500. package/dist/utils/storage.cjs.map +1 -1
  1501. package/dist/utils/storage.js +2 -2
  1502. package/dist/utils/storage.js.map +1 -1
  1503. package/dist/utils/strings.cjs.map +1 -1
  1504. package/dist/utils/strings.js.map +1 -1
  1505. package/dist/utils/xlsx.cjs.map +1 -1
  1506. package/dist/utils/xlsx.js.map +1 -1
  1507. package/dist/vision/core/canvas.cjs.map +1 -1
  1508. package/dist/vision/core/canvas.js.map +1 -1
  1509. package/dist/vision/core/dtypes.cjs.map +1 -1
  1510. package/dist/vision/core/dtypes.js.map +1 -1
  1511. package/dist/vision/core/exceptions.cjs.map +1 -1
  1512. package/dist/vision/core/exceptions.js.map +1 -1
  1513. package/dist/vision/core/graph.cjs.map +1 -1
  1514. package/dist/vision/core/graph.js.map +1 -1
  1515. package/dist/vision/core/metadata.cjs +1 -1
  1516. package/dist/vision/core/metadata.cjs.map +1 -1
  1517. package/dist/vision/core/metadata.js +9 -26
  1518. package/dist/vision/core/metadata.js.map +1 -1
  1519. package/dist/vision/core/providers.cjs.map +1 -1
  1520. package/dist/vision/core/providers.js.map +1 -1
  1521. package/dist/vision/core/session.cjs.map +1 -1
  1522. package/dist/vision/core/session.js.map +1 -1
  1523. package/dist/vision/core/timing.cjs.map +1 -1
  1524. package/dist/vision/core/timing.js.map +1 -1
  1525. package/dist/vision/fusion.cjs.map +1 -1
  1526. package/dist/vision/fusion.js.map +1 -1
  1527. package/dist/vision/index.cjs.map +1 -1
  1528. package/dist/vision/index.js.map +1 -1
  1529. package/dist/vision/io/image.cjs.map +1 -1
  1530. package/dist/vision/io/image.js.map +1 -1
  1531. package/dist/vision/labels.cjs.map +1 -1
  1532. package/dist/vision/labels.js.map +1 -1
  1533. package/dist/vision/luminance.cjs.map +1 -1
  1534. package/dist/vision/luminance.js.map +1 -1
  1535. package/dist/vision/normalization.cjs.map +1 -1
  1536. package/dist/vision/normalization.js.map +1 -1
  1537. package/dist/vision/postprocess/classification.cjs.map +1 -1
  1538. package/dist/vision/postprocess/classification.js.map +1 -1
  1539. package/dist/vision/postprocess/detection.cjs.map +1 -1
  1540. package/dist/vision/postprocess/detection.js.map +1 -1
  1541. package/dist/vision/postprocess/segmentation.cjs.map +1 -1
  1542. package/dist/vision/postprocess/segmentation.js.map +1 -1
  1543. package/dist/vision/preprocess/image.cjs.map +1 -1
  1544. package/dist/vision/preprocess/image.js.map +1 -1
  1545. package/dist/vision/preprocess/pipeline.cjs.map +1 -1
  1546. package/dist/vision/preprocess/pipeline.js.map +1 -1
  1547. package/dist/vision/results.cjs.map +1 -1
  1548. package/dist/vision/results.js.map +1 -1
  1549. package/dist/vision/tasks/base.cjs.map +1 -1
  1550. package/dist/vision/tasks/base.js.map +1 -1
  1551. package/dist/vision/tasks/classifier.cjs.map +1 -1
  1552. package/dist/vision/tasks/classifier.js.map +1 -1
  1553. package/dist/vision/tasks/detectClassify.cjs.map +1 -1
  1554. package/dist/vision/tasks/detectClassify.js.map +1 -1
  1555. package/dist/vision/tasks/detector.cjs.map +1 -1
  1556. package/dist/vision/tasks/detector.js.map +1 -1
  1557. package/dist/vision/tasks/segmenter.cjs.map +1 -1
  1558. package/dist/vision/tasks/segmenter.js.map +1 -1
  1559. package/dist/vision/types.cjs.map +1 -1
  1560. package/dist/vision/types.js.map +1 -1
  1561. package/dist/vision/use-camera-stream.cjs +1 -1
  1562. package/dist/vision/use-camera-stream.cjs.map +1 -1
  1563. package/dist/vision/use-camera-stream.js +3 -9
  1564. package/dist/vision/use-camera-stream.js.map +1 -1
  1565. package/dist/vision/use-live-luminance.cjs +1 -1
  1566. package/dist/vision/use-live-luminance.cjs.map +1 -1
  1567. package/dist/vision/use-live-luminance.js +1 -5
  1568. package/dist/vision/use-live-luminance.js.map +1 -1
  1569. package/dist/vite/base-url.cjs.map +1 -1
  1570. package/dist/vite/base-url.js.map +1 -1
  1571. package/dist/vite/create-vite-config.cjs.map +1 -1
  1572. package/dist/vite/create-vite-config.js.map +1 -1
  1573. package/dist/vite/narrow-tokens.cjs.map +1 -1
  1574. package/dist/vite/narrow-tokens.js.map +1 -1
  1575. package/dist/vite/tempest-csp.cjs +2 -2
  1576. package/dist/vite/tempest-csp.cjs.map +1 -1
  1577. package/dist/vite/tempest-csp.js +69 -66
  1578. package/dist/vite/tempest-csp.js.map +1 -1
  1579. package/dist/vite/tempest-icons.cjs.map +1 -1
  1580. package/dist/vite/tempest-icons.js.map +1 -1
  1581. package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
  1582. package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
  1583. package/dist/vite/tempest-pwa-dev-sw.js +9 -16
  1584. package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
  1585. package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
  1586. package/dist/vite/tempest-pwa-icons.js.map +1 -1
  1587. package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
  1588. package/dist/vite/tempest-pwa-manifest.js.map +1 -1
  1589. package/dist/vite/tempest-styles.cjs.map +1 -1
  1590. package/dist/vite/tempest-styles.js.map +1 -1
  1591. package/dist/vite/tempest-vitest.cjs.map +1 -1
  1592. package/dist/vite/tempest-vitest.js.map +1 -1
  1593. package/dist/vite.d.ts +5 -3
  1594. package/dist/webrtc/link-stats.cjs.map +1 -1
  1595. package/dist/webrtc/link-stats.js.map +1 -1
  1596. package/dist/webrtc/mesh-quality.cjs.map +1 -1
  1597. package/dist/webrtc/mesh-quality.js.map +1 -1
  1598. package/dist/webrtc/opus-sdp.cjs.map +1 -1
  1599. package/dist/webrtc/opus-sdp.js.map +1 -1
  1600. package/dist/webrtc/peer-link.cjs +1 -1
  1601. package/dist/webrtc/peer-link.cjs.map +1 -1
  1602. package/dist/webrtc/peer-link.js +2 -5
  1603. package/dist/webrtc/peer-link.js.map +1 -1
  1604. package/dist/webrtc/peer-mesh.cjs +1 -1
  1605. package/dist/webrtc/peer-mesh.cjs.map +1 -1
  1606. package/dist/webrtc/peer-mesh.js +8 -24
  1607. package/dist/webrtc/peer-mesh.js.map +1 -1
  1608. package/dist/webrtc/sender-bitrate.cjs.map +1 -1
  1609. package/dist/webrtc/sender-bitrate.js.map +1 -1
  1610. package/dist/webrtc/use-link-stats.cjs.map +1 -1
  1611. package/dist/webrtc/use-link-stats.js.map +1 -1
  1612. package/dist/ws/create-web-socket.cjs +1 -1
  1613. package/dist/ws/create-web-socket.cjs.map +1 -1
  1614. package/dist/ws/create-web-socket.js +4 -22
  1615. package/dist/ws/create-web-socket.js.map +1 -1
  1616. package/dist/ws/resilience.cjs.map +1 -1
  1617. package/dist/ws/resilience.js.map +1 -1
  1618. package/dist/ws/use-web-socket.cjs.map +1 -1
  1619. package/dist/ws/use-web-socket.js.map +1 -1
  1620. package/package.json +9 -6
  1621. package/template/package.json +1 -1
  1622. package/dist/telemetry/app-error-owner.cjs.map +0 -1
  1623. package/dist/telemetry/app-error-owner.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use-idle.cjs","names":[],"sources":["../../src/hooks/use-idle.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nconst DEFAULT_EVENTS: (keyof WindowEventMap)[] = [\n \"mousemove\",\n \"mousedown\",\n \"keydown\",\n \"touchstart\",\n \"wheel\",\n \"scroll\",\n];\n\n/**\n * Detect when the user has been idle for `timeout` ms (no interaction).\n * Returns `true` once the threshold elapses and back to `false` on activity.\n */\nexport function useIdle(timeout = 60_000): boolean {\n const [idle, setIdle] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n let timer = setTimeout(() => setIdle(true), timeout);\n\n function reset(): void {\n setIdle(false);\n clearTimeout(timer);\n timer = setTimeout(() => setIdle(true), timeout);\n }\n\n for (const event of DEFAULT_EVENTS) {\n window.addEventListener(event, reset, { passive: true });\n }\n return () => {\n clearTimeout(timer);\n for (const event of DEFAULT_EVENTS) {\n window.removeEventListener(event, reset);\n }\n };\n }, [timeout]);\n\n return idle;\n}\n"],"mappings":"uBAEA,IAAM,EAA2C,CAC7C,YACA,YACA,UACA,aACA,QACA,QACJ,EAMA,SAAgB,EAAQ,EAAU,IAAiB,CAC/C,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAkB,EAAK,EAuB/C,OArBA,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAI,EAAQ,eAAiB,EAAQ,EAAI,EAAG,CAAO,EAEnD,SAAS,GAAc,CACnB,EAAQ,EAAK,EACb,aAAa,CAAK,EAClB,EAAQ,eAAiB,EAAQ,EAAI,EAAG,CAAO,CACnD,CAEA,IAAK,IAAM,KAAS,EAChB,OAAO,iBAAiB,EAAO,EAAO,CAAE,QAAS,EAAK,CAAC,EAE3D,UAAa,CACT,aAAa,CAAK,EAClB,IAAK,IAAM,KAAS,EAChB,OAAO,oBAAoB,EAAO,CAAK,CAE/C,CACJ,EAAG,CAAC,CAAO,CAAC,EAEL,CACX"}
1
+ {"version":3,"file":"use-idle.cjs","names":["useState","react","DEFAULT_EVENTS","useIdle","idle","setIdle","timer","timeout","reset","event"],"sources":["../../src/hooks/use-idle.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nconst DEFAULT_EVENTS: (keyof WindowEventMap)[] = [\n \"mousemove\",\n \"mousedown\",\n \"keydown\",\n \"touchstart\",\n \"wheel\",\n \"scroll\",\n];\n\n/**\n * Detect when the user has been idle for `timeout` ms (no interaction).\n * Returns `true` once the threshold elapses and back to `false` on activity.\n */\nexport function useIdle(timeout = 60_000): boolean {\n const [idle, setIdle] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n let timer = setTimeout(() => setIdle(true), timeout);\n\n function reset(): void {\n setIdle(false);\n clearTimeout(timer);\n timer = setTimeout(() => setIdle(true), timeout);\n }\n\n for (const event of DEFAULT_EVENTS) {\n window.addEventListener(event, reset, { passive: true });\n }\n return () => {\n clearTimeout(timer);\n for (const event of DEFAULT_EVENTS) {\n window.removeEventListener(event, reset);\n }\n };\n }, [timeout]);\n\n return idle;\n}\n"],"mappings":"A,uBAEA,IAAME,EAA2C,CAC7C,YACA,YACA,UACA,aACA,QACA,QACJ,EAMA,SAAgBC,EAAQ,EAAU,IAAiB,CAC/C,GAAM,CAACC,EAAMC,IAAA,EAAWL,EAAAA,SAAAA,CAAkB,EAAK,EAuB/C,OArBA,EAAAC,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAIK,EAAQ,eAAiBD,EAAQ,EAAI,EAAGE,CAAO,EAEnD,SAASC,GAAc,CACnBH,EAAQ,EAAK,EACb,aAAaC,CAAK,EAClB,EAAQ,eAAiBD,EAAQ,EAAI,EAAGE,CAAO,CACnD,CAEA,IAAK,IAAME,KAASP,EAChB,OAAO,iBAAiBO,EAAOD,EAAO,CAAE,QAAS,EAAK,CAAC,EAE3D,UAAa,CACT,aAAaF,CAAK,EAClB,IAAK,IAAMG,KAASP,EAChB,OAAO,oBAAoBO,EAAOD,CAAK,CAE/C,CACJ,EAAG,CAACD,CAAO,CAAC,EAELH,CACX,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-idle.js","names":[],"sources":["../../src/hooks/use-idle.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nconst DEFAULT_EVENTS: (keyof WindowEventMap)[] = [\n \"mousemove\",\n \"mousedown\",\n \"keydown\",\n \"touchstart\",\n \"wheel\",\n \"scroll\",\n];\n\n/**\n * Detect when the user has been idle for `timeout` ms (no interaction).\n * Returns `true` once the threshold elapses and back to `false` on activity.\n */\nexport function useIdle(timeout = 60_000): boolean {\n const [idle, setIdle] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n let timer = setTimeout(() => setIdle(true), timeout);\n\n function reset(): void {\n setIdle(false);\n clearTimeout(timer);\n timer = setTimeout(() => setIdle(true), timeout);\n }\n\n for (const event of DEFAULT_EVENTS) {\n window.addEventListener(event, reset, { passive: true });\n }\n return () => {\n clearTimeout(timer);\n for (const event of DEFAULT_EVENTS) {\n window.removeEventListener(event, reset);\n }\n };\n }, [timeout]);\n\n return idle;\n}\n"],"mappings":";;AAEA,IAAM,IAA2C;CAC7C;CACA;CACA;CACA;CACA;CACA;AACJ;AAMA,SAAgB,EAAQ,IAAU,KAAiB;CAC/C,IAAM,CAAC,GAAM,KAAW,EAAkB,EAAK;CAuB/C,OArBA,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAI,IAAQ,iBAAiB,EAAQ,EAAI,GAAG,CAAO;EAEnD,SAAS,IAAc;GAGnB,AAFA,EAAQ,EAAK,GACb,aAAa,CAAK,GAClB,IAAQ,iBAAiB,EAAQ,EAAI,GAAG,CAAO;EACnD;EAEA,KAAK,IAAM,KAAS,GAChB,OAAO,iBAAiB,GAAO,GAAO,EAAE,SAAS,GAAK,CAAC;EAE3D,aAAa;GACT,aAAa,CAAK;GAClB,KAAK,IAAM,KAAS,GAChB,OAAO,oBAAoB,GAAO,CAAK;EAE/C;CACJ,GAAG,CAAC,CAAO,CAAC,GAEL;AACX"}
1
+ {"version":3,"file":"use-idle.js","names":["DEFAULT_EVENTS","useIdle","idle","setIdle","useState","useEffect","timer","timeout","reset","event"],"sources":["../../src/hooks/use-idle.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nconst DEFAULT_EVENTS: (keyof WindowEventMap)[] = [\n \"mousemove\",\n \"mousedown\",\n \"keydown\",\n \"touchstart\",\n \"wheel\",\n \"scroll\",\n];\n\n/**\n * Detect when the user has been idle for `timeout` ms (no interaction).\n * Returns `true` once the threshold elapses and back to `false` on activity.\n */\nexport function useIdle(timeout = 60_000): boolean {\n const [idle, setIdle] = useState<boolean>(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n let timer = setTimeout(() => setIdle(true), timeout);\n\n function reset(): void {\n setIdle(false);\n clearTimeout(timer);\n timer = setTimeout(() => setIdle(true), timeout);\n }\n\n for (const event of DEFAULT_EVENTS) {\n window.addEventListener(event, reset, { passive: true });\n }\n return () => {\n clearTimeout(timer);\n for (const event of DEFAULT_EVENTS) {\n window.removeEventListener(event, reset);\n }\n };\n }, [timeout]);\n\n return idle;\n}\n"],"mappings":";;AAEA,IAAMA,IAA2C;CAC7C;CACA;CACA;CACA;CACA;CACA;AACJ;AAMA,SAAgBC,EAAQ,IAAU,KAAiB;CAC/C,IAAM,CAACC,GAAMC,KAAWC,EAAkB,EAAK;CAuB/C,OArBAC,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAIC,IAAQ,iBAAiBH,EAAQ,EAAI,GAAGI,CAAO;EAEnD,SAASC,IAAc;GAGnB,AAFAL,EAAQ,EAAK,GACb,aAAaG,CAAK,GAClB,IAAQ,iBAAiBH,EAAQ,EAAI,GAAGI,CAAO;EACnD;EAEA,KAAK,IAAME,KAAST,GAChB,OAAO,iBAAiBS,GAAOD,GAAO,EAAE,SAAS,GAAK,CAAC;EAE3D,aAAa;GACT,aAAaF,CAAK;GAClB,KAAK,IAAMG,KAAST,GAChB,OAAO,oBAAoBS,GAAOD,CAAK;EAE/C;CACJ,GAAG,CAACD,CAAO,CAAC,GAELL;AACX"}
@@ -1,2 +1,2 @@
1
- const e=require("./pwa-env.cjs");let t=require("react");var n=6048e5,r=3e3,i=`tempest:install-declined-at`,a=null,o=new Set;typeof window<`u`&&(window.addEventListener(`beforeinstallprompt`,e=>{e.preventDefault(),a=e,o.forEach(e=>e(a))}),window.addEventListener(`appinstalled`,()=>{a=null,o.forEach(e=>e(null))}));function s(e,t){if(typeof window>`u`)return!1;let n;try{n=window.localStorage.getItem(e)}catch{return!1}if(!n)return!1;let r=Number(n);return Number.isFinite(r)?Date.now()-r<t:!1}function c(c={}){let{declineStorageKey:l=i,declineCooldownMs:u=n,manualFallbackDelayMs:d=r}=c,[f,p]=(0,t.useState)(a),[m,h]=(0,t.useState)(e.isStandalone()),[g,_]=(0,t.useState)(!1);(0,t.useEffect)(()=>(o.add(p),()=>{o.delete(p)}),[]),(0,t.useEffect)(()=>{if(typeof window>`u`)return;let t=window.matchMedia?.(`(display-mode: standalone)`),n=()=>h(e.isStandalone());return t?.addEventListener?.(`change`,n),window.addEventListener(`appinstalled`,n),()=>{t?.removeEventListener?.(`change`,n),window.removeEventListener(`appinstalled`,n)}},[]),(0,t.useEffect)(()=>{if(f){_(!1);return}let e=window.setTimeout(()=>{a||_(!0)},d);return()=>window.clearTimeout(e)},[f,d]);let v=e.isIOS(),y=e.isAndroidWithoutPromptApi(),b=s(l,u),x=`none`;!m&&!b&&(f?x=`native`:v?x=`ios`:(y||g)&&(x=`manual`));let S=()=>{if(!(typeof window>`u`))try{window.localStorage.setItem(l,String(Date.now()))}catch{}};return{deferredPrompt:f,canInstall:x!==`none`,isIOS:v,isStandalone:m,isManualAndroid:y,promptTimedOut:g,method:x,openInChromeIntent:e.buildOpenInChromeIntent(),install:async()=>{if(!f)return!1;await f.prompt();let e=await f.userChoice;return e.outcome===`dismissed`&&S(),a=null,o.forEach(e=>e(null)),e.outcome===`accepted`},recordDecline:S}}exports.useInstallPrompt=c;
1
+ const e=require("./pwa-env.cjs");let t=require("react");var n=6048e5,r=3e3,i=`tempest:install-declined-at`,a=null,o=new Set;typeof window<`u`&&(window.addEventListener(`beforeinstallprompt`,e=>{e.preventDefault(),a=e,o.forEach(e=>e(a))}),window.addEventListener(`appinstalled`,()=>{a=null,o.forEach(e=>e(null))}));function s(e,t){if(typeof window>`u`)return!1;let n;try{n=window.localStorage.getItem(e)}catch{return!1}if(!n)return!1;let r=Number(n);return Number.isFinite(r)?Date.now()-r<t:!1}function c(c={}){let{declineStorageKey:l=i,declineCooldownMs:u=n,manualFallbackDelayMs:d=r}=c,[f,p]=(0,t.useState)(a),[m,h]=(0,t.useState)(e.isStandalone()),[g,_]=(0,t.useState)(!1);(0,t.useEffect)(()=>(o.add(p),()=>{o.delete(p)}),[]),(0,t.useEffect)(()=>{if(typeof window>`u`)return;let t=window.matchMedia?.(`(display-mode: standalone)`),n=()=>h(e.isStandalone());return t?.addEventListener?.(`change`,n),window.addEventListener(`appinstalled`,n),()=>{t?.removeEventListener?.(`change`,n),window.removeEventListener(`appinstalled`,n)}},[]),(0,t.useEffect)(()=>{if(f){_(!1);return}let e=window.setTimeout(()=>{a||_(!0)},d);return()=>window.clearTimeout(e)},[f,d]);let v=e.isIOS(),y=e.isAndroidWithoutPromptApi(),b=s(l,u),x=`none`;!m&&!b&&(f?x=`native`:v?x=`ios`:(y||g)&&(x=`manual`));let S=()=>{if(typeof window<`u`)try{window.localStorage.setItem(l,String(Date.now()))}catch{}};return{deferredPrompt:f,canInstall:x!==`none`,isIOS:v,isStandalone:m,isManualAndroid:y,promptTimedOut:g,method:x,openInChromeIntent:e.buildOpenInChromeIntent(),install:async()=>{if(!f)return!1;await f.prompt();let e=await f.userChoice;return e.outcome===`dismissed`&&S(),a=null,o.forEach(e=>e(null)),e.outcome===`accepted`},recordDecline:S}}exports.useInstallPrompt=c;
2
2
  //# sourceMappingURL=use-install-prompt.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-install-prompt.cjs","names":[],"sources":["../../src/hooks/use-install-prompt.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n buildOpenInChromeIntent,\n isAndroidWithoutPromptApi,\n isIOS,\n isStandalone,\n type BeforeInstallPromptEvent,\n} from \"./pwa-env\";\n\nconst DEFAULT_DECLINE_COOLDOWN_MS = 7 * 24 * 60 * 60 * 1000;\nconst DEFAULT_MANUAL_FALLBACK_DELAY_MS = 3000;\nconst DEFAULT_DECLINE_STORAGE_KEY = \"tempest:install-declined-at\";\n\nlet cachedEvent: BeforeInstallPromptEvent | null = null;\nconst eventSubscribers = new Set<(event: BeforeInstallPromptEvent | null) => void>();\n\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeinstallprompt\", (event: Event) => {\n event.preventDefault();\n cachedEvent = event as BeforeInstallPromptEvent;\n eventSubscribers.forEach((fn) => fn(cachedEvent));\n });\n window.addEventListener(\"appinstalled\", () => {\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n });\n}\n\n/**\n * Strategy the UI should use to install the app:\n *\n * - `\"native\"`: trigger `BeforeInstallPromptEvent.prompt()`.\n * - `\"ios\"`: show iOS Safari Share → Add to Home Screen instructions.\n * - `\"manual\"`: show generic browser-menu instructions (Chromium forks that\n * strip the prompt API, plus the timeout fallback when no event arrives).\n * - `\"none\"`: nothing to offer (already installed or unsupported runtime).\n */\nexport type InstallMethod = \"native\" | \"ios\" | \"manual\" | \"none\";\n\n/** Options for {@link useInstallPrompt}. */\nexport interface UseInstallPromptOptions {\n /**\n * `localStorage` key used to persist the decline timestamp. Defaults to\n * `\"tempest:install-declined-at\"`.\n */\n declineStorageKey?: string;\n /**\n * How long, in ms, the install CTA stays hidden after the user declines.\n * Defaults to 7 days.\n */\n declineCooldownMs?: number;\n /**\n * How long, in ms, to wait for a `beforeinstallprompt` event before\n * resolving to the `\"manual\"` method. Defaults to `3000`.\n */\n manualFallbackDelayMs?: number;\n}\n\n/** State returned by {@link useInstallPrompt}. */\nexport interface UseInstallPromptResult {\n /** The cached `beforeinstallprompt` event, or `null` when unavailable. */\n deferredPrompt: BeforeInstallPromptEvent | null;\n /** True when the app can be installed through any supported method. */\n canInstall: boolean;\n /** True when running on iOS/iPadOS Safari. */\n isIOS: boolean;\n /** True when already running as an installed PWA. */\n isStandalone: boolean;\n /** True when the browser is an Android Chromium fork with no prompt API. */\n isManualAndroid: boolean;\n /** True when no `beforeinstallprompt` arrived within the timeout window. */\n promptTimedOut: boolean;\n /** The resolved install strategy the UI should follow. */\n method: InstallMethod;\n /** An `intent://` URL to re-open the page in Chrome on Android, else `null`. */\n openInChromeIntent: string | null;\n /**\n * Triggers the native prompt.\n *\n * @returns `true` when the user accepted the install, `false` otherwise.\n */\n install: () => Promise<boolean>;\n /** Records that the user declined the CTA, starting the cooldown window. */\n recordDecline: () => void;\n}\n\n/**\n * Whether a recorded decline is still inside its cooldown window.\n *\n * Reading is guarded because `localStorage.getItem` **throws** where this hook\n * matters most: Safari private mode and a cross-origin frame with storage\n * blocked. Unguarded, that exception escapes during render and takes the page\n * down — the install CTA is a courtesy, and no courtesy is worth a blank screen.\n *\n * @param key - Storage key holding the decline timestamp.\n * @param cooldownMs - How long a decline suppresses the CTA.\n * @returns Whether the CTA should stay hidden.\n */\nfunction readDecline(key: string, cooldownMs: number): boolean {\n if (typeof window === \"undefined\") return false;\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(key);\n } catch {\n return false;\n }\n if (!raw) return false;\n const ts = Number(raw);\n if (!Number.isFinite(ts)) return false;\n return Date.now() - ts < cooldownMs;\n}\n\n/**\n * React hook that resolves how (and whether) to offer PWA installation.\n *\n * It caches the `beforeinstallprompt` event, detects iOS/iPadOS, detects\n * Android Chromium forks that lack the prompt API, detects standalone display\n * mode, and applies a decline cooldown persisted in `localStorage`. The\n * resulting `method` tells the UI which install affordance to render.\n *\n * Both sides of that persistence are best-effort: `localStorage` throws in\n * Safari private mode and in a cross-origin frame with storage blocked, and an\n * exception raised while resolving an install CTA would take the page down with\n * it. A refused read means \"no decline recorded\"; a refused write means the CTA\n * may come back next visit.\n *\n * The decline persistence is pluggable through\n * {@link UseInstallPromptOptions.declineStorageKey} and\n * {@link UseInstallPromptOptions.declineCooldownMs} — no app-specific storage\n * layer is required, and it is SSR-guarded.\n *\n * @param options - Optional storage key, cooldown, and fallback-delay tuning.\n * @returns The install state plus `install()` and `recordDecline()` actions.\n *\n * @example\n * const { method, install } = useInstallPrompt();\n * if (method === \"native\") return <button onClick={install}>Install</button>;\n */\nexport function useInstallPrompt(options: UseInstallPromptOptions = {}): UseInstallPromptResult {\n const {\n declineStorageKey = DEFAULT_DECLINE_STORAGE_KEY,\n declineCooldownMs = DEFAULT_DECLINE_COOLDOWN_MS,\n manualFallbackDelayMs = DEFAULT_MANUAL_FALLBACK_DELAY_MS,\n } = options;\n\n const [event, setEvent] = useState<BeforeInstallPromptEvent | null>(cachedEvent);\n const [standalone, setStandalone] = useState<boolean>(isStandalone());\n const [promptTimedOut, setPromptTimedOut] = useState<boolean>(false);\n\n useEffect(() => {\n eventSubscribers.add(setEvent);\n return () => {\n eventSubscribers.delete(setEvent);\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia?.(\"(display-mode: standalone)\");\n const handler = (): void => setStandalone(isStandalone());\n mq?.addEventListener?.(\"change\", handler);\n window.addEventListener(\"appinstalled\", handler);\n return () => {\n mq?.removeEventListener?.(\"change\", handler);\n window.removeEventListener(\"appinstalled\", handler);\n };\n }, []);\n\n useEffect(() => {\n if (event) {\n setPromptTimedOut(false);\n return;\n }\n const timer = window.setTimeout(() => {\n if (!cachedEvent) setPromptTimedOut(true);\n }, manualFallbackDelayMs);\n return () => window.clearTimeout(timer);\n }, [event, manualFallbackDelayMs]);\n\n const ios = isIOS();\n const manualAndroid = isAndroidWithoutPromptApi();\n\n const declineActive = readDecline(declineStorageKey, declineCooldownMs);\n\n let method: InstallMethod = \"none\";\n if (!standalone && !declineActive) {\n if (event) method = \"native\";\n else if (ios) method = \"ios\";\n else if (manualAndroid || promptTimedOut) method = \"manual\";\n }\n\n const recordDecline = (): void => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(declineStorageKey, String(Date.now()));\n } catch {\n /* empty */\n }\n };\n\n const install = async (): Promise<boolean> => {\n if (!event) return false;\n await event.prompt();\n const choice = await event.userChoice;\n if (choice.outcome === \"dismissed\") recordDecline();\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n return choice.outcome === \"accepted\";\n };\n\n return {\n deferredPrompt: event,\n canInstall: method !== \"none\",\n isIOS: ios,\n isStandalone: standalone,\n isManualAndroid: manualAndroid,\n promptTimedOut,\n method,\n openInChromeIntent: buildOpenInChromeIntent(),\n install,\n recordDecline,\n };\n}\n"],"mappings":"wDASA,IAAM,EAA8B,OAC9B,EAAmC,IACnC,EAA8B,8BAEhC,EAA+C,KAC7C,EAAmB,IAAI,IAEzB,OAAO,OAAW,MAClB,OAAO,iBAAiB,sBAAwB,GAAiB,CAC7D,EAAM,eAAe,EACrB,EAAc,EACd,EAAiB,QAAS,GAAO,EAAG,CAAW,CAAC,CACpD,CAAC,EACD,OAAO,iBAAiB,mBAAsB,CAC1C,EAAc,KACd,EAAiB,QAAS,GAAO,EAAG,IAAI,CAAC,CAC7C,CAAC,GAyEL,SAAS,EAAY,EAAa,EAA6B,CAC3D,GAAI,OAAO,OAAW,IAAa,MAAO,GAC1C,IAAI,EACJ,GAAI,CACA,EAAM,OAAO,aAAa,QAAQ,CAAG,CACzC,MAAQ,CACJ,MAAO,EACX,CACA,GAAI,CAAC,EAAK,MAAO,GACjB,IAAM,EAAK,OAAO,CAAG,EAErB,OADK,OAAO,SAAS,CAAE,EAChB,KAAK,IAAI,EAAI,EAAK,EADQ,EAErC,CA4BA,SAAgB,EAAiB,EAAmC,CAAC,EAA2B,CAC5F,GAAM,CACF,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GACxB,EAEE,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAA0C,CAAW,EACzE,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAkB,EAAA,aAAa,CAAC,EAC9D,CAAC,EAAgB,IAAA,EAAqB,EAAA,SAAA,CAAkB,EAAK,GAEnE,EAAA,EAAA,UAAA,MACI,EAAiB,IAAI,CAAQ,MAChB,CACT,EAAiB,OAAO,CAAQ,CACpC,GACD,CAAC,CAAC,GAEL,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAM,EAAK,OAAO,aAAa,4BAA4B,EACrD,MAAsB,EAAc,EAAA,aAAa,CAAC,EAGxD,OAFA,GAAI,mBAAmB,SAAU,CAAO,EACxC,OAAO,iBAAiB,eAAgB,CAAO,MAClC,CACT,GAAI,sBAAsB,SAAU,CAAO,EAC3C,OAAO,oBAAoB,eAAgB,CAAO,CACtD,CACJ,EAAG,CAAC,CAAC,GAEL,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,EAAO,CACP,EAAkB,EAAK,EACvB,MACJ,CACA,IAAM,EAAQ,OAAO,eAAiB,CAC7B,GAAa,EAAkB,EAAI,CAC5C,EAAG,CAAqB,EACxB,UAAa,OAAO,aAAa,CAAK,CAC1C,EAAG,CAAC,EAAO,CAAqB,CAAC,EAEjC,IAAM,EAAM,EAAA,MAAM,EACZ,EAAgB,EAAA,0BAA0B,EAE1C,EAAgB,EAAY,EAAmB,CAAiB,EAElE,EAAwB,OACxB,CAAC,GAAc,CAAC,IACZ,EAAO,EAAS,SACX,EAAK,EAAS,OACd,GAAiB,KAAgB,EAAS,WAGvD,IAAM,MAA4B,CAC1B,YAAO,OAAW,KACtB,GAAI,CACA,OAAO,aAAa,QAAQ,EAAmB,OAAO,KAAK,IAAI,CAAC,CAAC,CACrE,MAAQ,CAER,CACJ,EAYA,MAAO,CACH,eAAgB,EAChB,WAAY,IAAW,OACvB,MAAO,EACP,aAAc,EACd,gBAAiB,EACjB,iBACA,SACA,mBAAoB,EAAA,wBAAwB,EAC5C,iBAnB0C,CAC1C,GAAI,CAAC,EAAO,MAAO,GACnB,MAAM,EAAM,OAAO,EACnB,IAAM,EAAS,MAAM,EAAM,WAI3B,OAHI,EAAO,UAAY,aAAa,EAAc,EAClD,EAAc,KACd,EAAiB,QAAS,GAAO,EAAG,IAAI,CAAC,EAClC,EAAO,UAAY,UAC9B,EAYI,eACJ,CACJ"}
1
+ {"version":3,"file":"use-install-prompt.cjs","names":["useState","isStandalone","isIOS","isAndroidWithoutPromptApi","buildOpenInChromeIntent","require_pwa_env","react","DEFAULT_DECLINE_COOLDOWN_MS","DEFAULT_MANUAL_FALLBACK_DELAY_MS","DEFAULT_DECLINE_STORAGE_KEY","cachedEvent","eventSubscribers","event","fn","readDecline","raw","key","ts","cooldownMs","useInstallPrompt","options","setEvent","standalone","setStandalone","promptTimedOut","setPromptTimedOut","mq","handler","timer","manualFallbackDelayMs","ios","manualAndroid","declineActive","declineStorageKey","declineCooldownMs","method","recordDecline","choice"],"sources":["../../src/hooks/use-install-prompt.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n buildOpenInChromeIntent,\n isAndroidWithoutPromptApi,\n isIOS,\n isStandalone,\n type BeforeInstallPromptEvent,\n} from \"./pwa-env\";\n\nconst DEFAULT_DECLINE_COOLDOWN_MS = 7 * 24 * 60 * 60 * 1000;\nconst DEFAULT_MANUAL_FALLBACK_DELAY_MS = 3000;\nconst DEFAULT_DECLINE_STORAGE_KEY = \"tempest:install-declined-at\";\n\nlet cachedEvent: BeforeInstallPromptEvent | null = null;\nconst eventSubscribers = new Set<(event: BeforeInstallPromptEvent | null) => void>();\n\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeinstallprompt\", (event: Event) => {\n event.preventDefault();\n cachedEvent = event as BeforeInstallPromptEvent;\n eventSubscribers.forEach((fn) => fn(cachedEvent));\n });\n window.addEventListener(\"appinstalled\", () => {\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n });\n}\n\n/**\n * Strategy the UI should use to install the app:\n *\n * - `\"native\"`: trigger `BeforeInstallPromptEvent.prompt()`.\n * - `\"ios\"`: show iOS Safari Share → Add to Home Screen instructions.\n * - `\"manual\"`: show generic browser-menu instructions (Chromium forks that\n * strip the prompt API, plus the timeout fallback when no event arrives).\n * - `\"none\"`: nothing to offer (already installed or unsupported runtime).\n */\nexport type InstallMethod = \"native\" | \"ios\" | \"manual\" | \"none\";\n\n/** Options for {@link useInstallPrompt}. */\nexport interface UseInstallPromptOptions {\n /**\n * `localStorage` key used to persist the decline timestamp. Defaults to\n * `\"tempest:install-declined-at\"`.\n */\n declineStorageKey?: string;\n /**\n * How long, in ms, the install CTA stays hidden after the user declines.\n * Defaults to 7 days.\n */\n declineCooldownMs?: number;\n /**\n * How long, in ms, to wait for a `beforeinstallprompt` event before\n * resolving to the `\"manual\"` method. Defaults to `3000`.\n */\n manualFallbackDelayMs?: number;\n}\n\n/** State returned by {@link useInstallPrompt}. */\nexport interface UseInstallPromptResult {\n /** The cached `beforeinstallprompt` event, or `null` when unavailable. */\n deferredPrompt: BeforeInstallPromptEvent | null;\n /** True when the app can be installed through any supported method. */\n canInstall: boolean;\n /** True when running on iOS/iPadOS Safari. */\n isIOS: boolean;\n /** True when already running as an installed PWA. */\n isStandalone: boolean;\n /** True when the browser is an Android Chromium fork with no prompt API. */\n isManualAndroid: boolean;\n /** True when no `beforeinstallprompt` arrived within the timeout window. */\n promptTimedOut: boolean;\n /** The resolved install strategy the UI should follow. */\n method: InstallMethod;\n /** An `intent://` URL to re-open the page in Chrome on Android, else `null`. */\n openInChromeIntent: string | null;\n /**\n * Triggers the native prompt.\n *\n * @returns `true` when the user accepted the install, `false` otherwise.\n */\n install: () => Promise<boolean>;\n /** Records that the user declined the CTA, starting the cooldown window. */\n recordDecline: () => void;\n}\n\n/**\n * Whether a recorded decline is still inside its cooldown window.\n *\n * Reading is guarded because `localStorage.getItem` **throws** where this hook\n * matters most: Safari private mode and a cross-origin frame with storage\n * blocked. Unguarded, that exception escapes during render and takes the page\n * down — the install CTA is a courtesy, and no courtesy is worth a blank screen.\n *\n * @param key - Storage key holding the decline timestamp.\n * @param cooldownMs - How long a decline suppresses the CTA.\n * @returns Whether the CTA should stay hidden.\n */\nfunction readDecline(key: string, cooldownMs: number): boolean {\n if (typeof window === \"undefined\") return false;\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(key);\n } catch {\n return false;\n }\n if (!raw) return false;\n const ts = Number(raw);\n if (!Number.isFinite(ts)) return false;\n return Date.now() - ts < cooldownMs;\n}\n\n/**\n * React hook that resolves how (and whether) to offer PWA installation.\n *\n * It caches the `beforeinstallprompt` event, detects iOS/iPadOS, detects\n * Android Chromium forks that lack the prompt API, detects standalone display\n * mode, and applies a decline cooldown persisted in `localStorage`. The\n * resulting `method` tells the UI which install affordance to render.\n *\n * Both sides of that persistence are best-effort: `localStorage` throws in\n * Safari private mode and in a cross-origin frame with storage blocked, and an\n * exception raised while resolving an install CTA would take the page down with\n * it. A refused read means \"no decline recorded\"; a refused write means the CTA\n * may come back next visit.\n *\n * The decline persistence is pluggable through\n * {@link UseInstallPromptOptions.declineStorageKey} and\n * {@link UseInstallPromptOptions.declineCooldownMs} — no app-specific storage\n * layer is required, and it is SSR-guarded.\n *\n * @param options - Optional storage key, cooldown, and fallback-delay tuning.\n * @returns The install state plus `install()` and `recordDecline()` actions.\n *\n * @example\n * const { method, install } = useInstallPrompt();\n * if (method === \"native\") return <button onClick={install}>Install</button>;\n */\nexport function useInstallPrompt(options: UseInstallPromptOptions = {}): UseInstallPromptResult {\n const {\n declineStorageKey = DEFAULT_DECLINE_STORAGE_KEY,\n declineCooldownMs = DEFAULT_DECLINE_COOLDOWN_MS,\n manualFallbackDelayMs = DEFAULT_MANUAL_FALLBACK_DELAY_MS,\n } = options;\n\n const [event, setEvent] = useState<BeforeInstallPromptEvent | null>(cachedEvent);\n const [standalone, setStandalone] = useState<boolean>(isStandalone());\n const [promptTimedOut, setPromptTimedOut] = useState<boolean>(false);\n\n useEffect(() => {\n eventSubscribers.add(setEvent);\n return () => {\n eventSubscribers.delete(setEvent);\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia?.(\"(display-mode: standalone)\");\n const handler = (): void => setStandalone(isStandalone());\n mq?.addEventListener?.(\"change\", handler);\n window.addEventListener(\"appinstalled\", handler);\n return () => {\n mq?.removeEventListener?.(\"change\", handler);\n window.removeEventListener(\"appinstalled\", handler);\n };\n }, []);\n\n useEffect(() => {\n if (event) {\n setPromptTimedOut(false);\n return;\n }\n const timer = window.setTimeout(() => {\n if (!cachedEvent) setPromptTimedOut(true);\n }, manualFallbackDelayMs);\n return () => window.clearTimeout(timer);\n }, [event, manualFallbackDelayMs]);\n\n const ios = isIOS();\n const manualAndroid = isAndroidWithoutPromptApi();\n\n const declineActive = readDecline(declineStorageKey, declineCooldownMs);\n\n let method: InstallMethod = \"none\";\n if (!standalone && !declineActive) {\n if (event) method = \"native\";\n else if (ios) method = \"ios\";\n else if (manualAndroid || promptTimedOut) method = \"manual\";\n }\n\n const recordDecline = (): void => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(declineStorageKey, String(Date.now()));\n } catch {\n /* empty */\n }\n };\n\n const install = async (): Promise<boolean> => {\n if (!event) return false;\n await event.prompt();\n const choice = await event.userChoice;\n if (choice.outcome === \"dismissed\") recordDecline();\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n return choice.outcome === \"accepted\";\n };\n\n return {\n deferredPrompt: event,\n canInstall: method !== \"none\",\n isIOS: ios,\n isStandalone: standalone,\n isManualAndroid: manualAndroid,\n promptTimedOut,\n method,\n openInChromeIntent: buildOpenInChromeIntent(),\n install,\n recordDecline,\n };\n}\n"],"mappings":"A,wDASA,IAAMO,EAA8B,OAC9BC,EAAmC,IACnCC,EAA8B,8BAEhCC,EAA+C,KAC7CC,EAAmB,IAAI,IAEzB,OAAO,OAAW,MAClB,OAAO,iBAAiB,sBAAwB,GAAiB,CAC7DC,EAAM,eAAe,EACrB,EAAcA,EACdD,EAAiB,QAAS,GAAOE,EAAGH,CAAW,CAAC,CACpD,CAAC,EACD,OAAO,iBAAiB,mBAAsB,CAC1C,EAAc,KACdC,EAAiB,QAAS,GAAOE,EAAG,IAAI,CAAC,CAC7C,CAAC,GAyEL,SAASC,EAAY,EAAa,EAA6B,CAC3D,GAAI,OAAO,OAAW,IAAa,MAAO,GAC1C,IAAIC,EACJ,GAAI,CACA,EAAM,OAAO,aAAa,QAAQC,CAAG,CACzC,MAAQ,CACJ,MAAO,EACX,CACA,GAAI,CAACD,EAAK,MAAO,GACjB,IAAME,EAAK,OAAOF,CAAG,EAErB,OADK,OAAO,SAASE,CAAE,EAChB,KAAK,IAAI,EAAIA,EAAKC,EADQ,EAErC,CA4BA,SAAgBC,EAAiB,EAAmC,CAAC,EAA2B,CAC5F,GAAM,CACF,oBAAoBV,EACpB,oBAAoBF,EACpB,wBAAwBC,GACxBY,EAEE,CAACR,EAAOS,IAAA,EAAYrB,EAAAA,SAAAA,CAA0CU,CAAW,EACzE,CAACY,EAAYC,IAAA,EAAiBvB,EAAAA,SAAAA,CAAkBC,EAAAA,aAAa,CAAC,EAC9D,CAACuB,EAAgBC,IAAA,EAAqBzB,EAAAA,SAAAA,CAAkB,EAAK,GAEnE,EAAAM,EAAA,UAAA,MACIK,EAAiB,IAAIU,CAAQ,MAChB,CACTV,EAAiB,OAAOU,CAAQ,CACpC,GACD,CAAC,CAAC,GAEL,EAAAf,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAMoB,EAAK,OAAO,aAAa,4BAA4B,EACrDC,MAAsBJ,EAActB,EAAAA,aAAa,CAAC,EAGxD,OAFAyB,GAAI,mBAAmB,SAAUC,CAAO,EACxC,OAAO,iBAAiB,eAAgBA,CAAO,MAClC,CACTD,GAAI,sBAAsB,SAAUC,CAAO,EAC3C,OAAO,oBAAoB,eAAgBA,CAAO,CACtD,CACJ,EAAG,CAAC,CAAC,GAEL,EAAArB,EAAA,UAAA,KAAgB,CACZ,GAAIM,EAAO,CACPa,EAAkB,EAAK,EACvB,MACJ,CACA,IAAMG,EAAQ,OAAO,eAAiB,CAC7BlB,GAAae,EAAkB,EAAI,CAC5C,EAAGI,CAAqB,EACxB,UAAa,OAAO,aAAaD,CAAK,CAC1C,EAAG,CAAChB,EAAOiB,CAAqB,CAAC,EAEjC,IAAMC,EAAM5B,EAAAA,MAAM,EACZ6B,EAAgB5B,EAAAA,0BAA0B,EAE1C6B,EAAgBlB,EAAYmB,EAAmBC,CAAiB,EAElEC,EAAwB,OACxB,CAACb,GAAc,CAACU,IACZpB,EAAO,EAAS,SACXkB,EAAK,EAAS,OACdC,GAAiBP,KAAgB,EAAS,WAGvD,IAAMY,MAA4B,CAC9B,GAAI,OAAO,OAAW,IACtB,GAAI,CACA,OAAO,aAAa,QAAQH,EAAmB,OAAO,KAAK,IAAI,CAAC,CAAC,CACrE,MAAQ,CAER,CACJ,EAYA,MAAO,CACH,eAAgBrB,EAChB,WAAYuB,IAAW,OACvB,MAAOL,EACP,aAAcR,EACd,gBAAiBS,EACjB,iBACA,SACA,mBAAoB3B,EAAAA,wBAAwB,EAC5C,iBAnB0C,CAC1C,GAAI,CAACQ,EAAO,MAAO,GACnB,MAAMA,EAAM,OAAO,EACnB,IAAMyB,EAAS,MAAMzB,EAAM,WAI3B,OAHIyB,EAAO,UAAY,aAAaD,EAAc,EAClD,EAAc,KACdzB,EAAiB,QAAS,GAAOE,EAAG,IAAI,CAAC,EAClCwB,EAAO,UAAY,UAC9B,EAYI,eACJ,CACJ,C"}
@@ -42,7 +42,7 @@ function f(f = {}) {
42
42
  let S = n(), C = t(), w = d(p, m), T = "none";
43
43
  !v && !w && (g ? T = "native" : S ? T = "ios" : (C || b) && (T = "manual"));
44
44
  let E = () => {
45
- if (!(typeof window > "u")) try {
45
+ if (typeof window < "u") try {
46
46
  window.localStorage.setItem(p, String(Date.now()));
47
47
  } catch {}
48
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"use-install-prompt.js","names":[],"sources":["../../src/hooks/use-install-prompt.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n buildOpenInChromeIntent,\n isAndroidWithoutPromptApi,\n isIOS,\n isStandalone,\n type BeforeInstallPromptEvent,\n} from \"./pwa-env\";\n\nconst DEFAULT_DECLINE_COOLDOWN_MS = 7 * 24 * 60 * 60 * 1000;\nconst DEFAULT_MANUAL_FALLBACK_DELAY_MS = 3000;\nconst DEFAULT_DECLINE_STORAGE_KEY = \"tempest:install-declined-at\";\n\nlet cachedEvent: BeforeInstallPromptEvent | null = null;\nconst eventSubscribers = new Set<(event: BeforeInstallPromptEvent | null) => void>();\n\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeinstallprompt\", (event: Event) => {\n event.preventDefault();\n cachedEvent = event as BeforeInstallPromptEvent;\n eventSubscribers.forEach((fn) => fn(cachedEvent));\n });\n window.addEventListener(\"appinstalled\", () => {\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n });\n}\n\n/**\n * Strategy the UI should use to install the app:\n *\n * - `\"native\"`: trigger `BeforeInstallPromptEvent.prompt()`.\n * - `\"ios\"`: show iOS Safari Share → Add to Home Screen instructions.\n * - `\"manual\"`: show generic browser-menu instructions (Chromium forks that\n * strip the prompt API, plus the timeout fallback when no event arrives).\n * - `\"none\"`: nothing to offer (already installed or unsupported runtime).\n */\nexport type InstallMethod = \"native\" | \"ios\" | \"manual\" | \"none\";\n\n/** Options for {@link useInstallPrompt}. */\nexport interface UseInstallPromptOptions {\n /**\n * `localStorage` key used to persist the decline timestamp. Defaults to\n * `\"tempest:install-declined-at\"`.\n */\n declineStorageKey?: string;\n /**\n * How long, in ms, the install CTA stays hidden after the user declines.\n * Defaults to 7 days.\n */\n declineCooldownMs?: number;\n /**\n * How long, in ms, to wait for a `beforeinstallprompt` event before\n * resolving to the `\"manual\"` method. Defaults to `3000`.\n */\n manualFallbackDelayMs?: number;\n}\n\n/** State returned by {@link useInstallPrompt}. */\nexport interface UseInstallPromptResult {\n /** The cached `beforeinstallprompt` event, or `null` when unavailable. */\n deferredPrompt: BeforeInstallPromptEvent | null;\n /** True when the app can be installed through any supported method. */\n canInstall: boolean;\n /** True when running on iOS/iPadOS Safari. */\n isIOS: boolean;\n /** True when already running as an installed PWA. */\n isStandalone: boolean;\n /** True when the browser is an Android Chromium fork with no prompt API. */\n isManualAndroid: boolean;\n /** True when no `beforeinstallprompt` arrived within the timeout window. */\n promptTimedOut: boolean;\n /** The resolved install strategy the UI should follow. */\n method: InstallMethod;\n /** An `intent://` URL to re-open the page in Chrome on Android, else `null`. */\n openInChromeIntent: string | null;\n /**\n * Triggers the native prompt.\n *\n * @returns `true` when the user accepted the install, `false` otherwise.\n */\n install: () => Promise<boolean>;\n /** Records that the user declined the CTA, starting the cooldown window. */\n recordDecline: () => void;\n}\n\n/**\n * Whether a recorded decline is still inside its cooldown window.\n *\n * Reading is guarded because `localStorage.getItem` **throws** where this hook\n * matters most: Safari private mode and a cross-origin frame with storage\n * blocked. Unguarded, that exception escapes during render and takes the page\n * down — the install CTA is a courtesy, and no courtesy is worth a blank screen.\n *\n * @param key - Storage key holding the decline timestamp.\n * @param cooldownMs - How long a decline suppresses the CTA.\n * @returns Whether the CTA should stay hidden.\n */\nfunction readDecline(key: string, cooldownMs: number): boolean {\n if (typeof window === \"undefined\") return false;\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(key);\n } catch {\n return false;\n }\n if (!raw) return false;\n const ts = Number(raw);\n if (!Number.isFinite(ts)) return false;\n return Date.now() - ts < cooldownMs;\n}\n\n/**\n * React hook that resolves how (and whether) to offer PWA installation.\n *\n * It caches the `beforeinstallprompt` event, detects iOS/iPadOS, detects\n * Android Chromium forks that lack the prompt API, detects standalone display\n * mode, and applies a decline cooldown persisted in `localStorage`. The\n * resulting `method` tells the UI which install affordance to render.\n *\n * Both sides of that persistence are best-effort: `localStorage` throws in\n * Safari private mode and in a cross-origin frame with storage blocked, and an\n * exception raised while resolving an install CTA would take the page down with\n * it. A refused read means \"no decline recorded\"; a refused write means the CTA\n * may come back next visit.\n *\n * The decline persistence is pluggable through\n * {@link UseInstallPromptOptions.declineStorageKey} and\n * {@link UseInstallPromptOptions.declineCooldownMs} — no app-specific storage\n * layer is required, and it is SSR-guarded.\n *\n * @param options - Optional storage key, cooldown, and fallback-delay tuning.\n * @returns The install state plus `install()` and `recordDecline()` actions.\n *\n * @example\n * const { method, install } = useInstallPrompt();\n * if (method === \"native\") return <button onClick={install}>Install</button>;\n */\nexport function useInstallPrompt(options: UseInstallPromptOptions = {}): UseInstallPromptResult {\n const {\n declineStorageKey = DEFAULT_DECLINE_STORAGE_KEY,\n declineCooldownMs = DEFAULT_DECLINE_COOLDOWN_MS,\n manualFallbackDelayMs = DEFAULT_MANUAL_FALLBACK_DELAY_MS,\n } = options;\n\n const [event, setEvent] = useState<BeforeInstallPromptEvent | null>(cachedEvent);\n const [standalone, setStandalone] = useState<boolean>(isStandalone());\n const [promptTimedOut, setPromptTimedOut] = useState<boolean>(false);\n\n useEffect(() => {\n eventSubscribers.add(setEvent);\n return () => {\n eventSubscribers.delete(setEvent);\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia?.(\"(display-mode: standalone)\");\n const handler = (): void => setStandalone(isStandalone());\n mq?.addEventListener?.(\"change\", handler);\n window.addEventListener(\"appinstalled\", handler);\n return () => {\n mq?.removeEventListener?.(\"change\", handler);\n window.removeEventListener(\"appinstalled\", handler);\n };\n }, []);\n\n useEffect(() => {\n if (event) {\n setPromptTimedOut(false);\n return;\n }\n const timer = window.setTimeout(() => {\n if (!cachedEvent) setPromptTimedOut(true);\n }, manualFallbackDelayMs);\n return () => window.clearTimeout(timer);\n }, [event, manualFallbackDelayMs]);\n\n const ios = isIOS();\n const manualAndroid = isAndroidWithoutPromptApi();\n\n const declineActive = readDecline(declineStorageKey, declineCooldownMs);\n\n let method: InstallMethod = \"none\";\n if (!standalone && !declineActive) {\n if (event) method = \"native\";\n else if (ios) method = \"ios\";\n else if (manualAndroid || promptTimedOut) method = \"manual\";\n }\n\n const recordDecline = (): void => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(declineStorageKey, String(Date.now()));\n } catch {\n /* empty */\n }\n };\n\n const install = async (): Promise<boolean> => {\n if (!event) return false;\n await event.prompt();\n const choice = await event.userChoice;\n if (choice.outcome === \"dismissed\") recordDecline();\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n return choice.outcome === \"accepted\";\n };\n\n return {\n deferredPrompt: event,\n canInstall: method !== \"none\",\n isIOS: ios,\n isStandalone: standalone,\n isManualAndroid: manualAndroid,\n promptTimedOut,\n method,\n openInChromeIntent: buildOpenInChromeIntent(),\n install,\n recordDecline,\n };\n}\n"],"mappings":";;;AASA,IAAM,IAA8B,QAC9B,IAAmC,KACnC,IAA8B,+BAEhC,IAA+C,MAC7C,oBAAmB,IAAI,IAAsD;AAE/E,OAAO,SAAW,QAClB,OAAO,iBAAiB,wBAAwB,MAAiB;CAG7D,AAFA,EAAM,eAAe,GACrB,IAAc,GACd,EAAiB,SAAS,MAAO,EAAG,CAAW,CAAC;AACpD,CAAC,GACD,OAAO,iBAAiB,sBAAsB;CAE1C,AADA,IAAc,MACd,EAAiB,SAAS,MAAO,EAAG,IAAI,CAAC;AAC7C,CAAC;AAyEL,SAAS,EAAY,GAAa,GAA6B;CAC3D,IAAI,OAAO,SAAW,KAAa,OAAO;CAC1C,IAAI;CACJ,IAAI;EACA,IAAM,OAAO,aAAa,QAAQ,CAAG;CACzC,QAAQ;EACJ,OAAO;CACX;CACA,IAAI,CAAC,GAAK,OAAO;CACjB,IAAM,IAAK,OAAO,CAAG;CAErB,OADK,OAAO,SAAS,CAAE,IAChB,KAAK,IAAI,IAAI,IAAK,IADQ;AAErC;AA4BA,SAAgB,EAAiB,IAAmC,CAAC,GAA2B;CAC5F,IAAM,EACF,uBAAoB,GACpB,uBAAoB,GACpB,2BAAwB,MACxB,GAEE,CAAC,GAAO,KAAY,EAA0C,CAAW,GACzE,CAAC,GAAY,KAAiB,EAAkB,EAAa,CAAC,GAC9D,CAAC,GAAgB,KAAqB,EAAkB,EAAK;CAqBnE,AAnBA,SACI,EAAiB,IAAI,CAAQ,SAChB;EACT,EAAiB,OAAO,CAAQ;CACpC,IACD,CAAC,CAAC,GAEL,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAM,IAAK,OAAO,aAAa,4BAA4B,GACrD,UAAsB,EAAc,EAAa,CAAC;EAGxD,OAFA,GAAI,mBAAmB,UAAU,CAAO,GACxC,OAAO,iBAAiB,gBAAgB,CAAO,SAClC;GAET,AADA,GAAI,sBAAsB,UAAU,CAAO,GAC3C,OAAO,oBAAoB,gBAAgB,CAAO;EACtD;CACJ,GAAG,CAAC,CAAC,GAEL,QAAgB;EACZ,IAAI,GAAO;GACP,EAAkB,EAAK;GACvB;EACJ;EACA,IAAM,IAAQ,OAAO,iBAAiB;GAClC,AAAK,KAAa,EAAkB,EAAI;EAC5C,GAAG,CAAqB;EACxB,aAAa,OAAO,aAAa,CAAK;CAC1C,GAAG,CAAC,GAAO,CAAqB,CAAC;CAEjC,IAAM,IAAM,EAAM,GACZ,IAAgB,EAA0B,GAE1C,IAAgB,EAAY,GAAmB,CAAiB,GAElE,IAAwB;CAC5B,AAAI,CAAC,KAAc,CAAC,MACZ,IAAO,IAAS,WACX,IAAK,IAAS,SACd,KAAiB,OAAgB,IAAS;CAGvD,IAAM,UAA4B;EAC1B,aAAO,SAAW,MACtB,IAAI;GACA,OAAO,aAAa,QAAQ,GAAmB,OAAO,KAAK,IAAI,CAAC,CAAC;EACrE,QAAQ,CAER;CACJ;CAYA,OAAO;EACH,gBAAgB;EAChB,YAAY,MAAW;EACvB,OAAO;EACP,cAAc;EACd,iBAAiB;EACjB;EACA;EACA,oBAAoB,EAAwB;EAC5C,qBAnB0C;GAC1C,IAAI,CAAC,GAAO,OAAO;GACnB,MAAM,EAAM,OAAO;GACnB,IAAM,IAAS,MAAM,EAAM;GAI3B,OAHI,EAAO,YAAY,eAAa,EAAc,GAClD,IAAc,MACd,EAAiB,SAAS,MAAO,EAAG,IAAI,CAAC,GAClC,EAAO,YAAY;EAC9B;EAYI;CACJ;AACJ"}
1
+ {"version":3,"file":"use-install-prompt.js","names":["DEFAULT_DECLINE_COOLDOWN_MS","DEFAULT_MANUAL_FALLBACK_DELAY_MS","DEFAULT_DECLINE_STORAGE_KEY","cachedEvent","eventSubscribers","event","fn","readDecline","raw","key","ts","cooldownMs","useInstallPrompt","options","setEvent","useState","standalone","setStandalone","isStandalone","promptTimedOut","setPromptTimedOut","useEffect","mq","handler","timer","manualFallbackDelayMs","ios","isIOS","manualAndroid","isAndroidWithoutPromptApi","declineActive","declineStorageKey","declineCooldownMs","method","recordDecline","buildOpenInChromeIntent","choice"],"sources":["../../src/hooks/use-install-prompt.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n buildOpenInChromeIntent,\n isAndroidWithoutPromptApi,\n isIOS,\n isStandalone,\n type BeforeInstallPromptEvent,\n} from \"./pwa-env\";\n\nconst DEFAULT_DECLINE_COOLDOWN_MS = 7 * 24 * 60 * 60 * 1000;\nconst DEFAULT_MANUAL_FALLBACK_DELAY_MS = 3000;\nconst DEFAULT_DECLINE_STORAGE_KEY = \"tempest:install-declined-at\";\n\nlet cachedEvent: BeforeInstallPromptEvent | null = null;\nconst eventSubscribers = new Set<(event: BeforeInstallPromptEvent | null) => void>();\n\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeinstallprompt\", (event: Event) => {\n event.preventDefault();\n cachedEvent = event as BeforeInstallPromptEvent;\n eventSubscribers.forEach((fn) => fn(cachedEvent));\n });\n window.addEventListener(\"appinstalled\", () => {\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n });\n}\n\n/**\n * Strategy the UI should use to install the app:\n *\n * - `\"native\"`: trigger `BeforeInstallPromptEvent.prompt()`.\n * - `\"ios\"`: show iOS Safari Share → Add to Home Screen instructions.\n * - `\"manual\"`: show generic browser-menu instructions (Chromium forks that\n * strip the prompt API, plus the timeout fallback when no event arrives).\n * - `\"none\"`: nothing to offer (already installed or unsupported runtime).\n */\nexport type InstallMethod = \"native\" | \"ios\" | \"manual\" | \"none\";\n\n/** Options for {@link useInstallPrompt}. */\nexport interface UseInstallPromptOptions {\n /**\n * `localStorage` key used to persist the decline timestamp. Defaults to\n * `\"tempest:install-declined-at\"`.\n */\n declineStorageKey?: string;\n /**\n * How long, in ms, the install CTA stays hidden after the user declines.\n * Defaults to 7 days.\n */\n declineCooldownMs?: number;\n /**\n * How long, in ms, to wait for a `beforeinstallprompt` event before\n * resolving to the `\"manual\"` method. Defaults to `3000`.\n */\n manualFallbackDelayMs?: number;\n}\n\n/** State returned by {@link useInstallPrompt}. */\nexport interface UseInstallPromptResult {\n /** The cached `beforeinstallprompt` event, or `null` when unavailable. */\n deferredPrompt: BeforeInstallPromptEvent | null;\n /** True when the app can be installed through any supported method. */\n canInstall: boolean;\n /** True when running on iOS/iPadOS Safari. */\n isIOS: boolean;\n /** True when already running as an installed PWA. */\n isStandalone: boolean;\n /** True when the browser is an Android Chromium fork with no prompt API. */\n isManualAndroid: boolean;\n /** True when no `beforeinstallprompt` arrived within the timeout window. */\n promptTimedOut: boolean;\n /** The resolved install strategy the UI should follow. */\n method: InstallMethod;\n /** An `intent://` URL to re-open the page in Chrome on Android, else `null`. */\n openInChromeIntent: string | null;\n /**\n * Triggers the native prompt.\n *\n * @returns `true` when the user accepted the install, `false` otherwise.\n */\n install: () => Promise<boolean>;\n /** Records that the user declined the CTA, starting the cooldown window. */\n recordDecline: () => void;\n}\n\n/**\n * Whether a recorded decline is still inside its cooldown window.\n *\n * Reading is guarded because `localStorage.getItem` **throws** where this hook\n * matters most: Safari private mode and a cross-origin frame with storage\n * blocked. Unguarded, that exception escapes during render and takes the page\n * down — the install CTA is a courtesy, and no courtesy is worth a blank screen.\n *\n * @param key - Storage key holding the decline timestamp.\n * @param cooldownMs - How long a decline suppresses the CTA.\n * @returns Whether the CTA should stay hidden.\n */\nfunction readDecline(key: string, cooldownMs: number): boolean {\n if (typeof window === \"undefined\") return false;\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(key);\n } catch {\n return false;\n }\n if (!raw) return false;\n const ts = Number(raw);\n if (!Number.isFinite(ts)) return false;\n return Date.now() - ts < cooldownMs;\n}\n\n/**\n * React hook that resolves how (and whether) to offer PWA installation.\n *\n * It caches the `beforeinstallprompt` event, detects iOS/iPadOS, detects\n * Android Chromium forks that lack the prompt API, detects standalone display\n * mode, and applies a decline cooldown persisted in `localStorage`. The\n * resulting `method` tells the UI which install affordance to render.\n *\n * Both sides of that persistence are best-effort: `localStorage` throws in\n * Safari private mode and in a cross-origin frame with storage blocked, and an\n * exception raised while resolving an install CTA would take the page down with\n * it. A refused read means \"no decline recorded\"; a refused write means the CTA\n * may come back next visit.\n *\n * The decline persistence is pluggable through\n * {@link UseInstallPromptOptions.declineStorageKey} and\n * {@link UseInstallPromptOptions.declineCooldownMs} — no app-specific storage\n * layer is required, and it is SSR-guarded.\n *\n * @param options - Optional storage key, cooldown, and fallback-delay tuning.\n * @returns The install state plus `install()` and `recordDecline()` actions.\n *\n * @example\n * const { method, install } = useInstallPrompt();\n * if (method === \"native\") return <button onClick={install}>Install</button>;\n */\nexport function useInstallPrompt(options: UseInstallPromptOptions = {}): UseInstallPromptResult {\n const {\n declineStorageKey = DEFAULT_DECLINE_STORAGE_KEY,\n declineCooldownMs = DEFAULT_DECLINE_COOLDOWN_MS,\n manualFallbackDelayMs = DEFAULT_MANUAL_FALLBACK_DELAY_MS,\n } = options;\n\n const [event, setEvent] = useState<BeforeInstallPromptEvent | null>(cachedEvent);\n const [standalone, setStandalone] = useState<boolean>(isStandalone());\n const [promptTimedOut, setPromptTimedOut] = useState<boolean>(false);\n\n useEffect(() => {\n eventSubscribers.add(setEvent);\n return () => {\n eventSubscribers.delete(setEvent);\n };\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia?.(\"(display-mode: standalone)\");\n const handler = (): void => setStandalone(isStandalone());\n mq?.addEventListener?.(\"change\", handler);\n window.addEventListener(\"appinstalled\", handler);\n return () => {\n mq?.removeEventListener?.(\"change\", handler);\n window.removeEventListener(\"appinstalled\", handler);\n };\n }, []);\n\n useEffect(() => {\n if (event) {\n setPromptTimedOut(false);\n return;\n }\n const timer = window.setTimeout(() => {\n if (!cachedEvent) setPromptTimedOut(true);\n }, manualFallbackDelayMs);\n return () => window.clearTimeout(timer);\n }, [event, manualFallbackDelayMs]);\n\n const ios = isIOS();\n const manualAndroid = isAndroidWithoutPromptApi();\n\n const declineActive = readDecline(declineStorageKey, declineCooldownMs);\n\n let method: InstallMethod = \"none\";\n if (!standalone && !declineActive) {\n if (event) method = \"native\";\n else if (ios) method = \"ios\";\n else if (manualAndroid || promptTimedOut) method = \"manual\";\n }\n\n const recordDecline = (): void => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(declineStorageKey, String(Date.now()));\n } catch {\n /* empty */\n }\n };\n\n const install = async (): Promise<boolean> => {\n if (!event) return false;\n await event.prompt();\n const choice = await event.userChoice;\n if (choice.outcome === \"dismissed\") recordDecline();\n cachedEvent = null;\n eventSubscribers.forEach((fn) => fn(null));\n return choice.outcome === \"accepted\";\n };\n\n return {\n deferredPrompt: event,\n canInstall: method !== \"none\",\n isIOS: ios,\n isStandalone: standalone,\n isManualAndroid: manualAndroid,\n promptTimedOut,\n method,\n openInChromeIntent: buildOpenInChromeIntent(),\n install,\n recordDecline,\n };\n}\n"],"mappings":";;;AASA,IAAMA,IAA8B,QAC9BC,IAAmC,KACnCC,IAA8B,+BAEhCC,IAA+C,MAC7CC,oBAAmB,IAAI,IAAsD;AAE/E,OAAO,SAAW,QAClB,OAAO,iBAAiB,wBAAwB,MAAiB;CAG7D,AAFAC,EAAM,eAAe,GACrB,IAAcA,GACdD,EAAiB,SAAS,MAAOE,EAAGH,CAAW,CAAC;AACpD,CAAC,GACD,OAAO,iBAAiB,sBAAsB;CAE1C,AADA,IAAc,MACdC,EAAiB,SAAS,MAAOE,EAAG,IAAI,CAAC;AAC7C,CAAC;AAyEL,SAASC,EAAY,GAAa,GAA6B;CAC3D,IAAI,OAAO,SAAW,KAAa,OAAO;CAC1C,IAAIC;CACJ,IAAI;EACA,IAAM,OAAO,aAAa,QAAQC,CAAG;CACzC,QAAQ;EACJ,OAAO;CACX;CACA,IAAI,CAACD,GAAK,OAAO;CACjB,IAAME,IAAK,OAAOF,CAAG;CAErB,OADK,OAAO,SAASE,CAAE,IAChB,KAAK,IAAI,IAAIA,IAAKC,IADQ;AAErC;AA4BA,SAAgBC,EAAiB,IAAmC,CAAC,GAA2B;CAC5F,IAAM,EACF,uBAAoBV,GACpB,uBAAoBF,GACpB,2BAAwBC,MACxBY,GAEE,CAACR,GAAOS,KAAYC,EAA0CZ,CAAW,GACzE,CAACa,GAAYC,KAAiBF,EAAkBG,EAAa,CAAC,GAC9D,CAACC,GAAgBC,KAAqBL,EAAkB,EAAK;CAqBnE,AAnBAM,SACIjB,EAAiB,IAAIU,CAAQ,SAChB;EACT,EAAiB,OAAOA,CAAQ;CACpC,IACD,CAAC,CAAC,GAELO,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAMC,IAAK,OAAO,aAAa,4BAA4B,GACrDC,UAAsBN,EAAcC,EAAa,CAAC;EAGxD,OAFAI,GAAI,mBAAmB,UAAUC,CAAO,GACxC,OAAO,iBAAiB,gBAAgBA,CAAO,SAClC;GAET,AADAD,GAAI,sBAAsB,UAAUC,CAAO,GAC3C,OAAO,oBAAoB,gBAAgBA,CAAO;EACtD;CACJ,GAAG,CAAC,CAAC,GAELF,QAAgB;EACZ,IAAIhB,GAAO;GACP,EAAkB,EAAK;GACvB;EACJ;EACA,IAAMmB,IAAQ,OAAO,iBAAiB;GAClC,AAAKrB,KAAaiB,EAAkB,EAAI;EAC5C,GAAGK,CAAqB;EACxB,aAAa,OAAO,aAAaD,CAAK;CAC1C,GAAG,CAACnB,GAAOoB,CAAqB,CAAC;CAEjC,IAAMC,IAAMC,EAAM,GACZC,IAAgBC,EAA0B,GAE1CC,IAAgBvB,EAAYwB,GAAmBC,CAAiB,GAElEC,IAAwB;CAC5B,AAAI,CAACjB,KAAc,CAACc,MACZzB,IAAO,IAAS,WACXqB,IAAK,IAAS,SACdE,KAAiBT,OAAgB,IAAS;CAGvD,IAAMe,UAA4B;EAC9B,IAAI,OAAO,SAAW,KACtB,IAAI;GACA,OAAO,aAAa,QAAQH,GAAmB,OAAO,KAAK,IAAI,CAAC,CAAC;EACrE,QAAQ,CAER;CACJ;CAYA,OAAO;EACH,gBAAgB1B;EAChB,YAAY4B,MAAW;EACvB,OAAOP;EACP,cAAcV;EACd,iBAAiBY;EACjB;EACA;EACA,oBAAoBO,EAAwB;EAC5C,qBAnB0C;GAC1C,IAAI,CAAC9B,GAAO,OAAO;GACnB,MAAMA,EAAM,OAAO;GACnB,IAAM+B,IAAS,MAAM/B,EAAM;GAI3B,OAHI+B,EAAO,YAAY,eAAaF,EAAc,GAClD,IAAc,MACd9B,EAAiB,SAAS,MAAOE,EAAG,IAAI,CAAC,GAClC8B,EAAO,YAAY;EAC9B;EAYI;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-intersection-observer.cjs","names":[],"sources":["../../src/hooks/use-intersection-observer.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface UseIntersectionObserverOptions extends IntersectionObserverInit {\n /** Stop observing after the first intersection (one-shot). Default: false. */\n once?: boolean;\n}\n\n/**\n * Track whether the referenced element intersects the viewport. Useful for\n * lazy-loading images, \"load more\" sentinels, and animation triggers.\n *\n * @returns `IntersectionObserverEntry | null`. `null` until the first observation.\n */\nexport function useIntersectionObserver(\n ref: RefObject<Element | null>,\n options: UseIntersectionObserverOptions = {},\n): IntersectionObserverEntry | null {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const { once = false, root, rootMargin, threshold } = options;\n\n useEffect(() => {\n const target = ref.current;\n if (!target || typeof IntersectionObserver === \"undefined\") return;\n\n const observer = new IntersectionObserver(\n ([nextEntry]) => {\n if (!nextEntry) return;\n setEntry(nextEntry);\n if (once && nextEntry.isIntersecting) observer.unobserve(target);\n },\n { root, rootMargin, threshold },\n );\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [ref, once, root, rootMargin, threshold]);\n\n return entry;\n}\n"],"mappings":"uBAcA,SAAgB,EACZ,EACA,EAA0C,CAAC,EACX,CAChC,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAA2C,IAAI,EACnE,CAAE,OAAO,GAAO,OAAM,aAAY,aAAc,EAmBtD,OAjBA,EAAA,EAAA,UAAA,KAAgB,CACZ,IAAM,EAAS,EAAI,QACnB,GAAI,CAAC,GAAU,OAAO,qBAAyB,IAAa,OAE5D,IAAM,EAAW,IAAI,sBAChB,CAAC,KAAe,CACR,IACL,EAAS,CAAS,EACd,GAAQ,EAAU,gBAAgB,EAAS,UAAU,CAAM,EACnE,EACA,CAAE,OAAM,aAAY,WAAU,CAClC,EAGA,OADA,EAAS,QAAQ,CAAM,MACV,EAAS,WAAW,CACrC,EAAG,CAAC,EAAK,EAAM,EAAM,EAAY,CAAS,CAAC,EAEpC,CACX"}
1
+ {"version":3,"file":"use-intersection-observer.cjs","names":["useState","react","useIntersectionObserver","entry","setEntry","options","target","ref","observer","nextEntry","once","root","rootMargin","threshold"],"sources":["../../src/hooks/use-intersection-observer.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface UseIntersectionObserverOptions extends IntersectionObserverInit {\n /** Stop observing after the first intersection (one-shot). Default: false. */\n once?: boolean;\n}\n\n/**\n * Track whether the referenced element intersects the viewport. Useful for\n * lazy-loading images, \"load more\" sentinels, and animation triggers.\n *\n * @returns `IntersectionObserverEntry | null`. `null` until the first observation.\n */\nexport function useIntersectionObserver(\n ref: RefObject<Element | null>,\n options: UseIntersectionObserverOptions = {},\n): IntersectionObserverEntry | null {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const { once = false, root, rootMargin, threshold } = options;\n\n useEffect(() => {\n const target = ref.current;\n if (!target || typeof IntersectionObserver === \"undefined\") return;\n\n const observer = new IntersectionObserver(\n ([nextEntry]) => {\n if (!nextEntry) return;\n setEntry(nextEntry);\n if (once && nextEntry.isIntersecting) observer.unobserve(target);\n },\n { root, rootMargin, threshold },\n );\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [ref, once, root, rootMargin, threshold]);\n\n return entry;\n}\n"],"mappings":"A,uBAcA,SAAgBE,EACZ,EACA,EAA0C,CAAC,EACX,CAChC,GAAM,CAACC,EAAOC,IAAA,EAAYJ,EAAAA,SAAAA,CAA2C,IAAI,EACnE,CAAE,OAAO,GAAO,OAAM,aAAY,aAAcK,EAmBtD,OAjBA,EAAAJ,EAAA,UAAA,KAAgB,CACZ,IAAMK,EAASC,EAAI,QACnB,GAAI,CAACD,GAAU,OAAO,qBAAyB,IAAa,OAE5D,IAAME,EAAW,IAAI,sBAChB,CAACC,KAAe,CACRA,IACLL,EAASK,CAAS,EACdC,GAAQD,EAAU,gBAAgBD,EAAS,UAAUF,CAAM,EACnE,EACA,CAAE,OAAM,aAAY,WAAU,CAClC,EAGA,OADAE,EAAS,QAAQF,CAAM,MACVE,EAAS,WAAW,CACrC,EAAG,CAACD,EAAKG,EAAMC,EAAMC,EAAYC,CAAS,CAAC,EAEpCV,CACX,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-intersection-observer.js","names":[],"sources":["../../src/hooks/use-intersection-observer.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface UseIntersectionObserverOptions extends IntersectionObserverInit {\n /** Stop observing after the first intersection (one-shot). Default: false. */\n once?: boolean;\n}\n\n/**\n * Track whether the referenced element intersects the viewport. Useful for\n * lazy-loading images, \"load more\" sentinels, and animation triggers.\n *\n * @returns `IntersectionObserverEntry | null`. `null` until the first observation.\n */\nexport function useIntersectionObserver(\n ref: RefObject<Element | null>,\n options: UseIntersectionObserverOptions = {},\n): IntersectionObserverEntry | null {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const { once = false, root, rootMargin, threshold } = options;\n\n useEffect(() => {\n const target = ref.current;\n if (!target || typeof IntersectionObserver === \"undefined\") return;\n\n const observer = new IntersectionObserver(\n ([nextEntry]) => {\n if (!nextEntry) return;\n setEntry(nextEntry);\n if (once && nextEntry.isIntersecting) observer.unobserve(target);\n },\n { root, rootMargin, threshold },\n );\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [ref, once, root, rootMargin, threshold]);\n\n return entry;\n}\n"],"mappings":";;AAcA,SAAgB,EACZ,GACA,IAA0C,CAAC,GACX;CAChC,IAAM,CAAC,GAAO,KAAY,EAA2C,IAAI,GACnE,EAAE,UAAO,IAAO,SAAM,eAAY,iBAAc;CAmBtD,OAjBA,QAAgB;EACZ,IAAM,IAAS,EAAI;EACnB,IAAI,CAAC,KAAU,OAAO,uBAAyB,KAAa;EAE5D,IAAM,IAAW,IAAI,sBAChB,CAAC,OAAe;GACR,MACL,EAAS,CAAS,GACd,KAAQ,EAAU,kBAAgB,EAAS,UAAU,CAAM;EACnE,GACA;GAAE;GAAM;GAAY;EAAU,CAClC;EAGA,OADA,EAAS,QAAQ,CAAM,SACV,EAAS,WAAW;CACrC,GAAG;EAAC;EAAK;EAAM;EAAM;EAAY;CAAS,CAAC,GAEpC;AACX"}
1
+ {"version":3,"file":"use-intersection-observer.js","names":["useIntersectionObserver","entry","setEntry","useState","options","useEffect","target","ref","observer","nextEntry","once","root","rootMargin","threshold"],"sources":["../../src/hooks/use-intersection-observer.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { RefObject } from \"react\";\n\nexport interface UseIntersectionObserverOptions extends IntersectionObserverInit {\n /** Stop observing after the first intersection (one-shot). Default: false. */\n once?: boolean;\n}\n\n/**\n * Track whether the referenced element intersects the viewport. Useful for\n * lazy-loading images, \"load more\" sentinels, and animation triggers.\n *\n * @returns `IntersectionObserverEntry | null`. `null` until the first observation.\n */\nexport function useIntersectionObserver(\n ref: RefObject<Element | null>,\n options: UseIntersectionObserverOptions = {},\n): IntersectionObserverEntry | null {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const { once = false, root, rootMargin, threshold } = options;\n\n useEffect(() => {\n const target = ref.current;\n if (!target || typeof IntersectionObserver === \"undefined\") return;\n\n const observer = new IntersectionObserver(\n ([nextEntry]) => {\n if (!nextEntry) return;\n setEntry(nextEntry);\n if (once && nextEntry.isIntersecting) observer.unobserve(target);\n },\n { root, rootMargin, threshold },\n );\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [ref, once, root, rootMargin, threshold]);\n\n return entry;\n}\n"],"mappings":";;AAcA,SAAgBA,EACZ,GACA,IAA0C,CAAC,GACX;CAChC,IAAM,CAACC,GAAOC,KAAYC,EAA2C,IAAI,GACnE,EAAE,UAAO,IAAO,SAAM,eAAY,iBAAcC;CAmBtD,OAjBAC,QAAgB;EACZ,IAAMC,IAASC,EAAI;EACnB,IAAI,CAACD,KAAU,OAAO,uBAAyB,KAAa;EAE5D,IAAME,IAAW,IAAI,sBAChB,CAACC,OAAe;GACb,AAAKA,MACLP,EAASO,CAAS,GACdC,KAAQD,EAAU,kBAAgBD,EAAS,UAAUF,CAAM;EACnE,GACA;GAAE;GAAM;GAAY;EAAU,CAClC;EAGA,OADAE,EAAS,QAAQF,CAAM,SACVE,EAAS,WAAW;CACrC,GAAG;EAACD;EAAKG;EAAMC;EAAMC;EAAYC;CAAS,CAAC,GAEpCZ;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-interval.cjs","names":[],"sources":["../../src/hooks/use-interval.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\n\n/**\n * Reactive `setInterval`. Pass `null` as `delay` to pause. `fn` is stored in\n * a ref so inline callbacks don't reset the interval on every render.\n *\n * @example\n * useInterval(() => poll(), enabled ? 5000 : null);\n */\nexport function useInterval(fn: () => void, delay: number | null): void {\n const fnRef = useLatestRef(fn);\n\n useEffect(() => {\n if (delay === null) return;\n const id = setInterval(() => fnRef.current(), delay);\n return () => clearInterval(id);\n }, [delay, fnRef]);\n}\n"],"mappings":"+DAUA,SAAgB,EAAY,EAAgB,EAA4B,CACpE,IAAM,EAAQ,EAAA,aAAa,CAAE,GAE7B,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,IAAU,KAAM,OACpB,IAAM,EAAK,gBAAkB,EAAM,QAAQ,EAAG,CAAK,EACnD,UAAa,cAAc,CAAE,CACjC,EAAG,CAAC,EAAO,CAAK,CAAC,CACrB"}
1
+ {"version":3,"file":"use-interval.cjs","names":["useLatestRef","require_use_latest_ref","react","useInterval","fnRef","fn","delay","id"],"sources":["../../src/hooks/use-interval.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\n\n/**\n * Reactive `setInterval`. Pass `null` as `delay` to pause. `fn` is stored in\n * a ref so inline callbacks don't reset the interval on every render.\n *\n * @example\n * useInterval(() => poll(), enabled ? 5000 : null);\n */\nexport function useInterval(fn: () => void, delay: number | null): void {\n const fnRef = useLatestRef(fn);\n\n useEffect(() => {\n if (delay === null) return;\n const id = setInterval(() => fnRef.current(), delay);\n return () => clearInterval(id);\n }, [delay, fnRef]);\n}\n"],"mappings":"A,+DAUA,SAAgBG,EAAY,EAAgB,EAA4B,CACpE,IAAMC,EAAQJ,EAAAA,aAAaK,CAAE,GAE7B,EAAAH,EAAA,UAAA,KAAgB,CACZ,GAAII,IAAU,KAAM,OACpB,IAAMC,EAAK,gBAAkBH,EAAM,QAAQ,EAAGE,CAAK,EACnD,UAAa,cAAcC,CAAE,CACjC,EAAG,CAACD,EAAOF,CAAK,CAAC,CACrB,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-interval.js","names":[],"sources":["../../src/hooks/use-interval.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\n\n/**\n * Reactive `setInterval`. Pass `null` as `delay` to pause. `fn` is stored in\n * a ref so inline callbacks don't reset the interval on every render.\n *\n * @example\n * useInterval(() => poll(), enabled ? 5000 : null);\n */\nexport function useInterval(fn: () => void, delay: number | null): void {\n const fnRef = useLatestRef(fn);\n\n useEffect(() => {\n if (delay === null) return;\n const id = setInterval(() => fnRef.current(), delay);\n return () => clearInterval(id);\n }, [delay, fnRef]);\n}\n"],"mappings":";;;AAUA,SAAgB,EAAY,GAAgB,GAA4B;CACpE,IAAM,IAAQ,EAAa,CAAE;CAE7B,QAAgB;EACZ,IAAI,MAAU,MAAM;EACpB,IAAM,IAAK,kBAAkB,EAAM,QAAQ,GAAG,CAAK;EACnD,aAAa,cAAc,CAAE;CACjC,GAAG,CAAC,GAAO,CAAK,CAAC;AACrB"}
1
+ {"version":3,"file":"use-interval.js","names":["useInterval","fnRef","useLatestRef","fn","delay","id"],"sources":["../../src/hooks/use-interval.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\n\n/**\n * Reactive `setInterval`. Pass `null` as `delay` to pause. `fn` is stored in\n * a ref so inline callbacks don't reset the interval on every render.\n *\n * @example\n * useInterval(() => poll(), enabled ? 5000 : null);\n */\nexport function useInterval(fn: () => void, delay: number | null): void {\n const fnRef = useLatestRef(fn);\n\n useEffect(() => {\n if (delay === null) return;\n const id = setInterval(() => fnRef.current(), delay);\n return () => clearInterval(id);\n }, [delay, fnRef]);\n}\n"],"mappings":";;;AAUA,SAAgBA,EAAY,GAAgB,GAA4B;CACpE,IAAMC,IAAQC,EAAaC,CAAE;CAE7B,QAAgB;EACZ,IAAIC,MAAU,MAAM;EACpB,IAAMC,IAAK,kBAAkBJ,EAAM,QAAQ,GAAGG,CAAK;EACnD,aAAa,cAAcC,CAAE;CACjC,GAAG,CAACD,GAAOH,CAAK,CAAC;AACrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-is-first-render.cjs","names":[],"sources":["../../src/hooks/use-is-first-render.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- flipping the flag during render IS this hook */\nimport { useRef } from \"react\";\n\n/**\n * Return `true` on the first render of the component and `false` thereafter.\n *\n * Reads *and* flips a ref during render, which the React Compiler rules flag on\n * sight — here it is the entire hook. Under StrictMode's double render in dev the\n * second pass already sees `false`, so treat the result as \"first committed\n * render\" and not as a strict render counter.\n *\n * @returns Whether the current render is the first one.\n */\nexport function useIsFirstRender(): boolean {\n const isFirst = useRef<boolean>(true);\n if (isFirst.current) {\n isFirst.current = false;\n return true;\n }\n return false;\n}\n"],"mappings":"uBAaA,SAAgB,GAA4B,CACxC,IAAM,GAAA,EAAU,EAAA,OAAA,CAAgB,EAAI,EAKpC,OAJI,EAAQ,SACR,EAAQ,QAAU,GACX,IAEJ,EACX"}
1
+ {"version":3,"file":"use-is-first-render.cjs","names":["useRef","react","useIsFirstRender","isFirst"],"sources":["../../src/hooks/use-is-first-render.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- flipping the flag during render IS this hook */\nimport { useRef } from \"react\";\n\n/**\n * Return `true` on the first render of the component and `false` thereafter.\n *\n * Reads *and* flips a ref during render, which the React Compiler rules flag on\n * sight — here it is the entire hook. Under StrictMode's double render in dev the\n * second pass already sees `false`, so treat the result as \"first committed\n * render\" and not as a strict render counter.\n *\n * @returns Whether the current render is the first one.\n */\nexport function useIsFirstRender(): boolean {\n const isFirst = useRef<boolean>(true);\n if (isFirst.current) {\n isFirst.current = false;\n return true;\n }\n return false;\n}\n"],"mappings":"A,uBAaA,SAAgBE,GAA4B,CACxC,IAAMC,GAAA,EAAUH,EAAAA,OAAAA,CAAgB,EAAI,EAKpC,OAJIG,EAAQ,SACR,EAAQ,QAAU,GACX,IAEJ,EACX,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-is-first-render.js","names":[],"sources":["../../src/hooks/use-is-first-render.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- flipping the flag during render IS this hook */\nimport { useRef } from \"react\";\n\n/**\n * Return `true` on the first render of the component and `false` thereafter.\n *\n * Reads *and* flips a ref during render, which the React Compiler rules flag on\n * sight — here it is the entire hook. Under StrictMode's double render in dev the\n * second pass already sees `false`, so treat the result as \"first committed\n * render\" and not as a strict render counter.\n *\n * @returns Whether the current render is the first one.\n */\nexport function useIsFirstRender(): boolean {\n const isFirst = useRef<boolean>(true);\n if (isFirst.current) {\n isFirst.current = false;\n return true;\n }\n return false;\n}\n"],"mappings":";;AAaA,SAAgB,IAA4B;CACxC,IAAM,IAAU,EAAgB,EAAI;CAKpC,OAJI,EAAQ,WACR,EAAQ,UAAU,IACX,MAEJ;AACX"}
1
+ {"version":3,"file":"use-is-first-render.js","names":["useIsFirstRender","isFirst","useRef"],"sources":["../../src/hooks/use-is-first-render.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- flipping the flag during render IS this hook */\nimport { useRef } from \"react\";\n\n/**\n * Return `true` on the first render of the component and `false` thereafter.\n *\n * Reads *and* flips a ref during render, which the React Compiler rules flag on\n * sight — here it is the entire hook. Under StrictMode's double render in dev the\n * second pass already sees `false`, so treat the result as \"first committed\n * render\" and not as a strict render counter.\n *\n * @returns Whether the current render is the first one.\n */\nexport function useIsFirstRender(): boolean {\n const isFirst = useRef<boolean>(true);\n if (isFirst.current) {\n isFirst.current = false;\n return true;\n }\n return false;\n}\n"],"mappings":";;AAaA,SAAgBA,IAA4B;CACxC,IAAMC,IAAUC,EAAgB,EAAI;CAKpC,OAJID,EAAQ,WACR,EAAQ,UAAU,IACX,MAEJ;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-keyboard-shortcut.cjs","names":[],"sources":["../../src/hooks/use-keyboard-shortcut.ts"],"sourcesContent":["import { useEffect } from \"react\";\n\nexport interface KeyboardShortcut {\n /** Key name (`\"k\"`, `\"Enter\"`, `\"Escape\"`, `\"ArrowDown\"`, etc.). Case-insensitive. */\n key: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n alt?: boolean;\n /** Match either Ctrl or Cmd. Useful for cross-OS shortcuts. */\n mod?: boolean;\n}\n\nexport interface UseKeyboardShortcutOptions {\n /** Disable the shortcut without unmounting. Default: false. */\n disabled?: boolean;\n /** Listen to the entire window. Pass `false` to scope to a specific element via the handler. Default: true. */\n global?: boolean;\n /** Suppress the event from firing inside `<input>`/`<textarea>`/`[contenteditable]`. Default: true. */\n ignoreInput?: boolean;\n}\n\nfunction matches(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n if (event.key.toLowerCase() !== shortcut.key.toLowerCase()) return false;\n const ctrl = !!shortcut.ctrl;\n const meta = !!shortcut.meta;\n const shift = !!shortcut.shift;\n const alt = !!shortcut.alt;\n if (shortcut.mod) {\n if (!event.ctrlKey && !event.metaKey) return false;\n } else {\n if (event.ctrlKey !== ctrl) return false;\n if (event.metaKey !== meta) return false;\n }\n if (event.shiftKey !== shift) return false;\n if (event.altKey !== alt) return false;\n return true;\n}\n\nfunction isEditable(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return true;\n return target.isContentEditable;\n}\n\n/**\n * Bind a global keyboard shortcut. Supports modifier combinations and a\n * cross-OS `mod` key (Ctrl on Windows/Linux, Cmd on macOS).\n *\n * The effect depends on the individual `shortcut` fields rather than on the\n * object itself: callers pass an inline literal (`{ key: \"k\", mod: true }`),\n * which is a fresh reference on every render and would otherwise tear down and\n * re-add the listener each time. `exhaustive-deps` is silenced for that line\n * because the destructured fields are the complete dependency set.\n *\n * @example\n * useKeyboardShortcut({ key: \"k\", mod: true }, () => openSearch());\n */\nexport function useKeyboardShortcut(\n shortcut: KeyboardShortcut,\n handler: (event: KeyboardEvent) => void,\n options: UseKeyboardShortcutOptions = {},\n): void {\n const { disabled = false, ignoreInput = true } = options;\n\n useEffect(() => {\n if (disabled || typeof window === \"undefined\") return;\n const listener = (event: KeyboardEvent): void => {\n if (ignoreInput && isEditable(event.target)) return;\n if (matches(event, shortcut)) handler(event);\n };\n window.addEventListener(\"keydown\", listener);\n return () => window.removeEventListener(\"keydown\", listener);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disabled,\n ignoreInput,\n shortcut.key,\n shortcut.ctrl,\n shortcut.meta,\n shortcut.shift,\n shortcut.alt,\n shortcut.mod,\n handler,\n ]);\n}\n"],"mappings":"uBAsBA,SAAS,EAAQ,EAAsB,EAAqC,CACxE,GAAI,EAAM,IAAI,YAAY,IAAM,EAAS,IAAI,YAAY,EAAG,MAAO,GACnE,IAAM,EAAO,CAAC,CAAC,EAAS,KAClB,EAAO,CAAC,CAAC,EAAS,KAClB,EAAQ,CAAC,CAAC,EAAS,MACnB,EAAM,CAAC,CAAC,EAAS,IACvB,GAAI,EAAS,IACL,IAAA,CAAC,EAAM,SAAW,CAAC,EAAM,QAAS,MAAO,EAAA,MAG7C,GADI,EAAM,UAAY,GAClB,EAAM,UAAY,EAAM,MAAO,GAIvC,OAFI,EAAM,WAAa,GACnB,EAAM,SAAW,CAEzB,CAEA,SAAS,EAAW,EAAqC,CACrD,GAAI,EAAE,aAAkB,aAAc,MAAO,GAC7C,IAAM,EAAM,EAAO,QAAQ,YAAY,EAEvC,OADI,IAAQ,SAAW,IAAQ,YAAc,IAAQ,UAC9C,EAAO,iBAClB,CAeA,SAAgB,EACZ,EACA,EACA,EAAsC,CAAC,EACnC,CACJ,GAAM,CAAE,WAAW,GAAO,cAAc,IAAS,GAEjD,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,GAAY,OAAO,OAAW,IAAa,OAC/C,IAAM,EAAY,GAA+B,CACzC,GAAe,EAAW,EAAM,MAAM,GACtC,EAAQ,EAAO,CAAQ,GAAG,EAAQ,CAAK,CAC/C,EAEA,OADA,OAAO,iBAAiB,UAAW,CAAQ,MAC9B,OAAO,oBAAoB,UAAW,CAAQ,CAE/D,EAAG,CACC,EACA,EACA,EAAS,IACT,EAAS,KACT,EAAS,KACT,EAAS,MACT,EAAS,IACT,EAAS,IACT,CACJ,CAAC,CACL"}
1
+ {"version":3,"file":"use-keyboard-shortcut.cjs","names":["react","matches","event","shortcut","ctrl","meta","shift","alt","isEditable","target","tag","useKeyboardShortcut","options","disabled","listener","ignoreInput","handler"],"sources":["../../src/hooks/use-keyboard-shortcut.ts"],"sourcesContent":["import { useEffect } from \"react\";\n\nexport interface KeyboardShortcut {\n /** Key name (`\"k\"`, `\"Enter\"`, `\"Escape\"`, `\"ArrowDown\"`, etc.). Case-insensitive. */\n key: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n alt?: boolean;\n /** Match either Ctrl or Cmd. Useful for cross-OS shortcuts. */\n mod?: boolean;\n}\n\nexport interface UseKeyboardShortcutOptions {\n /** Disable the shortcut without unmounting. Default: false. */\n disabled?: boolean;\n /** Listen to the entire window. Pass `false` to scope to a specific element via the handler. Default: true. */\n global?: boolean;\n /** Suppress the event from firing inside `<input>`/`<textarea>`/`[contenteditable]`. Default: true. */\n ignoreInput?: boolean;\n}\n\nfunction matches(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n if (event.key.toLowerCase() !== shortcut.key.toLowerCase()) return false;\n const ctrl = !!shortcut.ctrl;\n const meta = !!shortcut.meta;\n const shift = !!shortcut.shift;\n const alt = !!shortcut.alt;\n if (shortcut.mod) {\n if (!event.ctrlKey && !event.metaKey) return false;\n } else {\n if (event.ctrlKey !== ctrl) return false;\n if (event.metaKey !== meta) return false;\n }\n if (event.shiftKey !== shift) return false;\n if (event.altKey !== alt) return false;\n return true;\n}\n\nfunction isEditable(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return true;\n return target.isContentEditable;\n}\n\n/**\n * Bind a global keyboard shortcut. Supports modifier combinations and a\n * cross-OS `mod` key (Ctrl on Windows/Linux, Cmd on macOS).\n *\n * The effect depends on the individual `shortcut` fields rather than on the\n * object itself: callers pass an inline literal (`{ key: \"k\", mod: true }`),\n * which is a fresh reference on every render and would otherwise tear down and\n * re-add the listener each time. `exhaustive-deps` is silenced for that line\n * because the destructured fields are the complete dependency set.\n *\n * @example\n * useKeyboardShortcut({ key: \"k\", mod: true }, () => openSearch());\n */\nexport function useKeyboardShortcut(\n shortcut: KeyboardShortcut,\n handler: (event: KeyboardEvent) => void,\n options: UseKeyboardShortcutOptions = {},\n): void {\n const { disabled = false, ignoreInput = true } = options;\n\n useEffect(() => {\n if (disabled || typeof window === \"undefined\") return;\n const listener = (event: KeyboardEvent): void => {\n if (ignoreInput && isEditable(event.target)) return;\n if (matches(event, shortcut)) handler(event);\n };\n window.addEventListener(\"keydown\", listener);\n return () => window.removeEventListener(\"keydown\", listener);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disabled,\n ignoreInput,\n shortcut.key,\n shortcut.ctrl,\n shortcut.meta,\n shortcut.shift,\n shortcut.alt,\n shortcut.mod,\n handler,\n ]);\n}\n"],"mappings":"A,uBAsBA,SAASC,EAAQ,EAAsB,EAAqC,CACxE,GAAIC,EAAM,IAAI,YAAY,IAAMC,EAAS,IAAI,YAAY,EAAG,MAAO,GACnE,IAAMC,EAAO,CAAC,CAACD,EAAS,KAClBE,EAAO,CAAC,CAACF,EAAS,KAClBG,EAAQ,CAAC,CAACH,EAAS,MACnBI,EAAM,CAAC,CAACJ,EAAS,IACvB,GAAIA,EAAS,IACL,IAAA,CAACD,EAAM,SAAW,CAACA,EAAM,QAAS,MAAO,EAAA,MAG7C,GADIA,EAAM,UAAYE,GAClBF,EAAM,UAAYG,EAAM,MAAO,GAIvC,OAFIH,EAAM,WAAaI,GACnBJ,EAAM,SAAWK,CAEzB,CAEA,SAASC,EAAW,EAAqC,CACrD,GAAI,EAAEC,aAAkB,aAAc,MAAO,GAC7C,IAAMC,EAAMD,EAAO,QAAQ,YAAY,EAEvC,OADIC,IAAQ,SAAWA,IAAQ,YAAcA,IAAQ,UAC9CD,EAAO,iBAClB,CAeA,SAAgBE,EACZ,EACA,EACA,EAAsC,CAAC,EACnC,CACJ,GAAM,CAAE,WAAW,GAAO,cAAc,IAASC,GAEjD,EAAAZ,EAAA,UAAA,KAAgB,CACZ,GAAIa,GAAY,OAAO,OAAW,IAAa,OAC/C,IAAMC,EAAY,GAA+B,CACzCC,GAAeP,EAAWN,EAAM,MAAM,GACtCD,EAAQC,EAAOC,CAAQ,GAAGa,EAAQd,CAAK,CAC/C,EAEA,OADA,OAAO,iBAAiB,UAAWY,CAAQ,MAC9B,OAAO,oBAAoB,UAAWA,CAAQ,CAE/D,EAAG,CACCD,EACAE,EACAZ,EAAS,IACTA,EAAS,KACTA,EAAS,KACTA,EAAS,MACTA,EAAS,IACTA,EAAS,IACTa,CACJ,CAAC,CACL,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-keyboard-shortcut.js","names":[],"sources":["../../src/hooks/use-keyboard-shortcut.ts"],"sourcesContent":["import { useEffect } from \"react\";\n\nexport interface KeyboardShortcut {\n /** Key name (`\"k\"`, `\"Enter\"`, `\"Escape\"`, `\"ArrowDown\"`, etc.). Case-insensitive. */\n key: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n alt?: boolean;\n /** Match either Ctrl or Cmd. Useful for cross-OS shortcuts. */\n mod?: boolean;\n}\n\nexport interface UseKeyboardShortcutOptions {\n /** Disable the shortcut without unmounting. Default: false. */\n disabled?: boolean;\n /** Listen to the entire window. Pass `false` to scope to a specific element via the handler. Default: true. */\n global?: boolean;\n /** Suppress the event from firing inside `<input>`/`<textarea>`/`[contenteditable]`. Default: true. */\n ignoreInput?: boolean;\n}\n\nfunction matches(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n if (event.key.toLowerCase() !== shortcut.key.toLowerCase()) return false;\n const ctrl = !!shortcut.ctrl;\n const meta = !!shortcut.meta;\n const shift = !!shortcut.shift;\n const alt = !!shortcut.alt;\n if (shortcut.mod) {\n if (!event.ctrlKey && !event.metaKey) return false;\n } else {\n if (event.ctrlKey !== ctrl) return false;\n if (event.metaKey !== meta) return false;\n }\n if (event.shiftKey !== shift) return false;\n if (event.altKey !== alt) return false;\n return true;\n}\n\nfunction isEditable(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return true;\n return target.isContentEditable;\n}\n\n/**\n * Bind a global keyboard shortcut. Supports modifier combinations and a\n * cross-OS `mod` key (Ctrl on Windows/Linux, Cmd on macOS).\n *\n * The effect depends on the individual `shortcut` fields rather than on the\n * object itself: callers pass an inline literal (`{ key: \"k\", mod: true }`),\n * which is a fresh reference on every render and would otherwise tear down and\n * re-add the listener each time. `exhaustive-deps` is silenced for that line\n * because the destructured fields are the complete dependency set.\n *\n * @example\n * useKeyboardShortcut({ key: \"k\", mod: true }, () => openSearch());\n */\nexport function useKeyboardShortcut(\n shortcut: KeyboardShortcut,\n handler: (event: KeyboardEvent) => void,\n options: UseKeyboardShortcutOptions = {},\n): void {\n const { disabled = false, ignoreInput = true } = options;\n\n useEffect(() => {\n if (disabled || typeof window === \"undefined\") return;\n const listener = (event: KeyboardEvent): void => {\n if (ignoreInput && isEditable(event.target)) return;\n if (matches(event, shortcut)) handler(event);\n };\n window.addEventListener(\"keydown\", listener);\n return () => window.removeEventListener(\"keydown\", listener);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disabled,\n ignoreInput,\n shortcut.key,\n shortcut.ctrl,\n shortcut.meta,\n shortcut.shift,\n shortcut.alt,\n shortcut.mod,\n handler,\n ]);\n}\n"],"mappings":";;AAsBA,SAAS,EAAQ,GAAsB,GAAqC;CACxE,IAAI,EAAM,IAAI,YAAY,MAAM,EAAS,IAAI,YAAY,GAAG,OAAO;CACnE,IAAM,IAAO,CAAC,CAAC,EAAS,MAClB,IAAO,CAAC,CAAC,EAAS,MAClB,IAAQ,CAAC,CAAC,EAAS,OACnB,IAAM,CAAC,CAAC,EAAS;CACvB,IAAI,EAAS,KACL;MAAA,CAAC,EAAM,WAAW,CAAC,EAAM,SAAS,OAAO;CAAA,OAG7C,IADI,EAAM,YAAY,KAClB,EAAM,YAAY,GAAM,OAAO;CAIvC,OAFI,EAAM,aAAa,KACnB,EAAM,WAAW;AAEzB;AAEA,SAAS,EAAW,GAAqC;CACrD,IAAI,EAAE,aAAkB,cAAc,OAAO;CAC7C,IAAM,IAAM,EAAO,QAAQ,YAAY;CAEvC,OADI,MAAQ,WAAW,MAAQ,cAAc,MAAQ,YAC9C,EAAO;AAClB;AAeA,SAAgB,EACZ,GACA,GACA,IAAsC,CAAC,GACnC;CACJ,IAAM,EAAE,cAAW,IAAO,iBAAc,OAAS;CAEjD,QAAgB;EACZ,IAAI,KAAY,OAAO,SAAW,KAAa;EAC/C,IAAM,KAAY,MAA+B;GACzC,KAAe,EAAW,EAAM,MAAM,KACtC,EAAQ,GAAO,CAAQ,KAAG,EAAQ,CAAK;EAC/C;EAEA,OADA,OAAO,iBAAiB,WAAW,CAAQ,SAC9B,OAAO,oBAAoB,WAAW,CAAQ;CAE/D,GAAG;EACC;EACA;EACA,EAAS;EACT,EAAS;EACT,EAAS;EACT,EAAS;EACT,EAAS;EACT,EAAS;EACT;CACJ,CAAC;AACL"}
1
+ {"version":3,"file":"use-keyboard-shortcut.js","names":["matches","event","shortcut","ctrl","meta","shift","alt","isEditable","target","tag","useKeyboardShortcut","options","disabled","listener","ignoreInput","handler"],"sources":["../../src/hooks/use-keyboard-shortcut.ts"],"sourcesContent":["import { useEffect } from \"react\";\n\nexport interface KeyboardShortcut {\n /** Key name (`\"k\"`, `\"Enter\"`, `\"Escape\"`, `\"ArrowDown\"`, etc.). Case-insensitive. */\n key: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n alt?: boolean;\n /** Match either Ctrl or Cmd. Useful for cross-OS shortcuts. */\n mod?: boolean;\n}\n\nexport interface UseKeyboardShortcutOptions {\n /** Disable the shortcut without unmounting. Default: false. */\n disabled?: boolean;\n /** Listen to the entire window. Pass `false` to scope to a specific element via the handler. Default: true. */\n global?: boolean;\n /** Suppress the event from firing inside `<input>`/`<textarea>`/`[contenteditable]`. Default: true. */\n ignoreInput?: boolean;\n}\n\nfunction matches(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n if (event.key.toLowerCase() !== shortcut.key.toLowerCase()) return false;\n const ctrl = !!shortcut.ctrl;\n const meta = !!shortcut.meta;\n const shift = !!shortcut.shift;\n const alt = !!shortcut.alt;\n if (shortcut.mod) {\n if (!event.ctrlKey && !event.metaKey) return false;\n } else {\n if (event.ctrlKey !== ctrl) return false;\n if (event.metaKey !== meta) return false;\n }\n if (event.shiftKey !== shift) return false;\n if (event.altKey !== alt) return false;\n return true;\n}\n\nfunction isEditable(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return true;\n return target.isContentEditable;\n}\n\n/**\n * Bind a global keyboard shortcut. Supports modifier combinations and a\n * cross-OS `mod` key (Ctrl on Windows/Linux, Cmd on macOS).\n *\n * The effect depends on the individual `shortcut` fields rather than on the\n * object itself: callers pass an inline literal (`{ key: \"k\", mod: true }`),\n * which is a fresh reference on every render and would otherwise tear down and\n * re-add the listener each time. `exhaustive-deps` is silenced for that line\n * because the destructured fields are the complete dependency set.\n *\n * @example\n * useKeyboardShortcut({ key: \"k\", mod: true }, () => openSearch());\n */\nexport function useKeyboardShortcut(\n shortcut: KeyboardShortcut,\n handler: (event: KeyboardEvent) => void,\n options: UseKeyboardShortcutOptions = {},\n): void {\n const { disabled = false, ignoreInput = true } = options;\n\n useEffect(() => {\n if (disabled || typeof window === \"undefined\") return;\n const listener = (event: KeyboardEvent): void => {\n if (ignoreInput && isEditable(event.target)) return;\n if (matches(event, shortcut)) handler(event);\n };\n window.addEventListener(\"keydown\", listener);\n return () => window.removeEventListener(\"keydown\", listener);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disabled,\n ignoreInput,\n shortcut.key,\n shortcut.ctrl,\n shortcut.meta,\n shortcut.shift,\n shortcut.alt,\n shortcut.mod,\n handler,\n ]);\n}\n"],"mappings":";;AAsBA,SAASA,EAAQ,GAAsB,GAAqC;CACxE,IAAIC,EAAM,IAAI,YAAY,MAAMC,EAAS,IAAI,YAAY,GAAG,OAAO;CACnE,IAAMC,IAAO,CAAC,CAACD,EAAS,MAClBE,IAAO,CAAC,CAACF,EAAS,MAClBG,IAAQ,CAAC,CAACH,EAAS,OACnBI,IAAM,CAAC,CAACJ,EAAS;CACvB,IAAIA,EAAS,KACL;MAAA,CAACD,EAAM,WAAW,CAACA,EAAM,SAAS,OAAO;CAAA,OAG7C,IADIA,EAAM,YAAYE,KAClBF,EAAM,YAAYG,GAAM,OAAO;CAIvC,OAFIH,EAAM,aAAaI,KACnBJ,EAAM,WAAWK;AAEzB;AAEA,SAASC,EAAW,GAAqC;CACrD,IAAI,EAAEC,aAAkB,cAAc,OAAO;CAC7C,IAAMC,IAAMD,EAAO,QAAQ,YAAY;CAEvC,OADIC,MAAQ,WAAWA,MAAQ,cAAcA,MAAQ,YAC9CD,EAAO;AAClB;AAeA,SAAgBE,EACZ,GACA,GACA,IAAsC,CAAC,GACnC;CACJ,IAAM,EAAE,cAAW,IAAO,iBAAc,OAASC;CAEjD,QAAgB;EACZ,IAAIC,KAAY,OAAO,SAAW,KAAa;EAC/C,IAAMC,KAAY,MAA+B;GAC7C,AAAIC,KAAeP,EAAWN,EAAM,MAAM,KACtCD,EAAQC,GAAOC,CAAQ,KAAGa,EAAQd,CAAK;EAC/C;EAEA,OADA,OAAO,iBAAiB,WAAWY,CAAQ,SAC9B,OAAO,oBAAoB,WAAWA,CAAQ;CAE/D,GAAG;EACCD;EACAE;EACAZ,EAAS;EACTA,EAAS;EACTA,EAAS;EACTA,EAAS;EACTA,EAAS;EACTA,EAAS;EACTa;CACJ,CAAC;AACL"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-latest-ref.cjs","names":[],"sources":["../../src/hooks/use-latest-ref.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- writing at render time is deliberate; an effect would add a staleness window (see the docstring) */\nimport { useRef, type RefObject } from \"react\";\n\n/**\n * Keeps a ref pointing at the most recent value it was given.\n *\n * The escape hatch for reading fresh state inside something that must not be\n * re-created when that state changes: an interval, a subscription, an event\n * listener registered once on mount. Listing the value in the effect's\n * dependencies would tear the effect down and set it back up on every change;\n * omitting it captures the value from the render that created the closure and\n * never sees another. The ref is neither — a stable object whose `current` is\n * always current.\n *\n * The assignment happens **during render**, for the same reason\n * {@link useStableCallback} does it: moving it into an effect opens a\n * one-commit staleness window, where an effect declared earlier in the same\n * commit reads the previous render's value.\n *\n * Reach for {@link useStableCallback} instead when the value is a function you\n * want to *call* — it hands back a callable with a stable identity, rather than\n * making every call site reach through `.current`.\n *\n * **List the returned ref in your effect's dependencies.** It is a stable object,\n * so the effect never re-runs because of it, but `react-hooks/exhaustive-deps`\n * cannot prove that for a custom hook the way it does for a bare `useRef`.\n * Listing it lets the rule verify the array instead of taking an omission on\n * trust.\n *\n * **Not for holding the previous value.** The write happens during render, so\n * `.current` is already the current value by the time any effect reads it. A hook\n * that wants the value from the *previous* commit — `usePrevious` — needs the\n * effect-based write, and swapping it for this would make it return the present.\n *\n * @typeParam T - The tracked value.\n * @param value - The value to track. Written on every render.\n * @returns A stable ref whose `current` holds the latest `value`.\n *\n * @example\n * const optionsRef = useLatestRef(options);\n *\n * useEffect(() => {\n * const id = setInterval(() => poll(optionsRef.current), 5_000);\n * return () => clearInterval(id);\n * }, []); // the interval survives every options change, and still reads the latest\n */\nexport function useLatestRef<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n"],"mappings":"uBA8CA,SAAgB,EAAgB,EAAwB,CACpD,IAAM,GAAA,EAAM,EAAA,OAAA,CAAO,CAAK,EAExB,MADA,GAAI,QAAU,EACP,CACX"}
1
+ {"version":3,"file":"use-latest-ref.cjs","names":["useRef","react","useLatestRef","ref","value"],"sources":["../../src/hooks/use-latest-ref.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- writing at render time is deliberate; an effect would add a staleness window (see the docstring) */\nimport { useRef, type RefObject } from \"react\";\n\n/**\n * Keeps a ref pointing at the most recent value it was given.\n *\n * The escape hatch for reading fresh state inside something that must not be\n * re-created when that state changes: an interval, a subscription, an event\n * listener registered once on mount. Listing the value in the effect's\n * dependencies would tear the effect down and set it back up on every change;\n * omitting it captures the value from the render that created the closure and\n * never sees another. The ref is neither — a stable object whose `current` is\n * always current.\n *\n * The assignment happens **during render**, for the same reason\n * {@link useStableCallback} does it: moving it into an effect opens a\n * one-commit staleness window, where an effect declared earlier in the same\n * commit reads the previous render's value.\n *\n * Reach for {@link useStableCallback} instead when the value is a function you\n * want to *call* — it hands back a callable with a stable identity, rather than\n * making every call site reach through `.current`.\n *\n * **List the returned ref in your effect's dependencies.** It is a stable object,\n * so the effect never re-runs because of it, but `react-hooks/exhaustive-deps`\n * cannot prove that for a custom hook the way it does for a bare `useRef`.\n * Listing it lets the rule verify the array instead of taking an omission on\n * trust.\n *\n * **Not for holding the previous value.** The write happens during render, so\n * `.current` is already the current value by the time any effect reads it. A hook\n * that wants the value from the *previous* commit — `usePrevious` — needs the\n * effect-based write, and swapping it for this would make it return the present.\n *\n * @typeParam T - The tracked value.\n * @param value - The value to track. Written on every render.\n * @returns A stable ref whose `current` holds the latest `value`.\n *\n * @example\n * const optionsRef = useLatestRef(options);\n *\n * useEffect(() => {\n * const id = setInterval(() => poll(optionsRef.current), 5_000);\n * return () => clearInterval(id);\n * }, []); // the interval survives every options change, and still reads the latest\n */\nexport function useLatestRef<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n"],"mappings":"A,uBA8CA,SAAgBE,EAAgB,EAAwB,CACpD,IAAMC,GAAA,EAAMH,EAAAA,OAAAA,CAAOI,CAAK,EAExB,MADA,GAAI,QAAUA,EACPD,CACX,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-latest-ref.js","names":[],"sources":["../../src/hooks/use-latest-ref.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- writing at render time is deliberate; an effect would add a staleness window (see the docstring) */\nimport { useRef, type RefObject } from \"react\";\n\n/**\n * Keeps a ref pointing at the most recent value it was given.\n *\n * The escape hatch for reading fresh state inside something that must not be\n * re-created when that state changes: an interval, a subscription, an event\n * listener registered once on mount. Listing the value in the effect's\n * dependencies would tear the effect down and set it back up on every change;\n * omitting it captures the value from the render that created the closure and\n * never sees another. The ref is neither — a stable object whose `current` is\n * always current.\n *\n * The assignment happens **during render**, for the same reason\n * {@link useStableCallback} does it: moving it into an effect opens a\n * one-commit staleness window, where an effect declared earlier in the same\n * commit reads the previous render's value.\n *\n * Reach for {@link useStableCallback} instead when the value is a function you\n * want to *call* — it hands back a callable with a stable identity, rather than\n * making every call site reach through `.current`.\n *\n * **List the returned ref in your effect's dependencies.** It is a stable object,\n * so the effect never re-runs because of it, but `react-hooks/exhaustive-deps`\n * cannot prove that for a custom hook the way it does for a bare `useRef`.\n * Listing it lets the rule verify the array instead of taking an omission on\n * trust.\n *\n * **Not for holding the previous value.** The write happens during render, so\n * `.current` is already the current value by the time any effect reads it. A hook\n * that wants the value from the *previous* commit — `usePrevious` — needs the\n * effect-based write, and swapping it for this would make it return the present.\n *\n * @typeParam T - The tracked value.\n * @param value - The value to track. Written on every render.\n * @returns A stable ref whose `current` holds the latest `value`.\n *\n * @example\n * const optionsRef = useLatestRef(options);\n *\n * useEffect(() => {\n * const id = setInterval(() => poll(optionsRef.current), 5_000);\n * return () => clearInterval(id);\n * }, []); // the interval survives every options change, and still reads the latest\n */\nexport function useLatestRef<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n"],"mappings":";;AA8CA,SAAgB,EAAgB,GAAwB;CACpD,IAAM,IAAM,EAAO,CAAK;CAExB,OADA,EAAI,UAAU,GACP;AACX"}
1
+ {"version":3,"file":"use-latest-ref.js","names":["useLatestRef","ref","useRef","value"],"sources":["../../src/hooks/use-latest-ref.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- writing at render time is deliberate; an effect would add a staleness window (see the docstring) */\nimport { useRef, type RefObject } from \"react\";\n\n/**\n * Keeps a ref pointing at the most recent value it was given.\n *\n * The escape hatch for reading fresh state inside something that must not be\n * re-created when that state changes: an interval, a subscription, an event\n * listener registered once on mount. Listing the value in the effect's\n * dependencies would tear the effect down and set it back up on every change;\n * omitting it captures the value from the render that created the closure and\n * never sees another. The ref is neither — a stable object whose `current` is\n * always current.\n *\n * The assignment happens **during render**, for the same reason\n * {@link useStableCallback} does it: moving it into an effect opens a\n * one-commit staleness window, where an effect declared earlier in the same\n * commit reads the previous render's value.\n *\n * Reach for {@link useStableCallback} instead when the value is a function you\n * want to *call* — it hands back a callable with a stable identity, rather than\n * making every call site reach through `.current`.\n *\n * **List the returned ref in your effect's dependencies.** It is a stable object,\n * so the effect never re-runs because of it, but `react-hooks/exhaustive-deps`\n * cannot prove that for a custom hook the way it does for a bare `useRef`.\n * Listing it lets the rule verify the array instead of taking an omission on\n * trust.\n *\n * **Not for holding the previous value.** The write happens during render, so\n * `.current` is already the current value by the time any effect reads it. A hook\n * that wants the value from the *previous* commit — `usePrevious` — needs the\n * effect-based write, and swapping it for this would make it return the present.\n *\n * @typeParam T - The tracked value.\n * @param value - The value to track. Written on every render.\n * @returns A stable ref whose `current` holds the latest `value`.\n *\n * @example\n * const optionsRef = useLatestRef(options);\n *\n * useEffect(() => {\n * const id = setInterval(() => poll(optionsRef.current), 5_000);\n * return () => clearInterval(id);\n * }, []); // the interval survives every options change, and still reads the latest\n */\nexport function useLatestRef<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n"],"mappings":";;AA8CA,SAAgBA,EAAgB,GAAwB;CACpD,IAAMC,IAAMC,EAAOC,CAAK;CAExB,OADA,EAAI,UAAUA,GACPF;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-list-state.cjs","names":[],"sources":["../../src/hooks/use-list-state.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface ReorderPayload {\n from: number;\n to: number;\n}\n\nexport interface ListStateHandlers<T> {\n append: (...items: T[]) => void;\n prepend: (...items: T[]) => void;\n insert: (index: number, ...items: T[]) => void;\n remove: (...indices: number[]) => void;\n reorder: (payload: ReorderPayload) => void;\n setItem: (index: number, item: T) => void;\n setState: (items: T[]) => void;\n apply: (fn: (item: T, index: number) => T) => void;\n clear: () => void;\n}\n\n/**\n * Manage an array as state with a rich set of immutable handlers.\n *\n * @typeParam T - element type.\n * @param initial - initial list (default `[]`).\n * @returns Tuple `[list, handlers]`.\n */\nexport function useListState<T>(initial: T[] = []): [T[], ListStateHandlers<T>] {\n const [list, setList] = useState<T[]>(initial);\n\n const append = useCallback((...items: T[]): void => {\n setList((current) => [...current, ...items]);\n }, []);\n\n const prepend = useCallback((...items: T[]): void => {\n setList((current) => [...items, ...current]);\n }, []);\n\n const insert = useCallback((index: number, ...items: T[]): void => {\n setList((current) => [...current.slice(0, index), ...items, ...current.slice(index)]);\n }, []);\n\n const remove = useCallback((...indices: number[]): void => {\n const drop = new Set(indices);\n setList((current) => current.filter((_, index) => !drop.has(index)));\n }, []);\n\n const reorder = useCallback(({ from, to }: ReorderPayload): void => {\n setList((current) => {\n const next = [...current];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n });\n }, []);\n\n const setItem = useCallback((index: number, item: T): void => {\n setList((current) => current.map((value, i) => (i === index ? item : value)));\n }, []);\n\n const setState = useCallback((items: T[]): void => setList(items), []);\n\n const apply = useCallback((fn: (item: T, index: number) => T): void => {\n setList((current) => current.map(fn));\n }, []);\n\n const clear = useCallback((): void => setList([]), []);\n\n const handlers = useMemo<ListStateHandlers<T>>(\n () => ({\n append,\n prepend,\n insert,\n remove,\n reorder,\n setItem,\n setState,\n apply,\n clear,\n }),\n [append, prepend, insert, remove, reorder, setItem, setState, apply, clear],\n );\n\n return [list, handlers];\n}\n"],"mappings":"uBA0BA,SAAgB,EAAgB,EAAe,CAAC,EAAgC,CAC5E,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAc,CAAO,EAEvC,GAAA,EAAS,EAAA,YAAA,EAAa,GAAG,IAAqB,CAChD,EAAS,GAAY,CAAC,GAAG,EAAS,GAAG,CAAK,CAAC,CAC/C,EAAG,CAAC,CAAC,EAEC,GAAA,EAAU,EAAA,YAAA,EAAa,GAAG,IAAqB,CACjD,EAAS,GAAY,CAAC,GAAG,EAAO,GAAG,CAAO,CAAC,CAC/C,EAAG,CAAC,CAAC,EAEC,GAAA,EAAS,EAAA,YAAA,EAAa,EAAe,GAAG,IAAqB,CAC/D,EAAS,GAAY,CAAC,GAAG,EAAQ,MAAM,EAAG,CAAK,EAAG,GAAG,EAAO,GAAG,EAAQ,MAAM,CAAK,CAAC,CAAC,CACxF,EAAG,CAAC,CAAC,EAEC,GAAA,EAAS,EAAA,YAAA,EAAa,GAAG,IAA4B,CACvD,IAAM,EAAO,IAAI,IAAI,CAAO,EAC5B,EAAS,GAAY,EAAQ,QAAQ,EAAG,IAAU,CAAC,EAAK,IAAI,CAAK,CAAC,CAAC,CACvE,EAAG,CAAC,CAAC,EAEC,GAAA,EAAU,EAAA,YAAA,EAAa,CAAE,OAAM,QAA+B,CAChE,EAAS,GAAY,CACjB,IAAM,EAAO,CAAC,GAAG,CAAO,EAClB,CAAC,GAAS,EAAK,OAAO,EAAM,CAAC,EAEnC,OADA,EAAK,OAAO,EAAI,EAAG,CAAK,EACjB,CACX,CAAC,CACL,EAAG,CAAC,CAAC,EAEC,GAAA,EAAU,EAAA,YAAA,EAAa,EAAe,IAAkB,CAC1D,EAAS,GAAY,EAAQ,KAAK,EAAO,IAAO,IAAM,EAAQ,EAAO,CAAM,CAAC,CAChF,EAAG,CAAC,CAAC,EAEC,GAAA,EAAW,EAAA,YAAA,CAAa,GAAqB,EAAQ,CAAK,EAAG,CAAC,CAAC,EAE/D,GAAA,EAAQ,EAAA,YAAA,CAAa,GAA4C,CACnE,EAAS,GAAY,EAAQ,IAAI,CAAE,CAAC,CACxC,EAAG,CAAC,CAAC,EAEC,GAAA,EAAQ,EAAA,YAAA,KAAwB,EAAQ,CAAC,CAAC,EAAG,CAAC,CAAC,EAiBrD,MAAO,CAAC,GAAA,EAfS,EAAA,QAAA,MACN,CACH,SACA,UACA,SACA,SACA,UACA,UACA,WACA,QACA,OACJ,GACA,CAAC,EAAQ,EAAS,EAAQ,EAAQ,EAAS,EAAS,EAAU,EAAO,CAAK,CAGhE,CAAQ,CAC1B"}
1
+ {"version":3,"file":"use-list-state.cjs","names":["useState","useCallback","useMemo","react","useListState","list","setList","initial","append","items","current","prepend","insert","index","remove","indices","drop","reorder","next","moved","from","to","setItem","i","item","value","setState","apply","fn","clear"],"sources":["../../src/hooks/use-list-state.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface ReorderPayload {\n from: number;\n to: number;\n}\n\nexport interface ListStateHandlers<T> {\n append: (...items: T[]) => void;\n prepend: (...items: T[]) => void;\n insert: (index: number, ...items: T[]) => void;\n remove: (...indices: number[]) => void;\n reorder: (payload: ReorderPayload) => void;\n setItem: (index: number, item: T) => void;\n setState: (items: T[]) => void;\n apply: (fn: (item: T, index: number) => T) => void;\n clear: () => void;\n}\n\n/**\n * Manage an array as state with a rich set of immutable handlers.\n *\n * @typeParam T - element type.\n * @param initial - initial list (default `[]`).\n * @returns Tuple `[list, handlers]`.\n */\nexport function useListState<T>(initial: T[] = []): [T[], ListStateHandlers<T>] {\n const [list, setList] = useState<T[]>(initial);\n\n const append = useCallback((...items: T[]): void => {\n setList((current) => [...current, ...items]);\n }, []);\n\n const prepend = useCallback((...items: T[]): void => {\n setList((current) => [...items, ...current]);\n }, []);\n\n const insert = useCallback((index: number, ...items: T[]): void => {\n setList((current) => [...current.slice(0, index), ...items, ...current.slice(index)]);\n }, []);\n\n const remove = useCallback((...indices: number[]): void => {\n const drop = new Set(indices);\n setList((current) => current.filter((_, index) => !drop.has(index)));\n }, []);\n\n const reorder = useCallback(({ from, to }: ReorderPayload): void => {\n setList((current) => {\n const next = [...current];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n });\n }, []);\n\n const setItem = useCallback((index: number, item: T): void => {\n setList((current) => current.map((value, i) => (i === index ? item : value)));\n }, []);\n\n const setState = useCallback((items: T[]): void => setList(items), []);\n\n const apply = useCallback((fn: (item: T, index: number) => T): void => {\n setList((current) => current.map(fn));\n }, []);\n\n const clear = useCallback((): void => setList([]), []);\n\n const handlers = useMemo<ListStateHandlers<T>>(\n () => ({\n append,\n prepend,\n insert,\n remove,\n reorder,\n setItem,\n setState,\n apply,\n clear,\n }),\n [append, prepend, insert, remove, reorder, setItem, setState, apply, clear],\n );\n\n return [list, handlers];\n}\n"],"mappings":"A,uBA0BA,SAAgBI,EAAgB,EAAe,CAAC,EAAgC,CAC5E,GAAM,CAACC,EAAMC,IAAA,EAAWN,EAAAA,SAAAA,CAAcO,CAAO,EAEvCC,GAAA,EAASP,EAAAA,YAAAA,EAAa,GAAGQ,IAAqB,CAChDH,EAAS,GAAY,CAAC,GAAGI,EAAS,GAAGD,CAAK,CAAC,CAC/C,EAAG,CAAC,CAAC,EAECE,GAAA,EAAUV,EAAAA,YAAAA,EAAa,GAAGQ,IAAqB,CACjDH,EAAS,GAAY,CAAC,GAAGG,EAAO,GAAGC,CAAO,CAAC,CAC/C,EAAG,CAAC,CAAC,EAECE,GAAA,EAASX,EAAAA,YAAAA,EAAa,EAAe,GAAGQ,IAAqB,CAC/DH,EAAS,GAAY,CAAC,GAAGI,EAAQ,MAAM,EAAGG,CAAK,EAAG,GAAGJ,EAAO,GAAGC,EAAQ,MAAMG,CAAK,CAAC,CAAC,CACxF,EAAG,CAAC,CAAC,EAECC,GAAA,EAASb,EAAAA,YAAAA,EAAa,GAAGc,IAA4B,CACvD,IAAMC,EAAO,IAAI,IAAID,CAAO,EAC5BT,EAAS,GAAYI,EAAQ,QAAQ,EAAG,IAAU,CAACM,EAAK,IAAIH,CAAK,CAAC,CAAC,CACvE,EAAG,CAAC,CAAC,EAECI,GAAA,EAAUhB,EAAAA,YAAAA,EAAa,CAAE,OAAM,QAA+B,CAChEK,EAAS,GAAY,CACjB,IAAMY,EAAO,CAAC,GAAGR,CAAO,EAClB,CAACS,GAASD,EAAK,OAAOE,EAAM,CAAC,EAEnC,OADAF,EAAK,OAAOG,EAAI,EAAGF,CAAK,EACjBD,CACX,CAAC,CACL,EAAG,CAAC,CAAC,EAECI,GAAA,EAAUrB,EAAAA,YAAAA,EAAa,EAAe,IAAkB,CAC1DK,EAAS,GAAYI,EAAQ,KAAK,EAAO,IAAOa,IAAMV,EAAQW,EAAOC,CAAM,CAAC,CAChF,EAAG,CAAC,CAAC,EAECC,GAAA,EAAWzB,EAAAA,YAAAA,CAAa,GAAqBK,EAAQG,CAAK,EAAG,CAAC,CAAC,EAE/DkB,GAAA,EAAQ1B,EAAAA,YAAAA,CAAa,GAA4C,CACnEK,EAAS,GAAYI,EAAQ,IAAIkB,CAAE,CAAC,CACxC,EAAG,CAAC,CAAC,EAECC,GAAA,EAAQ5B,EAAAA,YAAAA,KAAwBK,EAAQ,CAAC,CAAC,EAAG,CAAC,CAAC,EAiBrD,MAAO,CAACD,GAAA,EAfSH,EAAAA,QAAAA,MACN,CACH,SACA,UACA,SACA,SACA,UACA,UACA,WACA,QACA,OACJ,GACA,CAACM,EAAQG,EAASC,EAAQE,EAAQG,EAASK,EAASI,EAAUC,EAAOE,CAAK,CAGhE,CAAQ,CAC1B,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-list-state.js","names":[],"sources":["../../src/hooks/use-list-state.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface ReorderPayload {\n from: number;\n to: number;\n}\n\nexport interface ListStateHandlers<T> {\n append: (...items: T[]) => void;\n prepend: (...items: T[]) => void;\n insert: (index: number, ...items: T[]) => void;\n remove: (...indices: number[]) => void;\n reorder: (payload: ReorderPayload) => void;\n setItem: (index: number, item: T) => void;\n setState: (items: T[]) => void;\n apply: (fn: (item: T, index: number) => T) => void;\n clear: () => void;\n}\n\n/**\n * Manage an array as state with a rich set of immutable handlers.\n *\n * @typeParam T - element type.\n * @param initial - initial list (default `[]`).\n * @returns Tuple `[list, handlers]`.\n */\nexport function useListState<T>(initial: T[] = []): [T[], ListStateHandlers<T>] {\n const [list, setList] = useState<T[]>(initial);\n\n const append = useCallback((...items: T[]): void => {\n setList((current) => [...current, ...items]);\n }, []);\n\n const prepend = useCallback((...items: T[]): void => {\n setList((current) => [...items, ...current]);\n }, []);\n\n const insert = useCallback((index: number, ...items: T[]): void => {\n setList((current) => [...current.slice(0, index), ...items, ...current.slice(index)]);\n }, []);\n\n const remove = useCallback((...indices: number[]): void => {\n const drop = new Set(indices);\n setList((current) => current.filter((_, index) => !drop.has(index)));\n }, []);\n\n const reorder = useCallback(({ from, to }: ReorderPayload): void => {\n setList((current) => {\n const next = [...current];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n });\n }, []);\n\n const setItem = useCallback((index: number, item: T): void => {\n setList((current) => current.map((value, i) => (i === index ? item : value)));\n }, []);\n\n const setState = useCallback((items: T[]): void => setList(items), []);\n\n const apply = useCallback((fn: (item: T, index: number) => T): void => {\n setList((current) => current.map(fn));\n }, []);\n\n const clear = useCallback((): void => setList([]), []);\n\n const handlers = useMemo<ListStateHandlers<T>>(\n () => ({\n append,\n prepend,\n insert,\n remove,\n reorder,\n setItem,\n setState,\n apply,\n clear,\n }),\n [append, prepend, insert, remove, reorder, setItem, setState, apply, clear],\n );\n\n return [list, handlers];\n}\n"],"mappings":";;AA0BA,SAAgB,EAAgB,IAAe,CAAC,GAAgC;CAC5E,IAAM,CAAC,GAAM,KAAW,EAAc,CAAO,GAEvC,IAAS,GAAa,GAAG,MAAqB;EAChD,GAAS,MAAY,CAAC,GAAG,GAAS,GAAG,CAAK,CAAC;CAC/C,GAAG,CAAC,CAAC,GAEC,IAAU,GAAa,GAAG,MAAqB;EACjD,GAAS,MAAY,CAAC,GAAG,GAAO,GAAG,CAAO,CAAC;CAC/C,GAAG,CAAC,CAAC,GAEC,IAAS,GAAa,GAAe,GAAG,MAAqB;EAC/D,GAAS,MAAY;GAAC,GAAG,EAAQ,MAAM,GAAG,CAAK;GAAG,GAAG;GAAO,GAAG,EAAQ,MAAM,CAAK;EAAC,CAAC;CACxF,GAAG,CAAC,CAAC,GAEC,IAAS,GAAa,GAAG,MAA4B;EACvD,IAAM,IAAO,IAAI,IAAI,CAAO;EAC5B,GAAS,MAAY,EAAQ,QAAQ,GAAG,MAAU,CAAC,EAAK,IAAI,CAAK,CAAC,CAAC;CACvE,GAAG,CAAC,CAAC,GAEC,IAAU,GAAa,EAAE,SAAM,YAA+B;EAChE,GAAS,MAAY;GACjB,IAAM,IAAO,CAAC,GAAG,CAAO,GAClB,CAAC,KAAS,EAAK,OAAO,GAAM,CAAC;GAEnC,OADA,EAAK,OAAO,GAAI,GAAG,CAAK,GACjB;EACX,CAAC;CACL,GAAG,CAAC,CAAC,GAEC,IAAU,GAAa,GAAe,MAAkB;EAC1D,GAAS,MAAY,EAAQ,KAAK,GAAO,MAAO,MAAM,IAAQ,IAAO,CAAM,CAAC;CAChF,GAAG,CAAC,CAAC,GAEC,IAAW,GAAa,MAAqB,EAAQ,CAAK,GAAG,CAAC,CAAC,GAE/D,IAAQ,GAAa,MAA4C;EACnE,GAAS,MAAY,EAAQ,IAAI,CAAE,CAAC;CACxC,GAAG,CAAC,CAAC,GAEC,IAAQ,QAAwB,EAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;CAiBrD,OAAO,CAAC,GAfS,SACN;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,IACA;EAAC;EAAQ;EAAS;EAAQ;EAAQ;EAAS;EAAS;EAAU;EAAO;CAAK,CAGhE,CAAQ;AAC1B"}
1
+ {"version":3,"file":"use-list-state.js","names":["useListState","list","setList","useState","initial","append","useCallback","items","current","prepend","insert","index","remove","indices","drop","reorder","next","moved","from","to","setItem","i","item","value","setState","apply","fn","clear","useMemo"],"sources":["../../src/hooks/use-list-state.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface ReorderPayload {\n from: number;\n to: number;\n}\n\nexport interface ListStateHandlers<T> {\n append: (...items: T[]) => void;\n prepend: (...items: T[]) => void;\n insert: (index: number, ...items: T[]) => void;\n remove: (...indices: number[]) => void;\n reorder: (payload: ReorderPayload) => void;\n setItem: (index: number, item: T) => void;\n setState: (items: T[]) => void;\n apply: (fn: (item: T, index: number) => T) => void;\n clear: () => void;\n}\n\n/**\n * Manage an array as state with a rich set of immutable handlers.\n *\n * @typeParam T - element type.\n * @param initial - initial list (default `[]`).\n * @returns Tuple `[list, handlers]`.\n */\nexport function useListState<T>(initial: T[] = []): [T[], ListStateHandlers<T>] {\n const [list, setList] = useState<T[]>(initial);\n\n const append = useCallback((...items: T[]): void => {\n setList((current) => [...current, ...items]);\n }, []);\n\n const prepend = useCallback((...items: T[]): void => {\n setList((current) => [...items, ...current]);\n }, []);\n\n const insert = useCallback((index: number, ...items: T[]): void => {\n setList((current) => [...current.slice(0, index), ...items, ...current.slice(index)]);\n }, []);\n\n const remove = useCallback((...indices: number[]): void => {\n const drop = new Set(indices);\n setList((current) => current.filter((_, index) => !drop.has(index)));\n }, []);\n\n const reorder = useCallback(({ from, to }: ReorderPayload): void => {\n setList((current) => {\n const next = [...current];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n });\n }, []);\n\n const setItem = useCallback((index: number, item: T): void => {\n setList((current) => current.map((value, i) => (i === index ? item : value)));\n }, []);\n\n const setState = useCallback((items: T[]): void => setList(items), []);\n\n const apply = useCallback((fn: (item: T, index: number) => T): void => {\n setList((current) => current.map(fn));\n }, []);\n\n const clear = useCallback((): void => setList([]), []);\n\n const handlers = useMemo<ListStateHandlers<T>>(\n () => ({\n append,\n prepend,\n insert,\n remove,\n reorder,\n setItem,\n setState,\n apply,\n clear,\n }),\n [append, prepend, insert, remove, reorder, setItem, setState, apply, clear],\n );\n\n return [list, handlers];\n}\n"],"mappings":";;AA0BA,SAAgBA,EAAgB,IAAe,CAAC,GAAgC;CAC5E,IAAM,CAACC,GAAMC,KAAWC,EAAcC,CAAO,GAEvCC,IAASC,GAAa,GAAGC,MAAqB;EAChD,GAAS,MAAY,CAAC,GAAGC,GAAS,GAAGD,CAAK,CAAC;CAC/C,GAAG,CAAC,CAAC,GAECE,IAAUH,GAAa,GAAGC,MAAqB;EACjD,GAAS,MAAY,CAAC,GAAGA,GAAO,GAAGC,CAAO,CAAC;CAC/C,GAAG,CAAC,CAAC,GAECE,IAASJ,GAAa,GAAe,GAAGC,MAAqB;EAC/D,GAAS,MAAY;GAAC,GAAGC,EAAQ,MAAM,GAAGG,CAAK;GAAG,GAAGJ;GAAO,GAAGC,EAAQ,MAAMG,CAAK;EAAC,CAAC;CACxF,GAAG,CAAC,CAAC,GAECC,IAASN,GAAa,GAAGO,MAA4B;EACvD,IAAMC,IAAO,IAAI,IAAID,CAAO;EAC5B,GAAS,MAAYL,EAAQ,QAAQ,GAAG,MAAU,CAACM,EAAK,IAAIH,CAAK,CAAC,CAAC;CACvE,GAAG,CAAC,CAAC,GAECI,IAAUT,GAAa,EAAE,SAAM,YAA+B;EAChE,GAAS,MAAY;GACjB,IAAMU,IAAO,CAAC,GAAGR,CAAO,GAClB,CAACS,KAASD,EAAK,OAAOE,GAAM,CAAC;GAEnC,OADAF,EAAK,OAAOG,GAAI,GAAGF,CAAK,GACjBD;EACX,CAAC;CACL,GAAG,CAAC,CAAC,GAECI,IAAUd,GAAa,GAAe,MAAkB;EAC1D,GAAS,MAAYE,EAAQ,KAAK,GAAO,MAAOa,MAAMV,IAAQW,IAAOC,CAAM,CAAC;CAChF,GAAG,CAAC,CAAC,GAECC,IAAWlB,GAAa,MAAqBJ,EAAQK,CAAK,GAAG,CAAC,CAAC,GAE/DkB,IAAQnB,GAAa,MAA4C;EACnE,GAAS,MAAYE,EAAQ,IAAIkB,CAAE,CAAC;CACxC,GAAG,CAAC,CAAC,GAECC,IAAQrB,QAAwBJ,EAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;CAiBrD,OAAO,CAACD,GAfS2B,SACN;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,IACA;EAACvB;EAAQI;EAASC;EAAQE;EAAQG;EAASK;EAASI;EAAUC;EAAOE;CAAK,CAGhE,CAAQ;AAC1B"}
@@ -1,2 +1,2 @@
1
- let e=require("react");var t=JSON.stringify,n=e=>JSON.parse(e);function r(r,i,a={}){let o=a.serialize??t,s=a.deserialize??n,c=(0,e.useCallback)(()=>{if(typeof window>`u`)return i;try{let e=window.localStorage.getItem(r);return e===null?i:s(e)}catch{return i}},[r,i,s]),[l,u]=(0,e.useState)(c);(0,e.useEffect)(()=>{u(c())},[c]);let d=(0,e.useCallback)(e=>{u(t=>{let n=typeof e==`function`?e(t):e;try{typeof window<`u`&&window.localStorage.setItem(r,o(n))}catch{}return n})},[r,o]),f=(0,e.useCallback)(()=>{try{typeof window<`u`&&window.localStorage.removeItem(r)}catch{}u(i)},[r,i]);return(0,e.useEffect)(()=>{if(typeof window>`u`)return;let e=e=>{if(e.key===r){if(e.newValue===null){u(i);return}try{u(s(e.newValue))}catch{}}};return window.addEventListener(`storage`,e),()=>window.removeEventListener(`storage`,e)},[r,i,s]),[l,d,f]}exports.useLocalStorage=r;
1
+ let e=require("react");var t=JSON.stringify,n=e=>JSON.parse(e);function r(r,i,a={}){let o=a.serialize??t,s=a.deserialize??n,c=(0,e.useCallback)(()=>{if(typeof window>`u`)return i;try{let e=window.localStorage.getItem(r);return e===null?i:s(e)}catch{return i}},[r,i,s]),[l,u]=(0,e.useState)(c);(0,e.useEffect)(()=>{u(c())},[c]);let d=(0,e.useCallback)(e=>{u(t=>{let n=typeof e==`function`?e(t):e;try{typeof window<`u`&&window.localStorage.setItem(r,o(n))}catch{}return n})},[r,o]),f=(0,e.useCallback)(()=>{try{typeof window<`u`&&window.localStorage.removeItem(r)}catch{}u(i)},[r,i]);return(0,e.useEffect)(()=>{if(typeof window>`u`)return;let e=e=>{if(e.key===r){if(e.newValue===null)u(i);else try{u(s(e.newValue))}catch{}}};return window.addEventListener(`storage`,e),()=>window.removeEventListener(`storage`,e)},[r,i,s]),[l,d,f]}exports.useLocalStorage=r;
2
2
  //# sourceMappingURL=use-local-storage.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-local-storage.cjs","names":[],"sources":["../../src/hooks/use-local-storage.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\nexport type LocalStorageOptions<T> = {\n serialize?: (value: T) => string;\n deserialize?: (raw: string) => T;\n};\n\nconst defaultSerialize = JSON.stringify;\nconst defaultDeserialize = <T>(raw: string): T => JSON.parse(raw) as T;\n\n/**\n * State synced with `localStorage`. SSR-safe — initial render returns the\n * provided default; the stored value is hydrated after mount. Updates to the\n * same key in other tabs are picked up via the `storage` event.\n *\n * @tempest-limits empty-catch — the three swallows here are the hook's contract.\n * A write that hits the quota (or Safari private mode) still updates React state,\n * so the session keeps working and only persistence is lost; a `storage` event\n * carrying a value this tab cannot deserialize is another tab's bug, and the\n * useful response is to keep the value already rendered rather than tear the\n * component down over a foreign write.\n *\n * @param key - localStorage key.\n * @param defaultValue - value used when nothing is stored or in SSR.\n * @param options - custom `serialize` / `deserialize` (default JSON).\n * @returns Tuple `[value, setValue, remove]`.\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T,\n options: LocalStorageOptions<T> = {},\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const serialize = options.serialize ?? defaultSerialize;\n const deserialize = options.deserialize ?? defaultDeserialize;\n\n const read = useCallback((): T => {\n if (typeof window === \"undefined\") return defaultValue;\n try {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return defaultValue;\n return deserialize(raw);\n } catch {\n return defaultValue;\n }\n }, [key, defaultValue, deserialize]);\n\n const [value, setStored] = useState<T>(read);\n\n useEffect(() => {\n setStored(read());\n }, [read]);\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)): void => {\n setStored((current) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(current) : next;\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, serialize(resolved));\n }\n } catch {\n /* empty */\n }\n return resolved;\n });\n },\n [key, serialize],\n );\n\n const remove = useCallback((): void => {\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.removeItem(key);\n }\n } catch {\n /* empty */\n }\n setStored(defaultValue);\n }, [key, defaultValue]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onStorage = (event: StorageEvent): void => {\n if (event.key !== key) return;\n if (event.newValue === null) {\n setStored(defaultValue);\n return;\n }\n try {\n setStored(deserialize(event.newValue));\n } catch {\n /* empty */\n }\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n }, [key, defaultValue, deserialize]);\n\n return [value, setValue, remove];\n}\n"],"mappings":"uBAOA,IAAM,EAAmB,KAAK,UACxB,EAAyB,GAAmB,KAAK,MAAM,CAAG,EAmBhE,SAAgB,EACZ,EACA,EACA,EAAkC,CAAC,EACmB,CACtD,IAAM,EAAY,EAAQ,WAAa,EACjC,EAAc,EAAQ,aAAe,EAErC,GAAA,EAAO,EAAA,YAAA,KAAqB,CAC9B,GAAI,OAAO,OAAW,IAAa,OAAO,EAC1C,GAAI,CACA,IAAM,EAAM,OAAO,aAAa,QAAQ,CAAG,EAE3C,OADI,IAAQ,KAAa,EAClB,EAAY,CAAG,CAC1B,MAAQ,CACJ,OAAO,CACX,CACJ,EAAG,CAAC,EAAK,EAAc,CAAW,CAAC,EAE7B,CAAC,EAAO,IAAA,EAAa,EAAA,SAAA,CAAY,CAAI,GAE3C,EAAA,EAAA,UAAA,KAAgB,CACZ,EAAU,EAAK,CAAC,CACpB,EAAG,CAAC,CAAI,CAAC,EAET,IAAM,GAAA,EAAW,EAAA,YAAA,CACZ,GAAqC,CAClC,EAAW,GAAY,CACnB,IAAM,EACF,OAAO,GAAS,WAAc,EAAwB,CAAO,EAAI,EACrE,GAAI,CACI,OAAO,OAAW,KAClB,OAAO,aAAa,QAAQ,EAAK,EAAU,CAAQ,CAAC,CAE5D,MAAQ,CAER,CACA,OAAO,CACX,CAAC,CACL,EACA,CAAC,EAAK,CAAS,CACnB,EAEM,GAAA,EAAS,EAAA,YAAA,KAAwB,CACnC,GAAI,CACI,OAAO,OAAW,KAClB,OAAO,aAAa,WAAW,CAAG,CAE1C,MAAQ,CAER,CACA,EAAU,CAAY,CAC1B,EAAG,CAAC,EAAK,CAAY,CAAC,EAoBtB,OAlBA,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAM,EAAa,GAA8B,CACzC,KAAM,MAAQ,EAClB,IAAI,EAAM,WAAa,KAAM,CACzB,EAAU,CAAY,EACtB,MACJ,CACA,GAAI,CACA,EAAU,EAAY,EAAM,QAAQ,CAAC,CACzC,MAAQ,CAER,CALA,CAMJ,EAEA,OADA,OAAO,iBAAiB,UAAW,CAAS,MAC/B,OAAO,oBAAoB,UAAW,CAAS,CAChE,EAAG,CAAC,EAAK,EAAc,CAAW,CAAC,EAE5B,CAAC,EAAO,EAAU,CAAM,CACnC"}
1
+ {"version":3,"file":"use-local-storage.cjs","names":["useCallback","useState","react","defaultSerialize","defaultDeserialize","raw","useLocalStorage","serialize","options","deserialize","read","defaultValue","key","value","setStored","setValue","resolved","next","current","remove","onStorage","event"],"sources":["../../src/hooks/use-local-storage.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\nexport type LocalStorageOptions<T> = {\n serialize?: (value: T) => string;\n deserialize?: (raw: string) => T;\n};\n\nconst defaultSerialize = JSON.stringify;\nconst defaultDeserialize = <T>(raw: string): T => JSON.parse(raw) as T;\n\n/**\n * State synced with `localStorage`. SSR-safe — initial render returns the\n * provided default; the stored value is hydrated after mount. Updates to the\n * same key in other tabs are picked up via the `storage` event.\n *\n * @tempest-limits empty-catch — the three swallows here are the hook's contract.\n * A write that hits the quota (or Safari private mode) still updates React state,\n * so the session keeps working and only persistence is lost; a `storage` event\n * carrying a value this tab cannot deserialize is another tab's bug, and the\n * useful response is to keep the value already rendered rather than tear the\n * component down over a foreign write.\n *\n * @param key - localStorage key.\n * @param defaultValue - value used when nothing is stored or in SSR.\n * @param options - custom `serialize` / `deserialize` (default JSON).\n * @returns Tuple `[value, setValue, remove]`.\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T,\n options: LocalStorageOptions<T> = {},\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const serialize = options.serialize ?? defaultSerialize;\n const deserialize = options.deserialize ?? defaultDeserialize;\n\n const read = useCallback((): T => {\n if (typeof window === \"undefined\") return defaultValue;\n try {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return defaultValue;\n return deserialize(raw);\n } catch {\n return defaultValue;\n }\n }, [key, defaultValue, deserialize]);\n\n const [value, setStored] = useState<T>(read);\n\n useEffect(() => {\n setStored(read());\n }, [read]);\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)): void => {\n setStored((current) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(current) : next;\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, serialize(resolved));\n }\n } catch {\n /* empty */\n }\n return resolved;\n });\n },\n [key, serialize],\n );\n\n const remove = useCallback((): void => {\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.removeItem(key);\n }\n } catch {\n /* empty */\n }\n setStored(defaultValue);\n }, [key, defaultValue]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onStorage = (event: StorageEvent): void => {\n if (event.key !== key) return;\n if (event.newValue === null) {\n setStored(defaultValue);\n return;\n }\n try {\n setStored(deserialize(event.newValue));\n } catch {\n /* empty */\n }\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n }, [key, defaultValue, deserialize]);\n\n return [value, setValue, remove];\n}\n"],"mappings":"A,uBAOA,IAAMG,EAAmB,KAAK,UACxBC,EAAyB,GAAmB,KAAK,MAAMC,CAAG,EAmBhE,SAAgBC,EACZ,EACA,EACA,EAAkC,CAAC,EACmB,CACtD,IAAMC,EAAYC,EAAQ,WAAaL,EACjCM,EAAcD,EAAQ,aAAeJ,EAErCM,GAAA,EAAOV,EAAAA,YAAAA,KAAqB,CAC9B,GAAI,OAAO,OAAW,IAAa,OAAOW,EAC1C,GAAI,CACA,IAAMN,EAAM,OAAO,aAAa,QAAQO,CAAG,EAE3C,OADIP,IAAQ,KAAaM,EAClBF,EAAYJ,CAAG,CAC1B,MAAQ,CACJ,OAAOM,CACX,CACJ,EAAG,CAACC,EAAKD,EAAcF,CAAW,CAAC,EAE7B,CAACI,EAAOC,IAAA,EAAab,EAAAA,SAAAA,CAAYS,CAAI,GAE3C,EAAAR,EAAA,UAAA,KAAgB,CACZY,EAAUJ,EAAK,CAAC,CACpB,EAAG,CAACA,CAAI,CAAC,EAET,IAAMK,GAAA,EAAWf,EAAAA,YAAAA,CACZ,GAAqC,CAClCc,EAAW,GAAY,CACnB,IAAME,EACF,OAAOC,GAAS,WAAcA,EAAwBC,CAAO,EAAID,EACrE,GAAI,CACI,OAAO,OAAW,KAClB,OAAO,aAAa,QAAQL,EAAKL,EAAUS,CAAQ,CAAC,CAE5D,MAAQ,CAER,CACA,OAAOA,CACX,CAAC,CACL,EACA,CAACJ,EAAKL,CAAS,CACnB,EAEMY,GAAA,EAASnB,EAAAA,YAAAA,KAAwB,CACnC,GAAI,CACI,OAAO,OAAW,KAClB,OAAO,aAAa,WAAWY,CAAG,CAE1C,MAAQ,CAER,CACAE,EAAUH,CAAY,CAC1B,EAAG,CAACC,EAAKD,CAAY,CAAC,EAoBtB,OAlBA,EAAAT,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAMkB,EAAa,GAA8B,CAC7C,GAAIC,EAAM,MAAQT,EAClB,IAAIS,EAAM,WAAa,KACnBP,EAAUH,CAAY,OAG1B,GAAI,CACAG,EAAUL,EAAYY,EAAM,QAAQ,CAAC,CACzC,MAAQ,CAER,CALA,CAMJ,EAEA,OADA,OAAO,iBAAiB,UAAWD,CAAS,MAC/B,OAAO,oBAAoB,UAAWA,CAAS,CAChE,EAAG,CAACR,EAAKD,EAAcF,CAAW,CAAC,EAE5B,CAACI,EAAOE,EAAUI,CAAM,CACnC,C"}
@@ -36,11 +36,8 @@ function a(a, o, s = {}) {
36
36
  if (typeof window > "u") return;
37
37
  let e = (e) => {
38
38
  if (e.key === a) {
39
- if (e.newValue === null) {
40
- f(o);
41
- return;
42
- }
43
- try {
39
+ if (e.newValue === null) f(o);
40
+ else try {
44
41
  f(l(e.newValue));
45
42
  } catch {}
46
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-local-storage.js","names":[],"sources":["../../src/hooks/use-local-storage.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\nexport type LocalStorageOptions<T> = {\n serialize?: (value: T) => string;\n deserialize?: (raw: string) => T;\n};\n\nconst defaultSerialize = JSON.stringify;\nconst defaultDeserialize = <T>(raw: string): T => JSON.parse(raw) as T;\n\n/**\n * State synced with `localStorage`. SSR-safe — initial render returns the\n * provided default; the stored value is hydrated after mount. Updates to the\n * same key in other tabs are picked up via the `storage` event.\n *\n * @tempest-limits empty-catch — the three swallows here are the hook's contract.\n * A write that hits the quota (or Safari private mode) still updates React state,\n * so the session keeps working and only persistence is lost; a `storage` event\n * carrying a value this tab cannot deserialize is another tab's bug, and the\n * useful response is to keep the value already rendered rather than tear the\n * component down over a foreign write.\n *\n * @param key - localStorage key.\n * @param defaultValue - value used when nothing is stored or in SSR.\n * @param options - custom `serialize` / `deserialize` (default JSON).\n * @returns Tuple `[value, setValue, remove]`.\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T,\n options: LocalStorageOptions<T> = {},\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const serialize = options.serialize ?? defaultSerialize;\n const deserialize = options.deserialize ?? defaultDeserialize;\n\n const read = useCallback((): T => {\n if (typeof window === \"undefined\") return defaultValue;\n try {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return defaultValue;\n return deserialize(raw);\n } catch {\n return defaultValue;\n }\n }, [key, defaultValue, deserialize]);\n\n const [value, setStored] = useState<T>(read);\n\n useEffect(() => {\n setStored(read());\n }, [read]);\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)): void => {\n setStored((current) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(current) : next;\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, serialize(resolved));\n }\n } catch {\n /* empty */\n }\n return resolved;\n });\n },\n [key, serialize],\n );\n\n const remove = useCallback((): void => {\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.removeItem(key);\n }\n } catch {\n /* empty */\n }\n setStored(defaultValue);\n }, [key, defaultValue]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onStorage = (event: StorageEvent): void => {\n if (event.key !== key) return;\n if (event.newValue === null) {\n setStored(defaultValue);\n return;\n }\n try {\n setStored(deserialize(event.newValue));\n } catch {\n /* empty */\n }\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n }, [key, defaultValue, deserialize]);\n\n return [value, setValue, remove];\n}\n"],"mappings":";;AAOA,IAAM,IAAmB,KAAK,WACxB,KAAyB,MAAmB,KAAK,MAAM,CAAG;AAmBhE,SAAgB,EACZ,GACA,GACA,IAAkC,CAAC,GACmB;CACtD,IAAM,IAAY,EAAQ,aAAa,GACjC,IAAc,EAAQ,eAAe,GAErC,IAAO,QAAqB;EAC9B,IAAI,OAAO,SAAW,KAAa,OAAO;EAC1C,IAAI;GACA,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAG;GAE3C,OADI,MAAQ,OAAa,IAClB,EAAY,CAAG;EAC1B,QAAQ;GACJ,OAAO;EACX;CACJ,GAAG;EAAC;EAAK;EAAc;CAAW,CAAC,GAE7B,CAAC,GAAO,KAAa,EAAY,CAAI;CAE3C,QAAgB;EACZ,EAAU,EAAK,CAAC;CACpB,GAAG,CAAC,CAAI,CAAC;CAET,IAAM,IAAW,GACZ,MAAqC;EAClC,GAAW,MAAY;GACnB,IAAM,IACF,OAAO,KAAS,aAAc,EAAwB,CAAO,IAAI;GACrE,IAAI;IACA,AAAI,OAAO,SAAW,OAClB,OAAO,aAAa,QAAQ,GAAK,EAAU,CAAQ,CAAC;GAE5D,QAAQ,CAER;GACA,OAAO;EACX,CAAC;CACL,GACA,CAAC,GAAK,CAAS,CACnB,GAEM,IAAS,QAAwB;EACnC,IAAI;GACA,AAAI,OAAO,SAAW,OAClB,OAAO,aAAa,WAAW,CAAG;EAE1C,QAAQ,CAER;EACA,EAAU,CAAY;CAC1B,GAAG,CAAC,GAAK,CAAY,CAAC;CAoBtB,OAlBA,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAM,KAAa,MAA8B;GACzC,MAAM,QAAQ,GAClB;QAAI,EAAM,aAAa,MAAM;KACzB,EAAU,CAAY;KACtB;IACJ;IACA,IAAI;KACA,EAAU,EAAY,EAAM,QAAQ,CAAC;IACzC,QAAQ,CAER;GALA;EAMJ;EAEA,OADA,OAAO,iBAAiB,WAAW,CAAS,SAC/B,OAAO,oBAAoB,WAAW,CAAS;CAChE,GAAG;EAAC;EAAK;EAAc;CAAW,CAAC,GAE5B;EAAC;EAAO;EAAU;CAAM;AACnC"}
1
+ {"version":3,"file":"use-local-storage.js","names":["defaultSerialize","defaultDeserialize","raw","useLocalStorage","serialize","options","deserialize","read","useCallback","defaultValue","key","value","setStored","useState","setValue","resolved","next","current","remove","useEffect","onStorage","event"],"sources":["../../src/hooks/use-local-storage.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\nexport type LocalStorageOptions<T> = {\n serialize?: (value: T) => string;\n deserialize?: (raw: string) => T;\n};\n\nconst defaultSerialize = JSON.stringify;\nconst defaultDeserialize = <T>(raw: string): T => JSON.parse(raw) as T;\n\n/**\n * State synced with `localStorage`. SSR-safe — initial render returns the\n * provided default; the stored value is hydrated after mount. Updates to the\n * same key in other tabs are picked up via the `storage` event.\n *\n * @tempest-limits empty-catch — the three swallows here are the hook's contract.\n * A write that hits the quota (or Safari private mode) still updates React state,\n * so the session keeps working and only persistence is lost; a `storage` event\n * carrying a value this tab cannot deserialize is another tab's bug, and the\n * useful response is to keep the value already rendered rather than tear the\n * component down over a foreign write.\n *\n * @param key - localStorage key.\n * @param defaultValue - value used when nothing is stored or in SSR.\n * @param options - custom `serialize` / `deserialize` (default JSON).\n * @returns Tuple `[value, setValue, remove]`.\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T,\n options: LocalStorageOptions<T> = {},\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const serialize = options.serialize ?? defaultSerialize;\n const deserialize = options.deserialize ?? defaultDeserialize;\n\n const read = useCallback((): T => {\n if (typeof window === \"undefined\") return defaultValue;\n try {\n const raw = window.localStorage.getItem(key);\n if (raw === null) return defaultValue;\n return deserialize(raw);\n } catch {\n return defaultValue;\n }\n }, [key, defaultValue, deserialize]);\n\n const [value, setStored] = useState<T>(read);\n\n useEffect(() => {\n setStored(read());\n }, [read]);\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)): void => {\n setStored((current) => {\n const resolved =\n typeof next === \"function\" ? (next as (prev: T) => T)(current) : next;\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, serialize(resolved));\n }\n } catch {\n /* empty */\n }\n return resolved;\n });\n },\n [key, serialize],\n );\n\n const remove = useCallback((): void => {\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.removeItem(key);\n }\n } catch {\n /* empty */\n }\n setStored(defaultValue);\n }, [key, defaultValue]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onStorage = (event: StorageEvent): void => {\n if (event.key !== key) return;\n if (event.newValue === null) {\n setStored(defaultValue);\n return;\n }\n try {\n setStored(deserialize(event.newValue));\n } catch {\n /* empty */\n }\n };\n window.addEventListener(\"storage\", onStorage);\n return () => window.removeEventListener(\"storage\", onStorage);\n }, [key, defaultValue, deserialize]);\n\n return [value, setValue, remove];\n}\n"],"mappings":";;AAOA,IAAMA,IAAmB,KAAK,WACxBC,KAAyB,MAAmB,KAAK,MAAMC,CAAG;AAmBhE,SAAgBC,EACZ,GACA,GACA,IAAkC,CAAC,GACmB;CACtD,IAAMC,IAAYC,EAAQ,aAAaL,GACjCM,IAAcD,EAAQ,eAAeJ,GAErCM,IAAOC,QAAqB;EAC9B,IAAI,OAAO,SAAW,KAAa,OAAOC;EAC1C,IAAI;GACA,IAAMP,IAAM,OAAO,aAAa,QAAQQ,CAAG;GAE3C,OADIR,MAAQ,OAAaO,IAClBH,EAAYJ,CAAG;EAC1B,QAAQ;GACJ,OAAOO;EACX;CACJ,GAAG;EAACC;EAAKD;EAAcH;CAAW,CAAC,GAE7B,CAACK,GAAOC,KAAaC,EAAYN,CAAI;CAE3C,QAAgB;EACZ,EAAUA,EAAK,CAAC;CACpB,GAAG,CAACA,CAAI,CAAC;CAET,IAAMO,IAAWN,GACZ,MAAqC;EAClC,GAAW,MAAY;GACnB,IAAMO,IACF,OAAOC,KAAS,aAAcA,EAAwBC,CAAO,IAAID;GACrE,IAAI;IACA,AAAI,OAAO,SAAW,OAClB,OAAO,aAAa,QAAQN,GAAKN,EAAUW,CAAQ,CAAC;GAE5D,QAAQ,CAER;GACA,OAAOA;EACX,CAAC;CACL,GACA,CAACL,GAAKN,CAAS,CACnB,GAEMc,IAASV,QAAwB;EACnC,IAAI;GACA,AAAI,OAAO,SAAW,OAClB,OAAO,aAAa,WAAWE,CAAG;EAE1C,QAAQ,CAER;EACA,EAAUD,CAAY;CAC1B,GAAG,CAACC,GAAKD,CAAY,CAAC;CAoBtB,OAlBAU,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAMC,KAAa,MAA8B;GAC7C,IAAIC,EAAM,QAAQX,GAClB;QAAIW,EAAM,aAAa,MACnB,EAAUZ,CAAY;SAG1B,IAAI;KACA,EAAUH,EAAYe,EAAM,QAAQ,CAAC;IACzC,QAAQ,CAER;GALA;EAMJ;EAEA,OADA,OAAO,iBAAiB,WAAWD,CAAS,SAC/B,OAAO,oBAAoB,WAAWA,CAAS;CAChE,GAAG;EAACV;EAAKD;EAAcH;CAAW,CAAC,GAE5B;EAACK;EAAOG;EAAUI;CAAM;AACnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-long-press-handlers.cjs","names":[],"sources":["../../src/hooks/use-long-press-handlers.ts"],"sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent } from \"react\";\n\n/**\n * DOM event handlers produced by {@link useLongPressHandlers}, ready to spread\n * onto a JSX element (`<div {...handlers}>`).\n */\nexport interface LongPressHandlers {\n /** Starts the hold timer on mouse press. */\n onMouseDown: (event: ReactMouseEvent) => void;\n /** Cancels the pending hold when the mouse is released. */\n onMouseUp: () => void;\n /** Cancels the pending hold when the pointer leaves the element. */\n onMouseLeave: () => void;\n /** Starts the hold timer on touch start. */\n onTouchStart: (event: ReactTouchEvent) => void;\n /** Cancels the pending hold when the touch ends. */\n onTouchEnd: () => void;\n /** Cancels the pending hold when the finger moves. */\n onTouchMove: () => void;\n /** Fires the long-press immediately (desktop right-click parity). */\n onContextMenu: (event: ReactMouseEvent) => void;\n}\n\n/** Options accepted by {@link useLongPressHandlers}. */\nexport interface UseLongPressHandlersOptions {\n /** Hold duration in ms before `onLongPress` fires. Defaults to `500`. */\n delayMs?: number;\n /** When `true`, the hook is inert and every handler is a no-op. */\n disabled?: boolean;\n}\n\n/** Return shape of {@link useLongPressHandlers}. */\nexport type UseLongPressHandlersResult = LongPressHandlers & {\n /**\n * Reads whether the most recent interaction fired a long-press. Use it in\n * the element's `onClick` to suppress the click that follows a long-press.\n */\n wasLongPress: () => boolean;\n};\n\n/**\n * Returns DOM event handlers that detect a long press (touch or mouse hold)\n * and invoke `onLongPress` once after `delayMs`.\n *\n * Cancels on touch movement or pointer release. Also wires `contextmenu` to\n * fire `onLongPress` immediately so a right-click on desktop opens selection\n * mode the same way an Android long-press does on mobile.\n *\n * The hook does not `preventDefault` on the underlying click — the consumer\n * decides whether the subsequent click should still fire. Track that with the\n * returned `wasLongPress()` guard to tell \"long-press fired\" apart from a\n * \"regular click\".\n *\n * Unlike {@link useLongPress}, which attaches pointer listeners to a `ref`,\n * this variant returns handler props you spread directly onto an element and\n * exposes a `wasLongPress()` guard.\n *\n * @param onLongPress - Callback invoked once the hold threshold is reached.\n * @param options - Optional `delayMs` and `disabled` flags.\n * @returns The spreadable handlers plus a `wasLongPress()` guard.\n *\n * @example\n * const longPress = useLongPressHandlers(() => enterSelectionMode(), { delayMs: 600 });\n * <button {...longPress} onClick={() => { if (!longPress.wasLongPress()) navigate(); }}>\n * Item\n * </button>\n */\nexport function useLongPressHandlers(\n onLongPress: () => void,\n options: UseLongPressHandlersOptions = {},\n): UseLongPressHandlersResult {\n const { delayMs = 500, disabled = false } = options;\n const timerRef = useRef<number | null>(null);\n const firedRef = useRef<boolean>(false);\n const callbackRef = useLatestRef(onLongPress);\n\n const clear = useCallback((): void => {\n if (timerRef.current !== null) {\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const start = useCallback((): void => {\n if (disabled) return;\n firedRef.current = false;\n clear();\n timerRef.current = window.setTimeout(() => {\n firedRef.current = true;\n callbackRef.current();\n }, delayMs);\n }, [disabled, clear, delayMs, callbackRef]);\n\n const onContextMenu = useCallback(\n (event: ReactMouseEvent): void => {\n if (disabled) return;\n event.preventDefault();\n firedRef.current = true;\n callbackRef.current();\n },\n [disabled, callbackRef],\n );\n\n return {\n onMouseDown: start,\n onMouseUp: clear,\n onMouseLeave: clear,\n onTouchStart: start,\n onTouchEnd: clear,\n onTouchMove: clear,\n onContextMenu,\n wasLongPress: () => firedRef.current,\n };\n}\n"],"mappings":"+DAqEA,SAAgB,EACZ,EACA,EAAuC,CAAC,EACd,CAC1B,GAAM,CAAE,UAAU,IAAK,WAAW,IAAU,EACtC,GAAA,EAAW,EAAA,OAAA,CAAsB,IAAI,EACrC,GAAA,EAAW,EAAA,OAAA,CAAgB,EAAK,EAChC,EAAc,EAAA,aAAa,CAAW,EAEtC,GAAA,EAAQ,EAAA,YAAA,KAAwB,CAC9B,EAAS,UAAY,OACrB,OAAO,aAAa,EAAS,OAAO,EACpC,EAAS,QAAU,KAE3B,EAAG,CAAC,CAAC,EAEC,GAAA,EAAQ,EAAA,YAAA,KAAwB,CAC9B,IACJ,EAAS,QAAU,GACnB,EAAM,EACN,EAAS,QAAU,OAAO,eAAiB,CACvC,EAAS,QAAU,GACnB,EAAY,QAAQ,CACxB,EAAG,CAAO,EACd,EAAG,CAAC,EAAU,EAAO,EAAS,CAAW,CAAC,EAY1C,MAAO,CACH,YAAa,EACb,UAAW,EACX,aAAc,EACd,aAAc,EACd,WAAY,EACZ,YAAa,EACb,eAAA,EAjBkB,EAAA,YAAA,CACjB,GAAiC,CAC1B,IACJ,EAAM,eAAe,EACrB,EAAS,QAAU,GACnB,EAAY,QAAQ,EACxB,EACA,CAAC,EAAU,CAAW,CAUtB,EACA,iBAAoB,EAAS,OACjC,CACJ"}
1
+ {"version":3,"file":"use-long-press-handlers.cjs","names":["useRef","useLatestRef","useCallback","require_use_latest_ref","react","useLongPressHandlers","options","timerRef","firedRef","callbackRef","onLongPress","clear","start","disabled","delayMs","event"],"sources":["../../src/hooks/use-long-press-handlers.ts"],"sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent } from \"react\";\n\n/**\n * DOM event handlers produced by {@link useLongPressHandlers}, ready to spread\n * onto a JSX element (`<div {...handlers}>`).\n */\nexport interface LongPressHandlers {\n /** Starts the hold timer on mouse press. */\n onMouseDown: (event: ReactMouseEvent) => void;\n /** Cancels the pending hold when the mouse is released. */\n onMouseUp: () => void;\n /** Cancels the pending hold when the pointer leaves the element. */\n onMouseLeave: () => void;\n /** Starts the hold timer on touch start. */\n onTouchStart: (event: ReactTouchEvent) => void;\n /** Cancels the pending hold when the touch ends. */\n onTouchEnd: () => void;\n /** Cancels the pending hold when the finger moves. */\n onTouchMove: () => void;\n /** Fires the long-press immediately (desktop right-click parity). */\n onContextMenu: (event: ReactMouseEvent) => void;\n}\n\n/** Options accepted by {@link useLongPressHandlers}. */\nexport interface UseLongPressHandlersOptions {\n /** Hold duration in ms before `onLongPress` fires. Defaults to `500`. */\n delayMs?: number;\n /** When `true`, the hook is inert and every handler is a no-op. */\n disabled?: boolean;\n}\n\n/** Return shape of {@link useLongPressHandlers}. */\nexport type UseLongPressHandlersResult = LongPressHandlers & {\n /**\n * Reads whether the most recent interaction fired a long-press. Use it in\n * the element's `onClick` to suppress the click that follows a long-press.\n */\n wasLongPress: () => boolean;\n};\n\n/**\n * Returns DOM event handlers that detect a long press (touch or mouse hold)\n * and invoke `onLongPress` once after `delayMs`.\n *\n * Cancels on touch movement or pointer release. Also wires `contextmenu` to\n * fire `onLongPress` immediately so a right-click on desktop opens selection\n * mode the same way an Android long-press does on mobile.\n *\n * The hook does not `preventDefault` on the underlying click — the consumer\n * decides whether the subsequent click should still fire. Track that with the\n * returned `wasLongPress()` guard to tell \"long-press fired\" apart from a\n * \"regular click\".\n *\n * Unlike {@link useLongPress}, which attaches pointer listeners to a `ref`,\n * this variant returns handler props you spread directly onto an element and\n * exposes a `wasLongPress()` guard.\n *\n * @param onLongPress - Callback invoked once the hold threshold is reached.\n * @param options - Optional `delayMs` and `disabled` flags.\n * @returns The spreadable handlers plus a `wasLongPress()` guard.\n *\n * @example\n * const longPress = useLongPressHandlers(() => enterSelectionMode(), { delayMs: 600 });\n * <button {...longPress} onClick={() => { if (!longPress.wasLongPress()) navigate(); }}>\n * Item\n * </button>\n */\nexport function useLongPressHandlers(\n onLongPress: () => void,\n options: UseLongPressHandlersOptions = {},\n): UseLongPressHandlersResult {\n const { delayMs = 500, disabled = false } = options;\n const timerRef = useRef<number | null>(null);\n const firedRef = useRef<boolean>(false);\n const callbackRef = useLatestRef(onLongPress);\n\n const clear = useCallback((): void => {\n if (timerRef.current !== null) {\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const start = useCallback((): void => {\n if (disabled) return;\n firedRef.current = false;\n clear();\n timerRef.current = window.setTimeout(() => {\n firedRef.current = true;\n callbackRef.current();\n }, delayMs);\n }, [disabled, clear, delayMs, callbackRef]);\n\n const onContextMenu = useCallback(\n (event: ReactMouseEvent): void => {\n if (disabled) return;\n event.preventDefault();\n firedRef.current = true;\n callbackRef.current();\n },\n [disabled, callbackRef],\n );\n\n return {\n onMouseDown: start,\n onMouseUp: clear,\n onMouseLeave: clear,\n onTouchStart: start,\n onTouchEnd: clear,\n onTouchMove: clear,\n onContextMenu,\n wasLongPress: () => firedRef.current,\n };\n}\n"],"mappings":"A,+DAqEA,SAAgBK,EACZ,EACA,EAAuC,CAAC,EACd,CAC1B,GAAM,CAAE,UAAU,IAAK,WAAW,IAAUC,EACtCC,GAAA,EAAWP,EAAAA,OAAAA,CAAsB,IAAI,EACrCQ,GAAA,EAAWR,EAAAA,OAAAA,CAAgB,EAAK,EAChCS,EAAcR,EAAAA,aAAaS,CAAW,EAEtCC,GAAA,EAAQT,EAAAA,YAAAA,KAAwB,CAC9BK,EAAS,UAAY,OACrB,OAAO,aAAaA,EAAS,OAAO,EACpC,EAAS,QAAU,KAE3B,EAAG,CAAC,CAAC,EAECK,GAAA,EAAQV,EAAAA,YAAAA,KAAwB,CAC9BW,IACJ,EAAS,QAAU,GACnBF,EAAM,EACN,EAAS,QAAU,OAAO,eAAiB,CACvC,EAAS,QAAU,GACnBF,EAAY,QAAQ,CACxB,EAAGK,CAAO,EACd,EAAG,CAACD,EAAUF,EAAOG,EAASL,CAAW,CAAC,EAY1C,MAAO,CACH,YAAaG,EACb,UAAWD,EACX,aAAcA,EACd,aAAcC,EACd,WAAYD,EACZ,YAAaA,EACb,eAAA,EAjBkBT,EAAAA,YAAAA,CACjB,GAAiC,CAC1BW,IACJE,EAAM,eAAe,EACrB,EAAS,QAAU,GACnBN,EAAY,QAAQ,EACxB,EACA,CAACI,EAAUJ,CAAW,CAUtB,EACA,iBAAoBD,EAAS,OACjC,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-long-press-handlers.js","names":[],"sources":["../../src/hooks/use-long-press-handlers.ts"],"sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent } from \"react\";\n\n/**\n * DOM event handlers produced by {@link useLongPressHandlers}, ready to spread\n * onto a JSX element (`<div {...handlers}>`).\n */\nexport interface LongPressHandlers {\n /** Starts the hold timer on mouse press. */\n onMouseDown: (event: ReactMouseEvent) => void;\n /** Cancels the pending hold when the mouse is released. */\n onMouseUp: () => void;\n /** Cancels the pending hold when the pointer leaves the element. */\n onMouseLeave: () => void;\n /** Starts the hold timer on touch start. */\n onTouchStart: (event: ReactTouchEvent) => void;\n /** Cancels the pending hold when the touch ends. */\n onTouchEnd: () => void;\n /** Cancels the pending hold when the finger moves. */\n onTouchMove: () => void;\n /** Fires the long-press immediately (desktop right-click parity). */\n onContextMenu: (event: ReactMouseEvent) => void;\n}\n\n/** Options accepted by {@link useLongPressHandlers}. */\nexport interface UseLongPressHandlersOptions {\n /** Hold duration in ms before `onLongPress` fires. Defaults to `500`. */\n delayMs?: number;\n /** When `true`, the hook is inert and every handler is a no-op. */\n disabled?: boolean;\n}\n\n/** Return shape of {@link useLongPressHandlers}. */\nexport type UseLongPressHandlersResult = LongPressHandlers & {\n /**\n * Reads whether the most recent interaction fired a long-press. Use it in\n * the element's `onClick` to suppress the click that follows a long-press.\n */\n wasLongPress: () => boolean;\n};\n\n/**\n * Returns DOM event handlers that detect a long press (touch or mouse hold)\n * and invoke `onLongPress` once after `delayMs`.\n *\n * Cancels on touch movement or pointer release. Also wires `contextmenu` to\n * fire `onLongPress` immediately so a right-click on desktop opens selection\n * mode the same way an Android long-press does on mobile.\n *\n * The hook does not `preventDefault` on the underlying click — the consumer\n * decides whether the subsequent click should still fire. Track that with the\n * returned `wasLongPress()` guard to tell \"long-press fired\" apart from a\n * \"regular click\".\n *\n * Unlike {@link useLongPress}, which attaches pointer listeners to a `ref`,\n * this variant returns handler props you spread directly onto an element and\n * exposes a `wasLongPress()` guard.\n *\n * @param onLongPress - Callback invoked once the hold threshold is reached.\n * @param options - Optional `delayMs` and `disabled` flags.\n * @returns The spreadable handlers plus a `wasLongPress()` guard.\n *\n * @example\n * const longPress = useLongPressHandlers(() => enterSelectionMode(), { delayMs: 600 });\n * <button {...longPress} onClick={() => { if (!longPress.wasLongPress()) navigate(); }}>\n * Item\n * </button>\n */\nexport function useLongPressHandlers(\n onLongPress: () => void,\n options: UseLongPressHandlersOptions = {},\n): UseLongPressHandlersResult {\n const { delayMs = 500, disabled = false } = options;\n const timerRef = useRef<number | null>(null);\n const firedRef = useRef<boolean>(false);\n const callbackRef = useLatestRef(onLongPress);\n\n const clear = useCallback((): void => {\n if (timerRef.current !== null) {\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const start = useCallback((): void => {\n if (disabled) return;\n firedRef.current = false;\n clear();\n timerRef.current = window.setTimeout(() => {\n firedRef.current = true;\n callbackRef.current();\n }, delayMs);\n }, [disabled, clear, delayMs, callbackRef]);\n\n const onContextMenu = useCallback(\n (event: ReactMouseEvent): void => {\n if (disabled) return;\n event.preventDefault();\n firedRef.current = true;\n callbackRef.current();\n },\n [disabled, callbackRef],\n );\n\n return {\n onMouseDown: start,\n onMouseUp: clear,\n onMouseLeave: clear,\n onTouchStart: start,\n onTouchEnd: clear,\n onTouchMove: clear,\n onContextMenu,\n wasLongPress: () => firedRef.current,\n };\n}\n"],"mappings":";;;AAqEA,SAAgB,EACZ,GACA,IAAuC,CAAC,GACd;CAC1B,IAAM,EAAE,aAAU,KAAK,cAAW,OAAU,GACtC,IAAW,EAAsB,IAAI,GACrC,IAAW,EAAgB,EAAK,GAChC,IAAc,EAAa,CAAW,GAEtC,IAAQ,QAAwB;EAClC,AAAI,EAAS,YAAY,SACrB,OAAO,aAAa,EAAS,OAAO,GACpC,EAAS,UAAU;CAE3B,GAAG,CAAC,CAAC,GAEC,IAAQ,QAAwB;EAC9B,MACJ,EAAS,UAAU,IACnB,EAAM,GACN,EAAS,UAAU,OAAO,iBAAiB;GAEvC,AADA,EAAS,UAAU,IACnB,EAAY,QAAQ;EACxB,GAAG,CAAO;CACd,GAAG;EAAC;EAAU;EAAO;EAAS;CAAW,CAAC;CAY1C,OAAO;EACH,aAAa;EACb,WAAW;EACX,cAAc;EACd,cAAc;EACd,YAAY;EACZ,aAAa;EACb,eAjBkB,GACjB,MAAiC;GAC1B,MACJ,EAAM,eAAe,GACrB,EAAS,UAAU,IACnB,EAAY,QAAQ;EACxB,GACA,CAAC,GAAU,CAAW,CAUtB;EACA,oBAAoB,EAAS;CACjC;AACJ"}
1
+ {"version":3,"file":"use-long-press-handlers.js","names":["useLongPressHandlers","options","timerRef","useRef","firedRef","callbackRef","useLatestRef","onLongPress","clear","useCallback","start","disabled","delayMs","event"],"sources":["../../src/hooks/use-long-press-handlers.ts"],"sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent } from \"react\";\n\n/**\n * DOM event handlers produced by {@link useLongPressHandlers}, ready to spread\n * onto a JSX element (`<div {...handlers}>`).\n */\nexport interface LongPressHandlers {\n /** Starts the hold timer on mouse press. */\n onMouseDown: (event: ReactMouseEvent) => void;\n /** Cancels the pending hold when the mouse is released. */\n onMouseUp: () => void;\n /** Cancels the pending hold when the pointer leaves the element. */\n onMouseLeave: () => void;\n /** Starts the hold timer on touch start. */\n onTouchStart: (event: ReactTouchEvent) => void;\n /** Cancels the pending hold when the touch ends. */\n onTouchEnd: () => void;\n /** Cancels the pending hold when the finger moves. */\n onTouchMove: () => void;\n /** Fires the long-press immediately (desktop right-click parity). */\n onContextMenu: (event: ReactMouseEvent) => void;\n}\n\n/** Options accepted by {@link useLongPressHandlers}. */\nexport interface UseLongPressHandlersOptions {\n /** Hold duration in ms before `onLongPress` fires. Defaults to `500`. */\n delayMs?: number;\n /** When `true`, the hook is inert and every handler is a no-op. */\n disabled?: boolean;\n}\n\n/** Return shape of {@link useLongPressHandlers}. */\nexport type UseLongPressHandlersResult = LongPressHandlers & {\n /**\n * Reads whether the most recent interaction fired a long-press. Use it in\n * the element's `onClick` to suppress the click that follows a long-press.\n */\n wasLongPress: () => boolean;\n};\n\n/**\n * Returns DOM event handlers that detect a long press (touch or mouse hold)\n * and invoke `onLongPress` once after `delayMs`.\n *\n * Cancels on touch movement or pointer release. Also wires `contextmenu` to\n * fire `onLongPress` immediately so a right-click on desktop opens selection\n * mode the same way an Android long-press does on mobile.\n *\n * The hook does not `preventDefault` on the underlying click — the consumer\n * decides whether the subsequent click should still fire. Track that with the\n * returned `wasLongPress()` guard to tell \"long-press fired\" apart from a\n * \"regular click\".\n *\n * Unlike {@link useLongPress}, which attaches pointer listeners to a `ref`,\n * this variant returns handler props you spread directly onto an element and\n * exposes a `wasLongPress()` guard.\n *\n * @param onLongPress - Callback invoked once the hold threshold is reached.\n * @param options - Optional `delayMs` and `disabled` flags.\n * @returns The spreadable handlers plus a `wasLongPress()` guard.\n *\n * @example\n * const longPress = useLongPressHandlers(() => enterSelectionMode(), { delayMs: 600 });\n * <button {...longPress} onClick={() => { if (!longPress.wasLongPress()) navigate(); }}>\n * Item\n * </button>\n */\nexport function useLongPressHandlers(\n onLongPress: () => void,\n options: UseLongPressHandlersOptions = {},\n): UseLongPressHandlersResult {\n const { delayMs = 500, disabled = false } = options;\n const timerRef = useRef<number | null>(null);\n const firedRef = useRef<boolean>(false);\n const callbackRef = useLatestRef(onLongPress);\n\n const clear = useCallback((): void => {\n if (timerRef.current !== null) {\n window.clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const start = useCallback((): void => {\n if (disabled) return;\n firedRef.current = false;\n clear();\n timerRef.current = window.setTimeout(() => {\n firedRef.current = true;\n callbackRef.current();\n }, delayMs);\n }, [disabled, clear, delayMs, callbackRef]);\n\n const onContextMenu = useCallback(\n (event: ReactMouseEvent): void => {\n if (disabled) return;\n event.preventDefault();\n firedRef.current = true;\n callbackRef.current();\n },\n [disabled, callbackRef],\n );\n\n return {\n onMouseDown: start,\n onMouseUp: clear,\n onMouseLeave: clear,\n onTouchStart: start,\n onTouchEnd: clear,\n onTouchMove: clear,\n onContextMenu,\n wasLongPress: () => firedRef.current,\n };\n}\n"],"mappings":";;;AAqEA,SAAgBA,EACZ,GACA,IAAuC,CAAC,GACd;CAC1B,IAAM,EAAE,aAAU,KAAK,cAAW,OAAUC,GACtCC,IAAWC,EAAsB,IAAI,GACrCC,IAAWD,EAAgB,EAAK,GAChCE,IAAcC,EAAaC,CAAW,GAEtCC,IAAQC,QAAwB;EAClC,AAAIP,EAAS,YAAY,SACrB,OAAO,aAAaA,EAAS,OAAO,GACpC,EAAS,UAAU;CAE3B,GAAG,CAAC,CAAC,GAECQ,IAAQD,QAAwB;EAClC,AAAIE,MACJ,EAAS,UAAU,IACnBH,EAAM,GACN,EAAS,UAAU,OAAO,iBAAiB;GAEvC,AADA,EAAS,UAAU,IACnBH,EAAY,QAAQ;EACxB,GAAGO,CAAO;CACd,GAAG;EAACD;EAAUH;EAAOI;EAASP;CAAW,CAAC;CAY1C,OAAO;EACH,aAAaK;EACb,WAAWF;EACX,cAAcA;EACd,cAAcE;EACd,YAAYF;EACZ,aAAaA;EACb,eAjBkBC,GACjB,MAAiC;GAC9B,AAAIE,MACJE,EAAM,eAAe,GACrB,EAAS,UAAU,IACnBR,EAAY,QAAQ;EACxB,GACA,CAACM,GAAUN,CAAW,CAUtB;EACA,oBAAoBD,EAAS;CACjC;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-long-press.cjs","names":[],"sources":["../../src/hooks/use-long-press.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { RefObject } from \"react\";\n\nexport interface UseLongPressOptions {\n /** Press duration in ms. Default `500`. */\n delay?: number;\n /** Pixel threshold — finger/mouse movement beyond this cancels the press. Default `10`. */\n moveThreshold?: number;\n}\n\n/**\n * Detect long-press / long-tap gestures. Fires `fn` after `delay` ms\n * while the element is held. Cancels on move beyond `moveThreshold` or\n * pointer up before `delay`.\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * useLongPress(ref, () => openContextMenu(), { delay: 600 });\n */\nexport function useLongPress<T extends HTMLElement>(\n ref: RefObject<T | null>,\n fn: () => void,\n options: UseLongPressOptions = {},\n): void {\n const { delay = 500, moveThreshold = 10 } = options;\n const fnRef = useLatestRef(fn);\n\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let startX = 0;\n let startY = 0;\n\n const cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const onDown = (event: PointerEvent): void => {\n startX = event.clientX;\n startY = event.clientY;\n cancel();\n timer = setTimeout(() => {\n timer = null;\n fnRef.current();\n }, delay);\n };\n\n const onMove = (event: PointerEvent): void => {\n if (timer === null) return;\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (Math.hypot(dx, dy) > moveThreshold) cancel();\n };\n\n node.addEventListener(\"pointerdown\", onDown);\n node.addEventListener(\"pointermove\", onMove);\n node.addEventListener(\"pointerup\", cancel);\n node.addEventListener(\"pointercancel\", cancel);\n node.addEventListener(\"pointerleave\", cancel);\n return () => {\n cancel();\n node.removeEventListener(\"pointerdown\", onDown);\n node.removeEventListener(\"pointermove\", onMove);\n node.removeEventListener(\"pointerup\", cancel);\n node.removeEventListener(\"pointercancel\", cancel);\n node.removeEventListener(\"pointerleave\", cancel);\n };\n }, [ref, delay, moveThreshold, fnRef]);\n}\n"],"mappings":"+DAoBA,SAAgB,EACZ,EACA,EACA,EAA+B,CAAC,EAC5B,CACJ,GAAM,CAAE,QAAQ,IAAK,gBAAgB,IAAO,EACtC,EAAQ,EAAA,aAAa,CAAE,GAE7B,EAAA,EAAA,UAAA,KAAgB,CACZ,IAAM,EAAO,EAAI,QACjB,GAAI,CAAC,EAAM,OACX,IAAI,EAA8C,KAC9C,EAAS,EACT,EAAS,EAEP,MAAqB,CACvB,AAEI,KADA,aAAa,CAAK,EACV,KAEhB,EAEM,EAAU,GAA8B,CAC1C,EAAS,EAAM,QACf,EAAS,EAAM,QACf,EAAO,EACP,EAAQ,eAAiB,CACrB,EAAQ,KACR,EAAM,QAAQ,CAClB,EAAG,CAAK,CACZ,EAEM,EAAU,GAA8B,CAC1C,GAAI,IAAU,KAAM,OACpB,IAAM,EAAK,EAAM,QAAU,EACrB,EAAK,EAAM,QAAU,EACvB,KAAK,MAAM,EAAI,CAAE,EAAI,GAAe,EAAO,CACnD,EAOA,OALA,EAAK,iBAAiB,cAAe,CAAM,EAC3C,EAAK,iBAAiB,cAAe,CAAM,EAC3C,EAAK,iBAAiB,YAAa,CAAM,EACzC,EAAK,iBAAiB,gBAAiB,CAAM,EAC7C,EAAK,iBAAiB,eAAgB,CAAM,MAC/B,CACT,EAAO,EACP,EAAK,oBAAoB,cAAe,CAAM,EAC9C,EAAK,oBAAoB,cAAe,CAAM,EAC9C,EAAK,oBAAoB,YAAa,CAAM,EAC5C,EAAK,oBAAoB,gBAAiB,CAAM,EAChD,EAAK,oBAAoB,eAAgB,CAAM,CACnD,CACJ,EAAG,CAAC,EAAK,EAAO,EAAe,CAAK,CAAC,CACzC"}
1
+ {"version":3,"file":"use-long-press.cjs","names":["useLatestRef","require_use_latest_ref","react","useLongPress","options","fnRef","fn","node","ref","timer","startX","startY","cancel","onDown","event","delay","onMove","dx","dy","moveThreshold"],"sources":["../../src/hooks/use-long-press.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { RefObject } from \"react\";\n\nexport interface UseLongPressOptions {\n /** Press duration in ms. Default `500`. */\n delay?: number;\n /** Pixel threshold — finger/mouse movement beyond this cancels the press. Default `10`. */\n moveThreshold?: number;\n}\n\n/**\n * Detect long-press / long-tap gestures. Fires `fn` after `delay` ms\n * while the element is held. Cancels on move beyond `moveThreshold` or\n * pointer up before `delay`.\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * useLongPress(ref, () => openContextMenu(), { delay: 600 });\n */\nexport function useLongPress<T extends HTMLElement>(\n ref: RefObject<T | null>,\n fn: () => void,\n options: UseLongPressOptions = {},\n): void {\n const { delay = 500, moveThreshold = 10 } = options;\n const fnRef = useLatestRef(fn);\n\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let startX = 0;\n let startY = 0;\n\n const cancel = (): void => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const onDown = (event: PointerEvent): void => {\n startX = event.clientX;\n startY = event.clientY;\n cancel();\n timer = setTimeout(() => {\n timer = null;\n fnRef.current();\n }, delay);\n };\n\n const onMove = (event: PointerEvent): void => {\n if (timer === null) return;\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (Math.hypot(dx, dy) > moveThreshold) cancel();\n };\n\n node.addEventListener(\"pointerdown\", onDown);\n node.addEventListener(\"pointermove\", onMove);\n node.addEventListener(\"pointerup\", cancel);\n node.addEventListener(\"pointercancel\", cancel);\n node.addEventListener(\"pointerleave\", cancel);\n return () => {\n cancel();\n node.removeEventListener(\"pointerdown\", onDown);\n node.removeEventListener(\"pointermove\", onMove);\n node.removeEventListener(\"pointerup\", cancel);\n node.removeEventListener(\"pointercancel\", cancel);\n node.removeEventListener(\"pointerleave\", cancel);\n };\n }, [ref, delay, moveThreshold, fnRef]);\n}\n"],"mappings":"A,+DAoBA,SAAgBG,EACZ,EACA,EACA,EAA+B,CAAC,EAC5B,CACJ,GAAM,CAAE,QAAQ,IAAK,gBAAgB,IAAOC,EACtCC,EAAQL,EAAAA,aAAaM,CAAE,GAE7B,EAAAJ,EAAA,UAAA,KAAgB,CACZ,IAAMK,EAAOC,EAAI,QACjB,GAAI,CAACD,EAAM,OACX,IAAIE,EAA8C,KAC9CC,EAAS,EACTC,EAAS,EAEPC,MAAqB,CACvB,AAEIH,KADA,aAAaA,CAAK,EACV,KAEhB,EAEMI,EAAU,GAA8B,CAC1C,EAASC,EAAM,QACf,EAASA,EAAM,QACfF,EAAO,EACP,EAAQ,eAAiB,CACrB,EAAQ,KACRP,EAAM,QAAQ,CAClB,EAAGU,CAAK,CACZ,EAEMC,EAAU,GAA8B,CAC1C,GAAIP,IAAU,KAAM,OACpB,IAAMQ,EAAKH,EAAM,QAAUJ,EACrBQ,EAAKJ,EAAM,QAAUH,EACvB,KAAK,MAAMM,EAAIC,CAAE,EAAIC,GAAeP,EAAO,CACnD,EAOA,OALAL,EAAK,iBAAiB,cAAeM,CAAM,EAC3CN,EAAK,iBAAiB,cAAeS,CAAM,EAC3CT,EAAK,iBAAiB,YAAaK,CAAM,EACzCL,EAAK,iBAAiB,gBAAiBK,CAAM,EAC7CL,EAAK,iBAAiB,eAAgBK,CAAM,MAC/B,CACTA,EAAO,EACPL,EAAK,oBAAoB,cAAeM,CAAM,EAC9CN,EAAK,oBAAoB,cAAeS,CAAM,EAC9CT,EAAK,oBAAoB,YAAaK,CAAM,EAC5CL,EAAK,oBAAoB,gBAAiBK,CAAM,EAChDL,EAAK,oBAAoB,eAAgBK,CAAM,CACnD,CACJ,EAAG,CAACJ,EAAKO,EAAOI,EAAed,CAAK,CAAC,CACzC,C"}