tempest-react-sdk 0.25.0 → 0.26.1

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 (322) hide show
  1. package/README.md +14 -1
  2. package/bin/lib/alias/collect.mjs +94 -0
  3. package/bin/lib/alias/collect.test.mjs +95 -0
  4. package/bin/lib/alias/discover.mjs +77 -0
  5. package/bin/lib/alias/discover.test.mjs +189 -0
  6. package/bin/lib/alias/index.mjs +88 -0
  7. package/bin/lib/alias/index.test.mjs +138 -0
  8. package/bin/lib/alias/rewrite-css.mjs +76 -0
  9. package/bin/lib/alias/rewrite-css.test.mjs +85 -0
  10. package/bin/lib/alias/rewrite.mjs +141 -0
  11. package/bin/lib/alias/rewrite.test.mjs +148 -0
  12. package/bin/lib/alias/specifier.mjs +49 -0
  13. package/bin/lib/alias/specifier.test.mjs +85 -0
  14. package/bin/lib/alias/tsconfig.mjs +116 -0
  15. package/bin/lib/alias/typescript.mjs +23 -0
  16. package/bin/lib/doctor/lucide.mjs +74 -0
  17. package/bin/lib/doctor/lucide.test.mjs +107 -0
  18. package/bin/lib/icons/generate.mjs +156 -0
  19. package/bin/lib/icons/generate.test.mjs +125 -0
  20. package/bin/tempest.mjs +174 -13
  21. package/dist/audio/use-audio.cjs +1 -1
  22. package/dist/audio/use-audio.cjs.map +1 -1
  23. package/dist/audio/use-audio.js +12 -12
  24. package/dist/audio/use-audio.js.map +1 -1
  25. package/dist/charts/palette.cjs +1 -1
  26. package/dist/charts/palette.cjs.map +1 -1
  27. package/dist/charts/palette.js +2 -2
  28. package/dist/charts/palette.js.map +1 -1
  29. package/dist/charts.d.ts +5 -3
  30. package/dist/components/ClickOutside/ClickOutside.cjs +1 -1
  31. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  32. package/dist/components/ClickOutside/ClickOutside.js +3 -1
  33. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  34. package/dist/components/DataTable/DataTable.cjs +1 -1
  35. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  36. package/dist/components/DataTable/DataTable.js +21 -23
  37. package/dist/components/DataTable/DataTable.js.map +1 -1
  38. package/dist/components/Kanban/Kanban.cjs +2 -0
  39. package/dist/components/Kanban/Kanban.cjs.map +1 -0
  40. package/dist/components/Kanban/Kanban.js +102 -0
  41. package/dist/components/Kanban/Kanban.js.map +1 -0
  42. package/dist/components/Kanban/Kanban.module.cjs +2 -0
  43. package/dist/components/Kanban/Kanban.module.cjs.map +1 -0
  44. package/dist/components/Kanban/Kanban.module.js +19 -0
  45. package/dist/components/Kanban/Kanban.module.js.map +1 -0
  46. package/dist/components/NotificationCenter/NotificationCenter.cjs +2 -0
  47. package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -0
  48. package/dist/components/NotificationCenter/NotificationCenter.js +83 -0
  49. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -0
  50. package/dist/components/NotificationCenter/NotificationCenter.module.cjs +2 -0
  51. package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -0
  52. package/dist/components/NotificationCenter/NotificationCenter.module.js +21 -0
  53. package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -0
  54. package/dist/components/NotificationCenter/use-notification-inbox.cjs +2 -0
  55. package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -0
  56. package/dist/components/NotificationCenter/use-notification-inbox.js +63 -0
  57. package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -0
  58. package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
  59. package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
  60. package/dist/components/RefreshIndicator/RefreshIndicator.js +17 -17
  61. package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
  62. package/dist/components/Tooltip/Tooltip.cjs +1 -1
  63. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  64. package/dist/components/Tooltip/Tooltip.js +26 -20
  65. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  66. package/dist/components/VirtualTable/VirtualTable.cjs +2 -0
  67. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -0
  68. package/dist/components/VirtualTable/VirtualTable.js +116 -0
  69. package/dist/components/VirtualTable/VirtualTable.js.map +1 -0
  70. package/dist/components/VirtualTable/VirtualTable.module.cjs +2 -0
  71. package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -0
  72. package/dist/components/VirtualTable/VirtualTable.module.js +20 -0
  73. package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -0
  74. package/dist/components/Wizard/Wizard.cjs +1 -1
  75. package/dist/components/Wizard/Wizard.cjs.map +1 -1
  76. package/dist/components/Wizard/Wizard.js +53 -53
  77. package/dist/components/Wizard/Wizard.js.map +1 -1
  78. package/dist/geo/use-position-tracker.cjs +1 -1
  79. package/dist/geo/use-position-tracker.cjs.map +1 -1
  80. package/dist/geo/use-position-tracker.js +3 -1
  81. package/dist/geo/use-position-tracker.js.map +1 -1
  82. package/dist/hooks/use-async.cjs +1 -1
  83. package/dist/hooks/use-async.cjs.map +1 -1
  84. package/dist/hooks/use-async.js +3 -1
  85. package/dist/hooks/use-async.js.map +1 -1
  86. package/dist/hooks/use-click-outside.cjs +1 -1
  87. package/dist/hooks/use-click-outside.cjs.map +1 -1
  88. package/dist/hooks/use-click-outside.js +3 -1
  89. package/dist/hooks/use-click-outside.js.map +1 -1
  90. package/dist/hooks/use-deep-memo.cjs.map +1 -1
  91. package/dist/hooks/use-deep-memo.js.map +1 -1
  92. package/dist/hooks/use-event-listener.cjs +1 -1
  93. package/dist/hooks/use-event-listener.cjs.map +1 -1
  94. package/dist/hooks/use-event-listener.js +3 -1
  95. package/dist/hooks/use-event-listener.js.map +1 -1
  96. package/dist/hooks/use-interval.cjs +1 -1
  97. package/dist/hooks/use-interval.cjs.map +1 -1
  98. package/dist/hooks/use-interval.js +3 -1
  99. package/dist/hooks/use-interval.js.map +1 -1
  100. package/dist/hooks/use-is-first-render.cjs.map +1 -1
  101. package/dist/hooks/use-is-first-render.js.map +1 -1
  102. package/dist/hooks/use-long-press-handlers.cjs +1 -1
  103. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  104. package/dist/hooks/use-long-press-handlers.js +25 -23
  105. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  106. package/dist/hooks/use-long-press.cjs +1 -1
  107. package/dist/hooks/use-long-press.cjs.map +1 -1
  108. package/dist/hooks/use-long-press.js +3 -1
  109. package/dist/hooks/use-long-press.js.map +1 -1
  110. package/dist/hooks/use-online.cjs +1 -1
  111. package/dist/hooks/use-online.cjs.map +1 -1
  112. package/dist/hooks/use-online.js +6 -4
  113. package/dist/hooks/use-online.js.map +1 -1
  114. package/dist/hooks/use-previous.cjs.map +1 -1
  115. package/dist/hooks/use-previous.js.map +1 -1
  116. package/dist/hooks/use-service-worker-update.cjs +1 -1
  117. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  118. package/dist/hooks/use-service-worker-update.js +3 -1
  119. package/dist/hooks/use-service-worker-update.js.map +1 -1
  120. package/dist/hooks/use-sortable.cjs +2 -0
  121. package/dist/hooks/use-sortable.cjs.map +1 -0
  122. package/dist/hooks/use-sortable.js +169 -0
  123. package/dist/hooks/use-sortable.js.map +1 -0
  124. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  125. package/dist/hooks/use-stable-callback.js.map +1 -1
  126. package/dist/hooks/use-timeout.cjs +1 -1
  127. package/dist/hooks/use-timeout.cjs.map +1 -1
  128. package/dist/hooks/use-timeout.js +3 -1
  129. package/dist/hooks/use-timeout.js.map +1 -1
  130. package/dist/icons/Icon.cjs +2 -0
  131. package/dist/icons/Icon.cjs.map +1 -0
  132. package/dist/icons/Icon.js +24 -0
  133. package/dist/icons/Icon.js.map +1 -0
  134. package/dist/icons/IconProvider.cjs +2 -0
  135. package/dist/icons/IconProvider.cjs.map +1 -0
  136. package/dist/icons/IconProvider.js +24 -0
  137. package/dist/icons/IconProvider.js.map +1 -0
  138. package/dist/icons/generated/aliases.cjs +2 -0
  139. package/dist/icons/generated/aliases.cjs.map +1 -0
  140. package/dist/icons/generated/aliases.js +255 -0
  141. package/dist/icons/generated/aliases.js.map +1 -0
  142. package/dist/icons/generated/icon-names.cjs +2 -0
  143. package/dist/icons/generated/icon-names.cjs.map +1 -0
  144. package/dist/icons/generated/icon-names.js +6 -0
  145. package/dist/icons/generated/icon-names.js.map +1 -0
  146. package/dist/icons/generated/loaders.cjs +2 -0
  147. package/dist/icons/generated/loaders.cjs.map +1 -0
  148. package/dist/icons/generated/loaders.js +32 -0
  149. package/dist/icons/generated/loaders.js.map +1 -0
  150. package/dist/icons/generated/shard-a.cjs +2 -0
  151. package/dist/icons/generated/shard-a.cjs.map +1 -0
  152. package/dist/icons/generated/shard-a.js +114 -0
  153. package/dist/icons/generated/shard-a.js.map +1 -0
  154. package/dist/icons/generated/shard-b.cjs +2 -0
  155. package/dist/icons/generated/shard-b.cjs.map +1 -0
  156. package/dist/icons/generated/shard-b.js +156 -0
  157. package/dist/icons/generated/shard-b.js.map +1 -0
  158. package/dist/icons/generated/shard-c.cjs +2 -0
  159. package/dist/icons/generated/shard-c.cjs.map +1 -0
  160. package/dist/icons/generated/shard-c.js +269 -0
  161. package/dist/icons/generated/shard-c.js.map +1 -0
  162. package/dist/icons/generated/shard-d.cjs +2 -0
  163. package/dist/icons/generated/shard-d.cjs.map +1 -0
  164. package/dist/icons/generated/shard-d.js +62 -0
  165. package/dist/icons/generated/shard-d.js.map +1 -0
  166. package/dist/icons/generated/shard-e.cjs +2 -0
  167. package/dist/icons/generated/shard-e.cjs.map +1 -0
  168. package/dist/icons/generated/shard-e.js +32 -0
  169. package/dist/icons/generated/shard-e.js.map +1 -0
  170. package/dist/icons/generated/shard-f.cjs +2 -0
  171. package/dist/icons/generated/shard-f.cjs.map +1 -0
  172. package/dist/icons/generated/shard-f.js +139 -0
  173. package/dist/icons/generated/shard-f.js.map +1 -0
  174. package/dist/icons/generated/shard-g.cjs +2 -0
  175. package/dist/icons/generated/shard-g.cjs.map +1 -0
  176. package/dist/icons/generated/shard-g.js +61 -0
  177. package/dist/icons/generated/shard-g.js.map +1 -0
  178. package/dist/icons/generated/shard-h.cjs +2 -0
  179. package/dist/icons/generated/shard-h.cjs.map +1 -0
  180. package/dist/icons/generated/shard-h.js +63 -0
  181. package/dist/icons/generated/shard-h.js.map +1 -0
  182. package/dist/icons/generated/shard-i.cjs +2 -0
  183. package/dist/icons/generated/shard-i.cjs.map +1 -0
  184. package/dist/icons/generated/shard-i.js +30 -0
  185. package/dist/icons/generated/shard-i.js.map +1 -0
  186. package/dist/icons/generated/shard-j.cjs +2 -0
  187. package/dist/icons/generated/shard-j.cjs.map +1 -0
  188. package/dist/icons/generated/shard-j.js +10 -0
  189. package/dist/icons/generated/shard-j.js.map +1 -0
  190. package/dist/icons/generated/shard-k.cjs +2 -0
  191. package/dist/icons/generated/shard-k.cjs.map +1 -0
  192. package/dist/icons/generated/shard-k.js +16 -0
  193. package/dist/icons/generated/shard-k.js.map +1 -0
  194. package/dist/icons/generated/shard-l.cjs +2 -0
  195. package/dist/icons/generated/shard-l.cjs.map +1 -0
  196. package/dist/icons/generated/shard-l.js +88 -0
  197. package/dist/icons/generated/shard-l.js.map +1 -0
  198. package/dist/icons/generated/shard-m.cjs +2 -0
  199. package/dist/icons/generated/shard-m.cjs.map +1 -0
  200. package/dist/icons/generated/shard-m.js +140 -0
  201. package/dist/icons/generated/shard-m.js.map +1 -0
  202. package/dist/icons/generated/shard-n.cjs +2 -0
  203. package/dist/icons/generated/shard-n.cjs.map +1 -0
  204. package/dist/icons/generated/shard-n.js +24 -0
  205. package/dist/icons/generated/shard-n.js.map +1 -0
  206. package/dist/icons/generated/shard-o.cjs +2 -0
  207. package/dist/icons/generated/shard-o.cjs.map +1 -0
  208. package/dist/icons/generated/shard-o.js +17 -0
  209. package/dist/icons/generated/shard-o.js.map +1 -0
  210. package/dist/icons/generated/shard-p.cjs +2 -0
  211. package/dist/icons/generated/shard-p.cjs.map +1 -0
  212. package/dist/icons/generated/shard-p.js +115 -0
  213. package/dist/icons/generated/shard-p.js.map +1 -0
  214. package/dist/icons/generated/shard-q.cjs +2 -0
  215. package/dist/icons/generated/shard-q.cjs.map +1 -0
  216. package/dist/icons/generated/shard-q.js +10 -0
  217. package/dist/icons/generated/shard-q.js.map +1 -0
  218. package/dist/icons/generated/shard-r.cjs +2 -0
  219. package/dist/icons/generated/shard-r.cjs.map +1 -0
  220. package/dist/icons/generated/shard-r.js +77 -0
  221. package/dist/icons/generated/shard-r.js.map +1 -0
  222. package/dist/icons/generated/shard-s.cjs +2 -0
  223. package/dist/icons/generated/shard-s.cjs.map +1 -0
  224. package/dist/icons/generated/shard-s.js +255 -0
  225. package/dist/icons/generated/shard-s.js.map +1 -0
  226. package/dist/icons/generated/shard-t.cjs +2 -0
  227. package/dist/icons/generated/shard-t.cjs.map +1 -0
  228. package/dist/icons/generated/shard-t.js +109 -0
  229. package/dist/icons/generated/shard-t.js.map +1 -0
  230. package/dist/icons/generated/shard-u.cjs +2 -0
  231. package/dist/icons/generated/shard-u.cjs.map +1 -0
  232. package/dist/icons/generated/shard-u.js +49 -0
  233. package/dist/icons/generated/shard-u.js.map +1 -0
  234. package/dist/icons/generated/shard-v.cjs +2 -0
  235. package/dist/icons/generated/shard-v.cjs.map +1 -0
  236. package/dist/icons/generated/shard-v.js +30 -0
  237. package/dist/icons/generated/shard-v.js.map +1 -0
  238. package/dist/icons/generated/shard-w.cjs +2 -0
  239. package/dist/icons/generated/shard-w.cjs.map +1 -0
  240. package/dist/icons/generated/shard-w.js +48 -0
  241. package/dist/icons/generated/shard-w.js.map +1 -0
  242. package/dist/icons/generated/shard-x.cjs +2 -0
  243. package/dist/icons/generated/shard-x.cjs.map +1 -0
  244. package/dist/icons/generated/shard-x.js +10 -0
  245. package/dist/icons/generated/shard-x.js.map +1 -0
  246. package/dist/icons/generated/shard-z.cjs +2 -0
  247. package/dist/icons/generated/shard-z.cjs.map +1 -0
  248. package/dist/icons/generated/shard-z.js +25 -0
  249. package/dist/icons/generated/shard-z.js.map +1 -0
  250. package/dist/icons/icon-context.cjs +2 -0
  251. package/dist/icons/icon-context.cjs.map +1 -0
  252. package/dist/icons/icon-context.js +13 -0
  253. package/dist/icons/icon-context.js.map +1 -0
  254. package/dist/icons/is-icon-name.cjs +2 -0
  255. package/dist/icons/is-icon-name.cjs.map +1 -0
  256. package/dist/icons/is-icon-name.js +10 -0
  257. package/dist/icons/is-icon-name.js.map +1 -0
  258. package/dist/icons/shard-cache.cjs +2 -0
  259. package/dist/icons/shard-cache.cjs.map +1 -0
  260. package/dist/icons/shard-cache.js +41 -0
  261. package/dist/icons/shard-cache.js.map +1 -0
  262. package/dist/icons/use-icon.cjs +2 -0
  263. package/dist/icons/use-icon.cjs.map +1 -0
  264. package/dist/icons/use-icon.js +20 -0
  265. package/dist/icons/use-icon.js.map +1 -0
  266. package/dist/icons-virtual.d.ts +22 -0
  267. package/dist/icons.cjs +1 -0
  268. package/dist/icons.d.ts +220 -0
  269. package/dist/icons.js +9 -0
  270. package/dist/offline/use-offline-sync.cjs +1 -1
  271. package/dist/offline/use-offline-sync.cjs.map +1 -1
  272. package/dist/offline/use-offline-sync.js +3 -1
  273. package/dist/offline/use-offline-sync.js.map +1 -1
  274. package/dist/push/use-push-subscription.cjs +1 -1
  275. package/dist/push/use-push-subscription.cjs.map +1 -1
  276. package/dist/push/use-push-subscription.js +3 -1
  277. package/dist/push/use-push-subscription.js.map +1 -1
  278. package/dist/sse/use-event-stream.cjs +1 -1
  279. package/dist/sse/use-event-stream.cjs.map +1 -1
  280. package/dist/sse/use-event-stream.js +3 -1
  281. package/dist/sse/use-event-stream.js.map +1 -1
  282. package/dist/styles.css +1 -1
  283. package/dist/tempest-react-sdk.cjs +1 -1
  284. package/dist/tempest-react-sdk.d.ts +585 -3
  285. package/dist/tempest-react-sdk.js +189 -183
  286. package/dist/theme/ThemeProvider.cjs +1 -1
  287. package/dist/theme/ThemeProvider.cjs.map +1 -1
  288. package/dist/theme/ThemeProvider.js +6 -2
  289. package/dist/theme/ThemeProvider.js.map +1 -1
  290. package/dist/theme/color.cjs +1 -1
  291. package/dist/theme/color.cjs.map +1 -1
  292. package/dist/theme/color.js +77 -46
  293. package/dist/theme/color.js.map +1 -1
  294. package/dist/theme/create-theme.cjs +1 -1
  295. package/dist/theme/create-theme.cjs.map +1 -1
  296. package/dist/theme/create-theme.js +9 -3
  297. package/dist/theme/create-theme.js.map +1 -1
  298. package/dist/utils/compare-values.cjs +2 -0
  299. package/dist/utils/compare-values.cjs.map +1 -0
  300. package/dist/utils/compare-values.js +8 -0
  301. package/dist/utils/compare-values.js.map +1 -0
  302. package/dist/vision/use-camera-stream.cjs +1 -1
  303. package/dist/vision/use-camera-stream.cjs.map +1 -1
  304. package/dist/vision/use-camera-stream.js +3 -1
  305. package/dist/vision/use-camera-stream.js.map +1 -1
  306. package/dist/vite/create-vite-config.cjs +1 -1
  307. package/dist/vite/create-vite-config.cjs.map +1 -1
  308. package/dist/vite/create-vite-config.js +30 -22
  309. package/dist/vite/create-vite-config.js.map +1 -1
  310. package/dist/vite/tempest-icons.cjs +9 -0
  311. package/dist/vite/tempest-icons.cjs.map +1 -0
  312. package/dist/vite/tempest-icons.js +99 -0
  313. package/dist/vite/tempest-icons.js.map +1 -0
  314. package/dist/vite.cjs +1 -1
  315. package/dist/vite.d.ts +79 -0
  316. package/dist/vite.js +6 -5
  317. package/dist/ws/use-web-socket.cjs +1 -1
  318. package/dist/ws/use-web-socket.cjs.map +1 -1
  319. package/dist/ws/use-web-socket.js +3 -1
  320. package/dist/ws/use-web-socket.js.map +1 -1
  321. package/package.json +12 -3
  322. package/template/package.json +1 -1
@@ -32,6 +32,7 @@ import { InfiniteData } from '@tanstack/react-query';
32
32
  import { InputEventHandler } from 'react';
33
33
  import { InputHTMLAttributes } from 'react';
34
34
  import { JSX } from 'react';
35
+ import { KeyboardEvent as KeyboardEvent_2 } from 'react';
35
36
  import { KeyboardEventHandler } from 'react';
36
37
  import { LabelHTMLAttributes } from 'react';
37
38
  import { lazy } from 'react';
@@ -46,6 +47,7 @@ import { Outlet } from 'react-router';
46
47
  import { Params } from 'react-router';
47
48
  import { Path } from 'react-hook-form';
48
49
  import { PersistOptions } from 'zustand/middleware';
50
+ import { PointerEvent as PointerEvent_2 } from 'react';
49
51
  import { PointerEventHandler } from 'react';
50
52
  import { QueryClient } from '@tanstack/react-query';
51
53
  import { QueryKey } from '@tanstack/react-query';
@@ -304,6 +306,24 @@ export declare interface AppBarProps extends Omit<HTMLAttributes<HTMLElement>, "
304
306
 
305
307
  export declare type AppBarTone = "surface" | "primary" | "transparent";
306
308
 
309
+ /**
310
+ * Apply a {@link KanbanMove} to a column list, returning new arrays.
311
+ *
312
+ * Exported because every consumer needs the same reducer.
313
+ *
314
+ * `toIndex` is the position of the card that was dropped **onto**, read from the
315
+ * board as it looked before the move. Inserting at that same index *after* removing
316
+ * the dragged card lands where the user aimed in both directions — moving down, the
317
+ * removal shifts the target up by one and the insertion lands after it; moving up,
318
+ * nothing shifted. Compensating for the shift (the "obvious" `toIndex - 1`) is what
319
+ * turns a one-step move down into a no-op.
320
+ *
321
+ * @param columns - Current board.
322
+ * @param move - The move reported by `onMove`.
323
+ * @returns A new column list, or the same reference when the move cannot apply.
324
+ */
325
+ export declare function applyKanbanMove(columns: KanbanColumn[], move: KanbanMove): KanbanColumn[];
326
+
307
327
  /**
308
328
  * Install a generated theme (or raw CSS) into the document.
309
329
  *
@@ -1221,6 +1241,30 @@ export declare interface CollapsibleProps extends HTMLAttributes<HTMLDivElement>
1221
1241
  /** A generated tint scale, keyed by step. */
1222
1242
  export declare type ColorScale = Record<ScaleStep, string>;
1223
1243
 
1244
+ /** Options for {@link createColorScale}. */
1245
+ declare interface ColorScaleOptions {
1246
+ /**
1247
+ * Pin step `500` to the input color's exact lightness. Default `true`.
1248
+ *
1249
+ * Right for a **brand** color: the hex a designer hands over is the one the
1250
+ * buttons must be. Wrong for a **neutral**: nobody checks that `gray-500` is
1251
+ * exactly the input, while everybody notices that a surface stopped being
1252
+ * near-white — anchoring rescales both halves around the input and compresses
1253
+ * exactly the range a neutral needs wide. With `false`, the ramp keeps the
1254
+ * tuned lightness curve and the input only contributes hue and chroma (a warm
1255
+ * or cool neutral, as asked).
1256
+ */
1257
+ anchor?: boolean;
1258
+ /**
1259
+ * Use the neutral lightness curve instead of the brand one. Default `false`.
1260
+ *
1261
+ * The neutral curve is wider at both ends, which is what keeps
1262
+ * `text-muted`-on-`surface-3` above AA. Implies the ramp is meant for
1263
+ * surfaces, borders and text rather than for an action color.
1264
+ */
1265
+ neutral?: boolean;
1266
+ }
1267
+
1224
1268
  /**
1225
1269
  * Combobox — text input with a filterable dropdown of options.
1226
1270
  *
@@ -1289,6 +1333,25 @@ export declare interface CommandProps {
1289
1333
  className?: string;
1290
1334
  }
1291
1335
 
1336
+ /**
1337
+ * Compare two arbitrary cell values with stable, type-aware ordering.
1338
+ *
1339
+ * The comparator every table in the SDK sorts with, so `DataTable` and
1340
+ * `VirtualTable` agree on what "sorted" means. The type-aware branches exist
1341
+ * because the naive `String(a) < String(b)` gets the two most common cases wrong:
1342
+ * numbers would sort `10` before `9`, and dates would sort by their formatted
1343
+ * text. Strings fall back to `localeCompare` with `numeric: true`, so `"item 2"`
1344
+ * lands before `"item 10"`.
1345
+ *
1346
+ * `null` and `undefined` sort first, together — a missing value is not smaller
1347
+ * than another missing value.
1348
+ *
1349
+ * @param a - First value.
1350
+ * @param b - Second value.
1351
+ * @returns Negative when `a < b`, positive when `a > b`, zero when equal.
1352
+ */
1353
+ export declare function compareValues(a: unknown, b: unknown): number;
1354
+
1292
1355
  /**
1293
1356
  * Conditionally wraps its children with `wrapper`.
1294
1357
  *
@@ -1503,7 +1566,7 @@ export declare interface CreateAuthStoreOptions<TUser> {
1503
1566
  }
1504
1567
 
1505
1568
  /**
1506
- * Build a ten-step tint scale from a single brand color.
1569
+ * Build a ten-step tint scale from a single color.
1507
1570
  *
1508
1571
  * The input color's hue is kept throughout and its chroma sets the intensity of
1509
1572
  * the whole ramp, so a muted brand color yields a muted scale instead of being
@@ -1512,8 +1575,9 @@ export declare interface CreateAuthStoreOptions<TUser> {
1512
1575
  * @param hex - Any hex color (`#abc` or `#aabbcc`), the intended `500` step.
1513
1576
  * @param mode - `"light"` for a light→dark ramp, `"dark"` for the inverted ramp
1514
1577
  * used under `[data-tempest-theme="dark"]`.
1578
+ * @param options - See {@link ColorScaleOptions}.
1515
1579
  */
1516
- export declare function createColorScale(hex: string, mode?: "light" | "dark"): ColorScale;
1580
+ export declare function createColorScale(hex: string, mode?: "light" | "dark", options?: ColorScaleOptions): ColorScale;
1517
1581
 
1518
1582
  /**
1519
1583
  * Create a {@link DataProvider} bound to an {@link ApiClient}.
@@ -3969,6 +4033,109 @@ export declare function isValidLatitude(value: number): boolean;
3969
4033
  /** True when `value` is a finite longitude in `[-180, 180]`. */
3970
4034
  export declare function isValidLongitude(value: number): boolean;
3971
4035
 
4036
+ /**
4037
+ * Kanban board: columns of cards, reorderable within a column and movable across
4038
+ * columns, by pointer **or** keyboard.
4039
+ *
4040
+ * The drag machine is `useSortable` — the board does not reimplement it. Cards are
4041
+ * indexed globally across columns so a single sortable can span the whole board;
4042
+ * the component translates that flat index back into `{ column, index }` for
4043
+ * `onMove`, which is the shape an app actually needs.
4044
+ *
4045
+ * Nothing is mutated here: `onMove` reports the intent once and the parent applies
4046
+ * it. That keeps the board a controlled value and avoids a re-render per pointer
4047
+ * frame.
4048
+ *
4049
+ * ARIA shape: **one `listbox` per column**, named by the column title, containing
4050
+ * only `option` cards. A single board-wide listbox does not survive the markup a
4051
+ * board needs — `listbox` requires `option`/`group` children, and the column header
4052
+ * and card wrapper in between break that ownership. Per-column listboxes also read
4053
+ * better: a screen reader announces which column it is in and how many cards it
4054
+ * holds. The column header is a plain `div`, not a `<header>`, because outside a
4055
+ * sectioning element every `<header>` becomes a page-level banner landmark — with
4056
+ * three columns that is three duplicate banners. An **empty** column is not marked
4057
+ * as a listbox at all: a listbox with zero options fails `aria-required-children`,
4058
+ * and "no cards" is exactly zero options.
4059
+ *
4060
+ * Known limitation: a **keyboard** move can only target positions that hold a card,
4061
+ * because the move walks the flat index space of existing cards. Dropping into an
4062
+ * empty column works by pointer; by keyboard it does not. Moving a card to a column
4063
+ * that already has one card, then reordering, is the workaround until column-switch
4064
+ * keys land.
4065
+ *
4066
+ * @example
4067
+ * ```tsx
4068
+ * const [columns, setColumns] = useState<KanbanColumn[]>([
4069
+ * { id: "todo", title: "A fazer", cards: [{ id: "1", content: "Corrigir login" }] },
4070
+ * { id: "doing", title: "Fazendo", cards: [] },
4071
+ * { id: "done", title: "Feito", cards: [], locked: true },
4072
+ * ]);
4073
+ *
4074
+ * <Kanban
4075
+ * columns={columns}
4076
+ * onMove={({ cardId, fromColumn, toColumn, toIndex }) =>
4077
+ * setColumns((current) => applyKanbanMove(current, { cardId, fromColumn, toColumn, toIndex }))
4078
+ * }
4079
+ * />
4080
+ * ```
4081
+ */
4082
+ export declare function Kanban({ columns, onMove, renderCard, emptyLabel, cardRoleDescription, label, disabled, className, }: KanbanProps): JSX.Element;
4083
+
4084
+ /** One card on the board. */
4085
+ export declare interface KanbanCard {
4086
+ /** Stable identifier, unique across the whole board. */
4087
+ id: string;
4088
+ /** Card body. A string renders as the card's title. */
4089
+ content: ReactNode;
4090
+ }
4091
+
4092
+ /** One column of the board. */
4093
+ export declare interface KanbanColumn {
4094
+ /** Stable identifier, used as the drop group. */
4095
+ id: string;
4096
+ /** Column heading. */
4097
+ title: ReactNode;
4098
+ /** Cards in display order. */
4099
+ cards: KanbanCard[];
4100
+ /**
4101
+ * Refuses drops into this column. The cards inside can still be picked up and
4102
+ * moved elsewhere — a "done" column that no longer accepts work, for instance.
4103
+ */
4104
+ locked?: boolean;
4105
+ }
4106
+
4107
+ /** Where a card ended up. */
4108
+ export declare interface KanbanMove {
4109
+ cardId: string;
4110
+ fromColumn: string;
4111
+ toColumn: string;
4112
+ /** Index within the destination column. */
4113
+ toIndex: number;
4114
+ }
4115
+
4116
+ export declare interface KanbanProps {
4117
+ columns: KanbanColumn[];
4118
+ /**
4119
+ * Called once per committed move — on pointer release or on a keyboard drop.
4120
+ * You own the data: apply the move and pass the new `columns` back.
4121
+ */
4122
+ onMove: (move: KanbanMove) => void;
4123
+ /** Renders a card. Defaults to its `content`. */
4124
+ renderCard?: (card: KanbanCard, column: KanbanColumn) => ReactNode;
4125
+ /** Text shown in a column with no cards. */
4126
+ emptyLabel?: ReactNode;
4127
+ /** Announced per card, so a screen reader user learns the keyboard contract. */
4128
+ cardRoleDescription?: string;
4129
+ /**
4130
+ * Accessible name of the board. A `listbox` without a name is unusable with a
4131
+ * screen reader, so this has a default rather than being optional in practice.
4132
+ */
4133
+ label?: string;
4134
+ /** Blocks all dragging. */
4135
+ disabled?: boolean;
4136
+ className?: string;
4137
+ }
4138
+
3972
4139
  /**
3973
4140
  * Renders a `<kbd>` styled like a keyboard key — useful for shortcut hints.
3974
4141
  * Compose multiple keys by rendering siblings: `<Kbd>Ctrl</Kbd> + <Kbd>K</Kbd>`.
@@ -4456,6 +4623,9 @@ export declare interface MoneyProps extends HTMLAttributes<HTMLSpanElement> {
4456
4623
  locale?: string;
4457
4624
  }
4458
4625
 
4626
+ /** Reorder helper: move `from` to `to`, returning a new array. */
4627
+ export declare function moveItem<T>(items: T[], from: number, to: number): T[];
4628
+
4459
4629
  /**
4460
4630
  * MultiSelect — a filterable dropdown that selects many options, shown as
4461
4631
  * removable chips inside the field. Selecting toggles a value; Backspace on an
@@ -4627,6 +4797,78 @@ export { NavLink }
4627
4797
  */
4628
4798
  export declare function normalizeLongitude(longitude: number): number;
4629
4799
 
4800
+ /**
4801
+ * Inbox panel for notifications the app has received.
4802
+ *
4803
+ * Deliberately presentational and controlled: it takes a list and emits intent.
4804
+ * Where the list comes from — an API, a service-worker push, `localStorage` — and
4805
+ * where read state is written are app decisions, and a component that assumed any
4806
+ * of them would be wrong for most apps. `useNotificationInbox` is the companion
4807
+ * that holds the state, including the service-worker bridge.
4808
+ *
4809
+ * It is also just the panel, not a popover: apps mount it inside their own
4810
+ * `Popover`, `Drawer` or route. That keeps one component from owning both the
4811
+ * inbox and a positioning strategy.
4812
+ *
4813
+ * @example
4814
+ * const inbox = useNotificationInbox();
4815
+ *
4816
+ * <Popover trigger={<Button>Notificações ({inbox.unreadCount})</Button>}>
4817
+ * <NotificationCenter
4818
+ * items={inbox.items}
4819
+ * onMarkRead={inbox.markRead}
4820
+ * onMarkAllRead={inbox.markAllRead}
4821
+ * onDismiss={inbox.remove}
4822
+ * onSelect={(item) => item.url && navigate(item.url)}
4823
+ * />
4824
+ * </Popover>
4825
+ */
4826
+ export declare function NotificationCenter({ items, title, onSelect, onMarkRead, onMarkAllRead, onDismiss, renderIcon, locale, emptyState, now, className, ...rest }: NotificationCenterProps): JSX.Element;
4827
+
4828
+ export declare interface NotificationCenterProps extends Omit<HTMLAttributes<HTMLDivElement>, OverriddenDomProps> {
4829
+ /** Entries to show. Rendered in the order given — `useNotificationInbox` sorts newest first. */
4830
+ items: readonly NotificationItem[];
4831
+ /**
4832
+ * Panel heading. Pass `null` to render the list with no header.
4833
+ *
4834
+ * Widened from the DOM `title` attribute (a `string`) on purpose: this is a
4835
+ * rendered heading, not a tooltip, so it takes a node.
4836
+ */
4837
+ title?: ReactNode;
4838
+ /** Activate an entry: click, `Enter` or `Space`. Also marks it read when `onMarkRead` is set. */
4839
+ onSelect?: (item: NotificationItem) => void;
4840
+ /** Mark one entry as read. Enables the per-item read control. */
4841
+ onMarkRead?: (id: string) => void;
4842
+ /** Mark every entry as read. Enables the header action. */
4843
+ onMarkAllRead?: () => void;
4844
+ /** Remove one entry. Enables the per-item dismiss control. */
4845
+ onDismiss?: (id: string) => void;
4846
+ /** Icon rendered at the leading edge of each row — an `<Icon name={…} />`, say. */
4847
+ renderIcon?: (item: NotificationItem) => ReactNode;
4848
+ /** Locale for the relative timestamps. Default `"pt-BR"`. */
4849
+ locale?: RelativeTimeLocale;
4850
+ /** Shown when `items` is empty. */
4851
+ emptyState?: ReactNode;
4852
+ /** Reference point for the relative timestamps. Default: now, at render time. */
4853
+ now?: number;
4854
+ }
4855
+
4856
+ /** One entry in the inbox. */
4857
+ export declare interface NotificationItem {
4858
+ /** Stable id. Re-adding an existing id updates that entry instead of duplicating it. */
4859
+ id: string;
4860
+ title: string;
4861
+ /** Body text. Optional — a title-only notification is a legitimate shape. */
4862
+ body?: string;
4863
+ /** Epoch milliseconds. Used for ordering and for the relative timestamp. */
4864
+ receivedAt: number;
4865
+ read?: boolean;
4866
+ /** Where activating the notification should take the user. */
4867
+ url?: string;
4868
+ /** Free-form payload the app passes through, e.g. the entity it refers to. */
4869
+ data?: Record<string, unknown>;
4870
+ }
4871
+
4630
4872
  /**
4631
4873
  * Module-level singleton progress controller. Drive it imperatively from
4632
4874
  * anywhere (router transitions, fetch interceptors) and render the visual bar
@@ -5091,6 +5333,16 @@ export declare type OutboxOp = "create" | "update" | "delete";
5091
5333
 
5092
5334
  export { Outlet }
5093
5335
 
5336
+ /**
5337
+ * DOM attributes this component redefines.
5338
+ *
5339
+ * `title` becomes a rendered heading node instead of a tooltip string, and
5340
+ * `onSelect` becomes "an entry was activated" instead of the DOM text-selection
5341
+ * event. Both would be type errors if merged, and silently confusing if allowed
5342
+ * through.
5343
+ */
5344
+ declare type OverriddenDomProps = "children" | "title" | "onSelect";
5345
+
5094
5346
  /**
5095
5347
  * Page wrapper with header + (optional) toolbar + content + footer. Pairs
5096
5348
  * with `Container` when you want a max-width content well.
@@ -6436,6 +6688,40 @@ export declare interface SliderProps {
6436
6688
  */
6437
6689
  export declare function slugify(input: string): string;
6438
6690
 
6691
+ /** Where a dragged item would land if dropped now. */
6692
+ export declare interface SortableDropTarget {
6693
+ /** Index the item started at, within its own group. */
6694
+ from: number;
6695
+ /** Index it would move to, within the destination group. */
6696
+ to: number;
6697
+ /**
6698
+ * Group the item started in — a Kanban column, for instance. `undefined` for a
6699
+ * plain single-list sortable.
6700
+ */
6701
+ fromGroup?: string;
6702
+ /** Destination group. Equal to `fromGroup` when the move stays in one group. */
6703
+ toGroup?: string;
6704
+ }
6705
+
6706
+ /** Props to spread on each sortable item. */
6707
+ export declare interface SortableItemProps {
6708
+ /** Marks the item for hit-testing. */
6709
+ "data-sortable-index": number;
6710
+ /** Group the item belongs to, when the sortable spans several lists. */
6711
+ "data-sortable-group"?: string;
6712
+ /** `true` while this item is the one being moved. */
6713
+ "data-sortable-active"?: boolean;
6714
+ /** Grab handle wiring: starts a pointer drag. */
6715
+ onPointerDown: (event: PointerEvent_2<HTMLElement>) => void;
6716
+ /** Keyboard reordering — see {@link UseSortableResult}. */
6717
+ onKeyDown: (event: KeyboardEvent_2<HTMLElement>) => void;
6718
+ /** Puts the item in the tab order so the keyboard path is reachable. */
6719
+ tabIndex: number;
6720
+ role: "option";
6721
+ "aria-roledescription": string;
6722
+ "aria-selected": boolean;
6723
+ }
6724
+
6439
6725
  export declare type SortDirection = "asc" | "desc";
6440
6726
 
6441
6727
  /**
@@ -7689,6 +7975,11 @@ export declare interface UseAsyncResult<T> {
7689
7975
  }
7690
7976
 
7691
7977
  /**
7978
+ * The player lives in a state initializer, not in a lazily-written ref: the
7979
+ * initializer runs exactly once and is not a side effect during render, which is
7980
+ * what the ref version was. The player identity never changes, so state holds it
7981
+ * fine and the value is non-null from the first render.
7982
+ *
7692
7983
  * Hook-managed audio player. Each component instance gets its own
7693
7984
  * {@link AudioPlayer}, so unmounting cleanly stops playback. Useful for
7694
7985
  * notification chimes, UI feedback sounds, and per-component soundtracks.
@@ -7893,6 +8184,11 @@ export declare function useDebounce<T>(value: T, delay?: number): T;
7893
8184
  * Memoize a value with a structural equality check. Use when an object/array
7894
8185
  * created during render is fed to `useEffect` dependencies and you want to
7895
8186
  * avoid spurious effect runs when only the reference changes.
8187
+ *
8188
+ * The cache is a ref read and written during render. That is flagged by the React
8189
+ * Compiler rules and is nonetheless correct here: the write is idempotent — a
8190
+ * discarded render either wrote a structurally equal value or nothing at all — so
8191
+ * replaying the render cannot change the result.
7896
8192
  */
7897
8193
  export declare function useDeepMemo<T>(value: T): T;
7898
8194
 
@@ -8169,6 +8465,11 @@ export declare function useInterval(fn: () => void, delay: number | null): void;
8169
8465
  /**
8170
8466
  * Return `true` on the first render of the component and `false` thereafter.
8171
8467
  *
8468
+ * Reads *and* flips a ref during render, which the React Compiler rules flag on
8469
+ * sight — here it is the entire hook. Under StrictMode's double render in dev the
8470
+ * second pass already sees `false`, so treat the result as "first committed
8471
+ * render" and not as a strict render counter.
8472
+ *
8172
8473
  * @returns Whether the current render is the first one.
8173
8474
  */
8174
8475
  export declare function useIsFirstRender(): boolean;
@@ -8341,6 +8642,76 @@ export declare function useModals(): ModalsApi;
8341
8642
 
8342
8643
  export { useNavigate }
8343
8644
 
8645
+ /**
8646
+ * Client-side inbox state for received notifications.
8647
+ *
8648
+ * Newest first, deduplicated by `id`, capped at `limit`. Pairs with
8649
+ * `NotificationCenter` for the UI and with the `push` module for the source:
8650
+ * point a service worker's `postMessage` at it and a push that arrives while the
8651
+ * app is open shows up in the inbox instead of only as an OS notification.
8652
+ *
8653
+ * Persistence is deliberately left out — where an inbox belongs (server, Dexie,
8654
+ * `localStorage`) is an app decision. Use `onChange` to write it wherever it goes,
8655
+ * and `initialItems` to read it back.
8656
+ *
8657
+ * @example
8658
+ * const inbox = useNotificationInbox({
8659
+ * initialItems: await api.notifications.list(),
8660
+ * onChange: (items) => storage.set("inbox", items),
8661
+ * });
8662
+ *
8663
+ * <NotificationCenter
8664
+ * items={inbox.items}
8665
+ * onMarkRead={inbox.markRead}
8666
+ * onMarkAllRead={inbox.markAllRead}
8667
+ * onDismiss={inbox.remove}
8668
+ * />
8669
+ */
8670
+ export declare function useNotificationInbox(options?: UseNotificationInboxOptions): UseNotificationInboxResult;
8671
+
8672
+ export declare interface UseNotificationInboxOptions {
8673
+ /** Entries the inbox starts with — typically what the API returned. */
8674
+ initialItems?: readonly NotificationItem[];
8675
+ /**
8676
+ * Listen for `message` events from the service worker and add whatever
8677
+ * arrives. Default `true`.
8678
+ *
8679
+ * This is the missing half of web push: a service worker runs outside the
8680
+ * page and cannot touch React state, so a push that arrives while the app is
8681
+ * open shows an OS notification and then vanishes as far as the UI is
8682
+ * concerned. Have the worker `postMessage` the payload and it lands here.
8683
+ */
8684
+ listenToServiceWorker?: boolean;
8685
+ /**
8686
+ * Message `type` to accept from the worker. Default `"tempest:notification"`.
8687
+ *
8688
+ * Filtering by type matters because the SW message channel is shared — a
8689
+ * sync-progress ping or a cache-updated notice would otherwise show up in the
8690
+ * user's inbox.
8691
+ */
8692
+ messageType?: string;
8693
+ /**
8694
+ * Cap on stored entries; the oldest are dropped past it. Default `100`.
8695
+ *
8696
+ * An inbox fed by push grows without bound otherwise, and it lives in memory.
8697
+ */
8698
+ limit?: number;
8699
+ /** Called whenever the list changes — the hook for persisting it. */
8700
+ onChange?: (items: readonly NotificationItem[]) => void;
8701
+ }
8702
+
8703
+ export declare interface UseNotificationInboxResult {
8704
+ items: NotificationItem[];
8705
+ unreadCount: number;
8706
+ /** Add an entry, or update the existing one with the same id. */
8707
+ add: (item: NotificationItem) => void;
8708
+ markRead: (id: string) => void;
8709
+ markUnread: (id: string) => void;
8710
+ markAllRead: () => void;
8711
+ remove: (id: string) => void;
8712
+ clear: () => void;
8713
+ }
8714
+
8344
8715
  /**
8345
8716
  * Run an OAuth-callback "exchange" exactly once on mount. Designed for
8346
8717
  * `/callback` routes that receive provider redirects and need to swap a
@@ -8883,10 +9254,126 @@ export declare interface UseSetResult<T> {
8883
9254
  size: number;
8884
9255
  }
8885
9256
 
9257
+ /**
9258
+ * Drag-to-reorder for a list, with a **keyboard path of equal standing**.
9259
+ *
9260
+ * Pointer events cover mouse, touch and stylus through one code path, and pointer
9261
+ * capture keeps the drag alive when the pointer leaves the item. `Space` picks an
9262
+ * item up, the arrows move it, `Space`/`Enter` drops it and `Escape` cancels —
9263
+ * because a reorder that only works by dragging excludes keyboard users
9264
+ * completely, which is where most drag-and-drop implementations fail.
9265
+ *
9266
+ * The hook owns interaction only: it never mutates your data. `onReorder` fires
9267
+ * once per committed move and you apply it, typically with {@link moveItem}. That
9268
+ * keeps the list a controlled value and avoids a re-render per pointer frame.
9269
+ *
9270
+ * Hit-testing reads the live DOM rects of `[data-sortable-index]` children rather
9271
+ * than assuming a fixed row height, so it works with rows of different sizes.
9272
+ *
9273
+ * A change in `itemCount` cancels an in-flight drag: the list no longer has the
9274
+ * indices the drag was based on, and committing anyway would move the wrong row.
9275
+ *
9276
+ * Note for consumers: the indices and groups are exposed as **state** (so rendering
9277
+ * from them is reactive) and mirrored into refs only so the window-level `pointerup`
9278
+ * listener can read both synchronously. Because the handlers returned by
9279
+ * `getItemProps` close over those mirrors, the React Compiler `refs` rule reports
9280
+ * the *call site* — a component spreading these props may need a file-level
9281
+ * exemption, as `Kanban` documents.
9282
+ *
9283
+ * @example
9284
+ * ```tsx
9285
+ * const [items, setItems] = useState(["Alfa", "Bravo", "Charlie"]);
9286
+ * const sortable = useSortable({
9287
+ * itemCount: items.length,
9288
+ * onReorder: ({ from, to }) => setItems((current) => moveItem(current, from, to)),
9289
+ * });
9290
+ *
9291
+ * <ul {...sortable.getListProps()} aria-label="Prioridade" ref={sortable.setContainer}>
9292
+ * {items.map((item, index) => (
9293
+ * <li key={item} {...sortable.getItemProps(index)}>
9294
+ * {item}
9295
+ * </li>
9296
+ * ))}
9297
+ * </ul>
9298
+ * ```
9299
+ */
9300
+ export declare function useSortable(options: UseSortableOptions): UseSortableResult;
9301
+
9302
+ export declare interface UseSortableOptions {
9303
+ /**
9304
+ * How many items are in the sortable. Changing it cancels an in-flight drag.
9305
+ *
9306
+ * With groups, pass the **total** across groups: the number only has to change
9307
+ * whenever the indices the drag was based on stop being valid.
9308
+ */
9309
+ itemCount: number;
9310
+ /**
9311
+ * Called once, when a move is committed — on pointer release or on a keyboard
9312
+ * move. Never called mid-drag, so a controlled list re-renders once instead of
9313
+ * on every pointer frame.
9314
+ */
9315
+ onReorder: (target: SortableDropTarget) => void;
9316
+ /** Blocks all interaction. */
9317
+ disabled?: boolean;
9318
+ /**
9319
+ * Description announced for each item, so a screen reader user learns the
9320
+ * keyboard contract. Default is in English — override it to localize.
9321
+ */
9322
+ roleDescription?: string;
9323
+ }
9324
+
9325
+ export declare interface UseSortableResult {
9326
+ /** Index being dragged, or `null` when idle. */
9327
+ activeIndex: number | null;
9328
+ /** Index the item would land on, or `null` when idle. */
9329
+ overIndex: number | null;
9330
+ /** Group the dragged item came from, when using groups. */
9331
+ activeGroup?: string;
9332
+ /** Group the item is currently over, when using groups. */
9333
+ overGroup?: string;
9334
+ /**
9335
+ * Spread on each item. Pass `group` when the sortable spans several lists (a
9336
+ * Kanban column id), so a drop can land in a different group.
9337
+ */
9338
+ getItemProps: (index: number, group?: string) => SortableItemProps;
9339
+ /**
9340
+ * Spread on an **empty** group's drop area, so an item can be moved into a
9341
+ * column that has no cards yet — hit-testing works off item rects, and a group
9342
+ * with no items has none.
9343
+ */
9344
+ getEmptyGroupProps: (group: string) => {
9345
+ "data-sortable-group": string;
9346
+ "data-sortable-empty": true;
9347
+ };
9348
+ /** Spread on the list container (`role="listbox"` + a label of your own). */
9349
+ getListProps: () => {
9350
+ role: "listbox";
9351
+ "aria-orientation": "vertical";
9352
+ };
9353
+ /** Abort the current drag without reordering. */
9354
+ cancel: () => void;
9355
+ /**
9356
+ * Callback ref for the element that contains the sortable items — hit-testing
9357
+ * searches inside it.
9358
+ *
9359
+ * Named `setContainer` rather than `ref` because it is a **callback**, not a ref
9360
+ * object: `ref={sortable.setContainer}`. The old name also read as a readable
9361
+ * ref to the React Compiler rules, which flagged every consumer.
9362
+ */
9363
+ setContainer: (node: HTMLElement | null) => void;
9364
+ }
9365
+
8886
9366
  /**
8887
9367
  * Returns a stable function reference that always invokes the latest
8888
9368
  * `callback` argument. Use to break dependency cycles in effects without
8889
9369
  * triggering re-runs when the callback identity changes.
9370
+ *
9371
+ * The assignment happens **during render** on purpose. Moving it into an effect
9372
+ * would satisfy the React Compiler rules but open a one-commit staleness window:
9373
+ * an effect declared before this hook's own effect, in the same commit, would call
9374
+ * the previous render's callback. This is a primitive other hooks build on, so a
9375
+ * subtle staleness here is worse than the rule violation. Prefer React's
9376
+ * `useEffectEvent` once it ships as stable.
8890
9377
  */
8891
9378
  export declare function useStableCallback<TArgs extends unknown[], TReturn>(callback: (...args: TArgs) => TReturn): (...args: TArgs) => TReturn;
8892
9379
 
@@ -9135,6 +9622,95 @@ export declare interface VirtualListProps<T> {
9135
9622
  style?: CSSProperties;
9136
9623
  }
9137
9624
 
9625
+ /**
9626
+ * A table that stays responsive at 10k+ rows by rendering only the visible window.
9627
+ *
9628
+ * `Table` renders every row it is given and `DataTable` paginates to keep that
9629
+ * count small; neither has an answer for "show me all 40 000 rows in one
9630
+ * scrollable grid". This does, at the cost of one constraint: **`rowHeight` must
9631
+ * be uniform**, since mapping a scroll offset to a row index is what makes the
9632
+ * window computable without measuring anything.
9633
+ *
9634
+ * It stays a real `<table>`. The window is produced by two spacer rows — one
9635
+ * above the visible slice, one below — instead of absolutely positioning rows.
9636
+ * That is deliberate: `position: absolute` on `<tr>` collapses table layout, so
9637
+ * every column width would have to be computed by hand, and the element would
9638
+ * stop being a table for assistive technology. With spacer rows the browser keeps
9639
+ * doing column layout and screen readers keep announcing a grid.
9640
+ *
9641
+ * Because only a slice is in the DOM, `aria-rowcount` on the table and
9642
+ * `aria-rowindex` on each row carry the real numbers — without them a screen
9643
+ * reader announces "row 3 of 20" while the user is on row 5003 of 40 000.
9644
+ *
9645
+ * @example
9646
+ * <VirtualTable
9647
+ * data={rows}
9648
+ * columns={[
9649
+ * { key: "id", header: "#", width: 80, sortable: true },
9650
+ * { key: "name", header: "Nome", width: 240, sortable: true },
9651
+ * { key: "total", header: "Total", align: "right", width: 120, sortable: true },
9652
+ * ]}
9653
+ * rowHeight={40}
9654
+ * height={480}
9655
+ * rowKey={(row) => row.id}
9656
+ * />
9657
+ */
9658
+ export declare function VirtualTable<T>({ data, columns, rowHeight, height, overscan, rowKey, initialSort, onRowClick, emptyMessage, caption, scrollToIndex, className, ...rest }: VirtualTableProps<T>): JSX.Element;
9659
+
9660
+ export declare interface VirtualTableColumn<T> {
9661
+ /** Property of the row this column reads from. Doubles as the cell key. */
9662
+ key: keyof T;
9663
+ /** Column heading. */
9664
+ header: ReactNode;
9665
+ /** Custom cell renderer. Defaults to `row[key]`. */
9666
+ render?: (row: T, index: number) => ReactNode;
9667
+ /** Enable click-to-sort on this column's header. */
9668
+ sortable?: boolean;
9669
+ /** Text alignment. */
9670
+ align?: TableAlign;
9671
+ /**
9672
+ * Column width. Recommended for every column: virtualized rows enter and
9673
+ * leave the DOM as you scroll, so letting the browser auto-size columns from
9674
+ * whatever is currently rendered makes them jump mid-scroll.
9675
+ */
9676
+ width?: string | number;
9677
+ }
9678
+
9679
+ export declare interface VirtualTableProps<T> extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
9680
+ /** Full dataset. Every row is accounted for; only the visible ones render. */
9681
+ data: T[];
9682
+ /** Column definitions. */
9683
+ columns: VirtualTableColumn<T>[];
9684
+ /**
9685
+ * Row height in px. Must be uniform and must match what the CSS produces,
9686
+ * because it is what maps scroll offset to row index.
9687
+ */
9688
+ rowHeight: number;
9689
+ /** Height of the scroll viewport — a number of px or any CSS length. */
9690
+ height: number | string;
9691
+ /** Rows rendered above and below the viewport. Default `4`. */
9692
+ overscan?: number;
9693
+ /** Stable key extractor. Defaults to the row's index in `data`. */
9694
+ rowKey?: (row: T, index: number) => string | number;
9695
+ /** Sort applied before any header interaction. */
9696
+ initialSort?: VirtualTableSort<T>;
9697
+ /** Called when a row is activated by click, `Enter` or `Space`. */
9698
+ onRowClick?: (row: T, index: number) => void;
9699
+ /** Content shown when `data` is empty. */
9700
+ emptyMessage?: ReactNode;
9701
+ /** Accessible name for the table. Rendered as a visually hidden `<caption>`. */
9702
+ caption?: ReactNode;
9703
+ /** Scroll this row into view whenever it changes. */
9704
+ scrollToIndex?: number;
9705
+ }
9706
+
9707
+ export declare interface VirtualTableSort<T> {
9708
+ key: keyof T;
9709
+ direction: VirtualTableSortDirection;
9710
+ }
9711
+
9712
+ export declare type VirtualTableSortDirection = "asc" | "desc";
9713
+
9138
9714
  /**
9139
9715
  * Render content that is hidden visually but remains available to screen
9140
9716
  * readers — the standard "sr-only" pattern. Useful for accessible labels on
@@ -9605,7 +10181,7 @@ export declare function withTimeout<T>(promise: Promise<T>, ms: number, message?
9605
10181
  * </FormProvider>
9606
10182
  * ```
9607
10183
  */
9608
- export declare function Wizard({ steps, activeIndex, defaultActiveIndex, onStepChange, onComplete, nextLabel, backLabel, finishLabel, clickableSteps, renderActions, className, }: WizardProps): JSX.Element;
10184
+ export declare function Wizard({ steps, activeIndex, defaultActiveIndex, onStepChange, onComplete, nextLabel, backLabel, finishLabel, optionalLabel, clickableSteps, renderActions, className, }: WizardProps): JSX.Element;
9609
10185
 
9610
10186
  /** Flow controls handed to a step body and to `renderActions`. */
9611
10187
  export declare interface WizardControls {
@@ -9640,6 +10216,12 @@ export declare interface WizardProps {
9640
10216
  backLabel?: string;
9641
10217
  /** Label of the button on the last step. Default `"Finish"`. */
9642
10218
  finishLabel?: string;
10219
+ /**
10220
+ * Suffix appended to an optional step's description in the indicator.
10221
+ * Default `"(optional)"` — override it to localize, since the SDK ships no
10222
+ * translation for component-internal copy.
10223
+ */
10224
+ optionalLabel?: string;
9643
10225
  /**
9644
10226
  * Allow clicking the indicator to jump. Default `false` — a wizard exists
9645
10227
  * because order matters, and a free jump skips the gates.