@nadicodeai/ui 0.6.0 → 0.8.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 (387) hide show
  1. package/AGENTS.md +12 -0
  2. package/dist/ai-elements.d.ts.map +1 -1
  3. package/dist/components/accordion.d.ts.map +1 -1
  4. package/dist/components/action-band.d.ts.map +1 -1
  5. package/dist/components/action-status.d.ts +11 -0
  6. package/dist/components/action-status.d.ts.map +1 -0
  7. package/dist/components/action-status.js +6 -0
  8. package/dist/components/agent-avatar.d.ts +7 -0
  9. package/dist/components/agent-avatar.d.ts.map +1 -0
  10. package/dist/components/agent-avatar.js +6 -0
  11. package/dist/components/agent-chat.d.ts.map +1 -1
  12. package/dist/components/agent-chat.js +2 -2
  13. package/dist/components/agent-composer.d.ts +1 -1
  14. package/dist/components/agent-composer.d.ts.map +1 -1
  15. package/dist/components/agent-composer.js +5 -9
  16. package/dist/components/agent-message.d.ts +1 -1
  17. package/dist/components/agent-message.d.ts.map +1 -1
  18. package/dist/components/agent-message.js +19 -23
  19. package/dist/components/agent-thread.d.ts +1 -1
  20. package/dist/components/agent-thread.d.ts.map +1 -1
  21. package/dist/components/agent-thread.js +5 -7
  22. package/dist/components/agent-tool-approval.d.ts +5 -10
  23. package/dist/components/agent-tool-approval.d.ts.map +1 -1
  24. package/dist/components/agent-tool-approval.js +10 -31
  25. package/dist/components/ai-elements/agent.d.ts.map +1 -1
  26. package/dist/components/ai-elements/agent.js +1 -3
  27. package/dist/components/ai-elements/artifact.d.ts.map +1 -1
  28. package/dist/components/ai-elements/artifact.js +1 -1
  29. package/dist/components/ai-elements/attachments.d.ts.map +1 -1
  30. package/dist/components/ai-elements/attachments.js +3 -3
  31. package/dist/components/ai-elements/audio-player.d.ts.map +1 -1
  32. package/dist/components/ai-elements/audio-player.js +2 -4
  33. package/dist/components/ai-elements/chain-of-thought.d.ts.map +1 -1
  34. package/dist/components/ai-elements/chain-of-thought.js +2 -2
  35. package/dist/components/ai-elements/checkpoint.d.ts.map +1 -1
  36. package/dist/components/ai-elements/checkpoint.js +2 -2
  37. package/dist/components/ai-elements/code-block.d.ts.map +1 -1
  38. package/dist/components/ai-elements/code-block.js +12 -24
  39. package/dist/components/ai-elements/commit.d.ts.map +1 -1
  40. package/dist/components/ai-elements/commit.js +2 -2
  41. package/dist/components/ai-elements/confirmation.d.ts +2 -2
  42. package/dist/components/ai-elements/confirmation.d.ts.map +1 -1
  43. package/dist/components/ai-elements/confirmation.js +4 -8
  44. package/dist/components/ai-elements/connection.d.ts.map +1 -1
  45. package/dist/components/ai-elements/connection.js +1 -1
  46. package/dist/components/ai-elements/context.d.ts.map +1 -1
  47. package/dist/components/ai-elements/context.js +4 -4
  48. package/dist/components/ai-elements/conversation.d.ts.map +1 -1
  49. package/dist/components/ai-elements/conversation.js +1 -1
  50. package/dist/components/ai-elements/edge.d.ts.map +1 -1
  51. package/dist/components/ai-elements/environment-variables.d.ts.map +1 -1
  52. package/dist/components/ai-elements/environment-variables.js +1 -3
  53. package/dist/components/ai-elements/file-tree.d.ts.map +1 -1
  54. package/dist/components/ai-elements/file-tree.js +3 -3
  55. package/dist/components/ai-elements/image.d.ts.map +1 -1
  56. package/dist/components/ai-elements/inline-citation.d.ts.map +1 -1
  57. package/dist/components/ai-elements/inline-citation.js +6 -6
  58. package/dist/components/ai-elements/jsx-preview.d.ts.map +1 -1
  59. package/dist/components/ai-elements/jsx-preview.js +2 -11
  60. package/dist/components/ai-elements/message.d.ts.map +1 -1
  61. package/dist/components/ai-elements/message.js +4 -5
  62. package/dist/components/ai-elements/mic-selector.d.ts.map +1 -1
  63. package/dist/components/ai-elements/mic-selector.js +3 -7
  64. package/dist/components/ai-elements/model-selector.d.ts.map +1 -1
  65. package/dist/components/ai-elements/model-selector.js +6 -6
  66. package/dist/components/ai-elements/node.d.ts.map +1 -1
  67. package/dist/components/ai-elements/node.js +1 -1
  68. package/dist/components/ai-elements/open-in-chat.d.ts.map +1 -1
  69. package/dist/components/ai-elements/open-in-chat.js +3 -3
  70. package/dist/components/ai-elements/package-info.d.ts.map +1 -1
  71. package/dist/components/ai-elements/package-info.js +1 -1
  72. package/dist/components/ai-elements/panel.d.ts.map +1 -1
  73. package/dist/components/ai-elements/persona.d.ts.map +1 -1
  74. package/dist/components/ai-elements/persona.js +1 -2
  75. package/dist/components/ai-elements/plan.d.ts.map +1 -1
  76. package/dist/components/ai-elements/plan.js +1 -1
  77. package/dist/components/ai-elements/prompt-input.d.ts.map +1 -1
  78. package/dist/components/ai-elements/prompt-input.js +22 -33
  79. package/dist/components/ai-elements/queue.d.ts.map +1 -1
  80. package/dist/components/ai-elements/queue.js +3 -7
  81. package/dist/components/ai-elements/reasoning.d.ts.map +1 -1
  82. package/dist/components/ai-elements/reasoning.js +2 -5
  83. package/dist/components/ai-elements/sandbox.d.ts.map +1 -1
  84. package/dist/components/ai-elements/sandbox.js +2 -2
  85. package/dist/components/ai-elements/schema-display.d.ts.map +1 -1
  86. package/dist/components/ai-elements/schema-display.js +7 -7
  87. package/dist/components/ai-elements/shimmer.d.ts.map +1 -1
  88. package/dist/components/ai-elements/snippet.d.ts.map +1 -1
  89. package/dist/components/ai-elements/snippet.js +1 -1
  90. package/dist/components/ai-elements/sources.d.ts.map +1 -1
  91. package/dist/components/ai-elements/sources.js +1 -1
  92. package/dist/components/ai-elements/speech-input.d.ts.map +1 -1
  93. package/dist/components/ai-elements/stack-trace.d.ts.map +1 -1
  94. package/dist/components/ai-elements/stack-trace.js +3 -5
  95. package/dist/components/ai-elements/suggestion.d.ts.map +1 -1
  96. package/dist/components/ai-elements/suggestion.js +1 -1
  97. package/dist/components/ai-elements/task.d.ts.map +1 -1
  98. package/dist/components/ai-elements/task.js +1 -1
  99. package/dist/components/ai-elements/terminal.d.ts.map +1 -1
  100. package/dist/components/ai-elements/test-results.d.ts.map +1 -1
  101. package/dist/components/ai-elements/test-results.js +2 -2
  102. package/dist/components/ai-elements/tool.d.ts.map +1 -1
  103. package/dist/components/ai-elements/tool.js +3 -5
  104. package/dist/components/ai-elements/toolbar.d.ts.map +1 -1
  105. package/dist/components/ai-elements/transcription.d.ts.map +1 -1
  106. package/dist/components/ai-elements/voice-selector.d.ts.map +1 -1
  107. package/dist/components/ai-elements/voice-selector.js +4 -4
  108. package/dist/components/ai-elements/web-preview.d.ts.map +1 -1
  109. package/dist/components/ai-elements/web-preview.js +3 -3
  110. package/dist/components/alert-dialog.d.ts.map +1 -1
  111. package/dist/components/alert-dialog.js +2 -2
  112. package/dist/components/alert.d.ts.map +1 -1
  113. package/dist/components/artifact-panel.d.ts +3 -4
  114. package/dist/components/artifact-panel.d.ts.map +1 -1
  115. package/dist/components/artifact-panel.js +19 -28
  116. package/dist/components/aspect-ratio.d.ts.map +1 -1
  117. package/dist/components/attachment.d.ts +24 -0
  118. package/dist/components/attachment.d.ts.map +1 -0
  119. package/dist/components/attachment.js +68 -0
  120. package/dist/components/automation-section.d.ts +1 -1
  121. package/dist/components/automation-section.d.ts.map +1 -1
  122. package/dist/components/automation-section.js +2 -2
  123. package/dist/components/avatar.d.ts +1 -1
  124. package/dist/components/avatar.d.ts.map +1 -1
  125. package/dist/components/avatar.js +1 -1
  126. package/dist/components/badge.d.ts.map +1 -1
  127. package/dist/components/benefits-bento.d.ts.map +1 -1
  128. package/dist/components/bento.d.ts.map +1 -1
  129. package/dist/components/brand.d.ts.map +1 -1
  130. package/dist/components/brand.js +1 -3
  131. package/dist/components/breadcrumb.d.ts.map +1 -1
  132. package/dist/components/breadcrumb.js +1 -1
  133. package/dist/components/bubble.d.ts +17 -0
  134. package/dist/components/bubble.d.ts.map +1 -0
  135. package/dist/components/bubble.js +59 -0
  136. package/dist/components/button-group.d.ts +1 -1
  137. package/dist/components/button-group.d.ts.map +1 -1
  138. package/dist/components/button-group.js +1 -1
  139. package/dist/components/button.d.ts.map +1 -1
  140. package/dist/components/calendar.d.ts.map +1 -1
  141. package/dist/components/calendar.js +6 -6
  142. package/dist/components/card-marketing.d.ts.map +1 -1
  143. package/dist/components/card.d.ts +1 -1
  144. package/dist/components/card.d.ts.map +1 -1
  145. package/dist/components/card.js +1 -1
  146. package/dist/components/carousel.d.ts.map +1 -1
  147. package/dist/components/chart-breakdown-table.d.ts.map +1 -1
  148. package/dist/components/chart-breakdown-table.js +1 -3
  149. package/dist/components/chart-bullet-bar.d.ts.map +1 -1
  150. package/dist/components/chart-date-range-control.d.ts.map +1 -1
  151. package/dist/components/chart-date-range-control.js +2 -4
  152. package/dist/components/chart-date-range.d.ts +1 -1
  153. package/dist/components/chart-date-range.d.ts.map +1 -1
  154. package/dist/components/chart-date-range.js +2 -4
  155. package/dist/components/chart-delta.d.ts.map +1 -1
  156. package/dist/components/chart-delta.js +1 -1
  157. package/dist/components/chart-entity-colors.d.ts +1 -1
  158. package/dist/components/chart-entity-colors.d.ts.map +1 -1
  159. package/dist/components/chart-entity-colors.js +1 -1
  160. package/dist/components/chart-kpi-stat.d.ts.map +1 -1
  161. package/dist/components/chart-sparkline.d.ts.map +1 -1
  162. package/dist/components/chart-sparkline.js +2 -7
  163. package/dist/components/chart-time-series.d.ts.map +1 -1
  164. package/dist/components/chart-time-series.js +5 -10
  165. package/dist/components/chart.d.ts.map +1 -1
  166. package/dist/components/chart.js +5 -19
  167. package/dist/components/checkbox.d.ts.map +1 -1
  168. package/dist/components/code-editor-mockup.d.ts.map +1 -1
  169. package/dist/components/code-editor-mockup.js +1 -1
  170. package/dist/components/collapsible.d.ts.map +1 -1
  171. package/dist/components/collapsible.js +2 -2
  172. package/dist/components/combobox.d.ts.map +1 -1
  173. package/dist/components/combobox.js +1 -1
  174. package/dist/components/command.d.ts.map +1 -1
  175. package/dist/components/command.js +1 -1
  176. package/dist/components/contact.d.ts.map +1 -1
  177. package/dist/components/context-menu.d.ts.map +1 -1
  178. package/dist/components/context-menu.js +4 -4
  179. package/dist/components/dashboard-shell.d.ts.map +1 -1
  180. package/dist/components/dashboard-shell.js +3 -5
  181. package/dist/components/demo-surface.d.ts.map +1 -1
  182. package/dist/components/desktop-shell.d.ts.map +1 -1
  183. package/dist/components/desktop-shell.js +2 -2
  184. package/dist/components/dialog.d.ts.map +1 -1
  185. package/dist/components/diff-count.d.ts +7 -0
  186. package/dist/components/diff-count.d.ts.map +1 -0
  187. package/dist/components/diff-count.js +18 -0
  188. package/dist/components/direction.d.ts.map +1 -1
  189. package/dist/components/disclosure-row.d.ts +12 -0
  190. package/dist/components/disclosure-row.d.ts.map +1 -0
  191. package/dist/components/disclosure-row.js +11 -0
  192. package/dist/components/drawer.d.ts.map +1 -1
  193. package/dist/components/drawer.js +1 -1
  194. package/dist/components/dropdown-menu.d.ts.map +1 -1
  195. package/dist/components/dropdown-menu.js +1 -1
  196. package/dist/components/empty.d.ts +1 -1
  197. package/dist/components/empty.d.ts.map +1 -1
  198. package/dist/components/empty.js +1 -1
  199. package/dist/components/expandable-block.d.ts +10 -0
  200. package/dist/components/expandable-block.d.ts.map +1 -0
  201. package/dist/components/expandable-block.js +22 -0
  202. package/dist/components/fact-cell.d.ts.map +1 -1
  203. package/dist/components/faq-item.d.ts.map +1 -1
  204. package/dist/components/faq.d.ts.map +1 -1
  205. package/dist/components/faq.js +1 -1
  206. package/dist/components/feedback-state.d.ts.map +1 -1
  207. package/dist/components/feedback-state.js +1 -4
  208. package/dist/components/field.d.ts.map +1 -1
  209. package/dist/components/field.js +1 -3
  210. package/dist/components/file-type-icon.d.ts +8 -0
  211. package/dist/components/file-type-icon.d.ts.map +1 -0
  212. package/dist/components/file-type-icon.js +90 -0
  213. package/dist/components/files-preview.d.ts.map +1 -1
  214. package/dist/components/files-preview.js +3 -6
  215. package/dist/components/footer.d.ts.map +1 -1
  216. package/dist/components/footer.js +1 -3
  217. package/dist/components/form.d.ts.map +1 -1
  218. package/dist/components/glyph-spinner.d.ts +10 -0
  219. package/dist/components/glyph-spinner.d.ts.map +1 -0
  220. package/dist/components/glyph-spinner.js +101 -0
  221. package/dist/components/handoff-banner.d.ts +9 -0
  222. package/dist/components/handoff-banner.d.ts.map +1 -0
  223. package/dist/components/handoff-banner.js +6 -0
  224. package/dist/components/hero-split.d.ts.map +1 -1
  225. package/dist/components/hover-card.d.ts.map +1 -1
  226. package/dist/components/hover-card.js +1 -1
  227. package/dist/components/input-group.d.ts.map +1 -1
  228. package/dist/components/input-otp.d.ts.map +1 -1
  229. package/dist/components/input.d.ts.map +1 -1
  230. package/dist/components/installer-shell.d.ts.map +1 -1
  231. package/dist/components/installer-shell.js +2 -2
  232. package/dist/components/item.d.ts.map +1 -1
  233. package/dist/components/kbd.d.ts.map +1 -1
  234. package/dist/components/label-system.d.ts +6 -2
  235. package/dist/components/label-system.d.ts.map +1 -1
  236. package/dist/components/label-system.js +4 -1
  237. package/dist/components/label.d.ts.map +1 -1
  238. package/dist/components/logo-band.d.ts.map +1 -1
  239. package/dist/components/logo-tile.d.ts.map +1 -1
  240. package/dist/components/logo-tile.js +1 -3
  241. package/dist/components/marker.d.ts +11 -0
  242. package/dist/components/marker.d.ts.map +1 -0
  243. package/dist/components/marker.js +34 -0
  244. package/dist/components/media-mount.d.ts.map +1 -1
  245. package/dist/components/media-mount.js +1 -3
  246. package/dist/components/memory-item.d.ts +9 -0
  247. package/dist/components/memory-item.d.ts.map +1 -0
  248. package/dist/components/memory-item.js +6 -0
  249. package/dist/components/menubar.d.ts.map +1 -1
  250. package/dist/components/message-scroller.d.ts +17 -0
  251. package/dist/components/message-scroller.d.ts.map +1 -0
  252. package/dist/components/message-scroller.js +29 -0
  253. package/dist/components/message.d.ts +11 -0
  254. package/dist/components/message.d.ts.map +1 -0
  255. package/dist/components/message.js +21 -0
  256. package/dist/components/native-select.d.ts.map +1 -1
  257. package/dist/components/nav-bar.d.ts.map +1 -1
  258. package/dist/components/navigation-menu.d.ts.map +1 -1
  259. package/dist/components/newsletter.d.ts.map +1 -1
  260. package/dist/components/page-frame.d.ts.map +1 -1
  261. package/dist/components/pagination.d.ts.map +1 -1
  262. package/dist/components/plugin-slot-boundary.d.ts.map +1 -1
  263. package/dist/components/plugin-slot-boundary.js +2 -2
  264. package/dist/components/popover.d.ts +1 -1
  265. package/dist/components/popover.d.ts.map +1 -1
  266. package/dist/components/popover.js +1 -1
  267. package/dist/components/pricing-card.d.ts.map +1 -1
  268. package/dist/components/pricing.d.ts.map +1 -1
  269. package/dist/components/pricing.js +3 -6
  270. package/dist/components/progress.d.ts +1 -1
  271. package/dist/components/progress.d.ts.map +1 -1
  272. package/dist/components/progress.js +1 -1
  273. package/dist/components/proof-slot.d.ts.map +1 -1
  274. package/dist/components/quote-card.d.ts +1 -1
  275. package/dist/components/quote-card.d.ts.map +1 -1
  276. package/dist/components/quote-card.js +1 -1
  277. package/dist/components/radio-group.d.ts.map +1 -1
  278. package/dist/components/resizable.d.ts.map +1 -1
  279. package/dist/components/resizable.js +1 -1
  280. package/dist/components/run-timeline.d.ts +16 -0
  281. package/dist/components/run-timeline.d.ts.map +1 -0
  282. package/dist/components/run-timeline.js +9 -0
  283. package/dist/components/scroll-area.d.ts.map +1 -1
  284. package/dist/components/seam-grid.d.ts.map +1 -1
  285. package/dist/components/section-intro.d.ts.map +1 -1
  286. package/dist/components/select.d.ts.map +1 -1
  287. package/dist/components/separator.d.ts.map +1 -1
  288. package/dist/components/settings-section.d.ts.map +1 -1
  289. package/dist/components/settings-section.js +2 -2
  290. package/dist/components/sheet.d.ts.map +1 -1
  291. package/dist/components/shift-band.d.ts.map +1 -1
  292. package/dist/components/shift-band.js +1 -1
  293. package/dist/components/sidebar.d.ts.map +1 -1
  294. package/dist/components/sidebar.js +4 -5
  295. package/dist/components/skeleton.d.ts.map +1 -1
  296. package/dist/components/slider.d.ts.map +1 -1
  297. package/dist/components/sonner.d.ts.map +1 -1
  298. package/dist/components/sonner.js +6 -6
  299. package/dist/components/spinner.d.ts.map +1 -1
  300. package/dist/components/stat-block.d.ts.map +1 -1
  301. package/dist/components/state-notice.d.ts.map +1 -1
  302. package/dist/components/state-notice.js +1 -1
  303. package/dist/components/stats-band.d.ts.map +1 -1
  304. package/dist/components/status-dot.d.ts +9 -0
  305. package/dist/components/status-dot.d.ts.map +1 -0
  306. package/dist/components/status-dot.js +12 -0
  307. package/dist/components/status-row.d.ts +18 -0
  308. package/dist/components/status-row.d.ts.map +1 -0
  309. package/dist/components/status-row.js +21 -0
  310. package/dist/components/switch.d.ts.map +1 -1
  311. package/dist/components/table.d.ts +1 -1
  312. package/dist/components/table.d.ts.map +1 -1
  313. package/dist/components/table.js +2 -2
  314. package/dist/components/tabs.d.ts.map +1 -1
  315. package/dist/components/testimonials.d.ts.map +1 -1
  316. package/dist/components/testimonials.js +1 -3
  317. package/dist/components/textarea.d.ts.map +1 -1
  318. package/dist/components/theme-mode-switcher.d.ts.map +1 -1
  319. package/dist/components/theme-mode-switcher.js +1 -1
  320. package/dist/components/toggle-group.d.ts.map +1 -1
  321. package/dist/components/toggle.d.ts.map +1 -1
  322. package/dist/components/tool-icon.d.ts +8 -0
  323. package/dist/components/tool-icon.d.ts.map +1 -0
  324. package/dist/components/tool-icon.js +23 -0
  325. package/dist/components/tooltip.d.ts.map +1 -1
  326. package/dist/components/tooltip.js +1 -1
  327. package/dist/components/usage-meter.d.ts +9 -0
  328. package/dist/components/usage-meter.d.ts.map +1 -0
  329. package/dist/components/usage-meter.js +10 -0
  330. package/dist/components/use-case-bento.d.ts.map +1 -1
  331. package/dist/components/use-case-bento.js +1 -1
  332. package/dist/components/watch-it-work-band.d.ts.map +1 -1
  333. package/dist/components/watch-it-work-band.js +2 -2
  334. package/dist/hooks/index.d.ts +3 -0
  335. package/dist/hooks/index.d.ts.map +1 -0
  336. package/dist/hooks/index.js +2 -0
  337. package/dist/hooks/use-controllable-state.d.ts +1 -1
  338. package/dist/hooks/use-controllable-state.d.ts.map +1 -1
  339. package/dist/hooks/use-controllable-state.js +2 -4
  340. package/dist/index.d.ts +26 -7
  341. package/dist/index.d.ts.map +1 -1
  342. package/dist/index.js +26 -7
  343. package/dist/lib/agent-attachment.d.ts.map +1 -1
  344. package/dist/lib/agent-contracts.d.ts +132 -0
  345. package/dist/lib/agent-contracts.d.ts.map +1 -0
  346. package/dist/lib/agent-contracts.js +6 -0
  347. package/dist/lib/agent-state.d.ts +22 -0
  348. package/dist/lib/agent-state.d.ts.map +1 -0
  349. package/dist/lib/agent-state.js +96 -0
  350. package/dist/lib/agent-work-state.d.ts.map +1 -1
  351. package/dist/lib/message-scroller-primitive/components.d.ts +17 -0
  352. package/dist/lib/message-scroller-primitive/components.d.ts.map +1 -0
  353. package/dist/lib/message-scroller-primitive/components.js +204 -0
  354. package/dist/lib/message-scroller-primitive/geometry.d.ts +55 -0
  355. package/dist/lib/message-scroller-primitive/geometry.d.ts.map +1 -0
  356. package/dist/lib/message-scroller-primitive/geometry.js +199 -0
  357. package/dist/lib/message-scroller-primitive/index.d.ts +12 -0
  358. package/dist/lib/message-scroller-primitive/index.d.ts.map +1 -0
  359. package/dist/lib/message-scroller-primitive/index.js +12 -0
  360. package/dist/lib/message-scroller-primitive/stores.d.ts +7 -0
  361. package/dist/lib/message-scroller-primitive/stores.d.ts.map +1 -0
  362. package/dist/lib/message-scroller-primitive/stores.js +53 -0
  363. package/dist/lib/message-scroller-primitive/types.d.ts +89 -0
  364. package/dist/lib/message-scroller-primitive/types.d.ts.map +1 -0
  365. package/dist/lib/message-scroller-primitive/types.js +40 -0
  366. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.d.ts +19 -0
  367. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.d.ts.map +1 -0
  368. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.js +188 -0
  369. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.d.ts +7 -0
  370. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.d.ts.map +1 -0
  371. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.js +506 -0
  372. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.d.ts +49 -0
  373. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.d.ts.map +1 -0
  374. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.js +90 -0
  375. package/dist/lib/message-scroller-primitive/use-render.d.ts +22 -0
  376. package/dist/lib/message-scroller-primitive/use-render.d.ts.map +1 -0
  377. package/dist/lib/message-scroller-primitive/use-render.js +113 -0
  378. package/dist/lib/message-scroller-primitive/utils.d.ts +4 -0
  379. package/dist/lib/message-scroller-primitive/utils.d.ts.map +1 -0
  380. package/dist/lib/message-scroller-primitive/utils.js +9 -0
  381. package/dist/lib/seam.d.ts.map +1 -1
  382. package/dist/lib/theme-mode.d.ts.map +1 -1
  383. package/dist/styles/globals.css +32 -29
  384. package/docs/agent-work-surfaces.md +36 -3
  385. package/docs/consuming-cross-repo.md +72 -0
  386. package/docs/migration/ai-elements-vendoring.md +29 -0
  387. package/package.json +14 -2
@@ -0,0 +1,204 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Vendored from @shadcn/react 0.2.1 (upstream github.com/shadcn-ui).
3
+ // Adapted only for repo import paths and formatting; not added as an npm dependency.
4
+ import * as React from "react";
5
+ import { composeRefs, mergeProps, useRender } from "./use-render.js";
6
+ import { USER_SCROLL_KEYS } from "./types.js";
7
+ import { useMessageScrollerController } from "./use-message-scroller-controller.js";
8
+ import { useLatest } from "./utils.js";
9
+ const MessageScrollerContext = React.createContext(null);
10
+ const MessageScrollerItemContext = React.createContext(null);
11
+ function useMessageScrollerContext() {
12
+ const context = React.useContext(MessageScrollerContext);
13
+ if (!context) {
14
+ throw new Error("useMessageScroller must be used within a MessageScroller.");
15
+ }
16
+ return context;
17
+ }
18
+ function useMessageScrollerItemContext() {
19
+ const context = React.useContext(MessageScrollerItemContext);
20
+ if (!context) {
21
+ throw new Error("MessageScrollerItem must be used within a MessageScroller.");
22
+ }
23
+ return context;
24
+ }
25
+ function useMessageScroller() {
26
+ const { scrollToEnd, scrollToMessage, scrollToStart } = useMessageScrollerContext();
27
+ return React.useMemo(() => ({
28
+ scrollToEnd,
29
+ scrollToMessage,
30
+ scrollToStart,
31
+ }), [scrollToEnd, scrollToMessage, scrollToStart]);
32
+ }
33
+ function useMessageScrollerScrollable() {
34
+ const { stateStore } = useMessageScrollerContext();
35
+ return React.useSyncExternalStore(stateStore.subscribe, stateStore.getSnapshot, stateStore.getSnapshot);
36
+ }
37
+ function useMessageScrollerVisibility() {
38
+ const { observeVisibility, unobserveVisibility, visibilityStore } = useMessageScrollerContext();
39
+ const subscribe = React.useCallback((listener) => visibilityStore.subscribe(listener, observeVisibility, unobserveVisibility), [observeVisibility, unobserveVisibility, visibilityStore]);
40
+ return React.useSyncExternalStore(subscribe, visibilityStore.getSnapshot, visibilityStore.getSnapshot);
41
+ }
42
+ function MessageScrollerProvider({ autoScroll = false, children, defaultScrollPosition = "end", scrollEdgeThreshold, scrollPreviousItemPeek, scrollMargin, }) {
43
+ const { context, registerMessage } = useMessageScrollerController({
44
+ autoScroll,
45
+ defaultScrollPosition,
46
+ scrollEdgeThreshold,
47
+ scrollPreviousItemPeek,
48
+ scrollMargin,
49
+ });
50
+ return (_jsx(MessageScrollerContext.Provider, { value: context, children: _jsx(MessageScrollerItemContext.Provider, { value: registerMessage, children: children }) }));
51
+ }
52
+ function MessageScroller({ children, ...props }) {
53
+ const { setRootElement } = useMessageScrollerContext();
54
+ return (_jsx("div", { ref: setRootElement, ...props, children: children }));
55
+ }
56
+ function MessageScrollerViewport({ "aria-label": ariaLabel, children, onKeyDown, onScroll, onTouchMove, onWheel, preserveScrollOnPrepend = true, ref, role, tabIndex, ...props }) {
57
+ const { handleResize, preserveScrollOnPrependRef, setViewportElement, syncAfterScroll, userScrollIntent, viewportRef, } = useMessageScrollerContext();
58
+ preserveScrollOnPrependRef.current = preserveScrollOnPrepend;
59
+ const setViewportRef = React.useCallback((element) => {
60
+ setViewportElement(element);
61
+ composeRefs(ref)?.(element);
62
+ }, [ref, setViewportElement]);
63
+ function handleScroll(event) {
64
+ syncAfterScroll();
65
+ onScroll?.(event);
66
+ }
67
+ function handleWheel(event) {
68
+ userScrollIntent();
69
+ onWheel?.(event);
70
+ }
71
+ function handleTouchMove(event) {
72
+ userScrollIntent();
73
+ onTouchMove?.(event);
74
+ }
75
+ function handleKeyDown(event) {
76
+ if (USER_SCROLL_KEYS.has(event.key)) {
77
+ userScrollIntent();
78
+ }
79
+ onKeyDown?.(event);
80
+ }
81
+ React.useEffect(() => {
82
+ const viewport = viewportRef.current;
83
+ if (!viewport || typeof ResizeObserver === "undefined") {
84
+ return;
85
+ }
86
+ // Coalesce into rAF: handleResize mutates the spacer inside the observed
87
+ // content, and resizing an observed element during delivery fires
88
+ // "ResizeObserver loop completed with undelivered notifications".
89
+ let frame = 0;
90
+ const observer = new ResizeObserver(() => {
91
+ window.cancelAnimationFrame(frame);
92
+ frame = window.requestAnimationFrame(handleResize);
93
+ });
94
+ observer.observe(viewport);
95
+ return () => {
96
+ window.cancelAnimationFrame(frame);
97
+ observer.disconnect();
98
+ };
99
+ }, [handleResize, viewportRef]);
100
+ return (_jsx("div", { ref: setViewportRef, role: role ?? "region", "aria-label": ariaLabel ?? "Messages", tabIndex: tabIndex ?? 0, onKeyDown: handleKeyDown, onScroll: handleScroll, onTouchMove: handleTouchMove, onWheel: handleWheel, ...props, children: children }));
101
+ }
102
+ function MessageScrollerContent({ "aria-relevant": ariaRelevant, children, ref, role, spacerClassName, ...props }) {
103
+ const { handleContentChange, handleResize, setContentElement, setSpacerElement } = useMessageScrollerContext();
104
+ const contentRef = React.useRef(null);
105
+ const setContentRef = React.useCallback((element) => {
106
+ contentRef.current = element;
107
+ setContentElement(element);
108
+ composeRefs(ref)?.(element);
109
+ }, [ref, setContentElement]);
110
+ React.useLayoutEffect(() => {
111
+ const content = contentRef.current;
112
+ if (!content) {
113
+ return;
114
+ }
115
+ handleContentChange();
116
+ if (typeof MutationObserver === "undefined") {
117
+ return;
118
+ }
119
+ const observer = new MutationObserver(() => {
120
+ handleContentChange();
121
+ });
122
+ observer.observe(content, { childList: true });
123
+ return () => observer.disconnect();
124
+ }, [handleContentChange]);
125
+ React.useEffect(() => {
126
+ const content = contentRef.current;
127
+ if (!content || typeof ResizeObserver === "undefined") {
128
+ return;
129
+ }
130
+ // Coalesce into rAF: handleResize mutates the spacer inside this observed
131
+ // element, and resizing an observed element during delivery fires
132
+ // "ResizeObserver loop completed with undelivered notifications".
133
+ let frame = 0;
134
+ const observer = new ResizeObserver(() => {
135
+ window.cancelAnimationFrame(frame);
136
+ frame = window.requestAnimationFrame(handleResize);
137
+ });
138
+ observer.observe(content);
139
+ return () => {
140
+ window.cancelAnimationFrame(frame);
141
+ observer.disconnect();
142
+ };
143
+ }, [handleResize]);
144
+ return (_jsxs("div", { ref: setContentRef, role: role ?? "log", "aria-relevant": ariaRelevant ?? "additions", ...props, children: [children, _jsx("div", { ref: setSpacerElement, "aria-hidden": "true", "data-message-scroller-spacer": "", hidden: true, className: spacerClassName })] }));
145
+ }
146
+ function MessageScrollerItem({ messageId, ref, scrollAnchor = false, ...props }) {
147
+ const registerMessage = useMessageScrollerItemContext();
148
+ const elementRef = React.useRef(null);
149
+ const setItemRef = React.useCallback((element) => {
150
+ const previousElement = elementRef.current;
151
+ elementRef.current = element;
152
+ if (messageId) {
153
+ registerMessage(messageId, element, previousElement);
154
+ }
155
+ composeRefs(ref)?.(element);
156
+ }, [messageId, ref, registerMessage]);
157
+ return (_jsx("div", { ref: setItemRef, "data-message-id": messageId, "data-scroll-anchor": scrollAnchor ? "true" : "false", ...props }));
158
+ }
159
+ function MessageScrollerButton({ behavior = "smooth", children, direction = "end", onClick, render, tabIndex, type = "button", ...props }) {
160
+ const { scrollToEnd, scrollToStart, stateStore } = useMessageScrollerContext();
161
+ const onClickRef = useLatest(onClick);
162
+ const subscribe = React.useCallback((listener) => stateStore.subscribe(listener), [stateStore]);
163
+ const getSnapshot = React.useCallback(() => {
164
+ const state = stateStore.getSnapshot();
165
+ return direction === "start" ? state.start : state.end;
166
+ }, [direction, stateStore]);
167
+ const isActive = React.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
168
+ const handleClick = React.useCallback((event) => {
169
+ if (!isActive) {
170
+ return;
171
+ }
172
+ onClickRef.current?.(event);
173
+ if (!event.defaultPrevented) {
174
+ event.currentTarget.blur();
175
+ if (direction === "start") {
176
+ scrollToStart({ behavior });
177
+ }
178
+ else {
179
+ scrollToEnd({ behavior });
180
+ }
181
+ }
182
+ }, [behavior, direction, isActive, onClickRef, scrollToEnd, scrollToStart]);
183
+ return useRender({
184
+ defaultTagName: "button",
185
+ props: mergeProps({
186
+ type,
187
+ inert: !isActive,
188
+ tabIndex: isActive ? tabIndex : -1,
189
+ children: children ?? _jsxs("span", { children: ["Scroll to ", direction] }),
190
+ onClick: handleClick,
191
+ }, props),
192
+ render,
193
+ state: {
194
+ active: isActive,
195
+ direction,
196
+ },
197
+ stateAttributesMapping: {
198
+ active: (value) => ({
199
+ "data-active": value ? "true" : "false",
200
+ }),
201
+ },
202
+ });
203
+ }
204
+ export { MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, };
@@ -0,0 +1,55 @@
1
+ import type { MessageScrollerScrollable, MessageScrollerScrollAlign, MessageScrollerVisibilityState } from "./types";
2
+ declare function getMessageScrollerScrollable({ content, scrollEdgeThreshold, spacer, viewport, }: {
3
+ content: HTMLElement | null;
4
+ scrollEdgeThreshold: number;
5
+ spacer: HTMLElement | null;
6
+ viewport: HTMLElement | null;
7
+ }): MessageScrollerScrollable;
8
+ declare function getMessageScrollerVisibilityState({ content, scrollMargin, scrollPreviousItemPeek, spacer, viewport, visibleMessageIds, }: {
9
+ content: HTMLElement | null;
10
+ scrollMargin: number;
11
+ scrollPreviousItemPeek: number;
12
+ spacer: HTMLElement | null;
13
+ viewport: HTMLElement | null;
14
+ visibleMessageIds: Set<string>;
15
+ }): MessageScrollerVisibilityState;
16
+ declare function getMessageScrollerItems(content: HTMLElement, spacer: HTMLElement | null): HTMLElement[];
17
+ declare function getNewScrollAnchor(items: HTMLElement[], previousItemCount: number): HTMLElement | null;
18
+ declare function getUnanchoredScrollAnchor(items: HTMLElement[], handledAnchors: {
19
+ has(element: HTMLElement): boolean;
20
+ }): HTMLElement | null;
21
+ declare function hasMultipleNewScrollAnchors(items: HTMLElement[], previousItemCount: number): boolean;
22
+ declare function getLastScrollAnchor(items: HTMLElement[]): HTMLElement | null;
23
+ declare function getFirstVisibleMessageItem({ content, spacer, viewport, }: {
24
+ content: HTMLElement;
25
+ spacer: HTMLElement | null;
26
+ viewport: HTMLElement;
27
+ }): HTMLElement | null;
28
+ declare function getElementScrollTop({ align, element, scrollMargin, spacer, viewport, }: {
29
+ align: MessageScrollerScrollAlign;
30
+ element: HTMLElement;
31
+ scrollMargin: number;
32
+ spacer: HTMLElement | null;
33
+ viewport: HTMLElement;
34
+ }): number;
35
+ declare function getElementTop(element: HTMLElement, viewport: HTMLElement): number;
36
+ declare function getElementViewportTop(element: HTMLElement, viewport: HTMLElement): number;
37
+ declare function getTailSpacerHeight({ content, scrollTop, spacer, viewport, }: {
38
+ content: HTMLElement;
39
+ scrollTop: number;
40
+ spacer: HTMLElement | null;
41
+ viewport: HTMLElement;
42
+ }): number;
43
+ declare function getContentBottom({ content, spacer, viewport, }: {
44
+ content: HTMLElement;
45
+ spacer: HTMLElement | null;
46
+ viewport: HTMLElement;
47
+ }): number;
48
+ declare function getMaxScrollTop(viewport: HTMLElement): number;
49
+ declare function getContentBlockPadding(spacer: HTMLElement | null): {
50
+ end: number;
51
+ start: number;
52
+ };
53
+ declare function getFlexGap(element: HTMLElement | null): number;
54
+ export { getContentBlockPadding, getContentBottom, getElementScrollTop, getElementTop, getElementViewportTop, getFirstVisibleMessageItem, getFlexGap, getLastScrollAnchor, getMaxScrollTop, getMessageScrollerItems, getMessageScrollerScrollable, getMessageScrollerVisibilityState, getNewScrollAnchor, getTailSpacerHeight, getUnanchoredScrollAnchor, hasMultipleNewScrollAnchors, };
55
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../src/lib/message-scroller-primitive/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ // Vendored from @shadcn/react 0.2.1 (upstream github.com/shadcn-ui).
2
+ // Adapted only for repo import paths and formatting; not added as an npm dependency.
3
+ import { EMPTY_MESSAGE_SCROLLER_SCROLLABLE, EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE, SCROLL_POSITION_EPSILON, } from "./types.js";
4
+ function getMessageScrollerScrollable({ content, scrollEdgeThreshold, spacer, viewport, }) {
5
+ if (!viewport || !content) {
6
+ return EMPTY_MESSAGE_SCROLLER_SCROLLABLE;
7
+ }
8
+ const contentBottom = getContentBottom({ content, spacer, viewport });
9
+ return {
10
+ start: viewport.scrollTop > scrollEdgeThreshold,
11
+ end: contentBottom - viewport.scrollTop - viewport.clientHeight > scrollEdgeThreshold,
12
+ };
13
+ }
14
+ function getMessageScrollerVisibilityState({ content, scrollMargin, scrollPreviousItemPeek, spacer, viewport, visibleMessageIds, }) {
15
+ if (!content || !viewport) {
16
+ return EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE;
17
+ }
18
+ const viewportRect = viewport.getBoundingClientRect();
19
+ // The reading line sits scrollPreviousItemPeek below scrollMargin: anchored
20
+ // turns land there with the previous turn peeking above. A row only peeking in
21
+ // that band has not been read down to yet, so it counts as neither visible nor
22
+ // current.
23
+ const lineTop = viewportRect.top + scrollMargin + scrollPreviousItemPeek;
24
+ const trackByLayout = typeof IntersectionObserver === "undefined";
25
+ const visible = [];
26
+ let currentAnchorId = null;
27
+ // Walk rows in document order so visible ids come out top-to-bottom.
28
+ for (const item of getMessageScrollerItems(content, spacer)) {
29
+ const messageId = item.dataset.messageId;
30
+ if (!messageId) {
31
+ continue;
32
+ }
33
+ const isAnchor = item.dataset.scrollAnchor === "true";
34
+ // Anchors need a rect to place the current line; non-anchors lean on the
35
+ // observer set (or a rect in the no-observer fallback).
36
+ const rect = isAnchor || trackByLayout ? item.getBoundingClientRect() : null;
37
+ const isVisible = trackByLayout && rect
38
+ ? rect.bottom > lineTop && rect.top < viewportRect.bottom
39
+ : visibleMessageIds.has(messageId);
40
+ if (isVisible) {
41
+ visible.push(messageId);
42
+ }
43
+ // Current is the last anchor to have reached the reading line: the turn you
44
+ // scrolled to (placed at the line) wins over newer turns lower down, the
45
+ // previous turn peeking above the line has been passed, and it stays current
46
+ // even after its header scrolls above the viewport.
47
+ if (isAnchor && rect && rect.top <= lineTop + SCROLL_POSITION_EPSILON) {
48
+ currentAnchorId = messageId;
49
+ }
50
+ }
51
+ if (visible.length === 0 && currentAnchorId === null) {
52
+ return EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE;
53
+ }
54
+ return {
55
+ currentAnchorId,
56
+ visibleMessageIds: visible,
57
+ };
58
+ }
59
+ function getMessageScrollerItems(content, spacer) {
60
+ return Array.from(content.children).filter((child) => child instanceof HTMLElement && child !== spacer);
61
+ }
62
+ function getNewScrollAnchor(items, previousItemCount) {
63
+ for (let index = previousItemCount; index < items.length; index++) {
64
+ const item = items[index];
65
+ if (item?.dataset.scrollAnchor === "true") {
66
+ return item;
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ function getUnanchoredScrollAnchor(items, handledAnchors) {
72
+ for (const item of items) {
73
+ if (item.dataset.scrollAnchor === "true" && !handledAnchors.has(item)) {
74
+ return item;
75
+ }
76
+ }
77
+ return null;
78
+ }
79
+ function hasMultipleNewScrollAnchors(items, previousItemCount) {
80
+ let count = 0;
81
+ for (let index = previousItemCount; index < items.length; index++) {
82
+ const item = items[index];
83
+ if (item?.dataset.scrollAnchor !== "true") {
84
+ continue;
85
+ }
86
+ count += 1;
87
+ if (count > 1) {
88
+ return true;
89
+ }
90
+ }
91
+ return false;
92
+ }
93
+ function getLastScrollAnchor(items) {
94
+ for (let index = items.length - 1; index >= 0; index--) {
95
+ const item = items[index];
96
+ if (item?.dataset.scrollAnchor === "true") {
97
+ return item;
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ function getFirstVisibleMessageItem({ content, spacer, viewport, }) {
103
+ const viewportRect = viewport.getBoundingClientRect();
104
+ for (const item of getMessageScrollerItems(content, spacer)) {
105
+ if (!item.dataset.messageId) {
106
+ continue;
107
+ }
108
+ const rect = item.getBoundingClientRect();
109
+ if (rect.bottom > viewportRect.top && rect.top < viewportRect.bottom) {
110
+ return item;
111
+ }
112
+ }
113
+ return null;
114
+ }
115
+ function getElementScrollTop({ align, element, scrollMargin, spacer, viewport, }) {
116
+ const elementTop = getElementTop(element, viewport);
117
+ const elementHeight = element.getBoundingClientRect().height;
118
+ const contentPadding = getContentBlockPadding(spacer);
119
+ if (align === "center") {
120
+ const insetHeight = Math.max(0, viewport.clientHeight - contentPadding.start - contentPadding.end);
121
+ return elementTop - contentPadding.start - (insetHeight - elementHeight) / 2 - scrollMargin;
122
+ }
123
+ if (align === "end") {
124
+ return elementTop - viewport.clientHeight + elementHeight + contentPadding.end + scrollMargin;
125
+ }
126
+ if (align === "nearest") {
127
+ const elementBottom = elementTop + elementHeight;
128
+ const viewportTop = viewport.scrollTop + contentPadding.start;
129
+ const viewportBottom = viewport.scrollTop + viewport.clientHeight - contentPadding.end;
130
+ if (elementTop >= viewportTop && elementBottom <= viewportBottom) {
131
+ return viewport.scrollTop;
132
+ }
133
+ if (elementTop < viewportTop) {
134
+ return elementTop - contentPadding.start - scrollMargin;
135
+ }
136
+ return elementBottom - viewport.clientHeight + contentPadding.end + scrollMargin;
137
+ }
138
+ return elementTop - contentPadding.start - scrollMargin;
139
+ }
140
+ function getElementTop(element, viewport) {
141
+ const elementRect = element.getBoundingClientRect();
142
+ const viewportRect = viewport.getBoundingClientRect();
143
+ return elementRect.top - viewportRect.top + viewport.scrollTop;
144
+ }
145
+ function getElementViewportTop(element, viewport) {
146
+ return element.getBoundingClientRect().top - viewport.getBoundingClientRect().top;
147
+ }
148
+ function getTailSpacerHeight({ content, scrollTop, spacer, viewport, }) {
149
+ const contentBottom = getContentBottom({ content, spacer, viewport });
150
+ return scrollTop + viewport.clientHeight - contentBottom;
151
+ }
152
+ function getContentBottom({ content, spacer, viewport, }) {
153
+ const items = getMessageScrollerItems(content, spacer);
154
+ const padding = getBlockPadding(content);
155
+ const viewportRect = viewport.getBoundingClientRect();
156
+ const scrollTop = viewport.scrollTop;
157
+ let contentBottom = padding.start + padding.end;
158
+ for (const item of items) {
159
+ const rect = item.getBoundingClientRect();
160
+ contentBottom = Math.max(contentBottom, rect.bottom - viewportRect.top + scrollTop + padding.end);
161
+ }
162
+ return contentBottom;
163
+ }
164
+ function getMaxScrollTop(viewport) {
165
+ return Math.max(0, viewport.scrollHeight - viewport.clientHeight);
166
+ }
167
+ function getBlockPadding(element) {
168
+ const style = window.getComputedStyle(element);
169
+ return {
170
+ end: readCssPixel(style.paddingBlockEnd || style.paddingBottom),
171
+ start: readCssPixel(style.paddingBlockStart || style.paddingTop),
172
+ };
173
+ }
174
+ function getContentBlockPadding(spacer) {
175
+ const content = spacer?.parentElement;
176
+ if (!content) {
177
+ return {
178
+ end: 0,
179
+ start: 0,
180
+ };
181
+ }
182
+ return getBlockPadding(content);
183
+ }
184
+ function getFlexGap(element) {
185
+ if (!element) {
186
+ return 0;
187
+ }
188
+ const style = window.getComputedStyle(element);
189
+ const gap = style.rowGap === "normal" ? style.gap : style.rowGap;
190
+ return readCssPixel(gap);
191
+ }
192
+ function readCssPixel(value) {
193
+ if (!value) {
194
+ return 0;
195
+ }
196
+ const number = Number.parseFloat(value);
197
+ return Number.isFinite(number) ? number : 0;
198
+ }
199
+ export { getContentBlockPadding, getContentBottom, getElementScrollTop, getElementTop, getElementViewportTop, getFirstVisibleMessageItem, getFlexGap, getLastScrollAnchor, getMaxScrollTop, getMessageScrollerItems, getMessageScrollerScrollable, getMessageScrollerVisibilityState, getNewScrollAnchor, getTailSpacerHeight, getUnanchoredScrollAnchor, hasMultipleNewScrollAnchors, };
@@ -0,0 +1,12 @@
1
+ import { MessageScrollerButton as Button, MessageScrollerContent as Content, MessageScrollerItem as Item, MessageScrollerProvider as Provider, MessageScroller as Root, MessageScrollerViewport as Viewport } from "./components";
2
+ export declare const MessageScroller: {
3
+ Provider: typeof Provider;
4
+ Root: typeof Root;
5
+ Viewport: typeof Viewport;
6
+ Content: typeof Content;
7
+ Item: typeof Item;
8
+ Button: typeof Button;
9
+ };
10
+ export { useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, } from "./components";
11
+ export type { MessageScrollerDefaultScrollPosition, MessageScrollerScrollAlign, MessageScrollerScrollOptions, MessageScrollerScrollable, MessageScrollerVisibilityState, } from "./types";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/message-scroller-primitive/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,IAAI,MAAM,EAC/B,sBAAsB,IAAI,OAAO,EACjC,mBAAmB,IAAI,IAAI,EAC3B,uBAAuB,IAAI,QAAQ,EACnC,eAAe,IAAI,IAAI,EACvB,uBAAuB,IAAI,QAAQ,EACpC,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,eAAe;;;;;;;CAO3B,CAAC;AAEF,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,oCAAoC,EACpC,0BAA0B,EAC1B,4BAA4B,EAC5B,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,SAAS,CAAC"}
@@ -0,0 +1,12 @@
1
+ // Vendored from @shadcn/react 0.2.1 (upstream github.com/shadcn-ui).
2
+ // Adapted only for repo import paths and formatting; not added as an npm dependency.
3
+ import { MessageScrollerButton as Button, MessageScrollerContent as Content, MessageScrollerItem as Item, MessageScrollerProvider as Provider, MessageScroller as Root, MessageScrollerViewport as Viewport, } from "./components.js";
4
+ export const MessageScroller = {
5
+ Provider,
6
+ Root,
7
+ Viewport,
8
+ Content,
9
+ Item,
10
+ Button,
11
+ };
12
+ export { useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, } from "./components.js";
@@ -0,0 +1,7 @@
1
+ import type { MessageScrollerScrollable, MessageScrollerStore, MessageScrollerVisibilityState, MessageScrollerVisibilityStore } from "./types";
2
+ declare function createMessageScrollerStore<T>(initialSnapshot: T, isEqual: (a: T, b: T) => boolean): MessageScrollerStore<T>;
3
+ declare function createMessageScrollerVisibilityStore(): MessageScrollerVisibilityStore;
4
+ declare function areScrollStatesEqual(current: MessageScrollerScrollable, next: MessageScrollerScrollable): boolean;
5
+ declare function areVisibilityStatesEqual(current: MessageScrollerVisibilityState, next: MessageScrollerVisibilityState): boolean;
6
+ export { areScrollStatesEqual, areVisibilityStatesEqual, createMessageScrollerStore, createMessageScrollerVisibilityStore, };
7
+ //# sourceMappingURL=stores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../../src/lib/message-scroller-primitive/stores.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,8BAA8B,EAC9B,8BAA8B,EAC/B,MAAM,SAAS,CAAC;AA4CjB,iBAAS,0BAA0B,CAAC,CAAC,EACnC,eAAe,EAAE,CAAC,EAClB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,GAC/B,oBAAoB,CAAC,CAAC,CAAC,CAEzB;AAED,iBAAS,oCAAoC,IAAI,8BAA8B,CAE9E;AAED,iBAAS,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,yBAAyB,WAEhG;AAED,iBAAS,wBAAwB,CAC/B,OAAO,EAAE,8BAA8B,EACvC,IAAI,EAAE,8BAA8B,WAarC;AAED,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,oCAAoC,GACrC,CAAC"}
@@ -0,0 +1,53 @@
1
+ // Vendored from @shadcn/react 0.2.1 (upstream github.com/shadcn-ui).
2
+ // Adapted only for repo import paths and formatting; not added as an npm dependency.
3
+ import { EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE } from "./types.js";
4
+ // Generic useSyncExternalStore backing: a stable snapshot (referentially equal
5
+ // while isEqual holds, so subscribers only re-render on real transitions) plus
6
+ // optional reference-counting via the subscribe-time lifecycle callbacks.
7
+ function createExternalStore(initialSnapshot, isEqual) {
8
+ let snapshot = initialSnapshot;
9
+ const listeners = new Set();
10
+ return {
11
+ getSnapshot: () => snapshot,
12
+ hasListeners: () => listeners.size > 0,
13
+ setSnapshot: (nextSnapshot) => {
14
+ if (isEqual(snapshot, nextSnapshot)) {
15
+ return;
16
+ }
17
+ snapshot = nextSnapshot;
18
+ listeners.forEach((listener) => listener());
19
+ },
20
+ subscribe: (listener, onFirstSubscribe, onLastUnsubscribe) => {
21
+ const wasEmpty = listeners.size === 0;
22
+ listeners.add(listener);
23
+ if (wasEmpty) {
24
+ onFirstSubscribe?.();
25
+ }
26
+ return () => {
27
+ listeners.delete(listener);
28
+ if (listeners.size === 0) {
29
+ onLastUnsubscribe?.();
30
+ }
31
+ };
32
+ },
33
+ };
34
+ }
35
+ function createMessageScrollerStore(initialSnapshot, isEqual) {
36
+ return createExternalStore(initialSnapshot, isEqual);
37
+ }
38
+ function createMessageScrollerVisibilityStore() {
39
+ return createExternalStore(EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE, areVisibilityStatesEqual);
40
+ }
41
+ function areScrollStatesEqual(current, next) {
42
+ return current.start === next.start && current.end === next.end;
43
+ }
44
+ function areVisibilityStatesEqual(current, next) {
45
+ if (current.currentAnchorId !== next.currentAnchorId) {
46
+ return false;
47
+ }
48
+ if (current.visibleMessageIds.length !== next.visibleMessageIds.length) {
49
+ return false;
50
+ }
51
+ return current.visibleMessageIds.every((messageId, index) => messageId === next.visibleMessageIds[index]);
52
+ }
53
+ export { areScrollStatesEqual, areVisibilityStatesEqual, createMessageScrollerStore, createMessageScrollerVisibilityStore, };
@@ -0,0 +1,89 @@
1
+ import type * as React from "react";
2
+ import type { UseRenderComponentProps } from "./use-render";
3
+ declare const DEFAULT_SCROLL_EDGE_THRESHOLD = 8;
4
+ declare const DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK = 64;
5
+ declare const DEFAULT_SCROLL_MARGIN = 0;
6
+ declare const SCROLL_POSITION_EPSILON = 0.5;
7
+ declare const AUTOSCROLLING_CLEAR_DELAY = 180;
8
+ declare const USER_SCROLL_KEYS: Set<string>;
9
+ type MessageScrollerMode = "following-bottom" | "free-scrolling" | "anchored-to-message" | "settling-jump";
10
+ type MessageScrollerDefaultScrollPosition = "start" | "end" | "last-anchor";
11
+ type MessageScrollerButtonDirection = "start" | "end";
12
+ type MessageScrollerScrollAlign = "start" | "center" | "end" | "nearest";
13
+ type MessageScrollerScrollOptions = {
14
+ align?: MessageScrollerScrollAlign;
15
+ behavior?: ScrollBehavior;
16
+ scrollMargin?: number;
17
+ };
18
+ type MessageScrollerScrollable = {
19
+ start: boolean;
20
+ end: boolean;
21
+ };
22
+ type MessageScrollerVisibilityState = {
23
+ currentAnchorId: string | null;
24
+ visibleMessageIds: string[];
25
+ };
26
+ type MessageScrollerProviderProps = {
27
+ children?: React.ReactNode;
28
+ autoScroll?: boolean;
29
+ defaultScrollPosition?: MessageScrollerDefaultScrollPosition;
30
+ scrollEdgeThreshold?: number;
31
+ scrollPreviousItemPeek?: number;
32
+ scrollMargin?: number;
33
+ };
34
+ type MessageScrollerProps = React.ComponentProps<"div">;
35
+ type MessageScrollerViewportProps = React.ComponentProps<"div"> & {
36
+ preserveScrollOnPrepend?: boolean;
37
+ };
38
+ type MessageScrollerContentProps = React.ComponentProps<"div"> & {
39
+ spacerClassName?: string;
40
+ };
41
+ type MessageScrollerItemProps = React.ComponentProps<"div"> & {
42
+ messageId?: string;
43
+ scrollAnchor?: boolean;
44
+ };
45
+ type MessageScrollerButtonRenderState = {
46
+ active: boolean;
47
+ direction: MessageScrollerButtonDirection;
48
+ };
49
+ type MessageScrollerButtonProps = UseRenderComponentProps<"button", MessageScrollerButtonRenderState> & {
50
+ behavior?: ScrollBehavior;
51
+ direction?: MessageScrollerButtonDirection;
52
+ };
53
+ type MessageScrollerStore<T> = {
54
+ getSnapshot: () => T;
55
+ setSnapshot: (nextSnapshot: T) => void;
56
+ subscribe: (listener: () => void) => () => void;
57
+ };
58
+ type MessageScrollerVisibilityStore = {
59
+ getSnapshot: () => MessageScrollerVisibilityState;
60
+ hasListeners: () => boolean;
61
+ setSnapshot: (nextSnapshot: MessageScrollerVisibilityState) => void;
62
+ subscribe: (listener: () => void, onFirstSubscribe: () => void, onLastUnsubscribe: () => void) => () => void;
63
+ };
64
+ type MessageScrollerRegisterMessage = (messageId: string, element: HTMLElement | null, removedElement?: HTMLElement | null) => void;
65
+ type MessageScrollerContextValue = {
66
+ handleContentChange: () => void;
67
+ handleResize: () => void;
68
+ observeVisibility: () => void;
69
+ preserveScrollOnPrependRef: React.RefObject<boolean>;
70
+ scrollToEnd: (options?: MessageScrollerScrollOptions) => boolean;
71
+ scrollToMessage: (messageId: string, options?: MessageScrollerScrollOptions) => boolean;
72
+ scrollToStart: (options?: MessageScrollerScrollOptions) => boolean;
73
+ setContentElement: (element: HTMLDivElement | null) => void;
74
+ setRootElement: (element: HTMLDivElement | null) => void;
75
+ setSpacerElement: (element: HTMLDivElement | null) => void;
76
+ setViewportElement: (element: HTMLDivElement | null) => void;
77
+ stateStore: MessageScrollerStore<MessageScrollerScrollable>;
78
+ syncAfterScroll: () => void;
79
+ unobserveVisibility: () => void;
80
+ userScrollIntent: () => void;
81
+ viewportRef: React.RefObject<HTMLDivElement | null>;
82
+ visibilityStore: MessageScrollerVisibilityStore;
83
+ };
84
+ declare const EMPTY_MESSAGE_SCROLLER_SCROLLABLE: MessageScrollerScrollable;
85
+ declare const EMPTY_VISIBLE_MESSAGE_IDS: string[];
86
+ declare const EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE: MessageScrollerVisibilityState;
87
+ export { AUTOSCROLLING_CLEAR_DELAY, DEFAULT_SCROLL_EDGE_THRESHOLD, DEFAULT_SCROLL_MARGIN, DEFAULT_SCROLL_PREVIOUS_ITEM_PEEK, EMPTY_MESSAGE_SCROLLER_SCROLLABLE, EMPTY_MESSAGE_SCROLLER_VISIBILITY_STATE, EMPTY_VISIBLE_MESSAGE_IDS, SCROLL_POSITION_EPSILON, USER_SCROLL_KEYS, };
88
+ export type { MessageScrollerButtonDirection, MessageScrollerButtonProps, MessageScrollerButtonRenderState, MessageScrollerContentProps, MessageScrollerContextValue, MessageScrollerDefaultScrollPosition, MessageScrollerItemProps, MessageScrollerMode, MessageScrollerProps, MessageScrollerProviderProps, MessageScrollerRegisterMessage, MessageScrollerScrollAlign, MessageScrollerScrollOptions, MessageScrollerScrollable, MessageScrollerStore, MessageScrollerViewportProps, MessageScrollerVisibilityState, MessageScrollerVisibilityStore, };
89
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/message-scroller-primitive/types.ts"],"names":[],"mappings":"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"}