tempest-react-sdk 0.47.0 → 0.49.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 (539) hide show
  1. package/dist/audio/sfx-pool.cjs +1 -1
  2. package/dist/audio/sfx-pool.cjs.map +1 -1
  3. package/dist/audio/sfx-pool.js +16 -7
  4. package/dist/audio/sfx-pool.js.map +1 -1
  5. package/dist/audio/use-sfx-pool.cjs +1 -1
  6. package/dist/audio/use-sfx-pool.cjs.map +1 -1
  7. package/dist/audio/use-sfx-pool.js +3 -8
  8. package/dist/audio/use-sfx-pool.js.map +1 -1
  9. package/dist/auth/passkey.cjs +1 -1
  10. package/dist/auth/passkey.cjs.map +1 -1
  11. package/dist/auth/passkey.js +79 -81
  12. package/dist/auth/passkey.js.map +1 -1
  13. package/dist/charts.cjs +1 -1
  14. package/dist/charts.js +4 -4
  15. package/dist/components/AIChat/AIChatTurn.cjs +1 -1
  16. package/dist/components/AIChat/AIChatTurn.js +4 -4
  17. package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
  18. package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
  19. package/dist/components/BarList/BarList.cjs +1 -1
  20. package/dist/components/BarList/BarList.cjs.map +1 -1
  21. package/dist/components/BarList/BarList.js +31 -24
  22. package/dist/components/BarList/BarList.js.map +1 -1
  23. package/dist/components/BarList/bar-list-model.cjs +1 -1
  24. package/dist/components/BarList/bar-list-model.cjs.map +1 -1
  25. package/dist/components/BarList/bar-list-model.js +5 -5
  26. package/dist/components/BarList/bar-list-model.js.map +1 -1
  27. package/dist/components/ClickOutside/ClickOutside.cjs +1 -1
  28. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  29. package/dist/components/ClickOutside/ClickOutside.js +13 -14
  30. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  31. package/dist/components/DataTable/DataTable.cjs +1 -1
  32. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  33. package/dist/components/DataTable/DataTable.js +131 -129
  34. package/dist/components/DataTable/DataTable.js.map +1 -1
  35. package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
  36. package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
  37. package/dist/components/FilterBar/filter-apply.cjs +1 -1
  38. package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
  39. package/dist/components/FilterBar/filter-apply.js +35 -38
  40. package/dist/components/FilterBar/filter-apply.js.map +1 -1
  41. package/dist/components/FilterBar/filter-query.cjs +1 -1
  42. package/dist/components/FilterBar/filter-query.cjs.map +1 -1
  43. package/dist/components/FilterBar/filter-query.js +16 -13
  44. package/dist/components/FilterBar/filter-query.js.map +1 -1
  45. package/dist/components/NotificationCenter/NotificationCenter.cjs +1 -1
  46. package/dist/components/NotificationCenter/NotificationCenter.js +21 -21
  47. package/dist/components/Sidebar/Sidebar.cjs +1 -1
  48. package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
  49. package/dist/components/Sidebar/Sidebar.js +91 -38
  50. package/dist/components/Sidebar/Sidebar.js.map +1 -1
  51. package/dist/components/Sidebar/Sidebar.module.cjs +1 -1
  52. package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
  53. package/dist/components/Sidebar/Sidebar.module.js +12 -8
  54. package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
  55. package/dist/forms/masked-inputs.cjs +1 -1
  56. package/dist/forms/masked-inputs.js +12 -12
  57. package/dist/geo/use-position-tracker.cjs +1 -1
  58. package/dist/geo/use-position-tracker.cjs.map +1 -1
  59. package/dist/geo/use-position-tracker.js +25 -26
  60. package/dist/geo/use-position-tracker.js.map +1 -1
  61. package/dist/hooks/use-async.cjs +1 -1
  62. package/dist/hooks/use-async.cjs.map +1 -1
  63. package/dist/hooks/use-async.js +27 -30
  64. package/dist/hooks/use-async.js.map +1 -1
  65. package/dist/hooks/use-click-outside.cjs +1 -1
  66. package/dist/hooks/use-click-outside.cjs.map +1 -1
  67. package/dist/hooks/use-click-outside.js +8 -9
  68. package/dist/hooks/use-click-outside.js.map +1 -1
  69. package/dist/hooks/use-countdown.cjs +1 -1
  70. package/dist/hooks/use-countdown.cjs.map +1 -1
  71. package/dist/hooks/use-countdown.js +8 -13
  72. package/dist/hooks/use-countdown.js.map +1 -1
  73. package/dist/hooks/use-event-listener.cjs +1 -1
  74. package/dist/hooks/use-event-listener.cjs.map +1 -1
  75. package/dist/hooks/use-event-listener.js +6 -6
  76. package/dist/hooks/use-event-listener.js.map +1 -1
  77. package/dist/hooks/use-interval.cjs +1 -1
  78. package/dist/hooks/use-interval.cjs.map +1 -1
  79. package/dist/hooks/use-interval.js +5 -6
  80. package/dist/hooks/use-interval.js.map +1 -1
  81. package/dist/hooks/use-latest-ref.cjs.map +1 -1
  82. package/dist/hooks/use-latest-ref.js.map +1 -1
  83. package/dist/hooks/use-long-press-handlers.cjs +1 -1
  84. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  85. package/dist/hooks/use-long-press-handlers.js +8 -10
  86. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  87. package/dist/hooks/use-long-press.cjs +1 -1
  88. package/dist/hooks/use-long-press.cjs.map +1 -1
  89. package/dist/hooks/use-long-press.js +6 -6
  90. package/dist/hooks/use-long-press.js.map +1 -1
  91. package/dist/hooks/use-online.cjs +1 -1
  92. package/dist/hooks/use-online.cjs.map +1 -1
  93. package/dist/hooks/use-online.js +10 -10
  94. package/dist/hooks/use-online.js.map +1 -1
  95. package/dist/hooks/use-service-worker-update.cjs +1 -1
  96. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  97. package/dist/hooks/use-service-worker-update.js +24 -25
  98. package/dist/hooks/use-service-worker-update.js.map +1 -1
  99. package/dist/hooks/use-stable-callback.cjs +1 -1
  100. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  101. package/dist/hooks/use-stable-callback.js +4 -3
  102. package/dist/hooks/use-stable-callback.js.map +1 -1
  103. package/dist/hooks/use-timeout.cjs +1 -1
  104. package/dist/hooks/use-timeout.cjs.map +1 -1
  105. package/dist/hooks/use-timeout.js +5 -6
  106. package/dist/hooks/use-timeout.js.map +1 -1
  107. package/dist/hooks/use-typewriter.cjs +1 -1
  108. package/dist/hooks/use-typewriter.cjs.map +1 -1
  109. package/dist/hooks/use-typewriter.js +9 -18
  110. package/dist/hooks/use-typewriter.js.map +1 -1
  111. package/dist/http/api-client.cjs +1 -1
  112. package/dist/http/api-client.cjs.map +1 -1
  113. package/dist/http/api-client.js +55 -46
  114. package/dist/http/api-client.js.map +1 -1
  115. package/dist/http/describe-api-error.cjs +1 -1
  116. package/dist/http/describe-api-error.cjs.map +1 -1
  117. package/dist/http/describe-api-error.js +15 -14
  118. package/dist/http/describe-api-error.js.map +1 -1
  119. package/dist/http/errors.cjs +1 -1
  120. package/dist/http/errors.cjs.map +1 -1
  121. package/dist/http/errors.js +49 -20
  122. package/dist/http/errors.js.map +1 -1
  123. package/dist/http/resumable-upload.cjs +1 -1
  124. package/dist/http/resumable-upload.cjs.map +1 -1
  125. package/dist/http/resumable-upload.js +60 -61
  126. package/dist/http/resumable-upload.js.map +1 -1
  127. package/dist/http/retry.cjs +1 -1
  128. package/dist/http/retry.cjs.map +1 -1
  129. package/dist/http/retry.js +20 -16
  130. package/dist/http/retry.js.map +1 -1
  131. package/dist/http/use-describe-api-error.cjs +1 -1
  132. package/dist/http/use-describe-api-error.cjs.map +1 -1
  133. package/dist/http/use-describe-api-error.js +14 -10
  134. package/dist/http/use-describe-api-error.js.map +1 -1
  135. package/dist/i18n/create-i18n.cjs +1 -1
  136. package/dist/i18n/create-i18n.cjs.map +1 -1
  137. package/dist/i18n/create-i18n.js +6 -6
  138. package/dist/i18n/create-i18n.js.map +1 -1
  139. package/dist/icons/Icon.cjs +1 -1
  140. package/dist/icons/Icon.cjs.map +1 -1
  141. package/dist/icons/Icon.js +15 -14
  142. package/dist/icons/Icon.js.map +1 -1
  143. package/dist/icons/IconPicker.cjs +2 -0
  144. package/dist/icons/IconPicker.cjs.map +1 -0
  145. package/dist/icons/IconPicker.js +49 -0
  146. package/dist/icons/IconPicker.js.map +1 -0
  147. package/dist/icons/IconPicker.module.cjs +2 -0
  148. package/dist/icons/IconPicker.module.cjs.map +1 -0
  149. package/dist/icons/IconPicker.module.js +10 -0
  150. package/dist/icons/IconPicker.module.js.map +1 -0
  151. package/dist/icons/alias.cjs +2 -0
  152. package/dist/icons/alias.cjs.map +1 -0
  153. package/dist/icons/alias.js +9 -0
  154. package/dist/icons/alias.js.map +1 -0
  155. package/dist/icons/generated/loaders.cjs +1 -1
  156. package/dist/icons/generated/loaders.cjs.map +1 -1
  157. package/dist/icons/generated/loaders.js +273 -28
  158. package/dist/icons/generated/loaders.js.map +1 -1
  159. package/dist/icons/generated/shard-00.cjs +2 -0
  160. package/dist/icons/generated/shard-00.cjs.map +1 -0
  161. package/dist/icons/generated/shard-00.js +48 -0
  162. package/dist/icons/generated/shard-00.js.map +1 -0
  163. package/dist/icons/generated/shard-01.cjs +2 -0
  164. package/dist/icons/generated/shard-01.cjs.map +1 -0
  165. package/dist/icons/generated/shard-01.js +48 -0
  166. package/dist/icons/generated/shard-01.js.map +1 -0
  167. package/dist/icons/generated/shard-02.cjs +2 -0
  168. package/dist/icons/generated/shard-02.cjs.map +1 -0
  169. package/dist/icons/generated/shard-02.js +48 -0
  170. package/dist/icons/generated/shard-02.js.map +1 -0
  171. package/dist/icons/generated/shard-03.cjs +2 -0
  172. package/dist/icons/generated/shard-03.cjs.map +1 -0
  173. package/dist/icons/generated/shard-03.js +48 -0
  174. package/dist/icons/generated/shard-03.js.map +1 -0
  175. package/dist/icons/generated/shard-04.cjs +2 -0
  176. package/dist/icons/generated/shard-04.cjs.map +1 -0
  177. package/dist/icons/generated/shard-04.js +48 -0
  178. package/dist/icons/generated/shard-04.js.map +1 -0
  179. package/dist/icons/generated/shard-05.cjs +2 -0
  180. package/dist/icons/generated/shard-05.cjs.map +1 -0
  181. package/dist/icons/generated/shard-05.js +48 -0
  182. package/dist/icons/generated/shard-05.js.map +1 -0
  183. package/dist/icons/generated/shard-06.cjs +2 -0
  184. package/dist/icons/generated/shard-06.cjs.map +1 -0
  185. package/dist/icons/generated/shard-06.js +48 -0
  186. package/dist/icons/generated/shard-06.js.map +1 -0
  187. package/dist/icons/generated/shard-07.cjs +2 -0
  188. package/dist/icons/generated/shard-07.cjs.map +1 -0
  189. package/dist/icons/generated/shard-07.js +48 -0
  190. package/dist/icons/generated/shard-07.js.map +1 -0
  191. package/dist/icons/generated/shard-08.cjs +2 -0
  192. package/dist/icons/generated/shard-08.cjs.map +1 -0
  193. package/dist/icons/generated/shard-08.js +48 -0
  194. package/dist/icons/generated/shard-08.js.map +1 -0
  195. package/dist/icons/generated/shard-09.cjs +2 -0
  196. package/dist/icons/generated/shard-09.cjs.map +1 -0
  197. package/dist/icons/generated/shard-09.js +48 -0
  198. package/dist/icons/generated/shard-09.js.map +1 -0
  199. package/dist/icons/generated/shard-10.cjs +2 -0
  200. package/dist/icons/generated/shard-10.cjs.map +1 -0
  201. package/dist/icons/generated/shard-10.js +48 -0
  202. package/dist/icons/generated/shard-10.js.map +1 -0
  203. package/dist/icons/generated/shard-11.cjs +2 -0
  204. package/dist/icons/generated/shard-11.cjs.map +1 -0
  205. package/dist/icons/generated/shard-11.js +48 -0
  206. package/dist/icons/generated/shard-11.js.map +1 -0
  207. package/dist/icons/generated/shard-12.cjs +2 -0
  208. package/dist/icons/generated/shard-12.cjs.map +1 -0
  209. package/dist/icons/generated/shard-12.js +48 -0
  210. package/dist/icons/generated/shard-12.js.map +1 -0
  211. package/dist/icons/generated/shard-13.cjs +2 -0
  212. package/dist/icons/generated/shard-13.cjs.map +1 -0
  213. package/dist/icons/generated/shard-13.js +48 -0
  214. package/dist/icons/generated/shard-13.js.map +1 -0
  215. package/dist/icons/generated/shard-14.cjs +2 -0
  216. package/dist/icons/generated/shard-14.cjs.map +1 -0
  217. package/dist/icons/generated/shard-14.js +48 -0
  218. package/dist/icons/generated/shard-14.js.map +1 -0
  219. package/dist/icons/generated/shard-15.cjs +2 -0
  220. package/dist/icons/generated/shard-15.cjs.map +1 -0
  221. package/dist/icons/generated/shard-15.js +48 -0
  222. package/dist/icons/generated/shard-15.js.map +1 -0
  223. package/dist/icons/generated/shard-16.cjs +2 -0
  224. package/dist/icons/generated/shard-16.cjs.map +1 -0
  225. package/dist/icons/generated/shard-16.js +48 -0
  226. package/dist/icons/generated/shard-16.js.map +1 -0
  227. package/dist/icons/generated/shard-17.cjs +2 -0
  228. package/dist/icons/generated/shard-17.cjs.map +1 -0
  229. package/dist/icons/generated/shard-17.js +48 -0
  230. package/dist/icons/generated/shard-17.js.map +1 -0
  231. package/dist/icons/generated/shard-18.cjs +2 -0
  232. package/dist/icons/generated/shard-18.cjs.map +1 -0
  233. package/dist/icons/generated/shard-18.js +48 -0
  234. package/dist/icons/generated/shard-18.js.map +1 -0
  235. package/dist/icons/generated/shard-19.cjs +2 -0
  236. package/dist/icons/generated/shard-19.cjs.map +1 -0
  237. package/dist/icons/generated/shard-19.js +48 -0
  238. package/dist/icons/generated/shard-19.js.map +1 -0
  239. package/dist/icons/generated/shard-20.cjs +2 -0
  240. package/dist/icons/generated/shard-20.cjs.map +1 -0
  241. package/dist/icons/generated/shard-20.js +48 -0
  242. package/dist/icons/generated/shard-20.js.map +1 -0
  243. package/dist/icons/generated/shard-21.cjs +2 -0
  244. package/dist/icons/generated/shard-21.cjs.map +1 -0
  245. package/dist/icons/generated/shard-21.js +48 -0
  246. package/dist/icons/generated/shard-21.js.map +1 -0
  247. package/dist/icons/generated/shard-22.cjs +2 -0
  248. package/dist/icons/generated/shard-22.cjs.map +1 -0
  249. package/dist/icons/generated/shard-22.js +48 -0
  250. package/dist/icons/generated/shard-22.js.map +1 -0
  251. package/dist/icons/generated/shard-23.cjs +2 -0
  252. package/dist/icons/generated/shard-23.cjs.map +1 -0
  253. package/dist/icons/generated/shard-23.js +48 -0
  254. package/dist/icons/generated/shard-23.js.map +1 -0
  255. package/dist/icons/generated/shard-24.cjs +2 -0
  256. package/dist/icons/generated/shard-24.cjs.map +1 -0
  257. package/dist/icons/generated/shard-24.js +48 -0
  258. package/dist/icons/generated/shard-24.js.map +1 -0
  259. package/dist/icons/generated/shard-25.cjs +2 -0
  260. package/dist/icons/generated/shard-25.cjs.map +1 -0
  261. package/dist/icons/generated/shard-25.js +48 -0
  262. package/dist/icons/generated/shard-25.js.map +1 -0
  263. package/dist/icons/generated/shard-26.cjs +2 -0
  264. package/dist/icons/generated/shard-26.cjs.map +1 -0
  265. package/dist/icons/generated/shard-26.js +48 -0
  266. package/dist/icons/generated/shard-26.js.map +1 -0
  267. package/dist/icons/generated/shard-27.cjs +2 -0
  268. package/dist/icons/generated/shard-27.cjs.map +1 -0
  269. package/dist/icons/generated/shard-27.js +48 -0
  270. package/dist/icons/generated/shard-27.js.map +1 -0
  271. package/dist/icons/generated/shard-28.cjs +2 -0
  272. package/dist/icons/generated/shard-28.cjs.map +1 -0
  273. package/dist/icons/generated/shard-28.js +48 -0
  274. package/dist/icons/generated/shard-28.js.map +1 -0
  275. package/dist/icons/generated/shard-29.cjs +2 -0
  276. package/dist/icons/generated/shard-29.cjs.map +1 -0
  277. package/dist/icons/generated/shard-29.js +48 -0
  278. package/dist/icons/generated/shard-29.js.map +1 -0
  279. package/dist/icons/generated/shard-30.cjs +2 -0
  280. package/dist/icons/generated/shard-30.cjs.map +1 -0
  281. package/dist/icons/generated/shard-30.js +48 -0
  282. package/dist/icons/generated/shard-30.js.map +1 -0
  283. package/dist/icons/generated/shard-31.cjs +2 -0
  284. package/dist/icons/generated/shard-31.cjs.map +1 -0
  285. package/dist/icons/generated/shard-31.js +48 -0
  286. package/dist/icons/generated/shard-31.js.map +1 -0
  287. package/dist/icons/generated/shard-32.cjs +2 -0
  288. package/dist/icons/generated/shard-32.cjs.map +1 -0
  289. package/dist/icons/generated/shard-32.js +48 -0
  290. package/dist/icons/generated/shard-32.js.map +1 -0
  291. package/dist/icons/generated/shard-33.cjs +2 -0
  292. package/dist/icons/generated/shard-33.cjs.map +1 -0
  293. package/dist/icons/generated/shard-33.js +48 -0
  294. package/dist/icons/generated/shard-33.js.map +1 -0
  295. package/dist/icons/generated/shard-34.cjs +2 -0
  296. package/dist/icons/generated/shard-34.cjs.map +1 -0
  297. package/dist/icons/generated/shard-34.js +48 -0
  298. package/dist/icons/generated/shard-34.js.map +1 -0
  299. package/dist/icons/generated/shard-35.cjs +2 -0
  300. package/dist/icons/generated/shard-35.cjs.map +1 -0
  301. package/dist/icons/generated/shard-35.js +48 -0
  302. package/dist/icons/generated/shard-35.js.map +1 -0
  303. package/dist/icons/generated/shard-36.cjs +2 -0
  304. package/dist/icons/generated/shard-36.cjs.map +1 -0
  305. package/dist/icons/generated/shard-36.js +48 -0
  306. package/dist/icons/generated/shard-36.js.map +1 -0
  307. package/dist/icons/generated/shard-37.cjs +2 -0
  308. package/dist/icons/generated/shard-37.cjs.map +1 -0
  309. package/dist/icons/generated/shard-37.js +48 -0
  310. package/dist/icons/generated/shard-37.js.map +1 -0
  311. package/dist/icons/generated/shard-38.cjs +2 -0
  312. package/dist/icons/generated/shard-38.cjs.map +1 -0
  313. package/dist/icons/generated/shard-38.js +48 -0
  314. package/dist/icons/generated/shard-38.js.map +1 -0
  315. package/dist/icons/generated/shard-39.cjs +2 -0
  316. package/dist/icons/generated/shard-39.cjs.map +1 -0
  317. package/dist/icons/generated/shard-39.js +48 -0
  318. package/dist/icons/generated/shard-39.js.map +1 -0
  319. package/dist/icons/generated/shard-40.cjs +2 -0
  320. package/dist/icons/generated/shard-40.cjs.map +1 -0
  321. package/dist/icons/generated/shard-40.js +48 -0
  322. package/dist/icons/generated/shard-40.js.map +1 -0
  323. package/dist/icons/generated/shard-41.cjs +2 -0
  324. package/dist/icons/generated/shard-41.cjs.map +1 -0
  325. package/dist/icons/generated/shard-41.js +48 -0
  326. package/dist/icons/generated/shard-41.js.map +1 -0
  327. package/dist/icons/generated/shard-42.cjs +2 -0
  328. package/dist/icons/generated/shard-42.cjs.map +1 -0
  329. package/dist/icons/generated/shard-42.js +48 -0
  330. package/dist/icons/generated/shard-42.js.map +1 -0
  331. package/dist/icons/generated/shard-43.cjs +2 -0
  332. package/dist/icons/generated/shard-43.cjs.map +1 -0
  333. package/dist/icons/generated/shard-43.js +48 -0
  334. package/dist/icons/generated/shard-43.js.map +1 -0
  335. package/dist/icons/generated/shard-44.cjs +2 -0
  336. package/dist/icons/generated/shard-44.cjs.map +1 -0
  337. package/dist/icons/generated/shard-44.js +15 -0
  338. package/dist/icons/generated/shard-44.js.map +1 -0
  339. package/dist/icons/material-symbols.cjs +1 -1
  340. package/dist/icons/material-symbols.cjs.map +1 -1
  341. package/dist/icons/material-symbols.js +240 -1
  342. package/dist/icons/material-symbols.js.map +1 -1
  343. package/dist/icons/normalize-icon-name.cjs +2 -0
  344. package/dist/icons/normalize-icon-name.cjs.map +1 -0
  345. package/dist/icons/normalize-icon-name.js +9 -0
  346. package/dist/icons/normalize-icon-name.js.map +1 -0
  347. package/dist/icons/shard-cache.cjs +1 -1
  348. package/dist/icons/shard-cache.cjs.map +1 -1
  349. package/dist/icons/shard-cache.js +85 -32
  350. package/dist/icons/shard-cache.js.map +1 -1
  351. package/dist/icons/validate-icon-name.cjs +2 -0
  352. package/dist/icons/validate-icon-name.cjs.map +1 -0
  353. package/dist/icons/validate-icon-name.js +11 -0
  354. package/dist/icons/validate-icon-name.js.map +1 -0
  355. package/dist/icons-virtual-id.d.ts +24 -0
  356. package/dist/icons-virtual.cjs +2 -0
  357. package/dist/icons-virtual.cjs.map +1 -0
  358. package/dist/icons-virtual.d.ts +30 -22
  359. package/dist/icons-virtual.js +6 -0
  360. package/dist/icons-virtual.js.map +1 -0
  361. package/dist/icons.cjs +1 -1
  362. package/dist/icons.d.ts +282 -33
  363. package/dist/icons.js +11 -7
  364. package/dist/offline/create-offline-sync.cjs +1 -1
  365. package/dist/offline/create-offline-sync.cjs.map +1 -1
  366. package/dist/offline/create-offline-sync.js +17 -9
  367. package/dist/offline/create-offline-sync.js.map +1 -1
  368. package/dist/offline/use-offline-sync.cjs +1 -1
  369. package/dist/offline/use-offline-sync.cjs.map +1 -1
  370. package/dist/offline/use-offline-sync.js +7 -8
  371. package/dist/offline/use-offline-sync.js.map +1 -1
  372. package/dist/push/use-push-subscription.cjs +1 -1
  373. package/dist/push/use-push-subscription.cjs.map +1 -1
  374. package/dist/push/use-push-subscription.js +13 -12
  375. package/dist/push/use-push-subscription.js.map +1 -1
  376. package/dist/query/retry-policy.cjs +1 -1
  377. package/dist/query/retry-policy.cjs.map +1 -1
  378. package/dist/query/retry-policy.js +3 -3
  379. package/dist/query/retry-policy.js.map +1 -1
  380. package/dist/sse/use-event-stream.cjs +1 -1
  381. package/dist/sse/use-event-stream.cjs.map +1 -1
  382. package/dist/sse/use-event-stream.js +19 -20
  383. package/dist/sse/use-event-stream.js.map +1 -1
  384. package/dist/styles.css +1 -1
  385. package/dist/tabular/use-tabular-predictor.cjs +1 -1
  386. package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
  387. package/dist/tabular/use-tabular-predictor.js +20 -17
  388. package/dist/tabular/use-tabular-predictor.js.map +1 -1
  389. package/dist/tempest-react-sdk.cjs +1 -1
  390. package/dist/tempest-react-sdk.d.ts +458 -213
  391. package/dist/tempest-react-sdk.js +328 -329
  392. package/dist/theme/ThemeProvider.cjs +1 -1
  393. package/dist/theme/ThemeProvider.cjs.map +1 -1
  394. package/dist/theme/ThemeProvider.js +12 -17
  395. package/dist/theme/ThemeProvider.js.map +1 -1
  396. package/dist/utils/base64.cjs +2 -0
  397. package/dist/utils/base64.cjs.map +1 -0
  398. package/dist/utils/base64.js +16 -0
  399. package/dist/utils/base64.js.map +1 -0
  400. package/dist/utils/compare-values.cjs +1 -1
  401. package/dist/utils/compare-values.cjs.map +1 -1
  402. package/dist/utils/compare-values.js +4 -3
  403. package/dist/utils/compare-values.js.map +1 -1
  404. package/dist/utils/compressed-storage.cjs +1 -1
  405. package/dist/utils/compressed-storage.cjs.map +1 -1
  406. package/dist/utils/compressed-storage.js +16 -46
  407. package/dist/utils/compressed-storage.js.map +1 -1
  408. package/dist/utils/dev-mode.cjs.map +1 -1
  409. package/dist/utils/dev-mode.js.map +1 -1
  410. package/dist/utils/storage.cjs +1 -1
  411. package/dist/utils/storage.cjs.map +1 -1
  412. package/dist/utils/storage.js +37 -17
  413. package/dist/utils/storage.js.map +1 -1
  414. package/dist/vision/use-camera-stream.cjs +1 -1
  415. package/dist/vision/use-camera-stream.cjs.map +1 -1
  416. package/dist/vision/use-camera-stream.js +34 -33
  417. package/dist/vision/use-camera-stream.js.map +1 -1
  418. package/dist/vite/base-url.cjs +2 -0
  419. package/dist/vite/base-url.cjs.map +1 -0
  420. package/dist/vite/base-url.js +8 -0
  421. package/dist/vite/base-url.js.map +1 -0
  422. package/dist/vite/tempest-icons.cjs +4 -4
  423. package/dist/vite/tempest-icons.cjs.map +1 -1
  424. package/dist/vite/tempest-icons.js +26 -26
  425. package/dist/vite/tempest-icons.js.map +1 -1
  426. package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
  427. package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
  428. package/dist/vite/tempest-pwa-dev-sw.js +54 -29
  429. package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
  430. package/dist/vite/tempest-pwa-manifest.cjs +2 -2
  431. package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
  432. package/dist/vite/tempest-pwa-manifest.js +15 -14
  433. package/dist/vite/tempest-pwa-manifest.js.map +1 -1
  434. package/dist/vite.d.ts +3 -3
  435. package/dist/ws/use-web-socket.cjs +1 -1
  436. package/dist/ws/use-web-socket.cjs.map +1 -1
  437. package/dist/ws/use-web-socket.js +40 -42
  438. package/dist/ws/use-web-socket.js.map +1 -1
  439. package/package.json +5 -2
  440. package/dist/icons/generated/shard-a.cjs +0 -2
  441. package/dist/icons/generated/shard-a.cjs.map +0 -1
  442. package/dist/icons/generated/shard-a.js +0 -114
  443. package/dist/icons/generated/shard-a.js.map +0 -1
  444. package/dist/icons/generated/shard-b.cjs +0 -2
  445. package/dist/icons/generated/shard-b.cjs.map +0 -1
  446. package/dist/icons/generated/shard-b.js +0 -158
  447. package/dist/icons/generated/shard-b.js.map +0 -1
  448. package/dist/icons/generated/shard-c.cjs +0 -2
  449. package/dist/icons/generated/shard-c.cjs.map +0 -1
  450. package/dist/icons/generated/shard-c.js +0 -269
  451. package/dist/icons/generated/shard-c.js.map +0 -1
  452. package/dist/icons/generated/shard-d.cjs +0 -2
  453. package/dist/icons/generated/shard-d.cjs.map +0 -1
  454. package/dist/icons/generated/shard-d.js +0 -62
  455. package/dist/icons/generated/shard-d.js.map +0 -1
  456. package/dist/icons/generated/shard-e.cjs +0 -2
  457. package/dist/icons/generated/shard-e.cjs.map +0 -1
  458. package/dist/icons/generated/shard-e.js +0 -33
  459. package/dist/icons/generated/shard-e.js.map +0 -1
  460. package/dist/icons/generated/shard-f.cjs +0 -2
  461. package/dist/icons/generated/shard-f.cjs.map +0 -1
  462. package/dist/icons/generated/shard-f.js +0 -145
  463. package/dist/icons/generated/shard-f.js.map +0 -1
  464. package/dist/icons/generated/shard-g.cjs +0 -2
  465. package/dist/icons/generated/shard-g.cjs.map +0 -1
  466. package/dist/icons/generated/shard-g.js +0 -61
  467. package/dist/icons/generated/shard-g.js.map +0 -1
  468. package/dist/icons/generated/shard-h.cjs +0 -2
  469. package/dist/icons/generated/shard-h.cjs.map +0 -1
  470. package/dist/icons/generated/shard-h.js +0 -62
  471. package/dist/icons/generated/shard-h.js.map +0 -1
  472. package/dist/icons/generated/shard-i.cjs +0 -2
  473. package/dist/icons/generated/shard-i.cjs.map +0 -1
  474. package/dist/icons/generated/shard-i.js +0 -30
  475. package/dist/icons/generated/shard-i.js.map +0 -1
  476. package/dist/icons/generated/shard-j.cjs +0 -2
  477. package/dist/icons/generated/shard-j.cjs.map +0 -1
  478. package/dist/icons/generated/shard-j.js +0 -10
  479. package/dist/icons/generated/shard-j.js.map +0 -1
  480. package/dist/icons/generated/shard-k.cjs +0 -2
  481. package/dist/icons/generated/shard-k.cjs.map +0 -1
  482. package/dist/icons/generated/shard-k.js +0 -16
  483. package/dist/icons/generated/shard-k.js.map +0 -1
  484. package/dist/icons/generated/shard-l.cjs +0 -2
  485. package/dist/icons/generated/shard-l.cjs.map +0 -1
  486. package/dist/icons/generated/shard-l.js +0 -92
  487. package/dist/icons/generated/shard-l.js.map +0 -1
  488. package/dist/icons/generated/shard-m.cjs +0 -2
  489. package/dist/icons/generated/shard-m.cjs.map +0 -1
  490. package/dist/icons/generated/shard-m.js +0 -143
  491. package/dist/icons/generated/shard-m.js.map +0 -1
  492. package/dist/icons/generated/shard-n.cjs +0 -2
  493. package/dist/icons/generated/shard-n.cjs.map +0 -1
  494. package/dist/icons/generated/shard-n.js +0 -24
  495. package/dist/icons/generated/shard-n.js.map +0 -1
  496. package/dist/icons/generated/shard-o.cjs +0 -2
  497. package/dist/icons/generated/shard-o.cjs.map +0 -1
  498. package/dist/icons/generated/shard-o.js +0 -17
  499. package/dist/icons/generated/shard-o.js.map +0 -1
  500. package/dist/icons/generated/shard-p.cjs +0 -2
  501. package/dist/icons/generated/shard-p.cjs.map +0 -1
  502. package/dist/icons/generated/shard-p.js +0 -114
  503. package/dist/icons/generated/shard-p.js.map +0 -1
  504. package/dist/icons/generated/shard-q.cjs +0 -2
  505. package/dist/icons/generated/shard-q.cjs.map +0 -1
  506. package/dist/icons/generated/shard-q.js +0 -10
  507. package/dist/icons/generated/shard-q.js.map +0 -1
  508. package/dist/icons/generated/shard-r.cjs +0 -2
  509. package/dist/icons/generated/shard-r.cjs.map +0 -1
  510. package/dist/icons/generated/shard-r.js +0 -79
  511. package/dist/icons/generated/shard-r.js.map +0 -1
  512. package/dist/icons/generated/shard-s.cjs +0 -2
  513. package/dist/icons/generated/shard-s.cjs.map +0 -1
  514. package/dist/icons/generated/shard-s.js +0 -256
  515. package/dist/icons/generated/shard-s.js.map +0 -1
  516. package/dist/icons/generated/shard-t.cjs +0 -2
  517. package/dist/icons/generated/shard-t.cjs.map +0 -1
  518. package/dist/icons/generated/shard-t.js +0 -109
  519. package/dist/icons/generated/shard-t.js.map +0 -1
  520. package/dist/icons/generated/shard-u.cjs +0 -2
  521. package/dist/icons/generated/shard-u.cjs.map +0 -1
  522. package/dist/icons/generated/shard-u.js +0 -50
  523. package/dist/icons/generated/shard-u.js.map +0 -1
  524. package/dist/icons/generated/shard-v.cjs +0 -2
  525. package/dist/icons/generated/shard-v.cjs.map +0 -1
  526. package/dist/icons/generated/shard-v.js +0 -30
  527. package/dist/icons/generated/shard-v.js.map +0 -1
  528. package/dist/icons/generated/shard-w.cjs +0 -2
  529. package/dist/icons/generated/shard-w.cjs.map +0 -1
  530. package/dist/icons/generated/shard-w.js +0 -48
  531. package/dist/icons/generated/shard-w.js.map +0 -1
  532. package/dist/icons/generated/shard-x.cjs +0 -2
  533. package/dist/icons/generated/shard-x.cjs.map +0 -1
  534. package/dist/icons/generated/shard-x.js +0 -10
  535. package/dist/icons/generated/shard-x.js.map +0 -1
  536. package/dist/icons/generated/shard-z.cjs +0 -2
  537. package/dist/icons/generated/shard-z.cjs.map +0 -1
  538. package/dist/icons/generated/shard-z.js +0 -25
  539. package/dist/icons/generated/shard-z.js.map +0 -1
@@ -553,6 +553,12 @@ declare type AnyEventTarget = EventTarget | {
553
553
  */
554
554
  export declare const API_ERROR_OFFLINE_KEY = "tempest.error.offline";
555
555
 
556
+ /**
557
+ * Translation key for the validation sentence, looked up the same way as
558
+ * {@link API_ERROR_OFFLINE_KEY}.
559
+ */
560
+ export declare const API_ERROR_VALIDATION_KEY = "tempest.error.validation";
561
+
556
562
  export declare interface ApiClient {
557
563
  request<T>(path: string, options?: RequestOptions): Promise<T>;
558
564
  get<T>(path: string, options?: RequestOptions): Promise<T>;
@@ -680,14 +686,32 @@ export declare interface ApiError {
680
686
  * header (commonly on `429`/`503`). Honored by {@link retry}.
681
687
  */
682
688
  retryAfter?: number;
689
+ /**
690
+ * Field-level messages from a validation response, keyed by the field path
691
+ * the backend named (`"email"`, `"items.0.price"`).
692
+ *
693
+ * Present only when the body carried a validation list — a FastAPI `422`
694
+ * answers with `detail: [{ loc, msg, type }]`. This is the shape a form
695
+ * needs: `detail` is one line for a log or a developer, and pulling the
696
+ * fields back out of it means parsing prose. The first message wins when a
697
+ * field appears twice, because a field shows one error at a time.
698
+ */
699
+ fields?: Record<string, string>;
683
700
  /** The raw parsed error body, when available. */
684
701
  body?: unknown;
685
702
  }
686
703
 
687
- /** The two fixed sentences {@link describeApiError} may need. */
704
+ /** The fixed sentences {@link describeApiError} may need. */
688
705
  export declare interface ApiErrorStrings {
689
706
  /** Shown when the request never reached the server. */
690
707
  offline: string;
708
+ /**
709
+ * Shown when the backend rejected the payload field by field.
710
+ *
711
+ * The per-field messages are on `error.fields`, to be attached to the inputs
712
+ * themselves; this sentence is what the toast says.
713
+ */
714
+ validation: string;
691
715
  }
692
716
 
693
717
  /**
@@ -782,6 +806,12 @@ export declare type AppBarTone = "surface" | "primary" | "transparent";
782
806
  * @example
783
807
  * const visible = applyFilters(orders, filters);
784
808
  *
809
+ * Each filter's values are normalised once, before the scan, rather than inside
810
+ * the per-row predicate: the arity, the `between` ordering and the value array
811
+ * depend only on the filter, so deriving them per row multiplied that work by
812
+ * the row count. `empty`/`notEmpty` ignore their values entirely, which is why
813
+ * the prepared shape does not need to distinguish them.
814
+ *
785
815
  * @param items - The full list.
786
816
  * @param filters - Applied filters; incomplete ones are ignored.
787
817
  * @returns A new array with the rows that satisfy every complete filter.
@@ -1480,6 +1510,15 @@ export declare interface BarcodeScanResult {
1480
1510
  * numbers on purpose: a width scaled by the total leaves every bar short in a
1481
1511
  * long list, which is when the chart is needed most.
1482
1512
  *
1513
+ * Colors come from {@link useChartColors}, the same resolver every chart in the
1514
+ * SDK uses, so a theme that declares fewer series than the eight
1515
+ * `--tempest-chart-*` slots cycles within its own palette. Reading the tokens
1516
+ * through CSS `var()` could not do that: the count lives in
1517
+ * `--tempest-chart-count`, which CSS cannot use as a modulus, so a six-color
1518
+ * brand palette got the SDK's leftover defaults in rows seven and eight — the
1519
+ * exact regression that token exists to prevent. `palette.ts` imports nothing,
1520
+ * so this pulls no chart library into the slice.
1521
+ *
1483
1522
  * @example
1484
1523
  * <BarList
1485
1524
  * items={[{ label: "Free", value: 128 }, { label: "Pro", value: 32 }]}
@@ -1547,6 +1586,9 @@ export declare type BarListSort = "desc" | "asc" | "none";
1547
1586
  * `atob` and losing the last byte — is the classic broken-WebAuthn bug, which is
1548
1587
  * why the SDK owns it instead of leaving it to each app.
1549
1588
  *
1589
+ * This is the WebAuthn-facing name for {@link base64ToBytes}; the codec itself is
1590
+ * shared, so the padding rule has one implementation rather than three.
1591
+ *
1550
1592
  * @param value - Base64url text, with or without `=` padding.
1551
1593
  * @returns The decoded bytes.
1552
1594
  */
@@ -1846,6 +1888,9 @@ export declare type ButtonVariant = "primary" | "secondary" | "danger" | "succes
1846
1888
  /**
1847
1889
  * Encode bytes as an unpadded base64url string.
1848
1890
  *
1891
+ * Normalises `ArrayBuffer` to a view — which is what the WebAuthn response
1892
+ * fields hand over — and delegates the encoding to {@link bytesToBase64}.
1893
+ *
1849
1894
  * @param value - Bytes to encode, as a view or a raw buffer.
1850
1895
  * @returns Base64url text, safe to put in JSON and in a URL.
1851
1896
  */
@@ -2583,33 +2628,17 @@ export declare function compareValues(a: unknown, b: unknown): number;
2583
2628
  /**
2584
2629
  * Typed `localStorage` wrapper that gzips what it writes.
2585
2630
  *
2586
- * Mirrors {@link storage} so the two are interchangeable at the call site; the
2587
- * difference is only in how the value is encoded.
2631
+ * {@link createJsonStorage} with {@link compressedStorageCodec}, so it is the
2632
+ * same implementation as {@link storage} and genuinely interchangeable with it —
2633
+ * `get`, `set` and `remove`, differing only in how the value is encoded. It used
2634
+ * to be a hand-written copy that had no `remove`, which made that promise false
2635
+ * for anybody who took the docstring at its word.
2636
+ *
2637
+ * When compression itself fails the value is written as plain JSON rather than
2638
+ * dropped: a slightly larger record still loads, an absent one does not. Only a
2639
+ * storage-level failure — quota, blocked storage — loses the write.
2588
2640
  */
2589
- export declare const compressedStorage: {
2590
- /**
2591
- * Read and decompress a key.
2592
- *
2593
- * @typeParam T - The expected value shape.
2594
- * @param key - Storage key.
2595
- * @param fallback - Returned when the key is absent, unreadable, or corrupt.
2596
- * @returns The stored value, or `fallback`.
2597
- */
2598
- get<T>(key: string, fallback: T): T;
2599
- /**
2600
- * Compress and write a key.
2601
- *
2602
- * When compression itself fails the value is written as plain JSON rather
2603
- * than dropped: a slightly larger record still loads, an absent one does
2604
- * not. Only a storage-level failure — quota, blocked storage — loses the
2605
- * write.
2606
- *
2607
- * @typeParam T - The value being stored.
2608
- * @param key - Storage key.
2609
- * @param value - Any JSON-serializable value.
2610
- */
2611
- set<T>(key: string, value: T): void;
2612
- };
2641
+ export declare const compressedStorage: JsonStorage;
2613
2642
 
2614
2643
  /**
2615
2644
  * Codec pair for {@link useLocalStorage}, so a compressed key gets the hook's
@@ -2618,10 +2647,7 @@ export declare const compressedStorage: {
2618
2647
  * @example
2619
2648
  * const [save, setSave] = useLocalStorage("save", EMPTY_SAVE, compressedStorageCodec);
2620
2649
  */
2621
- export declare const compressedStorageCodec: {
2622
- serialize: typeof compressToString;
2623
- deserialize: typeof decompressFromString;
2624
- };
2650
+ export declare const compressedStorageCodec: StorageCodec;
2625
2651
 
2626
2652
  /**
2627
2653
  * Serialize a value to a gzipped, base64 string carrying the format marker.
@@ -3036,6 +3062,10 @@ export declare interface CreateGrowthBookFeatureFlagsAdapterOptions {
3036
3062
  * });
3037
3063
  * i18n.t("greet", { name: "Mau" }); // "Olá, Mau"
3038
3064
  * i18n.plural("alos", 3); // "3 Alôs"
3065
+ *
3066
+ * @example
3067
+ * // A key the catalog does not define, with text to show instead of the key.
3068
+ * i18n.t("cart.empty", undefined, { default: "Seu carrinho está vazio" });
3039
3069
  */
3040
3070
  export declare function createI18n(options: CreateI18nOptions): I18n;
3041
3071
 
@@ -3096,6 +3126,34 @@ export declare function createInMemoryFlags(options?: InMemoryFlagsOptions): Fea
3096
3126
  set: (key: string, value: FlagValue) => void;
3097
3127
  };
3098
3128
 
3129
+ /**
3130
+ * Build a typed `localStorage` wrapper around a codec.
3131
+ *
3132
+ * One implementation behind every store the SDK ships, so they cannot drift in
3133
+ * surface. {@link storage} and {@link compressedStorage} are both this function —
3134
+ * before it, the compressed one was a hand-written copy of the same guards and
3135
+ * had no `remove`, while its own docstring promised the two were interchangeable
3136
+ * at the call site. They were not, and the promise failed exactly where somebody
3137
+ * followed it.
3138
+ *
3139
+ * @example
3140
+ * const session = createJsonStorage();
3141
+ * session.set("draft", { title: "Sem título" });
3142
+ *
3143
+ * @example
3144
+ * const packed = createJsonStorage(compressedStorageCodec);
3145
+ *
3146
+ * @param codec - Encoder pair. Defaults to plain JSON.
3147
+ * @returns A store with `get` / `set` / `remove`.
3148
+ *
3149
+ * @tempest-limits empty-catch — every method is best-effort by contract:
3150
+ * `localStorage` throws on quota exhaustion, in Safari private mode, and when a
3151
+ * cross-origin frame has storage blocked. A caller persisting a preference has no
3152
+ * recovery to run and no user-facing message to show, so the write is dropped and
3153
+ * the app keeps the value in memory for the session.
3154
+ */
3155
+ export declare function createJsonStorage(codec?: StorageCodec): JsonStorage;
3156
+
3099
3157
  /**
3100
3158
  * Build a [[FeatureFlagsAdapter]] backed by a LaunchDarkly JS client. Apps
3101
3159
  * initialise the client themselves (`LDClient.initialize(envKey, ctx)`) and
@@ -3606,34 +3664,6 @@ export declare interface CreateSentryTelemetryAdapterOptions {
3606
3664
  breadcrumbCategory?: string;
3607
3665
  }
3608
3666
 
3609
- /**
3610
- * A pool of preallocated `<audio>` elements for short sound effects.
3611
- *
3612
- * `new Audio(src)` on every play allocates an element and re-enters the network
3613
- * stack for a file the browser already has, which is the wrong shape for a
3614
- * sound that fires dozens of times a minute — a UI blip, a hit, a pickup. The
3615
- * pool allocates once per source and replays.
3616
- *
3617
- * This is deliberately not {@link createAudioPlayer}: that handle tracks a
3618
- * single "current" clip with loop, sink routing and lifecycle callbacks, which
3619
- * is what background music needs. Effects are the opposite case — many
3620
- * sources, all short, fire-and-forget, and the only thing that matters is that
3621
- * firing one is cheap.
3622
- *
3623
- * A blocked `play()` is swallowed. Browsers reject playback until the user has
3624
- * interacted with the page, and a sound effect is by definition not worth
3625
- * interrupting anything over; call {@link SfxPool.preload} after the first
3626
- * interaction if you want the pool warm.
3627
- *
3628
- * @param options - Master volume, base URL, voices per source and pool size.
3629
- * @returns The pool handle.
3630
- *
3631
- * @example
3632
- * const sfx = createSfxPool({ volume: 0.6, baseUrl: import.meta.env.BASE_URL });
3633
- * sfx.preload(["sfx/select.mp3", "sfx/back.mp3"]);
3634
- *
3635
- * <button onClick={() => sfx.play("sfx/select.mp3")}>Confirmar</button>
3636
- */
3637
3667
  export declare function createSfxPool(options?: SfxPoolOptions): SfxPool;
3638
3668
 
3639
3669
  /**
@@ -4135,6 +4165,64 @@ export declare interface DataProviderOptions {
4135
4165
  */
4136
4166
  export declare function DataTable<T>({ data, columns, pageSize, searchable, searchKeys, initialSort, rowKey, emptyMessage, onCellChange, editLabels, totalItems, page: controlledPage, onPageChange, manualSort, onSortChange, manualSearch, onSearchChange, loading, className, ...rest }: DataTableProps<T>): JSX.Element;
4137
4167
 
4168
+ /** Everything a table needs regardless of who owns paging, sorting and searching. */
4169
+ export declare interface DataTableBaseProps<T> extends HTMLAttributes<HTMLDivElement> {
4170
+ /**
4171
+ * The rows to work with.
4172
+ *
4173
+ * By default this is the **full** dataset and sorting, searching and paging
4174
+ * all happen in memory. Pass `totalItems` and it becomes the current page as
4175
+ * the server returned it, with those three delegated to the caller.
4176
+ */
4177
+ data: T[];
4178
+ /** Column definitions. */
4179
+ columns: DataTableColumn<T>[];
4180
+ /** Rows per page. Default 10. */
4181
+ pageSize?: number;
4182
+ /** Render a search input above the table. Default false. */
4183
+ searchable?: boolean;
4184
+ /**
4185
+ * Keys to match the search term against. When omitted, every column whose
4186
+ * value is a string or number is searched.
4187
+ */
4188
+ searchKeys?: (keyof T)[];
4189
+ /** Initial sort applied before any header interaction. */
4190
+ initialSort?: DataTableSort<T>;
4191
+ /** Stable key extractor for rows. Defaults to the row index. */
4192
+ rowKey?: (row: T, index: number) => string | number;
4193
+ /** Content shown when no rows match. */
4194
+ emptyMessage?: ReactNode;
4195
+ /**
4196
+ * Persist an accepted cell edit. Return a promise: while it is pending the cell
4197
+ * already shows the new value, and a rejection rolls that back and surfaces the
4198
+ * error in the cell. Without this prop no column is editable.
4199
+ */
4200
+ onCellChange?: (change: DataTableCellChange<T>) => void | Promise<void>;
4201
+ /** Override the PT-BR copy of the editing affordances. */
4202
+ editLabels?: Partial<DataTableEditLabels>;
4203
+ /**
4204
+ * Searching is the caller's job: typing reports through `onSearchChange` and
4205
+ * the rows are left as they arrived.
4206
+ *
4207
+ * Implied by `totalItems`. Filtering the current page would hide the rows
4208
+ * that do not match *on this page* and show nothing for a term that only
4209
+ * matches on page three — an empty table that looks like "no results".
4210
+ */
4211
+ manualSearch?: boolean;
4212
+ /** Called with the current search term (debouncing, if any, is the caller's). */
4213
+ onSearchChange?: (term: string) => void;
4214
+ /**
4215
+ * A fetch is in flight.
4216
+ *
4217
+ * With rows already on screen they stay put, dimmed and `aria-busy`, so the
4218
+ * page does not jump under the cursor between pages. With no rows yet it
4219
+ * renders placeholder lines at full height, which is a different statement
4220
+ * from `emptyMessage`: "loading" and "there is nothing" are not the same
4221
+ * screen.
4222
+ */
4223
+ loading?: boolean;
4224
+ }
4225
+
4138
4226
  /** One accepted cell edit, handed to `onCellChange`. */
4139
4227
  export declare interface DataTableCellChange<T> {
4140
4228
  /** The row as it was before the edit. */
@@ -4212,40 +4300,24 @@ export declare interface DataTableEditLabels {
4212
4300
  /** Input types an editable column can use. */
4213
4301
  export declare type DataTableEditorType = "text" | "number" | "date" | "email" | "tel" | "url";
4214
4302
 
4215
- export declare interface DataTableProps<T> extends HTMLAttributes<HTMLDivElement> {
4216
- /**
4217
- * The rows to work with.
4218
- *
4219
- * By default this is the **full** dataset and sorting, searching and paging
4220
- * all happen in memory. Pass `totalItems` and it becomes the current page as
4221
- * the server returned it, with those three delegated to the caller.
4222
- */
4223
- data: T[];
4224
- /** Column definitions. */
4225
- columns: DataTableColumn<T>[];
4226
- /** Rows per page. Default 10. */
4227
- pageSize?: number;
4228
- /** Render a search input above the table. Default false. */
4229
- searchable?: boolean;
4230
- /**
4231
- * Keys to match the search term against. When omitted, every column whose
4232
- * value is a string or number is searched.
4233
- */
4234
- searchKeys?: (keyof T)[];
4235
- /** Initial sort applied before any header interaction. */
4236
- initialSort?: DataTableSort<T>;
4237
- /** Stable key extractor for rows. Defaults to the row index. */
4238
- rowKey?: (row: T, index: number) => string | number;
4239
- /** Content shown when no rows match. */
4240
- emptyMessage?: ReactNode;
4241
- /**
4242
- * Persist an accepted cell edit. Return a promise: while it is pending the cell
4243
- * already shows the new value, and a rejection rolls that back and surfaces the
4244
- * error in the cell. Without this prop no column is editable.
4245
- */
4246
- onCellChange?: (change: DataTableCellChange<T>) => void | Promise<void>;
4247
- /** Override the PT-BR copy of the editing affordances. */
4248
- editLabels?: Partial<DataTableEditLabels>;
4303
+ /**
4304
+ * Paging, as one of the three shapes that actually work.
4305
+ *
4306
+ * These used to be three optional props, so the compiler accepted
4307
+ * `totalItems` with no `page` a table whose pager moves an internal page while
4308
+ * `data` keeps showing page one. Every prop was optional on its own, so the only
4309
+ * place left to catch it was a `console.warn` in dev, in the browser, with the
4310
+ * component mounted. As a union the same mistake is a build error at the call
4311
+ * site, for free, everywhere.
4312
+ */
4313
+ export declare type DataTablePagingProps = {
4314
+ /** Not server mode. */
4315
+ totalItems?: never;
4316
+ /** The table owns the page. */
4317
+ page?: never;
4318
+ /** Nothing to report to. */
4319
+ onPageChange?: never;
4320
+ } | {
4249
4321
  /**
4250
4322
  * Total row count across every page — the `total` of a paginated envelope.
4251
4323
  *
@@ -4255,49 +4327,64 @@ export declare interface DataTableProps<T> extends HTMLAttributes<HTMLDivElement
4255
4327
  * (see `manualSort` / `manualSearch`, which are implied here). Pair it with
4256
4328
  * `page` and `onPageChange`.
4257
4329
  */
4258
- totalItems?: number;
4330
+ totalItems?: never;
4259
4331
  /** Current page, 1-based. Controlled — required in server mode. */
4260
- page?: number;
4332
+ page: number;
4261
4333
  /** Called with the next page. Required whenever `page` is controlled. */
4262
- onPageChange?: (page: number) => void;
4263
- /**
4264
- * Sorting is the caller's job: clicking a header reports through
4265
- * `onSortChange` and the rows are left in the order they arrived.
4266
- *
4267
- * Implied by `totalItems`, because sorting the page in memory would sort
4268
- * *that page only* while the header claims the whole table is ordered.
4269
- */
4270
- manualSort?: boolean;
4271
- /** Called with the next sort state — `null` when the header cycles back to unsorted. */
4272
- onSortChange?: (sort: DataTableSort<T> | null) => void;
4273
- /**
4274
- * Searching is the caller's job: typing reports through `onSearchChange` and
4275
- * the rows are left as they arrived.
4276
- *
4277
- * Implied by `totalItems`. Filtering the current page would hide the rows
4278
- * that do not match *on this page* and show nothing for a term that only
4279
- * matches on page three — an empty table that looks like "no results".
4280
- */
4281
- manualSearch?: boolean;
4282
- /** Called with the current search term (debouncing, if any, is the caller's). */
4283
- onSearchChange?: (term: string) => void;
4334
+ onPageChange: (page: number) => void;
4335
+ } | {
4284
4336
  /**
4285
- * A fetch is in flight.
4337
+ * Total row count across every page — the `total` of a paginated envelope.
4286
4338
  *
4287
- * With rows already on screen they stay put, dimmed and `aria-busy`, so the
4288
- * page does not jump under the cursor between pages. With no rows yet it
4289
- * renders placeholder lines at full height, which is a different statement
4290
- * from `emptyMessage`: "loading" and "there is nothing" are not the same
4291
- * screen.
4339
+ * Passing it switches the table to **server mode**: `data` is read as the
4340
+ * current page, the page count comes from this number instead of
4341
+ * `data.length`, and sorting and searching are delegated to the caller
4342
+ * (see `manualSort` / `manualSearch`, which are implied here). `page` and
4343
+ * `onPageChange` come with it — the type says so, because a server-mode
4344
+ * table without them silently shows page one forever.
4292
4345
  */
4293
- loading?: boolean;
4294
- }
4346
+ totalItems: number;
4347
+ /** Current page, 1-based. Controlled, and required in server mode. */
4348
+ page: number;
4349
+ /** Called with the next page. */
4350
+ onPageChange: (page: number) => void;
4351
+ };
4352
+
4353
+ /**
4354
+ * The table's props: the shared half, plus one valid paging shape and one valid
4355
+ * sorting shape.
4356
+ */
4357
+ export declare type DataTableProps<T> = DataTableBaseProps<T> & DataTablePagingProps & DataTableSortProps<T>;
4295
4358
 
4296
4359
  export declare interface DataTableSort<T> {
4297
4360
  key: keyof T;
4298
4361
  direction: SortDirection;
4299
4362
  }
4300
4363
 
4364
+ /**
4365
+ * Sorting: delegated, and therefore reported, or neither.
4366
+ *
4367
+ * `manualSort` without `onSortChange` renders a header that moves its arrow and
4368
+ * changes nothing else — the arrow is a lie the compiler can now catch.
4369
+ */
4370
+ export declare type DataTableSortProps<T> = {
4371
+ /** The table sorts the rows it has. */
4372
+ manualSort?: false;
4373
+ /** Called with the next sort state — `null` when the header cycles back to unsorted. */
4374
+ onSortChange?: (sort: DataTableSort<T> | null) => void;
4375
+ } | {
4376
+ /**
4377
+ * Sorting is the caller's job: clicking a header reports through
4378
+ * `onSortChange` and the rows are left in the order they arrived.
4379
+ *
4380
+ * Implied by `totalItems`, because sorting the page in memory would sort
4381
+ * *that page only* while the header claims the whole table is ordered.
4382
+ */
4383
+ manualSort: true;
4384
+ /** Where the click goes. Required, since nothing else acts on it. */
4385
+ onSortChange: (sort: DataTableSort<T> | null) => void;
4386
+ };
4387
+
4301
4388
  /**
4302
4389
  * Thin wrapper around the native `<input type="date">` (or `datetime-local`,
4303
4390
  * `time`, `month`). For richer pickers, pair with `react-datepicker` directly
@@ -4507,9 +4594,16 @@ export declare function defineRoutes(routes: TempestRouteObject[]): TempestRoute
4507
4594
  * error thrown while the browser reports itself offline — produces the
4508
4595
  * offline sentence. This is the step apps skip, and skipping it renders
4509
4596
  * "erro 0" or a raw `TypeError` at the user.
4510
- * 2. The backend's own `detail`, which is the most specific thing available and
4597
+ * 2. A validation rejection `error.fields` is set produces the validation
4598
+ * sentence, **not** `detail`. On a `422` the `detail` line is assembled from
4599
+ * the backend's field paths and the validator's own wording
4600
+ * (`"items.0.price: Input should be greater than 0"`), which is right for a
4601
+ * log and wrong for a person: it is half English in a pt-BR screen and it
4602
+ * names internals. The per-field messages stay on `fields`, where a form can
4603
+ * attach them to the inputs that failed.
4604
+ * 3. The backend's own `detail`, which is the most specific thing available and
4511
4605
  * is already written for a person.
4512
- * 3. `fallback`, with `(HTTP <status>)` appended when a status is known, so the
4606
+ * 4. `fallback`, with `(HTTP <status>)` appended when a status is known, so the
4513
4607
  * screenshot in the support ticket carries the one fact a developer needs.
4514
4608
  *
4515
4609
  * Pure on purpose: it works in an interceptor, in a logger and anywhere outside
@@ -5184,15 +5278,55 @@ export declare function filtersFromSearchParams(params: URLSearchParams, fields:
5184
5278
  * will not answer an `empty` filter, while {@link applyFilters} treats blank
5185
5279
  * text as empty.
5186
5280
  *
5281
+ * The defaults are that dialect, not a universal truth. A backend that names its
5282
+ * substring column something other than `name`, or that spells its operators
5283
+ * differently, passes `options` — the alternative was an encoder whose special
5284
+ * cases were a wall for anyone not on the Tempest stack.
5285
+ *
5187
5286
  * @example
5188
5287
  * const params = filtersToQueryParams(filters);
5189
5288
  * params.set("page", String(page));
5190
5289
  * const data = await api.get(`/orders?${params}`);
5191
5290
  *
5291
+ * @example
5292
+ * // A backend whose searchable column is `razao_social` and that spells `ne`
5293
+ * // the Django way.
5294
+ * const params = filtersToQueryParams(filters, {
5295
+ * substringColumns: ["razao_social"],
5296
+ * operatorSuffix: { ne: "__exclude" },
5297
+ * });
5298
+ *
5192
5299
  * @param filters - Applied filters; incomplete ones are ignored.
5300
+ * @param options - Dialect overrides. Defaults to the `tempest-fastapi-sdk` one.
5193
5301
  * @returns Params ready to append to a request URL.
5194
5302
  */
5195
- export declare function filtersToQueryParams(filters: readonly Filter[]): URLSearchParams;
5303
+ export declare function filtersToQueryParams(filters: readonly Filter[], options?: FiltersToQueryParamsOptions): URLSearchParams;
5304
+
5305
+ /** Overrides for the backend dialect {@link filtersToQueryParams} encodes into. */
5306
+ export declare interface FiltersToQueryParamsOptions {
5307
+ /**
5308
+ * Columns whose `eq` is emitted as `<column>__iexact` rather than as the bare
5309
+ * column name. Default `["name"]`, which is what `build_filter_condition`
5310
+ * special-cases.
5311
+ *
5312
+ * Pass the columns **your** backend treats that way — `nome`, `titulo`,
5313
+ * `razao_social` — or `[]` when it treats none of them specially and a bare
5314
+ * `eq` should stay bare.
5315
+ */
5316
+ substringColumns?: readonly string[];
5317
+ /**
5318
+ * Operator suffixes, merged over the `tempest-fastapi-sdk` dialect, so an
5319
+ * override names only the operators that differ.
5320
+ *
5321
+ * @example
5322
+ * // A DRF-style backend
5323
+ * filtersToQueryParams(filters, {
5324
+ * substringColumns: [],
5325
+ * operatorSuffix: { contains: "__icontains", ne: "__exclude" },
5326
+ * });
5327
+ */
5328
+ operatorSuffix?: Partial<Record<FilterOperator, string>>;
5329
+ }
5196
5330
 
5197
5331
  /**
5198
5332
  * Serialize filters into URL search params.
@@ -5883,14 +6017,16 @@ export declare interface I18n {
5883
6017
  fallbackLocale: string | null;
5884
6018
  /**
5885
6019
  * Translate `key`, interpolating `{name}` placeholders from `params`.
5886
- * Falls back to the configured fallback locale, then to the key itself.
6020
+ * Falls back to the configured fallback locale, then to `options.default`,
6021
+ * then to the key itself.
5887
6022
  */
5888
- t: (key: string, params?: InterpolationValues) => string;
6023
+ t: (key: string, params?: InterpolationValues, options?: TranslateOptions) => string;
5889
6024
  /**
5890
6025
  * Plural-aware translation. Tries `${key}_one` for `count === 1` and
5891
6026
  * `${key}_other` otherwise, with `{count}` available for interpolation.
6027
+ * Falls back to `options.default`, then to the key itself.
5892
6028
  */
5893
- plural: (key: string, count: number, params?: InterpolationValues) => string;
6029
+ plural: (key: string, count: number, params?: InterpolationValues, options?: TranslateOptions) => string;
5894
6030
  /** Format a number using `Intl.NumberFormat` on the active locale. */
5895
6031
  formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;
5896
6032
  /** Format a Date using `Intl.DateTimeFormat` on the active locale. */
@@ -6424,42 +6560,6 @@ export declare function isCursorPage<T = unknown>(value: unknown): value is Curs
6424
6560
  */
6425
6561
  export declare function isDefined<T>(value: T | null | undefined): value is T;
6426
6562
 
6427
- /**
6428
- * Whether the consuming app was built for development.
6429
- *
6430
- * Reads `process.env.NODE_ENV`, which every supported bundler (Vite, webpack,
6431
- * Rspack, Parcel) replaces with a literal **while building the app**. That
6432
- * timing is the whole point: `import.meta.env.DEV` looks equivalent and is not,
6433
- * because Vite replaces it while building *this package*, so a published
6434
- * artifact carries the constant `false` and every guard behind it becomes dead
6435
- * code the app's own dev server can no longer switch on.
6436
- *
6437
- * The expression is written out in full, and the failure is caught rather than
6438
- * guarded against. A `typeof process === "undefined"` check would read as the
6439
- * careful version and quietly reintroduce the bug: bundlers substitute the
6440
- * member expression `process.env.NODE_ENV` and nothing else, so in a browser —
6441
- * where the identifier `process` does not exist — the guard would return early
6442
- * while the literal right after it had already been replaced with
6443
- * `"development"`.
6444
- *
6445
- * Returns `false` when the read throws, which is the environment that defines
6446
- * neither symbol: a raw service-worker context, a plain
6447
- * `<script type="module">`, a bundler substituting nothing. Staying quiet there
6448
- * is deliberate — a dev-only warning that cannot prove it is in development is
6449
- * better silent than shouting in someone's production console.
6450
- *
6451
- * @returns Whether development-only diagnostics should run.
6452
- *
6453
- * @example
6454
- * if (isDevBuild()) console.warn("[my-app] this prop combination does nothing");
6455
- *
6456
- * @tempest-limits empty-catch — the only thing the read can throw is the
6457
- * environment answering "not defined", which is the return value, not an error
6458
- * worth reporting. Logging it would print on every call in exactly the context
6459
- * that has nowhere to print.
6460
- */
6461
- export declare function isDevBuild(): boolean;
6462
-
6463
6563
  /**
6464
6564
  * Check whether a value is considered "empty".
6465
6565
  *
@@ -6568,6 +6668,31 @@ export declare function isPlatformAuthenticatorAvailable(): Promise<boolean>;
6568
6668
  */
6569
6669
  export declare function isPushSupported(): boolean;
6570
6670
 
6671
+ /**
6672
+ * Whether an HTTP status describes a condition a replay can plausibly fix.
6673
+ *
6674
+ * The single owner of that decision. It used to be spelled out in three places —
6675
+ * the client's own policy, the react-query default and the bare `retry()` helper
6676
+ * — and they had already drifted: the query default was missing `425`, so the
6677
+ * same `425 Too Early` was replayed through `createApiClient({ retry: true })`
6678
+ * and not replayed through `useQuery`. Same app, same error, two behaviours, and
6679
+ * no test caught it because each file asserted against its own copy.
6680
+ *
6681
+ * Deliberately about the status and nothing else. Whether a *non*-API error is
6682
+ * worth replaying, and whether the request's method may be replayed at all, are
6683
+ * the caller's calls: {@link createApiClient} refuses a non-idempotent method,
6684
+ * while a bare `retry()` has no method to inspect.
6685
+ *
6686
+ * @example
6687
+ * await api.get("/report", {
6688
+ * retry: { shouldRetry: (error) => isApiError(error) && isRetriableStatus(error.status) },
6689
+ * });
6690
+ *
6691
+ * @param status - The HTTP status, where `0` means the request never landed.
6692
+ * @returns Whether a retry is worth attempting.
6693
+ */
6694
+ export declare function isRetriableStatus(status: number): boolean;
6695
+
6571
6696
  /** Whether `getDisplayMedia` is reachable at all. */
6572
6697
  export declare function isScreenCaptureSupported(): boolean;
6573
6698
 
@@ -6604,6 +6729,33 @@ export declare function isValidLongitude(value: number): boolean;
6604
6729
  /** Whether `MediaRecorder` exists and can produce at least one video container. */
6605
6730
  export declare function isVideoRecordingSupported(): boolean;
6606
6731
 
6732
+ /** The surface every store built by {@link createJsonStorage} exposes. */
6733
+ export declare interface JsonStorage {
6734
+ /**
6735
+ * Read and decode a key.
6736
+ *
6737
+ * @typeParam T - The expected value shape.
6738
+ * @param key - Storage key.
6739
+ * @param fallback - Returned when the key is absent, unreadable, or corrupt.
6740
+ * @returns The stored value, or `fallback`.
6741
+ */
6742
+ get<T>(key: string, fallback: T): T;
6743
+ /**
6744
+ * Encode and write a key.
6745
+ *
6746
+ * @typeParam T - The value being stored.
6747
+ * @param key - Storage key.
6748
+ * @param value - Any value the codec can represent.
6749
+ */
6750
+ set<T>(key: string, value: T): void;
6751
+ /**
6752
+ * Delete a key.
6753
+ *
6754
+ * @param key - Storage key.
6755
+ */
6756
+ remove(key: string): void;
6757
+ }
6758
+
6607
6759
  /**
6608
6760
  * Kanban board: columns of cards, reorderable within a column and movable across
6609
6761
  * columns, by pointer **or** keyboard.
@@ -9708,7 +9860,12 @@ export declare interface RetryOptions {
9708
9860
  respectRetryAfter?: boolean;
9709
9861
  /**
9710
9862
  * Return false to stop retrying for a specific error.
9711
- * Default: retry on any thrown error.
9863
+ *
9864
+ * Default: replay anything that is not a recognisable API error — a
9865
+ * transport failure has no status to judge — and, for one that is, only the
9866
+ * statuses {@link isRetriableStatus} accepts. A `403` on an admin-only
9867
+ * endpoint and a `404` for a deleted record are the server's final answer;
9868
+ * repeating them spends the caller's time to show the same error twice.
9712
9869
  */
9713
9870
  shouldRetry?: (error: unknown, attempt: number) => boolean;
9714
9871
  /** Called before each retry with the upcoming delay. */
@@ -10226,6 +10383,11 @@ export declare interface ShareResult {
10226
10383
  * of another round trip. A network failure or a 5xx is a different thing: it may
10227
10384
  * well succeed on the next try, so those keep the previous behaviour.
10228
10385
  *
10386
+ * The status list is {@link isRetriableStatus}, shared with the client's own
10387
+ * policy. It used to be a second copy here, and the copy was missing `425` — so
10388
+ * a `425 Too Early` was replayed by `createApiClient({ retry: true })` and not
10389
+ * by a query, for the same error in the same app.
10390
+ *
10229
10391
  * @example
10230
10392
  * new QueryClient({ defaultOptions: { queries: { retry: shouldRetryQuery } } });
10231
10393
  *
@@ -10261,6 +10423,12 @@ export declare interface ShowProps {
10261
10423
  * Desktop sidebar navigation. Pair with `<Show above="md">` and a `Drawer`
10262
10424
  * for mobile.
10263
10425
  *
10426
+ * Sixteen screens in one flat list is a wall, so `items` also takes section
10427
+ * headings and separators. A section renders as a labelled `role="group"`, which
10428
+ * is what tells a screen reader "Monitoring, group, 3 items" — the reason it is
10429
+ * not a styled `disabled` item, which would announce an unavailable button and
10430
+ * stay in the navigation order.
10431
+ *
10264
10432
  * @example
10265
10433
  * const [tab, setTab] = useState("home");
10266
10434
  * <Show above="md">
@@ -10271,23 +10439,59 @@ export declare interface ShowProps {
10271
10439
  * onChange={setTab}
10272
10440
  * />
10273
10441
  * </Show>
10442
+ *
10443
+ * @example
10444
+ * <Sidebar
10445
+ * items={[
10446
+ * { type: "section", key: "monitoring", label: "Monitoring" },
10447
+ * { key: "overview", label: "Overview", href: "/overview" },
10448
+ * { key: "activity", label: "Activity", href: "/activity" },
10449
+ * { type: "section", key: "admin", label: "Administration" },
10450
+ * { key: "settings", label: "Settings", href: "/settings" },
10451
+ * ]}
10452
+ * value={tab}
10453
+ * onChange={setTab}
10454
+ * />
10274
10455
  */
10275
10456
  export declare function Sidebar({ header, items, value, onChange, footer, collapsed, width, collapsedWidth, className, style, ...props }: SidebarProps): JSX.Element;
10276
10457
 
10458
+ /**
10459
+ * One entry of the navigation list.
10460
+ *
10461
+ * An entry with no `type` is an item, which is what keeps a plain
10462
+ * `SidebarItem[]` a valid `SidebarEntry[]`: adding sections to this component
10463
+ * needed no change at any existing call site.
10464
+ */
10465
+ export declare type SidebarEntry = ({
10466
+ type?: "item";
10467
+ } & SidebarItem) | SidebarSection | SidebarSeparator;
10468
+
10277
10469
  export declare interface SidebarItem {
10278
10470
  key: string;
10279
10471
  label: ReactNode;
10280
10472
  icon?: ReactNode;
10281
10473
  badge?: ReactNode;
10282
10474
  disabled?: boolean;
10475
+ /**
10476
+ * Renders the entry as a link to this URL instead of a button.
10477
+ *
10478
+ * `onChange` still fires on click, so an app that tracks the active key keeps
10479
+ * working — the difference is that the entry now behaves like navigation:
10480
+ * middle-click, ctrl-click and "copy link address" do what the user expects,
10481
+ * and a screen reader announces a link rather than a button.
10482
+ *
10483
+ * A `disabled` entry ignores this and stays a `<button disabled>`: there is no
10484
+ * disabled state for an anchor, and dropping the `href` to fake one leaves a
10485
+ * link that announces itself as actionable and is not.
10486
+ */
10283
10487
  href?: string;
10284
10488
  }
10285
10489
 
10286
10490
  export declare interface SidebarProps extends Omit<HTMLAttributes<HTMLElement>, "onChange"> {
10287
10491
  /** Top slot — typically the logo + brand. */
10288
10492
  header?: ReactNode;
10289
- /** Navigation items. */
10290
- items: SidebarItem[];
10493
+ /** Navigation entries. An entry with no `type` is an item. */
10494
+ items: SidebarEntry[];
10291
10495
  /** Active item key. */
10292
10496
  value?: string;
10293
10497
  /** Fires when an item is clicked. Receives the item's `key`. */
@@ -10302,6 +10506,22 @@ export declare interface SidebarProps extends Omit<HTMLAttributes<HTMLElement>,
10302
10506
  collapsedWidth?: number | string;
10303
10507
  }
10304
10508
 
10509
+ /**
10510
+ * A section heading. Every item after it belongs to the section, until the next
10511
+ * section or separator.
10512
+ */
10513
+ export declare interface SidebarSection {
10514
+ type: "section";
10515
+ key: string;
10516
+ label: ReactNode;
10517
+ }
10518
+
10519
+ /** A plain divider, for splitting the list without naming the parts. */
10520
+ export declare interface SidebarSeparator {
10521
+ type: "separator";
10522
+ key: string;
10523
+ }
10524
+
10305
10525
  /**
10306
10526
  * Signature capture on a canvas — the "sign here" field of a delivery receipt,
10307
10527
  * a service order, a term of acceptance.
@@ -10757,20 +10977,18 @@ export declare interface StepperProps {
10757
10977
  export declare function stopAudio(): void;
10758
10978
 
10759
10979
  /**
10760
- * Typed wrapper around `localStorage` that JSON-encodes values and
10761
- * silently handles environments where storage is unavailable (SSR, private mode).
10762
- *
10763
- * @tempest-limits empty-catch — every method here is best-effort by contract:
10764
- * `localStorage` throws on quota exhaustion, in Safari private mode, and when a
10765
- * cross-origin frame has storage blocked. A caller persisting a preference has no
10766
- * recovery to run and no user-facing message to show, so the write is dropped and
10767
- * the app keeps the value in memory for the session.
10980
+ * Typed wrapper around `localStorage` that JSON-encodes values and silently
10981
+ * handles environments where storage is unavailable (SSR, private mode).
10768
10982
  */
10769
- export declare const storage: {
10770
- get<T>(key: string, fallback: T): T;
10771
- set<T>(key: string, value: T): void;
10772
- remove(key: string): void;
10773
- };
10983
+ export declare const storage: JsonStorage;
10984
+
10985
+ /** How a {@link createJsonStorage} store turns values into text and back. */
10986
+ export declare interface StorageCodec {
10987
+ /** Encode a value for storage. */
10988
+ serialize: <T>(value: T) => string;
10989
+ /** Decode a stored string. */
10990
+ deserialize: <T>(raw: string) => T;
10991
+ }
10774
10992
 
10775
10993
  /** Raw usage/quota reading from the Storage API, in bytes. */
10776
10994
  declare interface StorageEstimate_2 {
@@ -10810,6 +11028,16 @@ export declare interface SyncRunSummary {
10810
11028
  succeeded: number;
10811
11029
  /** Entries that failed and stay queued for the next run. */
10812
11030
  failed: number;
11031
+ /**
11032
+ * Entries left untried because an earlier entry for the **same record**
11033
+ * failed this run.
11034
+ *
11035
+ * They stay queued and are attempted next run, in order. Counted apart from
11036
+ * `failed` because they were never sent: reporting them as failures would
11037
+ * blame the server for a decision this engine made, and folding them in would
11038
+ * make `succeeded + failed` stop accounting for the queue.
11039
+ */
11040
+ deferred: number;
10813
11041
  /** Total wall-clock milliseconds the run took. */
10814
11042
  durationMs: number;
10815
11043
  /** `true` when the run was skipped because the device was offline. */
@@ -11077,6 +11305,7 @@ export declare class TempestApiError extends Error implements ApiError {
11077
11305
  readonly detail: string;
11078
11306
  readonly code?: string;
11079
11307
  readonly requestId?: string;
11308
+ readonly fields?: Record<string, string>;
11080
11309
  readonly body?: unknown;
11081
11310
  constructor(init: ApiError);
11082
11311
  }
@@ -11714,6 +11943,23 @@ export declare interface TransferProps extends Omit<HTMLAttributes<HTMLDivElemen
11714
11943
  /** Which pane an operation is about. */
11715
11944
  export declare type TransferSide = "source" | "target";
11716
11945
 
11946
+ /** Per-call options for {@link I18n.t} and {@link I18n.plural}. */
11947
+ export declare interface TranslateOptions {
11948
+ /**
11949
+ * Text to use when the catalog defines neither the key nor its fallback.
11950
+ *
11951
+ * Without this, a miss returns the key, and a caller that wants its own text
11952
+ * instead has to *detect* the miss — which from the outside means comparing
11953
+ * the result against the key it just passed in. That heuristic is wrong for a
11954
+ * catalog that legitimately maps a key to itself, and it is what every
11955
+ * translatable string the SDK ships would otherwise have to copy.
11956
+ *
11957
+ * Interpolated like any other message, so a default carries `{placeholders}`
11958
+ * too and is not second-class.
11959
+ */
11960
+ default?: string;
11961
+ }
11962
+
11717
11963
  /**
11718
11964
  * Estimated travel between two coordinates. Mirrors the `TravelEstimate`
11719
11965
  * schema from `tempest-fastapi-sdk` (`geo/schemas.py`), snake_case preserved so
@@ -12372,7 +12618,8 @@ export declare interface UseClipboardResult {
12372
12618
  * which a counter held in state cannot do.
12373
12619
  *
12374
12620
  * The interval stops once it reaches zero instead of ticking forever behind a
12375
- * clamp.
12621
+ * clamp — `useInterval` pauses on a `null` delay, so reaching zero is what tears
12622
+ * the timer down.
12376
12623
  *
12377
12624
  * @param durationMs - Length of the window.
12378
12625
  * @param startedAt - Epoch ms the window opened (`Date.now()` when it started).
@@ -12511,29 +12758,6 @@ export declare function useDelete<T>(resource: string, options?: UseDeleteOption
12511
12758
  /** Options for the delete mutation (mutationFn + onSuccess are provided). */
12512
12759
  export declare type UseDeleteOptions<T> = Omit<UseMutationOptions<T, Error, string | number>, "mutationFn">;
12513
12760
 
12514
- /**
12515
- * {@link describeApiError} with its fixed sentences resolved through the active
12516
- * `I18nProvider`.
12517
- *
12518
- * The funnel is not duplicated — this hook only supplies the strings and calls
12519
- * the pure function. Which is also why both exist: the pure one runs in an
12520
- * interceptor or a logger, where there is no React tree to read a context from,
12521
- * and this one runs in a component without every caller passing translations
12522
- * down by hand.
12523
- *
12524
- * Works with no provider at all: i18n is opt-in in this SDK, so a missing
12525
- * provider — or a catalog that never defined `tempest.error.offline` — falls
12526
- * back to the pt-BR default rather than crashing or printing the raw key.
12527
- *
12528
- * @example
12529
- * const describe = useDescribeApiError();
12530
- * const { mutate } = useMutation({
12531
- * mutationFn: save,
12532
- * onError: (error) => toast(describe(error, t("orders.saveFailed"))),
12533
- * });
12534
- *
12535
- * @returns A stable `(error, fallback) => string` function.
12536
- */
12537
12761
  export declare function useDescribeApiError(): (error: unknown, fallback: string) => string;
12538
12762
 
12539
12763
  /**
@@ -12855,6 +13079,17 @@ export declare interface UseKeyboardShortcutOptions {
12855
13079
  * want to *call* — it hands back a callable with a stable identity, rather than
12856
13080
  * making every call site reach through `.current`.
12857
13081
  *
13082
+ * **List the returned ref in your effect's dependencies.** It is a stable object,
13083
+ * so the effect never re-runs because of it, but `react-hooks/exhaustive-deps`
13084
+ * cannot prove that for a custom hook the way it does for a bare `useRef`.
13085
+ * Listing it lets the rule verify the array instead of taking an omission on
13086
+ * trust.
13087
+ *
13088
+ * **Not for holding the previous value.** The write happens during render, so
13089
+ * `.current` is already the current value by the time any effect reads it. A hook
13090
+ * that wants the value from the *previous* commit — `usePrevious` — needs the
13091
+ * effect-based write, and swapping it for this would make it return the present.
13092
+ *
12858
13093
  * @typeParam T - The tracked value.
12859
13094
  * @param value - The value to track. Written on every render.
12860
13095
  * @returns A stable ref whose `current` holds the latest `value`.
@@ -14067,7 +14302,9 @@ export declare interface UseSetResult<T> {
14067
14302
  * `volume` is tracked separately: changing it calls `setVolume` on the existing
14068
14303
  * pool rather than rebuilding it, which would throw away every clip the user
14069
14304
  * has already downloaded — exactly the cost the pool exists to avoid.
14070
- * `baseUrl`, `voices` and `maxSources` are read once, at creation.
14305
+ * `baseUrl`, `voices` and `maxSources` are read once, at creation. The options
14306
+ * object is forwarded whole rather than rebuilt field by field, so a field added
14307
+ * to {@link SfxPoolOptions} does not silently stop reaching the pool.
14071
14308
  *
14072
14309
  * @param options - Passed through to {@link createSfxPool}.
14073
14310
  * @returns A stable pool handle.
@@ -14285,12 +14522,15 @@ export declare interface UseSpeechRecognitionResult {
14285
14522
  * `callback` argument. Use to break dependency cycles in effects without
14286
14523
  * triggering re-runs when the callback identity changes.
14287
14524
  *
14288
- * The assignment happens **during render** on purpose. Moving it into an effect
14289
- * would satisfy the React Compiler rules but open a one-commit staleness window:
14290
- * an effect declared before this hook's own effect, in the same commit, would call
14291
- * the previous render's callback. This is a primitive other hooks build on, so a
14292
- * subtle staleness here is worse than the rule violation. Prefer React's
14525
+ * Built on {@link useLatestRef}, which owns the render-time assignment and the
14526
+ * reason it is not an effect: an effect would satisfy the React Compiler rules
14527
+ * but open a one-commit staleness window. What this adds is the callable with a
14528
+ * stable identity, so callers do not reach through `.current`. Prefer React's
14293
14529
  * `useEffectEvent` once it ships as stable.
14530
+ *
14531
+ * The ref is listed as a dependency because it is one — a stable object across
14532
+ * renders, so the returned identity never changes. Listing it is what lets the
14533
+ * exhaustive-deps rule verify that instead of taking an empty array on trust.
14294
14534
  */
14295
14535
  export declare function useStableCallback<TArgs extends unknown[], TReturn>(callback: (...args: TArgs) => TReturn): (...args: TArgs) => TReturn;
14296
14536
 
@@ -14441,6 +14681,11 @@ export declare function useTranslate(): I18nContextValue["t"];
14441
14681
  * Always give the reader a way out: an animation that cannot be skipped is a
14442
14682
  * tax on anyone re-reading or moving fast, which is what `skip` is for.
14443
14683
  *
14684
+ * How far the reveal got is derived rather than stored: a `speedMs` of `0` reads
14685
+ * as "all of it" without a state write, and `useInterval` pausing on a `null`
14686
+ * delay is what stops the timer at the end. Both used to need an effect that
14687
+ * cleared its own interval from inside a state updater.
14688
+ *
14444
14689
  * @param text - The full string to reveal. Nullish is treated as empty.
14445
14690
  * @param speedMs - Delay between characters. `0` or less renders instantly,
14446
14691
  * which is the hook-safe way to honour `prefers-reduced-motion`.