tempest-react-sdk 0.78.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 (1585) hide show
  1. package/README.md +6 -6
  2. package/bin/lib/openapi/generate.mjs +168 -64
  3. package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
  4. package/bin/lib/openapi/generate.test.mjs +263 -1
  5. package/dist/access/Can.cjs.map +1 -1
  6. package/dist/access/Can.js.map +1 -1
  7. package/dist/access/access-control-context.cjs.map +1 -1
  8. package/dist/access/access-control-context.js.map +1 -1
  9. package/dist/access/create-role-access-control.cjs.map +1 -1
  10. package/dist/access/create-role-access-control.js.map +1 -1
  11. package/dist/access/permissions-from-token.cjs.map +1 -1
  12. package/dist/access/permissions-from-token.js.map +1 -1
  13. package/dist/access/use-can.cjs.map +1 -1
  14. package/dist/access/use-can.js.map +1 -1
  15. package/dist/app/AppProviders.cjs.map +1 -1
  16. package/dist/app/AppProviders.js.map +1 -1
  17. package/dist/audio/audio-bus.cjs.map +1 -1
  18. package/dist/audio/audio-bus.js.map +1 -1
  19. package/dist/audio/audio-output.cjs.map +1 -1
  20. package/dist/audio/audio-output.js.map +1 -1
  21. package/dist/audio/audio-player.cjs.map +1 -1
  22. package/dist/audio/audio-player.js.map +1 -1
  23. package/dist/audio/audio-recorder.cjs.map +1 -1
  24. package/dist/audio/audio-recorder.js.map +1 -1
  25. package/dist/audio/duration.cjs.map +1 -1
  26. package/dist/audio/duration.js.map +1 -1
  27. package/dist/audio/level-meter.cjs.map +1 -1
  28. package/dist/audio/level-meter.js.map +1 -1
  29. package/dist/audio/media-access.cjs.map +1 -1
  30. package/dist/audio/media-access.js.map +1 -1
  31. package/dist/audio/noise-floor.cjs.map +1 -1
  32. package/dist/audio/noise-floor.js.map +1 -1
  33. package/dist/audio/sfx-pool.cjs.map +1 -1
  34. package/dist/audio/sfx-pool.js.map +1 -1
  35. package/dist/audio/use-audio-bus.cjs.map +1 -1
  36. package/dist/audio/use-audio-bus.js.map +1 -1
  37. package/dist/audio/use-audio-recorder.cjs.map +1 -1
  38. package/dist/audio/use-audio-recorder.js.map +1 -1
  39. package/dist/audio/use-audio.cjs.map +1 -1
  40. package/dist/audio/use-audio.js.map +1 -1
  41. package/dist/audio/use-microphone.cjs +1 -1
  42. package/dist/audio/use-microphone.cjs.map +1 -1
  43. package/dist/audio/use-microphone.js +1 -5
  44. package/dist/audio/use-microphone.js.map +1 -1
  45. package/dist/audio/use-sfx-pool.cjs.map +1 -1
  46. package/dist/audio/use-sfx-pool.js.map +1 -1
  47. package/dist/audio/voice-activity.cjs.map +1 -1
  48. package/dist/audio/voice-activity.js.map +1 -1
  49. package/dist/audio/voice-chain-stages.cjs.map +1 -1
  50. package/dist/audio/voice-chain-stages.js.map +1 -1
  51. package/dist/audio/voice-chain.cjs.map +1 -1
  52. package/dist/audio/voice-chain.js.map +1 -1
  53. package/dist/audio/wav.cjs.map +1 -1
  54. package/dist/audio/wav.js.map +1 -1
  55. package/dist/auth/AuthGuard.cjs.map +1 -1
  56. package/dist/auth/AuthGuard.js.map +1 -1
  57. package/dist/auth/create-auth-store.cjs.map +1 -1
  58. package/dist/auth/create-auth-store.js.map +1 -1
  59. package/dist/auth/create-tempest-auth.cjs +1 -1
  60. package/dist/auth/create-tempest-auth.cjs.map +1 -1
  61. package/dist/auth/create-tempest-auth.js +1 -3
  62. package/dist/auth/create-tempest-auth.js.map +1 -1
  63. package/dist/auth/jwt.cjs.map +1 -1
  64. package/dist/auth/jwt.js.map +1 -1
  65. package/dist/auth/lazy-with-retry.cjs.map +1 -1
  66. package/dist/auth/lazy-with-retry.js.map +1 -1
  67. package/dist/auth/passkey.cjs.map +1 -1
  68. package/dist/auth/passkey.js.map +1 -1
  69. package/dist/auth/refresh-queue.cjs.map +1 -1
  70. package/dist/auth/refresh-queue.js.map +1 -1
  71. package/dist/auth/use-passkey.cjs +1 -1
  72. package/dist/auth/use-passkey.cjs.map +1 -1
  73. package/dist/auth/use-passkey.js +1 -1
  74. package/dist/auth/use-passkey.js.map +1 -1
  75. package/dist/br/BrazilMap.cjs.map +1 -1
  76. package/dist/br/BrazilMap.js.map +1 -1
  77. package/dist/br/BrazilMap.module.cjs.map +1 -1
  78. package/dist/br/BrazilMap.module.js.map +1 -1
  79. package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
  80. package/dist/br/BrazilStateCitySelect.js.map +1 -1
  81. package/dist/br/BrazilStateMap.cjs.map +1 -1
  82. package/dist/br/BrazilStateMap.js.map +1 -1
  83. package/dist/br/MapLegend.cjs.map +1 -1
  84. package/dist/br/MapLegend.js.map +1 -1
  85. package/dist/br/MapLegend.module.cjs.map +1 -1
  86. package/dist/br/MapLegend.module.js.map +1 -1
  87. package/dist/br/MapMarkers.cjs.map +1 -1
  88. package/dist/br/MapMarkers.js.map +1 -1
  89. package/dist/br/MapTooltip.cjs.map +1 -1
  90. package/dist/br/MapTooltip.js.map +1 -1
  91. package/dist/br/MunicipalitySearch.cjs +1 -1
  92. package/dist/br/MunicipalitySearch.cjs.map +1 -1
  93. package/dist/br/MunicipalitySearch.js +2 -5
  94. package/dist/br/MunicipalitySearch.js.map +1 -1
  95. package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
  96. package/dist/br/MunicipalitySearch.module.js.map +1 -1
  97. package/dist/br/PixQRCode.cjs.map +1 -1
  98. package/dist/br/PixQRCode.js.map +1 -1
  99. package/dist/br/PixQRCode.module.cjs.map +1 -1
  100. package/dist/br/PixQRCode.module.js.map +1 -1
  101. package/dist/br/boleto.cjs.map +1 -1
  102. package/dist/br/boleto.js.map +1 -1
  103. package/dist/br/br-geo.cjs.map +1 -1
  104. package/dist/br/br-geo.js.map +1 -1
  105. package/dist/br/data/br-centroids.cjs.map +1 -1
  106. package/dist/br/data/br-centroids.js.map +1 -1
  107. package/dist/br/data/br-locations.cjs.map +1 -1
  108. package/dist/br/data/br-locations.js.map +1 -1
  109. package/dist/br/data/br-uf-geo.cjs.map +1 -1
  110. package/dist/br/data/br-uf-geo.js.map +1 -1
  111. package/dist/br/data/mun/AC.cjs.map +1 -1
  112. package/dist/br/data/mun/AC.js.map +1 -1
  113. package/dist/br/data/mun/AL.cjs.map +1 -1
  114. package/dist/br/data/mun/AL.js.map +1 -1
  115. package/dist/br/data/mun/AM.cjs.map +1 -1
  116. package/dist/br/data/mun/AM.js.map +1 -1
  117. package/dist/br/data/mun/AP.cjs.map +1 -1
  118. package/dist/br/data/mun/AP.js.map +1 -1
  119. package/dist/br/data/mun/BA.cjs.map +1 -1
  120. package/dist/br/data/mun/BA.js.map +1 -1
  121. package/dist/br/data/mun/CE.cjs.map +1 -1
  122. package/dist/br/data/mun/CE.js.map +1 -1
  123. package/dist/br/data/mun/DF.cjs.map +1 -1
  124. package/dist/br/data/mun/DF.js.map +1 -1
  125. package/dist/br/data/mun/ES.cjs.map +1 -1
  126. package/dist/br/data/mun/ES.js.map +1 -1
  127. package/dist/br/data/mun/GO.cjs.map +1 -1
  128. package/dist/br/data/mun/GO.js.map +1 -1
  129. package/dist/br/data/mun/MA.cjs.map +1 -1
  130. package/dist/br/data/mun/MA.js.map +1 -1
  131. package/dist/br/data/mun/MG.cjs.map +1 -1
  132. package/dist/br/data/mun/MG.js.map +1 -1
  133. package/dist/br/data/mun/MS.cjs.map +1 -1
  134. package/dist/br/data/mun/MS.js.map +1 -1
  135. package/dist/br/data/mun/MT.cjs.map +1 -1
  136. package/dist/br/data/mun/MT.js.map +1 -1
  137. package/dist/br/data/mun/PA.cjs.map +1 -1
  138. package/dist/br/data/mun/PA.js.map +1 -1
  139. package/dist/br/data/mun/PB.cjs.map +1 -1
  140. package/dist/br/data/mun/PB.js.map +1 -1
  141. package/dist/br/data/mun/PE.cjs.map +1 -1
  142. package/dist/br/data/mun/PE.js.map +1 -1
  143. package/dist/br/data/mun/PI.cjs.map +1 -1
  144. package/dist/br/data/mun/PI.js.map +1 -1
  145. package/dist/br/data/mun/PR.cjs.map +1 -1
  146. package/dist/br/data/mun/PR.js.map +1 -1
  147. package/dist/br/data/mun/RJ.cjs.map +1 -1
  148. package/dist/br/data/mun/RJ.js.map +1 -1
  149. package/dist/br/data/mun/RN.cjs.map +1 -1
  150. package/dist/br/data/mun/RN.js.map +1 -1
  151. package/dist/br/data/mun/RO.cjs.map +1 -1
  152. package/dist/br/data/mun/RO.js.map +1 -1
  153. package/dist/br/data/mun/RR.cjs.map +1 -1
  154. package/dist/br/data/mun/RR.js.map +1 -1
  155. package/dist/br/data/mun/RS.cjs.map +1 -1
  156. package/dist/br/data/mun/RS.js.map +1 -1
  157. package/dist/br/data/mun/SC.cjs.map +1 -1
  158. package/dist/br/data/mun/SC.js.map +1 -1
  159. package/dist/br/data/mun/SE.cjs.map +1 -1
  160. package/dist/br/data/mun/SE.js.map +1 -1
  161. package/dist/br/data/mun/SP.cjs.map +1 -1
  162. package/dist/br/data/mun/SP.js.map +1 -1
  163. package/dist/br/data/mun/TO.cjs.map +1 -1
  164. package/dist/br/data/mun/TO.js.map +1 -1
  165. package/dist/br/geocode.cjs.map +1 -1
  166. package/dist/br/geocode.js.map +1 -1
  167. package/dist/br/holidays.cjs.map +1 -1
  168. package/dist/br/holidays.js.map +1 -1
  169. package/dist/br/locations.cjs.map +1 -1
  170. package/dist/br/locations.js.map +1 -1
  171. package/dist/br/nfe.cjs.map +1 -1
  172. package/dist/br/nfe.js.map +1 -1
  173. package/dist/br/pix.cjs +1 -1
  174. package/dist/br/pix.cjs.map +1 -1
  175. package/dist/br/pix.js +108 -74
  176. package/dist/br/pix.js.map +1 -1
  177. package/dist/br/regions.cjs.map +1 -1
  178. package/dist/br/regions.js.map +1 -1
  179. package/dist/br/scales.cjs.map +1 -1
  180. package/dist/br/scales.js.map +1 -1
  181. package/dist/br/state-geo.cjs.map +1 -1
  182. package/dist/br/state-geo.js.map +1 -1
  183. package/dist/br/svg-utils.cjs.map +1 -1
  184. package/dist/br/svg-utils.js.map +1 -1
  185. package/dist/br/use-map-hover.cjs.map +1 -1
  186. package/dist/br/use-map-hover.js.map +1 -1
  187. package/dist/br/use-map-zoom.cjs.map +1 -1
  188. package/dist/br/use-map-zoom.js.map +1 -1
  189. package/dist/br/whatsapp.cjs.map +1 -1
  190. package/dist/br/whatsapp.js.map +1 -1
  191. package/dist/br.cjs.map +1 -1
  192. package/dist/br.d.ts +6 -2
  193. package/dist/br.js.map +1 -1
  194. package/dist/capture/barcode.cjs.map +1 -1
  195. package/dist/capture/barcode.js.map +1 -1
  196. package/dist/capture/media-recorder.cjs.map +1 -1
  197. package/dist/capture/media-recorder.js.map +1 -1
  198. package/dist/capture/use-barcode-scanner.cjs.map +1 -1
  199. package/dist/capture/use-barcode-scanner.js.map +1 -1
  200. package/dist/capture/use-screen-capture.cjs +1 -1
  201. package/dist/capture/use-screen-capture.cjs.map +1 -1
  202. package/dist/capture/use-screen-capture.js +1 -7
  203. package/dist/capture/use-screen-capture.js.map +1 -1
  204. package/dist/capture/use-speech-recognition.cjs +1 -1
  205. package/dist/capture/use-speech-recognition.cjs.map +1 -1
  206. package/dist/capture/use-speech-recognition.js +35 -36
  207. package/dist/capture/use-speech-recognition.js.map +1 -1
  208. package/dist/capture/use-torch.cjs.map +1 -1
  209. package/dist/capture/use-torch.js.map +1 -1
  210. package/dist/capture/use-video-recorder.cjs.map +1 -1
  211. package/dist/capture/use-video-recorder.js.map +1 -1
  212. package/dist/capture/video-recorder.cjs.map +1 -1
  213. package/dist/capture/video-recorder.js.map +1 -1
  214. package/dist/charts/AreaChart.cjs.map +1 -1
  215. package/dist/charts/AreaChart.js.map +1 -1
  216. package/dist/charts/BarChart.cjs.map +1 -1
  217. package/dist/charts/BarChart.js.map +1 -1
  218. package/dist/charts/LineChart.cjs.map +1 -1
  219. package/dist/charts/LineChart.js.map +1 -1
  220. package/dist/charts/PieChart.cjs.map +1 -1
  221. package/dist/charts/PieChart.js.map +1 -1
  222. package/dist/charts/RadarChart.cjs.map +1 -1
  223. package/dist/charts/RadarChart.js.map +1 -1
  224. package/dist/charts/palette.cjs.map +1 -1
  225. package/dist/charts/palette.js.map +1 -1
  226. package/dist/charts/scales.cjs.map +1 -1
  227. package/dist/charts/scales.js.map +1 -1
  228. package/dist/charts/types.cjs.map +1 -1
  229. package/dist/charts/types.js.map +1 -1
  230. package/dist/charts/use-chart-colors.cjs.map +1 -1
  231. package/dist/charts/use-chart-colors.js.map +1 -1
  232. package/dist/components/AIChat/AIChat.cjs +1 -1
  233. package/dist/components/AIChat/AIChat.cjs.map +1 -1
  234. package/dist/components/AIChat/AIChat.js +1 -5
  235. package/dist/components/AIChat/AIChat.js.map +1 -1
  236. package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
  237. package/dist/components/AIChat/AIChat.module.js.map +1 -1
  238. package/dist/components/AIChat/AIChatComposer.cjs +1 -1
  239. package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
  240. package/dist/components/AIChat/AIChatComposer.js +1 -7
  241. package/dist/components/AIChat/AIChatComposer.js.map +1 -1
  242. package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
  243. package/dist/components/AIChat/AIChatTurn.js.map +1 -1
  244. package/dist/components/AIChat/ai-chat-turns.cjs.map +1 -1
  245. package/dist/components/AIChat/ai-chat-turns.js.map +1 -1
  246. package/dist/components/Accordion/Accordion.cjs.map +1 -1
  247. package/dist/components/Accordion/Accordion.js.map +1 -1
  248. package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
  249. package/dist/components/Accordion/Accordion.module.js.map +1 -1
  250. package/dist/components/Alert/Alert.cjs.map +1 -1
  251. package/dist/components/Alert/Alert.js.map +1 -1
  252. package/dist/components/Alert/Alert.module.cjs.map +1 -1
  253. package/dist/components/Alert/Alert.module.js.map +1 -1
  254. package/dist/components/AppBar/AppBar.cjs.map +1 -1
  255. package/dist/components/AppBar/AppBar.js.map +1 -1
  256. package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
  257. package/dist/components/AppBar/AppBar.module.js.map +1 -1
  258. package/dist/components/AppBar/use-sticky-body-warning.cjs +1 -1
  259. package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
  260. package/dist/components/AppBar/use-sticky-body-warning.js +1 -1
  261. package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
  262. package/dist/components/AppShell/AppShell.cjs.map +1 -1
  263. package/dist/components/AppShell/AppShell.js.map +1 -1
  264. package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
  265. package/dist/components/AppShell/AppShell.module.js.map +1 -1
  266. package/dist/components/AspectRatio/AspectRatio.cjs.map +1 -1
  267. package/dist/components/AspectRatio/AspectRatio.js.map +1 -1
  268. package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
  269. package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
  270. package/dist/components/AudioPlayer/AudioPlayer.cjs +1 -1
  271. package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
  272. package/dist/components/AudioPlayer/AudioPlayer.js +1 -7
  273. package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
  274. package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
  275. package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
  276. package/dist/components/AudioRecorder/AudioRecorder.cjs +1 -1
  277. package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
  278. package/dist/components/AudioRecorder/AudioRecorder.js +16 -21
  279. package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
  280. package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
  281. package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
  282. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  283. package/dist/components/Avatar/Avatar.js.map +1 -1
  284. package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
  285. package/dist/components/Avatar/Avatar.module.js.map +1 -1
  286. package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
  287. package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
  288. package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
  289. package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
  290. package/dist/components/Badge/Badge.cjs.map +1 -1
  291. package/dist/components/Badge/Badge.js.map +1 -1
  292. package/dist/components/Badge/Badge.module.cjs.map +1 -1
  293. package/dist/components/Badge/Badge.module.js.map +1 -1
  294. package/dist/components/Banner/Banner.cjs.map +1 -1
  295. package/dist/components/Banner/Banner.js.map +1 -1
  296. package/dist/components/Banner/Banner.module.cjs.map +1 -1
  297. package/dist/components/Banner/Banner.module.js.map +1 -1
  298. package/dist/components/BarList/BarList.cjs.map +1 -1
  299. package/dist/components/BarList/BarList.js.map +1 -1
  300. package/dist/components/BarList/BarList.module.cjs.map +1 -1
  301. package/dist/components/BarList/BarList.module.js.map +1 -1
  302. package/dist/components/BarList/bar-list-model.cjs.map +1 -1
  303. package/dist/components/BarList/bar-list-model.js.map +1 -1
  304. package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
  305. package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
  306. package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
  307. package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
  308. package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
  309. package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
  310. package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
  311. package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
  312. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  313. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  314. package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
  315. package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
  316. package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
  317. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  318. package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
  319. package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
  320. package/dist/components/Button/Button.cjs.map +1 -1
  321. package/dist/components/Button/Button.js.map +1 -1
  322. package/dist/components/Button/Button.module.cjs.map +1 -1
  323. package/dist/components/Button/Button.module.js.map +1 -1
  324. package/dist/components/Button/ButtonContent.cjs.map +1 -1
  325. package/dist/components/Button/ButtonContent.js.map +1 -1
  326. package/dist/components/Button/ButtonSlot.cjs.map +1 -1
  327. package/dist/components/Button/ButtonSlot.js.map +1 -1
  328. package/dist/components/Button/button-class.cjs.map +1 -1
  329. package/dist/components/Button/button-class.js.map +1 -1
  330. package/dist/components/Button/link-rel.cjs.map +1 -1
  331. package/dist/components/Button/link-rel.js.map +1 -1
  332. package/dist/components/Button/slot.cjs.map +1 -1
  333. package/dist/components/Button/slot.js.map +1 -1
  334. package/dist/components/Calendar/Calendar.cjs.map +1 -1
  335. package/dist/components/Calendar/Calendar.js.map +1 -1
  336. package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
  337. package/dist/components/Calendar/Calendar.module.js.map +1 -1
  338. package/dist/components/Card/Card.cjs.map +1 -1
  339. package/dist/components/Card/Card.js.map +1 -1
  340. package/dist/components/Card/Card.module.cjs.map +1 -1
  341. package/dist/components/Card/Card.module.js.map +1 -1
  342. package/dist/components/Carousel/Carousel.cjs.map +1 -1
  343. package/dist/components/Carousel/Carousel.js.map +1 -1
  344. package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
  345. package/dist/components/Carousel/Carousel.module.js.map +1 -1
  346. package/dist/components/Center/Center.cjs.map +1 -1
  347. package/dist/components/Center/Center.js.map +1 -1
  348. package/dist/components/Center/Center.module.cjs.map +1 -1
  349. package/dist/components/Center/Center.module.js.map +1 -1
  350. package/dist/components/Chat/Chat.cjs.map +1 -1
  351. package/dist/components/Chat/Chat.js.map +1 -1
  352. package/dist/components/Chat/Chat.module.cjs.map +1 -1
  353. package/dist/components/Chat/Chat.module.js.map +1 -1
  354. package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -1
  355. package/dist/components/Chat/ChatActionsMenu.js.map +1 -1
  356. package/dist/components/Chat/ChatAttachments.cjs.map +1 -1
  357. package/dist/components/Chat/ChatAttachments.js.map +1 -1
  358. package/dist/components/Chat/ChatBubble.cjs.map +1 -1
  359. package/dist/components/Chat/ChatBubble.js.map +1 -1
  360. package/dist/components/Chat/ChatComposer.cjs.map +1 -1
  361. package/dist/components/Chat/ChatComposer.js.map +1 -1
  362. package/dist/components/Chat/chat-groups.cjs +1 -1
  363. package/dist/components/Chat/chat-groups.cjs.map +1 -1
  364. package/dist/components/Chat/chat-groups.js +2 -6
  365. package/dist/components/Chat/chat-groups.js.map +1 -1
  366. package/dist/components/Chat/chat-receipt.cjs.map +1 -1
  367. package/dist/components/Chat/chat-receipt.js.map +1 -1
  368. package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
  369. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  370. package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
  371. package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
  372. package/dist/components/ChipInput/ChipInput.cjs +1 -1
  373. package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
  374. package/dist/components/ChipInput/ChipInput.js +2 -12
  375. package/dist/components/ChipInput/ChipInput.js.map +1 -1
  376. package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
  377. package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
  378. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  379. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  380. package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
  381. package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
  382. package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
  383. package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
  384. package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
  385. package/dist/components/CodeBlock/tokenize.js.map +1 -1
  386. package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
  387. package/dist/components/Collapsible/Collapsible.js.map +1 -1
  388. package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
  389. package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
  390. package/dist/components/Combobox/Combobox.cjs.map +1 -1
  391. package/dist/components/Combobox/Combobox.js.map +1 -1
  392. package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
  393. package/dist/components/Combobox/Combobox.module.js.map +1 -1
  394. package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -1
  395. package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -1
  396. package/dist/components/Command/Command.cjs +1 -1
  397. package/dist/components/Command/Command.cjs.map +1 -1
  398. package/dist/components/Command/Command.js +4 -11
  399. package/dist/components/Command/Command.js.map +1 -1
  400. package/dist/components/Command/Command.module.cjs.map +1 -1
  401. package/dist/components/Command/Command.module.js.map +1 -1
  402. package/dist/components/ConditionalWrapper/ConditionalWrapper.cjs.map +1 -1
  403. package/dist/components/ConditionalWrapper/ConditionalWrapper.js.map +1 -1
  404. package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  405. package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
  406. package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
  407. package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
  408. package/dist/components/ContextMenu/ContextMenu.js +1 -1
  409. package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
  410. package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
  411. package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
  412. package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
  413. package/dist/components/CopyButton/CopyButton.js.map +1 -1
  414. package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
  415. package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
  416. package/dist/components/DataList/DataList.cjs.map +1 -1
  417. package/dist/components/DataList/DataList.js.map +1 -1
  418. package/dist/components/DataList/DataList.module.cjs.map +1 -1
  419. package/dist/components/DataList/DataList.module.js.map +1 -1
  420. package/dist/components/DataTable/DataTable.cjs +1 -1
  421. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  422. package/dist/components/DataTable/DataTable.js +6 -14
  423. package/dist/components/DataTable/DataTable.js.map +1 -1
  424. package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
  425. package/dist/components/DataTable/DataTable.module.js.map +1 -1
  426. package/dist/components/DataTable/EditableCell.cjs +1 -1
  427. package/dist/components/DataTable/EditableCell.cjs.map +1 -1
  428. package/dist/components/DataTable/EditableCell.js +1 -9
  429. package/dist/components/DataTable/EditableCell.js.map +1 -1
  430. package/dist/components/DataTable/LoadingRows.cjs.map +1 -1
  431. package/dist/components/DataTable/LoadingRows.js.map +1 -1
  432. package/dist/components/DataTable/edit-labels.cjs.map +1 -1
  433. package/dist/components/DataTable/edit-labels.js.map +1 -1
  434. package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
  435. package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
  436. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  437. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  438. package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
  439. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  440. package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
  441. package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
  442. package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
  443. package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
  444. package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
  445. package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
  446. package/dist/components/Divider/Divider.cjs.map +1 -1
  447. package/dist/components/Divider/Divider.js.map +1 -1
  448. package/dist/components/Divider/Divider.module.cjs.map +1 -1
  449. package/dist/components/Divider/Divider.module.js.map +1 -1
  450. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  451. package/dist/components/Drawer/Drawer.js.map +1 -1
  452. package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
  453. package/dist/components/Drawer/Drawer.module.js.map +1 -1
  454. package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
  455. package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  456. package/dist/components/DropdownMenu/DropdownMenu.js +2 -14
  457. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  458. package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
  459. package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
  460. package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
  461. package/dist/components/Dropzone/Dropzone.js.map +1 -1
  462. package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
  463. package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
  464. package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
  465. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  466. package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
  467. package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
  468. package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
  469. package/dist/components/ErrorState/ErrorState.js.map +1 -1
  470. package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
  471. package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
  472. package/dist/components/ErrorText/ErrorText.cjs.map +1 -1
  473. package/dist/components/ErrorText/ErrorText.js.map +1 -1
  474. package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
  475. package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
  476. package/dist/components/FileUpload/FileUpload.cjs +1 -1
  477. package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
  478. package/dist/components/FileUpload/FileUpload.js +7 -17
  479. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  480. package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
  481. package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
  482. package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
  483. package/dist/components/FilterBar/FilterBar.js.map +1 -1
  484. package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
  485. package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
  486. package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
  487. package/dist/components/FilterBar/filter-apply.js.map +1 -1
  488. package/dist/components/FilterBar/filter-model.cjs.map +1 -1
  489. package/dist/components/FilterBar/filter-model.js.map +1 -1
  490. package/dist/components/FilterBar/filter-query.cjs +1 -1
  491. package/dist/components/FilterBar/filter-query.cjs.map +1 -1
  492. package/dist/components/FilterBar/filter-query.js +2 -5
  493. package/dist/components/FilterBar/filter-query.js.map +1 -1
  494. package/dist/components/FilterPanel/FilterPanel.cjs.map +1 -1
  495. package/dist/components/FilterPanel/FilterPanel.js.map +1 -1
  496. package/dist/components/FilterPanel/FilterPanel.module.cjs.map +1 -1
  497. package/dist/components/FilterPanel/FilterPanel.module.js.map +1 -1
  498. package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
  499. package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
  500. package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
  501. package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
  502. package/dist/components/For/For.cjs.map +1 -1
  503. package/dist/components/For/For.js.map +1 -1
  504. package/dist/components/Form/Form.cjs.map +1 -1
  505. package/dist/components/Form/Form.js.map +1 -1
  506. package/dist/components/Form/Form.module.cjs.map +1 -1
  507. package/dist/components/Form/Form.module.js.map +1 -1
  508. package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
  509. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  510. package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
  511. package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
  512. package/dist/components/Image/Image.cjs.map +1 -1
  513. package/dist/components/Image/Image.js.map +1 -1
  514. package/dist/components/Image/Image.module.cjs.map +1 -1
  515. package/dist/components/Image/Image.module.js.map +1 -1
  516. package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
  517. package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
  518. package/dist/components/ImageCropper/ImageCropper.js +4 -8
  519. package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
  520. package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
  521. package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
  522. package/dist/components/ImageCropper/crop-geometry.cjs.map +1 -1
  523. package/dist/components/ImageCropper/crop-geometry.js.map +1 -1
  524. package/dist/components/Input/Input.cjs.map +1 -1
  525. package/dist/components/Input/Input.js.map +1 -1
  526. package/dist/components/Input/Input.module.cjs.map +1 -1
  527. package/dist/components/Input/Input.module.js.map +1 -1
  528. package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
  529. package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
  530. package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
  531. package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
  532. package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
  533. package/dist/components/InstallButton/InstallButton.js.map +1 -1
  534. package/dist/components/InstallButton/InstallButton.module.cjs.map +1 -1
  535. package/dist/components/InstallButton/InstallButton.module.js.map +1 -1
  536. package/dist/components/InstallButton/install-hints.cjs.map +1 -1
  537. package/dist/components/InstallButton/install-hints.js.map +1 -1
  538. package/dist/components/Kanban/Kanban.cjs.map +1 -1
  539. package/dist/components/Kanban/Kanban.js.map +1 -1
  540. package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
  541. package/dist/components/Kanban/Kanban.module.js.map +1 -1
  542. package/dist/components/Kbd/Kbd.cjs.map +1 -1
  543. package/dist/components/Kbd/Kbd.js.map +1 -1
  544. package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
  545. package/dist/components/Kbd/Kbd.module.js.map +1 -1
  546. package/dist/components/Label/Label.cjs.map +1 -1
  547. package/dist/components/Label/Label.js.map +1 -1
  548. package/dist/components/Label/Label.module.cjs.map +1 -1
  549. package/dist/components/Label/Label.module.js.map +1 -1
  550. package/dist/components/Layout/Layout.cjs.map +1 -1
  551. package/dist/components/Layout/Layout.js.map +1 -1
  552. package/dist/components/Layout/Layout.module.cjs.map +1 -1
  553. package/dist/components/Layout/Layout.module.js.map +1 -1
  554. package/dist/components/Lightbox/Lightbox.cjs +1 -1
  555. package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
  556. package/dist/components/Lightbox/Lightbox.js +1 -1
  557. package/dist/components/Lightbox/Lightbox.js.map +1 -1
  558. package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
  559. package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
  560. package/dist/components/ListTile/ListTile.cjs.map +1 -1
  561. package/dist/components/ListTile/ListTile.js.map +1 -1
  562. package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
  563. package/dist/components/ListTile/ListTile.module.js.map +1 -1
  564. package/dist/components/Markdown/Markdown.cjs.map +1 -1
  565. package/dist/components/Markdown/Markdown.js.map +1 -1
  566. package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
  567. package/dist/components/Markdown/Markdown.module.js.map +1 -1
  568. package/dist/components/Markdown/markdown-parse.cjs +2 -2
  569. package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
  570. package/dist/components/Markdown/markdown-parse.js +8 -27
  571. package/dist/components/Markdown/markdown-parse.js.map +1 -1
  572. package/dist/components/Masonry/Masonry.cjs.map +1 -1
  573. package/dist/components/Masonry/Masonry.js.map +1 -1
  574. package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
  575. package/dist/components/Masonry/Masonry.module.js.map +1 -1
  576. package/dist/components/Masonry/masonry-layout.cjs.map +1 -1
  577. package/dist/components/Masonry/masonry-layout.js.map +1 -1
  578. package/dist/components/Menubar/Menubar.cjs.map +1 -1
  579. package/dist/components/Menubar/Menubar.js.map +1 -1
  580. package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
  581. package/dist/components/Menubar/Menubar.module.js.map +1 -1
  582. package/dist/components/Modal/Modal.cjs.map +1 -1
  583. package/dist/components/Modal/Modal.js.map +1 -1
  584. package/dist/components/Modal/Modal.module.cjs.map +1 -1
  585. package/dist/components/Modal/Modal.module.js.map +1 -1
  586. package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
  587. package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
  588. package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
  589. package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
  590. package/dist/components/Money/Money.cjs.map +1 -1
  591. package/dist/components/Money/Money.js.map +1 -1
  592. package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
  593. package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
  594. package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
  595. package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
  596. package/dist/components/NProgress/NProgress.cjs.map +1 -1
  597. package/dist/components/NProgress/NProgress.js.map +1 -1
  598. package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
  599. package/dist/components/NProgress/NProgress.module.js.map +1 -1
  600. package/dist/components/Navbar/Navbar.cjs.map +1 -1
  601. package/dist/components/Navbar/Navbar.js.map +1 -1
  602. package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
  603. package/dist/components/Navbar/Navbar.module.js.map +1 -1
  604. package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
  605. package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
  606. package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
  607. package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
  608. package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
  609. package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
  610. package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
  611. package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
  612. package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
  613. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
  614. package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
  615. package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
  616. package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
  617. package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -1
  618. package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
  619. package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
  620. package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
  621. package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
  622. package/dist/components/Page/Page.cjs.map +1 -1
  623. package/dist/components/Page/Page.js.map +1 -1
  624. package/dist/components/Page/Page.module.cjs.map +1 -1
  625. package/dist/components/Page/Page.module.js.map +1 -1
  626. package/dist/components/Pagination/Pagination.cjs.map +1 -1
  627. package/dist/components/Pagination/Pagination.js.map +1 -1
  628. package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
  629. package/dist/components/Pagination/Pagination.module.js.map +1 -1
  630. package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
  631. package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
  632. package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
  633. package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
  634. package/dist/components/PinInput/PinInput.cjs.map +1 -1
  635. package/dist/components/PinInput/PinInput.js.map +1 -1
  636. package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
  637. package/dist/components/PinInput/PinInput.module.js.map +1 -1
  638. package/dist/components/Popover/Popover.cjs.map +1 -1
  639. package/dist/components/Popover/Popover.js.map +1 -1
  640. package/dist/components/Popover/Popover.module.cjs.map +1 -1
  641. package/dist/components/Popover/Popover.module.js.map +1 -1
  642. package/dist/components/Portal/Portal.cjs.map +1 -1
  643. package/dist/components/Portal/Portal.js.map +1 -1
  644. package/dist/components/Portal/anchor-position.cjs.map +1 -1
  645. package/dist/components/Portal/anchor-position.js.map +1 -1
  646. package/dist/components/Portal/escape-layer.cjs.map +1 -1
  647. package/dist/components/Portal/escape-layer.js.map +1 -1
  648. package/dist/components/Portal/portal-host.cjs.map +1 -1
  649. package/dist/components/Portal/portal-host.js.map +1 -1
  650. package/dist/components/Portal/tab-bridge.cjs +1 -1
  651. package/dist/components/Portal/tab-bridge.cjs.map +1 -1
  652. package/dist/components/Portal/tab-bridge.js +1 -5
  653. package/dist/components/Portal/tab-bridge.js.map +1 -1
  654. package/dist/components/Progress/Progress.cjs.map +1 -1
  655. package/dist/components/Progress/Progress.js.map +1 -1
  656. package/dist/components/Progress/Progress.module.cjs.map +1 -1
  657. package/dist/components/Progress/Progress.module.js.map +1 -1
  658. package/dist/components/QRCode/QRCode.cjs.map +1 -1
  659. package/dist/components/QRCode/QRCode.js.map +1 -1
  660. package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
  661. package/dist/components/QRCode/QRCode.module.js.map +1 -1
  662. package/dist/components/QRCode/qr-encode.cjs +1 -1
  663. package/dist/components/QRCode/qr-encode.cjs.map +1 -1
  664. package/dist/components/QRCode/qr-encode.js +7 -13
  665. package/dist/components/QRCode/qr-encode.js.map +1 -1
  666. package/dist/components/QRCode/qr-tables.cjs.map +1 -1
  667. package/dist/components/QRCode/qr-tables.js.map +1 -1
  668. package/dist/components/Radio/Radio.cjs.map +1 -1
  669. package/dist/components/Radio/Radio.js.map +1 -1
  670. package/dist/components/Radio/Radio.module.cjs.map +1 -1
  671. package/dist/components/Radio/Radio.module.js.map +1 -1
  672. package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
  673. package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
  674. package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
  675. package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
  676. package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
  677. package/dist/components/RatingStars/RatingStars.js.map +1 -1
  678. package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
  679. package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
  680. package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
  681. package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
  682. package/dist/components/RefreshIndicator/RefreshIndicator.js +10 -18
  683. package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
  684. package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
  685. package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
  686. package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
  687. package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
  688. package/dist/components/Resizable/Resizable.cjs +1 -1
  689. package/dist/components/Resizable/Resizable.cjs.map +1 -1
  690. package/dist/components/Resizable/Resizable.js +1 -9
  691. package/dist/components/Resizable/Resizable.js.map +1 -1
  692. package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
  693. package/dist/components/Resizable/Resizable.module.js.map +1 -1
  694. package/dist/components/Responsive/Responsive.cjs.map +1 -1
  695. package/dist/components/Responsive/Responsive.js.map +1 -1
  696. package/dist/components/Reveal/Reveal.cjs.map +1 -1
  697. package/dist/components/Reveal/Reveal.js.map +1 -1
  698. package/dist/components/Reveal/Reveal.module.cjs.map +1 -1
  699. package/dist/components/Reveal/Reveal.module.js.map +1 -1
  700. package/dist/components/Reveal/reveal-threshold.cjs.map +1 -1
  701. package/dist/components/Reveal/reveal-threshold.js.map +1 -1
  702. package/dist/components/SafeArea/SafeArea.cjs.map +1 -1
  703. package/dist/components/SafeArea/SafeArea.js.map +1 -1
  704. package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
  705. package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
  706. package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
  707. package/dist/components/Scheduler/Scheduler.js.map +1 -1
  708. package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
  709. package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
  710. package/dist/components/Scheduler/scheduler-layout.cjs.map +1 -1
  711. package/dist/components/Scheduler/scheduler-layout.js.map +1 -1
  712. package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
  713. package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
  714. package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
  715. package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
  716. package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
  717. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  718. package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
  719. package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
  720. package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -1
  721. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  722. package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -1
  723. package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -1
  724. package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
  725. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  726. package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
  727. package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
  728. package/dist/components/Select/CaretIcon.cjs.map +1 -1
  729. package/dist/components/Select/CaretIcon.js.map +1 -1
  730. package/dist/components/Select/Select.cjs.map +1 -1
  731. package/dist/components/Select/Select.js.map +1 -1
  732. package/dist/components/Select/Select.module.cjs.map +1 -1
  733. package/dist/components/Select/Select.module.js.map +1 -1
  734. package/dist/components/Select/options.cjs.map +1 -1
  735. package/dist/components/Select/options.js.map +1 -1
  736. package/dist/components/Sidebar/Sidebar.cjs +1 -1
  737. package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
  738. package/dist/components/Sidebar/Sidebar.js +13 -23
  739. package/dist/components/Sidebar/Sidebar.js.map +1 -1
  740. package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
  741. package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
  742. package/dist/components/Sidebar/SidebarEntry.cjs.map +1 -1
  743. package/dist/components/Sidebar/SidebarEntry.js.map +1 -1
  744. package/dist/components/Sidebar/active-nav-key.cjs.map +1 -1
  745. package/dist/components/Sidebar/active-nav-key.js.map +1 -1
  746. package/dist/components/SignaturePad/SignaturePad.cjs +1 -1
  747. package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
  748. package/dist/components/SignaturePad/SignaturePad.js +1 -5
  749. package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
  750. package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
  751. package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
  752. package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
  753. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  754. package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
  755. package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
  756. package/dist/components/Slider/Slider.cjs.map +1 -1
  757. package/dist/components/Slider/Slider.js.map +1 -1
  758. package/dist/components/Slider/Slider.module.cjs.map +1 -1
  759. package/dist/components/Slider/Slider.module.js.map +1 -1
  760. package/dist/components/Spacer/Spacer.cjs.map +1 -1
  761. package/dist/components/Spacer/Spacer.js.map +1 -1
  762. package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
  763. package/dist/components/Spacer/Spacer.module.js.map +1 -1
  764. package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
  765. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  766. package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
  767. package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
  768. package/dist/components/Sparkline/sparkline-geometry.cjs.map +1 -1
  769. package/dist/components/Sparkline/sparkline-geometry.js.map +1 -1
  770. package/dist/components/Spinner/Spinner.cjs.map +1 -1
  771. package/dist/components/Spinner/Spinner.js.map +1 -1
  772. package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
  773. package/dist/components/Spinner/Spinner.module.js.map +1 -1
  774. package/dist/components/Stat/Stat.cjs.map +1 -1
  775. package/dist/components/Stat/Stat.js.map +1 -1
  776. package/dist/components/Stat/Stat.module.cjs.map +1 -1
  777. package/dist/components/Stat/Stat.module.js.map +1 -1
  778. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  779. package/dist/components/Stepper/Stepper.js.map +1 -1
  780. package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
  781. package/dist/components/Stepper/Stepper.module.js.map +1 -1
  782. package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
  783. package/dist/components/StepperInput/StepperInput.js.map +1 -1
  784. package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
  785. package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
  786. package/dist/components/Switch/Switch.cjs.map +1 -1
  787. package/dist/components/Switch/Switch.js.map +1 -1
  788. package/dist/components/Switch/Switch.module.cjs.map +1 -1
  789. package/dist/components/Switch/Switch.module.js.map +1 -1
  790. package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
  791. package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
  792. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
  793. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
  794. package/dist/components/Table/Table.cjs.map +1 -1
  795. package/dist/components/Table/Table.js.map +1 -1
  796. package/dist/components/Table/Table.module.cjs.map +1 -1
  797. package/dist/components/Table/Table.module.js.map +1 -1
  798. package/dist/components/Tabs/Tabs.cjs.map +1 -1
  799. package/dist/components/Tabs/Tabs.js.map +1 -1
  800. package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
  801. package/dist/components/Tabs/Tabs.module.js.map +1 -1
  802. package/dist/components/Tag/Tag.cjs.map +1 -1
  803. package/dist/components/Tag/Tag.js.map +1 -1
  804. package/dist/components/Tag/Tag.module.cjs.map +1 -1
  805. package/dist/components/Tag/Tag.module.js.map +1 -1
  806. package/dist/components/Textarea/Textarea.cjs.map +1 -1
  807. package/dist/components/Textarea/Textarea.js.map +1 -1
  808. package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
  809. package/dist/components/Textarea/Textarea.module.js.map +1 -1
  810. package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
  811. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  812. package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
  813. package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
  814. package/dist/components/Timeline/Timeline.cjs.map +1 -1
  815. package/dist/components/Timeline/Timeline.js.map +1 -1
  816. package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
  817. package/dist/components/Timeline/Timeline.module.js.map +1 -1
  818. package/dist/components/Toast/Toast.module.cjs.map +1 -1
  819. package/dist/components/Toast/Toast.module.js.map +1 -1
  820. package/dist/components/Toast/ToastProvider.cjs.map +1 -1
  821. package/dist/components/Toast/ToastProvider.js.map +1 -1
  822. package/dist/components/Toggle/Toggle.cjs.map +1 -1
  823. package/dist/components/Toggle/Toggle.js.map +1 -1
  824. package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
  825. package/dist/components/Toggle/Toggle.module.js.map +1 -1
  826. package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
  827. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  828. package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
  829. package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
  830. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  831. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  832. package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
  833. package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
  834. package/dist/components/Tour/Tour.cjs +1 -1
  835. package/dist/components/Tour/Tour.cjs.map +1 -1
  836. package/dist/components/Tour/Tour.js +1 -5
  837. package/dist/components/Tour/Tour.js.map +1 -1
  838. package/dist/components/Tour/Tour.module.cjs.map +1 -1
  839. package/dist/components/Tour/Tour.module.js.map +1 -1
  840. package/dist/components/Tour/tour-position.cjs.map +1 -1
  841. package/dist/components/Tour/tour-position.js.map +1 -1
  842. package/dist/components/Transfer/Transfer.cjs.map +1 -1
  843. package/dist/components/Transfer/Transfer.js.map +1 -1
  844. package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
  845. package/dist/components/Transfer/Transfer.module.js.map +1 -1
  846. package/dist/components/Transfer/transfer-state.cjs.map +1 -1
  847. package/dist/components/Transfer/transfer-state.js.map +1 -1
  848. package/dist/components/TreeView/TreeView.cjs.map +1 -1
  849. package/dist/components/TreeView/TreeView.js.map +1 -1
  850. package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
  851. package/dist/components/TreeView/TreeView.module.js.map +1 -1
  852. package/dist/components/TruncateText/TruncateText.cjs.map +1 -1
  853. package/dist/components/TruncateText/TruncateText.js.map +1 -1
  854. package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
  855. package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
  856. package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
  857. package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
  858. package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
  859. package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
  860. package/dist/components/VideoPlayer/VideoPlayer.cjs +1 -1
  861. package/dist/components/VideoPlayer/VideoPlayer.cjs.map +1 -1
  862. package/dist/components/VideoPlayer/VideoPlayer.js +1 -7
  863. package/dist/components/VideoPlayer/VideoPlayer.js.map +1 -1
  864. package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
  865. package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
  866. package/dist/components/VideoPlayer/playback-rates.cjs.map +1 -1
  867. package/dist/components/VideoPlayer/playback-rates.js.map +1 -1
  868. package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
  869. package/dist/components/VirtualList/VirtualList.js.map +1 -1
  870. package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
  871. package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
  872. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
  873. package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
  874. package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
  875. package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
  876. package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
  877. package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
  878. package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
  879. package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
  880. package/dist/components/Wizard/Wizard.cjs +1 -1
  881. package/dist/components/Wizard/Wizard.cjs.map +1 -1
  882. package/dist/components/Wizard/Wizard.js +4 -11
  883. package/dist/components/Wizard/Wizard.js.map +1 -1
  884. package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
  885. package/dist/components/Wizard/Wizard.module.js.map +1 -1
  886. package/dist/data/create-data-provider.cjs.map +1 -1
  887. package/dist/data/create-data-provider.js.map +1 -1
  888. package/dist/data/data-provider-context.cjs.map +1 -1
  889. package/dist/data/data-provider-context.js.map +1 -1
  890. package/dist/data/use-resource.cjs.map +1 -1
  891. package/dist/data/use-resource.js.map +1 -1
  892. package/dist/editor/RichTextEditor.cjs.map +1 -1
  893. package/dist/editor/RichTextEditor.js.map +1 -1
  894. package/dist/editor/RichTextEditor.module.cjs.map +1 -1
  895. package/dist/editor/RichTextEditor.module.js.map +1 -1
  896. package/dist/editor.js +1 -2
  897. package/dist/error-boundary/ErrorBoundary.cjs.map +1 -1
  898. package/dist/error-boundary/ErrorBoundary.js.map +1 -1
  899. package/dist/error-boundary/use-error-handler.cjs.map +1 -1
  900. package/dist/error-boundary/use-error-handler.js.map +1 -1
  901. package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
  902. package/dist/feature-flags/FeatureFlagsProvider.js.map +1 -1
  903. package/dist/feature-flags/growthbook-adapter.cjs.map +1 -1
  904. package/dist/feature-flags/growthbook-adapter.js.map +1 -1
  905. package/dist/feature-flags/in-memory-adapter.cjs.map +1 -1
  906. package/dist/feature-flags/in-memory-adapter.js.map +1 -1
  907. package/dist/feature-flags/launchdarkly-adapter.cjs.map +1 -1
  908. package/dist/feature-flags/launchdarkly-adapter.js.map +1 -1
  909. package/dist/forms/FormField.cjs.map +1 -1
  910. package/dist/forms/FormField.js.map +1 -1
  911. package/dist/forms/br-validators.cjs.map +1 -1
  912. package/dist/forms/br-validators.js.map +1 -1
  913. package/dist/forms/masked-inputs.cjs.map +1 -1
  914. package/dist/forms/masked-inputs.js.map +1 -1
  915. package/dist/forms/use-viacep.cjs.map +1 -1
  916. package/dist/forms/use-viacep.js.map +1 -1
  917. package/dist/forms/use-zod-form.cjs.map +1 -1
  918. package/dist/forms/use-zod-form.js.map +1 -1
  919. package/dist/forms/validate-form.cjs.map +1 -1
  920. package/dist/forms/validate-form.js.map +1 -1
  921. package/dist/forms/zod-resolver.cjs.map +1 -1
  922. package/dist/forms/zod-resolver.js.map +1 -1
  923. package/dist/geo/TrajectoryMap.cjs.map +1 -1
  924. package/dist/geo/TrajectoryMap.js.map +1 -1
  925. package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
  926. package/dist/geo/TrajectoryMap.module.js.map +1 -1
  927. package/dist/geo/bounds.cjs.map +1 -1
  928. package/dist/geo/bounds.js.map +1 -1
  929. package/dist/geo/create-position-tracker.cjs +1 -1
  930. package/dist/geo/create-position-tracker.cjs.map +1 -1
  931. package/dist/geo/create-position-tracker.js +1 -7
  932. package/dist/geo/create-position-tracker.js.map +1 -1
  933. package/dist/geo/distance.cjs.map +1 -1
  934. package/dist/geo/distance.js.map +1 -1
  935. package/dist/geo/estimate.cjs.map +1 -1
  936. package/dist/geo/estimate.js.map +1 -1
  937. package/dist/geo/leaflet-map.cjs.map +1 -1
  938. package/dist/geo/leaflet-map.js.map +1 -1
  939. package/dist/geo/projection.cjs.map +1 -1
  940. package/dist/geo/projection.js.map +1 -1
  941. package/dist/geo/routing.cjs.map +1 -1
  942. package/dist/geo/routing.js.map +1 -1
  943. package/dist/geo/types.cjs.map +1 -1
  944. package/dist/geo/types.js.map +1 -1
  945. package/dist/geo/use-position-tracker.cjs.map +1 -1
  946. package/dist/geo/use-position-tracker.js.map +1 -1
  947. package/dist/hooks/pwa-env.cjs.map +1 -1
  948. package/dist/hooks/pwa-env.js.map +1 -1
  949. package/dist/hooks/tab-sequence.cjs.map +1 -1
  950. package/dist/hooks/tab-sequence.js.map +1 -1
  951. package/dist/hooks/use-announce.cjs +1 -1
  952. package/dist/hooks/use-announce.cjs.map +1 -1
  953. package/dist/hooks/use-announce.js +2 -2
  954. package/dist/hooks/use-announce.js.map +1 -1
  955. package/dist/hooks/use-async.cjs.map +1 -1
  956. package/dist/hooks/use-async.js.map +1 -1
  957. package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
  958. package/dist/hooks/use-before-install-prompt.js.map +1 -1
  959. package/dist/hooks/use-breakpoint.cjs.map +1 -1
  960. package/dist/hooks/use-breakpoint.js.map +1 -1
  961. package/dist/hooks/use-click-outside.cjs.map +1 -1
  962. package/dist/hooks/use-click-outside.js.map +1 -1
  963. package/dist/hooks/use-client-filter.cjs.map +1 -1
  964. package/dist/hooks/use-client-filter.js.map +1 -1
  965. package/dist/hooks/use-clipboard.cjs.map +1 -1
  966. package/dist/hooks/use-clipboard.js.map +1 -1
  967. package/dist/hooks/use-countdown.cjs.map +1 -1
  968. package/dist/hooks/use-countdown.js.map +1 -1
  969. package/dist/hooks/use-counter.cjs.map +1 -1
  970. package/dist/hooks/use-counter.js.map +1 -1
  971. package/dist/hooks/use-debounce.cjs.map +1 -1
  972. package/dist/hooks/use-debounce.js.map +1 -1
  973. package/dist/hooks/use-deep-memo.cjs.map +1 -1
  974. package/dist/hooks/use-deep-memo.js.map +1 -1
  975. package/dist/hooks/use-disclosure.cjs.map +1 -1
  976. package/dist/hooks/use-disclosure.js.map +1 -1
  977. package/dist/hooks/use-document-title.cjs.map +1 -1
  978. package/dist/hooks/use-document-title.js.map +1 -1
  979. package/dist/hooks/use-document-visibility.cjs.map +1 -1
  980. package/dist/hooks/use-document-visibility.js.map +1 -1
  981. package/dist/hooks/use-draft-filters.cjs.map +1 -1
  982. package/dist/hooks/use-draft-filters.js.map +1 -1
  983. package/dist/hooks/use-event-listener.cjs.map +1 -1
  984. package/dist/hooks/use-event-listener.js.map +1 -1
  985. package/dist/hooks/use-favicon.cjs.map +1 -1
  986. package/dist/hooks/use-favicon.js.map +1 -1
  987. package/dist/hooks/use-focus-trap.cjs.map +1 -1
  988. package/dist/hooks/use-focus-trap.js.map +1 -1
  989. package/dist/hooks/use-fullscreen-element.cjs.map +1 -1
  990. package/dist/hooks/use-fullscreen-element.js.map +1 -1
  991. package/dist/hooks/use-fullscreen.cjs +1 -1
  992. package/dist/hooks/use-fullscreen.cjs.map +1 -1
  993. package/dist/hooks/use-fullscreen.js +7 -23
  994. package/dist/hooks/use-fullscreen.js.map +1 -1
  995. package/dist/hooks/use-geolocation.cjs.map +1 -1
  996. package/dist/hooks/use-geolocation.js.map +1 -1
  997. package/dist/hooks/use-hover.cjs.map +1 -1
  998. package/dist/hooks/use-hover.js.map +1 -1
  999. package/dist/hooks/use-idle.cjs.map +1 -1
  1000. package/dist/hooks/use-idle.js.map +1 -1
  1001. package/dist/hooks/use-install-prompt.cjs +1 -1
  1002. package/dist/hooks/use-install-prompt.cjs.map +1 -1
  1003. package/dist/hooks/use-install-prompt.js +1 -1
  1004. package/dist/hooks/use-install-prompt.js.map +1 -1
  1005. package/dist/hooks/use-intersection-observer.cjs.map +1 -1
  1006. package/dist/hooks/use-intersection-observer.js.map +1 -1
  1007. package/dist/hooks/use-interval.cjs.map +1 -1
  1008. package/dist/hooks/use-interval.js.map +1 -1
  1009. package/dist/hooks/use-is-first-render.cjs.map +1 -1
  1010. package/dist/hooks/use-is-first-render.js.map +1 -1
  1011. package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
  1012. package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
  1013. package/dist/hooks/use-latest-ref.cjs.map +1 -1
  1014. package/dist/hooks/use-latest-ref.js.map +1 -1
  1015. package/dist/hooks/use-list-state.cjs.map +1 -1
  1016. package/dist/hooks/use-list-state.js.map +1 -1
  1017. package/dist/hooks/use-local-storage.cjs +1 -1
  1018. package/dist/hooks/use-local-storage.cjs.map +1 -1
  1019. package/dist/hooks/use-local-storage.js +2 -5
  1020. package/dist/hooks/use-local-storage.js.map +1 -1
  1021. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  1022. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  1023. package/dist/hooks/use-long-press.cjs.map +1 -1
  1024. package/dist/hooks/use-long-press.js.map +1 -1
  1025. package/dist/hooks/use-map.cjs.map +1 -1
  1026. package/dist/hooks/use-map.js.map +1 -1
  1027. package/dist/hooks/use-media-devices.cjs.map +1 -1
  1028. package/dist/hooks/use-media-devices.js.map +1 -1
  1029. package/dist/hooks/use-media-permission.cjs +1 -1
  1030. package/dist/hooks/use-media-permission.cjs.map +1 -1
  1031. package/dist/hooks/use-media-permission.js +2 -5
  1032. package/dist/hooks/use-media-permission.js.map +1 -1
  1033. package/dist/hooks/use-media-query.cjs.map +1 -1
  1034. package/dist/hooks/use-media-query.js.map +1 -1
  1035. package/dist/hooks/use-object-url.cjs.map +1 -1
  1036. package/dist/hooks/use-object-url.js.map +1 -1
  1037. package/dist/hooks/use-online.cjs.map +1 -1
  1038. package/dist/hooks/use-online.js.map +1 -1
  1039. package/dist/hooks/use-pagination.cjs.map +1 -1
  1040. package/dist/hooks/use-pagination.js.map +1 -1
  1041. package/dist/hooks/use-previous.cjs.map +1 -1
  1042. package/dist/hooks/use-previous.js.map +1 -1
  1043. package/dist/hooks/use-push-to-talk.cjs.map +1 -1
  1044. package/dist/hooks/use-push-to-talk.js.map +1 -1
  1045. package/dist/hooks/use-queue.cjs.map +1 -1
  1046. package/dist/hooks/use-queue.js.map +1 -1
  1047. package/dist/hooks/use-resize-observer.cjs.map +1 -1
  1048. package/dist/hooks/use-resize-observer.js.map +1 -1
  1049. package/dist/hooks/use-scroll-lock.cjs.map +1 -1
  1050. package/dist/hooks/use-scroll-lock.js.map +1 -1
  1051. package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
  1052. package/dist/hooks/use-scroll-overflow.js.map +1 -1
  1053. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  1054. package/dist/hooks/use-service-worker-update.js.map +1 -1
  1055. package/dist/hooks/use-set.cjs.map +1 -1
  1056. package/dist/hooks/use-set.js.map +1 -1
  1057. package/dist/hooks/use-sortable.cjs.map +1 -1
  1058. package/dist/hooks/use-sortable.js.map +1 -1
  1059. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  1060. package/dist/hooks/use-stable-callback.js.map +1 -1
  1061. package/dist/hooks/use-storage-estimate.cjs.map +1 -1
  1062. package/dist/hooks/use-storage-estimate.js.map +1 -1
  1063. package/dist/hooks/use-throttle.cjs.map +1 -1
  1064. package/dist/hooks/use-throttle.js.map +1 -1
  1065. package/dist/hooks/use-timeout.cjs.map +1 -1
  1066. package/dist/hooks/use-timeout.js.map +1 -1
  1067. package/dist/hooks/use-toggle.cjs.map +1 -1
  1068. package/dist/hooks/use-toggle.js.map +1 -1
  1069. package/dist/hooks/use-typewriter.cjs.map +1 -1
  1070. package/dist/hooks/use-typewriter.js.map +1 -1
  1071. package/dist/hooks/use-window-size.cjs.map +1 -1
  1072. package/dist/hooks/use-window-size.js.map +1 -1
  1073. package/dist/http/api-client.cjs.map +1 -1
  1074. package/dist/http/api-client.js.map +1 -1
  1075. package/dist/http/build-url.cjs.map +1 -1
  1076. package/dist/http/build-url.js.map +1 -1
  1077. package/dist/http/credential-scope.cjs.map +1 -1
  1078. package/dist/http/credential-scope.js.map +1 -1
  1079. package/dist/http/csrf.cjs.map +1 -1
  1080. package/dist/http/csrf.js.map +1 -1
  1081. package/dist/http/decode-response.cjs.map +1 -1
  1082. package/dist/http/decode-response.js.map +1 -1
  1083. package/dist/http/describe-api-error.cjs.map +1 -1
  1084. package/dist/http/describe-api-error.js.map +1 -1
  1085. package/dist/http/errors.cjs.map +1 -1
  1086. package/dist/http/errors.js.map +1 -1
  1087. package/dist/http/idempotency.cjs.map +1 -1
  1088. package/dist/http/idempotency.js.map +1 -1
  1089. package/dist/http/parse-response.cjs.map +1 -1
  1090. package/dist/http/parse-response.js.map +1 -1
  1091. package/dist/http/resumable-upload.cjs.map +1 -1
  1092. package/dist/http/resumable-upload.js.map +1 -1
  1093. package/dist/http/retry.cjs.map +1 -1
  1094. package/dist/http/retry.js.map +1 -1
  1095. package/dist/http/timeout.cjs.map +1 -1
  1096. package/dist/http/timeout.js.map +1 -1
  1097. package/dist/http/upload-with-progress.cjs +1 -1
  1098. package/dist/http/upload-with-progress.cjs.map +1 -1
  1099. package/dist/http/upload-with-progress.js +2 -7
  1100. package/dist/http/upload-with-progress.js.map +1 -1
  1101. package/dist/http/use-describe-api-error.cjs.map +1 -1
  1102. package/dist/http/use-describe-api-error.js.map +1 -1
  1103. package/dist/http/use-poll.cjs +1 -1
  1104. package/dist/http/use-poll.cjs.map +1 -1
  1105. package/dist/http/use-poll.js +2 -5
  1106. package/dist/http/use-poll.js.map +1 -1
  1107. package/dist/i18n/I18nProvider.cjs.map +1 -1
  1108. package/dist/i18n/I18nProvider.js.map +1 -1
  1109. package/dist/i18n/create-i18n.cjs.map +1 -1
  1110. package/dist/i18n/create-i18n.js.map +1 -1
  1111. package/dist/icons/Icon.cjs.map +1 -1
  1112. package/dist/icons/Icon.js.map +1 -1
  1113. package/dist/icons/IconPicker.cjs.map +1 -1
  1114. package/dist/icons/IconPicker.js.map +1 -1
  1115. package/dist/icons/IconPicker.module.cjs.map +1 -1
  1116. package/dist/icons/IconPicker.module.js.map +1 -1
  1117. package/dist/icons/IconProvider.cjs.map +1 -1
  1118. package/dist/icons/IconProvider.js.map +1 -1
  1119. package/dist/icons/alias.cjs.map +1 -1
  1120. package/dist/icons/alias.js.map +1 -1
  1121. package/dist/icons/generated/aliases.cjs.map +1 -1
  1122. package/dist/icons/generated/aliases.js.map +1 -1
  1123. package/dist/icons/generated/icon-names.cjs.map +1 -1
  1124. package/dist/icons/generated/icon-names.js.map +1 -1
  1125. package/dist/icons/generated/loaders.cjs.map +1 -1
  1126. package/dist/icons/generated/loaders.js.map +1 -1
  1127. package/dist/icons/generated/shard-00.cjs.map +1 -1
  1128. package/dist/icons/generated/shard-00.js.map +1 -1
  1129. package/dist/icons/generated/shard-01.cjs.map +1 -1
  1130. package/dist/icons/generated/shard-01.js.map +1 -1
  1131. package/dist/icons/generated/shard-02.cjs.map +1 -1
  1132. package/dist/icons/generated/shard-02.js.map +1 -1
  1133. package/dist/icons/generated/shard-03.cjs.map +1 -1
  1134. package/dist/icons/generated/shard-03.js.map +1 -1
  1135. package/dist/icons/generated/shard-04.cjs.map +1 -1
  1136. package/dist/icons/generated/shard-04.js.map +1 -1
  1137. package/dist/icons/generated/shard-05.cjs.map +1 -1
  1138. package/dist/icons/generated/shard-05.js.map +1 -1
  1139. package/dist/icons/generated/shard-06.cjs.map +1 -1
  1140. package/dist/icons/generated/shard-06.js.map +1 -1
  1141. package/dist/icons/generated/shard-07.cjs.map +1 -1
  1142. package/dist/icons/generated/shard-07.js.map +1 -1
  1143. package/dist/icons/generated/shard-08.cjs.map +1 -1
  1144. package/dist/icons/generated/shard-08.js.map +1 -1
  1145. package/dist/icons/generated/shard-09.cjs.map +1 -1
  1146. package/dist/icons/generated/shard-09.js.map +1 -1
  1147. package/dist/icons/generated/shard-10.cjs.map +1 -1
  1148. package/dist/icons/generated/shard-10.js.map +1 -1
  1149. package/dist/icons/generated/shard-11.cjs.map +1 -1
  1150. package/dist/icons/generated/shard-11.js.map +1 -1
  1151. package/dist/icons/generated/shard-12.cjs.map +1 -1
  1152. package/dist/icons/generated/shard-12.js.map +1 -1
  1153. package/dist/icons/generated/shard-13.cjs.map +1 -1
  1154. package/dist/icons/generated/shard-13.js.map +1 -1
  1155. package/dist/icons/generated/shard-14.cjs.map +1 -1
  1156. package/dist/icons/generated/shard-14.js.map +1 -1
  1157. package/dist/icons/generated/shard-15.cjs.map +1 -1
  1158. package/dist/icons/generated/shard-15.js.map +1 -1
  1159. package/dist/icons/generated/shard-16.cjs.map +1 -1
  1160. package/dist/icons/generated/shard-16.js.map +1 -1
  1161. package/dist/icons/generated/shard-17.cjs.map +1 -1
  1162. package/dist/icons/generated/shard-17.js.map +1 -1
  1163. package/dist/icons/generated/shard-18.cjs.map +1 -1
  1164. package/dist/icons/generated/shard-18.js.map +1 -1
  1165. package/dist/icons/generated/shard-19.cjs.map +1 -1
  1166. package/dist/icons/generated/shard-19.js.map +1 -1
  1167. package/dist/icons/generated/shard-20.cjs.map +1 -1
  1168. package/dist/icons/generated/shard-20.js.map +1 -1
  1169. package/dist/icons/generated/shard-21.cjs.map +1 -1
  1170. package/dist/icons/generated/shard-21.js.map +1 -1
  1171. package/dist/icons/generated/shard-22.cjs.map +1 -1
  1172. package/dist/icons/generated/shard-22.js.map +1 -1
  1173. package/dist/icons/generated/shard-23.cjs.map +1 -1
  1174. package/dist/icons/generated/shard-23.js.map +1 -1
  1175. package/dist/icons/generated/shard-24.cjs.map +1 -1
  1176. package/dist/icons/generated/shard-24.js.map +1 -1
  1177. package/dist/icons/generated/shard-25.cjs.map +1 -1
  1178. package/dist/icons/generated/shard-25.js.map +1 -1
  1179. package/dist/icons/generated/shard-26.cjs.map +1 -1
  1180. package/dist/icons/generated/shard-26.js.map +1 -1
  1181. package/dist/icons/generated/shard-27.cjs.map +1 -1
  1182. package/dist/icons/generated/shard-27.js.map +1 -1
  1183. package/dist/icons/generated/shard-28.cjs.map +1 -1
  1184. package/dist/icons/generated/shard-28.js.map +1 -1
  1185. package/dist/icons/generated/shard-29.cjs.map +1 -1
  1186. package/dist/icons/generated/shard-29.js.map +1 -1
  1187. package/dist/icons/generated/shard-30.cjs.map +1 -1
  1188. package/dist/icons/generated/shard-30.js.map +1 -1
  1189. package/dist/icons/generated/shard-31.cjs.map +1 -1
  1190. package/dist/icons/generated/shard-31.js.map +1 -1
  1191. package/dist/icons/generated/shard-32.cjs.map +1 -1
  1192. package/dist/icons/generated/shard-32.js.map +1 -1
  1193. package/dist/icons/generated/shard-33.cjs.map +1 -1
  1194. package/dist/icons/generated/shard-33.js.map +1 -1
  1195. package/dist/icons/generated/shard-34.cjs.map +1 -1
  1196. package/dist/icons/generated/shard-34.js.map +1 -1
  1197. package/dist/icons/generated/shard-35.cjs.map +1 -1
  1198. package/dist/icons/generated/shard-35.js.map +1 -1
  1199. package/dist/icons/generated/shard-36.cjs.map +1 -1
  1200. package/dist/icons/generated/shard-36.js.map +1 -1
  1201. package/dist/icons/generated/shard-37.cjs.map +1 -1
  1202. package/dist/icons/generated/shard-37.js.map +1 -1
  1203. package/dist/icons/generated/shard-38.cjs.map +1 -1
  1204. package/dist/icons/generated/shard-38.js.map +1 -1
  1205. package/dist/icons/generated/shard-39.cjs.map +1 -1
  1206. package/dist/icons/generated/shard-39.js.map +1 -1
  1207. package/dist/icons/generated/shard-40.cjs.map +1 -1
  1208. package/dist/icons/generated/shard-40.js.map +1 -1
  1209. package/dist/icons/generated/shard-41.cjs.map +1 -1
  1210. package/dist/icons/generated/shard-41.js.map +1 -1
  1211. package/dist/icons/generated/shard-42.cjs.map +1 -1
  1212. package/dist/icons/generated/shard-42.js.map +1 -1
  1213. package/dist/icons/generated/shard-43.cjs.map +1 -1
  1214. package/dist/icons/generated/shard-43.js.map +1 -1
  1215. package/dist/icons/generated/shard-44.cjs.map +1 -1
  1216. package/dist/icons/generated/shard-44.js.map +1 -1
  1217. package/dist/icons/generated/shard-45.cjs.map +1 -1
  1218. package/dist/icons/generated/shard-45.js.map +1 -1
  1219. package/dist/icons/icon-context.cjs.map +1 -1
  1220. package/dist/icons/icon-context.js.map +1 -1
  1221. package/dist/icons/is-icon-name.cjs.map +1 -1
  1222. package/dist/icons/is-icon-name.js.map +1 -1
  1223. package/dist/icons/material-symbols.cjs.map +1 -1
  1224. package/dist/icons/material-symbols.js.map +1 -1
  1225. package/dist/icons/normalize-icon-name.cjs.map +1 -1
  1226. package/dist/icons/normalize-icon-name.js.map +1 -1
  1227. package/dist/icons/shard-cache.cjs +1 -1
  1228. package/dist/icons/shard-cache.cjs.map +1 -1
  1229. package/dist/icons/shard-cache.js +2 -5
  1230. package/dist/icons/shard-cache.js.map +1 -1
  1231. package/dist/icons/use-icon.cjs.map +1 -1
  1232. package/dist/icons/use-icon.js.map +1 -1
  1233. package/dist/icons/validate-icon-name.cjs.map +1 -1
  1234. package/dist/icons/validate-icon-name.js.map +1 -1
  1235. package/dist/icons-virtual.cjs.map +1 -1
  1236. package/dist/icons-virtual.js.map +1 -1
  1237. package/dist/imaging/canvas.cjs.map +1 -1
  1238. package/dist/imaging/canvas.js.map +1 -1
  1239. package/dist/imaging/compress.cjs.map +1 -1
  1240. package/dist/imaging/compress.js.map +1 -1
  1241. package/dist/imaging/decode.cjs.map +1 -1
  1242. package/dist/imaging/decode.js.map +1 -1
  1243. package/dist/imaging/encode.cjs.map +1 -1
  1244. package/dist/imaging/encode.js.map +1 -1
  1245. package/dist/imaging/exceptions.cjs.map +1 -1
  1246. package/dist/imaging/exceptions.js.map +1 -1
  1247. package/dist/imaging/frame.cjs.map +1 -1
  1248. package/dist/imaging/frame.js.map +1 -1
  1249. package/dist/imaging/thumbnails.cjs.map +1 -1
  1250. package/dist/imaging/thumbnails.js.map +1 -1
  1251. package/dist/imaging/transform.cjs.map +1 -1
  1252. package/dist/imaging/transform.js.map +1 -1
  1253. package/dist/imaging/use-image-processing.cjs.map +1 -1
  1254. package/dist/imaging/use-image-processing.js.map +1 -1
  1255. package/dist/logger/logger.cjs.map +1 -1
  1256. package/dist/logger/logger.js.map +1 -1
  1257. package/dist/neural.cjs.map +1 -1
  1258. package/dist/neural.js.map +1 -1
  1259. package/dist/oauth/GoogleSignIn.cjs +1 -1
  1260. package/dist/oauth/GoogleSignIn.cjs.map +1 -1
  1261. package/dist/oauth/GoogleSignIn.js +6 -9
  1262. package/dist/oauth/GoogleSignIn.js.map +1 -1
  1263. package/dist/oauth/callback.cjs.map +1 -1
  1264. package/dist/oauth/callback.js.map +1 -1
  1265. package/dist/oauth/use-oauth-callback.cjs.map +1 -1
  1266. package/dist/oauth/use-oauth-callback.js.map +1 -1
  1267. package/dist/offline/conflict.cjs.map +1 -1
  1268. package/dist/offline/conflict.js.map +1 -1
  1269. package/dist/offline/create-offline-database.cjs.map +1 -1
  1270. package/dist/offline/create-offline-database.js.map +1 -1
  1271. package/dist/offline/create-offline-store.cjs +1 -1
  1272. package/dist/offline/create-offline-store.cjs.map +1 -1
  1273. package/dist/offline/create-offline-store.js +1 -5
  1274. package/dist/offline/create-offline-store.js.map +1 -1
  1275. package/dist/offline/create-offline-sync.cjs +1 -1
  1276. package/dist/offline/create-offline-sync.cjs.map +1 -1
  1277. package/dist/offline/create-offline-sync.js +9 -14
  1278. package/dist/offline/create-offline-sync.js.map +1 -1
  1279. package/dist/offline/use-offline-sync.cjs.map +1 -1
  1280. package/dist/offline/use-offline-sync.js.map +1 -1
  1281. package/dist/perf/cache-size.cjs.map +1 -1
  1282. package/dist/perf/cache-size.js.map +1 -1
  1283. package/dist/perf/device.cjs.map +1 -1
  1284. package/dist/perf/device.js.map +1 -1
  1285. package/dist/perf/format.cjs.map +1 -1
  1286. package/dist/perf/format.js.map +1 -1
  1287. package/dist/perf/profiler.cjs.map +1 -1
  1288. package/dist/perf/profiler.js.map +1 -1
  1289. package/dist/push/use-push-subscription.cjs.map +1 -1
  1290. package/dist/push/use-push-subscription.js.map +1 -1
  1291. package/dist/push/utils.cjs.map +1 -1
  1292. package/dist/push/utils.js.map +1 -1
  1293. package/dist/push/web-push-client.cjs.map +1 -1
  1294. package/dist/push/web-push-client.js.map +1 -1
  1295. package/dist/query/QueryProvider.cjs.map +1 -1
  1296. package/dist/query/QueryProvider.js.map +1 -1
  1297. package/dist/query/constants.cjs.map +1 -1
  1298. package/dist/query/constants.js.map +1 -1
  1299. package/dist/query/create-query-keys.cjs.map +1 -1
  1300. package/dist/query/create-query-keys.js.map +1 -1
  1301. package/dist/query/foreign-client-warning.cjs.map +1 -1
  1302. package/dist/query/foreign-client-warning.js.map +1 -1
  1303. package/dist/query/offline-persistence.cjs +1 -1
  1304. package/dist/query/offline-persistence.cjs.map +1 -1
  1305. package/dist/query/offline-persistence.js +2 -10
  1306. package/dist/query/offline-persistence.js.map +1 -1
  1307. package/dist/query/optimistic.cjs.map +1 -1
  1308. package/dist/query/optimistic.js.map +1 -1
  1309. package/dist/query/pagination.cjs.map +1 -1
  1310. package/dist/query/pagination.js.map +1 -1
  1311. package/dist/query/retry-policy.cjs.map +1 -1
  1312. package/dist/query/retry-policy.js.map +1 -1
  1313. package/dist/query/use-cursor-query.cjs.map +1 -1
  1314. package/dist/query/use-cursor-query.js.map +1 -1
  1315. package/dist/query/use-offline-mutation.cjs.map +1 -1
  1316. package/dist/query/use-offline-mutation.js.map +1 -1
  1317. package/dist/query/use-paginated-query.cjs.map +1 -1
  1318. package/dist/query/use-paginated-query.js.map +1 -1
  1319. package/dist/router/AppRouter.cjs.map +1 -1
  1320. package/dist/router/AppRouter.js.map +1 -1
  1321. package/dist/router/RouteGuard.cjs.map +1 -1
  1322. package/dist/router/RouteGuard.js.map +1 -1
  1323. package/dist/router/index.js +2 -2
  1324. package/dist/share/share-or-download.cjs.map +1 -1
  1325. package/dist/share/share-or-download.js.map +1 -1
  1326. package/dist/share/share.cjs.map +1 -1
  1327. package/dist/share/share.js.map +1 -1
  1328. package/dist/sse/create-event-stream.cjs.map +1 -1
  1329. package/dist/sse/create-event-stream.js.map +1 -1
  1330. package/dist/sse/use-event-stream.cjs.map +1 -1
  1331. package/dist/sse/use-event-stream.js.map +1 -1
  1332. package/dist/store/create-selectors.cjs.map +1 -1
  1333. package/dist/store/create-selectors.js.map +1 -1
  1334. package/dist/store/create-store.cjs.map +1 -1
  1335. package/dist/store/create-store.js.map +1 -1
  1336. package/dist/sw/background-sync.cjs.map +1 -1
  1337. package/dist/sw/background-sync.js.map +1 -1
  1338. package/dist/sw/cache-inspect.cjs.map +1 -1
  1339. package/dist/sw/cache-inspect.js.map +1 -1
  1340. package/dist/sw/cache.cjs +1 -1
  1341. package/dist/sw/cache.cjs.map +1 -1
  1342. package/dist/sw/cache.js +2 -6
  1343. package/dist/sw/cache.js.map +1 -1
  1344. package/dist/sw/create-push-handler.cjs.map +1 -1
  1345. package/dist/sw/create-push-handler.js.map +1 -1
  1346. package/dist/sw/credential-headers.cjs.map +1 -1
  1347. package/dist/sw/credential-headers.js.map +1 -1
  1348. package/dist/sw/periodic-sync.cjs.map +1 -1
  1349. package/dist/sw/periodic-sync.js.map +1 -1
  1350. package/dist/sw/register-service-worker.cjs.map +1 -1
  1351. package/dist/sw/register-service-worker.js.map +1 -1
  1352. package/dist/sw/session-data.cjs.map +1 -1
  1353. package/dist/sw/session-data.js.map +1 -1
  1354. package/dist/tabular/assets.cjs.map +1 -1
  1355. package/dist/tabular/assets.js.map +1 -1
  1356. package/dist/tabular/cache.cjs.map +1 -1
  1357. package/dist/tabular/cache.js.map +1 -1
  1358. package/dist/tabular/compact.cjs.map +1 -1
  1359. package/dist/tabular/compact.js.map +1 -1
  1360. package/dist/tabular/exceptions.cjs.map +1 -1
  1361. package/dist/tabular/exceptions.js.map +1 -1
  1362. package/dist/tabular/manifest.cjs.map +1 -1
  1363. package/dist/tabular/manifest.js.map +1 -1
  1364. package/dist/tabular/predictor.cjs.map +1 -1
  1365. package/dist/tabular/predictor.js.map +1 -1
  1366. package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
  1367. package/dist/tabular/use-tabular-predictor.js.map +1 -1
  1368. package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
  1369. package/dist/telemetry/TelemetryProvider.js.map +1 -1
  1370. package/dist/telemetry/app-error-adapter.cjs.map +1 -1
  1371. package/dist/telemetry/app-error-adapter.js.map +1 -1
  1372. package/dist/telemetry/app-error-queue.cjs.map +1 -1
  1373. package/dist/telemetry/app-error-queue.js.map +1 -1
  1374. package/dist/telemetry/app-error-reporter.cjs.map +1 -1
  1375. package/dist/telemetry/app-error-reporter.js.map +1 -1
  1376. package/dist/telemetry/app-error-schema.cjs.map +1 -1
  1377. package/dist/telemetry/app-error-schema.js.map +1 -1
  1378. package/dist/telemetry/app-error-transport.cjs.map +1 -1
  1379. package/dist/telemetry/app-error-transport.js.map +1 -1
  1380. package/dist/telemetry/console-adapter.cjs.map +1 -1
  1381. package/dist/telemetry/console-adapter.js.map +1 -1
  1382. package/dist/telemetry/describe-app-error.cjs.map +1 -1
  1383. package/dist/telemetry/describe-app-error.js.map +1 -1
  1384. package/dist/telemetry/posthog-adapter.cjs +1 -1
  1385. package/dist/telemetry/posthog-adapter.cjs.map +1 -1
  1386. package/dist/telemetry/posthog-adapter.js +1 -5
  1387. package/dist/telemetry/posthog-adapter.js.map +1 -1
  1388. package/dist/telemetry/sentry-adapter.cjs.map +1 -1
  1389. package/dist/telemetry/sentry-adapter.js.map +1 -1
  1390. package/dist/tempest-react-sdk.cjs +1 -1
  1391. package/dist/tempest-react-sdk.d.ts +234 -3
  1392. package/dist/tempest-react-sdk.js +85 -85
  1393. package/dist/testing/create-mock-handlers.cjs.map +1 -1
  1394. package/dist/testing/create-mock-handlers.js.map +1 -1
  1395. package/dist/testing.js +1 -2
  1396. package/dist/theme/ThemeProvider.cjs.map +1 -1
  1397. package/dist/theme/ThemeProvider.js.map +1 -1
  1398. package/dist/theme/apply-theme.cjs.map +1 -1
  1399. package/dist/theme/apply-theme.js.map +1 -1
  1400. package/dist/theme/color.cjs.map +1 -1
  1401. package/dist/theme/color.js.map +1 -1
  1402. package/dist/theme/create-theme.cjs.map +1 -1
  1403. package/dist/theme/create-theme.js.map +1 -1
  1404. package/dist/theme/data-viz-ramps.cjs.map +1 -1
  1405. package/dist/theme/data-viz-ramps.js.map +1 -1
  1406. package/dist/theme/initial-theme.cjs.map +1 -1
  1407. package/dist/theme/initial-theme.js.map +1 -1
  1408. package/dist/theme/inverse-render.cjs.map +1 -1
  1409. package/dist/theme/inverse-render.js.map +1 -1
  1410. package/dist/theme/inverse-restore.cjs.map +1 -1
  1411. package/dist/theme/inverse-restore.js.map +1 -1
  1412. package/dist/theme/inverse-surface.cjs.map +1 -1
  1413. package/dist/theme/inverse-surface.js.map +1 -1
  1414. package/dist/theme/status-tokens.cjs.map +1 -1
  1415. package/dist/theme/status-tokens.js.map +1 -1
  1416. package/dist/theme/theme-presets.cjs.map +1 -1
  1417. package/dist/theme/theme-presets.js.map +1 -1
  1418. package/dist/utils/absent.cjs.map +1 -1
  1419. package/dist/utils/absent.js.map +1 -1
  1420. package/dist/utils/arrays.cjs.map +1 -1
  1421. package/dist/utils/arrays.js.map +1 -1
  1422. package/dist/utils/base64.cjs.map +1 -1
  1423. package/dist/utils/base64.js.map +1 -1
  1424. package/dist/utils/cn.cjs.map +1 -1
  1425. package/dist/utils/cn.js.map +1 -1
  1426. package/dist/utils/compare-values.cjs.map +1 -1
  1427. package/dist/utils/compare-values.js.map +1 -1
  1428. package/dist/utils/compressed-storage.cjs.map +1 -1
  1429. package/dist/utils/compressed-storage.js.map +1 -1
  1430. package/dist/utils/csv.cjs.map +1 -1
  1431. package/dist/utils/csv.js.map +1 -1
  1432. package/dist/utils/dev-mode.cjs.map +1 -1
  1433. package/dist/utils/dev-mode.js.map +1 -1
  1434. package/dist/utils/duplicate-instance.cjs.map +1 -1
  1435. package/dist/utils/duplicate-instance.js.map +1 -1
  1436. package/dist/utils/format.cjs.map +1 -1
  1437. package/dist/utils/format.js.map +1 -1
  1438. package/dist/utils/functions.cjs +1 -1
  1439. package/dist/utils/functions.cjs.map +1 -1
  1440. package/dist/utils/functions.js +1 -1
  1441. package/dist/utils/functions.js.map +1 -1
  1442. package/dist/utils/guards.cjs.map +1 -1
  1443. package/dist/utils/guards.js.map +1 -1
  1444. package/dist/utils/ids.cjs.map +1 -1
  1445. package/dist/utils/ids.js.map +1 -1
  1446. package/dist/utils/intl-cache.cjs.map +1 -1
  1447. package/dist/utils/intl-cache.js.map +1 -1
  1448. package/dist/utils/json-frame.cjs.map +1 -1
  1449. package/dist/utils/json-frame.js.map +1 -1
  1450. package/dist/utils/numbers.cjs.map +1 -1
  1451. package/dist/utils/numbers.js.map +1 -1
  1452. package/dist/utils/objects.cjs.map +1 -1
  1453. package/dist/utils/objects.js.map +1 -1
  1454. package/dist/utils/owner-fingerprint.cjs.map +1 -1
  1455. package/dist/utils/owner-fingerprint.js.map +1 -1
  1456. package/dist/utils/promises.cjs.map +1 -1
  1457. package/dist/utils/promises.js.map +1 -1
  1458. package/dist/utils/relative-time.cjs.map +1 -1
  1459. package/dist/utils/relative-time.js.map +1 -1
  1460. package/dist/utils/safe-url.cjs.map +1 -1
  1461. package/dist/utils/safe-url.js.map +1 -1
  1462. package/dist/utils/schema-like.cjs.map +1 -1
  1463. package/dist/utils/schema-like.js.map +1 -1
  1464. package/dist/utils/storage.cjs +1 -1
  1465. package/dist/utils/storage.cjs.map +1 -1
  1466. package/dist/utils/storage.js +2 -2
  1467. package/dist/utils/storage.js.map +1 -1
  1468. package/dist/utils/strings.cjs.map +1 -1
  1469. package/dist/utils/strings.js.map +1 -1
  1470. package/dist/utils/xlsx.cjs.map +1 -1
  1471. package/dist/utils/xlsx.js.map +1 -1
  1472. package/dist/vision/core/canvas.cjs.map +1 -1
  1473. package/dist/vision/core/canvas.js.map +1 -1
  1474. package/dist/vision/core/dtypes.cjs.map +1 -1
  1475. package/dist/vision/core/dtypes.js.map +1 -1
  1476. package/dist/vision/core/exceptions.cjs.map +1 -1
  1477. package/dist/vision/core/exceptions.js.map +1 -1
  1478. package/dist/vision/core/graph.cjs.map +1 -1
  1479. package/dist/vision/core/graph.js.map +1 -1
  1480. package/dist/vision/core/metadata.cjs +1 -1
  1481. package/dist/vision/core/metadata.cjs.map +1 -1
  1482. package/dist/vision/core/metadata.js +9 -26
  1483. package/dist/vision/core/metadata.js.map +1 -1
  1484. package/dist/vision/core/providers.cjs.map +1 -1
  1485. package/dist/vision/core/providers.js.map +1 -1
  1486. package/dist/vision/core/session.cjs.map +1 -1
  1487. package/dist/vision/core/session.js.map +1 -1
  1488. package/dist/vision/core/timing.cjs.map +1 -1
  1489. package/dist/vision/core/timing.js.map +1 -1
  1490. package/dist/vision/fusion.cjs.map +1 -1
  1491. package/dist/vision/fusion.js.map +1 -1
  1492. package/dist/vision/index.cjs.map +1 -1
  1493. package/dist/vision/index.js.map +1 -1
  1494. package/dist/vision/io/image.cjs.map +1 -1
  1495. package/dist/vision/io/image.js.map +1 -1
  1496. package/dist/vision/labels.cjs.map +1 -1
  1497. package/dist/vision/labels.js.map +1 -1
  1498. package/dist/vision/luminance.cjs.map +1 -1
  1499. package/dist/vision/luminance.js.map +1 -1
  1500. package/dist/vision/normalization.cjs.map +1 -1
  1501. package/dist/vision/normalization.js.map +1 -1
  1502. package/dist/vision/postprocess/classification.cjs.map +1 -1
  1503. package/dist/vision/postprocess/classification.js.map +1 -1
  1504. package/dist/vision/postprocess/detection.cjs.map +1 -1
  1505. package/dist/vision/postprocess/detection.js.map +1 -1
  1506. package/dist/vision/postprocess/segmentation.cjs.map +1 -1
  1507. package/dist/vision/postprocess/segmentation.js.map +1 -1
  1508. package/dist/vision/preprocess/image.cjs.map +1 -1
  1509. package/dist/vision/preprocess/image.js.map +1 -1
  1510. package/dist/vision/preprocess/pipeline.cjs.map +1 -1
  1511. package/dist/vision/preprocess/pipeline.js.map +1 -1
  1512. package/dist/vision/results.cjs.map +1 -1
  1513. package/dist/vision/results.js.map +1 -1
  1514. package/dist/vision/tasks/base.cjs.map +1 -1
  1515. package/dist/vision/tasks/base.js.map +1 -1
  1516. package/dist/vision/tasks/classifier.cjs.map +1 -1
  1517. package/dist/vision/tasks/classifier.js.map +1 -1
  1518. package/dist/vision/tasks/detectClassify.cjs.map +1 -1
  1519. package/dist/vision/tasks/detectClassify.js.map +1 -1
  1520. package/dist/vision/tasks/detector.cjs.map +1 -1
  1521. package/dist/vision/tasks/detector.js.map +1 -1
  1522. package/dist/vision/tasks/segmenter.cjs.map +1 -1
  1523. package/dist/vision/tasks/segmenter.js.map +1 -1
  1524. package/dist/vision/types.cjs.map +1 -1
  1525. package/dist/vision/types.js.map +1 -1
  1526. package/dist/vision/use-camera-stream.cjs +1 -1
  1527. package/dist/vision/use-camera-stream.cjs.map +1 -1
  1528. package/dist/vision/use-camera-stream.js +3 -9
  1529. package/dist/vision/use-camera-stream.js.map +1 -1
  1530. package/dist/vision/use-live-luminance.cjs +1 -1
  1531. package/dist/vision/use-live-luminance.cjs.map +1 -1
  1532. package/dist/vision/use-live-luminance.js +1 -5
  1533. package/dist/vision/use-live-luminance.js.map +1 -1
  1534. package/dist/vite/base-url.cjs.map +1 -1
  1535. package/dist/vite/base-url.js.map +1 -1
  1536. package/dist/vite/create-vite-config.cjs.map +1 -1
  1537. package/dist/vite/create-vite-config.js.map +1 -1
  1538. package/dist/vite/narrow-tokens.cjs.map +1 -1
  1539. package/dist/vite/narrow-tokens.js.map +1 -1
  1540. package/dist/vite/tempest-csp.cjs +1 -1
  1541. package/dist/vite/tempest-csp.cjs.map +1 -1
  1542. package/dist/vite/tempest-csp.js +2 -10
  1543. package/dist/vite/tempest-csp.js.map +1 -1
  1544. package/dist/vite/tempest-icons.cjs.map +1 -1
  1545. package/dist/vite/tempest-icons.js.map +1 -1
  1546. package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
  1547. package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
  1548. package/dist/vite/tempest-pwa-dev-sw.js +9 -16
  1549. package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
  1550. package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
  1551. package/dist/vite/tempest-pwa-icons.js.map +1 -1
  1552. package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
  1553. package/dist/vite/tempest-pwa-manifest.js.map +1 -1
  1554. package/dist/vite/tempest-styles.cjs.map +1 -1
  1555. package/dist/vite/tempest-styles.js.map +1 -1
  1556. package/dist/vite/tempest-vitest.cjs.map +1 -1
  1557. package/dist/vite/tempest-vitest.js.map +1 -1
  1558. package/dist/webrtc/link-stats.cjs.map +1 -1
  1559. package/dist/webrtc/link-stats.js.map +1 -1
  1560. package/dist/webrtc/mesh-quality.cjs.map +1 -1
  1561. package/dist/webrtc/mesh-quality.js.map +1 -1
  1562. package/dist/webrtc/opus-sdp.cjs.map +1 -1
  1563. package/dist/webrtc/opus-sdp.js.map +1 -1
  1564. package/dist/webrtc/peer-link.cjs +1 -1
  1565. package/dist/webrtc/peer-link.cjs.map +1 -1
  1566. package/dist/webrtc/peer-link.js +2 -5
  1567. package/dist/webrtc/peer-link.js.map +1 -1
  1568. package/dist/webrtc/peer-mesh.cjs +1 -1
  1569. package/dist/webrtc/peer-mesh.cjs.map +1 -1
  1570. package/dist/webrtc/peer-mesh.js +8 -24
  1571. package/dist/webrtc/peer-mesh.js.map +1 -1
  1572. package/dist/webrtc/sender-bitrate.cjs.map +1 -1
  1573. package/dist/webrtc/sender-bitrate.js.map +1 -1
  1574. package/dist/webrtc/use-link-stats.cjs.map +1 -1
  1575. package/dist/webrtc/use-link-stats.js.map +1 -1
  1576. package/dist/ws/create-web-socket.cjs +1 -1
  1577. package/dist/ws/create-web-socket.cjs.map +1 -1
  1578. package/dist/ws/create-web-socket.js +4 -22
  1579. package/dist/ws/create-web-socket.js.map +1 -1
  1580. package/dist/ws/resilience.cjs.map +1 -1
  1581. package/dist/ws/resilience.js.map +1 -1
  1582. package/dist/ws/use-web-socket.cjs.map +1 -1
  1583. package/dist/ws/use-web-socket.js.map +1 -1
  1584. package/package.json +9 -6
  1585. package/template/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","names":[],"sources":["../../src/geo/types.ts"],"sourcesContent":["/**\n * WGS84 geographic coordinate. Mirrors the `Coordinate` schema from\n * `tempest-fastapi-sdk` (`geo/schemas.py`) — `latitude` in `[-90, 90]`,\n * `longitude` in `[-180, 180]`, serialized snake_case on the wire.\n */\nexport interface Coordinate {\n /** WGS84 latitude in degrees, `[-90, 90]`. E.g. `-23.5505`. */\n latitude: number;\n /** WGS84 longitude in degrees, `[-180, 180]`. E.g. `-46.6333`. */\n longitude: number;\n}\n\n/**\n * A pin plotted on a map: a {@link Coordinate} plus optional presentation and\n * an identity used for click callbacks. Shared by `TrajectoryMap` and the\n * Brazil maps' `markers` prop.\n */\nexport interface GeoMarker extends Coordinate {\n /** Stable identity (returned by click handlers). Falls back to the index. */\n id?: string;\n /** Tooltip / accessible label for the pin. */\n label?: string;\n /** Fill color. Defaults to the primary token. */\n color?: string;\n /** Radius in pixels. Default: 6. */\n radius?: number;\n}\n\n/**\n * A single sample in a recorded trajectory: a {@link Coordinate} stamped with\n * the epoch millisecond it was captured, plus the optional accuracy radius\n * reported by the Geolocation API.\n */\nexport interface TrackPoint extends Coordinate {\n /** Capture time in epoch milliseconds (`GeolocationPosition.timestamp`). */\n timestamp: number;\n /** Horizontal accuracy radius in meters, if the device reported one. */\n accuracy?: number;\n}\n\n/**\n * Travel mode. Mirrors the `TravelMode` string enum from `tempest-fastapi-sdk`\n * (`geo/enums.py`) — the on-the-wire value is the raw string.\n */\nexport type TravelMode = \"car\" | \"motorcycle\" | \"bus\";\n\n/**\n * Estimated travel between two coordinates. Mirrors the `TravelEstimate`\n * schema from `tempest-fastapi-sdk` (`geo/schemas.py`), snake_case preserved so\n * a response deserializes straight into this type.\n */\nexport interface TravelEstimate {\n /** Travel mode the estimate was computed for. */\n mode: TravelMode;\n /** Great-circle distance scaled by circuity, in kilometers (`>= 0`). */\n distance_km: number;\n /** Estimated duration in minutes (`>= 0`). */\n duration_minutes: number;\n /** How the estimate was produced. `\"heuristic\"` (offline) or `\"osrm\"`. */\n source: \"heuristic\" | \"osrm\";\n}\n\n/**\n * Axis-aligned geographic bounding box. `min`/`max` follow the same degree\n * ranges as {@link Coordinate}.\n */\nexport interface GeoBounds {\n minLatitude: number;\n maxLatitude: number;\n minLongitude: number;\n maxLongitude: number;\n}\n\n/** True when `value` is a finite latitude in `[-90, 90]`. */\nexport function isValidLatitude(value: number): boolean {\n return Number.isFinite(value) && value >= -90 && value <= 90;\n}\n\n/** True when `value` is a finite longitude in `[-180, 180]`. */\nexport function isValidLongitude(value: number): boolean {\n return Number.isFinite(value) && value >= -180 && value <= 180;\n}\n\n/**\n * Type guard for {@link Coordinate}: an object with finite, in-range\n * `latitude` and `longitude`.\n */\nexport function isCoordinate(value: unknown): value is Coordinate {\n if (typeof value !== \"object\" || value === null) return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.latitude === \"number\" &&\n typeof candidate.longitude === \"number\" &&\n isValidLatitude(candidate.latitude) &&\n isValidLongitude(candidate.longitude)\n );\n}\n\n/** Clamp a latitude into the valid `[-90, 90]` range. */\nexport function clampLatitude(latitude: number): number {\n return Math.min(90, Math.max(-90, latitude));\n}\n\n/**\n * Normalize a longitude into the `[-180, 180]` range, wrapping values that\n * cross the antimeridian (e.g. `190` → `-170`).\n */\nexport function normalizeLongitude(longitude: number): number {\n const wrapped = ((((longitude + 180) % 360) + 360) % 360) - 180;\n return wrapped;\n}\n"],"mappings":"AA0EA,SAAgB,EAAgB,EAAwB,CACpD,OAAO,OAAO,SAAS,CAAK,GAAK,GAAS,KAAO,GAAS,EAC9D,CAGA,SAAgB,EAAiB,EAAwB,CACrD,OAAO,OAAO,SAAS,CAAK,GAAK,GAAS,MAAQ,GAAS,GAC/D,CAMA,SAAgB,EAAa,EAAqC,CAC9D,GAAI,OAAO,GAAU,WAAY,EAAgB,MAAO,GACxD,IAAM,EAAY,EAClB,OACI,OAAO,EAAU,UAAa,UAC9B,OAAO,EAAU,WAAc,UAC/B,EAAgB,EAAU,QAAQ,GAClC,EAAiB,EAAU,SAAS,CAE5C,CAGA,SAAgB,EAAc,EAA0B,CACpD,OAAO,KAAK,IAAI,GAAI,KAAK,IAAI,IAAK,CAAQ,CAAC,CAC/C,CAMA,SAAgB,EAAmB,EAA2B,CAE1D,QADoB,EAAY,KAAO,IAAO,KAAO,IAAO,GAEhE"}
1
+ {"version":3,"file":"types.cjs","names":["isValidLatitude","value","isValidLongitude","isCoordinate","candidate","clampLatitude","latitude","normalizeLongitude","longitude"],"sources":["../../src/geo/types.ts"],"sourcesContent":["/**\n * WGS84 geographic coordinate. Mirrors the `Coordinate` schema from\n * `tempest-fastapi-sdk` (`geo/schemas.py`) — `latitude` in `[-90, 90]`,\n * `longitude` in `[-180, 180]`, serialized snake_case on the wire.\n */\nexport interface Coordinate {\n /** WGS84 latitude in degrees, `[-90, 90]`. E.g. `-23.5505`. */\n latitude: number;\n /** WGS84 longitude in degrees, `[-180, 180]`. E.g. `-46.6333`. */\n longitude: number;\n}\n\n/**\n * A pin plotted on a map: a {@link Coordinate} plus optional presentation and\n * an identity used for click callbacks. Shared by `TrajectoryMap` and the\n * Brazil maps' `markers` prop.\n */\nexport interface GeoMarker extends Coordinate {\n /** Stable identity (returned by click handlers). Falls back to the index. */\n id?: string;\n /** Tooltip / accessible label for the pin. */\n label?: string;\n /** Fill color. Defaults to the primary token. */\n color?: string;\n /** Radius in pixels. Default: 6. */\n radius?: number;\n}\n\n/**\n * A single sample in a recorded trajectory: a {@link Coordinate} stamped with\n * the epoch millisecond it was captured, plus the optional accuracy radius\n * reported by the Geolocation API.\n */\nexport interface TrackPoint extends Coordinate {\n /** Capture time in epoch milliseconds (`GeolocationPosition.timestamp`). */\n timestamp: number;\n /** Horizontal accuracy radius in meters, if the device reported one. */\n accuracy?: number;\n}\n\n/**\n * Travel mode. Mirrors the `TravelMode` string enum from `tempest-fastapi-sdk`\n * (`geo/enums.py`) — the on-the-wire value is the raw string.\n */\nexport type TravelMode = \"car\" | \"motorcycle\" | \"bus\";\n\n/**\n * Estimated travel between two coordinates. Mirrors the `TravelEstimate`\n * schema from `tempest-fastapi-sdk` (`geo/schemas.py`), snake_case preserved so\n * a response deserializes straight into this type.\n */\nexport interface TravelEstimate {\n /** Travel mode the estimate was computed for. */\n mode: TravelMode;\n /** Great-circle distance scaled by circuity, in kilometers (`>= 0`). */\n distance_km: number;\n /** Estimated duration in minutes (`>= 0`). */\n duration_minutes: number;\n /** How the estimate was produced. `\"heuristic\"` (offline) or `\"osrm\"`. */\n source: \"heuristic\" | \"osrm\";\n}\n\n/**\n * Axis-aligned geographic bounding box. `min`/`max` follow the same degree\n * ranges as {@link Coordinate}.\n */\nexport interface GeoBounds {\n minLatitude: number;\n maxLatitude: number;\n minLongitude: number;\n maxLongitude: number;\n}\n\n/** True when `value` is a finite latitude in `[-90, 90]`. */\nexport function isValidLatitude(value: number): boolean {\n return Number.isFinite(value) && value >= -90 && value <= 90;\n}\n\n/** True when `value` is a finite longitude in `[-180, 180]`. */\nexport function isValidLongitude(value: number): boolean {\n return Number.isFinite(value) && value >= -180 && value <= 180;\n}\n\n/**\n * Type guard for {@link Coordinate}: an object with finite, in-range\n * `latitude` and `longitude`.\n */\nexport function isCoordinate(value: unknown): value is Coordinate {\n if (typeof value !== \"object\" || value === null) return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.latitude === \"number\" &&\n typeof candidate.longitude === \"number\" &&\n isValidLatitude(candidate.latitude) &&\n isValidLongitude(candidate.longitude)\n );\n}\n\n/** Clamp a latitude into the valid `[-90, 90]` range. */\nexport function clampLatitude(latitude: number): number {\n return Math.min(90, Math.max(-90, latitude));\n}\n\n/**\n * Normalize a longitude into the `[-180, 180]` range, wrapping values that\n * cross the antimeridian (e.g. `190` → `-170`).\n */\nexport function normalizeLongitude(longitude: number): number {\n const wrapped = ((((longitude + 180) % 360) + 360) % 360) - 180;\n return wrapped;\n}\n"],"mappings":"AA0EA,SAAgBA,EAAgB,EAAwB,CACpD,OAAO,OAAO,SAASC,CAAK,GAAKA,GAAS,KAAOA,GAAS,EAC9D,CAGA,SAAgBC,EAAiB,EAAwB,CACrD,OAAO,OAAO,SAASD,CAAK,GAAKA,GAAS,MAAQA,GAAS,GAC/D,CAMA,SAAgBE,EAAa,EAAqC,CAC9D,GAAI,OAAOF,GAAU,WAAYA,EAAgB,MAAO,GACxD,IAAMG,EAAYH,EAClB,OACI,OAAOG,EAAU,UAAa,UAC9B,OAAOA,EAAU,WAAc,UAC/BJ,EAAgBI,EAAU,QAAQ,GAClCF,EAAiBE,EAAU,SAAS,CAE5C,CAGA,SAAgBC,EAAc,EAA0B,CACpD,OAAO,KAAK,IAAI,GAAI,KAAK,IAAI,IAAKC,CAAQ,CAAC,CAC/C,CAMA,SAAgBC,EAAmB,EAA2B,CAE1D,QADoBC,EAAY,KAAO,IAAO,KAAO,IAAO,GAEhE,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../src/geo/types.ts"],"sourcesContent":["/**\n * WGS84 geographic coordinate. Mirrors the `Coordinate` schema from\n * `tempest-fastapi-sdk` (`geo/schemas.py`) — `latitude` in `[-90, 90]`,\n * `longitude` in `[-180, 180]`, serialized snake_case on the wire.\n */\nexport interface Coordinate {\n /** WGS84 latitude in degrees, `[-90, 90]`. E.g. `-23.5505`. */\n latitude: number;\n /** WGS84 longitude in degrees, `[-180, 180]`. E.g. `-46.6333`. */\n longitude: number;\n}\n\n/**\n * A pin plotted on a map: a {@link Coordinate} plus optional presentation and\n * an identity used for click callbacks. Shared by `TrajectoryMap` and the\n * Brazil maps' `markers` prop.\n */\nexport interface GeoMarker extends Coordinate {\n /** Stable identity (returned by click handlers). Falls back to the index. */\n id?: string;\n /** Tooltip / accessible label for the pin. */\n label?: string;\n /** Fill color. Defaults to the primary token. */\n color?: string;\n /** Radius in pixels. Default: 6. */\n radius?: number;\n}\n\n/**\n * A single sample in a recorded trajectory: a {@link Coordinate} stamped with\n * the epoch millisecond it was captured, plus the optional accuracy radius\n * reported by the Geolocation API.\n */\nexport interface TrackPoint extends Coordinate {\n /** Capture time in epoch milliseconds (`GeolocationPosition.timestamp`). */\n timestamp: number;\n /** Horizontal accuracy radius in meters, if the device reported one. */\n accuracy?: number;\n}\n\n/**\n * Travel mode. Mirrors the `TravelMode` string enum from `tempest-fastapi-sdk`\n * (`geo/enums.py`) — the on-the-wire value is the raw string.\n */\nexport type TravelMode = \"car\" | \"motorcycle\" | \"bus\";\n\n/**\n * Estimated travel between two coordinates. Mirrors the `TravelEstimate`\n * schema from `tempest-fastapi-sdk` (`geo/schemas.py`), snake_case preserved so\n * a response deserializes straight into this type.\n */\nexport interface TravelEstimate {\n /** Travel mode the estimate was computed for. */\n mode: TravelMode;\n /** Great-circle distance scaled by circuity, in kilometers (`>= 0`). */\n distance_km: number;\n /** Estimated duration in minutes (`>= 0`). */\n duration_minutes: number;\n /** How the estimate was produced. `\"heuristic\"` (offline) or `\"osrm\"`. */\n source: \"heuristic\" | \"osrm\";\n}\n\n/**\n * Axis-aligned geographic bounding box. `min`/`max` follow the same degree\n * ranges as {@link Coordinate}.\n */\nexport interface GeoBounds {\n minLatitude: number;\n maxLatitude: number;\n minLongitude: number;\n maxLongitude: number;\n}\n\n/** True when `value` is a finite latitude in `[-90, 90]`. */\nexport function isValidLatitude(value: number): boolean {\n return Number.isFinite(value) && value >= -90 && value <= 90;\n}\n\n/** True when `value` is a finite longitude in `[-180, 180]`. */\nexport function isValidLongitude(value: number): boolean {\n return Number.isFinite(value) && value >= -180 && value <= 180;\n}\n\n/**\n * Type guard for {@link Coordinate}: an object with finite, in-range\n * `latitude` and `longitude`.\n */\nexport function isCoordinate(value: unknown): value is Coordinate {\n if (typeof value !== \"object\" || value === null) return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.latitude === \"number\" &&\n typeof candidate.longitude === \"number\" &&\n isValidLatitude(candidate.latitude) &&\n isValidLongitude(candidate.longitude)\n );\n}\n\n/** Clamp a latitude into the valid `[-90, 90]` range. */\nexport function clampLatitude(latitude: number): number {\n return Math.min(90, Math.max(-90, latitude));\n}\n\n/**\n * Normalize a longitude into the `[-180, 180]` range, wrapping values that\n * cross the antimeridian (e.g. `190` → `-170`).\n */\nexport function normalizeLongitude(longitude: number): number {\n const wrapped = ((((longitude + 180) % 360) + 360) % 360) - 180;\n return wrapped;\n}\n"],"mappings":";AA0EA,SAAgB,EAAgB,GAAwB;CACpD,OAAO,OAAO,SAAS,CAAK,KAAK,KAAS,OAAO,KAAS;AAC9D;AAGA,SAAgB,EAAiB,GAAwB;CACrD,OAAO,OAAO,SAAS,CAAK,KAAK,KAAS,QAAQ,KAAS;AAC/D;AAMA,SAAgB,EAAa,GAAqC;CAC9D,IAAI,OAAO,KAAU,aAAY,GAAgB,OAAO;CACxD,IAAM,IAAY;CAClB,OACI,OAAO,EAAU,YAAa,YAC9B,OAAO,EAAU,aAAc,YAC/B,EAAgB,EAAU,QAAQ,KAClC,EAAiB,EAAU,SAAS;AAE5C;AAGA,SAAgB,EAAc,GAA0B;CACpD,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,CAAQ,CAAC;AAC/C;AAMA,SAAgB,EAAmB,GAA2B;CAE1D,SADoB,IAAY,OAAO,MAAO,OAAO,MAAO;AAEhE"}
1
+ {"version":3,"file":"types.js","names":["isValidLatitude","value","isValidLongitude","isCoordinate","candidate","clampLatitude","latitude","normalizeLongitude","longitude"],"sources":["../../src/geo/types.ts"],"sourcesContent":["/**\n * WGS84 geographic coordinate. Mirrors the `Coordinate` schema from\n * `tempest-fastapi-sdk` (`geo/schemas.py`) — `latitude` in `[-90, 90]`,\n * `longitude` in `[-180, 180]`, serialized snake_case on the wire.\n */\nexport interface Coordinate {\n /** WGS84 latitude in degrees, `[-90, 90]`. E.g. `-23.5505`. */\n latitude: number;\n /** WGS84 longitude in degrees, `[-180, 180]`. E.g. `-46.6333`. */\n longitude: number;\n}\n\n/**\n * A pin plotted on a map: a {@link Coordinate} plus optional presentation and\n * an identity used for click callbacks. Shared by `TrajectoryMap` and the\n * Brazil maps' `markers` prop.\n */\nexport interface GeoMarker extends Coordinate {\n /** Stable identity (returned by click handlers). Falls back to the index. */\n id?: string;\n /** Tooltip / accessible label for the pin. */\n label?: string;\n /** Fill color. Defaults to the primary token. */\n color?: string;\n /** Radius in pixels. Default: 6. */\n radius?: number;\n}\n\n/**\n * A single sample in a recorded trajectory: a {@link Coordinate} stamped with\n * the epoch millisecond it was captured, plus the optional accuracy radius\n * reported by the Geolocation API.\n */\nexport interface TrackPoint extends Coordinate {\n /** Capture time in epoch milliseconds (`GeolocationPosition.timestamp`). */\n timestamp: number;\n /** Horizontal accuracy radius in meters, if the device reported one. */\n accuracy?: number;\n}\n\n/**\n * Travel mode. Mirrors the `TravelMode` string enum from `tempest-fastapi-sdk`\n * (`geo/enums.py`) — the on-the-wire value is the raw string.\n */\nexport type TravelMode = \"car\" | \"motorcycle\" | \"bus\";\n\n/**\n * Estimated travel between two coordinates. Mirrors the `TravelEstimate`\n * schema from `tempest-fastapi-sdk` (`geo/schemas.py`), snake_case preserved so\n * a response deserializes straight into this type.\n */\nexport interface TravelEstimate {\n /** Travel mode the estimate was computed for. */\n mode: TravelMode;\n /** Great-circle distance scaled by circuity, in kilometers (`>= 0`). */\n distance_km: number;\n /** Estimated duration in minutes (`>= 0`). */\n duration_minutes: number;\n /** How the estimate was produced. `\"heuristic\"` (offline) or `\"osrm\"`. */\n source: \"heuristic\" | \"osrm\";\n}\n\n/**\n * Axis-aligned geographic bounding box. `min`/`max` follow the same degree\n * ranges as {@link Coordinate}.\n */\nexport interface GeoBounds {\n minLatitude: number;\n maxLatitude: number;\n minLongitude: number;\n maxLongitude: number;\n}\n\n/** True when `value` is a finite latitude in `[-90, 90]`. */\nexport function isValidLatitude(value: number): boolean {\n return Number.isFinite(value) && value >= -90 && value <= 90;\n}\n\n/** True when `value` is a finite longitude in `[-180, 180]`. */\nexport function isValidLongitude(value: number): boolean {\n return Number.isFinite(value) && value >= -180 && value <= 180;\n}\n\n/**\n * Type guard for {@link Coordinate}: an object with finite, in-range\n * `latitude` and `longitude`.\n */\nexport function isCoordinate(value: unknown): value is Coordinate {\n if (typeof value !== \"object\" || value === null) return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.latitude === \"number\" &&\n typeof candidate.longitude === \"number\" &&\n isValidLatitude(candidate.latitude) &&\n isValidLongitude(candidate.longitude)\n );\n}\n\n/** Clamp a latitude into the valid `[-90, 90]` range. */\nexport function clampLatitude(latitude: number): number {\n return Math.min(90, Math.max(-90, latitude));\n}\n\n/**\n * Normalize a longitude into the `[-180, 180]` range, wrapping values that\n * cross the antimeridian (e.g. `190` → `-170`).\n */\nexport function normalizeLongitude(longitude: number): number {\n const wrapped = ((((longitude + 180) % 360) + 360) % 360) - 180;\n return wrapped;\n}\n"],"mappings":";AA0EA,SAAgBA,EAAgB,GAAwB;CACpD,OAAO,OAAO,SAASC,CAAK,KAAKA,KAAS,OAAOA,KAAS;AAC9D;AAGA,SAAgBC,EAAiB,GAAwB;CACrD,OAAO,OAAO,SAASD,CAAK,KAAKA,KAAS,QAAQA,KAAS;AAC/D;AAMA,SAAgBE,EAAa,GAAqC;CAC9D,IAAI,OAAOF,KAAU,aAAYA,GAAgB,OAAO;CACxD,IAAMG,IAAYH;CAClB,OACI,OAAOG,EAAU,YAAa,YAC9B,OAAOA,EAAU,aAAc,YAC/BJ,EAAgBI,EAAU,QAAQ,KAClCF,EAAiBE,EAAU,SAAS;AAE5C;AAGA,SAAgBC,EAAc,GAA0B;CACpD,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,KAAKC,CAAQ,CAAC;AAC/C;AAMA,SAAgBC,EAAmB,GAA2B;CAE1D,SADoBC,IAAY,OAAO,MAAO,OAAO,MAAO;AAEhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-position-tracker.cjs","names":[],"sources":["../../src/geo/use-position-tracker.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\nimport {\n createPositionTracker,\n type CreatePositionTrackerOptions,\n type PositionTracker,\n type TrackerStatus,\n} from \"./create-position-tracker\";\nimport type { TrackPoint } from \"./types\";\n\nexport interface UsePositionTrackerOptions extends Omit<\n CreatePositionTrackerOptions,\n \"onUpdate\" | \"onStatusChange\"\n> {\n /** Start tracking automatically on mount. Default: `false`. */\n autoStart?: boolean;\n}\n\nexport interface UsePositionTrackerResult {\n /** Recorded trajectory (newest last). */\n points: readonly TrackPoint[];\n /** Most recent point, or `null` before the first fix. */\n lastPoint: TrackPoint | null;\n /** Total distance of the trajectory in kilometers. */\n distanceKm: number;\n /** Current tracker status. */\n status: TrackerStatus;\n /** True while `status === \"tracking\"`. */\n isTracking: boolean;\n /** Begin watching position. */\n start: () => void;\n /** Stop watching, keeping the trajectory. */\n stop: () => void;\n /** Stop and discard the trajectory. */\n clear: () => void;\n}\n\n/**\n * React hook wrapping {@link createPositionTracker}. Records a live GPS\n * trajectory tied to the component lifecycle — the watch is torn down on\n * unmount. Fully browser-side; no external service.\n *\n * @example\n * const { points, distanceKm, isTracking, start, stop } = usePositionTracker({\n * minDistanceKm: 0.01,\n * });\n * return (\n * <>\n * <button onClick={isTracking ? stop : start}>{isTracking ? \"Parar\" : \"Rastrear\"}</button>\n * <TrajectoryMap points={points} />\n * <span>{distanceKm.toFixed(2)} km</span>\n * </>\n * );\n */\nexport function usePositionTracker(\n options: UsePositionTrackerOptions = {},\n): UsePositionTrackerResult {\n const { autoStart = false, onError, ...trackerOptions } = options;\n\n const [points, setPoints] = useState<readonly TrackPoint[]>([]);\n const [distanceKm, setDistanceKm] = useState<number>(0);\n const [status, setStatus] = useState<TrackerStatus>(\"idle\");\n\n const trackerRef = useRef<PositionTracker | null>(null);\n const onErrorRef = useLatestRef(onError);\n\n useEffect(() => {\n const tracker = createPositionTracker({\n ...trackerOptions,\n onUpdate: (next) => {\n setPoints([...next]);\n setDistanceKm(tracker.distanceKm);\n },\n onStatusChange: setStatus,\n onError: (error) => onErrorRef.current?.(error),\n });\n trackerRef.current = tracker;\n if (autoStart) tracker.start();\n\n return () => {\n tracker.stop();\n trackerRef.current = null;\n };\n // Tracker options are read once at creation; changing them mid-track\n // would drop the recorded trajectory, so they are intentionally omitted.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const start = useCallback((): void => trackerRef.current?.start(), []);\n const stop = useCallback((): void => trackerRef.current?.stop(), []);\n const clear = useCallback((): void => {\n trackerRef.current?.clear();\n setDistanceKm(0);\n }, []);\n\n return {\n points,\n lastPoint: points.length > 0 ? points[points.length - 1] : null,\n distanceKm,\n status,\n isTracking: status === \"tracking\",\n start,\n stop,\n clear,\n };\n}\n"],"mappings":"iHAsDA,SAAgB,EACZ,EAAqC,CAAC,EACd,CACxB,GAAM,CAAE,YAAY,GAAO,UAAS,GAAG,GAAmB,EAEpD,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAgC,CAAC,CAAC,EACxD,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAiB,CAAC,EAChD,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAwB,MAAM,EAEpD,GAAA,EAAa,EAAA,OAAA,CAA+B,IAAI,EAChD,EAAa,EAAA,aAAa,CAAO,GAEvC,EAAA,EAAA,UAAA,KAAgB,CACZ,IAAM,EAAU,EAAA,sBAAsB,CAClC,GAAG,EACH,SAAW,GAAS,CAChB,EAAU,CAAC,GAAG,CAAI,CAAC,EACnB,EAAc,EAAQ,UAAU,CACpC,EACA,eAAgB,EAChB,QAAU,GAAU,EAAW,UAAU,CAAK,CAClD,CAAC,EAID,MAHA,GAAW,QAAU,EACjB,GAAW,EAAQ,MAAM,MAEhB,CACT,EAAQ,KAAK,EACb,EAAW,QAAU,IACzB,CAIJ,EAAG,CAAC,CAAC,EAEL,IAAM,GAAA,EAAQ,EAAA,YAAA,KAAwB,EAAW,SAAS,MAAM,EAAG,CAAC,CAAC,EAC/D,GAAA,EAAO,EAAA,YAAA,KAAwB,EAAW,SAAS,KAAK,EAAG,CAAC,CAAC,EAC7D,GAAA,EAAQ,EAAA,YAAA,KAAwB,CAClC,EAAW,SAAS,MAAM,EAC1B,EAAc,CAAC,CACnB,EAAG,CAAC,CAAC,EAEL,MAAO,CACH,SACA,UAAW,EAAO,OAAS,EAAI,EAAO,EAAO,OAAS,GAAK,KAC3D,aACA,SACA,WAAY,IAAW,WACvB,QACA,OACA,OACJ,CACJ"}
1
+ {"version":3,"file":"use-position-tracker.cjs","names":["useState","useRef","useLatestRef","createPositionTracker","useCallback","require_use_latest_ref","require_create_position_tracker","react","usePositionTracker","trackerOptions","options","points","setPoints","distanceKm","setDistanceKm","status","setStatus","trackerRef","onErrorRef","onError","tracker","next","error","autoStart","start","stop","clear"],"sources":["../../src/geo/use-position-tracker.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\nimport {\n createPositionTracker,\n type CreatePositionTrackerOptions,\n type PositionTracker,\n type TrackerStatus,\n} from \"./create-position-tracker\";\nimport type { TrackPoint } from \"./types\";\n\nexport interface UsePositionTrackerOptions extends Omit<\n CreatePositionTrackerOptions,\n \"onUpdate\" | \"onStatusChange\"\n> {\n /** Start tracking automatically on mount. Default: `false`. */\n autoStart?: boolean;\n}\n\nexport interface UsePositionTrackerResult {\n /** Recorded trajectory (newest last). */\n points: readonly TrackPoint[];\n /** Most recent point, or `null` before the first fix. */\n lastPoint: TrackPoint | null;\n /** Total distance of the trajectory in kilometers. */\n distanceKm: number;\n /** Current tracker status. */\n status: TrackerStatus;\n /** True while `status === \"tracking\"`. */\n isTracking: boolean;\n /** Begin watching position. */\n start: () => void;\n /** Stop watching, keeping the trajectory. */\n stop: () => void;\n /** Stop and discard the trajectory. */\n clear: () => void;\n}\n\n/**\n * React hook wrapping {@link createPositionTracker}. Records a live GPS\n * trajectory tied to the component lifecycle — the watch is torn down on\n * unmount. Fully browser-side; no external service.\n *\n * @example\n * const { points, distanceKm, isTracking, start, stop } = usePositionTracker({\n * minDistanceKm: 0.01,\n * });\n * return (\n * <>\n * <button onClick={isTracking ? stop : start}>{isTracking ? \"Parar\" : \"Rastrear\"}</button>\n * <TrajectoryMap points={points} />\n * <span>{distanceKm.toFixed(2)} km</span>\n * </>\n * );\n */\nexport function usePositionTracker(\n options: UsePositionTrackerOptions = {},\n): UsePositionTrackerResult {\n const { autoStart = false, onError, ...trackerOptions } = options;\n\n const [points, setPoints] = useState<readonly TrackPoint[]>([]);\n const [distanceKm, setDistanceKm] = useState<number>(0);\n const [status, setStatus] = useState<TrackerStatus>(\"idle\");\n\n const trackerRef = useRef<PositionTracker | null>(null);\n const onErrorRef = useLatestRef(onError);\n\n useEffect(() => {\n const tracker = createPositionTracker({\n ...trackerOptions,\n onUpdate: (next) => {\n setPoints([...next]);\n setDistanceKm(tracker.distanceKm);\n },\n onStatusChange: setStatus,\n onError: (error) => onErrorRef.current?.(error),\n });\n trackerRef.current = tracker;\n if (autoStart) tracker.start();\n\n return () => {\n tracker.stop();\n trackerRef.current = null;\n };\n // Tracker options are read once at creation; changing them mid-track\n // would drop the recorded trajectory, so they are intentionally omitted.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const start = useCallback((): void => trackerRef.current?.start(), []);\n const stop = useCallback((): void => trackerRef.current?.stop(), []);\n const clear = useCallback((): void => {\n trackerRef.current?.clear();\n setDistanceKm(0);\n }, []);\n\n return {\n points,\n lastPoint: points.length > 0 ? points[points.length - 1] : null,\n distanceKm,\n status,\n isTracking: status === \"tracking\",\n start,\n stop,\n clear,\n };\n}\n"],"mappings":"A,iHAsDA,SAAgBQ,EACZ,EAAqC,CAAC,EACd,CACxB,GAAM,CAAE,YAAY,GAAO,UAAS,GAAGC,GAAmBC,EAEpD,CAACC,EAAQC,IAAA,EAAaZ,EAAAA,SAAAA,CAAgC,CAAC,CAAC,EACxD,CAACa,EAAYC,IAAA,EAAiBd,EAAAA,SAAAA,CAAiB,CAAC,EAChD,CAACe,EAAQC,IAAA,EAAahB,EAAAA,SAAAA,CAAwB,MAAM,EAEpDiB,GAAA,EAAahB,EAAAA,OAAAA,CAA+B,IAAI,EAChDiB,EAAahB,EAAAA,aAAaiB,CAAO,GAEvC,EAAAZ,EAAA,UAAA,KAAgB,CACZ,IAAMa,EAAUjB,EAAAA,sBAAsB,CAClC,GAAGM,EACH,SAAW,GAAS,CAChBG,EAAU,CAAC,GAAGS,CAAI,CAAC,EACnBP,EAAcM,EAAQ,UAAU,CACpC,EACA,eAAgBJ,EAChB,QAAU,GAAUE,EAAW,UAAUI,CAAK,CAClD,CAAC,EAID,MAHA,GAAW,QAAUF,EACjBG,GAAWH,EAAQ,MAAM,MAEhB,CACTA,EAAQ,KAAK,EACb,EAAW,QAAU,IACzB,CAIJ,EAAG,CAAC,CAAC,EAEL,IAAMI,GAAA,EAAQpB,EAAAA,YAAAA,KAAwBa,EAAW,SAAS,MAAM,EAAG,CAAC,CAAC,EAC/DQ,GAAA,EAAOrB,EAAAA,YAAAA,KAAwBa,EAAW,SAAS,KAAK,EAAG,CAAC,CAAC,EAC7DS,GAAA,EAAQtB,EAAAA,YAAAA,KAAwB,CAClCa,EAAW,SAAS,MAAM,EAC1BH,EAAc,CAAC,CACnB,EAAG,CAAC,CAAC,EAEL,MAAO,CACH,SACA,UAAWH,EAAO,OAAS,EAAIA,EAAOA,EAAO,OAAS,GAAK,KAC3D,aACA,SACA,WAAYI,IAAW,WACvB,QACA,OACA,OACJ,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-position-tracker.js","names":[],"sources":["../../src/geo/use-position-tracker.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\nimport {\n createPositionTracker,\n type CreatePositionTrackerOptions,\n type PositionTracker,\n type TrackerStatus,\n} from \"./create-position-tracker\";\nimport type { TrackPoint } from \"./types\";\n\nexport interface UsePositionTrackerOptions extends Omit<\n CreatePositionTrackerOptions,\n \"onUpdate\" | \"onStatusChange\"\n> {\n /** Start tracking automatically on mount. Default: `false`. */\n autoStart?: boolean;\n}\n\nexport interface UsePositionTrackerResult {\n /** Recorded trajectory (newest last). */\n points: readonly TrackPoint[];\n /** Most recent point, or `null` before the first fix. */\n lastPoint: TrackPoint | null;\n /** Total distance of the trajectory in kilometers. */\n distanceKm: number;\n /** Current tracker status. */\n status: TrackerStatus;\n /** True while `status === \"tracking\"`. */\n isTracking: boolean;\n /** Begin watching position. */\n start: () => void;\n /** Stop watching, keeping the trajectory. */\n stop: () => void;\n /** Stop and discard the trajectory. */\n clear: () => void;\n}\n\n/**\n * React hook wrapping {@link createPositionTracker}. Records a live GPS\n * trajectory tied to the component lifecycle — the watch is torn down on\n * unmount. Fully browser-side; no external service.\n *\n * @example\n * const { points, distanceKm, isTracking, start, stop } = usePositionTracker({\n * minDistanceKm: 0.01,\n * });\n * return (\n * <>\n * <button onClick={isTracking ? stop : start}>{isTracking ? \"Parar\" : \"Rastrear\"}</button>\n * <TrajectoryMap points={points} />\n * <span>{distanceKm.toFixed(2)} km</span>\n * </>\n * );\n */\nexport function usePositionTracker(\n options: UsePositionTrackerOptions = {},\n): UsePositionTrackerResult {\n const { autoStart = false, onError, ...trackerOptions } = options;\n\n const [points, setPoints] = useState<readonly TrackPoint[]>([]);\n const [distanceKm, setDistanceKm] = useState<number>(0);\n const [status, setStatus] = useState<TrackerStatus>(\"idle\");\n\n const trackerRef = useRef<PositionTracker | null>(null);\n const onErrorRef = useLatestRef(onError);\n\n useEffect(() => {\n const tracker = createPositionTracker({\n ...trackerOptions,\n onUpdate: (next) => {\n setPoints([...next]);\n setDistanceKm(tracker.distanceKm);\n },\n onStatusChange: setStatus,\n onError: (error) => onErrorRef.current?.(error),\n });\n trackerRef.current = tracker;\n if (autoStart) tracker.start();\n\n return () => {\n tracker.stop();\n trackerRef.current = null;\n };\n // Tracker options are read once at creation; changing them mid-track\n // would drop the recorded trajectory, so they are intentionally omitted.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const start = useCallback((): void => trackerRef.current?.start(), []);\n const stop = useCallback((): void => trackerRef.current?.stop(), []);\n const clear = useCallback((): void => {\n trackerRef.current?.clear();\n setDistanceKm(0);\n }, []);\n\n return {\n points,\n lastPoint: points.length > 0 ? points[points.length - 1] : null,\n distanceKm,\n status,\n isTracking: status === \"tracking\",\n start,\n stop,\n clear,\n };\n}\n"],"mappings":";;;;AAsDA,SAAgB,EACZ,IAAqC,CAAC,GACd;CACxB,IAAM,EAAE,eAAY,IAAO,YAAS,GAAG,MAAmB,GAEpD,CAAC,GAAQ,KAAa,EAAgC,CAAC,CAAC,GACxD,CAAC,GAAY,KAAiB,EAAiB,CAAC,GAChD,CAAC,GAAQ,KAAa,EAAwB,MAAM,GAEpD,IAAa,EAA+B,IAAI,GAChD,IAAa,EAAa,CAAO;CAEvC,QAAgB;EACZ,IAAM,IAAU,EAAsB;GAClC,GAAG;GACH,WAAW,MAAS;IAEhB,AADA,EAAU,CAAC,GAAG,CAAI,CAAC,GACnB,EAAc,EAAQ,UAAU;GACpC;GACA,gBAAgB;GAChB,UAAU,MAAU,EAAW,UAAU,CAAK;EAClD,CAAC;EAID,OAHA,EAAW,UAAU,GACjB,KAAW,EAAQ,MAAM,SAEhB;GAET,AADA,EAAQ,KAAK,GACb,EAAW,UAAU;EACzB;CAIJ,GAAG,CAAC,CAAC;CAEL,IAAM,IAAQ,QAAwB,EAAW,SAAS,MAAM,GAAG,CAAC,CAAC,GAC/D,IAAO,QAAwB,EAAW,SAAS,KAAK,GAAG,CAAC,CAAC,GAC7D,IAAQ,QAAwB;EAElC,AADA,EAAW,SAAS,MAAM,GAC1B,EAAc,CAAC;CACnB,GAAG,CAAC,CAAC;CAEL,OAAO;EACH;EACA,WAAW,EAAO,SAAS,IAAI,EAAO,EAAO,SAAS,KAAK;EAC3D;EACA;EACA,YAAY,MAAW;EACvB;EACA;EACA;CACJ;AACJ"}
1
+ {"version":3,"file":"use-position-tracker.js","names":["usePositionTracker","trackerOptions","options","points","setPoints","useState","distanceKm","setDistanceKm","status","setStatus","trackerRef","useRef","onErrorRef","useLatestRef","onError","tracker","createPositionTracker","next","error","autoStart","start","useCallback","stop","clear"],"sources":["../../src/geo/use-position-tracker.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\nimport {\n createPositionTracker,\n type CreatePositionTrackerOptions,\n type PositionTracker,\n type TrackerStatus,\n} from \"./create-position-tracker\";\nimport type { TrackPoint } from \"./types\";\n\nexport interface UsePositionTrackerOptions extends Omit<\n CreatePositionTrackerOptions,\n \"onUpdate\" | \"onStatusChange\"\n> {\n /** Start tracking automatically on mount. Default: `false`. */\n autoStart?: boolean;\n}\n\nexport interface UsePositionTrackerResult {\n /** Recorded trajectory (newest last). */\n points: readonly TrackPoint[];\n /** Most recent point, or `null` before the first fix. */\n lastPoint: TrackPoint | null;\n /** Total distance of the trajectory in kilometers. */\n distanceKm: number;\n /** Current tracker status. */\n status: TrackerStatus;\n /** True while `status === \"tracking\"`. */\n isTracking: boolean;\n /** Begin watching position. */\n start: () => void;\n /** Stop watching, keeping the trajectory. */\n stop: () => void;\n /** Stop and discard the trajectory. */\n clear: () => void;\n}\n\n/**\n * React hook wrapping {@link createPositionTracker}. Records a live GPS\n * trajectory tied to the component lifecycle — the watch is torn down on\n * unmount. Fully browser-side; no external service.\n *\n * @example\n * const { points, distanceKm, isTracking, start, stop } = usePositionTracker({\n * minDistanceKm: 0.01,\n * });\n * return (\n * <>\n * <button onClick={isTracking ? stop : start}>{isTracking ? \"Parar\" : \"Rastrear\"}</button>\n * <TrajectoryMap points={points} />\n * <span>{distanceKm.toFixed(2)} km</span>\n * </>\n * );\n */\nexport function usePositionTracker(\n options: UsePositionTrackerOptions = {},\n): UsePositionTrackerResult {\n const { autoStart = false, onError, ...trackerOptions } = options;\n\n const [points, setPoints] = useState<readonly TrackPoint[]>([]);\n const [distanceKm, setDistanceKm] = useState<number>(0);\n const [status, setStatus] = useState<TrackerStatus>(\"idle\");\n\n const trackerRef = useRef<PositionTracker | null>(null);\n const onErrorRef = useLatestRef(onError);\n\n useEffect(() => {\n const tracker = createPositionTracker({\n ...trackerOptions,\n onUpdate: (next) => {\n setPoints([...next]);\n setDistanceKm(tracker.distanceKm);\n },\n onStatusChange: setStatus,\n onError: (error) => onErrorRef.current?.(error),\n });\n trackerRef.current = tracker;\n if (autoStart) tracker.start();\n\n return () => {\n tracker.stop();\n trackerRef.current = null;\n };\n // Tracker options are read once at creation; changing them mid-track\n // would drop the recorded trajectory, so they are intentionally omitted.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const start = useCallback((): void => trackerRef.current?.start(), []);\n const stop = useCallback((): void => trackerRef.current?.stop(), []);\n const clear = useCallback((): void => {\n trackerRef.current?.clear();\n setDistanceKm(0);\n }, []);\n\n return {\n points,\n lastPoint: points.length > 0 ? points[points.length - 1] : null,\n distanceKm,\n status,\n isTracking: status === \"tracking\",\n start,\n stop,\n clear,\n };\n}\n"],"mappings":";;;;AAsDA,SAAgBA,EACZ,IAAqC,CAAC,GACd;CACxB,IAAM,EAAE,eAAY,IAAO,YAAS,GAAGC,MAAmBC,GAEpD,CAACC,GAAQC,KAAaC,EAAgC,CAAC,CAAC,GACxD,CAACC,GAAYC,KAAiBF,EAAiB,CAAC,GAChD,CAACG,GAAQC,KAAaJ,EAAwB,MAAM,GAEpDK,IAAaC,EAA+B,IAAI,GAChDC,IAAaC,EAAaC,CAAO;CAEvC,QAAgB;EACZ,IAAMC,IAAUC,EAAsB;GAClC,GAAGf;GACH,WAAW,MAAS;IAEhB,AADAG,EAAU,CAAC,GAAGa,CAAI,CAAC,GACnBV,EAAcQ,EAAQ,UAAU;GACpC;GACA,gBAAgBN;GAChB,UAAU,MAAUG,EAAW,UAAUM,CAAK;EAClD,CAAC;EAID,OAHA,EAAW,UAAUH,GACjBI,KAAWJ,EAAQ,MAAM,SAEhB;GAET,AADAA,EAAQ,KAAK,GACb,EAAW,UAAU;EACzB;CAIJ,GAAG,CAAC,CAAC;CAEL,IAAMK,IAAQC,QAAwBX,EAAW,SAAS,MAAM,GAAG,CAAC,CAAC,GAC/DY,IAAOD,QAAwBX,EAAW,SAAS,KAAK,GAAG,CAAC,CAAC,GAC7Da,IAAQF,QAAwB;EAElC,AADAX,EAAW,SAAS,MAAM,GAC1BH,EAAc,CAAC;CACnB,GAAG,CAAC,CAAC;CAEL,OAAO;EACH;EACA,WAAWJ,EAAO,SAAS,IAAIA,EAAOA,EAAO,SAAS,KAAK;EAC3D;EACA;EACA,YAAYK,MAAW;EACvB;EACA;EACA;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"pwa-env.cjs","names":[],"sources":["../../src/hooks/pwa-env.ts"],"sourcesContent":["/**\n * The Chromium-only `beforeinstallprompt` event. iOS Safari never fires it —\n * for those users the app falls back to manual \"Add to Home Screen\"\n * instructions. Ported into the SDK so consumers get the type without a global\n * augmentation.\n */\nexport interface BeforeInstallPromptEvent extends Event {\n /** Platforms the prompt can target (e.g. `[\"web\", \"android\"]`). */\n readonly platforms: readonly string[];\n /** Resolves once the user accepts or dismisses the prompt. */\n readonly userChoice: Promise<{\n outcome: \"accepted\" | \"dismissed\";\n platform: string;\n }>;\n /** Shows the native install prompt. */\n prompt: () => Promise<void>;\n}\n\n/**\n * Detects iOS / iPadOS Safari, including modern iPads that report `MacIntel`\n * plus multi-touch instead of an `iPad` user agent.\n *\n * @returns `true` when running on iOS/iPadOS.\n */\nexport function isIOS(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (/iPad|iPhone|iPod/.test(ua)) return true;\n return ua.includes(\"Mac\") && navigator.maxTouchPoints > 1;\n}\n\n/**\n * Detects Android browsers that ship a Chromium fork with the\n * `beforeinstallprompt` event stripped or unreliable. Those users must install\n * via the browser menu manually, identical to iOS Safari.\n *\n * @returns `true` when running on such an Android browser.\n */\nexport function isAndroidWithoutPromptApi(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (!/Android/i.test(ua)) return false;\n return /MiuiBrowser|XiaoMi|UCBrowser|Opera Mini|KAIOS|HuaweiBrowser/i.test(ua);\n}\n\n/**\n * Detects any Android browser.\n *\n * @returns `true` when the user agent reports Android.\n */\nexport function isAndroid(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Android/i.test(navigator.userAgent);\n}\n\n/**\n * Builds an `intent://` URL that re-opens the current page inside Chrome on\n * Android. When Chrome is missing, the fallback URL points to the Play Store so\n * the user can still recover. Returns `null` outside Android.\n *\n * @returns The `intent://` URL, or `null` when not on Android or without a DOM.\n * @see https://developer.chrome.com/docs/multidevice/android/intents\n */\nexport function buildOpenInChromeIntent(): string | null {\n if (typeof window === \"undefined\") return null;\n if (!isAndroid()) return null;\n const host = window.location.host;\n const path = window.location.pathname + window.location.search;\n const fallback = encodeURIComponent(\n \"https://play.google.com/store/apps/details?id=com.android.chrome\",\n );\n return `intent://${host}${path}#Intent;scheme=https;package=com.android.chrome;S.browser_fallback_url=${fallback};end`;\n}\n\n/**\n * Reports whether the app is running as an installed PWA (Android Chrome, iOS,\n * or desktop). Use it to suppress install CTAs once the user is already in the\n * standalone shell.\n *\n * @returns `true` when the display mode is standalone or iOS reports standalone.\n */\nexport function isStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n if (window.matchMedia?.(\"(display-mode: standalone)\")?.matches) return true;\n return (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n}\n"],"mappings":"AAwBA,SAAgB,GAAiB,CAC7B,GAAI,OAAO,UAAc,IAAa,MAAO,GAC7C,IAAM,EAAK,UAAU,UAErB,MADI,mBAAmB,KAAK,CAAE,EAAU,GACjC,EAAG,SAAS,KAAK,GAAK,UAAU,eAAiB,CAC5D,CASA,SAAgB,GAAqC,CACjD,GAAI,OAAO,UAAc,IAAa,MAAO,GAC7C,IAAM,EAAK,UAAU,UAErB,MADK,WAAW,KAAK,CAAE,EAChB,+DAA+D,KAAK,CAAE,EAD5C,EAErC,CAOA,SAAgB,GAAqB,CAEjC,OADI,OAAO,UAAc,IAAoB,GACtC,WAAW,KAAK,UAAU,SAAS,CAC9C,CAUA,SAAgB,GAAyC,CAQrD,OAPI,OAAO,OAAW,KAClB,CAAC,EAAU,EAAU,KAMlB,YALM,OAAO,SAAS,OAChB,OAAO,SAAS,SAAW,OAAO,SAAS,OAIzB,4JACnC,CASA,SAAgB,GAAwB,CAGpC,OAFI,OAAO,OAAW,IAAoB,GACtC,OAAO,aAAa,4BAA4B,CAAC,EAAE,QAAgB,GAC/D,OAAO,UAAmD,aAAe,EACrF"}
1
+ {"version":3,"file":"pwa-env.cjs","names":["isIOS","ua","isAndroidWithoutPromptApi","isAndroid","buildOpenInChromeIntent","isStandalone"],"sources":["../../src/hooks/pwa-env.ts"],"sourcesContent":["/**\n * The Chromium-only `beforeinstallprompt` event. iOS Safari never fires it —\n * for those users the app falls back to manual \"Add to Home Screen\"\n * instructions. Ported into the SDK so consumers get the type without a global\n * augmentation.\n */\nexport interface BeforeInstallPromptEvent extends Event {\n /** Platforms the prompt can target (e.g. `[\"web\", \"android\"]`). */\n readonly platforms: readonly string[];\n /** Resolves once the user accepts or dismisses the prompt. */\n readonly userChoice: Promise<{\n outcome: \"accepted\" | \"dismissed\";\n platform: string;\n }>;\n /** Shows the native install prompt. */\n prompt: () => Promise<void>;\n}\n\n/**\n * Detects iOS / iPadOS Safari, including modern iPads that report `MacIntel`\n * plus multi-touch instead of an `iPad` user agent.\n *\n * @returns `true` when running on iOS/iPadOS.\n */\nexport function isIOS(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (/iPad|iPhone|iPod/.test(ua)) return true;\n return ua.includes(\"Mac\") && navigator.maxTouchPoints > 1;\n}\n\n/**\n * Detects Android browsers that ship a Chromium fork with the\n * `beforeinstallprompt` event stripped or unreliable. Those users must install\n * via the browser menu manually, identical to iOS Safari.\n *\n * @returns `true` when running on such an Android browser.\n */\nexport function isAndroidWithoutPromptApi(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (!/Android/i.test(ua)) return false;\n return /MiuiBrowser|XiaoMi|UCBrowser|Opera Mini|KAIOS|HuaweiBrowser/i.test(ua);\n}\n\n/**\n * Detects any Android browser.\n *\n * @returns `true` when the user agent reports Android.\n */\nexport function isAndroid(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Android/i.test(navigator.userAgent);\n}\n\n/**\n * Builds an `intent://` URL that re-opens the current page inside Chrome on\n * Android. When Chrome is missing, the fallback URL points to the Play Store so\n * the user can still recover. Returns `null` outside Android.\n *\n * @returns The `intent://` URL, or `null` when not on Android or without a DOM.\n * @see https://developer.chrome.com/docs/multidevice/android/intents\n */\nexport function buildOpenInChromeIntent(): string | null {\n if (typeof window === \"undefined\") return null;\n if (!isAndroid()) return null;\n const host = window.location.host;\n const path = window.location.pathname + window.location.search;\n const fallback = encodeURIComponent(\n \"https://play.google.com/store/apps/details?id=com.android.chrome\",\n );\n return `intent://${host}${path}#Intent;scheme=https;package=com.android.chrome;S.browser_fallback_url=${fallback};end`;\n}\n\n/**\n * Reports whether the app is running as an installed PWA (Android Chrome, iOS,\n * or desktop). Use it to suppress install CTAs once the user is already in the\n * standalone shell.\n *\n * @returns `true` when the display mode is standalone or iOS reports standalone.\n */\nexport function isStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n if (window.matchMedia?.(\"(display-mode: standalone)\")?.matches) return true;\n return (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n}\n"],"mappings":"AAwBA,SAAgBA,GAAiB,CAC7B,GAAI,OAAO,UAAc,IAAa,MAAO,GAC7C,IAAMC,EAAK,UAAU,UAErB,MADI,mBAAmB,KAAKA,CAAE,EAAU,GACjCA,EAAG,SAAS,KAAK,GAAK,UAAU,eAAiB,CAC5D,CASA,SAAgBC,GAAqC,CACjD,GAAI,OAAO,UAAc,IAAa,MAAO,GAC7C,IAAMD,EAAK,UAAU,UAErB,MADK,WAAW,KAAKA,CAAE,EAChB,+DAA+D,KAAKA,CAAE,EAD5C,EAErC,CAOA,SAAgBE,GAAqB,CAEjC,OADI,OAAO,UAAc,IAAoB,GACtC,WAAW,KAAK,UAAU,SAAS,CAC9C,CAUA,SAAgBC,GAAyC,CAQrD,OAPI,OAAO,OAAW,KAClB,CAACD,EAAU,EAAU,KAMlB,YALM,OAAO,SAAS,OAChB,OAAO,SAAS,SAAW,OAAO,SAAS,OAIzB,4JACnC,CASA,SAAgBE,GAAwB,CAGpC,OAFI,OAAO,OAAW,IAAoB,GACtC,OAAO,aAAa,4BAA4B,CAAC,EAAE,QAAgB,GAC/D,OAAO,UAAmD,aAAe,EACrF,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"pwa-env.js","names":[],"sources":["../../src/hooks/pwa-env.ts"],"sourcesContent":["/**\n * The Chromium-only `beforeinstallprompt` event. iOS Safari never fires it —\n * for those users the app falls back to manual \"Add to Home Screen\"\n * instructions. Ported into the SDK so consumers get the type without a global\n * augmentation.\n */\nexport interface BeforeInstallPromptEvent extends Event {\n /** Platforms the prompt can target (e.g. `[\"web\", \"android\"]`). */\n readonly platforms: readonly string[];\n /** Resolves once the user accepts or dismisses the prompt. */\n readonly userChoice: Promise<{\n outcome: \"accepted\" | \"dismissed\";\n platform: string;\n }>;\n /** Shows the native install prompt. */\n prompt: () => Promise<void>;\n}\n\n/**\n * Detects iOS / iPadOS Safari, including modern iPads that report `MacIntel`\n * plus multi-touch instead of an `iPad` user agent.\n *\n * @returns `true` when running on iOS/iPadOS.\n */\nexport function isIOS(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (/iPad|iPhone|iPod/.test(ua)) return true;\n return ua.includes(\"Mac\") && navigator.maxTouchPoints > 1;\n}\n\n/**\n * Detects Android browsers that ship a Chromium fork with the\n * `beforeinstallprompt` event stripped or unreliable. Those users must install\n * via the browser menu manually, identical to iOS Safari.\n *\n * @returns `true` when running on such an Android browser.\n */\nexport function isAndroidWithoutPromptApi(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (!/Android/i.test(ua)) return false;\n return /MiuiBrowser|XiaoMi|UCBrowser|Opera Mini|KAIOS|HuaweiBrowser/i.test(ua);\n}\n\n/**\n * Detects any Android browser.\n *\n * @returns `true` when the user agent reports Android.\n */\nexport function isAndroid(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Android/i.test(navigator.userAgent);\n}\n\n/**\n * Builds an `intent://` URL that re-opens the current page inside Chrome on\n * Android. When Chrome is missing, the fallback URL points to the Play Store so\n * the user can still recover. Returns `null` outside Android.\n *\n * @returns The `intent://` URL, or `null` when not on Android or without a DOM.\n * @see https://developer.chrome.com/docs/multidevice/android/intents\n */\nexport function buildOpenInChromeIntent(): string | null {\n if (typeof window === \"undefined\") return null;\n if (!isAndroid()) return null;\n const host = window.location.host;\n const path = window.location.pathname + window.location.search;\n const fallback = encodeURIComponent(\n \"https://play.google.com/store/apps/details?id=com.android.chrome\",\n );\n return `intent://${host}${path}#Intent;scheme=https;package=com.android.chrome;S.browser_fallback_url=${fallback};end`;\n}\n\n/**\n * Reports whether the app is running as an installed PWA (Android Chrome, iOS,\n * or desktop). Use it to suppress install CTAs once the user is already in the\n * standalone shell.\n *\n * @returns `true` when the display mode is standalone or iOS reports standalone.\n */\nexport function isStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n if (window.matchMedia?.(\"(display-mode: standalone)\")?.matches) return true;\n return (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n}\n"],"mappings":";AAwBA,SAAgB,IAAiB;CAC7B,IAAI,OAAO,YAAc,KAAa,OAAO;CAC7C,IAAM,IAAK,UAAU;CAErB,OADI,mBAAmB,KAAK,CAAE,IAAU,KACjC,EAAG,SAAS,KAAK,KAAK,UAAU,iBAAiB;AAC5D;AASA,SAAgB,IAAqC;CACjD,IAAI,OAAO,YAAc,KAAa,OAAO;CAC7C,IAAM,IAAK,UAAU;CAErB,OADK,WAAW,KAAK,CAAE,IAChB,+DAA+D,KAAK,CAAE,IAD5C;AAErC;AAOA,SAAgB,IAAqB;CAEjC,OADI,OAAO,YAAc,MAAoB,KACtC,WAAW,KAAK,UAAU,SAAS;AAC9C;AAUA,SAAgB,IAAyC;CAQrD,OAPI,OAAO,SAAW,OAClB,CAAC,EAAU,IAAU,OAMlB,YALM,OAAO,SAAS,OAChB,OAAO,SAAS,WAAW,OAAO,SAAS,OAIzB;AACnC;AASA,SAAgB,IAAwB;CAGpC,OAFI,OAAO,SAAW,MAAoB,KACtC,OAAO,aAAa,4BAA4B,CAAC,EAAE,UAAgB,KAC/D,OAAO,UAAmD,eAAe;AACrF"}
1
+ {"version":3,"file":"pwa-env.js","names":["isIOS","ua","isAndroidWithoutPromptApi","isAndroid","buildOpenInChromeIntent","isStandalone"],"sources":["../../src/hooks/pwa-env.ts"],"sourcesContent":["/**\n * The Chromium-only `beforeinstallprompt` event. iOS Safari never fires it —\n * for those users the app falls back to manual \"Add to Home Screen\"\n * instructions. Ported into the SDK so consumers get the type without a global\n * augmentation.\n */\nexport interface BeforeInstallPromptEvent extends Event {\n /** Platforms the prompt can target (e.g. `[\"web\", \"android\"]`). */\n readonly platforms: readonly string[];\n /** Resolves once the user accepts or dismisses the prompt. */\n readonly userChoice: Promise<{\n outcome: \"accepted\" | \"dismissed\";\n platform: string;\n }>;\n /** Shows the native install prompt. */\n prompt: () => Promise<void>;\n}\n\n/**\n * Detects iOS / iPadOS Safari, including modern iPads that report `MacIntel`\n * plus multi-touch instead of an `iPad` user agent.\n *\n * @returns `true` when running on iOS/iPadOS.\n */\nexport function isIOS(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (/iPad|iPhone|iPod/.test(ua)) return true;\n return ua.includes(\"Mac\") && navigator.maxTouchPoints > 1;\n}\n\n/**\n * Detects Android browsers that ship a Chromium fork with the\n * `beforeinstallprompt` event stripped or unreliable. Those users must install\n * via the browser menu manually, identical to iOS Safari.\n *\n * @returns `true` when running on such an Android browser.\n */\nexport function isAndroidWithoutPromptApi(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent;\n if (!/Android/i.test(ua)) return false;\n return /MiuiBrowser|XiaoMi|UCBrowser|Opera Mini|KAIOS|HuaweiBrowser/i.test(ua);\n}\n\n/**\n * Detects any Android browser.\n *\n * @returns `true` when the user agent reports Android.\n */\nexport function isAndroid(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Android/i.test(navigator.userAgent);\n}\n\n/**\n * Builds an `intent://` URL that re-opens the current page inside Chrome on\n * Android. When Chrome is missing, the fallback URL points to the Play Store so\n * the user can still recover. Returns `null` outside Android.\n *\n * @returns The `intent://` URL, or `null` when not on Android or without a DOM.\n * @see https://developer.chrome.com/docs/multidevice/android/intents\n */\nexport function buildOpenInChromeIntent(): string | null {\n if (typeof window === \"undefined\") return null;\n if (!isAndroid()) return null;\n const host = window.location.host;\n const path = window.location.pathname + window.location.search;\n const fallback = encodeURIComponent(\n \"https://play.google.com/store/apps/details?id=com.android.chrome\",\n );\n return `intent://${host}${path}#Intent;scheme=https;package=com.android.chrome;S.browser_fallback_url=${fallback};end`;\n}\n\n/**\n * Reports whether the app is running as an installed PWA (Android Chrome, iOS,\n * or desktop). Use it to suppress install CTAs once the user is already in the\n * standalone shell.\n *\n * @returns `true` when the display mode is standalone or iOS reports standalone.\n */\nexport function isStandalone(): boolean {\n if (typeof window === \"undefined\") return false;\n if (window.matchMedia?.(\"(display-mode: standalone)\")?.matches) return true;\n return (window.navigator as Navigator & { standalone?: boolean }).standalone === true;\n}\n"],"mappings":";AAwBA,SAAgBA,IAAiB;CAC7B,IAAI,OAAO,YAAc,KAAa,OAAO;CAC7C,IAAMC,IAAK,UAAU;CAErB,OADI,mBAAmB,KAAKA,CAAE,IAAU,KACjCA,EAAG,SAAS,KAAK,KAAK,UAAU,iBAAiB;AAC5D;AASA,SAAgBC,IAAqC;CACjD,IAAI,OAAO,YAAc,KAAa,OAAO;CAC7C,IAAMD,IAAK,UAAU;CAErB,OADK,WAAW,KAAKA,CAAE,IAChB,+DAA+D,KAAKA,CAAE,IAD5C;AAErC;AAOA,SAAgBE,IAAqB;CAEjC,OADI,OAAO,YAAc,MAAoB,KACtC,WAAW,KAAK,UAAU,SAAS;AAC9C;AAUA,SAAgBC,IAAyC;CAQrD,OAPI,OAAO,SAAW,OAClB,CAACD,EAAU,IAAU,OAMlB,YALM,OAAO,SAAS,OAChB,OAAO,SAAS,WAAW,OAAO,SAAS,OAIzB;AACnC;AASA,SAAgBE,IAAwB;CAGpC,OAFI,OAAO,SAAW,MAAoB,KACtC,OAAO,aAAa,4BAA4B,CAAC,EAAE,UAAgB,KAC/D,OAAO,UAAmD,eAAe;AACrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"tab-sequence.cjs","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,EAAqB,CAC9B,UACA,yBACA,2BACA,wBACA,yBACA,iCACJ,CAAC,CAAC,KAAK,GAAG,EAUJ,EAAS,IAAI,IAanB,SAAgB,EAAoB,EAAgC,CAEhE,OADA,EAAO,IAAI,CAAK,MACH,CACT,EAAO,OAAO,CAAK,CACvB,CACJ,CASA,SAAgB,EAAU,EAAiC,CACvD,OAAO,MAAM,KAAK,EAAK,iBAA8B,CAAkB,CAAC,CAAC,CAAC,OAAQ,GAAO,CACrF,GAAI,EAAG,SAAW,GAAK,EAAG,aAAa,aAAa,EAAG,MAAO,GAC9D,IAAM,EAAQ,OAAO,iBAAiB,CAAE,EACxC,OAAO,EAAM,UAAY,QAAU,EAAM,aAAe,QAC5D,CAAC,CACL,CAUA,SAAS,EACL,EACA,EAC6C,CAC7C,IAAM,EAAQ,EAAQ,OACjB,GAAU,EAAK,SAAS,EAAM,MAAM,GAAK,CAAC,EAAK,SAAS,EAAM,KAAK,CACxE,EACA,MAAO,CAAE,QAAO,KAAM,EAAQ,OAAQ,GAAU,CAAC,EAAM,SAAS,CAAK,CAAC,CAAE,CAC5E,CASA,SAAgB,EAAU,EAAkC,CACxD,IAAM,EAAwB,CAAC,CAAI,EAC/B,EAAU,CAAC,GAAG,CAAM,EACxB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,OAAQ,GAAS,EAAG,CACnD,GAAM,CAAE,QAAO,QAAS,EAAQ,EAAO,GAAS,CAAO,EACvD,EAAO,KAAK,GAAG,EAAM,IAAK,GAAU,EAAM,KAAK,CAAC,EAChD,EAAU,CACd,CACA,OAAO,CACX,CAYA,SAAgB,EACZ,EACA,EAAyB,CAAC,GAAG,CAAM,EACtB,CACb,IAAM,EAAS,EAAU,CAAI,EACvB,CAAE,QAAO,QAAS,EAAQ,EAAM,CAAO,EACvC,EAAW,IAAI,IACrB,IAAK,IAAM,KAAS,EAAO,CACvB,IAAI,EAAK,GACT,EAAO,SAAS,EAAI,IAAU,GAErB,EAAG,wBAAwB,EAAM,MAAM,EAAI,KAAK,+BAAiC,GACtE,EAAM,OAAO,SAAS,CAAE,KAAG,EAAK,EACpD,CAAC,EACD,EAAS,IAAI,EAAI,CAAC,GAAI,EAAS,IAAI,CAAE,GAAK,CAAC,EAAI,GAAG,EAAY,EAAM,MAAO,CAAI,CAAC,CAAC,CACrF,CACA,IAAM,EAA0B,CAAC,GAAI,EAAS,IAAI,EAAE,GAAK,CAAC,CAAE,EAI5D,OAHA,EAAO,SAAS,EAAI,IAAU,CAC1B,EAAS,KAAK,EAAI,GAAI,EAAS,IAAI,CAAK,GAAK,CAAC,CAAE,CACpD,CAAC,EACM,CACX"}
1
+ {"version":3,"file":"tab-sequence.cjs","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,EAAqB,CAC9B,UACA,yBACA,2BACA,wBACA,yBACA,iCACJ,CAAC,CAAC,KAAK,GAAG,EAUJC,EAAS,IAAI,IAanB,SAAgBC,EAAoB,EAAgC,CAEhE,OADAD,EAAO,IAAIE,CAAK,MACH,CACTF,EAAO,OAAOE,CAAK,CACvB,CACJ,CASA,SAAgBC,EAAU,EAAiC,CACvD,OAAO,MAAM,KAAKC,EAAK,iBAA8BL,CAAkB,CAAC,CAAC,CAAC,OAAQ,GAAO,CACrF,GAAIM,EAAG,SAAW,GAAKA,EAAG,aAAa,aAAa,EAAG,MAAO,GAC9D,IAAMC,EAAQ,OAAO,iBAAiBD,CAAE,EACxC,OAAOC,EAAM,UAAY,QAAUA,EAAM,aAAe,QAC5D,CAAC,CACL,CAUA,SAASC,EACL,EACA,EAC6C,CAC7C,IAAMC,EAAQC,EAAQ,OACjB,GAAUL,EAAK,SAASF,EAAM,MAAM,GAAK,CAACE,EAAK,SAASF,EAAM,KAAK,CACxE,EACA,MAAO,CAAE,QAAO,KAAMO,EAAQ,OAAQ,GAAU,CAACD,EAAM,SAASN,CAAK,CAAC,CAAE,CAC5E,CASA,SAAgBQ,EAAU,EAAkC,CACxD,IAAMC,EAAwB,CAACP,CAAI,EAC/BK,EAAU,CAAC,GAAGT,CAAM,EACxB,IAAK,IAAIY,EAAQ,EAAGA,EAAQD,EAAO,OAAQ,GAAS,EAAG,CACnD,GAAM,CAAE,QAAO,QAASJ,EAAQI,EAAOC,GAASH,CAAO,EACvDE,EAAO,KAAK,GAAGH,EAAM,IAAK,GAAUN,EAAM,KAAK,CAAC,EAChD,EAAUW,CACd,CACA,OAAOF,CACX,CAYA,SAAgBG,EACZ,EACA,EAAyB,CAAC,GAAGd,CAAM,EACtB,CACb,IAAMe,EAASZ,EAAUC,CAAI,EACvB,CAAE,QAAO,QAASG,EAAQH,EAAMK,CAAO,EACvCO,EAAW,IAAI,IACrB,IAAK,IAAMd,KAASM,EAAO,CACvB,IAAIS,EAAK,GACTF,EAAO,SAAS,EAAI,IAAU,GAErBV,EAAG,wBAAwBH,EAAM,MAAM,EAAI,KAAK,+BAAiC,GACtEA,EAAM,OAAO,SAASG,CAAE,KAAG,EAAKO,EACpD,CAAC,EACDI,EAAS,IAAIC,EAAI,CAAC,GAAID,EAAS,IAAIC,CAAE,GAAK,CAAC,EAAI,GAAGH,EAAYZ,EAAM,MAAOW,CAAI,CAAC,CAAC,CACrF,CACA,IAAMK,EAA0B,CAAC,GAAIF,EAAS,IAAI,EAAE,GAAK,CAAC,CAAE,EAI5D,OAHAD,EAAO,SAAS,EAAI,IAAU,CAC1BG,EAAS,KAAKb,EAAI,GAAIW,EAAS,IAAIJ,CAAK,GAAK,CAAC,CAAE,CACpD,CAAC,EACMM,CACX,C"}
@@ -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"}