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":"tab-sequence.js","names":[],"sources":["../../src/hooks/tab-sequence.ts"],"sourcesContent":["/** Elements that can take keyboard focus — shared by the focus trap and the portal tab order. */\nexport const FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\n/** A portalled panel and the element of the page it was opened from. */\nexport interface PortalLayer {\n /** Wrapper of the trigger — the spot in the page the panel belongs to. */\n anchor: HTMLElement;\n /** The panel, mounted at the end of `body`. */\n panel: HTMLElement;\n}\n\nconst layers = new Set<PortalLayer>();\n\n/**\n * Declare a portalled panel as belonging to the spot of its anchor.\n *\n * A portal takes the panel out of the subtree it was opened from, so a focus\n * trap around that subtree would see the panel as \"outside\" and pull focus away\n * from it. Registered layers are what {@link tabSequence} and\n * {@link tabRegion} splice back in.\n *\n * @param layer - The anchor and the panel.\n * @returns A function that removes the registration.\n */\nexport function registerPortalLayer(layer: PortalLayer): () => void {\n layers.add(layer);\n return () => {\n layers.delete(layer);\n };\n}\n\n/**\n * The elements `Tab` can stop on inside `root`, in document order.\n *\n * @param root - Where to look.\n * @returns The tabbable descendants that are not disabled, hidden or removed\n * from the tab order.\n */\nexport function tabbables(root: ParentNode): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter((el) => {\n if (el.tabIndex < 0 || el.hasAttribute(\"aria-hidden\")) return false;\n const style = window.getComputedStyle(el);\n return style.display !== \"none\" && style.visibility !== \"hidden\";\n });\n}\n\n/**\n * Split the layers into those opened from inside `root` and the rest.\n *\n * @param root - The subtree the layers are matched against.\n * @param pending - The layers not yet assigned to a subtree.\n * @returns The layers whose anchor lives in `root` (and whose panel does not),\n * and the remaining ones.\n */\nfunction ownedBy(\n root: HTMLElement,\n pending: PortalLayer[],\n): { owned: PortalLayer[]; rest: PortalLayer[] } {\n const owned = pending.filter(\n (layer) => root.contains(layer.anchor) && !root.contains(layer.panel),\n );\n return { owned, rest: pending.filter((layer) => !owned.includes(layer)) };\n}\n\n/**\n * Every subtree focus may sit in while `root` is trapped: `root` itself plus the\n * panels opened from it, transitively (a popover opened from a popover).\n *\n * @param root - The trapped container.\n * @returns `root` followed by the panels that belong to it.\n */\nexport function tabRegion(root: HTMLElement): HTMLElement[] {\n const region: HTMLElement[] = [root];\n let pending = [...layers];\n for (let index = 0; index < region.length; index += 1) {\n const { owned, rest } = ownedBy(region[index]!, pending);\n region.push(...owned.map((layer) => layer.panel));\n pending = rest;\n }\n return region;\n}\n\n/**\n * The order `Tab` walks inside `root`, with each owned portalled panel spliced\n * right after the last stop of its anchor — where it would sit had it rendered\n * in flow. That is the same order `usePortalTabOrder` restores between the\n * trigger and the panel, so the trap wraps at the same ends the user walks.\n *\n * @param root - The trapped container.\n * @param pending - Layers not yet placed; defaults to every registered one.\n * @returns The tab stops of `root` and of its panels, in walking order.\n */\nexport function tabSequence(\n root: HTMLElement,\n pending: PortalLayer[] = [...layers],\n): HTMLElement[] {\n const native = tabbables(root);\n const { owned, rest } = ownedBy(root, pending);\n const inserted = new Map<number, HTMLElement[]>();\n for (const layer of owned) {\n let at = -1;\n native.forEach((el, index) => {\n const precedes =\n (el.compareDocumentPosition(layer.anchor) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0;\n if (precedes || layer.anchor.contains(el)) at = index;\n });\n inserted.set(at, [...(inserted.get(at) ?? []), ...tabSequence(layer.panel, rest)]);\n }\n const sequence: HTMLElement[] = [...(inserted.get(-1) ?? [])];\n native.forEach((el, index) => {\n sequence.push(el, ...(inserted.get(index) ?? []));\n });\n return sequence;\n}\n"],"mappings":";AACA,IAAa,IAAqB;CAC9B;CACA;CACA;CACA;CACA;CACA;AACJ,CAAC,CAAC,KAAK,GAAG,GAUJ,oBAAS,IAAI,IAAiB;AAapC,SAAgB,EAAoB,GAAgC;CAEhE,OADA,EAAO,IAAI,CAAK,SACH;EACT,EAAO,OAAO,CAAK;CACvB;AACJ;AASA,SAAgB,EAAU,GAAiC;CACvD,OAAO,MAAM,KAAK,EAAK,iBAA8B,CAAkB,CAAC,CAAC,CAAC,QAAQ,MAAO;EACrF,IAAI,EAAG,WAAW,KAAK,EAAG,aAAa,aAAa,GAAG,OAAO;EAC9D,IAAM,IAAQ,OAAO,iBAAiB,CAAE;EACxC,OAAO,EAAM,YAAY,UAAU,EAAM,eAAe;CAC5D,CAAC;AACL;AAUA,SAAS,EACL,GACA,GAC6C;CAC7C,IAAM,IAAQ,EAAQ,QACjB,MAAU,EAAK,SAAS,EAAM,MAAM,KAAK,CAAC,EAAK,SAAS,EAAM,KAAK,CACxE;CACA,OAAO;EAAE;EAAO,MAAM,EAAQ,QAAQ,MAAU,CAAC,EAAM,SAAS,CAAK,CAAC;CAAE;AAC5E;AASA,SAAgB,EAAU,GAAkC;CACxD,IAAM,IAAwB,CAAC,CAAI,GAC/B,IAAU,CAAC,GAAG,CAAM;CACxB,KAAK,IAAI,IAAQ,GAAG,IAAQ,EAAO,QAAQ,KAAS,GAAG;EACnD,IAAM,EAAE,UAAO,YAAS,EAAQ,EAAO,IAAS,CAAO;EAEvD,AADA,EAAO,KAAK,GAAG,EAAM,KAAK,MAAU,EAAM,KAAK,CAAC,GAChD,IAAU;CACd;CACA,OAAO;AACX;AAYA,SAAgB,EACZ,GACA,IAAyB,CAAC,GAAG,CAAM,GACtB;CACb,IAAM,IAAS,EAAU,CAAI,GACvB,EAAE,UAAO,YAAS,EAAQ,GAAM,CAAO,GACvC,oBAAW,IAAI,IAA2B;CAChD,KAAK,IAAM,KAAS,GAAO;EACvB,IAAI,IAAK;EAMT,AALA,EAAO,SAAS,GAAI,MAAU;GAG1B,EADK,EAAG,wBAAwB,EAAM,MAAM,IAAI,KAAK,iCAAiC,KACtE,EAAM,OAAO,SAAS,CAAE,OAAG,IAAK;EACpD,CAAC,GACD,EAAS,IAAI,GAAI,CAAC,GAAI,EAAS,IAAI,CAAE,KAAK,CAAC,GAAI,GAAG,EAAY,EAAM,OAAO,CAAI,CAAC,CAAC;CACrF;CACA,IAAM,IAA0B,CAAC,GAAI,EAAS,IAAI,EAAE,KAAK,CAAC,CAAE;CAI5D,OAHA,EAAO,SAAS,GAAI,MAAU;EAC1B,EAAS,KAAK,GAAI,GAAI,EAAS,IAAI,CAAK,KAAK,CAAC,CAAE;CACpD,CAAC,GACM;AACX"}
1
+ {"version":3,"file":"tab-sequence.js","names":["FOCUSABLE_SELECTOR","layers","registerPortalLayer","layer","tabbables","root","el","style","ownedBy","owned","pending","tabRegion","region","index","rest","tabSequence","native","inserted","at","sequence"],"sources":["../../src/hooks/tab-sequence.ts"],"sourcesContent":["/** Elements that can take keyboard focus — shared by the focus trap and the portal tab order. */\nexport const FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"textarea:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\n/** A portalled panel and the element of the page it was opened from. */\nexport interface PortalLayer {\n /** Wrapper of the trigger — the spot in the page the panel belongs to. */\n anchor: HTMLElement;\n /** The panel, mounted at the end of `body`. */\n panel: HTMLElement;\n}\n\nconst layers = new Set<PortalLayer>();\n\n/**\n * Declare a portalled panel as belonging to the spot of its anchor.\n *\n * A portal takes the panel out of the subtree it was opened from, so a focus\n * trap around that subtree would see the panel as \"outside\" and pull focus away\n * from it. Registered layers are what {@link tabSequence} and\n * {@link tabRegion} splice back in.\n *\n * @param layer - The anchor and the panel.\n * @returns A function that removes the registration.\n */\nexport function registerPortalLayer(layer: PortalLayer): () => void {\n layers.add(layer);\n return () => {\n layers.delete(layer);\n };\n}\n\n/**\n * The elements `Tab` can stop on inside `root`, in document order.\n *\n * @param root - Where to look.\n * @returns The tabbable descendants that are not disabled, hidden or removed\n * from the tab order.\n */\nexport function tabbables(root: ParentNode): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter((el) => {\n if (el.tabIndex < 0 || el.hasAttribute(\"aria-hidden\")) return false;\n const style = window.getComputedStyle(el);\n return style.display !== \"none\" && style.visibility !== \"hidden\";\n });\n}\n\n/**\n * Split the layers into those opened from inside `root` and the rest.\n *\n * @param root - The subtree the layers are matched against.\n * @param pending - The layers not yet assigned to a subtree.\n * @returns The layers whose anchor lives in `root` (and whose panel does not),\n * and the remaining ones.\n */\nfunction ownedBy(\n root: HTMLElement,\n pending: PortalLayer[],\n): { owned: PortalLayer[]; rest: PortalLayer[] } {\n const owned = pending.filter(\n (layer) => root.contains(layer.anchor) && !root.contains(layer.panel),\n );\n return { owned, rest: pending.filter((layer) => !owned.includes(layer)) };\n}\n\n/**\n * Every subtree focus may sit in while `root` is trapped: `root` itself plus the\n * panels opened from it, transitively (a popover opened from a popover).\n *\n * @param root - The trapped container.\n * @returns `root` followed by the panels that belong to it.\n */\nexport function tabRegion(root: HTMLElement): HTMLElement[] {\n const region: HTMLElement[] = [root];\n let pending = [...layers];\n for (let index = 0; index < region.length; index += 1) {\n const { owned, rest } = ownedBy(region[index]!, pending);\n region.push(...owned.map((layer) => layer.panel));\n pending = rest;\n }\n return region;\n}\n\n/**\n * The order `Tab` walks inside `root`, with each owned portalled panel spliced\n * right after the last stop of its anchor — where it would sit had it rendered\n * in flow. That is the same order `usePortalTabOrder` restores between the\n * trigger and the panel, so the trap wraps at the same ends the user walks.\n *\n * @param root - The trapped container.\n * @param pending - Layers not yet placed; defaults to every registered one.\n * @returns The tab stops of `root` and of its panels, in walking order.\n */\nexport function tabSequence(\n root: HTMLElement,\n pending: PortalLayer[] = [...layers],\n): HTMLElement[] {\n const native = tabbables(root);\n const { owned, rest } = ownedBy(root, pending);\n const inserted = new Map<number, HTMLElement[]>();\n for (const layer of owned) {\n let at = -1;\n native.forEach((el, index) => {\n const precedes =\n (el.compareDocumentPosition(layer.anchor) & Node.DOCUMENT_POSITION_FOLLOWING) !== 0;\n if (precedes || layer.anchor.contains(el)) at = index;\n });\n inserted.set(at, [...(inserted.get(at) ?? []), ...tabSequence(layer.panel, rest)]);\n }\n const sequence: HTMLElement[] = [...(inserted.get(-1) ?? [])];\n native.forEach((el, index) => {\n sequence.push(el, ...(inserted.get(index) ?? []));\n });\n return sequence;\n}\n"],"mappings":";AACA,IAAaA,IAAqB;CAC9B;CACA;CACA;CACA;CACA;CACA;AACJ,CAAC,CAAC,KAAK,GAAG,GAUJC,oBAAS,IAAI,IAAiB;AAapC,SAAgBC,EAAoB,GAAgC;CAEhE,OADAD,EAAO,IAAIE,CAAK,SACH;EACT,EAAO,OAAOA,CAAK;CACvB;AACJ;AASA,SAAgBC,EAAU,GAAiC;CACvD,OAAO,MAAM,KAAKC,EAAK,iBAA8BL,CAAkB,CAAC,CAAC,CAAC,QAAQ,MAAO;EACrF,IAAIM,EAAG,WAAW,KAAKA,EAAG,aAAa,aAAa,GAAG,OAAO;EAC9D,IAAMC,IAAQ,OAAO,iBAAiBD,CAAE;EACxC,OAAOC,EAAM,YAAY,UAAUA,EAAM,eAAe;CAC5D,CAAC;AACL;AAUA,SAASC,EACL,GACA,GAC6C;CAC7C,IAAMC,IAAQC,EAAQ,QACjB,MAAUL,EAAK,SAASF,EAAM,MAAM,KAAK,CAACE,EAAK,SAASF,EAAM,KAAK,CACxE;CACA,OAAO;EAAE;EAAO,MAAMO,EAAQ,QAAQ,MAAU,CAACD,EAAM,SAASN,CAAK,CAAC;CAAE;AAC5E;AASA,SAAgBQ,EAAU,GAAkC;CACxD,IAAMC,IAAwB,CAACP,CAAI,GAC/BK,IAAU,CAAC,GAAGT,CAAM;CACxB,KAAK,IAAIY,IAAQ,GAAGA,IAAQD,EAAO,QAAQ,KAAS,GAAG;EACnD,IAAM,EAAE,UAAO,YAASJ,EAAQI,EAAOC,IAASH,CAAO;EAEvD,AADAE,EAAO,KAAK,GAAGH,EAAM,KAAK,MAAUN,EAAM,KAAK,CAAC,GAChD,IAAUW;CACd;CACA,OAAOF;AACX;AAYA,SAAgBG,EACZ,GACA,IAAyB,CAAC,GAAGd,CAAM,GACtB;CACb,IAAMe,IAASZ,EAAUC,CAAI,GACvB,EAAE,UAAO,YAASG,EAAQH,GAAMK,CAAO,GACvCO,oBAAW,IAAI,IAA2B;CAChD,KAAK,IAAMd,KAASM,GAAO;EACvB,IAAIS,IAAK;EAMT,AALAF,EAAO,SAAS,GAAI,MAAU;GAG1B,EADKV,EAAG,wBAAwBH,EAAM,MAAM,IAAI,KAAK,iCAAiC,KACtEA,EAAM,OAAO,SAASG,CAAE,OAAG,IAAKO;EACpD,CAAC,GACDI,EAAS,IAAIC,GAAI,CAAC,GAAID,EAAS,IAAIC,CAAE,KAAK,CAAC,GAAI,GAAGH,EAAYZ,EAAM,OAAOW,CAAI,CAAC,CAAC;CACrF;CACA,IAAMK,IAA0B,CAAC,GAAIF,EAAS,IAAI,EAAE,KAAK,CAAC,CAAE;CAI5D,OAHAD,EAAO,SAAS,GAAI,MAAU;EAC1B,EAAS,KAAKV,GAAI,GAAIW,EAAS,IAAIJ,CAAK,KAAK,CAAC,CAAE;CACpD,CAAC,GACMM;AACX"}
@@ -1,2 +1,2 @@
1
- let e=require("react");var t=7e3,n={position:`absolute`,width:`1px`,height:`1px`,margin:`-1px`,padding:`0`,border:`0`,overflow:`hidden`,clip:`rect(0 0 0 0)`,clipPath:`inset(50%)`,whiteSpace:`nowrap`},r=null,i=new Set;function a(e){let t=document.createElement(`div`);return e===`polite`&&t.setAttribute(`role`,`status`),t.setAttribute(`aria-live`,e),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(`data-tempest-announcer`,e),Object.assign(t.style,n),document.body.appendChild(t),t}function o(){return typeof document>`u`?null:r&&r.polite.isConnected&&r.assertive.isConnected?r:(r?.polite.remove(),r?.assertive.remove(),r={polite:a(`polite`),assertive:a(`assertive`)},r)}function s(e,n=`polite`){if(!e)return;let r=o();if(!r)return;let a=n===`assertive`?r.assertive:r.polite;a.replaceChildren();let s=document.createElement(`div`);s.textContent=e,a.appendChild(s);let c=setTimeout(()=>{i.delete(c),s.isConnected&&s.remove()},t);i.add(c)}function c(){for(let e of i)clearTimeout(e);i.clear(),r?.polite.remove(),r?.assertive.remove(),r=null}function l(){return(0,e.useEffect)(()=>{o()},[]),(0,e.useCallback)((e,t=`polite`)=>s(e,t),[])}exports.announce=s,exports.clearAnnouncer=c,exports.useAnnounce=l;
1
+ let e=require("react");var t=7e3,n={position:`absolute`,width:`1px`,height:`1px`,margin:`-1px`,padding:`0`,border:`0`,overflow:`hidden`,clip:`rect(0 0 0 0)`,clipPath:`inset(50%)`,whiteSpace:`nowrap`},r=null,i=new Set;function a(e){let t=document.createElement(`div`);return e===`polite`&&t.setAttribute(`role`,`status`),t.setAttribute(`aria-live`,e),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(`data-tempest-announcer`,e),Object.assign(t.style,n),document.body.appendChild(t),t}function o(){return typeof document>`u`?null:(r&&r.polite.isConnected&&r.assertive.isConnected||(r?.polite.remove(),r?.assertive.remove(),r={polite:a(`polite`),assertive:a(`assertive`)}),r)}function s(e,n=`polite`){if(!e)return;let r=o();if(!r)return;let a=n===`assertive`?r.assertive:r.polite;a.replaceChildren();let s=document.createElement(`div`);s.textContent=e,a.appendChild(s);let c=setTimeout(()=>{i.delete(c),s.isConnected&&s.remove()},t);i.add(c)}function c(){for(let e of i)clearTimeout(e);i.clear(),r?.polite.remove(),r?.assertive.remove(),r=null}function l(){return(0,e.useEffect)(()=>{o()},[]),(0,e.useCallback)((e,t=`polite`)=>s(e,t),[])}exports.announce=s,exports.clearAnnouncer=c,exports.useAnnounce=l;
2
2
  //# sourceMappingURL=use-announce.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-announce.cjs","names":[],"sources":["../../src/hooks/use-announce.ts"],"sourcesContent":["import { useCallback, useEffect } from \"react\";\n\n/**\n * How urgently a screen reader should interrupt.\n *\n * `\"polite\"` waits for a pause in what is being read. `\"assertive\"` cuts in\n * immediately, which is right for an error the user must act on and wrong for\n * everything else — an assertive announcement can truncate the sentence the user\n * was in the middle of.\n */\nexport type AnnouncePoliteness = \"polite\" | \"assertive\";\n\n/** How long an announcement stays in the DOM before it is cleaned up. */\nconst CLEAR_AFTER_MS = 7_000;\n\n/**\n * Inline styles that hide an element visually while leaving it readable.\n *\n * Inline and not a CSS module on purpose: these nodes are created imperatively by\n * a hook, and a hook that only works when the app remembered to import\n * `tempest-react-sdk/styles.css` would drop two visible, unstyled paragraphs into\n * the page — a visual bug caused by an accessibility feature.\n */\nconst HIDDEN_STYLE: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n margin: \"-1px\",\n padding: \"0\",\n border: \"0\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n};\n\ninterface Regions {\n polite: HTMLElement;\n assertive: HTMLElement;\n}\n\nlet regions: Regions | null = null;\nconst timers = new Set<ReturnType<typeof setTimeout>>();\n\n/**\n * Build one live region.\n *\n * The polite region carries `role=\"status\"`; the assertive one carries only\n * `aria-live=\"assertive\"`. `role=\"alert\"` is deliberately **not** used: these\n * regions live in the document for the page's whole life, and an empty element\n * claiming to be an alert is both a lie about its content and a trap for every\n * `getByRole(\"alert\")` in a consuming app's test suite, which would suddenly match\n * two nodes. A bare `aria-live` region is announced by every screen reader that\n * supports live regions at all.\n *\n * @param politeness - Which region to build.\n * @returns The region, already appended to `<body>`.\n */\nfunction createRegion(politeness: AnnouncePoliteness): HTMLElement {\n const node = document.createElement(\"div\");\n if (politeness === \"polite\") node.setAttribute(\"role\", \"status\");\n node.setAttribute(\"aria-live\", politeness);\n node.setAttribute(\"aria-atomic\", \"true\");\n node.setAttribute(\"data-tempest-announcer\", politeness);\n Object.assign(node.style, HIDDEN_STYLE);\n document.body.appendChild(node);\n return node;\n}\n\n/**\n * Get the two shared live regions, creating them on first use.\n *\n * **Two regions, not one with a switchable `aria-live`.** Politeness is a property\n * of the region, read when the assistive technology first registers it — flipping\n * the attribute later is honoured by some screen readers, ignored by others, and\n * in the worst case drops the announcement entirely. Two regions that never change\n * are the only version that behaves the same everywhere.\n *\n * **Shared, not one per component.** Every live region on the page is polled;\n * several of them mutating at once is how announcements get dropped or doubled.\n * One pair per document keeps the order deterministic.\n *\n * A pair is replaced as a **pair**, discarding the old one: if only one region was\n * torn out of the DOM (a router that replaced `<body>`, a micro-frontend unmount),\n * keeping its still-attached sibling would leave two regions of that politeness on\n * the page — the exact duplication the shared pair exists to prevent.\n *\n * @returns The polite and assertive regions, or `null` outside a document.\n */\nfunction ensureRegions(): Regions | null {\n if (typeof document === \"undefined\") return null;\n if (regions && regions.polite.isConnected && regions.assertive.isConnected) return regions;\n regions?.polite.remove();\n regions?.assertive.remove();\n regions = { polite: createRegion(\"polite\"), assertive: createRegion(\"assertive\") };\n return regions;\n}\n\n/**\n * Announce a message to screen readers, from anywhere — a hook, an event handler,\n * a plain function outside React.\n *\n * ## Why the same string announces twice\n *\n * Screen readers announce a live region when its **content changes**. Writing the\n * same text again is not a change, so \"Item removido\" twice in a row is read once —\n * the classic reason these announcers are quietly broken. Instead of mutating text,\n * every call replaces the region's child with a **new element**. The DOM mutation is\n * real even when the string is identical, so the second announcement happens, and\n * the reader hears the exact message with no padding characters bolted on.\n *\n * @param message - Text to read out. Empty strings are ignored.\n * @param politeness - `\"polite\"` (default) or `\"assertive\"`.\n *\n * @example\n * announce(`${count} pedidos encontrados`);\n * announce(\"Falha ao salvar\", \"assertive\");\n */\nexport function announce(message: string, politeness: AnnouncePoliteness = \"polite\"): void {\n if (!message) return;\n const pair = ensureRegions();\n if (!pair) return;\n\n const region = politeness === \"assertive\" ? pair.assertive : pair.polite;\n region.replaceChildren();\n const item = document.createElement(\"div\");\n item.textContent = message;\n region.appendChild(item);\n\n const timer = setTimeout(() => {\n timers.delete(timer);\n if (item.isConnected) item.remove();\n }, CLEAR_AFTER_MS);\n timers.add(timer);\n}\n\n/**\n * Remove the shared regions and cancel pending cleanups.\n *\n * For test teardown and for a micro-frontend being unmounted from a page it does\n * not own. Regular apps never need it — two empty hidden `div`s cost nothing, and\n * tearing them down while another component still announces would lose messages.\n */\nexport function clearAnnouncer(): void {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n regions?.polite.remove();\n regions?.assertive.remove();\n regions = null;\n}\n\n/**\n * Announce transient messages to screen readers through one shared live region\n * pair.\n *\n * Reach for this when something happened that a sighted user can see and a screen\n * reader user cannot: a filter narrowed a list, a row saved, a copy succeeded, an\n * upload failed. It is **not** for content that is already on screen inside a\n * region with a role — a status pill, a toast that renders as `role=\"status\"`,\n * a form error tied to its input — announcing those again reads them twice.\n *\n * !!! warning \"Never wrap streaming text in a live region\"\n * A live region over text that grows token by token makes the reader start the\n * whole answer again on every token. Announce the **edges** instead — \"gerando\n * resposta\" and \"resposta concluída\" — and leave the transcript in a plain\n * `role=\"log\"` the user reads at their own pace. `AIChat` does exactly that.\n *\n * Mounting the hook creates the regions even before the first message. That is not\n * tidiness: a live region inserted into the DOM in the same frame as its first\n * content routinely loses that announcement, because the assistive technology has\n * to have registered the region before it can notice a change inside it.\n *\n * @returns A stable `announce(message, politeness?)` function.\n *\n * @example\n * const announce = useAnnounce();\n *\n * function onFilter(rows: Row[]) {\n * announce(`${rows.length} resultados`);\n * }\n */\nexport function useAnnounce(): (message: string, politeness?: AnnouncePoliteness) => void {\n useEffect(() => {\n ensureRegions();\n }, []);\n\n return useCallback(\n (message: string, politeness: AnnouncePoliteness = \"polite\") =>\n announce(message, politeness),\n [],\n );\n}\n"],"mappings":"uBAaA,IAAM,EAAiB,IAUjB,EAA6C,CAC/C,SAAU,WACV,MAAO,MACP,OAAQ,MACR,OAAQ,OACR,QAAS,IACT,OAAQ,IACR,SAAU,SACV,KAAM,gBACN,SAAU,aACV,WAAY,QAChB,EAOI,EAA0B,KACxB,EAAS,IAAI,IAgBnB,SAAS,EAAa,EAA6C,CAC/D,IAAM,EAAO,SAAS,cAAc,KAAK,EAOzC,OANI,IAAe,UAAU,EAAK,aAAa,OAAQ,QAAQ,EAC/D,EAAK,aAAa,YAAa,CAAU,EACzC,EAAK,aAAa,cAAe,MAAM,EACvC,EAAK,aAAa,yBAA0B,CAAU,EACtD,OAAO,OAAO,EAAK,MAAO,CAAY,EACtC,SAAS,KAAK,YAAY,CAAI,EACvB,CACX,CAsBA,SAAS,GAAgC,CAMrC,OALI,OAAO,SAAa,IAAoB,KACxC,GAAW,EAAQ,OAAO,aAAe,EAAQ,UAAU,YAAoB,GACnF,GAAS,OAAO,OAAO,EACvB,GAAS,UAAU,OAAO,EAC1B,EAAU,CAAE,OAAQ,EAAa,QAAQ,EAAG,UAAW,EAAa,WAAW,CAAE,EAC1E,EACX,CAsBA,SAAgB,EAAS,EAAiB,EAAiC,SAAgB,CACvF,GAAI,CAAC,EAAS,OACd,IAAM,EAAO,EAAc,EAC3B,GAAI,CAAC,EAAM,OAEX,IAAM,EAAS,IAAe,YAAc,EAAK,UAAY,EAAK,OAClE,EAAO,gBAAgB,EACvB,IAAM,EAAO,SAAS,cAAc,KAAK,EACzC,EAAK,YAAc,EACnB,EAAO,YAAY,CAAI,EAEvB,IAAM,EAAQ,eAAiB,CAC3B,EAAO,OAAO,CAAK,EACf,EAAK,aAAa,EAAK,OAAO,CACtC,EAAG,CAAc,EACjB,EAAO,IAAI,CAAK,CACpB,CASA,SAAgB,GAAuB,CACnC,IAAK,IAAM,KAAS,EAAQ,aAAa,CAAK,EAC9C,EAAO,MAAM,EACb,GAAS,OAAO,OAAO,EACvB,GAAS,UAAU,OAAO,EAC1B,EAAU,IACd,CAgCA,SAAgB,GAA0E,CAKtF,OAJA,EAAA,EAAA,UAAA,KAAgB,CACZ,EAAc,CAClB,EAAG,CAAC,CAAC,GAEL,EAAO,EAAA,YAAA,EACF,EAAiB,EAAiC,WAC/C,EAAS,EAAS,CAAU,EAChC,CAAC,CACL,CACJ"}
1
+ {"version":3,"file":"use-announce.cjs","names":["useCallback","react","CLEAR_AFTER_MS","HIDDEN_STYLE","regions","timers","createRegion","node","politeness","ensureRegions","announce","message","pair","region","item","timer","clearAnnouncer","useAnnounce"],"sources":["../../src/hooks/use-announce.ts"],"sourcesContent":["import { useCallback, useEffect } from \"react\";\n\n/**\n * How urgently a screen reader should interrupt.\n *\n * `\"polite\"` waits for a pause in what is being read. `\"assertive\"` cuts in\n * immediately, which is right for an error the user must act on and wrong for\n * everything else — an assertive announcement can truncate the sentence the user\n * was in the middle of.\n */\nexport type AnnouncePoliteness = \"polite\" | \"assertive\";\n\n/** How long an announcement stays in the DOM before it is cleaned up. */\nconst CLEAR_AFTER_MS = 7_000;\n\n/**\n * Inline styles that hide an element visually while leaving it readable.\n *\n * Inline and not a CSS module on purpose: these nodes are created imperatively by\n * a hook, and a hook that only works when the app remembered to import\n * `tempest-react-sdk/styles.css` would drop two visible, unstyled paragraphs into\n * the page — a visual bug caused by an accessibility feature.\n */\nconst HIDDEN_STYLE: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n margin: \"-1px\",\n padding: \"0\",\n border: \"0\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n};\n\ninterface Regions {\n polite: HTMLElement;\n assertive: HTMLElement;\n}\n\nlet regions: Regions | null = null;\nconst timers = new Set<ReturnType<typeof setTimeout>>();\n\n/**\n * Build one live region.\n *\n * The polite region carries `role=\"status\"`; the assertive one carries only\n * `aria-live=\"assertive\"`. `role=\"alert\"` is deliberately **not** used: these\n * regions live in the document for the page's whole life, and an empty element\n * claiming to be an alert is both a lie about its content and a trap for every\n * `getByRole(\"alert\")` in a consuming app's test suite, which would suddenly match\n * two nodes. A bare `aria-live` region is announced by every screen reader that\n * supports live regions at all.\n *\n * @param politeness - Which region to build.\n * @returns The region, already appended to `<body>`.\n */\nfunction createRegion(politeness: AnnouncePoliteness): HTMLElement {\n const node = document.createElement(\"div\");\n if (politeness === \"polite\") node.setAttribute(\"role\", \"status\");\n node.setAttribute(\"aria-live\", politeness);\n node.setAttribute(\"aria-atomic\", \"true\");\n node.setAttribute(\"data-tempest-announcer\", politeness);\n Object.assign(node.style, HIDDEN_STYLE);\n document.body.appendChild(node);\n return node;\n}\n\n/**\n * Get the two shared live regions, creating them on first use.\n *\n * **Two regions, not one with a switchable `aria-live`.** Politeness is a property\n * of the region, read when the assistive technology first registers it — flipping\n * the attribute later is honoured by some screen readers, ignored by others, and\n * in the worst case drops the announcement entirely. Two regions that never change\n * are the only version that behaves the same everywhere.\n *\n * **Shared, not one per component.** Every live region on the page is polled;\n * several of them mutating at once is how announcements get dropped or doubled.\n * One pair per document keeps the order deterministic.\n *\n * A pair is replaced as a **pair**, discarding the old one: if only one region was\n * torn out of the DOM (a router that replaced `<body>`, a micro-frontend unmount),\n * keeping its still-attached sibling would leave two regions of that politeness on\n * the page — the exact duplication the shared pair exists to prevent.\n *\n * @returns The polite and assertive regions, or `null` outside a document.\n */\nfunction ensureRegions(): Regions | null {\n if (typeof document === \"undefined\") return null;\n if (regions && regions.polite.isConnected && regions.assertive.isConnected) return regions;\n regions?.polite.remove();\n regions?.assertive.remove();\n regions = { polite: createRegion(\"polite\"), assertive: createRegion(\"assertive\") };\n return regions;\n}\n\n/**\n * Announce a message to screen readers, from anywhere — a hook, an event handler,\n * a plain function outside React.\n *\n * ## Why the same string announces twice\n *\n * Screen readers announce a live region when its **content changes**. Writing the\n * same text again is not a change, so \"Item removido\" twice in a row is read once —\n * the classic reason these announcers are quietly broken. Instead of mutating text,\n * every call replaces the region's child with a **new element**. The DOM mutation is\n * real even when the string is identical, so the second announcement happens, and\n * the reader hears the exact message with no padding characters bolted on.\n *\n * @param message - Text to read out. Empty strings are ignored.\n * @param politeness - `\"polite\"` (default) or `\"assertive\"`.\n *\n * @example\n * announce(`${count} pedidos encontrados`);\n * announce(\"Falha ao salvar\", \"assertive\");\n */\nexport function announce(message: string, politeness: AnnouncePoliteness = \"polite\"): void {\n if (!message) return;\n const pair = ensureRegions();\n if (!pair) return;\n\n const region = politeness === \"assertive\" ? pair.assertive : pair.polite;\n region.replaceChildren();\n const item = document.createElement(\"div\");\n item.textContent = message;\n region.appendChild(item);\n\n const timer = setTimeout(() => {\n timers.delete(timer);\n if (item.isConnected) item.remove();\n }, CLEAR_AFTER_MS);\n timers.add(timer);\n}\n\n/**\n * Remove the shared regions and cancel pending cleanups.\n *\n * For test teardown and for a micro-frontend being unmounted from a page it does\n * not own. Regular apps never need it — two empty hidden `div`s cost nothing, and\n * tearing them down while another component still announces would lose messages.\n */\nexport function clearAnnouncer(): void {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n regions?.polite.remove();\n regions?.assertive.remove();\n regions = null;\n}\n\n/**\n * Announce transient messages to screen readers through one shared live region\n * pair.\n *\n * Reach for this when something happened that a sighted user can see and a screen\n * reader user cannot: a filter narrowed a list, a row saved, a copy succeeded, an\n * upload failed. It is **not** for content that is already on screen inside a\n * region with a role — a status pill, a toast that renders as `role=\"status\"`,\n * a form error tied to its input — announcing those again reads them twice.\n *\n * !!! warning \"Never wrap streaming text in a live region\"\n * A live region over text that grows token by token makes the reader start the\n * whole answer again on every token. Announce the **edges** instead — \"gerando\n * resposta\" and \"resposta concluída\" — and leave the transcript in a plain\n * `role=\"log\"` the user reads at their own pace. `AIChat` does exactly that.\n *\n * Mounting the hook creates the regions even before the first message. That is not\n * tidiness: a live region inserted into the DOM in the same frame as its first\n * content routinely loses that announcement, because the assistive technology has\n * to have registered the region before it can notice a change inside it.\n *\n * @returns A stable `announce(message, politeness?)` function.\n *\n * @example\n * const announce = useAnnounce();\n *\n * function onFilter(rows: Row[]) {\n * announce(`${rows.length} resultados`);\n * }\n */\nexport function useAnnounce(): (message: string, politeness?: AnnouncePoliteness) => void {\n useEffect(() => {\n ensureRegions();\n }, []);\n\n return useCallback(\n (message: string, politeness: AnnouncePoliteness = \"polite\") =>\n announce(message, politeness),\n [],\n );\n}\n"],"mappings":"A,uBAaA,IAAME,EAAiB,IAUjBC,EAA6C,CAC/C,SAAU,WACV,MAAO,MACP,OAAQ,MACR,OAAQ,OACR,QAAS,IACT,OAAQ,IACR,SAAU,SACV,KAAM,gBACN,SAAU,aACV,WAAY,QAChB,EAOIC,EAA0B,KACxBC,EAAS,IAAI,IAgBnB,SAASC,EAAa,EAA6C,CAC/D,IAAMC,EAAO,SAAS,cAAc,KAAK,EAOzC,OANIC,IAAe,UAAUD,EAAK,aAAa,OAAQ,QAAQ,EAC/DA,EAAK,aAAa,YAAaC,CAAU,EACzCD,EAAK,aAAa,cAAe,MAAM,EACvCA,EAAK,aAAa,yBAA0BC,CAAU,EACtD,OAAO,OAAOD,EAAK,MAAOJ,CAAY,EACtC,SAAS,KAAK,YAAYI,CAAI,EACvBA,CACX,CAsBA,SAASE,GAAgC,CAMrC,OALI,OAAO,SAAa,IAAoB,MACxCL,GAAWA,EAAQ,OAAO,aAAeA,EAAQ,UAAU,cAC/DA,GAAS,OAAO,OAAO,EACvBA,GAAS,UAAU,OAAO,EAC1B,EAAU,CAAE,OAAQE,EAAa,QAAQ,EAAG,UAAWA,EAAa,WAAW,CAAE,GAC1EF,EACX,CAsBA,SAAgBM,EAAS,EAAiB,EAAiC,SAAgB,CACvF,GAAI,CAACC,EAAS,OACd,IAAMC,EAAOH,EAAc,EAC3B,GAAI,CAACG,EAAM,OAEX,IAAMC,EAASL,IAAe,YAAcI,EAAK,UAAYA,EAAK,OAClEC,EAAO,gBAAgB,EACvB,IAAMC,EAAO,SAAS,cAAc,KAAK,EACzC,EAAK,YAAcH,EACnBE,EAAO,YAAYC,CAAI,EAEvB,IAAMC,EAAQ,eAAiB,CAC3BV,EAAO,OAAOU,CAAK,EACfD,EAAK,aAAaA,EAAK,OAAO,CACtC,EAAGZ,CAAc,EACjBG,EAAO,IAAIU,CAAK,CACpB,CASA,SAAgBC,GAAuB,CACnC,IAAK,IAAMD,KAASV,EAAQ,aAAaU,CAAK,EAC9CV,EAAO,MAAM,EACbD,GAAS,OAAO,OAAO,EACvBA,GAAS,UAAU,OAAO,EAC1B,EAAU,IACd,CAgCA,SAAgBa,GAA0E,CAKtF,OAJA,EAAAhB,EAAA,UAAA,KAAgB,CACZQ,EAAc,CAClB,EAAG,CAAC,CAAC,GAEL,EAAOT,EAAAA,YAAAA,EACF,EAAiB,EAAiC,WAC/CU,EAASC,EAASH,CAAU,EAChC,CAAC,CACL,CACJ,C"}
@@ -17,10 +17,10 @@ function o(e) {
17
17
  return e === "polite" && t.setAttribute("role", "status"), t.setAttribute("aria-live", e), t.setAttribute("aria-atomic", "true"), t.setAttribute("data-tempest-announcer", e), Object.assign(t.style, r), document.body.appendChild(t), t;
18
18
  }
19
19
  function s() {
20
- return typeof document > "u" ? null : i && i.polite.isConnected && i.assertive.isConnected ? i : (i?.polite.remove(), i?.assertive.remove(), i = {
20
+ return typeof document > "u" ? null : (i && i.polite.isConnected && i.assertive.isConnected || (i?.polite.remove(), i?.assertive.remove(), i = {
21
21
  polite: o("polite"),
22
22
  assertive: o("assertive")
23
- }, i);
23
+ }), i);
24
24
  }
25
25
  function c(e, t = "polite") {
26
26
  if (!e) return;
@@ -1 +1 @@
1
- {"version":3,"file":"use-announce.js","names":[],"sources":["../../src/hooks/use-announce.ts"],"sourcesContent":["import { useCallback, useEffect } from \"react\";\n\n/**\n * How urgently a screen reader should interrupt.\n *\n * `\"polite\"` waits for a pause in what is being read. `\"assertive\"` cuts in\n * immediately, which is right for an error the user must act on and wrong for\n * everything else — an assertive announcement can truncate the sentence the user\n * was in the middle of.\n */\nexport type AnnouncePoliteness = \"polite\" | \"assertive\";\n\n/** How long an announcement stays in the DOM before it is cleaned up. */\nconst CLEAR_AFTER_MS = 7_000;\n\n/**\n * Inline styles that hide an element visually while leaving it readable.\n *\n * Inline and not a CSS module on purpose: these nodes are created imperatively by\n * a hook, and a hook that only works when the app remembered to import\n * `tempest-react-sdk/styles.css` would drop two visible, unstyled paragraphs into\n * the page — a visual bug caused by an accessibility feature.\n */\nconst HIDDEN_STYLE: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n margin: \"-1px\",\n padding: \"0\",\n border: \"0\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n};\n\ninterface Regions {\n polite: HTMLElement;\n assertive: HTMLElement;\n}\n\nlet regions: Regions | null = null;\nconst timers = new Set<ReturnType<typeof setTimeout>>();\n\n/**\n * Build one live region.\n *\n * The polite region carries `role=\"status\"`; the assertive one carries only\n * `aria-live=\"assertive\"`. `role=\"alert\"` is deliberately **not** used: these\n * regions live in the document for the page's whole life, and an empty element\n * claiming to be an alert is both a lie about its content and a trap for every\n * `getByRole(\"alert\")` in a consuming app's test suite, which would suddenly match\n * two nodes. A bare `aria-live` region is announced by every screen reader that\n * supports live regions at all.\n *\n * @param politeness - Which region to build.\n * @returns The region, already appended to `<body>`.\n */\nfunction createRegion(politeness: AnnouncePoliteness): HTMLElement {\n const node = document.createElement(\"div\");\n if (politeness === \"polite\") node.setAttribute(\"role\", \"status\");\n node.setAttribute(\"aria-live\", politeness);\n node.setAttribute(\"aria-atomic\", \"true\");\n node.setAttribute(\"data-tempest-announcer\", politeness);\n Object.assign(node.style, HIDDEN_STYLE);\n document.body.appendChild(node);\n return node;\n}\n\n/**\n * Get the two shared live regions, creating them on first use.\n *\n * **Two regions, not one with a switchable `aria-live`.** Politeness is a property\n * of the region, read when the assistive technology first registers it — flipping\n * the attribute later is honoured by some screen readers, ignored by others, and\n * in the worst case drops the announcement entirely. Two regions that never change\n * are the only version that behaves the same everywhere.\n *\n * **Shared, not one per component.** Every live region on the page is polled;\n * several of them mutating at once is how announcements get dropped or doubled.\n * One pair per document keeps the order deterministic.\n *\n * A pair is replaced as a **pair**, discarding the old one: if only one region was\n * torn out of the DOM (a router that replaced `<body>`, a micro-frontend unmount),\n * keeping its still-attached sibling would leave two regions of that politeness on\n * the page — the exact duplication the shared pair exists to prevent.\n *\n * @returns The polite and assertive regions, or `null` outside a document.\n */\nfunction ensureRegions(): Regions | null {\n if (typeof document === \"undefined\") return null;\n if (regions && regions.polite.isConnected && regions.assertive.isConnected) return regions;\n regions?.polite.remove();\n regions?.assertive.remove();\n regions = { polite: createRegion(\"polite\"), assertive: createRegion(\"assertive\") };\n return regions;\n}\n\n/**\n * Announce a message to screen readers, from anywhere — a hook, an event handler,\n * a plain function outside React.\n *\n * ## Why the same string announces twice\n *\n * Screen readers announce a live region when its **content changes**. Writing the\n * same text again is not a change, so \"Item removido\" twice in a row is read once —\n * the classic reason these announcers are quietly broken. Instead of mutating text,\n * every call replaces the region's child with a **new element**. The DOM mutation is\n * real even when the string is identical, so the second announcement happens, and\n * the reader hears the exact message with no padding characters bolted on.\n *\n * @param message - Text to read out. Empty strings are ignored.\n * @param politeness - `\"polite\"` (default) or `\"assertive\"`.\n *\n * @example\n * announce(`${count} pedidos encontrados`);\n * announce(\"Falha ao salvar\", \"assertive\");\n */\nexport function announce(message: string, politeness: AnnouncePoliteness = \"polite\"): void {\n if (!message) return;\n const pair = ensureRegions();\n if (!pair) return;\n\n const region = politeness === \"assertive\" ? pair.assertive : pair.polite;\n region.replaceChildren();\n const item = document.createElement(\"div\");\n item.textContent = message;\n region.appendChild(item);\n\n const timer = setTimeout(() => {\n timers.delete(timer);\n if (item.isConnected) item.remove();\n }, CLEAR_AFTER_MS);\n timers.add(timer);\n}\n\n/**\n * Remove the shared regions and cancel pending cleanups.\n *\n * For test teardown and for a micro-frontend being unmounted from a page it does\n * not own. Regular apps never need it — two empty hidden `div`s cost nothing, and\n * tearing them down while another component still announces would lose messages.\n */\nexport function clearAnnouncer(): void {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n regions?.polite.remove();\n regions?.assertive.remove();\n regions = null;\n}\n\n/**\n * Announce transient messages to screen readers through one shared live region\n * pair.\n *\n * Reach for this when something happened that a sighted user can see and a screen\n * reader user cannot: a filter narrowed a list, a row saved, a copy succeeded, an\n * upload failed. It is **not** for content that is already on screen inside a\n * region with a role — a status pill, a toast that renders as `role=\"status\"`,\n * a form error tied to its input — announcing those again reads them twice.\n *\n * !!! warning \"Never wrap streaming text in a live region\"\n * A live region over text that grows token by token makes the reader start the\n * whole answer again on every token. Announce the **edges** instead — \"gerando\n * resposta\" and \"resposta concluída\" — and leave the transcript in a plain\n * `role=\"log\"` the user reads at their own pace. `AIChat` does exactly that.\n *\n * Mounting the hook creates the regions even before the first message. That is not\n * tidiness: a live region inserted into the DOM in the same frame as its first\n * content routinely loses that announcement, because the assistive technology has\n * to have registered the region before it can notice a change inside it.\n *\n * @returns A stable `announce(message, politeness?)` function.\n *\n * @example\n * const announce = useAnnounce();\n *\n * function onFilter(rows: Row[]) {\n * announce(`${rows.length} resultados`);\n * }\n */\nexport function useAnnounce(): (message: string, politeness?: AnnouncePoliteness) => void {\n useEffect(() => {\n ensureRegions();\n }, []);\n\n return useCallback(\n (message: string, politeness: AnnouncePoliteness = \"polite\") =>\n announce(message, politeness),\n [],\n );\n}\n"],"mappings":";;AAaA,IAAM,IAAiB,KAUjB,IAA6C;CAC/C,UAAU;CACV,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,UAAU;CACV,MAAM;CACN,UAAU;CACV,YAAY;AAChB,GAOI,IAA0B,MACxB,oBAAS,IAAI,IAAmC;AAgBtD,SAAS,EAAa,GAA6C;CAC/D,IAAM,IAAO,SAAS,cAAc,KAAK;CAOzC,OANI,MAAe,YAAU,EAAK,aAAa,QAAQ,QAAQ,GAC/D,EAAK,aAAa,aAAa,CAAU,GACzC,EAAK,aAAa,eAAe,MAAM,GACvC,EAAK,aAAa,0BAA0B,CAAU,GACtD,OAAO,OAAO,EAAK,OAAO,CAAY,GACtC,SAAS,KAAK,YAAY,CAAI,GACvB;AACX;AAsBA,SAAS,IAAgC;CAMrC,OALI,OAAO,WAAa,MAAoB,OACxC,KAAW,EAAQ,OAAO,eAAe,EAAQ,UAAU,cAAoB,KACnF,GAAS,OAAO,OAAO,GACvB,GAAS,UAAU,OAAO,GAC1B,IAAU;EAAE,QAAQ,EAAa,QAAQ;EAAG,WAAW,EAAa,WAAW;CAAE,GAC1E;AACX;AAsBA,SAAgB,EAAS,GAAiB,IAAiC,UAAgB;CACvF,IAAI,CAAC,GAAS;CACd,IAAM,IAAO,EAAc;CAC3B,IAAI,CAAC,GAAM;CAEX,IAAM,IAAS,MAAe,cAAc,EAAK,YAAY,EAAK;CAClE,EAAO,gBAAgB;CACvB,IAAM,IAAO,SAAS,cAAc,KAAK;CAEzC,AADA,EAAK,cAAc,GACnB,EAAO,YAAY,CAAI;CAEvB,IAAM,IAAQ,iBAAiB;EAE3B,AADA,EAAO,OAAO,CAAK,GACf,EAAK,eAAa,EAAK,OAAO;CACtC,GAAG,CAAc;CACjB,EAAO,IAAI,CAAK;AACpB;AASA,SAAgB,IAAuB;CACnC,KAAK,IAAM,KAAS,GAAQ,aAAa,CAAK;CAI9C,AAHA,EAAO,MAAM,GACb,GAAS,OAAO,OAAO,GACvB,GAAS,UAAU,OAAO,GAC1B,IAAU;AACd;AAgCA,SAAgB,IAA0E;CAKtF,OAJA,QAAgB;EACZ,EAAc;CAClB,GAAG,CAAC,CAAC,GAEE,GACF,GAAiB,IAAiC,aAC/C,EAAS,GAAS,CAAU,GAChC,CAAC,CACL;AACJ"}
1
+ {"version":3,"file":"use-announce.js","names":["CLEAR_AFTER_MS","HIDDEN_STYLE","regions","timers","createRegion","node","politeness","ensureRegions","announce","message","pair","region","item","timer","clearAnnouncer","useAnnounce","useEffect","useCallback"],"sources":["../../src/hooks/use-announce.ts"],"sourcesContent":["import { useCallback, useEffect } from \"react\";\n\n/**\n * How urgently a screen reader should interrupt.\n *\n * `\"polite\"` waits for a pause in what is being read. `\"assertive\"` cuts in\n * immediately, which is right for an error the user must act on and wrong for\n * everything else — an assertive announcement can truncate the sentence the user\n * was in the middle of.\n */\nexport type AnnouncePoliteness = \"polite\" | \"assertive\";\n\n/** How long an announcement stays in the DOM before it is cleaned up. */\nconst CLEAR_AFTER_MS = 7_000;\n\n/**\n * Inline styles that hide an element visually while leaving it readable.\n *\n * Inline and not a CSS module on purpose: these nodes are created imperatively by\n * a hook, and a hook that only works when the app remembered to import\n * `tempest-react-sdk/styles.css` would drop two visible, unstyled paragraphs into\n * the page — a visual bug caused by an accessibility feature.\n */\nconst HIDDEN_STYLE: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n margin: \"-1px\",\n padding: \"0\",\n border: \"0\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n};\n\ninterface Regions {\n polite: HTMLElement;\n assertive: HTMLElement;\n}\n\nlet regions: Regions | null = null;\nconst timers = new Set<ReturnType<typeof setTimeout>>();\n\n/**\n * Build one live region.\n *\n * The polite region carries `role=\"status\"`; the assertive one carries only\n * `aria-live=\"assertive\"`. `role=\"alert\"` is deliberately **not** used: these\n * regions live in the document for the page's whole life, and an empty element\n * claiming to be an alert is both a lie about its content and a trap for every\n * `getByRole(\"alert\")` in a consuming app's test suite, which would suddenly match\n * two nodes. A bare `aria-live` region is announced by every screen reader that\n * supports live regions at all.\n *\n * @param politeness - Which region to build.\n * @returns The region, already appended to `<body>`.\n */\nfunction createRegion(politeness: AnnouncePoliteness): HTMLElement {\n const node = document.createElement(\"div\");\n if (politeness === \"polite\") node.setAttribute(\"role\", \"status\");\n node.setAttribute(\"aria-live\", politeness);\n node.setAttribute(\"aria-atomic\", \"true\");\n node.setAttribute(\"data-tempest-announcer\", politeness);\n Object.assign(node.style, HIDDEN_STYLE);\n document.body.appendChild(node);\n return node;\n}\n\n/**\n * Get the two shared live regions, creating them on first use.\n *\n * **Two regions, not one with a switchable `aria-live`.** Politeness is a property\n * of the region, read when the assistive technology first registers it — flipping\n * the attribute later is honoured by some screen readers, ignored by others, and\n * in the worst case drops the announcement entirely. Two regions that never change\n * are the only version that behaves the same everywhere.\n *\n * **Shared, not one per component.** Every live region on the page is polled;\n * several of them mutating at once is how announcements get dropped or doubled.\n * One pair per document keeps the order deterministic.\n *\n * A pair is replaced as a **pair**, discarding the old one: if only one region was\n * torn out of the DOM (a router that replaced `<body>`, a micro-frontend unmount),\n * keeping its still-attached sibling would leave two regions of that politeness on\n * the page — the exact duplication the shared pair exists to prevent.\n *\n * @returns The polite and assertive regions, or `null` outside a document.\n */\nfunction ensureRegions(): Regions | null {\n if (typeof document === \"undefined\") return null;\n if (regions && regions.polite.isConnected && regions.assertive.isConnected) return regions;\n regions?.polite.remove();\n regions?.assertive.remove();\n regions = { polite: createRegion(\"polite\"), assertive: createRegion(\"assertive\") };\n return regions;\n}\n\n/**\n * Announce a message to screen readers, from anywhere — a hook, an event handler,\n * a plain function outside React.\n *\n * ## Why the same string announces twice\n *\n * Screen readers announce a live region when its **content changes**. Writing the\n * same text again is not a change, so \"Item removido\" twice in a row is read once —\n * the classic reason these announcers are quietly broken. Instead of mutating text,\n * every call replaces the region's child with a **new element**. The DOM mutation is\n * real even when the string is identical, so the second announcement happens, and\n * the reader hears the exact message with no padding characters bolted on.\n *\n * @param message - Text to read out. Empty strings are ignored.\n * @param politeness - `\"polite\"` (default) or `\"assertive\"`.\n *\n * @example\n * announce(`${count} pedidos encontrados`);\n * announce(\"Falha ao salvar\", \"assertive\");\n */\nexport function announce(message: string, politeness: AnnouncePoliteness = \"polite\"): void {\n if (!message) return;\n const pair = ensureRegions();\n if (!pair) return;\n\n const region = politeness === \"assertive\" ? pair.assertive : pair.polite;\n region.replaceChildren();\n const item = document.createElement(\"div\");\n item.textContent = message;\n region.appendChild(item);\n\n const timer = setTimeout(() => {\n timers.delete(timer);\n if (item.isConnected) item.remove();\n }, CLEAR_AFTER_MS);\n timers.add(timer);\n}\n\n/**\n * Remove the shared regions and cancel pending cleanups.\n *\n * For test teardown and for a micro-frontend being unmounted from a page it does\n * not own. Regular apps never need it — two empty hidden `div`s cost nothing, and\n * tearing them down while another component still announces would lose messages.\n */\nexport function clearAnnouncer(): void {\n for (const timer of timers) clearTimeout(timer);\n timers.clear();\n regions?.polite.remove();\n regions?.assertive.remove();\n regions = null;\n}\n\n/**\n * Announce transient messages to screen readers through one shared live region\n * pair.\n *\n * Reach for this when something happened that a sighted user can see and a screen\n * reader user cannot: a filter narrowed a list, a row saved, a copy succeeded, an\n * upload failed. It is **not** for content that is already on screen inside a\n * region with a role — a status pill, a toast that renders as `role=\"status\"`,\n * a form error tied to its input — announcing those again reads them twice.\n *\n * !!! warning \"Never wrap streaming text in a live region\"\n * A live region over text that grows token by token makes the reader start the\n * whole answer again on every token. Announce the **edges** instead — \"gerando\n * resposta\" and \"resposta concluída\" — and leave the transcript in a plain\n * `role=\"log\"` the user reads at their own pace. `AIChat` does exactly that.\n *\n * Mounting the hook creates the regions even before the first message. That is not\n * tidiness: a live region inserted into the DOM in the same frame as its first\n * content routinely loses that announcement, because the assistive technology has\n * to have registered the region before it can notice a change inside it.\n *\n * @returns A stable `announce(message, politeness?)` function.\n *\n * @example\n * const announce = useAnnounce();\n *\n * function onFilter(rows: Row[]) {\n * announce(`${rows.length} resultados`);\n * }\n */\nexport function useAnnounce(): (message: string, politeness?: AnnouncePoliteness) => void {\n useEffect(() => {\n ensureRegions();\n }, []);\n\n return useCallback(\n (message: string, politeness: AnnouncePoliteness = \"polite\") =>\n announce(message, politeness),\n [],\n );\n}\n"],"mappings":";;AAaA,IAAMA,IAAiB,KAUjBC,IAA6C;CAC/C,UAAU;CACV,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,UAAU;CACV,MAAM;CACN,UAAU;CACV,YAAY;AAChB,GAOIC,IAA0B,MACxBC,oBAAS,IAAI,IAAmC;AAgBtD,SAASC,EAAa,GAA6C;CAC/D,IAAMC,IAAO,SAAS,cAAc,KAAK;CAOzC,OANIC,MAAe,YAAUD,EAAK,aAAa,QAAQ,QAAQ,GAC/DA,EAAK,aAAa,aAAaC,CAAU,GACzCD,EAAK,aAAa,eAAe,MAAM,GACvCA,EAAK,aAAa,0BAA0BC,CAAU,GACtD,OAAO,OAAOD,EAAK,OAAOJ,CAAY,GACtC,SAAS,KAAK,YAAYI,CAAI,GACvBA;AACX;AAsBA,SAASE,IAAgC;CAMrC,OALI,OAAO,WAAa,MAAoB,QACxCL,KAAWA,EAAQ,OAAO,eAAeA,EAAQ,UAAU,gBAC/DA,GAAS,OAAO,OAAO,GACvBA,GAAS,UAAU,OAAO,GAC1B,IAAU;EAAE,QAAQE,EAAa,QAAQ;EAAG,WAAWA,EAAa,WAAW;CAAE,IAC1EF;AACX;AAsBA,SAAgBM,EAAS,GAAiB,IAAiC,UAAgB;CACvF,IAAI,CAACC,GAAS;CACd,IAAMC,IAAOH,EAAc;CAC3B,IAAI,CAACG,GAAM;CAEX,IAAMC,IAASL,MAAe,cAAcI,EAAK,YAAYA,EAAK;CAClE,EAAO,gBAAgB;CACvB,IAAME,IAAO,SAAS,cAAc,KAAK;CAEzC,AADA,EAAK,cAAcH,GACnBE,EAAO,YAAYC,CAAI;CAEvB,IAAMC,IAAQ,iBAAiB;EAE3B,AADAV,EAAO,OAAOU,CAAK,GACfD,EAAK,eAAaA,EAAK,OAAO;CACtC,GAAGZ,CAAc;CACjB,EAAO,IAAIa,CAAK;AACpB;AASA,SAAgBC,IAAuB;CACnC,KAAK,IAAMD,KAASV,GAAQ,aAAaU,CAAK;CAI9C,AAHAV,EAAO,MAAM,GACbD,GAAS,OAAO,OAAO,GACvBA,GAAS,UAAU,OAAO,GAC1B,IAAU;AACd;AAgCA,SAAgBa,IAA0E;CAKtF,OAJAC,QAAgB;EACZ,EAAc;CAClB,GAAG,CAAC,CAAC,GAEEC,GACF,GAAiB,IAAiC,aAC/CT,EAASC,GAASH,CAAU,GAChC,CAAC,CACL;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-async.cjs","names":[],"sources":["../../src/hooks/use-async.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\n\nexport type AsyncStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface UseAsyncResult<T> {\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n /** Trigger the async function. Resolves with the new data or rejects. */\n run: () => Promise<T>;\n /** Reset state back to idle. */\n reset: () => void;\n}\n\n/**\n * Run an async function and track its `idle/pending/success/error` state.\n *\n * - Discards results from stale runs (race-condition safe).\n * - `immediate` (default `false`) triggers the function on mount and when\n * `deps` change. With `false`, call `run()` manually.\n * - Returns a stable object so callers can destructure or pass around safely.\n *\n * For server data with caching, prefer React Query — `useAsync` is the\n * minimal one-shot primitive without dependencies.\n */\nexport function useAsync<T>(\n asyncFn: () => Promise<T>,\n deps: ReadonlyArray<unknown> = [],\n options: { immediate?: boolean } = {},\n): UseAsyncResult<T> {\n const { immediate = false } = options;\n const [state, setState] = useState<{\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n }>({ status: \"idle\", data: undefined, error: undefined });\n\n const fnRef = useLatestRef(asyncFn);\n const callIdRef = useRef<number>(0);\n const mountedRef = useRef<boolean>(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const run = useCallback(async (): Promise<T> => {\n const callId = ++callIdRef.current;\n setState((current) => ({ ...current, status: \"pending\", error: undefined }));\n try {\n const data = await fnRef.current();\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"success\", data, error: undefined });\n }\n return data;\n } catch (error) {\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"error\", data: undefined, error });\n }\n throw error;\n }\n }, [fnRef]);\n\n const reset = useCallback((): void => {\n callIdRef.current++;\n setState({ status: \"idle\", data: undefined, error: undefined });\n }, []);\n\n useEffect(() => {\n if (!immediate) return;\n run().catch(() => {\n /* error already captured in state */\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [immediate, ...deps]);\n\n return {\n status: state.status,\n data: state.data,\n error: state.error,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n run,\n reset,\n };\n}\n"],"mappings":"+DA6BA,SAAgB,EACZ,EACA,EAA+B,CAAC,EAChC,EAAmC,CAAC,EACnB,CACjB,GAAM,CAAE,YAAY,IAAU,EACxB,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAIvB,CAAE,OAAQ,OAAQ,KAAM,IAAA,GAAW,MAAO,IAAA,EAAU,CAAC,EAElD,EAAQ,EAAA,aAAa,CAAO,EAC5B,GAAA,EAAY,EAAA,OAAA,CAAe,CAAC,EAC5B,GAAA,EAAa,EAAA,OAAA,CAAgB,EAAI,GAEvC,EAAA,EAAA,UAAA,MACI,EAAW,QAAU,OACR,CACT,EAAW,QAAU,EACzB,GACD,CAAC,CAAC,EAEL,IAAM,GAAA,EAAM,EAAA,YAAA,CAAY,SAAwB,CAC5C,IAAM,EAAS,EAAE,EAAU,QAC3B,EAAU,IAAa,CAAE,GAAG,EAAS,OAAQ,UAAW,MAAO,IAAA,EAAU,EAAE,EAC3E,GAAI,CACA,IAAM,EAAO,MAAM,EAAM,QAAQ,EAIjC,OAHI,EAAW,SAAW,EAAU,UAAY,GAC5C,EAAS,CAAE,OAAQ,UAAW,OAAM,MAAO,IAAA,EAAU,CAAC,EAEnD,CACX,OAAS,EAAO,CAIZ,MAHI,EAAW,SAAW,EAAU,UAAY,GAC5C,EAAS,CAAE,OAAQ,QAAS,KAAM,IAAA,GAAW,OAAM,CAAC,EAElD,CACV,CACJ,EAAG,CAAC,CAAK,CAAC,EAEJ,GAAA,EAAQ,EAAA,YAAA,KAAwB,CAClC,EAAU,UACV,EAAS,CAAE,OAAQ,OAAQ,KAAM,IAAA,GAAW,MAAO,IAAA,EAAU,CAAC,CAClE,EAAG,CAAC,CAAC,EAUL,OARA,EAAA,EAAA,UAAA,KAAgB,CACP,GACL,EAAI,CAAC,CAAC,UAAY,CAElB,CAAC,CAEL,EAAG,CAAC,EAAW,GAAG,CAAI,CAAC,EAEhB,CACH,OAAQ,EAAM,OACd,KAAM,EAAM,KACZ,MAAO,EAAM,MACb,UAAW,EAAM,SAAW,UAC5B,UAAW,EAAM,SAAW,UAC5B,QAAS,EAAM,SAAW,QAC1B,MACA,OACJ,CACJ"}
1
+ {"version":3,"file":"use-async.cjs","names":["useState","useLatestRef","useRef","useCallback","require_use_latest_ref","react","useAsync","options","state","setState","fnRef","asyncFn","callIdRef","mountedRef","run","callId","current","data","error","reset","immediate","deps"],"sources":["../../src/hooks/use-async.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\n\nexport type AsyncStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface UseAsyncResult<T> {\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n /** Trigger the async function. Resolves with the new data or rejects. */\n run: () => Promise<T>;\n /** Reset state back to idle. */\n reset: () => void;\n}\n\n/**\n * Run an async function and track its `idle/pending/success/error` state.\n *\n * - Discards results from stale runs (race-condition safe).\n * - `immediate` (default `false`) triggers the function on mount and when\n * `deps` change. With `false`, call `run()` manually.\n * - Returns a stable object so callers can destructure or pass around safely.\n *\n * For server data with caching, prefer React Query — `useAsync` is the\n * minimal one-shot primitive without dependencies.\n */\nexport function useAsync<T>(\n asyncFn: () => Promise<T>,\n deps: ReadonlyArray<unknown> = [],\n options: { immediate?: boolean } = {},\n): UseAsyncResult<T> {\n const { immediate = false } = options;\n const [state, setState] = useState<{\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n }>({ status: \"idle\", data: undefined, error: undefined });\n\n const fnRef = useLatestRef(asyncFn);\n const callIdRef = useRef<number>(0);\n const mountedRef = useRef<boolean>(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const run = useCallback(async (): Promise<T> => {\n const callId = ++callIdRef.current;\n setState((current) => ({ ...current, status: \"pending\", error: undefined }));\n try {\n const data = await fnRef.current();\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"success\", data, error: undefined });\n }\n return data;\n } catch (error) {\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"error\", data: undefined, error });\n }\n throw error;\n }\n }, [fnRef]);\n\n const reset = useCallback((): void => {\n callIdRef.current++;\n setState({ status: \"idle\", data: undefined, error: undefined });\n }, []);\n\n useEffect(() => {\n if (!immediate) return;\n run().catch(() => {\n /* error already captured in state */\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [immediate, ...deps]);\n\n return {\n status: state.status,\n data: state.data,\n error: state.error,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n run,\n reset,\n };\n}\n"],"mappings":"A,+DA6BA,SAAgBM,EACZ,EACA,EAA+B,CAAC,EAChC,EAAmC,CAAC,EACnB,CACjB,GAAM,CAAE,YAAY,IAAUC,EACxB,CAACC,EAAOC,IAAA,EAAYT,EAAAA,SAAAA,CAIvB,CAAE,OAAQ,OAAQ,KAAM,IAAA,GAAW,MAAO,IAAA,EAAU,CAAC,EAElDU,EAAQT,EAAAA,aAAaU,CAAO,EAC5BC,GAAA,EAAYV,EAAAA,OAAAA,CAAe,CAAC,EAC5BW,GAAA,EAAaX,EAAAA,OAAAA,CAAgB,EAAI,GAEvC,EAAAG,EAAA,UAAA,MACI,EAAW,QAAU,OACR,CACT,EAAW,QAAU,EACzB,GACD,CAAC,CAAC,EAEL,IAAMS,GAAA,EAAMX,EAAAA,YAAAA,CAAY,SAAwB,CAC5C,IAAMY,EAAS,EAAEH,EAAU,QAC3BH,EAAU,IAAa,CAAE,GAAGO,EAAS,OAAQ,UAAW,MAAO,IAAA,EAAU,EAAE,EAC3E,GAAI,CACA,IAAMC,EAAO,MAAMP,EAAM,QAAQ,EAIjC,OAHIG,EAAW,SAAWD,EAAU,UAAYG,GAC5CN,EAAS,CAAE,OAAQ,UAAW,OAAM,MAAO,IAAA,EAAU,CAAC,EAEnDQ,CACX,OAASC,EAAO,CAIZ,MAHIL,EAAW,SAAWD,EAAU,UAAYG,GAC5CN,EAAS,CAAE,OAAQ,QAAS,KAAM,IAAA,GAAW,OAAM,CAAC,EAElDS,CACV,CACJ,EAAG,CAACR,CAAK,CAAC,EAEJS,GAAA,EAAQhB,EAAAA,YAAAA,KAAwB,CAClC,EAAU,UACVM,EAAS,CAAE,OAAQ,OAAQ,KAAM,IAAA,GAAW,MAAO,IAAA,EAAU,CAAC,CAClE,EAAG,CAAC,CAAC,EAUL,OARA,EAAAJ,EAAA,UAAA,KAAgB,CACPe,GACLN,EAAI,CAAC,CAAC,UAAY,CAElB,CAAC,CAEL,EAAG,CAACM,EAAW,GAAGC,CAAI,CAAC,EAEhB,CACH,OAAQb,EAAM,OACd,KAAMA,EAAM,KACZ,MAAOA,EAAM,MACb,UAAWA,EAAM,SAAW,UAC5B,UAAWA,EAAM,SAAW,UAC5B,QAASA,EAAM,SAAW,QAC1B,MACA,OACJ,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-async.js","names":[],"sources":["../../src/hooks/use-async.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\n\nexport type AsyncStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface UseAsyncResult<T> {\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n /** Trigger the async function. Resolves with the new data or rejects. */\n run: () => Promise<T>;\n /** Reset state back to idle. */\n reset: () => void;\n}\n\n/**\n * Run an async function and track its `idle/pending/success/error` state.\n *\n * - Discards results from stale runs (race-condition safe).\n * - `immediate` (default `false`) triggers the function on mount and when\n * `deps` change. With `false`, call `run()` manually.\n * - Returns a stable object so callers can destructure or pass around safely.\n *\n * For server data with caching, prefer React Query — `useAsync` is the\n * minimal one-shot primitive without dependencies.\n */\nexport function useAsync<T>(\n asyncFn: () => Promise<T>,\n deps: ReadonlyArray<unknown> = [],\n options: { immediate?: boolean } = {},\n): UseAsyncResult<T> {\n const { immediate = false } = options;\n const [state, setState] = useState<{\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n }>({ status: \"idle\", data: undefined, error: undefined });\n\n const fnRef = useLatestRef(asyncFn);\n const callIdRef = useRef<number>(0);\n const mountedRef = useRef<boolean>(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const run = useCallback(async (): Promise<T> => {\n const callId = ++callIdRef.current;\n setState((current) => ({ ...current, status: \"pending\", error: undefined }));\n try {\n const data = await fnRef.current();\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"success\", data, error: undefined });\n }\n return data;\n } catch (error) {\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"error\", data: undefined, error });\n }\n throw error;\n }\n }, [fnRef]);\n\n const reset = useCallback((): void => {\n callIdRef.current++;\n setState({ status: \"idle\", data: undefined, error: undefined });\n }, []);\n\n useEffect(() => {\n if (!immediate) return;\n run().catch(() => {\n /* error already captured in state */\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [immediate, ...deps]);\n\n return {\n status: state.status,\n data: state.data,\n error: state.error,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n run,\n reset,\n };\n}\n"],"mappings":";;;AA6BA,SAAgB,EACZ,GACA,IAA+B,CAAC,GAChC,IAAmC,CAAC,GACnB;CACjB,IAAM,EAAE,eAAY,OAAU,GACxB,CAAC,GAAO,KAAY,EAIvB;EAAE,QAAQ;EAAQ,MAAM,KAAA;EAAW,OAAO,KAAA;CAAU,CAAC,GAElD,IAAQ,EAAa,CAAO,GAC5B,IAAY,EAAe,CAAC,GAC5B,IAAa,EAAgB,EAAI;CAEvC,SACI,EAAW,UAAU,UACR;EACT,EAAW,UAAU;CACzB,IACD,CAAC,CAAC;CAEL,IAAM,IAAM,EAAY,YAAwB;EAC5C,IAAM,IAAS,EAAE,EAAU;EAC3B,GAAU,OAAa;GAAE,GAAG;GAAS,QAAQ;GAAW,OAAO,KAAA;EAAU,EAAE;EAC3E,IAAI;GACA,IAAM,IAAO,MAAM,EAAM,QAAQ;GAIjC,OAHI,EAAW,WAAW,EAAU,YAAY,KAC5C,EAAS;IAAE,QAAQ;IAAW;IAAM,OAAO,KAAA;GAAU,CAAC,GAEnD;EACX,SAAS,GAAO;GAIZ,MAHI,EAAW,WAAW,EAAU,YAAY,KAC5C,EAAS;IAAE,QAAQ;IAAS,MAAM,KAAA;IAAW;GAAM,CAAC,GAElD;EACV;CACJ,GAAG,CAAC,CAAK,CAAC,GAEJ,IAAQ,QAAwB;EAElC,AADA,EAAU,WACV,EAAS;GAAE,QAAQ;GAAQ,MAAM,KAAA;GAAW,OAAO,KAAA;EAAU,CAAC;CAClE,GAAG,CAAC,CAAC;CAUL,OARA,QAAgB;EACP,KACL,EAAI,CAAC,CAAC,YAAY,CAElB,CAAC;CAEL,GAAG,CAAC,GAAW,GAAG,CAAI,CAAC,GAEhB;EACH,QAAQ,EAAM;EACd,MAAM,EAAM;EACZ,OAAO,EAAM;EACb,WAAW,EAAM,WAAW;EAC5B,WAAW,EAAM,WAAW;EAC5B,SAAS,EAAM,WAAW;EAC1B;EACA;CACJ;AACJ"}
1
+ {"version":3,"file":"use-async.js","names":["useAsync","options","state","setState","useState","fnRef","useLatestRef","asyncFn","callIdRef","useRef","mountedRef","run","useCallback","callId","current","data","error","reset","useEffect","immediate","deps"],"sources":["../../src/hooks/use-async.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\n\nexport type AsyncStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface UseAsyncResult<T> {\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n /** Trigger the async function. Resolves with the new data or rejects. */\n run: () => Promise<T>;\n /** Reset state back to idle. */\n reset: () => void;\n}\n\n/**\n * Run an async function and track its `idle/pending/success/error` state.\n *\n * - Discards results from stale runs (race-condition safe).\n * - `immediate` (default `false`) triggers the function on mount and when\n * `deps` change. With `false`, call `run()` manually.\n * - Returns a stable object so callers can destructure or pass around safely.\n *\n * For server data with caching, prefer React Query — `useAsync` is the\n * minimal one-shot primitive without dependencies.\n */\nexport function useAsync<T>(\n asyncFn: () => Promise<T>,\n deps: ReadonlyArray<unknown> = [],\n options: { immediate?: boolean } = {},\n): UseAsyncResult<T> {\n const { immediate = false } = options;\n const [state, setState] = useState<{\n status: AsyncStatus;\n data: T | undefined;\n error: unknown;\n }>({ status: \"idle\", data: undefined, error: undefined });\n\n const fnRef = useLatestRef(asyncFn);\n const callIdRef = useRef<number>(0);\n const mountedRef = useRef<boolean>(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const run = useCallback(async (): Promise<T> => {\n const callId = ++callIdRef.current;\n setState((current) => ({ ...current, status: \"pending\", error: undefined }));\n try {\n const data = await fnRef.current();\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"success\", data, error: undefined });\n }\n return data;\n } catch (error) {\n if (mountedRef.current && callIdRef.current === callId) {\n setState({ status: \"error\", data: undefined, error });\n }\n throw error;\n }\n }, [fnRef]);\n\n const reset = useCallback((): void => {\n callIdRef.current++;\n setState({ status: \"idle\", data: undefined, error: undefined });\n }, []);\n\n useEffect(() => {\n if (!immediate) return;\n run().catch(() => {\n /* error already captured in state */\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [immediate, ...deps]);\n\n return {\n status: state.status,\n data: state.data,\n error: state.error,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n run,\n reset,\n };\n}\n"],"mappings":";;;AA6BA,SAAgBA,EACZ,GACA,IAA+B,CAAC,GAChC,IAAmC,CAAC,GACnB;CACjB,IAAM,EAAE,eAAY,OAAUC,GACxB,CAACC,GAAOC,KAAYC,EAIvB;EAAE,QAAQ;EAAQ,MAAM,KAAA;EAAW,OAAO,KAAA;CAAU,CAAC,GAElDC,IAAQC,EAAaC,CAAO,GAC5BC,IAAYC,EAAe,CAAC,GAC5BC,IAAaD,EAAgB,EAAI;CAEvC,SACI,EAAW,UAAU,UACR;EACT,EAAW,UAAU;CACzB,IACD,CAAC,CAAC;CAEL,IAAME,IAAMC,EAAY,YAAwB;EAC5C,IAAMC,IAAS,EAAEL,EAAU;EAC3B,GAAU,OAAa;GAAE,GAAGM;GAAS,QAAQ;GAAW,OAAO,KAAA;EAAU,EAAE;EAC3E,IAAI;GACA,IAAMC,IAAO,MAAMV,EAAM,QAAQ;GAIjC,OAHIK,EAAW,WAAWF,EAAU,YAAYK,KAC5CV,EAAS;IAAE,QAAQ;IAAW;IAAM,OAAO,KAAA;GAAU,CAAC,GAEnDY;EACX,SAASC,GAAO;GAIZ,MAHIN,EAAW,WAAWF,EAAU,YAAYK,KAC5CV,EAAS;IAAE,QAAQ;IAAS,MAAM,KAAA;IAAW;GAAM,CAAC,GAElDa;EACV;CACJ,GAAG,CAACX,CAAK,CAAC,GAEJY,IAAQL,QAAwB;EAElC,AADA,EAAU,WACVT,EAAS;GAAE,QAAQ;GAAQ,MAAM,KAAA;GAAW,OAAO,KAAA;EAAU,CAAC;CAClE,GAAG,CAAC,CAAC;CAUL,OARAe,QAAgB;EACZ,AAAKC,KACLR,EAAI,CAAC,CAAC,YAAY,CAElB,CAAC;CAEL,GAAG,CAACQ,GAAW,GAAGC,CAAI,CAAC,GAEhB;EACH,QAAQlB,EAAM;EACd,MAAMA,EAAM;EACZ,OAAOA,EAAM;EACb,WAAWA,EAAM,WAAW;EAC5B,WAAWA,EAAM,WAAW;EAC5B,SAASA,EAAM,WAAW;EAC1B;EACA;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-before-install-prompt.cjs","names":[],"sources":["../../src/hooks/use-before-install-prompt.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\ninterface BeforeInstallPromptEvent extends Event {\n readonly platforms: readonly string[];\n readonly userChoice: Promise<{ outcome: \"accepted\" | \"dismissed\"; platform: string }>;\n prompt(): Promise<void>;\n}\n\nexport interface UseBeforeInstallPromptResult {\n /** True when the browser fired `beforeinstallprompt` and the user has not yet decided. */\n installable: boolean;\n /** True after the user accepts the install prompt. */\n installed: boolean;\n /**\n * True when the app is already running as an installed PWA (display-mode\n * `standalone`/`fullscreen`/`minimal-ui`, or iOS `navigator.standalone`).\n * Use it to hide install affordances for users who already installed.\n */\n isStandalone: boolean;\n /** Show the install prompt. Resolves with the user's choice. */\n prompt: () => Promise<\"accepted\" | \"dismissed\" | \"unsupported\">;\n}\n\n/** Detect whether the document is running inside an installed PWA window. */\nfunction detectStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n const displayModes = [\"standalone\", \"fullscreen\", \"minimal-ui\"];\n const matchesDisplayMode = displayModes.some(\n (mode) => window.matchMedia?.(`(display-mode: ${mode})`)?.matches,\n );\n // iOS Safari exposes the legacy non-standard `navigator.standalone`.\n const iosStandalone =\n (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return matchesDisplayMode || iosStandalone;\n}\n\n/**\n * React hook for the PWA install prompt. Captures the `beforeinstallprompt`\n * event so you can defer the install UI to a moment that fits your UX.\n */\nexport function useBeforeInstallPrompt(): UseBeforeInstallPromptResult {\n const [deferred, setDeferred] = useState<BeforeInstallPromptEvent | null>(null);\n const [installed, setInstalled] = useState<boolean>(false);\n const [isStandalone, setIsStandalone] = useState<boolean>(detectStandalone);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handler = (event: Event): void => {\n event.preventDefault();\n setDeferred(event as BeforeInstallPromptEvent);\n };\n const installedHandler = (): void => {\n setDeferred(null);\n setInstalled(true);\n setIsStandalone(true);\n };\n const displayModeQuery = window.matchMedia?.(\"(display-mode: standalone)\");\n const displayModeHandler = (): void => setIsStandalone(detectStandalone());\n window.addEventListener(\"beforeinstallprompt\", handler);\n window.addEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.addEventListener(\"change\", displayModeHandler);\n return () => {\n window.removeEventListener(\"beforeinstallprompt\", handler);\n window.removeEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.removeEventListener(\"change\", displayModeHandler);\n };\n }, []);\n\n const prompt = useCallback(async (): Promise<\"accepted\" | \"dismissed\" | \"unsupported\"> => {\n if (!deferred) return \"unsupported\";\n await deferred.prompt();\n const result = await deferred.userChoice;\n setDeferred(null);\n if (result.outcome === \"accepted\") setInstalled(true);\n return result.outcome;\n }, [deferred]);\n\n return {\n installable: !!deferred,\n installed,\n isStandalone,\n prompt,\n };\n}\n"],"mappings":"uBAwBA,SAAS,GAA4B,CACjC,GAAI,OAAO,OAAW,IAAa,MAAO,GAE1C,IAAM,EAAqB,CADL,aAAc,aAAc,YACvB,CAAA,CAAa,KACnC,GAAS,OAAO,aAAa,kBAAkB,EAAK,EAAE,CAAC,EAAE,OAC9D,EAEM,EACD,OAAO,UAAmD,aAAe,GAC9E,OAAO,GAAsB,CACjC,CAMA,SAAgB,GAAuD,CACnE,GAAM,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAA0C,IAAI,EACxE,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAkB,EAAK,EACnD,CAAC,EAAc,IAAA,EAAmB,EAAA,SAAA,CAAkB,CAAgB,GAE1E,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAM,EAAW,GAAuB,CACpC,EAAM,eAAe,EACrB,EAAY,CAAiC,CACjD,EACM,MAA+B,CACjC,EAAY,IAAI,EAChB,EAAa,EAAI,EACjB,EAAgB,EAAI,CACxB,EACM,EAAmB,OAAO,aAAa,4BAA4B,EACnE,MAAiC,EAAgB,EAAiB,CAAC,EAIzE,OAHA,OAAO,iBAAiB,sBAAuB,CAAO,EACtD,OAAO,iBAAiB,eAAgB,CAAgB,EACxD,GAAkB,iBAAiB,SAAU,CAAkB,MAClD,CACT,OAAO,oBAAoB,sBAAuB,CAAO,EACzD,OAAO,oBAAoB,eAAgB,CAAgB,EAC3D,GAAkB,oBAAoB,SAAU,CAAkB,CACtE,CACJ,EAAG,CAAC,CAAC,EAEL,IAAM,GAAA,EAAS,EAAA,YAAA,CAAY,SAA+D,CACtF,GAAI,CAAC,EAAU,MAAO,cACtB,MAAM,EAAS,OAAO,EACtB,IAAM,EAAS,MAAM,EAAS,WAG9B,OAFA,EAAY,IAAI,EACZ,EAAO,UAAY,YAAY,EAAa,EAAI,EAC7C,EAAO,OAClB,EAAG,CAAC,CAAQ,CAAC,EAEb,MAAO,CACH,YAAa,CAAC,CAAC,EACf,YACA,eACA,QACJ,CACJ"}
1
+ {"version":3,"file":"use-before-install-prompt.cjs","names":["useState","useCallback","react","detectStandalone","matchesDisplayMode","mode","iosStandalone","useBeforeInstallPrompt","deferred","setDeferred","installed","setInstalled","isStandalone","setIsStandalone","handler","event","installedHandler","displayModeQuery","displayModeHandler","prompt","result"],"sources":["../../src/hooks/use-before-install-prompt.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\ninterface BeforeInstallPromptEvent extends Event {\n readonly platforms: readonly string[];\n readonly userChoice: Promise<{ outcome: \"accepted\" | \"dismissed\"; platform: string }>;\n prompt(): Promise<void>;\n}\n\nexport interface UseBeforeInstallPromptResult {\n /** True when the browser fired `beforeinstallprompt` and the user has not yet decided. */\n installable: boolean;\n /** True after the user accepts the install prompt. */\n installed: boolean;\n /**\n * True when the app is already running as an installed PWA (display-mode\n * `standalone`/`fullscreen`/`minimal-ui`, or iOS `navigator.standalone`).\n * Use it to hide install affordances for users who already installed.\n */\n isStandalone: boolean;\n /** Show the install prompt. Resolves with the user's choice. */\n prompt: () => Promise<\"accepted\" | \"dismissed\" | \"unsupported\">;\n}\n\n/** Detect whether the document is running inside an installed PWA window. */\nfunction detectStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n const displayModes = [\"standalone\", \"fullscreen\", \"minimal-ui\"];\n const matchesDisplayMode = displayModes.some(\n (mode) => window.matchMedia?.(`(display-mode: ${mode})`)?.matches,\n );\n // iOS Safari exposes the legacy non-standard `navigator.standalone`.\n const iosStandalone =\n (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return matchesDisplayMode || iosStandalone;\n}\n\n/**\n * React hook for the PWA install prompt. Captures the `beforeinstallprompt`\n * event so you can defer the install UI to a moment that fits your UX.\n */\nexport function useBeforeInstallPrompt(): UseBeforeInstallPromptResult {\n const [deferred, setDeferred] = useState<BeforeInstallPromptEvent | null>(null);\n const [installed, setInstalled] = useState<boolean>(false);\n const [isStandalone, setIsStandalone] = useState<boolean>(detectStandalone);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handler = (event: Event): void => {\n event.preventDefault();\n setDeferred(event as BeforeInstallPromptEvent);\n };\n const installedHandler = (): void => {\n setDeferred(null);\n setInstalled(true);\n setIsStandalone(true);\n };\n const displayModeQuery = window.matchMedia?.(\"(display-mode: standalone)\");\n const displayModeHandler = (): void => setIsStandalone(detectStandalone());\n window.addEventListener(\"beforeinstallprompt\", handler);\n window.addEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.addEventListener(\"change\", displayModeHandler);\n return () => {\n window.removeEventListener(\"beforeinstallprompt\", handler);\n window.removeEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.removeEventListener(\"change\", displayModeHandler);\n };\n }, []);\n\n const prompt = useCallback(async (): Promise<\"accepted\" | \"dismissed\" | \"unsupported\"> => {\n if (!deferred) return \"unsupported\";\n await deferred.prompt();\n const result = await deferred.userChoice;\n setDeferred(null);\n if (result.outcome === \"accepted\") setInstalled(true);\n return result.outcome;\n }, [deferred]);\n\n return {\n installable: !!deferred,\n installed,\n isStandalone,\n prompt,\n };\n}\n"],"mappings":"A,uBAwBA,SAASG,GAA4B,CACjC,GAAI,OAAO,OAAW,IAAa,MAAO,GAE1C,IAAMC,EAAqB,CADL,aAAc,aAAc,YACvB,CAAA,CAAa,KACnC,GAAS,OAAO,aAAa,kBAAkBC,EAAK,EAAE,CAAC,EAAE,OAC9D,EAEMC,EACD,OAAO,UAAmD,aAAe,GAC9E,OAAOF,GAAsBE,CACjC,CAMA,SAAgBC,GAAuD,CACnE,GAAM,CAACC,EAAUC,IAAA,EAAeT,EAAAA,SAAAA,CAA0C,IAAI,EACxE,CAACU,EAAWC,IAAA,EAAgBX,EAAAA,SAAAA,CAAkB,EAAK,EACnD,CAACY,EAAcC,IAAA,EAAmBb,EAAAA,SAAAA,CAAkBG,CAAgB,GAE1E,EAAAD,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAMY,EAAW,GAAuB,CACpCC,EAAM,eAAe,EACrBN,EAAYM,CAAiC,CACjD,EACMC,MAA+B,CACjCP,EAAY,IAAI,EAChBE,EAAa,EAAI,EACjBE,EAAgB,EAAI,CACxB,EACMI,EAAmB,OAAO,aAAa,4BAA4B,EACnEC,MAAiCL,EAAgBV,EAAiB,CAAC,EAIzE,OAHA,OAAO,iBAAiB,sBAAuBW,CAAO,EACtD,OAAO,iBAAiB,eAAgBE,CAAgB,EACxDC,GAAkB,iBAAiB,SAAUC,CAAkB,MAClD,CACT,OAAO,oBAAoB,sBAAuBJ,CAAO,EACzD,OAAO,oBAAoB,eAAgBE,CAAgB,EAC3DC,GAAkB,oBAAoB,SAAUC,CAAkB,CACtE,CACJ,EAAG,CAAC,CAAC,EAEL,IAAMC,GAAA,EAASlB,EAAAA,YAAAA,CAAY,SAA+D,CACtF,GAAI,CAACO,EAAU,MAAO,cACtB,MAAMA,EAAS,OAAO,EACtB,IAAMY,EAAS,MAAMZ,EAAS,WAG9B,OAFAC,EAAY,IAAI,EACZW,EAAO,UAAY,YAAYT,EAAa,EAAI,EAC7CS,EAAO,OAClB,EAAG,CAACZ,CAAQ,CAAC,EAEb,MAAO,CACH,YAAa,CAAC,CAACA,EACf,YACA,eACA,QACJ,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-before-install-prompt.js","names":[],"sources":["../../src/hooks/use-before-install-prompt.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\ninterface BeforeInstallPromptEvent extends Event {\n readonly platforms: readonly string[];\n readonly userChoice: Promise<{ outcome: \"accepted\" | \"dismissed\"; platform: string }>;\n prompt(): Promise<void>;\n}\n\nexport interface UseBeforeInstallPromptResult {\n /** True when the browser fired `beforeinstallprompt` and the user has not yet decided. */\n installable: boolean;\n /** True after the user accepts the install prompt. */\n installed: boolean;\n /**\n * True when the app is already running as an installed PWA (display-mode\n * `standalone`/`fullscreen`/`minimal-ui`, or iOS `navigator.standalone`).\n * Use it to hide install affordances for users who already installed.\n */\n isStandalone: boolean;\n /** Show the install prompt. Resolves with the user's choice. */\n prompt: () => Promise<\"accepted\" | \"dismissed\" | \"unsupported\">;\n}\n\n/** Detect whether the document is running inside an installed PWA window. */\nfunction detectStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n const displayModes = [\"standalone\", \"fullscreen\", \"minimal-ui\"];\n const matchesDisplayMode = displayModes.some(\n (mode) => window.matchMedia?.(`(display-mode: ${mode})`)?.matches,\n );\n // iOS Safari exposes the legacy non-standard `navigator.standalone`.\n const iosStandalone =\n (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return matchesDisplayMode || iosStandalone;\n}\n\n/**\n * React hook for the PWA install prompt. Captures the `beforeinstallprompt`\n * event so you can defer the install UI to a moment that fits your UX.\n */\nexport function useBeforeInstallPrompt(): UseBeforeInstallPromptResult {\n const [deferred, setDeferred] = useState<BeforeInstallPromptEvent | null>(null);\n const [installed, setInstalled] = useState<boolean>(false);\n const [isStandalone, setIsStandalone] = useState<boolean>(detectStandalone);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handler = (event: Event): void => {\n event.preventDefault();\n setDeferred(event as BeforeInstallPromptEvent);\n };\n const installedHandler = (): void => {\n setDeferred(null);\n setInstalled(true);\n setIsStandalone(true);\n };\n const displayModeQuery = window.matchMedia?.(\"(display-mode: standalone)\");\n const displayModeHandler = (): void => setIsStandalone(detectStandalone());\n window.addEventListener(\"beforeinstallprompt\", handler);\n window.addEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.addEventListener(\"change\", displayModeHandler);\n return () => {\n window.removeEventListener(\"beforeinstallprompt\", handler);\n window.removeEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.removeEventListener(\"change\", displayModeHandler);\n };\n }, []);\n\n const prompt = useCallback(async (): Promise<\"accepted\" | \"dismissed\" | \"unsupported\"> => {\n if (!deferred) return \"unsupported\";\n await deferred.prompt();\n const result = await deferred.userChoice;\n setDeferred(null);\n if (result.outcome === \"accepted\") setInstalled(true);\n return result.outcome;\n }, [deferred]);\n\n return {\n installable: !!deferred,\n installed,\n isStandalone,\n prompt,\n };\n}\n"],"mappings":";;AAwBA,SAAS,IAA4B;CACjC,IAAI,OAAO,SAAW,KAAa,OAAO;CAE1C,IAAM,IAAqB;EADL;EAAc;EAAc;CACvB,CAAA,CAAa,MACnC,MAAS,OAAO,aAAa,kBAAkB,EAAK,EAAE,CAAC,EAAE,OAC9D,GAEM,IACD,OAAO,UAAmD,eAAe;CAC9E,OAAO,KAAsB;AACjC;AAMA,SAAgB,IAAuD;CACnE,IAAM,CAAC,GAAU,KAAe,EAA0C,IAAI,GACxE,CAAC,GAAW,KAAgB,EAAkB,EAAK,GACnD,CAAC,GAAc,KAAmB,EAAkB,CAAgB;CAE1E,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAM,KAAW,MAAuB;GAEpC,AADA,EAAM,eAAe,GACrB,EAAY,CAAiC;EACjD,GACM,UAA+B;GAGjC,AAFA,EAAY,IAAI,GAChB,EAAa,EAAI,GACjB,EAAgB,EAAI;EACxB,GACM,IAAmB,OAAO,aAAa,4BAA4B,GACnE,UAAiC,EAAgB,EAAiB,CAAC;EAIzE,OAHA,OAAO,iBAAiB,uBAAuB,CAAO,GACtD,OAAO,iBAAiB,gBAAgB,CAAgB,GACxD,GAAkB,iBAAiB,UAAU,CAAkB,SAClD;GAGT,AAFA,OAAO,oBAAoB,uBAAuB,CAAO,GACzD,OAAO,oBAAoB,gBAAgB,CAAgB,GAC3D,GAAkB,oBAAoB,UAAU,CAAkB;EACtE;CACJ,GAAG,CAAC,CAAC;CAEL,IAAM,IAAS,EAAY,YAA+D;EACtF,IAAI,CAAC,GAAU,OAAO;EACtB,MAAM,EAAS,OAAO;EACtB,IAAM,IAAS,MAAM,EAAS;EAG9B,OAFA,EAAY,IAAI,GACZ,EAAO,YAAY,cAAY,EAAa,EAAI,GAC7C,EAAO;CAClB,GAAG,CAAC,CAAQ,CAAC;CAEb,OAAO;EACH,aAAa,CAAC,CAAC;EACf;EACA;EACA;CACJ;AACJ"}
1
+ {"version":3,"file":"use-before-install-prompt.js","names":["detectStandalone","matchesDisplayMode","mode","iosStandalone","useBeforeInstallPrompt","deferred","setDeferred","useState","installed","setInstalled","isStandalone","setIsStandalone","handler","event","installedHandler","displayModeQuery","displayModeHandler","prompt","useCallback","result"],"sources":["../../src/hooks/use-before-install-prompt.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\ninterface BeforeInstallPromptEvent extends Event {\n readonly platforms: readonly string[];\n readonly userChoice: Promise<{ outcome: \"accepted\" | \"dismissed\"; platform: string }>;\n prompt(): Promise<void>;\n}\n\nexport interface UseBeforeInstallPromptResult {\n /** True when the browser fired `beforeinstallprompt` and the user has not yet decided. */\n installable: boolean;\n /** True after the user accepts the install prompt. */\n installed: boolean;\n /**\n * True when the app is already running as an installed PWA (display-mode\n * `standalone`/`fullscreen`/`minimal-ui`, or iOS `navigator.standalone`).\n * Use it to hide install affordances for users who already installed.\n */\n isStandalone: boolean;\n /** Show the install prompt. Resolves with the user's choice. */\n prompt: () => Promise<\"accepted\" | \"dismissed\" | \"unsupported\">;\n}\n\n/** Detect whether the document is running inside an installed PWA window. */\nfunction detectStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n const displayModes = [\"standalone\", \"fullscreen\", \"minimal-ui\"];\n const matchesDisplayMode = displayModes.some(\n (mode) => window.matchMedia?.(`(display-mode: ${mode})`)?.matches,\n );\n // iOS Safari exposes the legacy non-standard `navigator.standalone`.\n const iosStandalone =\n (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n return matchesDisplayMode || iosStandalone;\n}\n\n/**\n * React hook for the PWA install prompt. Captures the `beforeinstallprompt`\n * event so you can defer the install UI to a moment that fits your UX.\n */\nexport function useBeforeInstallPrompt(): UseBeforeInstallPromptResult {\n const [deferred, setDeferred] = useState<BeforeInstallPromptEvent | null>(null);\n const [installed, setInstalled] = useState<boolean>(false);\n const [isStandalone, setIsStandalone] = useState<boolean>(detectStandalone);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handler = (event: Event): void => {\n event.preventDefault();\n setDeferred(event as BeforeInstallPromptEvent);\n };\n const installedHandler = (): void => {\n setDeferred(null);\n setInstalled(true);\n setIsStandalone(true);\n };\n const displayModeQuery = window.matchMedia?.(\"(display-mode: standalone)\");\n const displayModeHandler = (): void => setIsStandalone(detectStandalone());\n window.addEventListener(\"beforeinstallprompt\", handler);\n window.addEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.addEventListener(\"change\", displayModeHandler);\n return () => {\n window.removeEventListener(\"beforeinstallprompt\", handler);\n window.removeEventListener(\"appinstalled\", installedHandler);\n displayModeQuery?.removeEventListener(\"change\", displayModeHandler);\n };\n }, []);\n\n const prompt = useCallback(async (): Promise<\"accepted\" | \"dismissed\" | \"unsupported\"> => {\n if (!deferred) return \"unsupported\";\n await deferred.prompt();\n const result = await deferred.userChoice;\n setDeferred(null);\n if (result.outcome === \"accepted\") setInstalled(true);\n return result.outcome;\n }, [deferred]);\n\n return {\n installable: !!deferred,\n installed,\n isStandalone,\n prompt,\n };\n}\n"],"mappings":";;AAwBA,SAASA,IAA4B;CACjC,IAAI,OAAO,SAAW,KAAa,OAAO;CAE1C,IAAMC,IAAqB;EADL;EAAc;EAAc;CACvB,CAAA,CAAa,MACnC,MAAS,OAAO,aAAa,kBAAkBC,EAAK,EAAE,CAAC,EAAE,OAC9D,GAEMC,IACD,OAAO,UAAmD,eAAe;CAC9E,OAAOF,KAAsBE;AACjC;AAMA,SAAgBC,IAAuD;CACnE,IAAM,CAACC,GAAUC,KAAeC,EAA0C,IAAI,GACxE,CAACC,GAAWC,KAAgBF,EAAkB,EAAK,GACnD,CAACG,GAAcC,KAAmBJ,EAAkBP,CAAgB;CAE1E,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAMY,KAAW,MAAuB;GAEpC,AADAC,EAAM,eAAe,GACrBP,EAAYO,CAAiC;EACjD,GACMC,UAA+B;GAGjC,AAFAR,EAAY,IAAI,GAChBG,EAAa,EAAI,GACjBE,EAAgB,EAAI;EACxB,GACMI,IAAmB,OAAO,aAAa,4BAA4B,GACnEC,UAAiCL,EAAgBX,EAAiB,CAAC;EAIzE,OAHA,OAAO,iBAAiB,uBAAuBY,CAAO,GACtD,OAAO,iBAAiB,gBAAgBE,CAAgB,GACxDC,GAAkB,iBAAiB,UAAUC,CAAkB,SAClD;GAGT,AAFA,OAAO,oBAAoB,uBAAuBJ,CAAO,GACzD,OAAO,oBAAoB,gBAAgBE,CAAgB,GAC3DC,GAAkB,oBAAoB,UAAUC,CAAkB;EACtE;CACJ,GAAG,CAAC,CAAC;CAEL,IAAMC,IAASC,EAAY,YAA+D;EACtF,IAAI,CAACb,GAAU,OAAO;EACtB,MAAMA,EAAS,OAAO;EACtB,IAAMc,IAAS,MAAMd,EAAS;EAG9B,OAFAC,EAAY,IAAI,GACZa,EAAO,YAAY,cAAYV,EAAa,EAAI,GAC7CU,EAAO;CAClB,GAAG,CAACd,CAAQ,CAAC;CAEb,OAAO;EACH,aAAa,CAAC,CAACA;EACf;EACA;EACA;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-breakpoint.cjs","names":[],"sources":["../../src/hooks/use-breakpoint.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Breakpoint keys exposed by the SDK. Values mirror the CSS tokens\n * `--tempest-bp-xs|sm|md|lg|xl|2xl` defined in `styles/colors.css`.\n */\nexport type Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/** Pixel value paired with each breakpoint key. */\nexport const BREAKPOINTS: Record<Breakpoint, number> = {\n xs: 480,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};\n\nconst ORDER: readonly Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"] as const;\n\nfunction resolveCurrent(width: number): Breakpoint {\n let current: Breakpoint = \"xs\";\n for (const key of ORDER) {\n if (width >= BREAKPOINTS[key]) {\n current = key;\n }\n }\n return current;\n}\n\nexport interface BreakpointHelpers {\n /** Current breakpoint key (the largest one whose min-width is matched). */\n current: Breakpoint;\n /** Window width in pixels at last update. `0` when SSR. */\n width: number;\n /** True when viewport width is `>=` the given breakpoint. */\n above: (bp: Breakpoint) => boolean;\n /** True when viewport width is `<` the given breakpoint. */\n below: (bp: Breakpoint) => boolean;\n /** Convenience flags mapping to typical device shapes. */\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n}\n\n/**\n * Reactive viewport-breakpoint hook.\n *\n * Returns the current breakpoint key plus `above` / `below` helpers and\n * `isMobile` / `isTablet` / `isDesktop` flags. SSR-safe — returns `xs` /\n * `width: 0` on the server, then updates after mount.\n */\nexport function useBreakpoint(): BreakpointHelpers {\n const [width, setWidth] = useState<number>(() =>\n typeof window === \"undefined\" ? 0 : window.innerWidth,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = (): void => setWidth(window.innerWidth);\n onResize();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const current = resolveCurrent(width);\n const above = (bp: Breakpoint): boolean => width >= BREAKPOINTS[bp];\n const below = (bp: Breakpoint): boolean => width < BREAKPOINTS[bp];\n\n return {\n current,\n width,\n above,\n below,\n isMobile: below(\"md\"),\n isTablet: above(\"md\") && below(\"lg\"),\n isDesktop: above(\"lg\"),\n };\n}\n"],"mappings":"uBASA,IAAa,EAA0C,CACnD,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,KACJ,GAAI,KACJ,MAAO,IACX,EAEM,EAA+B,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAK,EAEzE,SAAS,EAAe,EAA2B,CAC/C,IAAI,EAAsB,KAC1B,IAAK,IAAM,KAAO,EACV,GAAS,EAAY,KACrB,EAAU,GAGlB,OAAO,CACX,CAwBA,SAAgB,GAAmC,CAC/C,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,KACtB,OAAO,OAAW,IAAc,EAAI,OAAO,UAC/C,GAEA,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAM,MAAuB,EAAS,OAAO,UAAU,EAGvD,OAFA,EAAS,EACT,OAAO,iBAAiB,SAAU,EAAU,CAAE,QAAS,EAAK,CAAC,MAChD,OAAO,oBAAoB,SAAU,CAAQ,CAC9D,EAAG,CAAC,CAAC,EAEL,IAAM,EAAU,EAAe,CAAK,EAC9B,EAAS,GAA4B,GAAS,EAAY,GAC1D,EAAS,GAA4B,EAAQ,EAAY,GAE/D,MAAO,CACH,UACA,QACA,QACA,QACA,SAAU,EAAM,IAAI,EACpB,SAAU,EAAM,IAAI,GAAK,EAAM,IAAI,EACnC,UAAW,EAAM,IAAI,CACzB,CACJ"}
1
+ {"version":3,"file":"use-breakpoint.cjs","names":["useState","react","BREAKPOINTS","ORDER","resolveCurrent","current","key","width","useBreakpoint","setWidth","onResize","above","bp","below"],"sources":["../../src/hooks/use-breakpoint.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Breakpoint keys exposed by the SDK. Values mirror the CSS tokens\n * `--tempest-bp-xs|sm|md|lg|xl|2xl` defined in `styles/colors.css`.\n */\nexport type Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/** Pixel value paired with each breakpoint key. */\nexport const BREAKPOINTS: Record<Breakpoint, number> = {\n xs: 480,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};\n\nconst ORDER: readonly Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"] as const;\n\nfunction resolveCurrent(width: number): Breakpoint {\n let current: Breakpoint = \"xs\";\n for (const key of ORDER) {\n if (width >= BREAKPOINTS[key]) {\n current = key;\n }\n }\n return current;\n}\n\nexport interface BreakpointHelpers {\n /** Current breakpoint key (the largest one whose min-width is matched). */\n current: Breakpoint;\n /** Window width in pixels at last update. `0` when SSR. */\n width: number;\n /** True when viewport width is `>=` the given breakpoint. */\n above: (bp: Breakpoint) => boolean;\n /** True when viewport width is `<` the given breakpoint. */\n below: (bp: Breakpoint) => boolean;\n /** Convenience flags mapping to typical device shapes. */\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n}\n\n/**\n * Reactive viewport-breakpoint hook.\n *\n * Returns the current breakpoint key plus `above` / `below` helpers and\n * `isMobile` / `isTablet` / `isDesktop` flags. SSR-safe — returns `xs` /\n * `width: 0` on the server, then updates after mount.\n */\nexport function useBreakpoint(): BreakpointHelpers {\n const [width, setWidth] = useState<number>(() =>\n typeof window === \"undefined\" ? 0 : window.innerWidth,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = (): void => setWidth(window.innerWidth);\n onResize();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const current = resolveCurrent(width);\n const above = (bp: Breakpoint): boolean => width >= BREAKPOINTS[bp];\n const below = (bp: Breakpoint): boolean => width < BREAKPOINTS[bp];\n\n return {\n current,\n width,\n above,\n below,\n isMobile: below(\"md\"),\n isTablet: above(\"md\") && below(\"lg\"),\n isDesktop: above(\"lg\"),\n };\n}\n"],"mappings":"A,uBASA,IAAaE,EAA0C,CACnD,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,KACJ,GAAI,KACJ,MAAO,IACX,EAEMC,EAA+B,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAK,EAEzE,SAASC,EAAe,EAA2B,CAC/C,IAAIC,EAAsB,KAC1B,IAAK,IAAMC,KAAOH,EACVI,GAASL,EAAYI,KACrB,EAAUA,GAGlB,OAAOD,CACX,CAwBA,SAAgBG,GAAmC,CAC/C,GAAM,CAACD,EAAOE,IAAA,EAAYT,EAAAA,SAAAA,KACtB,OAAO,OAAW,IAAc,EAAI,OAAO,UAC/C,GAEA,EAAAC,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,OAAW,IAAa,OACnC,IAAMS,MAAuBD,EAAS,OAAO,UAAU,EAGvD,OAFAC,EAAS,EACT,OAAO,iBAAiB,SAAUA,EAAU,CAAE,QAAS,EAAK,CAAC,MAChD,OAAO,oBAAoB,SAAUA,CAAQ,CAC9D,EAAG,CAAC,CAAC,EAEL,IAAML,EAAUD,EAAeG,CAAK,EAC9BI,EAAS,GAA4BJ,GAASL,EAAYU,GAC1DC,EAAS,GAA4BN,EAAQL,EAAYU,GAE/D,MAAO,CACH,UACA,QACA,QACA,QACA,SAAUC,EAAM,IAAI,EACpB,SAAUF,EAAM,IAAI,GAAKE,EAAM,IAAI,EACnC,UAAWF,EAAM,IAAI,CACzB,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-breakpoint.js","names":[],"sources":["../../src/hooks/use-breakpoint.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Breakpoint keys exposed by the SDK. Values mirror the CSS tokens\n * `--tempest-bp-xs|sm|md|lg|xl|2xl` defined in `styles/colors.css`.\n */\nexport type Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/** Pixel value paired with each breakpoint key. */\nexport const BREAKPOINTS: Record<Breakpoint, number> = {\n xs: 480,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};\n\nconst ORDER: readonly Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"] as const;\n\nfunction resolveCurrent(width: number): Breakpoint {\n let current: Breakpoint = \"xs\";\n for (const key of ORDER) {\n if (width >= BREAKPOINTS[key]) {\n current = key;\n }\n }\n return current;\n}\n\nexport interface BreakpointHelpers {\n /** Current breakpoint key (the largest one whose min-width is matched). */\n current: Breakpoint;\n /** Window width in pixels at last update. `0` when SSR. */\n width: number;\n /** True when viewport width is `>=` the given breakpoint. */\n above: (bp: Breakpoint) => boolean;\n /** True when viewport width is `<` the given breakpoint. */\n below: (bp: Breakpoint) => boolean;\n /** Convenience flags mapping to typical device shapes. */\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n}\n\n/**\n * Reactive viewport-breakpoint hook.\n *\n * Returns the current breakpoint key plus `above` / `below` helpers and\n * `isMobile` / `isTablet` / `isDesktop` flags. SSR-safe — returns `xs` /\n * `width: 0` on the server, then updates after mount.\n */\nexport function useBreakpoint(): BreakpointHelpers {\n const [width, setWidth] = useState<number>(() =>\n typeof window === \"undefined\" ? 0 : window.innerWidth,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = (): void => setWidth(window.innerWidth);\n onResize();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const current = resolveCurrent(width);\n const above = (bp: Breakpoint): boolean => width >= BREAKPOINTS[bp];\n const below = (bp: Breakpoint): boolean => width < BREAKPOINTS[bp];\n\n return {\n current,\n width,\n above,\n below,\n isMobile: below(\"md\"),\n isTablet: above(\"md\") && below(\"lg\"),\n isDesktop: above(\"lg\"),\n };\n}\n"],"mappings":";;AASA,IAAa,IAA0C;CACnD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;AACX,GAEM,IAA+B;CAAC;CAAM;CAAM;CAAM;CAAM;CAAM;AAAK;AAEzE,SAAS,EAAe,GAA2B;CAC/C,IAAI,IAAsB;CAC1B,KAAK,IAAM,KAAO,GACd,AAAI,KAAS,EAAY,OACrB,IAAU;CAGlB,OAAO;AACX;AAwBA,SAAgB,IAAmC;CAC/C,IAAM,CAAC,GAAO,KAAY,QACtB,OAAO,SAAW,MAAc,IAAI,OAAO,UAC/C;CAEA,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAM,UAAuB,EAAS,OAAO,UAAU;EAGvD,OAFA,EAAS,GACT,OAAO,iBAAiB,UAAU,GAAU,EAAE,SAAS,GAAK,CAAC,SAChD,OAAO,oBAAoB,UAAU,CAAQ;CAC9D,GAAG,CAAC,CAAC;CAEL,IAAM,IAAU,EAAe,CAAK,GAC9B,KAAS,MAA4B,KAAS,EAAY,IAC1D,KAAS,MAA4B,IAAQ,EAAY;CAE/D,OAAO;EACH;EACA;EACA;EACA;EACA,UAAU,EAAM,IAAI;EACpB,UAAU,EAAM,IAAI,KAAK,EAAM,IAAI;EACnC,WAAW,EAAM,IAAI;CACzB;AACJ"}
1
+ {"version":3,"file":"use-breakpoint.js","names":["BREAKPOINTS","ORDER","resolveCurrent","current","key","width","useBreakpoint","setWidth","useState","onResize","above","bp","below"],"sources":["../../src/hooks/use-breakpoint.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Breakpoint keys exposed by the SDK. Values mirror the CSS tokens\n * `--tempest-bp-xs|sm|md|lg|xl|2xl` defined in `styles/colors.css`.\n */\nexport type Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/** Pixel value paired with each breakpoint key. */\nexport const BREAKPOINTS: Record<Breakpoint, number> = {\n xs: 480,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};\n\nconst ORDER: readonly Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"2xl\"] as const;\n\nfunction resolveCurrent(width: number): Breakpoint {\n let current: Breakpoint = \"xs\";\n for (const key of ORDER) {\n if (width >= BREAKPOINTS[key]) {\n current = key;\n }\n }\n return current;\n}\n\nexport interface BreakpointHelpers {\n /** Current breakpoint key (the largest one whose min-width is matched). */\n current: Breakpoint;\n /** Window width in pixels at last update. `0` when SSR. */\n width: number;\n /** True when viewport width is `>=` the given breakpoint. */\n above: (bp: Breakpoint) => boolean;\n /** True when viewport width is `<` the given breakpoint. */\n below: (bp: Breakpoint) => boolean;\n /** Convenience flags mapping to typical device shapes. */\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n}\n\n/**\n * Reactive viewport-breakpoint hook.\n *\n * Returns the current breakpoint key plus `above` / `below` helpers and\n * `isMobile` / `isTablet` / `isDesktop` flags. SSR-safe — returns `xs` /\n * `width: 0` on the server, then updates after mount.\n */\nexport function useBreakpoint(): BreakpointHelpers {\n const [width, setWidth] = useState<number>(() =>\n typeof window === \"undefined\" ? 0 : window.innerWidth,\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = (): void => setWidth(window.innerWidth);\n onResize();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const current = resolveCurrent(width);\n const above = (bp: Breakpoint): boolean => width >= BREAKPOINTS[bp];\n const below = (bp: Breakpoint): boolean => width < BREAKPOINTS[bp];\n\n return {\n current,\n width,\n above,\n below,\n isMobile: below(\"md\"),\n isTablet: above(\"md\") && below(\"lg\"),\n isDesktop: above(\"lg\"),\n };\n}\n"],"mappings":";;AASA,IAAaA,IAA0C;CACnD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;AACX,GAEMC,IAA+B;CAAC;CAAM;CAAM;CAAM;CAAM;CAAM;AAAK;AAEzE,SAASC,EAAe,GAA2B;CAC/C,IAAIC,IAAsB;CAC1B,KAAK,IAAMC,KAAOH,GACd,AAAII,KAASL,EAAYI,OACrB,IAAUA;CAGlB,OAAOD;AACX;AAwBA,SAAgBG,IAAmC;CAC/C,IAAM,CAACD,GAAOE,KAAYC,QACtB,OAAO,SAAW,MAAc,IAAI,OAAO,UAC/C;CAEA,QAAgB;EACZ,IAAI,OAAO,SAAW,KAAa;EACnC,IAAMC,UAAuBF,EAAS,OAAO,UAAU;EAGvD,OAFAE,EAAS,GACT,OAAO,iBAAiB,UAAUA,GAAU,EAAE,SAAS,GAAK,CAAC,SAChD,OAAO,oBAAoB,UAAUA,CAAQ;CAC9D,GAAG,CAAC,CAAC;CAEL,IAAMN,IAAUD,EAAeG,CAAK,GAC9BK,KAAS,MAA4BL,KAASL,EAAYW,IAC1DC,KAAS,MAA4BP,IAAQL,EAAYW;CAE/D,OAAO;EACH;EACA;EACA;EACA;EACA,UAAUC,EAAM,IAAI;EACpB,UAAUF,EAAM,IAAI,KAAKE,EAAM,IAAI;EACnC,WAAWF,EAAM,IAAI;CACzB;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-click-outside.cjs","names":[],"sources":["../../src/hooks/use-click-outside.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { RefObject } from \"react\";\n\n/**\n * Call `handler` when a `mousedown` / `touchstart` occurs outside the returned\n * ref's element. SSR-safe — listeners are only attached in the browser.\n *\n * @typeParam T - element type to attach the ref to.\n * @param handler - invoked on an outside interaction.\n * @returns A ref to attach to the element treated as \"inside\".\n */\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n handler: () => void,\n): RefObject<T | null> {\n const ref = useRef<T>(null);\n const handlerRef = useLatestRef(handler);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const listener = (event: MouseEvent | TouchEvent): void => {\n const target = event.target as Node | null;\n if (!ref.current || (target && ref.current.contains(target))) return;\n handlerRef.current();\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [handlerRef]);\n\n return ref;\n}\n"],"mappings":"+DAYA,SAAgB,EACZ,EACmB,CACnB,IAAM,GAAA,EAAM,EAAA,OAAA,CAAU,IAAI,EACpB,EAAa,EAAA,aAAa,CAAO,EAmBvC,OAjBA,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,SAAa,IAAa,OAErC,IAAM,EAAY,GAAyC,CACvD,IAAM,EAAS,EAAM,OACjB,CAAC,EAAI,SAAY,GAAU,EAAI,QAAQ,SAAS,CAAM,GAC1D,EAAW,QAAQ,CACvB,EAIA,OAFA,SAAS,iBAAiB,YAAa,CAAQ,EAC/C,SAAS,iBAAiB,aAAc,CAAQ,MACnC,CACT,SAAS,oBAAoB,YAAa,CAAQ,EAClD,SAAS,oBAAoB,aAAc,CAAQ,CACvD,CACJ,EAAG,CAAC,CAAU,CAAC,EAER,CACX"}
1
+ {"version":3,"file":"use-click-outside.cjs","names":["useRef","useLatestRef","require_use_latest_ref","react","useClickOutside","ref","handlerRef","handler","listener","target","event"],"sources":["../../src/hooks/use-click-outside.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { RefObject } from \"react\";\n\n/**\n * Call `handler` when a `mousedown` / `touchstart` occurs outside the returned\n * ref's element. SSR-safe — listeners are only attached in the browser.\n *\n * @typeParam T - element type to attach the ref to.\n * @param handler - invoked on an outside interaction.\n * @returns A ref to attach to the element treated as \"inside\".\n */\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n handler: () => void,\n): RefObject<T | null> {\n const ref = useRef<T>(null);\n const handlerRef = useLatestRef(handler);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const listener = (event: MouseEvent | TouchEvent): void => {\n const target = event.target as Node | null;\n if (!ref.current || (target && ref.current.contains(target))) return;\n handlerRef.current();\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [handlerRef]);\n\n return ref;\n}\n"],"mappings":"A,+DAYA,SAAgBI,EACZ,EACmB,CACnB,IAAMC,GAAA,EAAML,EAAAA,OAAAA,CAAU,IAAI,EACpBM,EAAaL,EAAAA,aAAaM,CAAO,EAmBvC,OAjBA,EAAAJ,EAAA,UAAA,KAAgB,CACZ,GAAI,OAAO,SAAa,IAAa,OAErC,IAAMK,EAAY,GAAyC,CACvD,IAAMC,EAASC,EAAM,OACjB,CAACL,EAAI,SAAYI,GAAUJ,EAAI,QAAQ,SAASI,CAAM,GAC1DH,EAAW,QAAQ,CACvB,EAIA,OAFA,SAAS,iBAAiB,YAAaE,CAAQ,EAC/C,SAAS,iBAAiB,aAAcA,CAAQ,MACnC,CACT,SAAS,oBAAoB,YAAaA,CAAQ,EAClD,SAAS,oBAAoB,aAAcA,CAAQ,CACvD,CACJ,EAAG,CAACF,CAAU,CAAC,EAERD,CACX,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-click-outside.js","names":[],"sources":["../../src/hooks/use-click-outside.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { RefObject } from \"react\";\n\n/**\n * Call `handler` when a `mousedown` / `touchstart` occurs outside the returned\n * ref's element. SSR-safe — listeners are only attached in the browser.\n *\n * @typeParam T - element type to attach the ref to.\n * @param handler - invoked on an outside interaction.\n * @returns A ref to attach to the element treated as \"inside\".\n */\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n handler: () => void,\n): RefObject<T | null> {\n const ref = useRef<T>(null);\n const handlerRef = useLatestRef(handler);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const listener = (event: MouseEvent | TouchEvent): void => {\n const target = event.target as Node | null;\n if (!ref.current || (target && ref.current.contains(target))) return;\n handlerRef.current();\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [handlerRef]);\n\n return ref;\n}\n"],"mappings":";;;AAYA,SAAgB,EACZ,GACmB;CACnB,IAAM,IAAM,EAAU,IAAI,GACpB,IAAa,EAAa,CAAO;CAmBvC,OAjBA,QAAgB;EACZ,IAAI,OAAO,WAAa,KAAa;EAErC,IAAM,KAAY,MAAyC;GACvD,IAAM,IAAS,EAAM;GACjB,CAAC,EAAI,WAAY,KAAU,EAAI,QAAQ,SAAS,CAAM,KAC1D,EAAW,QAAQ;EACvB;EAIA,OAFA,SAAS,iBAAiB,aAAa,CAAQ,GAC/C,SAAS,iBAAiB,cAAc,CAAQ,SACnC;GAET,AADA,SAAS,oBAAoB,aAAa,CAAQ,GAClD,SAAS,oBAAoB,cAAc,CAAQ;EACvD;CACJ,GAAG,CAAC,CAAU,CAAC,GAER;AACX"}
1
+ {"version":3,"file":"use-click-outside.js","names":["useClickOutside","ref","useRef","handlerRef","useLatestRef","handler","useEffect","listener","target","event"],"sources":["../../src/hooks/use-click-outside.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useLatestRef } from \"./use-latest-ref\";\nimport type { RefObject } from \"react\";\n\n/**\n * Call `handler` when a `mousedown` / `touchstart` occurs outside the returned\n * ref's element. SSR-safe — listeners are only attached in the browser.\n *\n * @typeParam T - element type to attach the ref to.\n * @param handler - invoked on an outside interaction.\n * @returns A ref to attach to the element treated as \"inside\".\n */\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n handler: () => void,\n): RefObject<T | null> {\n const ref = useRef<T>(null);\n const handlerRef = useLatestRef(handler);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const listener = (event: MouseEvent | TouchEvent): void => {\n const target = event.target as Node | null;\n if (!ref.current || (target && ref.current.contains(target))) return;\n handlerRef.current();\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [handlerRef]);\n\n return ref;\n}\n"],"mappings":";;;AAYA,SAAgBA,EACZ,GACmB;CACnB,IAAMC,IAAMC,EAAU,IAAI,GACpBC,IAAaC,EAAaC,CAAO;CAmBvC,OAjBAC,QAAgB;EACZ,IAAI,OAAO,WAAa,KAAa;EAErC,IAAMC,KAAY,MAAyC;GACvD,IAAMC,IAASC,EAAM;GACrB,AAAI,CAACR,EAAI,WAAYO,KAAUP,EAAI,QAAQ,SAASO,CAAM,KAC1DL,EAAW,QAAQ;EACvB;EAIA,OAFA,SAAS,iBAAiB,aAAaI,CAAQ,GAC/C,SAAS,iBAAiB,cAAcA,CAAQ,SACnC;GAET,AADA,SAAS,oBAAoB,aAAaA,CAAQ,GAClD,SAAS,oBAAoB,cAAcA,CAAQ;EACvD;CACJ,GAAG,CAACJ,CAAU,CAAC,GAERF;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-client-filter.cjs","names":[],"sources":["../../src/hooks/use-client-filter.ts"],"sourcesContent":["import { useMemo } from \"react\";\n\nexport type FilterPredicate<T> = (item: T, search: string) => boolean;\n\n/**\n * Client-side filter helper. Performs a case-insensitive match on the listed\n * keys when no custom predicate is provided.\n *\n * @param items - Source list.\n * @param search - Search string.\n * @param keysOrPredicate - Either a list of keys to match against or a custom predicate.\n * @returns Filtered list (referential identity preserved when search is empty).\n */\nexport function useClientFilter<T extends Record<string, unknown>>(\n items: T[],\n search: string,\n keysOrPredicate: (keyof T)[] | FilterPredicate<T>,\n): T[] {\n return useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) return items;\n if (typeof keysOrPredicate === \"function\") {\n return items.filter((item) => keysOrPredicate(item, term));\n }\n return items.filter((item) =>\n keysOrPredicate.some((key) => {\n const value = item[key];\n return value != null && String(value).toLowerCase().includes(term);\n }),\n );\n }, [items, search, keysOrPredicate]);\n}\n"],"mappings":"uBAaA,SAAgB,EACZ,EACA,EACA,EACG,CACH,OAAA,EAAO,EAAA,QAAA,KAAc,CACjB,IAAM,EAAO,EAAO,KAAK,CAAC,CAAC,YAAY,EAKvC,OAJK,EACD,OAAO,GAAoB,WACpB,EAAM,OAAQ,GAAS,EAAgB,EAAM,CAAI,CAAC,EAEtD,EAAM,OAAQ,GACjB,EAAgB,KAAM,GAAQ,CAC1B,IAAM,EAAQ,EAAK,GACnB,OAAO,GAAS,MAAQ,OAAO,CAAK,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAI,CACrE,CAAC,CACL,EATkB,CAUtB,EAAG,CAAC,EAAO,EAAQ,CAAe,CAAC,CACvC"}
1
+ {"version":3,"file":"use-client-filter.cjs","names":["useMemo","react","useClientFilter","term","search","keysOrPredicate","items","item","value","key"],"sources":["../../src/hooks/use-client-filter.ts"],"sourcesContent":["import { useMemo } from \"react\";\n\nexport type FilterPredicate<T> = (item: T, search: string) => boolean;\n\n/**\n * Client-side filter helper. Performs a case-insensitive match on the listed\n * keys when no custom predicate is provided.\n *\n * @param items - Source list.\n * @param search - Search string.\n * @param keysOrPredicate - Either a list of keys to match against or a custom predicate.\n * @returns Filtered list (referential identity preserved when search is empty).\n */\nexport function useClientFilter<T extends Record<string, unknown>>(\n items: T[],\n search: string,\n keysOrPredicate: (keyof T)[] | FilterPredicate<T>,\n): T[] {\n return useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) return items;\n if (typeof keysOrPredicate === \"function\") {\n return items.filter((item) => keysOrPredicate(item, term));\n }\n return items.filter((item) =>\n keysOrPredicate.some((key) => {\n const value = item[key];\n return value != null && String(value).toLowerCase().includes(term);\n }),\n );\n }, [items, search, keysOrPredicate]);\n}\n"],"mappings":"A,uBAaA,SAAgBE,EACZ,EACA,EACA,EACG,CACH,OAAA,EAAOF,EAAAA,QAAAA,KAAc,CACjB,IAAMG,EAAOC,EAAO,KAAK,CAAC,CAAC,YAAY,EAKvC,OAJKD,EACD,OAAOE,GAAoB,WACpBC,EAAM,OAAQ,GAASD,EAAgBE,EAAMJ,CAAI,CAAC,EAEtDG,EAAM,OAAQ,GACjBD,EAAgB,KAAM,GAAQ,CAC1B,IAAMG,EAAQD,EAAKE,GACnB,OAAOD,GAAS,MAAQ,OAAOA,CAAK,CAAC,CAAC,YAAY,CAAC,CAAC,SAASL,CAAI,CACrE,CAAC,CACL,EATkBG,CAUtB,EAAG,CAACA,EAAOF,EAAQC,CAAe,CAAC,CACvC,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-client-filter.js","names":[],"sources":["../../src/hooks/use-client-filter.ts"],"sourcesContent":["import { useMemo } from \"react\";\n\nexport type FilterPredicate<T> = (item: T, search: string) => boolean;\n\n/**\n * Client-side filter helper. Performs a case-insensitive match on the listed\n * keys when no custom predicate is provided.\n *\n * @param items - Source list.\n * @param search - Search string.\n * @param keysOrPredicate - Either a list of keys to match against or a custom predicate.\n * @returns Filtered list (referential identity preserved when search is empty).\n */\nexport function useClientFilter<T extends Record<string, unknown>>(\n items: T[],\n search: string,\n keysOrPredicate: (keyof T)[] | FilterPredicate<T>,\n): T[] {\n return useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) return items;\n if (typeof keysOrPredicate === \"function\") {\n return items.filter((item) => keysOrPredicate(item, term));\n }\n return items.filter((item) =>\n keysOrPredicate.some((key) => {\n const value = item[key];\n return value != null && String(value).toLowerCase().includes(term);\n }),\n );\n }, [items, search, keysOrPredicate]);\n}\n"],"mappings":";;AAaA,SAAgB,EACZ,GACA,GACA,GACG;CACH,OAAO,QAAc;EACjB,IAAM,IAAO,EAAO,KAAK,CAAC,CAAC,YAAY;EAKvC,OAJK,IACD,OAAO,KAAoB,aACpB,EAAM,QAAQ,MAAS,EAAgB,GAAM,CAAI,CAAC,IAEtD,EAAM,QAAQ,MACjB,EAAgB,MAAM,MAAQ;GAC1B,IAAM,IAAQ,EAAK;GACnB,OAAO,KAAS,QAAQ,OAAO,CAAK,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAI;EACrE,CAAC,CACL,IATkB;CAUtB,GAAG;EAAC;EAAO;EAAQ;CAAe,CAAC;AACvC"}
1
+ {"version":3,"file":"use-client-filter.js","names":["useClientFilter","useMemo","term","search","keysOrPredicate","items","item","value","key"],"sources":["../../src/hooks/use-client-filter.ts"],"sourcesContent":["import { useMemo } from \"react\";\n\nexport type FilterPredicate<T> = (item: T, search: string) => boolean;\n\n/**\n * Client-side filter helper. Performs a case-insensitive match on the listed\n * keys when no custom predicate is provided.\n *\n * @param items - Source list.\n * @param search - Search string.\n * @param keysOrPredicate - Either a list of keys to match against or a custom predicate.\n * @returns Filtered list (referential identity preserved when search is empty).\n */\nexport function useClientFilter<T extends Record<string, unknown>>(\n items: T[],\n search: string,\n keysOrPredicate: (keyof T)[] | FilterPredicate<T>,\n): T[] {\n return useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) return items;\n if (typeof keysOrPredicate === \"function\") {\n return items.filter((item) => keysOrPredicate(item, term));\n }\n return items.filter((item) =>\n keysOrPredicate.some((key) => {\n const value = item[key];\n return value != null && String(value).toLowerCase().includes(term);\n }),\n );\n }, [items, search, keysOrPredicate]);\n}\n"],"mappings":";;AAaA,SAAgBA,EACZ,GACA,GACA,GACG;CACH,OAAOC,QAAc;EACjB,IAAMC,IAAOC,EAAO,KAAK,CAAC,CAAC,YAAY;EAKvC,OAJKD,IACD,OAAOE,KAAoB,aACpBC,EAAM,QAAQ,MAASD,EAAgBE,GAAMJ,CAAI,CAAC,IAEtDG,EAAM,QAAQ,MACjBD,EAAgB,MAAM,MAAQ;GAC1B,IAAMG,IAAQD,EAAKE;GACnB,OAAOD,KAAS,QAAQ,OAAOA,CAAK,CAAC,CAAC,YAAY,CAAC,CAAC,SAASL,CAAI;EACrE,CAAC,CACL,IATkBG;CAUtB,GAAG;EAACA;EAAOF;EAAQC;CAAe,CAAC;AACvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-clipboard.cjs","names":[],"sources":["../../src/hooks/use-clipboard.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardOptions {\n /** Time (ms) before the `copied` flag resets back to false. Default: 1500. */\n resetAfter?: number;\n}\n\nexport interface UseClipboardResult {\n /** True briefly after a successful copy. */\n copied: boolean;\n /** Copy a string to the clipboard. Returns `true` on success. */\n copy: (text: string) => Promise<boolean>;\n /** Manually reset the `copied` flag. */\n reset: () => void;\n}\n\n/**\n * Wrapper around `navigator.clipboard.writeText` with a transient `copied`\n * flag for UI feedback (\"Copied!\" toast). Falls back gracefully when the\n * Clipboard API is unavailable.\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardResult {\n const { resetAfter = 1500 } = options;\n const [copied, setCopied] = useState<boolean>(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const reset = useCallback((): void => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n setCopied(false);\n }, []);\n\n useEffect(() => () => reset(), [reset]);\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n } else if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n } else {\n return false;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), resetAfter);\n return true;\n } catch {\n return false;\n }\n },\n [resetAfter],\n );\n\n return { copied, copy, reset };\n}\n"],"mappings":"uBAqBA,SAAgB,EAAa,EAA+B,CAAC,EAAuB,CAChF,GAAM,CAAE,aAAa,MAAS,EACxB,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAkB,EAAK,EAC7C,GAAA,EAAQ,EAAA,OAAA,CAA6C,IAAI,EAEzD,GAAA,EAAQ,EAAA,YAAA,KAAwB,CAClC,AAEI,EAAM,WADN,aAAa,EAAM,OAAO,EACV,MAEpB,EAAU,EAAK,CACnB,EAAG,CAAC,CAAC,EAgCL,OA9BA,EAAA,EAAA,UAAA,SAAsB,EAAM,EAAG,CAAC,CAAK,CAAC,EA8B/B,CAAE,SAAQ,MAAA,EA5BJ,EAAA,YAAA,CACT,KAAO,IAAmC,CACtC,GAAI,CACA,GAAI,OAAO,UAAc,KAAe,UAAU,WAAW,UACzD,MAAM,UAAU,UAAU,UAAU,CAAI,OACrC,GAAI,OAAO,SAAa,IAAa,CACxC,IAAM,EAAW,SAAS,cAAc,UAAU,EAClD,EAAS,MAAQ,EACjB,EAAS,MAAM,SAAW,QAC1B,EAAS,MAAM,QAAU,IACzB,SAAS,KAAK,YAAY,CAAQ,EAClC,EAAS,OAAO,EAChB,SAAS,YAAY,MAAM,EAC3B,SAAS,KAAK,YAAY,CAAQ,CACtC,MACI,MAAO,GAKX,OAHA,EAAU,EAAI,EACV,EAAM,SAAS,aAAa,EAAM,OAAO,EAC7C,EAAM,QAAU,eAAiB,EAAU,EAAK,EAAG,CAAU,EACtD,EACX,MAAQ,CACJ,MAAO,EACX,CACJ,EACA,CAAC,CAAU,CAGE,EAAM,OAAM,CACjC"}
1
+ {"version":3,"file":"use-clipboard.cjs","names":["useState","useRef","useCallback","react","useClipboard","options","copied","setCopied","timer","reset","text","textarea","resetAfter"],"sources":["../../src/hooks/use-clipboard.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardOptions {\n /** Time (ms) before the `copied` flag resets back to false. Default: 1500. */\n resetAfter?: number;\n}\n\nexport interface UseClipboardResult {\n /** True briefly after a successful copy. */\n copied: boolean;\n /** Copy a string to the clipboard. Returns `true` on success. */\n copy: (text: string) => Promise<boolean>;\n /** Manually reset the `copied` flag. */\n reset: () => void;\n}\n\n/**\n * Wrapper around `navigator.clipboard.writeText` with a transient `copied`\n * flag for UI feedback (\"Copied!\" toast). Falls back gracefully when the\n * Clipboard API is unavailable.\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardResult {\n const { resetAfter = 1500 } = options;\n const [copied, setCopied] = useState<boolean>(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const reset = useCallback((): void => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n setCopied(false);\n }, []);\n\n useEffect(() => () => reset(), [reset]);\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n } else if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n } else {\n return false;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), resetAfter);\n return true;\n } catch {\n return false;\n }\n },\n [resetAfter],\n );\n\n return { copied, copy, reset };\n}\n"],"mappings":"A,uBAqBA,SAAgBI,EAAa,EAA+B,CAAC,EAAuB,CAChF,GAAM,CAAE,aAAa,MAASC,EACxB,CAACC,EAAQC,IAAA,EAAaP,EAAAA,SAAAA,CAAkB,EAAK,EAC7CQ,GAAA,EAAQP,EAAAA,OAAAA,CAA6C,IAAI,EAEzDQ,GAAA,EAAQP,EAAAA,YAAAA,KAAwB,CAClC,AAEIM,EAAM,WADN,aAAaA,EAAM,OAAO,EACV,MAEpBD,EAAU,EAAK,CACnB,EAAG,CAAC,CAAC,EAgCL,OA9BA,EAAAJ,EAAA,UAAA,SAAsBM,EAAM,EAAG,CAACA,CAAK,CAAC,EA8B/B,CAAE,SAAQ,MAAA,EA5BJP,EAAAA,YAAAA,CACT,KAAO,IAAmC,CACtC,GAAI,CACA,GAAI,OAAO,UAAc,KAAe,UAAU,WAAW,UACzD,MAAM,UAAU,UAAU,UAAUQ,CAAI,OACrC,GAAI,OAAO,SAAa,IAAa,CACxC,IAAMC,EAAW,SAAS,cAAc,UAAU,EAClD,EAAS,MAAQD,EACjB,EAAS,MAAM,SAAW,QAC1B,EAAS,MAAM,QAAU,IACzB,SAAS,KAAK,YAAYC,CAAQ,EAClCA,EAAS,OAAO,EAChB,SAAS,YAAY,MAAM,EAC3B,SAAS,KAAK,YAAYA,CAAQ,CACtC,MACI,MAAO,GAKX,OAHAJ,EAAU,EAAI,EACVC,EAAM,SAAS,aAAaA,EAAM,OAAO,EAC7C,EAAM,QAAU,eAAiBD,EAAU,EAAK,EAAGK,CAAU,EACtD,EACX,MAAQ,CACJ,MAAO,EACX,CACJ,EACA,CAACA,CAAU,CAGE,EAAM,OAAM,CACjC,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-clipboard.js","names":[],"sources":["../../src/hooks/use-clipboard.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardOptions {\n /** Time (ms) before the `copied` flag resets back to false. Default: 1500. */\n resetAfter?: number;\n}\n\nexport interface UseClipboardResult {\n /** True briefly after a successful copy. */\n copied: boolean;\n /** Copy a string to the clipboard. Returns `true` on success. */\n copy: (text: string) => Promise<boolean>;\n /** Manually reset the `copied` flag. */\n reset: () => void;\n}\n\n/**\n * Wrapper around `navigator.clipboard.writeText` with a transient `copied`\n * flag for UI feedback (\"Copied!\" toast). Falls back gracefully when the\n * Clipboard API is unavailable.\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardResult {\n const { resetAfter = 1500 } = options;\n const [copied, setCopied] = useState<boolean>(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const reset = useCallback((): void => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n setCopied(false);\n }, []);\n\n useEffect(() => () => reset(), [reset]);\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n } else if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n } else {\n return false;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), resetAfter);\n return true;\n } catch {\n return false;\n }\n },\n [resetAfter],\n );\n\n return { copied, copy, reset };\n}\n"],"mappings":";;AAqBA,SAAgB,EAAa,IAA+B,CAAC,GAAuB;CAChF,IAAM,EAAE,gBAAa,SAAS,GACxB,CAAC,GAAQ,KAAa,EAAkB,EAAK,GAC7C,IAAQ,EAA6C,IAAI,GAEzD,IAAQ,QAAwB;EAKlC,AAJA,AAEI,EAAM,aADN,aAAa,EAAM,OAAO,GACV,OAEpB,EAAU,EAAK;CACnB,GAAG,CAAC,CAAC;CAgCL,OA9BA,cAAsB,EAAM,GAAG,CAAC,CAAK,CAAC,GA8B/B;EAAE;EAAQ,MA5BJ,EACT,OAAO,MAAmC;GACtC,IAAI;IACA,IAAI,OAAO,YAAc,OAAe,UAAU,WAAW,WACzD,MAAM,UAAU,UAAU,UAAU,CAAI;SACrC,IAAI,OAAO,WAAa,KAAa;KACxC,IAAM,IAAW,SAAS,cAAc,UAAU;KAOlD,AANA,EAAS,QAAQ,GACjB,EAAS,MAAM,WAAW,SAC1B,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAY,CAAQ,GAClC,EAAS,OAAO,GAChB,SAAS,YAAY,MAAM,GAC3B,SAAS,KAAK,YAAY,CAAQ;IACtC,OACI,OAAO;IAKX,OAHA,EAAU,EAAI,GACV,EAAM,WAAS,aAAa,EAAM,OAAO,GAC7C,EAAM,UAAU,iBAAiB,EAAU,EAAK,GAAG,CAAU,GACtD;GACX,QAAQ;IACJ,OAAO;GACX;EACJ,GACA,CAAC,CAAU,CAGE;EAAM;CAAM;AACjC"}
1
+ {"version":3,"file":"use-clipboard.js","names":["useClipboard","options","copied","setCopied","useState","timer","useRef","reset","useCallback","useEffect","text","textarea","resetAfter"],"sources":["../../src/hooks/use-clipboard.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardOptions {\n /** Time (ms) before the `copied` flag resets back to false. Default: 1500. */\n resetAfter?: number;\n}\n\nexport interface UseClipboardResult {\n /** True briefly after a successful copy. */\n copied: boolean;\n /** Copy a string to the clipboard. Returns `true` on success. */\n copy: (text: string) => Promise<boolean>;\n /** Manually reset the `copied` flag. */\n reset: () => void;\n}\n\n/**\n * Wrapper around `navigator.clipboard.writeText` with a transient `copied`\n * flag for UI feedback (\"Copied!\" toast). Falls back gracefully when the\n * Clipboard API is unavailable.\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardResult {\n const { resetAfter = 1500 } = options;\n const [copied, setCopied] = useState<boolean>(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const reset = useCallback((): void => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n setCopied(false);\n }, []);\n\n useEffect(() => () => reset(), [reset]);\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n } else if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n } else {\n return false;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), resetAfter);\n return true;\n } catch {\n return false;\n }\n },\n [resetAfter],\n );\n\n return { copied, copy, reset };\n}\n"],"mappings":";;AAqBA,SAAgBA,EAAa,IAA+B,CAAC,GAAuB;CAChF,IAAM,EAAE,gBAAa,SAASC,GACxB,CAACC,GAAQC,KAAaC,EAAkB,EAAK,GAC7CC,IAAQC,EAA6C,IAAI,GAEzDC,IAAQC,QAAwB;EAKlC,AAJA,AAEIH,EAAM,aADN,aAAaA,EAAM,OAAO,GACV,OAEpBF,EAAU,EAAK;CACnB,GAAG,CAAC,CAAC;CAgCL,OA9BAM,cAAsBF,EAAM,GAAG,CAACA,CAAK,CAAC,GA8B/B;EAAE;EAAQ,MA5BJC,EACT,OAAO,MAAmC;GACtC,IAAI;IACA,IAAI,OAAO,YAAc,OAAe,UAAU,WAAW,WACzD,MAAM,UAAU,UAAU,UAAUE,CAAI;SACrC,IAAI,OAAO,WAAa,KAAa;KACxC,IAAMC,IAAW,SAAS,cAAc,UAAU;KAOlD,AANA,EAAS,QAAQD,GACjB,EAAS,MAAM,WAAW,SAC1B,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAYC,CAAQ,GAClCA,EAAS,OAAO,GAChB,SAAS,YAAY,MAAM,GAC3B,SAAS,KAAK,YAAYA,CAAQ;IACtC,OACI,OAAO;IAKX,OAHAR,EAAU,EAAI,GACVE,EAAM,WAAS,aAAaA,EAAM,OAAO,GAC7C,EAAM,UAAU,iBAAiBF,EAAU,EAAK,GAAGS,CAAU,GACtD;GACX,QAAQ;IACJ,OAAO;GACX;EACJ,GACA,CAACA,CAAU,CAGE;EAAM;CAAM;AACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-countdown.cjs","names":[],"sources":["../../src/hooks/use-countdown.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport { useInterval } from \"./use-interval\";\n\n/** Options for {@link useCountdown}. */\nexport interface UseCountdownOptions {\n /**\n * How often the remaining time is recomputed, in ms. Default `1000`, which\n * suits a \"try again in 3s\" label; drop it to ~50 to drive a progress bar.\n */\n tickMs?: number;\n}\n\n/**\n * Counts down the time left on a window that started at a known instant.\n *\n * Written around a timestamp rather than a decrementing counter on purpose: the\n * remaining time is recomputed from `Date.now()` on every tick, so a throttled\n * background tab, a slow frame or a `setInterval` that drifts cannot make the\n * countdown disagree with the clock. Remounting recovers the correct value too,\n * which a counter held in state cannot do.\n *\n * The interval stops once it reaches zero instead of ticking forever behind a\n * clamp — `useInterval` pauses on a `null` delay, so reaching zero is what tears\n * the timer down.\n *\n * @param durationMs - Length of the window.\n * @param startedAt - Epoch ms the window opened (`Date.now()` when it started).\n * @param options - Tick cadence.\n * @returns Milliseconds remaining, never below `0`.\n *\n * @example\n * const remaining = useCountdown(60_000, lastSentAt);\n *\n * <button disabled={remaining > 0}>\n * {remaining > 0 ? `Reenviar em ${Math.ceil(remaining / 1000)}s` : \"Reenviar código\"}\n * </button>\n */\nexport function useCountdown(\n durationMs: number,\n startedAt: number,\n options: UseCountdownOptions = {},\n): number {\n const { tickMs = 1000 } = options;\n\n const compute = useCallback(\n () => Math.max(0, durationMs - (Date.now() - startedAt)),\n [durationMs, startedAt],\n );\n\n const [remaining, setRemaining] = useState(compute);\n\n useEffect(() => {\n setRemaining(compute());\n }, [compute]);\n\n useInterval(() => setRemaining(compute()), remaining > 0 ? tickMs : null);\n\n return remaining;\n}\n"],"mappings":"6DAqCA,SAAgB,EACZ,EACA,EACA,EAA+B,CAAC,EAC1B,CACN,GAAM,CAAE,SAAS,KAAS,EAEpB,GAAA,EAAU,EAAA,YAAA,KACN,KAAK,IAAI,EAAG,GAAc,KAAK,IAAI,EAAI,EAAU,EACvD,CAAC,EAAY,CAAS,CAC1B,EAEM,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAS,CAAO,EAQlD,OANA,EAAA,EAAA,UAAA,KAAgB,CACZ,EAAa,EAAQ,CAAC,CAC1B,EAAG,CAAC,CAAO,CAAC,EAEZ,EAAA,gBAAkB,EAAa,EAAQ,CAAC,EAAG,EAAY,EAAI,EAAS,IAAI,EAEjE,CACX"}
1
+ {"version":3,"file":"use-countdown.cjs","names":["useCallback","useState","require_use_interval","react","useCountdown","options","compute","durationMs","startedAt","remaining","setRemaining","tickMs"],"sources":["../../src/hooks/use-countdown.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport { useInterval } from \"./use-interval\";\n\n/** Options for {@link useCountdown}. */\nexport interface UseCountdownOptions {\n /**\n * How often the remaining time is recomputed, in ms. Default `1000`, which\n * suits a \"try again in 3s\" label; drop it to ~50 to drive a progress bar.\n */\n tickMs?: number;\n}\n\n/**\n * Counts down the time left on a window that started at a known instant.\n *\n * Written around a timestamp rather than a decrementing counter on purpose: the\n * remaining time is recomputed from `Date.now()` on every tick, so a throttled\n * background tab, a slow frame or a `setInterval` that drifts cannot make the\n * countdown disagree with the clock. Remounting recovers the correct value too,\n * which a counter held in state cannot do.\n *\n * The interval stops once it reaches zero instead of ticking forever behind a\n * clamp — `useInterval` pauses on a `null` delay, so reaching zero is what tears\n * the timer down.\n *\n * @param durationMs - Length of the window.\n * @param startedAt - Epoch ms the window opened (`Date.now()` when it started).\n * @param options - Tick cadence.\n * @returns Milliseconds remaining, never below `0`.\n *\n * @example\n * const remaining = useCountdown(60_000, lastSentAt);\n *\n * <button disabled={remaining > 0}>\n * {remaining > 0 ? `Reenviar em ${Math.ceil(remaining / 1000)}s` : \"Reenviar código\"}\n * </button>\n */\nexport function useCountdown(\n durationMs: number,\n startedAt: number,\n options: UseCountdownOptions = {},\n): number {\n const { tickMs = 1000 } = options;\n\n const compute = useCallback(\n () => Math.max(0, durationMs - (Date.now() - startedAt)),\n [durationMs, startedAt],\n );\n\n const [remaining, setRemaining] = useState(compute);\n\n useEffect(() => {\n setRemaining(compute());\n }, [compute]);\n\n useInterval(() => setRemaining(compute()), remaining > 0 ? tickMs : null);\n\n return remaining;\n}\n"],"mappings":"A,6DAqCA,SAAgBI,EACZ,EACA,EACA,EAA+B,CAAC,EAC1B,CACN,GAAM,CAAE,SAAS,KAASC,EAEpBC,GAAA,EAAUN,EAAAA,YAAAA,KACN,KAAK,IAAI,EAAGO,GAAc,KAAK,IAAI,EAAIC,EAAU,EACvD,CAACD,EAAYC,CAAS,CAC1B,EAEM,CAACC,EAAWC,IAAA,EAAgBT,EAAAA,SAAAA,CAASK,CAAO,EAQlD,OANA,EAAAH,EAAA,UAAA,KAAgB,CACZO,EAAaJ,EAAQ,CAAC,CAC1B,EAAG,CAACA,CAAO,CAAC,EAEZJ,EAAA,gBAAkBQ,EAAaJ,EAAQ,CAAC,EAAGG,EAAY,EAAIE,EAAS,IAAI,EAEjEF,CACX,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-countdown.js","names":[],"sources":["../../src/hooks/use-countdown.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport { useInterval } from \"./use-interval\";\n\n/** Options for {@link useCountdown}. */\nexport interface UseCountdownOptions {\n /**\n * How often the remaining time is recomputed, in ms. Default `1000`, which\n * suits a \"try again in 3s\" label; drop it to ~50 to drive a progress bar.\n */\n tickMs?: number;\n}\n\n/**\n * Counts down the time left on a window that started at a known instant.\n *\n * Written around a timestamp rather than a decrementing counter on purpose: the\n * remaining time is recomputed from `Date.now()` on every tick, so a throttled\n * background tab, a slow frame or a `setInterval` that drifts cannot make the\n * countdown disagree with the clock. Remounting recovers the correct value too,\n * which a counter held in state cannot do.\n *\n * The interval stops once it reaches zero instead of ticking forever behind a\n * clamp — `useInterval` pauses on a `null` delay, so reaching zero is what tears\n * the timer down.\n *\n * @param durationMs - Length of the window.\n * @param startedAt - Epoch ms the window opened (`Date.now()` when it started).\n * @param options - Tick cadence.\n * @returns Milliseconds remaining, never below `0`.\n *\n * @example\n * const remaining = useCountdown(60_000, lastSentAt);\n *\n * <button disabled={remaining > 0}>\n * {remaining > 0 ? `Reenviar em ${Math.ceil(remaining / 1000)}s` : \"Reenviar código\"}\n * </button>\n */\nexport function useCountdown(\n durationMs: number,\n startedAt: number,\n options: UseCountdownOptions = {},\n): number {\n const { tickMs = 1000 } = options;\n\n const compute = useCallback(\n () => Math.max(0, durationMs - (Date.now() - startedAt)),\n [durationMs, startedAt],\n );\n\n const [remaining, setRemaining] = useState(compute);\n\n useEffect(() => {\n setRemaining(compute());\n }, [compute]);\n\n useInterval(() => setRemaining(compute()), remaining > 0 ? tickMs : null);\n\n return remaining;\n}\n"],"mappings":";;;AAqCA,SAAgB,EACZ,GACA,GACA,IAA+B,CAAC,GAC1B;CACN,IAAM,EAAE,YAAS,QAAS,GAEpB,IAAU,QACN,KAAK,IAAI,GAAG,KAAc,KAAK,IAAI,IAAI,EAAU,GACvD,CAAC,GAAY,CAAS,CAC1B,GAEM,CAAC,GAAW,KAAgB,EAAS,CAAO;CAQlD,OANA,QAAgB;EACZ,EAAa,EAAQ,CAAC;CAC1B,GAAG,CAAC,CAAO,CAAC,GAEZ,QAAkB,EAAa,EAAQ,CAAC,GAAG,IAAY,IAAI,IAAS,IAAI,GAEjE;AACX"}
1
+ {"version":3,"file":"use-countdown.js","names":["useCountdown","options","compute","useCallback","durationMs","startedAt","remaining","setRemaining","useState","useEffect","useInterval","tickMs"],"sources":["../../src/hooks/use-countdown.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport { useInterval } from \"./use-interval\";\n\n/** Options for {@link useCountdown}. */\nexport interface UseCountdownOptions {\n /**\n * How often the remaining time is recomputed, in ms. Default `1000`, which\n * suits a \"try again in 3s\" label; drop it to ~50 to drive a progress bar.\n */\n tickMs?: number;\n}\n\n/**\n * Counts down the time left on a window that started at a known instant.\n *\n * Written around a timestamp rather than a decrementing counter on purpose: the\n * remaining time is recomputed from `Date.now()` on every tick, so a throttled\n * background tab, a slow frame or a `setInterval` that drifts cannot make the\n * countdown disagree with the clock. Remounting recovers the correct value too,\n * which a counter held in state cannot do.\n *\n * The interval stops once it reaches zero instead of ticking forever behind a\n * clamp — `useInterval` pauses on a `null` delay, so reaching zero is what tears\n * the timer down.\n *\n * @param durationMs - Length of the window.\n * @param startedAt - Epoch ms the window opened (`Date.now()` when it started).\n * @param options - Tick cadence.\n * @returns Milliseconds remaining, never below `0`.\n *\n * @example\n * const remaining = useCountdown(60_000, lastSentAt);\n *\n * <button disabled={remaining > 0}>\n * {remaining > 0 ? `Reenviar em ${Math.ceil(remaining / 1000)}s` : \"Reenviar código\"}\n * </button>\n */\nexport function useCountdown(\n durationMs: number,\n startedAt: number,\n options: UseCountdownOptions = {},\n): number {\n const { tickMs = 1000 } = options;\n\n const compute = useCallback(\n () => Math.max(0, durationMs - (Date.now() - startedAt)),\n [durationMs, startedAt],\n );\n\n const [remaining, setRemaining] = useState(compute);\n\n useEffect(() => {\n setRemaining(compute());\n }, [compute]);\n\n useInterval(() => setRemaining(compute()), remaining > 0 ? tickMs : null);\n\n return remaining;\n}\n"],"mappings":";;;AAqCA,SAAgBA,EACZ,GACA,GACA,IAA+B,CAAC,GAC1B;CACN,IAAM,EAAE,YAAS,QAASC,GAEpBC,IAAUC,QACN,KAAK,IAAI,GAAGC,KAAc,KAAK,IAAI,IAAIC,EAAU,GACvD,CAACD,GAAYC,CAAS,CAC1B,GAEM,CAACC,GAAWC,KAAgBC,EAASN,CAAO;CAQlD,OANAO,QAAgB;EACZ,EAAaP,EAAQ,CAAC;CAC1B,GAAG,CAACA,CAAO,CAAC,GAEZQ,QAAkBH,EAAaL,EAAQ,CAAC,GAAGI,IAAY,IAAIK,IAAS,IAAI,GAEjEL;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-counter.cjs","names":[],"sources":["../../src/hooks/use-counter.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseCounterOptions {\n min?: number;\n max?: number;\n}\n\nexport interface CounterHandlers {\n increment: () => void;\n decrement: () => void;\n set: (value: number) => void;\n reset: () => void;\n}\n\nconst clamp = (value: number, min: number | undefined, max: number | undefined): number => {\n let next = value;\n if (typeof min === \"number\") next = Math.max(min, next);\n if (typeof max === \"number\") next = Math.min(max, next);\n return next;\n};\n\n/**\n * Numeric counter clamped to an optional `[min, max]` range.\n *\n * @param initial - initial value (default `0`), clamped to the range.\n * @param options - optional `min` / `max` bounds.\n * @returns Tuple `[count, { increment, decrement, set, reset }]`.\n */\nexport function useCounter(\n initial = 0,\n options: UseCounterOptions = {},\n): [number, CounterHandlers] {\n const { min, max } = options;\n const [count, setCount] = useState<number>(() => clamp(initial, min, max));\n\n const increment = useCallback((): void => {\n setCount((current) => clamp(current + 1, min, max));\n }, [min, max]);\n\n const decrement = useCallback((): void => {\n setCount((current) => clamp(current - 1, min, max));\n }, [min, max]);\n\n const set = useCallback(\n (value: number): void => {\n setCount(clamp(value, min, max));\n },\n [min, max],\n );\n\n const reset = useCallback((): void => {\n setCount(clamp(initial, min, max));\n }, [initial, min, max]);\n\n const handlers = useMemo<CounterHandlers>(\n () => ({ increment, decrement, set, reset }),\n [increment, decrement, set, reset],\n );\n\n return [count, handlers];\n}\n"],"mappings":"uBAcA,IAAM,GAAS,EAAe,EAAyB,IAAoC,CACvF,IAAI,EAAO,EAGX,OAFI,OAAO,GAAQ,WAAU,EAAO,KAAK,IAAI,EAAK,CAAI,GAClD,OAAO,GAAQ,WAAU,EAAO,KAAK,IAAI,EAAK,CAAI,GAC/C,CACX,EASA,SAAgB,EACZ,EAAU,EACV,EAA6B,CAAC,EACL,CACzB,GAAM,CAAE,MAAK,OAAQ,EACf,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,KAAuB,EAAM,EAAS,EAAK,CAAG,CAAC,EAEnE,GAAA,EAAY,EAAA,YAAA,KAAwB,CACtC,EAAU,GAAY,EAAM,EAAU,EAAG,EAAK,CAAG,CAAC,CACtD,EAAG,CAAC,EAAK,CAAG,CAAC,EAEP,GAAA,EAAY,EAAA,YAAA,KAAwB,CACtC,EAAU,GAAY,EAAM,EAAU,EAAG,EAAK,CAAG,CAAC,CACtD,EAAG,CAAC,EAAK,CAAG,CAAC,EAEP,GAAA,EAAM,EAAA,YAAA,CACP,GAAwB,CACrB,EAAS,EAAM,EAAO,EAAK,CAAG,CAAC,CACnC,EACA,CAAC,EAAK,CAAG,CACb,EAEM,GAAA,EAAQ,EAAA,YAAA,KAAwB,CAClC,EAAS,EAAM,EAAS,EAAK,CAAG,CAAC,CACrC,EAAG,CAAC,EAAS,EAAK,CAAG,CAAC,EAOtB,MAAO,CAAC,GAAA,EALS,EAAA,QAAA,MACN,CAAE,YAAW,YAAW,MAAK,OAAM,GAC1C,CAAC,EAAW,EAAW,EAAK,CAAK,CAGtB,CAAQ,CAC3B"}
1
+ {"version":3,"file":"use-counter.cjs","names":["useState","useCallback","useMemo","react","clamp","next","value","min","max","useCounter","options","count","setCount","initial","increment","current","decrement","set","reset"],"sources":["../../src/hooks/use-counter.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseCounterOptions {\n min?: number;\n max?: number;\n}\n\nexport interface CounterHandlers {\n increment: () => void;\n decrement: () => void;\n set: (value: number) => void;\n reset: () => void;\n}\n\nconst clamp = (value: number, min: number | undefined, max: number | undefined): number => {\n let next = value;\n if (typeof min === \"number\") next = Math.max(min, next);\n if (typeof max === \"number\") next = Math.min(max, next);\n return next;\n};\n\n/**\n * Numeric counter clamped to an optional `[min, max]` range.\n *\n * @param initial - initial value (default `0`), clamped to the range.\n * @param options - optional `min` / `max` bounds.\n * @returns Tuple `[count, { increment, decrement, set, reset }]`.\n */\nexport function useCounter(\n initial = 0,\n options: UseCounterOptions = {},\n): [number, CounterHandlers] {\n const { min, max } = options;\n const [count, setCount] = useState<number>(() => clamp(initial, min, max));\n\n const increment = useCallback((): void => {\n setCount((current) => clamp(current + 1, min, max));\n }, [min, max]);\n\n const decrement = useCallback((): void => {\n setCount((current) => clamp(current - 1, min, max));\n }, [min, max]);\n\n const set = useCallback(\n (value: number): void => {\n setCount(clamp(value, min, max));\n },\n [min, max],\n );\n\n const reset = useCallback((): void => {\n setCount(clamp(initial, min, max));\n }, [initial, min, max]);\n\n const handlers = useMemo<CounterHandlers>(\n () => ({ increment, decrement, set, reset }),\n [increment, decrement, set, reset],\n );\n\n return [count, handlers];\n}\n"],"mappings":"A,uBAcA,IAAMI,GAAS,EAAe,EAAyB,IAAoC,CACvF,IAAIC,EAAOC,EAGX,OAFI,OAAOC,GAAQ,WAAU,EAAO,KAAK,IAAIA,EAAKF,CAAI,GAClD,OAAOG,GAAQ,WAAU,EAAO,KAAK,IAAIA,EAAKH,CAAI,GAC/CA,CACX,EASA,SAAgBI,EACZ,EAAU,EACV,EAA6B,CAAC,EACL,CACzB,GAAM,CAAE,MAAK,OAAQC,EACf,CAACC,EAAOC,IAAA,EAAYZ,EAAAA,SAAAA,KAAuBI,EAAMS,EAASN,EAAKC,CAAG,CAAC,EAEnEM,GAAA,EAAYb,EAAAA,YAAAA,KAAwB,CACtCW,EAAU,GAAYR,EAAMW,EAAU,EAAGR,EAAKC,CAAG,CAAC,CACtD,EAAG,CAACD,EAAKC,CAAG,CAAC,EAEPQ,GAAA,EAAYf,EAAAA,YAAAA,KAAwB,CACtCW,EAAU,GAAYR,EAAMW,EAAU,EAAGR,EAAKC,CAAG,CAAC,CACtD,EAAG,CAACD,EAAKC,CAAG,CAAC,EAEPS,GAAA,EAAMhB,EAAAA,YAAAA,CACP,GAAwB,CACrBW,EAASR,EAAME,EAAOC,EAAKC,CAAG,CAAC,CACnC,EACA,CAACD,EAAKC,CAAG,CACb,EAEMU,GAAA,EAAQjB,EAAAA,YAAAA,KAAwB,CAClCW,EAASR,EAAMS,EAASN,EAAKC,CAAG,CAAC,CACrC,EAAG,CAACK,EAASN,EAAKC,CAAG,CAAC,EAOtB,MAAO,CAACG,GAAA,EALST,EAAAA,QAAAA,MACN,CAAE,YAAW,YAAW,MAAK,OAAM,GAC1C,CAACY,EAAWE,EAAWC,EAAKC,CAAK,CAGtB,CAAQ,CAC3B,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-counter.js","names":[],"sources":["../../src/hooks/use-counter.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseCounterOptions {\n min?: number;\n max?: number;\n}\n\nexport interface CounterHandlers {\n increment: () => void;\n decrement: () => void;\n set: (value: number) => void;\n reset: () => void;\n}\n\nconst clamp = (value: number, min: number | undefined, max: number | undefined): number => {\n let next = value;\n if (typeof min === \"number\") next = Math.max(min, next);\n if (typeof max === \"number\") next = Math.min(max, next);\n return next;\n};\n\n/**\n * Numeric counter clamped to an optional `[min, max]` range.\n *\n * @param initial - initial value (default `0`), clamped to the range.\n * @param options - optional `min` / `max` bounds.\n * @returns Tuple `[count, { increment, decrement, set, reset }]`.\n */\nexport function useCounter(\n initial = 0,\n options: UseCounterOptions = {},\n): [number, CounterHandlers] {\n const { min, max } = options;\n const [count, setCount] = useState<number>(() => clamp(initial, min, max));\n\n const increment = useCallback((): void => {\n setCount((current) => clamp(current + 1, min, max));\n }, [min, max]);\n\n const decrement = useCallback((): void => {\n setCount((current) => clamp(current - 1, min, max));\n }, [min, max]);\n\n const set = useCallback(\n (value: number): void => {\n setCount(clamp(value, min, max));\n },\n [min, max],\n );\n\n const reset = useCallback((): void => {\n setCount(clamp(initial, min, max));\n }, [initial, min, max]);\n\n const handlers = useMemo<CounterHandlers>(\n () => ({ increment, decrement, set, reset }),\n [increment, decrement, set, reset],\n );\n\n return [count, handlers];\n}\n"],"mappings":";;AAcA,IAAM,KAAS,GAAe,GAAyB,MAAoC;CACvF,IAAI,IAAO;CAGX,OAFI,OAAO,KAAQ,aAAU,IAAO,KAAK,IAAI,GAAK,CAAI,IAClD,OAAO,KAAQ,aAAU,IAAO,KAAK,IAAI,GAAK,CAAI,IAC/C;AACX;AASA,SAAgB,EACZ,IAAU,GACV,IAA6B,CAAC,GACL;CACzB,IAAM,EAAE,QAAK,WAAQ,GACf,CAAC,GAAO,KAAY,QAAuB,EAAM,GAAS,GAAK,CAAG,CAAC,GAEnE,IAAY,QAAwB;EACtC,GAAU,MAAY,EAAM,IAAU,GAAG,GAAK,CAAG,CAAC;CACtD,GAAG,CAAC,GAAK,CAAG,CAAC,GAEP,IAAY,QAAwB;EACtC,GAAU,MAAY,EAAM,IAAU,GAAG,GAAK,CAAG,CAAC;CACtD,GAAG,CAAC,GAAK,CAAG,CAAC,GAEP,IAAM,GACP,MAAwB;EACrB,EAAS,EAAM,GAAO,GAAK,CAAG,CAAC;CACnC,GACA,CAAC,GAAK,CAAG,CACb,GAEM,IAAQ,QAAwB;EAClC,EAAS,EAAM,GAAS,GAAK,CAAG,CAAC;CACrC,GAAG;EAAC;EAAS;EAAK;CAAG,CAAC;CAOtB,OAAO,CAAC,GALS,SACN;EAAE;EAAW;EAAW;EAAK;CAAM,IAC1C;EAAC;EAAW;EAAW;EAAK;CAAK,CAGtB,CAAQ;AAC3B"}
1
+ {"version":3,"file":"use-counter.js","names":["clamp","next","value","min","max","useCounter","options","count","setCount","useState","initial","increment","useCallback","current","decrement","set","reset","useMemo"],"sources":["../../src/hooks/use-counter.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseCounterOptions {\n min?: number;\n max?: number;\n}\n\nexport interface CounterHandlers {\n increment: () => void;\n decrement: () => void;\n set: (value: number) => void;\n reset: () => void;\n}\n\nconst clamp = (value: number, min: number | undefined, max: number | undefined): number => {\n let next = value;\n if (typeof min === \"number\") next = Math.max(min, next);\n if (typeof max === \"number\") next = Math.min(max, next);\n return next;\n};\n\n/**\n * Numeric counter clamped to an optional `[min, max]` range.\n *\n * @param initial - initial value (default `0`), clamped to the range.\n * @param options - optional `min` / `max` bounds.\n * @returns Tuple `[count, { increment, decrement, set, reset }]`.\n */\nexport function useCounter(\n initial = 0,\n options: UseCounterOptions = {},\n): [number, CounterHandlers] {\n const { min, max } = options;\n const [count, setCount] = useState<number>(() => clamp(initial, min, max));\n\n const increment = useCallback((): void => {\n setCount((current) => clamp(current + 1, min, max));\n }, [min, max]);\n\n const decrement = useCallback((): void => {\n setCount((current) => clamp(current - 1, min, max));\n }, [min, max]);\n\n const set = useCallback(\n (value: number): void => {\n setCount(clamp(value, min, max));\n },\n [min, max],\n );\n\n const reset = useCallback((): void => {\n setCount(clamp(initial, min, max));\n }, [initial, min, max]);\n\n const handlers = useMemo<CounterHandlers>(\n () => ({ increment, decrement, set, reset }),\n [increment, decrement, set, reset],\n );\n\n return [count, handlers];\n}\n"],"mappings":";;AAcA,IAAMA,KAAS,GAAe,GAAyB,MAAoC;CACvF,IAAIC,IAAOC;CAGX,OAFI,OAAOC,KAAQ,aAAU,IAAO,KAAK,IAAIA,GAAKF,CAAI,IAClD,OAAOG,KAAQ,aAAU,IAAO,KAAK,IAAIA,GAAKH,CAAI,IAC/CA;AACX;AASA,SAAgBI,EACZ,IAAU,GACV,IAA6B,CAAC,GACL;CACzB,IAAM,EAAE,QAAK,WAAQC,GACf,CAACC,GAAOC,KAAYC,QAAuBT,EAAMU,GAASP,GAAKC,CAAG,CAAC,GAEnEO,IAAYC,QAAwB;EACtC,GAAU,MAAYZ,EAAMa,IAAU,GAAGV,GAAKC,CAAG,CAAC;CACtD,GAAG,CAACD,GAAKC,CAAG,CAAC,GAEPU,IAAYF,QAAwB;EACtC,GAAU,MAAYZ,EAAMa,IAAU,GAAGV,GAAKC,CAAG,CAAC;CACtD,GAAG,CAACD,GAAKC,CAAG,CAAC,GAEPW,IAAMH,GACP,MAAwB;EACrB,EAASZ,EAAME,GAAOC,GAAKC,CAAG,CAAC;CACnC,GACA,CAACD,GAAKC,CAAG,CACb,GAEMY,IAAQJ,QAAwB;EAClC,EAASZ,EAAMU,GAASP,GAAKC,CAAG,CAAC;CACrC,GAAG;EAACM;EAASP;EAAKC;CAAG,CAAC;CAOtB,OAAO,CAACG,GALSU,SACN;EAAE;EAAW;EAAW;EAAK;CAAM,IAC1C;EAACN;EAAWG;EAAWC;EAAKC;CAAK,CAGtB,CAAQ;AAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-debounce.cjs","names":[],"sources":["../../src/hooks/use-debounce.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Debounce a fast-changing value. Returns the latest value once `delay` ms\n * have elapsed without further changes.\n *\n * @param value - The value to debounce.\n * @param delay - Delay in milliseconds (default 300).\n * @returns The debounced value.\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n"],"mappings":"uBAUA,SAAgB,EAAe,EAAU,EAAQ,IAAQ,CACrD,GAAM,CAAC,EAAgB,IAAA,EAAqB,EAAA,SAAA,CAAY,CAAK,EAO7D,OALA,EAAA,EAAA,UAAA,KAAgB,CACZ,IAAM,EAAQ,eAAiB,EAAkB,CAAK,EAAG,CAAK,EAC9D,UAAa,aAAa,CAAK,CACnC,EAAG,CAAC,EAAO,CAAK,CAAC,EAEV,CACX"}
1
+ {"version":3,"file":"use-debounce.cjs","names":["useState","react","useDebounce","debouncedValue","setDebouncedValue","value","timer","delay"],"sources":["../../src/hooks/use-debounce.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Debounce a fast-changing value. Returns the latest value once `delay` ms\n * have elapsed without further changes.\n *\n * @param value - The value to debounce.\n * @param delay - Delay in milliseconds (default 300).\n * @returns The debounced value.\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n"],"mappings":"A,uBAUA,SAAgBE,EAAe,EAAU,EAAQ,IAAQ,CACrD,GAAM,CAACC,EAAgBC,IAAA,EAAqBJ,EAAAA,SAAAA,CAAYK,CAAK,EAO7D,OALA,EAAAJ,EAAA,UAAA,KAAgB,CACZ,IAAMK,EAAQ,eAAiBF,EAAkBC,CAAK,EAAGE,CAAK,EAC9D,UAAa,aAAaD,CAAK,CACnC,EAAG,CAACD,EAAOE,CAAK,CAAC,EAEVJ,CACX,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-debounce.js","names":[],"sources":["../../src/hooks/use-debounce.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Debounce a fast-changing value. Returns the latest value once `delay` ms\n * have elapsed without further changes.\n *\n * @param value - The value to debounce.\n * @param delay - Delay in milliseconds (default 300).\n * @returns The debounced value.\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n"],"mappings":";;AAUA,SAAgB,EAAe,GAAU,IAAQ,KAAQ;CACrD,IAAM,CAAC,GAAgB,KAAqB,EAAY,CAAK;CAO7D,OALA,QAAgB;EACZ,IAAM,IAAQ,iBAAiB,EAAkB,CAAK,GAAG,CAAK;EAC9D,aAAa,aAAa,CAAK;CACnC,GAAG,CAAC,GAAO,CAAK,CAAC,GAEV;AACX"}
1
+ {"version":3,"file":"use-debounce.js","names":["useDebounce","debouncedValue","setDebouncedValue","useState","value","useEffect","timer","delay"],"sources":["../../src/hooks/use-debounce.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\n/**\n * Debounce a fast-changing value. Returns the latest value once `delay` ms\n * have elapsed without further changes.\n *\n * @param value - The value to debounce.\n * @param delay - Delay in milliseconds (default 300).\n * @returns The debounced value.\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n"],"mappings":";;AAUA,SAAgBA,EAAe,GAAU,IAAQ,KAAQ;CACrD,IAAM,CAACC,GAAgBC,KAAqBC,EAAYC,CAAK;CAO7D,OALAC,QAAgB;EACZ,IAAMC,IAAQ,iBAAiBJ,EAAkBE,CAAK,GAAGG,CAAK;EAC9D,aAAa,aAAaD,CAAK;CACnC,GAAG,CAACF,GAAOG,CAAK,CAAC,GAEVN;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-deep-memo.cjs","names":[],"sources":["../../src/hooks/use-deep-memo.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- the structural cache is read and written during render by design (see the docstring) */\nimport { useRef } from \"react\";\n\n/**\n * Structural equality over plain objects and arrays, the comparison `useDeepMemo`\n * and `useDraftFilters` share. Internal: not re-exported from the barrel.\n *\n * @param a - First value.\n * @param b - Second value.\n * @returns Whether both values have the same shape and leaves.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((value, index) => deepEqual(value, b[index]));\n }\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n}\n\n/**\n * Memoize a value with a structural equality check. Use when an object/array\n * created during render is fed to `useEffect` dependencies and you want to\n * avoid spurious effect runs when only the reference changes.\n *\n * The cache is a ref read and written during render. That is flagged by the React\n * Compiler rules and is nonetheless correct here: the write is idempotent — a\n * discarded render either wrote a structurally equal value or nothing at all — so\n * replaying the render cannot change the result.\n */\nexport function useDeepMemo<T>(value: T): T {\n const ref = useRef<T>(value);\n if (!deepEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n"],"mappings":"uBAWA,SAAgB,EAAU,EAAY,EAAqB,CACvD,GAAI,OAAO,GAAG,EAAG,CAAC,EAAG,MAAO,GAE5B,GADI,OAAO,GAAM,UAAY,OAAO,GAAM,UAAY,IAAM,MAAQ,IAAM,MACtE,MAAM,QAAQ,CAAC,IAAM,MAAM,QAAQ,CAAC,EAAG,MAAO,GAClD,GAAI,MAAM,QAAQ,CAAC,GAAK,MAAM,QAAQ,CAAC,EAEnC,OADI,EAAE,SAAW,EAAE,QACZ,EAAE,OAAO,EAAO,IAAU,EAAU,EAAO,EAAE,EAAM,CAAC,EAE/D,IAAM,EAAQ,OAAO,KAAK,CAAW,EAC/B,EAAQ,OAAO,KAAK,CAAW,EAErC,OADI,EAAM,SAAW,EAAM,QACpB,EAAM,MAAO,GAChB,EAAW,EAA8B,GAAO,EAA8B,EAAI,CACtF,CACJ,CAYA,SAAgB,EAAe,EAAa,CACxC,IAAM,GAAA,EAAM,EAAA,OAAA,CAAU,CAAK,EAI3B,OAHK,EAAU,EAAI,QAAS,CAAK,IAC7B,EAAI,QAAU,GAEX,EAAI,OACf"}
1
+ {"version":3,"file":"use-deep-memo.cjs","names":["useRef","react","deepEqual","a","b","value","index","aKeys","bKeys","key","useDeepMemo","ref"],"sources":["../../src/hooks/use-deep-memo.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- the structural cache is read and written during render by design (see the docstring) */\nimport { useRef } from \"react\";\n\n/**\n * Structural equality over plain objects and arrays, the comparison `useDeepMemo`\n * and `useDraftFilters` share. Internal: not re-exported from the barrel.\n *\n * @param a - First value.\n * @param b - Second value.\n * @returns Whether both values have the same shape and leaves.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((value, index) => deepEqual(value, b[index]));\n }\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n}\n\n/**\n * Memoize a value with a structural equality check. Use when an object/array\n * created during render is fed to `useEffect` dependencies and you want to\n * avoid spurious effect runs when only the reference changes.\n *\n * The cache is a ref read and written during render. That is flagged by the React\n * Compiler rules and is nonetheless correct here: the write is idempotent — a\n * discarded render either wrote a structurally equal value or nothing at all — so\n * replaying the render cannot change the result.\n */\nexport function useDeepMemo<T>(value: T): T {\n const ref = useRef<T>(value);\n if (!deepEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n"],"mappings":"A,uBAWA,SAAgBE,EAAU,EAAY,EAAqB,CACvD,GAAI,OAAO,GAAGC,EAAGC,CAAC,EAAG,MAAO,GAE5B,GADI,OAAOD,GAAM,UAAY,OAAOC,GAAM,UAAYD,IAAM,MAAQC,IAAM,MACtE,MAAM,QAAQD,CAAC,IAAM,MAAM,QAAQC,CAAC,EAAG,MAAO,GAClD,GAAI,MAAM,QAAQD,CAAC,GAAK,MAAM,QAAQC,CAAC,EAEnC,OADID,EAAE,SAAWC,EAAE,QACZD,EAAE,OAAO,EAAO,IAAUD,EAAUG,EAAOD,EAAEE,EAAM,CAAC,EAE/D,IAAMC,EAAQ,OAAO,KAAKJ,CAAW,EAC/BK,EAAQ,OAAO,KAAKJ,CAAW,EAErC,OADIG,EAAM,SAAWC,EAAM,QACpBD,EAAM,MAAO,GAChBL,EAAWC,EAA8BM,GAAOL,EAA8BK,EAAI,CACtF,CACJ,CAYA,SAAgBC,EAAe,EAAa,CACxC,IAAMC,GAAA,EAAMX,EAAAA,OAAAA,CAAUK,CAAK,EAI3B,OAHKH,EAAUS,EAAI,QAASN,CAAK,IAC7B,EAAI,QAAUA,GAEXM,EAAI,OACf,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-deep-memo.js","names":[],"sources":["../../src/hooks/use-deep-memo.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- the structural cache is read and written during render by design (see the docstring) */\nimport { useRef } from \"react\";\n\n/**\n * Structural equality over plain objects and arrays, the comparison `useDeepMemo`\n * and `useDraftFilters` share. Internal: not re-exported from the barrel.\n *\n * @param a - First value.\n * @param b - Second value.\n * @returns Whether both values have the same shape and leaves.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((value, index) => deepEqual(value, b[index]));\n }\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n}\n\n/**\n * Memoize a value with a structural equality check. Use when an object/array\n * created during render is fed to `useEffect` dependencies and you want to\n * avoid spurious effect runs when only the reference changes.\n *\n * The cache is a ref read and written during render. That is flagged by the React\n * Compiler rules and is nonetheless correct here: the write is idempotent — a\n * discarded render either wrote a structurally equal value or nothing at all — so\n * replaying the render cannot change the result.\n */\nexport function useDeepMemo<T>(value: T): T {\n const ref = useRef<T>(value);\n if (!deepEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n"],"mappings":";;AAWA,SAAgB,EAAU,GAAY,GAAqB;CACvD,IAAI,OAAO,GAAG,GAAG,CAAC,GAAG,OAAO;CAE5B,IADI,OAAO,KAAM,YAAY,OAAO,KAAM,YAAY,MAAM,QAAQ,MAAM,QACtE,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,GAAG,OAAO;CAClD,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAEnC,OADI,EAAE,WAAW,EAAE,UACZ,EAAE,OAAO,GAAO,MAAU,EAAU,GAAO,EAAE,EAAM,CAAC;CAE/D,IAAM,IAAQ,OAAO,KAAK,CAAW,GAC/B,IAAQ,OAAO,KAAK,CAAW;CAErC,OADI,EAAM,WAAW,EAAM,UACpB,EAAM,OAAO,MAChB,EAAW,EAA8B,IAAO,EAA8B,EAAI,CACtF;AACJ;AAYA,SAAgB,EAAe,GAAa;CACxC,IAAM,IAAM,EAAU,CAAK;CAI3B,OAHK,EAAU,EAAI,SAAS,CAAK,MAC7B,EAAI,UAAU,IAEX,EAAI;AACf"}
1
+ {"version":3,"file":"use-deep-memo.js","names":["deepEqual","a","b","value","index","aKeys","bKeys","key","useDeepMemo","ref","useRef"],"sources":["../../src/hooks/use-deep-memo.ts"],"sourcesContent":["/* eslint-disable react-hooks/refs -- the structural cache is read and written during render by design (see the docstring) */\nimport { useRef } from \"react\";\n\n/**\n * Structural equality over plain objects and arrays, the comparison `useDeepMemo`\n * and `useDraftFilters` share. Internal: not re-exported from the barrel.\n *\n * @param a - First value.\n * @param b - Second value.\n * @returns Whether both values have the same shape and leaves.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((value, index) => deepEqual(value, b[index]));\n }\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n}\n\n/**\n * Memoize a value with a structural equality check. Use when an object/array\n * created during render is fed to `useEffect` dependencies and you want to\n * avoid spurious effect runs when only the reference changes.\n *\n * The cache is a ref read and written during render. That is flagged by the React\n * Compiler rules and is nonetheless correct here: the write is idempotent — a\n * discarded render either wrote a structurally equal value or nothing at all — so\n * replaying the render cannot change the result.\n */\nexport function useDeepMemo<T>(value: T): T {\n const ref = useRef<T>(value);\n if (!deepEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n"],"mappings":";;AAWA,SAAgBA,EAAU,GAAY,GAAqB;CACvD,IAAI,OAAO,GAAGC,GAAGC,CAAC,GAAG,OAAO;CAE5B,IADI,OAAOD,KAAM,YAAY,OAAOC,KAAM,YAAYD,MAAM,QAAQC,MAAM,QACtE,MAAM,QAAQD,CAAC,MAAM,MAAM,QAAQC,CAAC,GAAG,OAAO;CAClD,IAAI,MAAM,QAAQD,CAAC,KAAK,MAAM,QAAQC,CAAC,GAEnC,OADID,EAAE,WAAWC,EAAE,UACZD,EAAE,OAAO,GAAO,MAAUD,EAAUG,GAAOD,EAAEE,EAAM,CAAC;CAE/D,IAAMC,IAAQ,OAAO,KAAKJ,CAAW,GAC/BK,IAAQ,OAAO,KAAKJ,CAAW;CAErC,OADIG,EAAM,WAAWC,EAAM,UACpBD,EAAM,OAAO,MAChBL,EAAWC,EAA8BM,IAAOL,EAA8BK,EAAI,CACtF;AACJ;AAYA,SAAgBC,EAAe,GAAa;CACxC,IAAMC,IAAMC,EAAUP,CAAK;CAI3B,OAHKH,EAAUS,EAAI,SAASN,CAAK,MAC7B,EAAI,UAAUA,IAEXM,EAAI;AACf"}