tempest-react-sdk 0.53.0 → 0.55.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 (475) hide show
  1. package/README.md +27 -6
  2. package/dist/access/Can.cjs +1 -1
  3. package/dist/access/Can.cjs.map +1 -1
  4. package/dist/access/Can.js +3 -3
  5. package/dist/access/Can.js.map +1 -1
  6. package/dist/audio/level-meter.cjs +1 -1
  7. package/dist/audio/level-meter.cjs.map +1 -1
  8. package/dist/audio/level-meter.js +15 -15
  9. package/dist/audio/level-meter.js.map +1 -1
  10. package/dist/audio/noise-floor.cjs +2 -0
  11. package/dist/audio/noise-floor.cjs.map +1 -0
  12. package/dist/audio/noise-floor.js +27 -0
  13. package/dist/audio/noise-floor.js.map +1 -0
  14. package/dist/audio/voice-activity.cjs +2 -0
  15. package/dist/audio/voice-activity.cjs.map +1 -0
  16. package/dist/audio/voice-activity.js +26 -0
  17. package/dist/audio/voice-activity.js.map +1 -0
  18. package/dist/audio/voice-chain-stages.cjs +2 -0
  19. package/dist/audio/voice-chain-stages.cjs.map +1 -0
  20. package/dist/audio/voice-chain-stages.js +82 -0
  21. package/dist/audio/voice-chain-stages.js.map +1 -0
  22. package/dist/audio/voice-chain.cjs +2 -0
  23. package/dist/audio/voice-chain.cjs.map +1 -0
  24. package/dist/audio/voice-chain.js +74 -0
  25. package/dist/audio/voice-chain.js.map +1 -0
  26. package/dist/auth/lazy-with-retry.cjs.map +1 -1
  27. package/dist/auth/lazy-with-retry.js.map +1 -1
  28. package/dist/auth/passkey.cjs.map +1 -1
  29. package/dist/auth/passkey.js.map +1 -1
  30. package/dist/br/BrazilStateCitySelect.cjs +1 -1
  31. package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
  32. package/dist/br/BrazilStateCitySelect.js +36 -28
  33. package/dist/br/BrazilStateCitySelect.js.map +1 -1
  34. package/dist/br/data/br-centroids.cjs +1 -1
  35. package/dist/br/data/br-centroids.cjs.map +1 -1
  36. package/dist/br/data/br-centroids.js +11105 -11045
  37. package/dist/br/data/br-centroids.js.map +1 -1
  38. package/dist/br/data/br-locations.cjs +1 -1
  39. package/dist/br/data/br-locations.cjs.map +1 -1
  40. package/dist/br/data/br-locations.js +5803 -137
  41. package/dist/br/data/br-locations.js.map +1 -1
  42. package/dist/br/data/br-uf-geo.cjs +1 -1
  43. package/dist/br/data/br-uf-geo.cjs.map +1 -1
  44. package/dist/br/data/br-uf-geo.js +5721 -6777
  45. package/dist/br/data/br-uf-geo.js.map +1 -1
  46. package/dist/br/data/mun/AC.cjs +1 -1
  47. package/dist/br/data/mun/AC.cjs.map +1 -1
  48. package/dist/br/data/mun/AC.js +681 -689
  49. package/dist/br/data/mun/AC.js.map +1 -1
  50. package/dist/br/data/mun/AL.cjs +1 -1
  51. package/dist/br/data/mun/AL.cjs.map +1 -1
  52. package/dist/br/data/mun/AL.js +949 -844
  53. package/dist/br/data/mun/AL.js.map +1 -1
  54. package/dist/br/data/mun/AM.cjs +1 -1
  55. package/dist/br/data/mun/AM.cjs.map +1 -1
  56. package/dist/br/data/mun/AM.js +4337 -4218
  57. package/dist/br/data/mun/AM.js.map +1 -1
  58. package/dist/br/data/mun/AP.cjs +1 -1
  59. package/dist/br/data/mun/AP.cjs.map +1 -1
  60. package/dist/br/data/mun/AP.js +786 -780
  61. package/dist/br/data/mun/AP.js.map +1 -1
  62. package/dist/br/data/mun/BA.cjs +1 -1
  63. package/dist/br/data/mun/BA.cjs.map +1 -1
  64. package/dist/br/data/mun/BA.js +6329 -5633
  65. package/dist/br/data/mun/BA.js.map +1 -1
  66. package/dist/br/data/mun/CE.cjs +1 -1
  67. package/dist/br/data/mun/CE.cjs.map +1 -1
  68. package/dist/br/data/mun/CE.js +2544 -2487
  69. package/dist/br/data/mun/CE.js.map +1 -1
  70. package/dist/br/data/mun/DF.cjs +1 -1
  71. package/dist/br/data/mun/DF.cjs.map +1 -1
  72. package/dist/br/data/mun/DF.js +17 -16
  73. package/dist/br/data/mun/DF.js.map +1 -1
  74. package/dist/br/data/mun/ES.cjs +1 -1
  75. package/dist/br/data/mun/ES.cjs.map +1 -1
  76. package/dist/br/data/mun/ES.js +1101 -1070
  77. package/dist/br/data/mun/ES.js.map +1 -1
  78. package/dist/br/data/mun/GO.cjs +1 -1
  79. package/dist/br/data/mun/GO.cjs.map +1 -1
  80. package/dist/br/data/mun/GO.js +4632 -4636
  81. package/dist/br/data/mun/GO.js.map +1 -1
  82. package/dist/br/data/mun/MA.cjs +1 -1
  83. package/dist/br/data/mun/MA.cjs.map +1 -1
  84. package/dist/br/data/mun/MA.js +3603 -3457
  85. package/dist/br/data/mun/MA.js.map +1 -1
  86. package/dist/br/data/mun/MG.cjs +1 -1
  87. package/dist/br/data/mun/MG.cjs.map +1 -1
  88. package/dist/br/data/mun/MG.js +12716 -11739
  89. package/dist/br/data/mun/MG.js.map +1 -1
  90. package/dist/br/data/mun/MS.cjs +1 -1
  91. package/dist/br/data/mun/MS.cjs.map +1 -1
  92. package/dist/br/data/mun/MS.js +2182 -2335
  93. package/dist/br/data/mun/MS.js.map +1 -1
  94. package/dist/br/data/mun/MT.cjs +1 -1
  95. package/dist/br/data/mun/MT.cjs.map +1 -1
  96. package/dist/br/data/mun/MT.js +4808 -4896
  97. package/dist/br/data/mun/MT.js.map +1 -1
  98. package/dist/br/data/mun/PA.cjs +1 -1
  99. package/dist/br/data/mun/PA.cjs.map +1 -1
  100. package/dist/br/data/mun/PA.js +4981 -4901
  101. package/dist/br/data/mun/PA.js.map +1 -1
  102. package/dist/br/data/mun/PB.cjs +1 -1
  103. package/dist/br/data/mun/PB.cjs.map +1 -1
  104. package/dist/br/data/mun/PB.js +2418 -1956
  105. package/dist/br/data/mun/PB.js.map +1 -1
  106. package/dist/br/data/mun/PE.cjs +1 -1
  107. package/dist/br/data/mun/PE.cjs.map +1 -1
  108. package/dist/br/data/mun/PE.js +2164 -1987
  109. package/dist/br/data/mun/PE.js.map +1 -1
  110. package/dist/br/data/mun/PI.cjs +1 -1
  111. package/dist/br/data/mun/PI.cjs.map +1 -1
  112. package/dist/br/data/mun/PI.js +2982 -2844
  113. package/dist/br/data/mun/PI.js.map +1 -1
  114. package/dist/br/data/mun/PR.cjs +1 -1
  115. package/dist/br/data/mun/PR.cjs.map +1 -1
  116. package/dist/br/data/mun/PR.js +5425 -5240
  117. package/dist/br/data/mun/PR.js.map +1 -1
  118. package/dist/br/data/mun/RJ.cjs +1 -1
  119. package/dist/br/data/mun/RJ.cjs.map +1 -1
  120. package/dist/br/data/mun/RJ.js +1395 -1178
  121. package/dist/br/data/mun/RJ.js.map +1 -1
  122. package/dist/br/data/mun/RN.cjs +1 -1
  123. package/dist/br/data/mun/RN.cjs.map +1 -1
  124. package/dist/br/data/mun/RN.js +1608 -1382
  125. package/dist/br/data/mun/RN.js.map +1 -1
  126. package/dist/br/data/mun/RO.cjs +1 -1
  127. package/dist/br/data/mun/RO.cjs.map +1 -1
  128. package/dist/br/data/mun/RO.js +1392 -1470
  129. package/dist/br/data/mun/RO.js.map +1 -1
  130. package/dist/br/data/mun/RR.cjs +1 -1
  131. package/dist/br/data/mun/RR.cjs.map +1 -1
  132. package/dist/br/data/mun/RR.js +795 -778
  133. package/dist/br/data/mun/RR.js.map +1 -1
  134. package/dist/br/data/mun/RS.cjs +1 -1
  135. package/dist/br/data/mun/RS.cjs.map +1 -1
  136. package/dist/br/data/mun/RS.js +7579 -6424
  137. package/dist/br/data/mun/RS.js.map +1 -1
  138. package/dist/br/data/mun/SC.cjs +1 -1
  139. package/dist/br/data/mun/SC.cjs.map +1 -1
  140. package/dist/br/data/mun/SC.js +3979 -3357
  141. package/dist/br/data/mun/SC.js.map +1 -1
  142. package/dist/br/data/mun/SE.cjs +1 -1
  143. package/dist/br/data/mun/SE.cjs.map +1 -1
  144. package/dist/br/data/mun/SE.js +812 -625
  145. package/dist/br/data/mun/SE.js.map +1 -1
  146. package/dist/br/data/mun/SP.cjs +1 -1
  147. package/dist/br/data/mun/SP.cjs.map +1 -1
  148. package/dist/br/data/mun/SP.js +7866 -6803
  149. package/dist/br/data/mun/SP.js.map +1 -1
  150. package/dist/br/data/mun/TO.cjs +1 -1
  151. package/dist/br/data/mun/TO.cjs.map +1 -1
  152. package/dist/br/data/mun/TO.js +2763 -2817
  153. package/dist/br/data/mun/TO.js.map +1 -1
  154. package/dist/br/locations.cjs +1 -1
  155. package/dist/br/locations.cjs.map +1 -1
  156. package/dist/br/locations.js +97 -24
  157. package/dist/br/locations.js.map +1 -1
  158. package/dist/br/scales.cjs +1 -1
  159. package/dist/br/scales.cjs.map +1 -1
  160. package/dist/br/scales.js +8 -4
  161. package/dist/br/scales.js.map +1 -1
  162. package/dist/br/whatsapp.cjs +2 -0
  163. package/dist/br/whatsapp.cjs.map +1 -0
  164. package/dist/br/whatsapp.js +21 -0
  165. package/dist/br/whatsapp.js.map +1 -0
  166. package/dist/br.cjs +1 -1
  167. package/dist/br.cjs.map +1 -1
  168. package/dist/br.d.ts +188 -10
  169. package/dist/br.js +18 -17
  170. package/dist/br.js.map +1 -1
  171. package/dist/components/BottomSheet/BottomSheet.cjs +1 -1
  172. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  173. package/dist/components/BottomSheet/BottomSheet.js +30 -27
  174. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  175. package/dist/components/Command/Command.cjs +1 -1
  176. package/dist/components/Command/Command.cjs.map +1 -1
  177. package/dist/components/Command/Command.js +78 -75
  178. package/dist/components/Command/Command.js.map +1 -1
  179. package/dist/components/Drawer/Drawer.cjs +1 -1
  180. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  181. package/dist/components/Drawer/Drawer.js +42 -39
  182. package/dist/components/Drawer/Drawer.js.map +1 -1
  183. package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
  184. package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  185. package/dist/components/DropdownMenu/DropdownMenu.js +111 -67
  186. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  187. package/dist/components/Modal/Modal.cjs +1 -1
  188. package/dist/components/Modal/Modal.cjs.map +1 -1
  189. package/dist/components/Modal/Modal.js +45 -42
  190. package/dist/components/Modal/Modal.js.map +1 -1
  191. package/dist/components/Money/Money.cjs +1 -1
  192. package/dist/components/Money/Money.cjs.map +1 -1
  193. package/dist/components/Money/Money.js +10 -9
  194. package/dist/components/Money/Money.js.map +1 -1
  195. package/dist/components/Pagination/Pagination.cjs +1 -1
  196. package/dist/components/Pagination/Pagination.cjs.map +1 -1
  197. package/dist/components/Pagination/Pagination.js +38 -31
  198. package/dist/components/Pagination/Pagination.js.map +1 -1
  199. package/dist/components/Pagination/Pagination.module.cjs +1 -1
  200. package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
  201. package/dist/components/Pagination/Pagination.module.js +4 -4
  202. package/dist/components/Pagination/Pagination.module.js.map +1 -1
  203. package/dist/components/Portal/Portal.cjs +1 -1
  204. package/dist/components/Portal/Portal.cjs.map +1 -1
  205. package/dist/components/Portal/Portal.js +9 -6
  206. package/dist/components/Portal/Portal.js.map +1 -1
  207. package/dist/components/Portal/portal-host.cjs +2 -0
  208. package/dist/components/Portal/portal-host.cjs.map +1 -0
  209. package/dist/components/Portal/portal-host.js +11 -0
  210. package/dist/components/Portal/portal-host.js.map +1 -0
  211. package/dist/components/Scheduler/Scheduler.cjs +1 -1
  212. package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
  213. package/dist/components/Scheduler/Scheduler.js +83 -82
  214. package/dist/components/Scheduler/Scheduler.js.map +1 -1
  215. package/dist/components/Toast/ToastProvider.cjs +1 -1
  216. package/dist/components/Toast/ToastProvider.cjs.map +1 -1
  217. package/dist/components/Toast/ToastProvider.js +55 -53
  218. package/dist/components/Toast/ToastProvider.js.map +1 -1
  219. package/dist/components/VirtualList/VirtualList.cjs +1 -1
  220. package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
  221. package/dist/components/VirtualList/VirtualList.js +41 -31
  222. package/dist/components/VirtualList/VirtualList.js.map +1 -1
  223. package/dist/components/VirtualTable/VirtualTable.cjs +1 -1
  224. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
  225. package/dist/components/VirtualTable/VirtualTable.js +78 -68
  226. package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
  227. package/dist/forms/masked-inputs.cjs +1 -1
  228. package/dist/forms/masked-inputs.cjs.map +1 -1
  229. package/dist/forms/masked-inputs.js +20 -19
  230. package/dist/forms/masked-inputs.js.map +1 -1
  231. package/dist/hooks/use-fullscreen-element.cjs +2 -0
  232. package/dist/hooks/use-fullscreen-element.cjs.map +1 -0
  233. package/dist/hooks/use-fullscreen-element.js +20 -0
  234. package/dist/hooks/use-fullscreen-element.js.map +1 -0
  235. package/dist/hooks/use-fullscreen.cjs +2 -0
  236. package/dist/hooks/use-fullscreen.cjs.map +1 -0
  237. package/dist/hooks/use-fullscreen.js +66 -0
  238. package/dist/hooks/use-fullscreen.js.map +1 -0
  239. package/dist/hooks/use-push-to-talk.cjs +2 -0
  240. package/dist/hooks/use-push-to-talk.cjs.map +1 -0
  241. package/dist/hooks/use-push-to-talk.js +61 -0
  242. package/dist/hooks/use-push-to-talk.js.map +1 -0
  243. package/dist/http/describe-api-error.cjs.map +1 -1
  244. package/dist/http/describe-api-error.js.map +1 -1
  245. package/dist/http/errors.cjs +1 -1
  246. package/dist/http/errors.cjs.map +1 -1
  247. package/dist/http/errors.js +34 -16
  248. package/dist/http/errors.js.map +1 -1
  249. package/dist/http/parse-response.cjs +2 -2
  250. package/dist/http/parse-response.cjs.map +1 -1
  251. package/dist/http/parse-response.js +9 -8
  252. package/dist/http/parse-response.js.map +1 -1
  253. package/dist/i18n/create-i18n.cjs +1 -1
  254. package/dist/i18n/create-i18n.cjs.map +1 -1
  255. package/dist/i18n/create-i18n.js +28 -27
  256. package/dist/i18n/create-i18n.js.map +1 -1
  257. package/dist/router/AppRouter.cjs +1 -1
  258. package/dist/router/AppRouter.cjs.map +1 -1
  259. package/dist/router/AppRouter.js +28 -21
  260. package/dist/router/AppRouter.js.map +1 -1
  261. package/dist/router/RouteGuard.cjs +1 -1
  262. package/dist/router/RouteGuard.cjs.map +1 -1
  263. package/dist/router/RouteGuard.js +4 -4
  264. package/dist/router/RouteGuard.js.map +1 -1
  265. package/dist/sse/create-event-stream.cjs +1 -1
  266. package/dist/sse/create-event-stream.cjs.map +1 -1
  267. package/dist/sse/create-event-stream.js +34 -38
  268. package/dist/sse/create-event-stream.js.map +1 -1
  269. package/dist/styles/AIChat.css +79 -0
  270. package/dist/styles/Accordion.css +12 -0
  271. package/dist/styles/Alert.css +32 -0
  272. package/dist/styles/AppBar.css +17 -0
  273. package/dist/styles/AppShell.css +8 -0
  274. package/dist/styles/AspectRatio.css +3 -0
  275. package/dist/styles/AudioPlayer.css +13 -0
  276. package/dist/styles/AudioRecorder.css +20 -0
  277. package/dist/styles/Avatar.css +13 -0
  278. package/dist/styles/AvatarGroup.css +18 -0
  279. package/dist/styles/Badge.css +25 -0
  280. package/dist/styles/Banner.css +13 -0
  281. package/dist/styles/BarList.css +10 -0
  282. package/dist/styles/BarcodeScanner.css +21 -0
  283. package/dist/styles/BottomNavigation.css +10 -0
  284. package/dist/styles/BottomSheet.css +11 -0
  285. package/dist/styles/BrazilMap.css +20 -0
  286. package/dist/styles/Breadcrumbs.css +8 -0
  287. package/dist/styles/Button.css +42 -0
  288. package/dist/styles/Calendar.css +16 -0
  289. package/dist/styles/Card.css +15 -0
  290. package/dist/styles/Carousel.css +17 -0
  291. package/dist/styles/Center.css +5 -0
  292. package/dist/styles/Chat.css +35 -0
  293. package/dist/styles/Checkbox.css +11 -0
  294. package/dist/styles/ChipInput.css +13 -0
  295. package/dist/styles/CodeBlock.css +25 -0
  296. package/dist/styles/Collapsible.css +6 -0
  297. package/dist/styles/Combobox.css +18 -0
  298. package/dist/styles/Command.css +20 -0
  299. package/dist/styles/ContextMenu.css +11 -0
  300. package/dist/styles/CopyButton.css +4 -0
  301. package/dist/styles/DataList.css +3 -0
  302. package/dist/styles/DataTable.css +19 -0
  303. package/dist/styles/DateRangePicker.css +22 -0
  304. package/dist/styles/DescriptionList.css +4 -0
  305. package/dist/styles/Divider.css +11 -0
  306. package/dist/styles/Drawer.css +22 -0
  307. package/dist/styles/DropdownMenu.css +16 -0
  308. package/dist/styles/Dropzone.css +7 -0
  309. package/dist/styles/EmptyState.css +6 -0
  310. package/dist/styles/ErrorState.css +6 -0
  311. package/dist/styles/ErrorText.css +2 -0
  312. package/dist/styles/FileUpload.css +17 -0
  313. package/dist/styles/FilterBar.css +19 -0
  314. package/dist/styles/FloatingActionButton.css +23 -0
  315. package/dist/styles/Form.css +21 -0
  316. package/dist/styles/HoverCard.css +11 -0
  317. package/dist/styles/IconPicker.css +6 -0
  318. package/dist/styles/Image.css +2 -0
  319. package/dist/styles/ImageCropper.css +16 -0
  320. package/dist/styles/Input.css +24 -0
  321. package/dist/styles/InstallBanner.css +8 -0
  322. package/dist/styles/Kanban.css +15 -0
  323. package/dist/styles/Kbd.css +5 -0
  324. package/dist/styles/Label.css +3 -0
  325. package/dist/styles/Layout.css +22 -0
  326. package/dist/styles/Lightbox.css +21 -0
  327. package/dist/styles/ListTile.css +14 -0
  328. package/dist/styles/MapLegend.css +9 -0
  329. package/dist/styles/Markdown.css +24 -0
  330. package/dist/styles/Masonry.css +4 -0
  331. package/dist/styles/Menubar.css +17 -0
  332. package/dist/styles/Modal.css +21 -0
  333. package/dist/styles/ModalsManager.css +2 -0
  334. package/dist/styles/MultiSelect.css +21 -0
  335. package/dist/styles/MunicipalitySearch.css +6 -0
  336. package/dist/styles/NProgress.css +2 -0
  337. package/dist/styles/Navbar.css +10 -0
  338. package/dist/styles/NavigationMenu.css +12 -0
  339. package/dist/styles/NavigationRail.css +14 -0
  340. package/dist/styles/NotificationCenter.css +21 -0
  341. package/dist/styles/OfflineIndicator.css +7 -0
  342. package/dist/styles/Page.css +13 -0
  343. package/dist/styles/Pagination.css +12 -0
  344. package/dist/styles/PasswordInput.css +21 -0
  345. package/dist/styles/PinInput.css +13 -0
  346. package/dist/styles/PixQRCode.css +9 -0
  347. package/dist/styles/Popover.css +10 -0
  348. package/dist/styles/Progress.css +11 -0
  349. package/dist/styles/QRCode.css +3 -0
  350. package/dist/styles/Radio.css +14 -0
  351. package/dist/styles/RangeSlider.css +15 -0
  352. package/dist/styles/RatingStars.css +11 -0
  353. package/dist/styles/RefreshIndicator.css +5 -0
  354. package/dist/styles/Resizable.css +13 -0
  355. package/dist/styles/RichTextEditor.css +19 -0
  356. package/dist/styles/SafeArea.css +7 -0
  357. package/dist/styles/Scheduler.css +24 -0
  358. package/dist/styles/ScrollArea.css +7 -0
  359. package/dist/styles/SearchBar.css +11 -0
  360. package/dist/styles/SegmentedControl.css +12 -0
  361. package/dist/styles/Select.css +14 -0
  362. package/dist/styles/Sidebar.css +19 -0
  363. package/dist/styles/SignaturePad.css +6 -0
  364. package/dist/styles/Skeleton.css +7 -0
  365. package/dist/styles/Slider.css +15 -0
  366. package/dist/styles/Spacer.css +4 -0
  367. package/dist/styles/Sparkline.css +4 -0
  368. package/dist/styles/Spinner.css +12 -0
  369. package/dist/styles/Stat.css +12 -0
  370. package/dist/styles/Stepper.css +17 -0
  371. package/dist/styles/StepperInput.css +15 -0
  372. package/dist/styles/Switch.css +11 -0
  373. package/dist/styles/SyncStatusBadge.css +13 -0
  374. package/dist/styles/Table.css +16 -0
  375. package/dist/styles/Tabs.css +14 -0
  376. package/dist/styles/Tag.css +14 -0
  377. package/dist/styles/Textarea.css +13 -0
  378. package/dist/styles/TimePicker.css +14 -0
  379. package/dist/styles/Timeline.css +17 -0
  380. package/dist/styles/Toast.css +21 -0
  381. package/dist/styles/Toggle.css +12 -0
  382. package/dist/styles/ToggleGroup.css +9 -0
  383. package/dist/styles/Tooltip.css +10 -0
  384. package/dist/styles/Tour.css +20 -0
  385. package/dist/styles/TrajectoryMap.css +16 -0
  386. package/dist/styles/Transfer.css +21 -0
  387. package/dist/styles/TreeView.css +17 -0
  388. package/dist/styles/TruncateText.css +2 -0
  389. package/dist/styles/UpdatePrompt.css +10 -0
  390. package/dist/styles/VirtualList.css +5 -0
  391. package/dist/styles/VirtualTable.css +17 -0
  392. package/dist/styles/VisuallyHidden.css +2 -0
  393. package/dist/styles/Wizard.css +4 -0
  394. package/dist/styles/actions.css +104 -0
  395. package/dist/styles/advanced.css +66 -0
  396. package/dist/styles/br.css +41 -0
  397. package/dist/styles/chat.css +113 -0
  398. package/dist/styles/core.css +40 -0
  399. package/dist/styles/data.css +222 -0
  400. package/dist/styles/editor.css +19 -0
  401. package/dist/styles/feedback.css +201 -0
  402. package/dist/styles/forms.css +321 -0
  403. package/dist/styles/geo.css +16 -0
  404. package/dist/styles/icons.css +6 -0
  405. package/dist/styles/identity.css +48 -0
  406. package/dist/styles/layout.css +122 -0
  407. package/dist/styles/media.css +52 -0
  408. package/dist/styles/navigation.css +167 -0
  409. package/dist/styles/overlay.css +73 -0
  410. package/dist/styles/utility.css +39 -0
  411. package/dist/styles.css +1 -1
  412. package/dist/sw/register-service-worker.cjs +1 -1
  413. package/dist/sw/register-service-worker.cjs.map +1 -1
  414. package/dist/sw/register-service-worker.js +21 -17
  415. package/dist/sw/register-service-worker.js.map +1 -1
  416. package/dist/sw.d.ts +17 -1
  417. package/dist/tempest-react-sdk.cjs +1 -1
  418. package/dist/tempest-react-sdk.d.ts +1151 -41
  419. package/dist/tempest-react-sdk.js +295 -286
  420. package/dist/utils/dev-mode.cjs.map +1 -1
  421. package/dist/utils/dev-mode.js.map +1 -1
  422. package/dist/utils/format.cjs +1 -1
  423. package/dist/utils/format.cjs.map +1 -1
  424. package/dist/utils/format.js +22 -14
  425. package/dist/utils/format.js.map +1 -1
  426. package/dist/utils/intl-cache.cjs +2 -0
  427. package/dist/utils/intl-cache.cjs.map +1 -0
  428. package/dist/utils/intl-cache.js +23 -0
  429. package/dist/utils/intl-cache.js.map +1 -0
  430. package/dist/utils/json-frame.cjs +2 -0
  431. package/dist/utils/json-frame.cjs.map +1 -0
  432. package/dist/utils/json-frame.js +30 -0
  433. package/dist/utils/json-frame.js.map +1 -0
  434. package/dist/utils/numbers.cjs +1 -1
  435. package/dist/utils/numbers.cjs.map +1 -1
  436. package/dist/utils/numbers.js +8 -7
  437. package/dist/utils/numbers.js.map +1 -1
  438. package/dist/vision/results.cjs +1 -1
  439. package/dist/vision/results.cjs.map +1 -1
  440. package/dist/vision/results.js +26 -17
  441. package/dist/vision/results.js.map +1 -1
  442. package/dist/vision.d.ts +29 -0
  443. package/dist/vite/tempest-icons.cjs +1 -1
  444. package/dist/vite/tempest-icons.cjs.map +1 -1
  445. package/dist/vite/tempest-icons.js +1 -1
  446. package/dist/vite/tempest-icons.js.map +1 -1
  447. package/dist/webrtc/link-stats.cjs +2 -0
  448. package/dist/webrtc/link-stats.cjs.map +1 -0
  449. package/dist/webrtc/link-stats.js +74 -0
  450. package/dist/webrtc/link-stats.js.map +1 -0
  451. package/dist/webrtc/mesh-quality.cjs +2 -0
  452. package/dist/webrtc/mesh-quality.cjs.map +1 -0
  453. package/dist/webrtc/mesh-quality.js +51 -0
  454. package/dist/webrtc/mesh-quality.js.map +1 -0
  455. package/dist/webrtc/peer-link.cjs +2 -0
  456. package/dist/webrtc/peer-link.cjs.map +1 -0
  457. package/dist/webrtc/peer-link.js +45 -0
  458. package/dist/webrtc/peer-link.js.map +1 -0
  459. package/dist/webrtc/peer-mesh.cjs +2 -0
  460. package/dist/webrtc/peer-mesh.cjs.map +1 -0
  461. package/dist/webrtc/peer-mesh.js +155 -0
  462. package/dist/webrtc/peer-mesh.js.map +1 -0
  463. package/dist/webrtc/use-link-stats.cjs +2 -0
  464. package/dist/webrtc/use-link-stats.cjs.map +1 -0
  465. package/dist/webrtc/use-link-stats.js +22 -0
  466. package/dist/webrtc/use-link-stats.js.map +1 -0
  467. package/dist/ws/create-web-socket.cjs +1 -1
  468. package/dist/ws/create-web-socket.cjs.map +1 -1
  469. package/dist/ws/create-web-socket.js +81 -85
  470. package/dist/ws/create-web-socket.js.map +1 -1
  471. package/dist/ws/use-web-socket.cjs +1 -1
  472. package/dist/ws/use-web-socket.cjs.map +1 -1
  473. package/dist/ws/use-web-socket.js +42 -48
  474. package/dist/ws/use-web-socket.js.map +1 -1
  475. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"RouteGuard.cjs","names":[],"sources":["../../src/router/RouteGuard.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Navigate } from \"react-router\";\n\nexport interface RouteGuardProps {\n /**\n * Whether access is allowed. Pass a boolean or anything truthy/falsy —\n * typically `useAuthStore((s) => s.isAuthenticated)`.\n */\n when: boolean;\n /** Where to redirect when `when` is falsy (default: `\"/\"`). */\n redirectTo?: string;\n /** Replace history entry on redirect instead of pushing (default: true). */\n replace?: boolean;\n /** Protected content, usually `<Outlet />` for a guarded layout route. */\n children: ReactNode;\n}\n\n/**\n * Declarative route guard built on React Router's `<Navigate>`. Renders its\n * children when `when` is truthy, otherwise redirects. Pairs naturally with\n * `createAuthStore` for protected areas.\n *\n * @example\n * <RouteGuard when={useAuthStore((s) => s.isAuthenticated)} redirectTo=\"/login\">\n * <Outlet />\n * </RouteGuard>\n */\nexport function RouteGuard({ when, redirectTo = \"/\", replace = true, children }: RouteGuardProps) {\n return <>{when ? children : <Navigate to={redirectTo} replace={replace} />}</>;\n}\n"],"mappings":"6DA2BA,SAAgB,EAAW,CAAE,OAAM,aAAa,IAAK,UAAU,GAAM,YAA6B,CAC9F,OAAO,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAA,SAAG,EAAO,GAAW,EAAA,EAAA,IAAA,CAAC,EAAA,SAAD,CAAU,GAAI,EAAqB,SAAU,CAAA,CAAI,CAAA,CACjF"}
1
+ {"version":3,"file":"RouteGuard.cjs","names":[],"sources":["../../src/router/RouteGuard.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Navigate } from \"react-router\";\nimport type { RouteGuardResult } from \"./types\";\n\nexport interface RouteGuardProps {\n /**\n * Whether access is allowed typically\n * `useAuthStore((s) => s.isAuthenticated)`.\n *\n * `\"pending\"` is the third answer, for a permission that has not resolved\n * yet: it holds the decision and renders {@link fallback} instead of\n * choosing between two wrong moves — redirecting someone who does have\n * access, or showing the screen to someone who does not.\n */\n when: RouteGuardResult;\n /**\n * Rendered while `when` is `\"pending\"`. Defaults to nothing, which is a\n * blank screen — pass the same spinner the rest of the app uses.\n */\n fallback?: ReactNode;\n /** Where to redirect when `when` is falsy (default: `\"/\"`). */\n redirectTo?: string;\n /** Replace history entry on redirect instead of pushing (default: true). */\n replace?: boolean;\n /** Protected content, usually `<Outlet />` for a guarded layout route. */\n children: ReactNode;\n}\n\n/**\n * Declarative route guard built on React Router's `<Navigate>`. Renders its\n * children when `when` is `true`, redirects when it is `false`, and holds on\n * `\"pending\"`. Pairs naturally with `createAuthStore` for protected areas, and\n * with `useCan` for permissions that resolve over the network.\n *\n * @example\n * <RouteGuard when={useAuthStore((s) => s.isAuthenticated)} redirectTo=\"/login\">\n * <Outlet />\n * </RouteGuard>\n *\n * @example\n * const { allowed, isLoading } = useCan({ action: \"read\", resource: \"finance\" });\n *\n * <RouteGuard when={isLoading ? \"pending\" : allowed} fallback={<Spinner />}>\n * <Outlet />\n * </RouteGuard>\n */\nexport function RouteGuard({\n when,\n fallback = null,\n redirectTo = \"/\",\n replace = true,\n children,\n}: RouteGuardProps) {\n if (when === \"pending\") return <>{fallback}</>;\n return <>{when ? children : <Navigate to={redirectTo} replace={replace} />}</>;\n}\n"],"mappings":"6DA8CA,SAAgB,EAAW,CACvB,OACA,WAAW,KACX,aAAa,IACb,UAAU,GACV,YACgB,CAEhB,OADI,IAAS,WAAkB,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAA,SAAG,CAAW,CAAA,GACtC,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAA,SAAG,EAAO,GAAW,EAAA,EAAA,IAAA,CAAC,EAAA,SAAD,CAAU,GAAI,EAAqB,SAAU,CAAA,CAAI,CAAA,CACjF"}
@@ -1,10 +1,10 @@
1
1
  import { Fragment as e, jsx as t } from "react/jsx-runtime";
2
2
  import { Navigate as n } from "react-router";
3
3
  //#region src/router/RouteGuard.tsx
4
- function r({ when: r, redirectTo: i = "/", replace: a = !0, children: o }) {
5
- return /* @__PURE__ */ t(e, { children: r ? o : /* @__PURE__ */ t(n, {
6
- to: i,
7
- replace: a
4
+ function r({ when: r, fallback: i = null, redirectTo: a = "/", replace: o = !0, children: s }) {
5
+ return r === "pending" ? /* @__PURE__ */ t(e, { children: i }) : /* @__PURE__ */ t(e, { children: r ? s : /* @__PURE__ */ t(n, {
6
+ to: a,
7
+ replace: o
8
8
  }) });
9
9
  }
10
10
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"RouteGuard.js","names":[],"sources":["../../src/router/RouteGuard.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Navigate } from \"react-router\";\n\nexport interface RouteGuardProps {\n /**\n * Whether access is allowed. Pass a boolean or anything truthy/falsy —\n * typically `useAuthStore((s) => s.isAuthenticated)`.\n */\n when: boolean;\n /** Where to redirect when `when` is falsy (default: `\"/\"`). */\n redirectTo?: string;\n /** Replace history entry on redirect instead of pushing (default: true). */\n replace?: boolean;\n /** Protected content, usually `<Outlet />` for a guarded layout route. */\n children: ReactNode;\n}\n\n/**\n * Declarative route guard built on React Router's `<Navigate>`. Renders its\n * children when `when` is truthy, otherwise redirects. Pairs naturally with\n * `createAuthStore` for protected areas.\n *\n * @example\n * <RouteGuard when={useAuthStore((s) => s.isAuthenticated)} redirectTo=\"/login\">\n * <Outlet />\n * </RouteGuard>\n */\nexport function RouteGuard({ when, redirectTo = \"/\", replace = true, children }: RouteGuardProps) {\n return <>{when ? children : <Navigate to={redirectTo} replace={replace} />}</>;\n}\n"],"mappings":";;;AA2BA,SAAgB,EAAW,EAAE,SAAM,gBAAa,KAAK,aAAU,IAAM,eAA6B;CAC9F,OAAO,kBAAA,GAAA,EAAA,UAAG,IAAO,IAAW,kBAAC,GAAD;EAAU,IAAI;EAAqB;CAAU,CAAA,EAAI,CAAA;AACjF"}
1
+ {"version":3,"file":"RouteGuard.js","names":[],"sources":["../../src/router/RouteGuard.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Navigate } from \"react-router\";\nimport type { RouteGuardResult } from \"./types\";\n\nexport interface RouteGuardProps {\n /**\n * Whether access is allowed typically\n * `useAuthStore((s) => s.isAuthenticated)`.\n *\n * `\"pending\"` is the third answer, for a permission that has not resolved\n * yet: it holds the decision and renders {@link fallback} instead of\n * choosing between two wrong moves — redirecting someone who does have\n * access, or showing the screen to someone who does not.\n */\n when: RouteGuardResult;\n /**\n * Rendered while `when` is `\"pending\"`. Defaults to nothing, which is a\n * blank screen — pass the same spinner the rest of the app uses.\n */\n fallback?: ReactNode;\n /** Where to redirect when `when` is falsy (default: `\"/\"`). */\n redirectTo?: string;\n /** Replace history entry on redirect instead of pushing (default: true). */\n replace?: boolean;\n /** Protected content, usually `<Outlet />` for a guarded layout route. */\n children: ReactNode;\n}\n\n/**\n * Declarative route guard built on React Router's `<Navigate>`. Renders its\n * children when `when` is `true`, redirects when it is `false`, and holds on\n * `\"pending\"`. Pairs naturally with `createAuthStore` for protected areas, and\n * with `useCan` for permissions that resolve over the network.\n *\n * @example\n * <RouteGuard when={useAuthStore((s) => s.isAuthenticated)} redirectTo=\"/login\">\n * <Outlet />\n * </RouteGuard>\n *\n * @example\n * const { allowed, isLoading } = useCan({ action: \"read\", resource: \"finance\" });\n *\n * <RouteGuard when={isLoading ? \"pending\" : allowed} fallback={<Spinner />}>\n * <Outlet />\n * </RouteGuard>\n */\nexport function RouteGuard({\n when,\n fallback = null,\n redirectTo = \"/\",\n replace = true,\n children,\n}: RouteGuardProps) {\n if (when === \"pending\") return <>{fallback}</>;\n return <>{when ? children : <Navigate to={redirectTo} replace={replace} />}</>;\n}\n"],"mappings":";;;AA8CA,SAAgB,EAAW,EACvB,SACA,cAAW,MACX,gBAAa,KACb,aAAU,IACV,eACgB;CAEhB,OADI,MAAS,YAAkB,kBAAA,GAAA,EAAA,UAAG,EAAW,CAAA,IACtC,kBAAA,GAAA,EAAA,UAAG,IAAO,IAAW,kBAAC,GAAD;EAAU,IAAI;EAAqB;CAAU,CAAA,EAAI,CAAA;AACjF"}
@@ -1,2 +1,2 @@
1
- function e(e){try{return JSON.parse(e)}catch{return e}}function t(t,n={}){let{withCredentials:r=!1,namedEvents:i=[],heartbeatEvents:a=[`ping`],maxRetries:o=10,initialBackoff:s=1e3,maxBackoff:c=3e4,parser:l=e,onOpen:u,onMessage:d,onError:f,onStatusChange:p}=n,m=null,h=null,g=0,_=`idle`,v=!1;function y(e){_!==e&&(_=e,p?.(e))}function b(e,t){a.includes(e)||d?.({event:e,data:l(t.data),id:t.lastEventId||void 0,raw:t})}function x(){if(v)return;if(g>=o){y(`error`);return}let e=Math.min(s*2**g,c);g+=1,h=setTimeout(S,e)}function S(){if(v)return;m&&m.close(),y(`connecting`);let e=new EventSource(t,{withCredentials:r});m=e,e.onopen=()=>{g=0,y(`open`),u?.()},e.onmessage=e=>b(`message`,e);for(let t of i)e.addEventListener(t,e=>b(t,e));for(let t of a)e.addEventListener(t,()=>{});e.onerror=t=>{f?.(t),e.close(),m=null,y(`closed`),x()}}function C(){v=!0,h&&=(clearTimeout(h),null),g=0,m&&=(m.close(),null),y(`closed`)}function w(){h&&=(clearTimeout(h),null),g=0,v=!1,S()}return S(),{close:C,reconnect:w,get status(){return _}}}exports.createEventStream=t;
1
+ const e=require("../utils/json-frame.cjs");function t(t,n={}){let{withCredentials:r=!1,namedEvents:i=[],heartbeatEvents:a=[`ping`],maxRetries:o=10,initialBackoff:s=1e3,maxBackoff:c=3e4,parser:l,onOpen:u,onMessage:d,onError:f,onParseError:p,onStatusChange:m}=n,h=null,g=null,_=0,v=`idle`,y=!1;function b(e){v!==e&&(v=e,m?.(e))}function x(t,n){if(a.includes(t))return;let r=e.decodeFrame(typeof n.data==`string`?n.data:``,l,p,`createEventStream`);r.delivered&&d?.({event:t,data:r.data,id:n.lastEventId||void 0,raw:n})}function S(){if(y)return;if(_>=o){b(`error`);return}let e=Math.min(s*2**_,c);_+=1,g=setTimeout(C,e)}function C(){if(y)return;h&&h.close(),b(`connecting`);let e=new EventSource(t,{withCredentials:r});h=e,e.onopen=()=>{_=0,b(`open`),u?.()},e.onmessage=e=>x(`message`,e);for(let t of i)e.addEventListener(t,e=>x(t,e));for(let t of a)e.addEventListener(t,()=>{});e.onerror=t=>{f?.(t),e.close(),h=null,b(`closed`),S()}}function w(){y=!0,g&&=(clearTimeout(g),null),_=0,h&&=(h.close(),null),b(`closed`)}function T(){g&&=(clearTimeout(g),null),_=0,y=!1,C()}return C(),{close:w,reconnect:T,get status(){return v}}}exports.createEventStream=t;
2
2
  //# sourceMappingURL=create-event-stream.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-event-stream.cjs","names":[],"sources":["../../src/sse/create-event-stream.ts"],"sourcesContent":["/**\n * @tempest-limits function-lines — the body is the SSE line protocol — accumulate\n * `data:` lines until a blank line, track `id:` for Last-Event-ID, honour `retry:` —\n * plus the reconnect that uses the id it just tracked.\n */\nexport type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\nfunction defaultParser<T>(raw: string): T {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser = defaultParser<T>,\n onOpen,\n onMessage,\n onError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n onMessage?.({\n event: eventName,\n data: parser(event.data),\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n"],"mappings":"AA+CA,SAAS,EAAiB,EAAgB,CACtC,GAAI,CACA,OAAO,KAAK,MAAM,CAAG,CACzB,MAAQ,CACJ,OAAO,CACX,CACJ,CAaA,SAAgB,EACZ,EACA,EAAuC,CAAC,EACnB,CACrB,GAAM,CACF,kBAAkB,GAClB,cAAc,CAAC,EACf,kBAAkB,CAAC,MAAM,EACzB,aAAa,GACb,iBAAiB,IACjB,aAAa,IACb,SAAS,EACT,SACA,YACA,UACA,kBACA,EAEA,EAA6B,KAC7B,EAAmD,KACnD,EAAU,EACV,EAA4B,OAC5B,EAAS,GAEb,SAAS,EAAU,EAA+B,CAC1C,IAAW,IACf,EAAS,EACT,IAAiB,CAAI,EACzB,CAEA,SAAS,EAAK,EAAmB,EAA2B,CACpD,EAAgB,SAAS,CAAS,GACtC,IAAY,CACR,MAAO,EACP,KAAM,EAAO,EAAM,IAAI,EACvB,GAAI,EAAM,aAAe,IAAA,GACzB,IAAK,CACT,CAAC,CACL,CAEA,SAAS,GAA0B,CAC/B,GAAI,EAAQ,OACZ,GAAI,GAAW,EAAY,CACvB,EAAU,OAAO,EACjB,MACJ,CACA,IAAM,EAAQ,KAAK,IAAI,EAAiB,GAAK,EAAS,CAAU,EAChE,GAAW,EACX,EAAa,WAAW,EAAS,CAAK,CAC1C,CAEA,SAAS,GAAgB,CACrB,GAAI,EAAQ,OACR,GAAQ,EAAO,MAAM,EACzB,EAAU,YAAY,EAEtB,IAAM,EAAK,IAAI,YAAY,EAAK,CAAE,iBAAgB,CAAC,EACnD,EAAS,EAET,EAAG,WAAe,CACd,EAAU,EACV,EAAU,MAAM,EAChB,IAAS,CACb,EAEA,EAAG,UAAa,GAAU,EAAK,UAAW,CAAK,EAC/C,IAAK,IAAM,KAAQ,EACf,EAAG,iBAAiB,EAAO,GAAU,EAAK,EAAM,CAAqB,CAAC,EAE1E,IAAK,IAAM,KAAQ,EACf,EAAG,iBAAiB,MAAY,CAEhC,CAAC,EAGL,EAAG,QAAW,GAAU,CACpB,IAAU,CAAK,EACf,EAAG,MAAM,EACT,EAAS,KACT,EAAU,QAAQ,EAClB,EAAkB,CACtB,CACJ,CAEA,SAAS,GAAc,CACnB,EAAS,GACT,AAEI,KADA,aAAa,CAAU,EACV,MAEjB,EAAU,EACV,AAEI,KADA,EAAO,MAAM,EACJ,MAEb,EAAU,QAAQ,CACtB,CAEA,SAAS,GAAkB,CACvB,AAEI,KADA,aAAa,CAAU,EACV,MAEjB,EAAU,EACV,EAAS,GACT,EAAQ,CACZ,CAIA,OAFA,EAAQ,EAED,CACH,QACA,YACA,IAAI,QAAS,CACT,OAAO,CACX,CACJ,CACJ"}
1
+ {"version":3,"file":"create-event-stream.cjs","names":[],"sources":["../../src/sse/create-event-stream.ts"],"sourcesContent":["/**\n * @tempest-limits function-lines — the body is the SSE line protocol — accumulate\n * `data:` lines until a blank line, track `id:` for Last-Event-ID, honour `retry:` —\n * plus the reconnect that uses the id it just tracked.\n */\nimport { decodeFrame } from \"../utils/json-frame\";\nexport type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n /**\n * A frame arrived that is not valid JSON, and no `parser` was supplied.\n *\n * Registering this drops the frame instead of delivering it: the previous\n * behaviour handed `onMessage` the raw `string` announced as your message\n * type, so the failure surfaced later, at the first property access, with\n * nothing left pointing at the parse. Leave it out and that behaviour is\n * kept, with a one-time warning in development builds.\n */\n onParseError?: (error: unknown, raw: string) => void;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser,\n onOpen,\n onMessage,\n onError,\n onParseError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n const decoded = decodeFrame<T>(\n typeof event.data === \"string\" ? event.data : \"\",\n parser,\n onParseError,\n \"createEventStream\",\n );\n if (!decoded.delivered) return;\n onMessage?.({\n event: eventName,\n data: decoded.data,\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n"],"mappings":"2CAqEA,SAAgB,EACZ,EACA,EAAuC,CAAC,EACnB,CACrB,GAAM,CACF,kBAAkB,GAClB,cAAc,CAAC,EACf,kBAAkB,CAAC,MAAM,EACzB,aAAa,GACb,iBAAiB,IACjB,aAAa,IACb,SACA,SACA,YACA,UACA,eACA,kBACA,EAEA,EAA6B,KAC7B,EAAmD,KACnD,EAAU,EACV,EAA4B,OAC5B,EAAS,GAEb,SAAS,EAAU,EAA+B,CAC1C,IAAW,IACf,EAAS,EACT,IAAiB,CAAI,EACzB,CAEA,SAAS,EAAK,EAAmB,EAA2B,CACxD,GAAI,EAAgB,SAAS,CAAS,EAAG,OACzC,IAAM,EAAU,EAAA,YACZ,OAAO,EAAM,MAAS,SAAW,EAAM,KAAO,GAC9C,EACA,EACA,mBACJ,EACK,EAAQ,WACb,IAAY,CACR,MAAO,EACP,KAAM,EAAQ,KACd,GAAI,EAAM,aAAe,IAAA,GACzB,IAAK,CACT,CAAC,CACL,CAEA,SAAS,GAA0B,CAC/B,GAAI,EAAQ,OACZ,GAAI,GAAW,EAAY,CACvB,EAAU,OAAO,EACjB,MACJ,CACA,IAAM,EAAQ,KAAK,IAAI,EAAiB,GAAK,EAAS,CAAU,EAChE,GAAW,EACX,EAAa,WAAW,EAAS,CAAK,CAC1C,CAEA,SAAS,GAAgB,CACrB,GAAI,EAAQ,OACR,GAAQ,EAAO,MAAM,EACzB,EAAU,YAAY,EAEtB,IAAM,EAAK,IAAI,YAAY,EAAK,CAAE,iBAAgB,CAAC,EACnD,EAAS,EAET,EAAG,WAAe,CACd,EAAU,EACV,EAAU,MAAM,EAChB,IAAS,CACb,EAEA,EAAG,UAAa,GAAU,EAAK,UAAW,CAAK,EAC/C,IAAK,IAAM,KAAQ,EACf,EAAG,iBAAiB,EAAO,GAAU,EAAK,EAAM,CAAqB,CAAC,EAE1E,IAAK,IAAM,KAAQ,EACf,EAAG,iBAAiB,MAAY,CAEhC,CAAC,EAGL,EAAG,QAAW,GAAU,CACpB,IAAU,CAAK,EACf,EAAG,MAAM,EACT,EAAS,KACT,EAAU,QAAQ,EAClB,EAAkB,CACtB,CACJ,CAEA,SAAS,GAAc,CACnB,EAAS,GACT,AAEI,KADA,aAAa,CAAU,EACV,MAEjB,EAAU,EACV,AAEI,KADA,EAAO,MAAM,EACJ,MAEb,EAAU,QAAQ,CACtB,CAEA,SAAS,GAAkB,CACvB,AAEI,KADA,aAAa,CAAU,EACV,MAEjB,EAAU,EACV,EAAS,GACT,EAAQ,CACZ,CAIA,OAFA,EAAQ,EAED,CACH,QACA,YACA,IAAI,QAAS,CACT,OAAO,CACX,CACJ,CACJ"}
@@ -1,57 +1,53 @@
1
+ import { decodeFrame as e } from "../utils/json-frame.js";
1
2
  //#region src/sse/create-event-stream.ts
2
- function e(e) {
3
- try {
4
- return JSON.parse(e);
5
- } catch {
6
- return e;
7
- }
8
- }
9
3
  function t(t, n = {}) {
10
- let { withCredentials: r = !1, namedEvents: i = [], heartbeatEvents: a = ["ping"], maxRetries: o = 10, initialBackoff: s = 1e3, maxBackoff: c = 3e4, parser: l = e, onOpen: u, onMessage: d, onError: f, onStatusChange: p } = n, m = null, h = null, g = 0, _ = "idle", v = !1;
11
- function y(e) {
12
- _ !== e && (_ = e, p?.(e));
4
+ let { withCredentials: r = !1, namedEvents: i = [], heartbeatEvents: a = ["ping"], maxRetries: o = 10, initialBackoff: s = 1e3, maxBackoff: c = 3e4, parser: l, onOpen: u, onMessage: d, onError: f, onParseError: p, onStatusChange: m } = n, h = null, g = null, _ = 0, v = "idle", y = !1;
5
+ function b(e) {
6
+ v !== e && (v = e, m?.(e));
13
7
  }
14
- function b(e, t) {
15
- a.includes(e) || d?.({
16
- event: e,
17
- data: l(t.data),
18
- id: t.lastEventId || void 0,
19
- raw: t
8
+ function x(t, n) {
9
+ if (a.includes(t)) return;
10
+ let r = e(typeof n.data == "string" ? n.data : "", l, p, "createEventStream");
11
+ r.delivered && d?.({
12
+ event: t,
13
+ data: r.data,
14
+ id: n.lastEventId || void 0,
15
+ raw: n
20
16
  });
21
17
  }
22
- function x() {
23
- if (v) return;
24
- if (g >= o) {
25
- y("error");
18
+ function S() {
19
+ if (y) return;
20
+ if (_ >= o) {
21
+ b("error");
26
22
  return;
27
23
  }
28
- let e = Math.min(s * 2 ** g, c);
29
- g += 1, h = setTimeout(S, e);
24
+ let e = Math.min(s * 2 ** _, c);
25
+ _ += 1, g = setTimeout(C, e);
30
26
  }
31
- function S() {
32
- if (v) return;
33
- m && m.close(), y("connecting");
27
+ function C() {
28
+ if (y) return;
29
+ h && h.close(), b("connecting");
34
30
  let e = new EventSource(t, { withCredentials: r });
35
- m = e, e.onopen = () => {
36
- g = 0, y("open"), u?.();
37
- }, e.onmessage = (e) => b("message", e);
38
- for (let t of i) e.addEventListener(t, (e) => b(t, e));
31
+ h = e, e.onopen = () => {
32
+ _ = 0, b("open"), u?.();
33
+ }, e.onmessage = (e) => x("message", e);
34
+ for (let t of i) e.addEventListener(t, (e) => x(t, e));
39
35
  for (let t of a) e.addEventListener(t, () => {});
40
36
  e.onerror = (t) => {
41
- f?.(t), e.close(), m = null, y("closed"), x();
37
+ f?.(t), e.close(), h = null, b("closed"), S();
42
38
  };
43
39
  }
44
- function C() {
45
- v = !0, h &&= (clearTimeout(h), null), g = 0, m &&= (m.close(), null), y("closed");
46
- }
47
40
  function w() {
48
- h &&= (clearTimeout(h), null), g = 0, v = !1, S();
41
+ y = !0, g &&= (clearTimeout(g), null), _ = 0, h &&= (h.close(), null), b("closed");
42
+ }
43
+ function T() {
44
+ g &&= (clearTimeout(g), null), _ = 0, y = !1, C();
49
45
  }
50
- return S(), {
51
- close: C,
52
- reconnect: w,
46
+ return C(), {
47
+ close: w,
48
+ reconnect: T,
53
49
  get status() {
54
- return _;
50
+ return v;
55
51
  }
56
52
  };
57
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-event-stream.js","names":[],"sources":["../../src/sse/create-event-stream.ts"],"sourcesContent":["/**\n * @tempest-limits function-lines — the body is the SSE line protocol — accumulate\n * `data:` lines until a blank line, track `id:` for Last-Event-ID, honour `retry:` —\n * plus the reconnect that uses the id it just tracked.\n */\nexport type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\nfunction defaultParser<T>(raw: string): T {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser = defaultParser<T>,\n onOpen,\n onMessage,\n onError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n onMessage?.({\n event: eventName,\n data: parser(event.data),\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n"],"mappings":";AA+CA,SAAS,EAAiB,GAAgB;CACtC,IAAI;EACA,OAAO,KAAK,MAAM,CAAG;CACzB,QAAQ;EACJ,OAAO;CACX;AACJ;AAaA,SAAgB,EACZ,GACA,IAAuC,CAAC,GACnB;CACrB,IAAM,EACF,qBAAkB,IAClB,iBAAc,CAAC,GACf,qBAAkB,CAAC,MAAM,GACzB,gBAAa,IACb,oBAAiB,KACjB,gBAAa,KACb,YAAS,GACT,WACA,cACA,YACA,sBACA,GAEA,IAA6B,MAC7B,IAAmD,MACnD,IAAU,GACV,IAA4B,QAC5B,IAAS;CAEb,SAAS,EAAU,GAA+B;EAC1C,MAAW,MACf,IAAS,GACT,IAAiB,CAAI;CACzB;CAEA,SAAS,EAAK,GAAmB,GAA2B;EACpD,EAAgB,SAAS,CAAS,KACtC,IAAY;GACR,OAAO;GACP,MAAM,EAAO,EAAM,IAAI;GACvB,IAAI,EAAM,eAAe,KAAA;GACzB,KAAK;EACT,CAAC;CACL;CAEA,SAAS,IAA0B;EAC/B,IAAI,GAAQ;EACZ,IAAI,KAAW,GAAY;GACvB,EAAU,OAAO;GACjB;EACJ;EACA,IAAM,IAAQ,KAAK,IAAI,IAAiB,KAAK,GAAS,CAAU;EAEhE,AADA,KAAW,GACX,IAAa,WAAW,GAAS,CAAK;CAC1C;CAEA,SAAS,IAAgB;EACrB,IAAI,GAAQ;EAEZ,AADI,KAAQ,EAAO,MAAM,GACzB,EAAU,YAAY;EAEtB,IAAM,IAAK,IAAI,YAAY,GAAK,EAAE,mBAAgB,CAAC;EASnD,AARA,IAAS,GAET,EAAG,eAAe;GAGd,AAFA,IAAU,GACV,EAAU,MAAM,GAChB,IAAS;EACb,GAEA,EAAG,aAAa,MAAU,EAAK,WAAW,CAAK;EAC/C,KAAK,IAAM,KAAQ,GACf,EAAG,iBAAiB,IAAO,MAAU,EAAK,GAAM,CAAqB,CAAC;EAE1E,KAAK,IAAM,KAAQ,GACf,EAAG,iBAAiB,SAAY,CAEhC,CAAC;EAGL,EAAG,WAAW,MAAU;GAKpB,AAJA,IAAU,CAAK,GACf,EAAG,MAAM,GACT,IAAS,MACT,EAAU,QAAQ,GAClB,EAAkB;EACtB;CACJ;CAEA,SAAS,IAAc;EAWnB,AAVA,IAAS,IACT,AAEI,OADA,aAAa,CAAU,GACV,OAEjB,IAAU,GACV,AAEI,OADA,EAAO,MAAM,GACJ,OAEb,EAAU,QAAQ;CACtB;CAEA,SAAS,IAAkB;EAOvB,AANA,AAEI,OADA,aAAa,CAAU,GACV,OAEjB,IAAU,GACV,IAAS,IACT,EAAQ;CACZ;CAIA,OAFA,EAAQ,GAED;EACH;EACA;EACA,IAAI,SAAS;GACT,OAAO;EACX;CACJ;AACJ"}
1
+ {"version":3,"file":"create-event-stream.js","names":[],"sources":["../../src/sse/create-event-stream.ts"],"sourcesContent":["/**\n * @tempest-limits function-lines — the body is the SSE line protocol — accumulate\n * `data:` lines until a blank line, track `id:` for Last-Event-ID, honour `retry:` —\n * plus the reconnect that uses the id it just tracked.\n */\nimport { decodeFrame } from \"../utils/json-frame\";\nexport type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n /**\n * A frame arrived that is not valid JSON, and no `parser` was supplied.\n *\n * Registering this drops the frame instead of delivering it: the previous\n * behaviour handed `onMessage` the raw `string` announced as your message\n * type, so the failure surfaced later, at the first property access, with\n * nothing left pointing at the parse. Leave it out and that behaviour is\n * kept, with a one-time warning in development builds.\n */\n onParseError?: (error: unknown, raw: string) => void;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser,\n onOpen,\n onMessage,\n onError,\n onParseError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n const decoded = decodeFrame<T>(\n typeof event.data === \"string\" ? event.data : \"\",\n parser,\n onParseError,\n \"createEventStream\",\n );\n if (!decoded.delivered) return;\n onMessage?.({\n event: eventName,\n data: decoded.data,\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n"],"mappings":";;AAqEA,SAAgB,EACZ,GACA,IAAuC,CAAC,GACnB;CACrB,IAAM,EACF,qBAAkB,IAClB,iBAAc,CAAC,GACf,qBAAkB,CAAC,MAAM,GACzB,gBAAa,IACb,oBAAiB,KACjB,gBAAa,KACb,WACA,WACA,cACA,YACA,iBACA,sBACA,GAEA,IAA6B,MAC7B,IAAmD,MACnD,IAAU,GACV,IAA4B,QAC5B,IAAS;CAEb,SAAS,EAAU,GAA+B;EAC1C,MAAW,MACf,IAAS,GACT,IAAiB,CAAI;CACzB;CAEA,SAAS,EAAK,GAAmB,GAA2B;EACxD,IAAI,EAAgB,SAAS,CAAS,GAAG;EACzC,IAAM,IAAU,EACZ,OAAO,EAAM,QAAS,WAAW,EAAM,OAAO,IAC9C,GACA,GACA,mBACJ;EACK,EAAQ,aACb,IAAY;GACR,OAAO;GACP,MAAM,EAAQ;GACd,IAAI,EAAM,eAAe,KAAA;GACzB,KAAK;EACT,CAAC;CACL;CAEA,SAAS,IAA0B;EAC/B,IAAI,GAAQ;EACZ,IAAI,KAAW,GAAY;GACvB,EAAU,OAAO;GACjB;EACJ;EACA,IAAM,IAAQ,KAAK,IAAI,IAAiB,KAAK,GAAS,CAAU;EAEhE,AADA,KAAW,GACX,IAAa,WAAW,GAAS,CAAK;CAC1C;CAEA,SAAS,IAAgB;EACrB,IAAI,GAAQ;EAEZ,AADI,KAAQ,EAAO,MAAM,GACzB,EAAU,YAAY;EAEtB,IAAM,IAAK,IAAI,YAAY,GAAK,EAAE,mBAAgB,CAAC;EASnD,AARA,IAAS,GAET,EAAG,eAAe;GAGd,AAFA,IAAU,GACV,EAAU,MAAM,GAChB,IAAS;EACb,GAEA,EAAG,aAAa,MAAU,EAAK,WAAW,CAAK;EAC/C,KAAK,IAAM,KAAQ,GACf,EAAG,iBAAiB,IAAO,MAAU,EAAK,GAAM,CAAqB,CAAC;EAE1E,KAAK,IAAM,KAAQ,GACf,EAAG,iBAAiB,SAAY,CAEhC,CAAC;EAGL,EAAG,WAAW,MAAU;GAKpB,AAJA,IAAU,CAAK,GACf,EAAG,MAAM,GACT,IAAS,MACT,EAAU,QAAQ,GAClB,EAAkB;EACtB;CACJ;CAEA,SAAS,IAAc;EAWnB,AAVA,IAAS,IACT,AAEI,OADA,aAAa,CAAU,GACV,OAEjB,IAAU,GACV,AAEI,OADA,EAAO,MAAM,GACJ,OAEb,EAAU,QAAQ;CACtB;CAEA,SAAS,IAAkB;EAOvB,AANA,AAEI,OADA,aAAa,CAAU,GACV,OAEjB,IAAU,GACV,IAAS,IACT,EAAQ;CACZ;CAIA,OAFA,EAAQ,GAED;EACH;EACA;EACA,IAAI,SAAS;GACT,OAAO;EACX;CACJ;AACJ"}
@@ -0,0 +1,79 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_panel_W0CCy{min-width:0;min-height:0;height:var(--tempest-ai-chat-height,100%);background-color:var(--tempest-bg);color:var(--tempest-text);font-family:var(--tempest-font-sans);flex-direction:column;display:flex}
3
+ .tempest_header_KYy5l{padding:var(--tempest-space-3) var(--tempest-space-4);border-bottom:1px solid var(--tempest-border);flex:none}
4
+ .tempest_threadWrapper_LjoF6{flex:auto;min-width:0;min-height:0;display:flex;position:relative}
5
+ .tempest_thread_RqELz{gap:var(--tempest-space-5);min-width:0;min-height:0;padding:var(--tempest-space-4);overscroll-behavior:contain;flex-direction:column;flex:auto;display:flex;overflow-y:auto}
6
+ .tempest_thread_RqELz:focus-visible{outline:2px solid var(--tempest-primary);outline-offset:-2px}
7
+ .tempest_jump_oBKxQ{right:var(--tempest-space-4);bottom:var(--tempest-space-3);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-full);background-color:var(--tempest-surface);width:2rem;height:2rem;color:var(--tempest-text);box-shadow:var(--tempest-shadow-md);cursor:pointer;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}
8
+ .tempest_jump_oBKxQ:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:2px}
9
+ @media (pointer:coarse){.tempest_jump_oBKxQ:after{content:"";position:absolute;inset:-6px}}
10
+ .tempest_turn_k7h7J{gap:var(--tempest-space-2);min-width:0;max-width:var(--tempest-ai-chat-width,48rem);flex-direction:column;width:100%;margin-inline:auto;display:flex}
11
+ .tempest_userTurn_7Csx0{align-items:flex-end}
12
+ .tempest_systemTurn_xpQmC{padding:var(--tempest-space-2) var(--tempest-space-3);border:1px dashed var(--tempest-border);border-radius:var(--tempest-radius-md);background-color:var(--tempest-surface);color:var(--tempest-text-muted);font-size:var(--tempest-text-sm)}
13
+ .tempest_turnHeader_l7lv3{align-items:center;gap:var(--tempest-space-2);min-width:0;display:flex}
14
+ .tempest_avatar_XqQ8R{flex:none;display:inline-flex}
15
+ .tempest_role_Vz6Dn{color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);font-weight:var(--tempest-weight-semibold)}
16
+ .tempest_visuallyHiddenRole_raKmR{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}
17
+ .tempest_model_Z55Ho,.tempest_time_o07s8{color:var(--tempest-text-muted);font-size:var(--tempest-text-2xs);font-variant-numeric:tabular-nums}
18
+ .tempest_body_GnhC7{overflow-wrap:anywhere;min-width:0}
19
+ .tempest_userTurn_7Csx0 .tempest_body_GnhC7{padding:var(--tempest-space-2) var(--tempest-space-3);border-radius:var(--tempest-radius-lg);background-color:var(--tempest-primary-soft);color:var(--tempest-primary-on-soft);font-size:var(--tempest-text-sm);line-height:var(--tempest-leading-normal);max-width:min(85%,36rem)}
20
+ .tempest_plain_MRQet{white-space:pre-wrap}
21
+ .tempest_markdownRoot_nem2U{font-size:var(--tempest-text-sm);line-height:var(--tempest-leading-relaxed)}
22
+ .tempest_streamingBody_YMx1->.tempest_markdownRoot_nem2U>:last-child:after{content:"▍";color:var(--tempest-primary);margin-left:.125em;animation:1s steps(2,jump-none) infinite tempest_caretBlink_IpIIw}
23
+ @keyframes tempest_caretBlink_IpIIw{to{opacity:.2}}
24
+ @media (prefers-reduced-motion:reduce){.tempest_streamingBody_YMx1->.tempest_markdownRoot_nem2U>:last-child:after{animation:none}}
25
+ .tempest_dots_FtZUe{align-items:center;gap:3px;display:inline-flex}
26
+ .tempest_dots_FtZUe>span{background-color:var(--tempest-text-subtle);width:5px;height:5px;animation:tempest_dotPulse_nZJHU 1.2s var(--tempest-ease-in-out) infinite;border-radius:50%}
27
+ .tempest_dots_FtZUe>span:nth-child(2){animation-delay:.15s}
28
+ .tempest_dots_FtZUe>span:nth-child(3){animation-delay:.3s}
29
+ @keyframes tempest_dotPulse_nZJHU{0%,60%,to{opacity:.25}30%{opacity:1}}
30
+ @media (prefers-reduced-motion:reduce){.tempest_dots_FtZUe>span{opacity:.6;animation:none}}
31
+ .tempest_thinking_Dk96l{align-items:center;gap:var(--tempest-space-2);max-width:var(--tempest-ai-chat-width,48rem);width:100%;color:var(--tempest-text-muted);font-size:var(--tempest-text-sm);margin:0 auto;display:flex}
32
+ .tempest_reasoning_kJof1{border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-md);background-color:var(--tempest-surface)}
33
+ .tempest_reasoning_kJof1 button[aria-expanded]{color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);font-weight:var(--tempest-weight-medium)}
34
+ .tempest_reasoning_kJof1 button[aria-expanded=true] .tempest_reasoningChevron_TObJ2{transform:rotate(90deg)}
35
+ .tempest_reasoningChevron_TObJ2{transition:transform var(--tempest-duration-fast) var(--tempest-ease-out);flex:none}
36
+ @media (prefers-reduced-motion:reduce){.tempest_reasoningChevron_TObJ2{transition:none}}
37
+ .tempest_reasoningBody_ZR910{color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);line-height:var(--tempest-leading-relaxed);white-space:pre-wrap}
38
+ .tempest_attachments_qQH3a{gap:var(--tempest-space-2);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}
39
+ .tempest_attachment_z4T-R{align-items:center;gap:var(--tempest-space-2);max-width:16rem;padding:var(--tempest-space-1) var(--tempest-space-2);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-md);background-color:var(--tempest-surface);font-size:var(--tempest-text-xs);display:inline-flex}
40
+ .tempest_attachmentName_2DCGR{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}
41
+ .tempest_attachmentMeta_xBy5U{color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);flex:none}
42
+ .tempest_thumb_w70uR{border-radius:var(--tempest-radius-sm);object-fit:cover;width:4rem;height:4rem;display:block}
43
+ .tempest_error_CS0Gp{align-items:center;gap:var(--tempest-space-2);padding:var(--tempest-space-2) var(--tempest-space-3);border:1px solid var(--tempest-danger);border-radius:var(--tempest-radius-md);background-color:var(--tempest-danger-bg);color:var(--tempest-text);font-size:var(--tempest-text-sm);margin:0;display:flex}
44
+ .tempest_retry_8a6Vm{color:var(--tempest-danger);font:inherit;font-weight:var(--tempest-weight-medium);cursor:pointer;background:0 0;border:none;padding:0;text-decoration:underline}
45
+ .tempest_actions_SZnxe{align-items:center;gap:var(--tempest-space-1);opacity:0;transition:opacity var(--tempest-duration-fast) var(--tempest-ease-out);display:flex}
46
+ .tempest_turn_k7h7J:hover .tempest_actions_SZnxe,.tempest_actions_SZnxe:focus-within{opacity:1}
47
+ @media (hover:none){.tempest_actions_SZnxe{opacity:1}}
48
+ @media (prefers-reduced-motion:reduce){.tempest_actions_SZnxe{transition:none}}
49
+ .tempest_actions_SZnxe .tempest_action_YPvQH{border-radius:var(--tempest-radius-sm);width:1.75rem;height:1.75rem;color:var(--tempest-text-muted);cursor:pointer;transition:var(--tempest-transition-color);background:0 0;border:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}
50
+ @media (pointer:coarse){.tempest_actions_SZnxe .tempest_action_YPvQH:after{content:"";position:absolute;inset:-8px}}
51
+ @media (hover:hover) and (pointer:fine){.tempest_actions_SZnxe .tempest_action_YPvQH:hover{background-color:var(--tempest-surface-2);color:var(--tempest-text)}}
52
+ .tempest_actions_SZnxe .tempest_action_YPvQH:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:1px}
53
+ .tempest_actions_SZnxe .tempest_action_YPvQH[data-copied],.tempest_actions_SZnxe .tempest_actionActive_DW5O1{color:var(--tempest-primary);background:0 0}
54
+ @media (prefers-reduced-motion:reduce){.tempest_actions_SZnxe .tempest_action_YPvQH{transition:none}}
55
+ .tempest_editor_rk4hA{gap:var(--tempest-space-2);flex-direction:column;width:100%;max-width:min(85%,36rem);display:flex}
56
+ .tempest_editField_Z9neJ{width:100%;padding:var(--tempest-space-2) var(--tempest-space-3);border:1px solid var(--tempest-primary);border-radius:var(--tempest-radius-lg);background-color:var(--tempest-bg);color:var(--tempest-text);font:inherit;font-size:var(--tempest-text-sm);line-height:var(--tempest-leading-normal);resize:vertical}
57
+ .tempest_editField_Z9neJ:focus-visible{outline:2px solid var(--tempest-primary);outline-offset:-1px}
58
+ .tempest_editActions_vfC0b{justify-content:flex-end;gap:var(--tempest-space-2);display:flex}
59
+ .tempest_ghost_S1yuC{padding:var(--tempest-space-1) var(--tempest-space-3);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-md);color:var(--tempest-text);font:inherit;font-size:var(--tempest-text-sm);cursor:pointer;background-color:#0000}
60
+ .tempest_primary_wZ-Wu{padding:var(--tempest-space-1) var(--tempest-space-3);border-radius:var(--tempest-radius-md);background-color:var(--tempest-primary);color:var(--tempest-primary-foreground);font:inherit;font-size:var(--tempest-text-sm);font-weight:var(--tempest-weight-medium);cursor:pointer;border:none}
61
+ .tempest_primary_wZ-Wu:disabled{background-color:var(--tempest-surface-3);color:var(--tempest-text-subtle);cursor:not-allowed}
62
+ .tempest_suggestions_V7Zhh{align-items:flex-start;gap:var(--tempest-space-2);max-width:var(--tempest-ai-chat-width,48rem);flex-direction:column;width:100%;margin:auto auto 0;display:flex}
63
+ .tempest_suggestionsTitle_Z-wWe{color:var(--tempest-text-muted);font-size:var(--tempest-text-sm);margin:0}
64
+ .tempest_suggestion_4NYhq{padding:var(--tempest-space-2) var(--tempest-space-3);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-md);background-color:var(--tempest-surface);color:var(--tempest-text);font:inherit;font-size:var(--tempest-text-sm);text-align:left;cursor:pointer}
65
+ @media (hover:hover) and (pointer:fine){.tempest_suggestion_4NYhq:hover{background-color:var(--tempest-surface-2)}}
66
+ .tempest_suggestion_4NYhq:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:2px}
67
+ .tempest_composer_AaB1Q{gap:var(--tempest-space-1);padding:var(--tempest-space-3) var(--tempest-space-4);border-top:1px solid var(--tempest-border);flex-direction:column;flex:none;display:flex}
68
+ .tempest_composerBox_Fz-GG{align-items:flex-end;gap:var(--tempest-space-2);max-width:var(--tempest-ai-chat-width,48rem);width:100%;padding:var(--tempest-space-2);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-lg);background-color:var(--tempest-surface);margin-inline:auto;display:flex}
69
+ .tempest_composerBox_Fz-GG:focus-within{border-color:var(--tempest-primary)}
70
+ .tempest_field_7m1Pa{min-width:0;padding:var(--tempest-space-1) var(--tempest-space-2);color:inherit;font:inherit;font-size:var(--tempest-text-sm);line-height:var(--tempest-leading-normal);resize:none;background:0 0;border:none;flex:auto}
71
+ .tempest_field_7m1Pa:focus-visible{outline:none}
72
+ .tempest_field_7m1Pa:disabled{color:var(--tempest-text-subtle);cursor:not-allowed}
73
+ .tempest_composerActions_z1oj9{align-items:center;gap:var(--tempest-space-2);flex:none;display:flex}
74
+ .tempest_composerFooter_WZ1Fo{max-width:var(--tempest-ai-chat-width,48rem);width:100%;padding-inline:var(--tempest-space-2);color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);margin-inline:auto}
75
+ .tempest_send_eVkd6{padding:var(--tempest-space-2) var(--tempest-space-4);border-radius:var(--tempest-radius-md);background-color:var(--tempest-primary);color:var(--tempest-primary-foreground);font:inherit;font-size:var(--tempest-text-sm);font-weight:var(--tempest-weight-medium);cursor:pointer;border:none}
76
+ .tempest_send_eVkd6:disabled{background-color:var(--tempest-surface-3);color:var(--tempest-text-subtle);cursor:not-allowed}
77
+ .tempest_stop_KWS9o{align-items:center;gap:var(--tempest-space-2);padding:var(--tempest-space-2) var(--tempest-space-4);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-md);background-color:var(--tempest-surface-2);color:var(--tempest-text);font:inherit;font-size:var(--tempest-text-sm);font-weight:var(--tempest-weight-medium);cursor:pointer;display:inline-flex}
78
+ .tempest_stopGlyph_Nc19c{background-color:currentColor;border-radius:2px;width:.625rem;height:.625rem;display:inline-block}
79
+ @media (width<=480px){.tempest_thread_RqELz{gap:var(--tempest-space-4);padding:var(--tempest-space-3)}.tempest_userTurn_7Csx0 .tempest_body_GnhC7,.tempest_editor_rk4hA{max-width:100%}.tempest_composer_AaB1Q{padding:var(--tempest-space-2) var(--tempest-space-3)}}
@@ -0,0 +1,12 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_accordion_LVhhv{border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-lg);background-color:var(--tempest-bg);flex-direction:column;width:100%;display:flex;overflow:hidden}
3
+ .tempest_item_7ryVk{border-bottom:1px solid var(--tempest-border)}
4
+ .tempest_item_7ryVk:last-child{border-bottom:none}
5
+ .tempest_header_WaTdJ{margin:0}
6
+ .tempest_trigger_9BYFY{justify-content:space-between;align-items:center;gap:var(--tempest-space-3);width:100%;padding:var(--tempest-space-3) var(--tempest-space-4);text-align:left;color:var(--tempest-text);font-family:var(--tempest-font-sans);font-size:var(--tempest-text-base);font-weight:var(--tempest-weight-semibold);line-height:var(--tempest-leading-snug);cursor:pointer;transition:var(--tempest-transition-color);background:0 0;border:none;display:flex}
7
+ @media (hover:hover) and (pointer:fine){.tempest_trigger_9BYFY:hover{background-color:var(--tempest-surface)}}
8
+ .tempest_trigger_9BYFY:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:-2px}
9
+ .tempest_trigger_9BYFY:disabled{opacity:.55;cursor:not-allowed}
10
+ .tempest_chevron_i-HVZ{transition:transform var(--tempest-duration-base) var(--tempest-ease-emphasized);color:var(--tempest-text-muted);flex-shrink:0}
11
+ .tempest_open_98jLY .tempest_chevron_i-HVZ{transform:rotate(180deg)}
12
+ .tempest_panel_Wx50w{padding:0 var(--tempest-space-4) var(--tempest-space-4);color:var(--tempest-text);line-height:var(--tempest-leading-normal)}
@@ -0,0 +1,32 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_alert_7cYyI{align-items:flex-start;gap:var(--tempest-space-3);padding:var(--tempest-space-3) var(--tempest-space-4);border-radius:var(--tempest-radius-lg);font-family:var(--tempest-font-sans);font-size:var(--tempest-text-base);line-height:var(--tempest-leading-snug);color:var(--tempest-text);border:1px solid #0000;width:100%;display:flex}
3
+ .tempest_content_UXnmZ{flex:1;min-width:0}
4
+ .tempest_title_abGgF{font-size:var(--tempest-text-base);font-weight:var(--tempest-weight-semibold);line-height:var(--tempest-leading-snug);margin:0}
5
+ .tempest_description_pXPvw{font-size:var(--tempest-text-sm);line-height:var(--tempest-leading-snug);color:var(--tempest-text-muted);margin:2px 0 0}
6
+ .tempest_icon_Zg6SB{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;margin-top:1px;display:inline-flex}
7
+ .tempest_close_narep{color:inherit;opacity:.7;border-radius:var(--tempest-radius-sm);transition:var(--tempest-transition-color), opacity var(--tempest-duration-fast) var(--tempest-ease-out);background:0 0;border:none;align-items:center;margin-left:auto;padding:4px;display:flex}
8
+ .tempest_close_narep:hover{opacity:1;background-color:#0f172a0f}
9
+ .tempest_close_narep:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:var(--tempest-focus-ring-offset)}
10
+ .tempest_neutral_J7MH1{background-color:var(--tempest-surface);color:var(--tempest-text);border-color:var(--tempest-border)}
11
+ .tempest_neutral_J7MH1.tempest_solid_s-oW5{background-color:var(--tempest-gray-700);color:#fff;border-color:#0000}
12
+ .tempest_neutral_J7MH1.tempest_outline_v7w9b{border-color:var(--tempest-border-strong);background-color:#0000}
13
+ .tempest_info_9r3r1{background-color:var(--tempest-info-bg);color:var(--tempest-info-fg);border-color:var(--tempest-info-border)}
14
+ .tempest_info_9r3r1 .tempest_description_pXPvw{color:var(--tempest-info-fg);opacity:.85}
15
+ .tempest_info_9r3r1.tempest_solid_s-oW5{background-color:var(--tempest-info-solid);color:var(--tempest-info-on-solid);border-color:#0000}
16
+ .tempest_info_9r3r1.tempest_solid_s-oW5 .tempest_description_pXPvw{color:#ffffffe6}
17
+ .tempest_info_9r3r1.tempest_outline_v7w9b{color:var(--tempest-info);border-color:var(--tempest-info);background-color:#0000}
18
+ .tempest_success_1bzoB{background-color:var(--tempest-success-bg);color:var(--tempest-success-fg);border-color:var(--tempest-success-border)}
19
+ .tempest_success_1bzoB .tempest_description_pXPvw{color:var(--tempest-success-fg);opacity:.85}
20
+ .tempest_success_1bzoB.tempest_solid_s-oW5{background-color:var(--tempest-success-solid);color:var(--tempest-success-on-solid);border-color:#0000}
21
+ .tempest_success_1bzoB.tempest_solid_s-oW5 .tempest_description_pXPvw{color:#ffffffe6}
22
+ .tempest_success_1bzoB.tempest_outline_v7w9b{color:var(--tempest-success);border-color:var(--tempest-success);background-color:#0000}
23
+ .tempest_warning_q-j1Q{background-color:var(--tempest-warning-bg);color:var(--tempest-warning-fg);border-color:var(--tempest-warning-border)}
24
+ .tempest_warning_q-j1Q .tempest_description_pXPvw{color:var(--tempest-warning-fg);opacity:.85}
25
+ .tempest_warning_q-j1Q.tempest_solid_s-oW5{background-color:var(--tempest-warning-solid);color:var(--tempest-warning-on-solid);border-color:#0000}
26
+ .tempest_warning_q-j1Q.tempest_solid_s-oW5 .tempest_description_pXPvw{color:#ffffffe6}
27
+ .tempest_warning_q-j1Q.tempest_outline_v7w9b{color:var(--tempest-warning);border-color:var(--tempest-warning);background-color:#0000}
28
+ .tempest_danger_CiZkW{background-color:var(--tempest-danger-bg);color:var(--tempest-danger-fg);border-color:var(--tempest-danger-border)}
29
+ .tempest_danger_CiZkW .tempest_description_pXPvw{color:var(--tempest-danger-fg);opacity:.85}
30
+ .tempest_danger_CiZkW.tempest_solid_s-oW5{background-color:var(--tempest-danger-solid);color:var(--tempest-danger-on-solid);border-color:#0000}
31
+ .tempest_danger_CiZkW.tempest_solid_s-oW5 .tempest_description_pXPvw{color:#ffffffe6}
32
+ .tempest_danger_CiZkW.tempest_outline_v7w9b{color:var(--tempest-danger);border-color:var(--tempest-danger);background-color:#0000}
@@ -0,0 +1,17 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_bar_SHqWS{align-items:center;gap:var(--tempest-space-2);width:100%;min-height:56px;padding:var(--tempest-space-3) var(--tempest-space-4);font-family:var(--tempest-font-sans);grid-template-columns:auto 1fr auto;display:grid}
3
+ .tempest_bar_SHqWS.tempest_centered_S0CCw{grid-template-columns:1fr auto 1fr}
4
+ .tempest_bar_SHqWS.tempest_surface_fusKb{background:var(--tempest-surface);color:var(--tempest-text)}
5
+ .tempest_bar_SHqWS.tempest_primary_QcCyN{background:var(--tempest-primary);color:var(--tempest-text-on-primary)}
6
+ .tempest_bar_SHqWS.tempest_transparent_uGrsu{color:inherit;background:0 0}
7
+ .tempest_bar_SHqWS.tempest_bordered_5M9FZ{border-bottom:1px solid var(--tempest-border)}
8
+ .tempest_bar_SHqWS.tempest_sticky_DStUO{z-index:30;position:sticky;top:0}
9
+ .tempest_bar_SHqWS.tempest_safeArea_Vo3Bi{padding-top:max(var(--tempest-space-3), env(safe-area-inset-top,0px))}
10
+ .tempest_leading_mXv-d{align-items:center;gap:var(--tempest-space-2);min-width:0;display:flex}
11
+ .tempest_actions_x7tMx{justify-content:flex-end;align-items:center;gap:var(--tempest-space-1);min-width:0;display:flex}
12
+ .tempest_title_qaMMQ{min-width:0;font-size:var(--tempest-text-xl);font-weight:var(--tempest-weight-bold);text-align:left;white-space:nowrap;text-overflow:ellipsis;margin:0;line-height:1.2;overflow:hidden}
13
+ .tempest_bar_SHqWS.tempest_centered_S0CCw .tempest_title_qaMMQ{text-align:center}
14
+ .tempest_brand_xKt54{font-size:var(--tempest-text-lg);font-weight:var(--tempest-weight-bold);color:inherit;white-space:nowrap}
15
+ .tempest_iconBtn_S-BTg{border-radius:var(--tempest-radius-full);width:36px;height:36px;color:inherit;cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}
16
+ .tempest_iconBtn_S-BTg:hover{background:var(--tempest-surface-2)}
17
+ .tempest_iconBtn_S-BTg:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:var(--tempest-focus-ring-offset)}
@@ -0,0 +1,8 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_shell_-xp0O{background:var(--tempest-bg);width:100%;min-height:100dvh;color:var(--tempest-text);font-family:var(--tempest-font-sans);flex-direction:column;display:flex}
3
+ .tempest_navbar_liTKV{flex:none}
4
+ .tempest_row_PE41P{flex:auto;width:100%;min-height:0;display:flex}
5
+ .tempest_sidebar_wyx-V{flex:none}
6
+ .tempest_main_O3GFv{flex:auto;min-width:0;overflow-x:auto}
7
+ .tempest_footer_IFW4q{flex:none}
8
+ .tempest_bottomNav_pKJ1v{z-index:30;flex:none;position:sticky;bottom:0}
@@ -0,0 +1,3 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_aspect_GnAJt{width:100%;position:relative}
3
+ .tempest_aspect_GnAJt>*{width:100%;height:100%}
@@ -0,0 +1,13 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_player_NEgFD{align-items:center;gap:var(--tempest-space-3);min-width:0;padding:var(--tempest-space-2) var(--tempest-space-3);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-lg);background-color:var(--tempest-surface);color:var(--tempest-text);font-family:var(--tempest-font-sans);display:flex}
3
+ .tempest_transport_-7WMK{border-radius:var(--tempest-radius-full);background-color:var(--tempest-primary);width:2.25rem;height:2.25rem;color:var(--tempest-primary-foreground);cursor:pointer;transition:var(--tempest-transition-color);border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}
4
+ .tempest_transport_-7WMK:disabled{background-color:var(--tempest-surface-3);color:var(--tempest-text-subtle);cursor:not-allowed}
5
+ .tempest_transport_-7WMK:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:2px}
6
+ @media (prefers-reduced-motion:reduce){.tempest_transport_-7WMK{transition:none}}
7
+ .tempest_seek_-iy4f{min-width:3rem;height:1.25rem;accent-color:var(--tempest-primary);cursor:pointer;background:0 0;flex:auto;margin:0}
8
+ .tempest_seek_-iy4f:disabled{accent-color:var(--tempest-surface-3);cursor:not-allowed}
9
+ .tempest_seek_-iy4f:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:2px;border-radius:var(--tempest-radius-sm)}
10
+ .tempest_time_zNVm8{gap:var(--tempest-space-1);color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);font-variant-numeric:tabular-nums;flex:none;display:inline-flex}
11
+ .tempest_actions_QZ7Yn{align-items:center;gap:var(--tempest-space-1);flex:none;display:inline-flex}
12
+ @media (pointer:coarse){.tempest_transport_-7WMK:after{content:"";position:absolute;inset:-4px}}
13
+ @media (width<=480px){.tempest_player_NEgFD{gap:var(--tempest-space-2);padding:var(--tempest-space-2)}}
@@ -0,0 +1,20 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_recorder_4p8pT{gap:var(--tempest-space-2);min-width:0;padding:var(--tempest-space-3);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-lg);background-color:var(--tempest-bg);color:var(--tempest-text);font-family:var(--tempest-font-sans);flex-direction:column;display:flex}
3
+ .tempest_row_gNlbi{align-items:center;gap:var(--tempest-space-2);flex-wrap:wrap;min-width:0;display:flex}
4
+ .tempest_record_dhkt8,.tempest_stop_yMMLh,.tempest_secondary_C13wq{align-items:center;gap:var(--tempest-space-2);padding:var(--tempest-space-2) var(--tempest-space-3);border-radius:var(--tempest-radius-md);font:inherit;font-size:var(--tempest-text-sm);font-weight:var(--tempest-weight-medium);cursor:pointer;transition:var(--tempest-transition-color);border:1px solid #0000;flex:none;display:inline-flex;position:relative}
5
+ .tempest_record_dhkt8{background-color:var(--tempest-primary);color:var(--tempest-primary-foreground)}
6
+ .tempest_record_dhkt8:disabled{background-color:var(--tempest-surface-3);color:var(--tempest-text-subtle);cursor:not-allowed}
7
+ .tempest_stop_yMMLh{border-color:var(--tempest-danger);background-color:var(--tempest-danger-bg);color:var(--tempest-danger-fg)}
8
+ .tempest_secondary_C13wq{border-color:var(--tempest-border);background-color:var(--tempest-surface);color:var(--tempest-text);padding-inline:var(--tempest-space-2)}
9
+ .tempest_record_dhkt8:focus-visible,.tempest_stop_yMMLh:focus-visible,.tempest_secondary_C13wq:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:2px}
10
+ @media (prefers-reduced-motion:reduce){.tempest_record_dhkt8,.tempest_stop_yMMLh,.tempest_secondary_C13wq{transition:none}}
11
+ @media (pointer:coarse){.tempest_secondary_C13wq:after{content:"";position:absolute;inset:-6px}}
12
+ .tempest_meter_6QDc9{border-radius:var(--tempest-radius-full);background-color:var(--tempest-surface-2);flex:6rem;min-width:3rem;height:.5rem;overflow:hidden}
13
+ .tempest_meterFill_oUoGY{background-color:var(--tempest-success);transform-origin:0;width:100%;height:100%;transition:transform 80ms linear;display:block;transform:scaleX(0)}
14
+ @media (prefers-reduced-motion:reduce){.tempest_meterFill_oUoGY{transition:none}}
15
+ .tempest_clock_VGvvJ{color:var(--tempest-text);font-size:var(--tempest-text-sm);font-variant-numeric:tabular-nums;flex:none}
16
+ .tempest_max_kx9VL{color:var(--tempest-text-muted)}
17
+ .tempest_status_v2kHH{min-height:1.25em;color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);margin:0}
18
+ .tempest_notice_MtPVY{color:var(--tempest-text-muted);font-size:var(--tempest-text-sm);margin:0}
19
+ .tempest_footer_tfueB{color:var(--tempest-text-muted);font-size:var(--tempest-text-xs)}
20
+ @media (width<=480px){.tempest_recorder_4p8pT{padding:var(--tempest-space-2)}.tempest_meter_6QDc9{flex-basis:100%;order:1}}
@@ -0,0 +1,13 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_avatar_3xMuZ{background-color:var(--tempest-surface-2);color:var(--tempest-text);font-family:var(--tempest-font-sans);font-weight:var(--tempest-weight-semibold);text-transform:uppercase;-webkit-user-select:none;user-select:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;overflow:hidden}
3
+ .tempest_image_ieqGp{object-fit:cover;width:100%;height:100%}
4
+ .tempest_xs_oSaLL{width:24px;height:24px;font-size:var(--tempest-text-2xs)}
5
+ .tempest_sm_sZ2bk{width:32px;height:32px;font-size:var(--tempest-text-xs)}
6
+ .tempest_md_Fdkbz{width:40px;height:40px;font-size:var(--tempest-text-base)}
7
+ .tempest_lg_pTTUA{width:56px;height:56px;font-size:var(--tempest-text-xl)}
8
+ .tempest_xl_mW58F{width:80px;height:80px;font-size:var(--tempest-text-3xl)}
9
+ .tempest_status_ISBnL{position:relative}
10
+ .tempest_dot_Wgfo-{border:2px solid var(--tempest-bg);border-radius:50%;width:28%;height:28%;position:absolute;bottom:0;right:0}
11
+ .tempest_dot_Wgfo-.tempest_online_-aWoW{background-color:var(--tempest-success-solid)}
12
+ .tempest_dot_Wgfo-.tempest_offline_-StX3{background-color:var(--tempest-text-subtle)}
13
+ .tempest_dot_Wgfo-.tempest_busy_TbwuF{background-color:var(--tempest-danger-solid)}
@@ -0,0 +1,18 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_group_qCSYk{align-items:center;display:inline-flex}
3
+ .tempest_slot_KyJQJ{border-radius:var(--tempest-radius-full);box-shadow:0 0 0 2px var(--tempest-bg);display:inline-flex}
4
+ .tempest_slot_KyJQJ+.tempest_slot_KyJQJ{margin-inline-start:var(--tempest-avatar-overlap,-10px)}
5
+ .tempest_xs_PPTP5 .tempest_slot_KyJQJ+.tempest_slot_KyJQJ{margin-inline-start:var(--tempest-avatar-overlap,-8px)}
6
+ .tempest_sm_ptoRA .tempest_slot_KyJQJ+.tempest_slot_KyJQJ{margin-inline-start:var(--tempest-avatar-overlap,-10px)}
7
+ .tempest_md_YbE61 .tempest_slot_KyJQJ+.tempest_slot_KyJQJ{margin-inline-start:var(--tempest-avatar-overlap,-12px)}
8
+ .tempest_lg_oAEMY .tempest_slot_KyJQJ+.tempest_slot_KyJQJ{margin-inline-start:var(--tempest-avatar-overlap,-16px)}
9
+ .tempest_xl_78RZG .tempest_slot_KyJQJ+.tempest_slot_KyJQJ{margin-inline-start:var(--tempest-avatar-overlap,-22px)}
10
+ .tempest_overflow_JZIo-{box-sizing:border-box;border-radius:var(--tempest-radius-full);background-color:var(--tempest-surface-3);width:40px;height:40px;color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);font-weight:var(--tempest-weight-medium);font-variant-numeric:tabular-nums;border:0;justify-content:center;align-items:center;display:inline-flex}
11
+ .tempest_xs_PPTP5 .tempest_overflow_JZIo-{width:24px;height:24px;font-size:var(--tempest-text-2xs)}
12
+ .tempest_sm_ptoRA .tempest_overflow_JZIo-{width:32px;height:32px}
13
+ .tempest_lg_oAEMY .tempest_overflow_JZIo-{width:56px;height:56px;font-size:var(--tempest-text-sm)}
14
+ .tempest_xl_78RZG .tempest_overflow_JZIo-{width:80px;height:80px;font-size:var(--tempest-text-base)}
15
+ .tempest_overflowButton_hSf-2{cursor:pointer;transition:background-color var(--tempest-duration-fast) var(--tempest-ease-out)}
16
+ .tempest_overflowButton_hSf-2:hover{background-color:var(--tempest-border-strong);color:var(--tempest-text)}
17
+ .tempest_overflowButton_hSf-2:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:var(--tempest-focus-ring-offset)}
18
+ @media (prefers-reduced-motion:reduce){.tempest_overflowButton_hSf-2{transition:none}}
@@ -0,0 +1,25 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_badge_RsuMz{align-items:center;gap:var(--tempest-space-1);padding:2px var(--tempest-space-2);border-radius:var(--tempest-radius-full);font-family:var(--tempest-font-sans);font-size:var(--tempest-text-xs);font-weight:var(--tempest-weight-semibold);line-height:var(--tempest-leading-snug);letter-spacing:var(--tempest-tracking-normal);white-space:nowrap;border:1px solid #0000;display:inline-flex}
3
+ .tempest_sm_LYsCn{padding:1px var(--tempest-space-2);font-size:var(--tempest-text-2xs)}
4
+ .tempest_md_4Or8q{padding:2px var(--tempest-space-2);font-size:var(--tempest-text-xs)}
5
+ .tempest_lg_Bseje{padding:3px var(--tempest-space-3);font-size:var(--tempest-text-sm)}
6
+ .tempest_square_l63D-{border-radius:var(--tempest-radius-sm)}
7
+ .tempest_neutral_lulSm{background-color:var(--tempest-surface-2);color:var(--tempest-text)}
8
+ .tempest_neutral_lulSm.tempest_solid_0Leug{background-color:var(--tempest-gray-700);color:#fff}
9
+ .tempest_neutral_lulSm.tempest_outline_x06HL{color:var(--tempest-text);border-color:var(--tempest-border-strong);background-color:#0000}
10
+ .tempest_success_u9JiS{background-color:var(--tempest-success-bg);color:var(--tempest-success-fg)}
11
+ .tempest_success_u9JiS.tempest_solid_0Leug{background-color:var(--tempest-success-solid);color:var(--tempest-success-on-solid)}
12
+ .tempest_success_u9JiS.tempest_outline_x06HL{color:var(--tempest-success);border-color:var(--tempest-success-border);background-color:#0000}
13
+ .tempest_warning_nsGp-{background-color:var(--tempest-warning-bg);color:var(--tempest-warning-fg)}
14
+ .tempest_warning_nsGp-.tempest_solid_0Leug{background-color:var(--tempest-warning-solid);color:var(--tempest-warning-on-solid)}
15
+ .tempest_warning_nsGp-.tempest_outline_x06HL{color:var(--tempest-warning);border-color:var(--tempest-warning-border);background-color:#0000}
16
+ .tempest_danger_PD2hz{background-color:var(--tempest-danger-bg);color:var(--tempest-danger-fg)}
17
+ .tempest_danger_PD2hz.tempest_solid_0Leug{background-color:var(--tempest-danger-solid);color:var(--tempest-danger-on-solid)}
18
+ .tempest_danger_PD2hz.tempest_outline_x06HL{color:var(--tempest-danger);border-color:var(--tempest-danger-border);background-color:#0000}
19
+ .tempest_info_na6DQ{background-color:var(--tempest-info-bg);color:var(--tempest-info-fg)}
20
+ .tempest_info_na6DQ.tempest_solid_0Leug{background-color:var(--tempest-info-solid);color:var(--tempest-info-on-solid)}
21
+ .tempest_info_na6DQ.tempest_outline_x06HL{color:var(--tempest-info);border-color:var(--tempest-info-border);background-color:#0000}
22
+ .tempest_primary_S0WCS{background-color:var(--tempest-primary-soft);color:var(--tempest-primary-on-soft)}
23
+ .tempest_primary_S0WCS.tempest_solid_0Leug{background-color:var(--tempest-primary);color:var(--tempest-primary-foreground)}
24
+ .tempest_primary_S0WCS.tempest_outline_x06HL{color:var(--tempest-primary);border-color:var(--tempest-primary);background-color:#0000}
25
+ .tempest_dot_i0c-G{border-radius:var(--tempest-radius-full);background-color:currentColor;flex-shrink:0;width:6px;height:6px;display:inline-block}
@@ -0,0 +1,13 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_banner_oyoWE{align-items:flex-start;gap:var(--tempest-space-3);padding:var(--tempest-space-3) var(--tempest-space-4);border-radius:var(--tempest-radius-md);width:100%;font-family:var(--tempest-font-sans);font-size:var(--tempest-text-sm);line-height:var(--tempest-leading-snug);border:1px solid;display:flex}
3
+ .tempest_banner_oyoWE.tempest_info_s2q0P{background:var(--tempest-info-bg);color:var(--tempest-info-fg);border-color:var(--tempest-info-border)}
4
+ .tempest_banner_oyoWE.tempest_success_uLYQ3{background:var(--tempest-success-bg);color:var(--tempest-success-fg);border-color:var(--tempest-success-border)}
5
+ .tempest_banner_oyoWE.tempest_warning_9rua8{background:var(--tempest-warning-bg);color:var(--tempest-warning-fg);border-color:var(--tempest-warning-border)}
6
+ .tempest_banner_oyoWE.tempest_danger_Uzb-6{background:var(--tempest-danger-bg);color:var(--tempest-danger-fg);border-color:var(--tempest-danger-border)}
7
+ .tempest_icon_vzKmx{flex:none;align-items:center;line-height:1;display:inline-flex}
8
+ .tempest_body_-Qm4K{flex:auto;min-width:0}
9
+ .tempest_title_AeTHT{margin:0 0 var(--tempest-space-1);font-weight:var(--tempest-weight-semibold)}
10
+ .tempest_description_nbyf-{margin:0}
11
+ .tempest_action_47P8e{flex:none}
12
+ .tempest_close_Iy2oN{color:currentColor;cursor:pointer;border-radius:var(--tempest-radius-sm);background:0 0;border:0;flex:none;width:24px;height:24px;padding:0;font-size:20px;line-height:1}
13
+ .tempest_close_Iy2oN:hover{background:color-mix(in srgb, currentColor 10%, transparent)}
@@ -0,0 +1,10 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_list_XtltA{gap:var(--tempest-space-3,.75rem);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}
3
+ .tempest_item_y-W9f{gap:var(--tempest-space-1,.25rem);flex-direction:column;display:flex}
4
+ .tempest_line_WKQ57{justify-content:space-between;align-items:baseline;gap:var(--tempest-space-3,.75rem);font-size:var(--tempest-font-size-sm,.8125rem);display:flex}
5
+ .tempest_label_AywVf{min-width:0;color:var(--tempest-text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}
6
+ .tempest_value_Y0DD0{align-items:baseline;gap:var(--tempest-space-2,.5rem);color:var(--tempest-text);font-variant-numeric:tabular-nums;white-space:nowrap;display:inline-flex}
7
+ .tempest_percentage_YTyMa{color:var(--tempest-text-subtle);font-size:var(--tempest-font-size-xs,.75rem)}
8
+ .tempest_track_OVSC3{border-radius:var(--tempest-radius-sm,.25rem);background-color:var(--tempest-surface-2);width:100%;height:.5rem;overflow:hidden}
9
+ .tempest_fill_kg-Vl{border-radius:inherit;height:100%;transition:width var(--tempest-duration-normal,.2s) ease}
10
+ @media (prefers-reduced-motion:reduce){.tempest_fill_kg-Vl{transition:none}}
@@ -0,0 +1,21 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_scanner_pIsey{gap:var(--tempest-space-2);min-width:0;color:var(--tempest-text);font-family:var(--tempest-font-sans);flex-direction:column;display:flex}
3
+ .tempest_viewport_PA5gg{border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-lg);background-color:var(--tempest-surface-3);width:100%;position:relative;overflow:hidden}
4
+ .tempest_video_vxiea{object-fit:cover;width:100%;height:100%;display:block}
5
+ .tempest_frame_sWB0M{background-image:linear-gradient(var(--tempest-primary) 0 0), linear-gradient(var(--tempest-primary) 0 0), linear-gradient(var(--tempest-primary) 0 0), linear-gradient(var(--tempest-primary) 0 0), linear-gradient(var(--tempest-primary) 0 0), linear-gradient(var(--tempest-primary) 0 0), linear-gradient(var(--tempest-primary) 0 0), linear-gradient(var(--tempest-primary) 0 0);pointer-events:none;background-position:0 0,0 0,100% 0,100% 0,0 100%,0 100%,100% 100%,100% 100%;background-repeat:no-repeat;background-size:22% 3px,3px 22%,22% 3px,3px 22%,22% 3px,3px 22%,22% 3px,3px 22%;position:absolute;inset:12%}
6
+ .tempest_laser_wloBH{background-color:var(--tempest-primary);opacity:.35;height:2px;position:absolute;top:0;left:0;right:0}
7
+ .tempest_laserActive_cCUwf{opacity:.9;animation:1.6s ease-in-out infinite alternate tempest_tempest-barcode-sweep_UmIe5}
8
+ @keyframes tempest_tempest-barcode-sweep_UmIe5{0%{top:0}to{top:calc(100% - 2px)}}
9
+ @media (prefers-reduced-motion:reduce){.tempest_laserActive_cCUwf{animation:none}}
10
+ .tempest_torch_aw7tt{top:var(--tempest-space-2);right:var(--tempest-space-2);padding:var(--tempest-space-2);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-full);background-color:var(--tempest-surface);color:var(--tempest-text);cursor:pointer;transition:var(--tempest-transition-color);justify-content:center;align-items:center;display:inline-flex;position:absolute}
11
+ .tempest_torch_aw7tt[aria-pressed=true]{border-color:var(--tempest-warning);background-color:var(--tempest-warning-bg);color:var(--tempest-warning-fg)}
12
+ .tempest_torch_aw7tt:focus-visible,.tempest_retry_3K88V:focus-visible{outline:var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);outline-offset:2px}
13
+ @media (prefers-reduced-motion:reduce){.tempest_torch_aw7tt{transition:none}}
14
+ @media (pointer:coarse){.tempest_torch_aw7tt:after{content:"";position:absolute;inset:-8px}}
15
+ .tempest_overlay_ZWMCa{justify-content:center;align-items:center;gap:var(--tempest-space-2);padding:var(--tempest-space-3);background-color:var(--tempest-surface);text-align:center;flex-direction:column;display:flex;position:absolute;inset:0}
16
+ .tempest_overlayText_jBln2{color:var(--tempest-text);font-size:var(--tempest-text-sm);margin:0}
17
+ .tempest_retry_3K88V{padding:var(--tempest-space-2) var(--tempest-space-3);border-radius:var(--tempest-radius-md);background-color:var(--tempest-primary);color:var(--tempest-primary-foreground);font:inherit;font-size:var(--tempest-text-sm);font-weight:var(--tempest-weight-medium);cursor:pointer;border:1px solid #0000}
18
+ .tempest_status_9eKPi{align-items:center;gap:var(--tempest-space-1);min-height:1.25em;color:var(--tempest-text-muted);font-size:var(--tempest-text-xs);margin:0;display:flex}
19
+ .tempest_statusIcon_k2Hmu{flex:none}
20
+ .tempest_notice_ELics{padding:var(--tempest-space-3);border:1px solid var(--tempest-border);border-radius:var(--tempest-radius-lg);background-color:var(--tempest-surface);color:var(--tempest-text-muted);font-size:var(--tempest-text-sm);margin:0}
21
+ .tempest_footer_6SO7U{color:var(--tempest-text-muted);font-size:var(--tempest-text-xs)}
@@ -0,0 +1,10 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_bar_kp35Q{background:var(--tempest-surface);border-top:1px solid var(--tempest-border);width:100%;padding-bottom:env(safe-area-inset-bottom,0);font-family:var(--tempest-font-sans);display:flex}
3
+ .tempest_item_XfDIW{cursor:pointer;color:var(--tempest-text-muted);font-size:var(--tempest-text-2xs);transition:color var(--tempest-duration-fast,.12s) var(--tempest-ease-out,ease-out);background:0 0;border:0;flex-direction:column;flex:1 1 0;justify-content:center;align-items:center;gap:2px;min-height:56px;padding:8px 4px;display:flex}
4
+ .tempest_item_XfDIW:hover{color:var(--tempest-text)}
5
+ .tempest_item_XfDIW.tempest_active_sK54f{color:var(--tempest-primary)}
6
+ .tempest_item_XfDIW:disabled{opacity:.4;cursor:not-allowed}
7
+ .tempest_iconWrap_yJ20b{display:inline-flex;position:relative}
8
+ .tempest_icon_TAjtI{justify-content:center;align-items:center;font-size:20px;line-height:1;display:inline-flex}
9
+ .tempest_badge_-c3Do{border-radius:var(--tempest-radius-full);background:var(--tempest-danger-solid);min-width:14px;height:14px;color:var(--tempest-danger-on-solid);text-align:center;font-size:10px;line-height:14px;font-weight:var(--tempest-weight-semibold);padding:0 4px;position:absolute;top:-4px;right:-8px}
10
+ .tempest_label_qJj3L{line-height:1}
@@ -0,0 +1,11 @@
1
+ /* Generated by scripts/split-css.mjs — do not edit. */
2
+ .tempest_root_qXce2{z-index:60;justify-content:center;align-items:flex-end;display:flex;position:fixed;inset:0}
3
+ .tempest_backdrop_WLqh0{animation:tempest_fadeIn_fyyhf var(--tempest-duration-base,.2s) var(--tempest-ease-out,ease-out);background:#00000073;position:absolute;inset:0}
4
+ .tempest_sheet_Okz1P{background:var(--tempest-surface);border-top-left-radius:var(--tempest-radius-2xl,var(--tempest-radius-lg));border-top-right-radius:var(--tempest-radius-2xl,var(--tempest-radius-lg));width:100%;max-width:720px;max-height:90dvh;box-shadow:var(--tempest-shadow-xl,0 -10px 30px #00000040);padding-bottom:env(safe-area-inset-bottom,0);animation:tempest_slideUp_CSrpB var(--tempest-duration-base,.24s) var(--tempest-ease-out,ease-out);font-family:var(--tempest-font-sans);flex-direction:column;display:flex;position:relative;overflow:hidden}
5
+ .tempest_handle_GWCoK{padding:var(--tempest-space-2) 0;cursor:grab;background:0 0;border:0;flex:none;justify-content:center;align-items:center;display:flex}
6
+ .tempest_handleBar_XPPiI{background:var(--tempest-gray-300);border-radius:var(--tempest-radius-full);width:36px;height:4px;display:block}
7
+ .tempest_title_i5Vuc{padding:var(--tempest-space-2) var(--tempest-space-4) var(--tempest-space-3);font-size:var(--tempest-text-lg);font-weight:var(--tempest-weight-semibold);color:var(--tempest-text);border-bottom:1px solid var(--tempest-border);flex:none}
8
+ .tempest_body_bgDhJ{padding:var(--tempest-space-4);color:var(--tempest-text);flex:auto;overflow-y:auto}
9
+ @keyframes tempest_fadeIn_fyyhf{0%{opacity:0}to{opacity:1}}
10
+ @keyframes tempest_slideUp_CSrpB{0%{transform:translateY(100%)}to{transform:translateY(0)}}
11
+ @media (prefers-reduced-motion:reduce){.tempest_backdrop_WLqh0,.tempest_sheet_Okz1P{animation:none}}