@nadicodeai/ui 0.20.0 → 0.22.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 (350) hide show
  1. package/AGENTS.md +4 -3
  2. package/README.md +14 -21
  3. package/dist/agents.d.ts +10 -0
  4. package/dist/agents.d.ts.map +1 -0
  5. package/dist/agents.js +9 -0
  6. package/dist/components/badge.d.ts +1 -1
  7. package/dist/components/brand-icons/apple.d.ts +18 -0
  8. package/dist/components/brand-icons/apple.d.ts.map +1 -0
  9. package/dist/components/brand-icons/apple.js +22 -0
  10. package/dist/components/brand-icons/brand-icon.d.ts +22 -0
  11. package/dist/components/brand-icons/brand-icon.d.ts.map +1 -0
  12. package/dist/components/brand-icons/brand-icon.js +26 -0
  13. package/dist/components/brand-icons/linux.d.ts +18 -0
  14. package/dist/components/brand-icons/linux.d.ts.map +1 -0
  15. package/dist/components/brand-icons/linux.js +25 -0
  16. package/dist/components/brand-icons/windows.d.ts +18 -0
  17. package/dist/components/brand-icons/windows.d.ts.map +1 -0
  18. package/dist/components/brand-icons/windows.js +22 -0
  19. package/dist/components/brand-icons.d.ts +5 -0
  20. package/dist/components/brand-icons.d.ts.map +1 -0
  21. package/dist/components/brand-icons.js +10 -0
  22. package/dist/components/button.d.ts +1 -1
  23. package/dist/components/button.js +1 -1
  24. package/dist/components/card-marketing.js +2 -2
  25. package/dist/components/card.d.ts +4 -3
  26. package/dist/components/card.d.ts.map +1 -1
  27. package/dist/components/card.js +12 -2
  28. package/dist/components/chart-breakdown-table.js +1 -1
  29. package/dist/components/chart-bullet-bar.d.ts +18 -2
  30. package/dist/components/chart-bullet-bar.d.ts.map +1 -1
  31. package/dist/components/chart-bullet-bar.js +62 -9
  32. package/dist/components/chart-date-range-control.d.ts +11 -1
  33. package/dist/components/chart-date-range-control.d.ts.map +1 -1
  34. package/dist/components/chart-date-range-control.js +13 -3
  35. package/dist/components/chart-entity-colors.d.ts +7 -1
  36. package/dist/components/chart-entity-colors.d.ts.map +1 -1
  37. package/dist/components/chart-entity-colors.js +7 -1
  38. package/dist/components/chart-kpi-stat.d.ts.map +1 -1
  39. package/dist/components/chart-kpi-stat.js +1 -1
  40. package/dist/components/chart-time-series.d.ts.map +1 -1
  41. package/dist/components/chart-time-series.js +62 -4
  42. package/dist/components/chart.js +2 -2
  43. package/dist/components/code-editor-mockup.js +1 -1
  44. package/dist/components/nav-bar.js +1 -1
  45. package/dist/components/radio-group.d.ts +1 -1
  46. package/dist/components/radio-group.d.ts.map +1 -1
  47. package/dist/components/radio-group.js +2 -2
  48. package/dist/components/theme-mode-switcher.d.ts +10 -3
  49. package/dist/components/theme-mode-switcher.d.ts.map +1 -1
  50. package/dist/components/theme-mode-switcher.js +14 -7
  51. package/dist/components/use-case-bento.d.ts +2 -4
  52. package/dist/components/use-case-bento.d.ts.map +1 -1
  53. package/dist/components/use-case-bento.js +2 -3
  54. package/dist/eslint/index.js +91 -0
  55. package/dist/eslint/rules/jsx-class-utility.js +231 -0
  56. package/dist/eslint/rules/no-deprecated-zod-api.js +156 -0
  57. package/dist/eslint/rules/no-design-system-src-import.js +11 -0
  58. package/dist/eslint/rules/no-invalid-token-utility.js +46 -0
  59. package/dist/eslint/rules/no-native-visible-control.js +86 -0
  60. package/dist/eslint/rules/no-raw-color-utility.js +109 -0
  61. package/dist/eslint/rules/no-raw-focus-ring-width.js +30 -0
  62. package/dist/eslint/rules/no-raw-logo-import.js +41 -0
  63. package/dist/eslint/rules/no-shadcn-appearance-override.js +191 -0
  64. package/dist/eslint/rules/no-token-category-bypass.js +53 -0
  65. package/dist/eslint/rules/no-ui-src-import.js +10 -0
  66. package/dist/eslint/rules/no-unpinned-vercel-functions-import.js +100 -0
  67. package/dist/eslint/rules/src-import-boundary.js +207 -0
  68. package/dist/hooks/index.d.ts +0 -1
  69. package/dist/hooks/index.d.ts.map +1 -1
  70. package/dist/hooks/index.js +0 -1
  71. package/dist/index.d.ts +1 -16
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +1 -16
  74. package/dist/internal/assistant-ui/attachment.d.ts +5 -0
  75. package/dist/internal/assistant-ui/attachment.d.ts.map +1 -0
  76. package/dist/internal/assistant-ui/attachment.js +93 -0
  77. package/dist/internal/assistant-ui/follow-up-suggestions.d.ts +3 -0
  78. package/dist/internal/assistant-ui/follow-up-suggestions.d.ts.map +1 -0
  79. package/dist/internal/assistant-ui/follow-up-suggestions.js +8 -0
  80. package/dist/internal/assistant-ui/markdown-text.d.ts +2 -0
  81. package/dist/internal/assistant-ui/markdown-text.d.ts.map +1 -0
  82. package/dist/internal/assistant-ui/markdown-text.js +54 -0
  83. package/dist/internal/assistant-ui/reasoning.d.ts +31 -0
  84. package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -0
  85. package/dist/internal/assistant-ui/reasoning.js +118 -0
  86. package/dist/internal/assistant-ui/thread.d.ts +26 -0
  87. package/dist/internal/assistant-ui/thread.d.ts.map +1 -0
  88. package/dist/internal/assistant-ui/thread.js +118 -0
  89. package/dist/internal/assistant-ui/tool-fallback.d.ts +10 -0
  90. package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -0
  91. package/dist/internal/assistant-ui/tool-fallback.js +163 -0
  92. package/dist/internal/assistant-ui/tool-group.d.ts +18 -0
  93. package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -0
  94. package/dist/internal/assistant-ui/tool-group.js +44 -0
  95. package/dist/internal/assistant-ui/tooltip-icon-button.d.ts +8 -0
  96. package/dist/internal/assistant-ui/tooltip-icon-button.d.ts.map +1 -0
  97. package/dist/internal/assistant-ui/tooltip-icon-button.js +10 -0
  98. package/dist/styles/globals.css +3 -209
  99. package/docs/agents/nadicodeai-ui.md +4 -6
  100. package/docs/component-classification.md +1 -1
  101. package/docs/consuming-cross-repo.md +32 -3
  102. package/docs/contract.md +16 -6
  103. package/docs/migration/base-ui-migration.md +0 -11
  104. package/docs/product-compositions.md +1 -1
  105. package/llms.txt +5 -6
  106. package/package.json +17 -29
  107. package/skills/nadicodeai-ui/SKILL.md +5 -7
  108. package/dist/ai-elements.d.ts +0 -49
  109. package/dist/ai-elements.d.ts.map +0 -1
  110. package/dist/ai-elements.js +0 -48
  111. package/dist/components/agent-avatar.d.ts +0 -7
  112. package/dist/components/agent-avatar.d.ts.map +0 -1
  113. package/dist/components/agent-avatar.js +0 -6
  114. package/dist/components/agent-chat.d.ts +0 -20
  115. package/dist/components/agent-chat.d.ts.map +0 -1
  116. package/dist/components/agent-chat.js +0 -10
  117. package/dist/components/agent-composer.d.ts +0 -56
  118. package/dist/components/agent-composer.d.ts.map +0 -1
  119. package/dist/components/agent-composer.js +0 -56
  120. package/dist/components/agent-message.d.ts +0 -117
  121. package/dist/components/agent-message.d.ts.map +0 -1
  122. package/dist/components/agent-message.js +0 -99
  123. package/dist/components/agent-thread.d.ts +0 -26
  124. package/dist/components/agent-thread.d.ts.map +0 -1
  125. package/dist/components/agent-thread.js +0 -63
  126. package/dist/components/agent-tool-approval.d.ts +0 -27
  127. package/dist/components/agent-tool-approval.d.ts.map +0 -1
  128. package/dist/components/agent-tool-approval.js +0 -43
  129. package/dist/components/ai-elements/agent.d.ts +0 -27
  130. package/dist/components/ai-elements/agent.d.ts.map +0 -1
  131. package/dist/components/ai-elements/agent.js +0 -25
  132. package/dist/components/ai-elements/artifact.d.ts +0 -24
  133. package/dist/components/ai-elements/artifact.d.ts.map +0 -1
  134. package/dist/components/ai-elements/artifact.js +0 -20
  135. package/dist/components/ai-elements/attachments.d.ts +0 -55
  136. package/dist/components/ai-elements/attachments.d.ts.map +0 -1
  137. package/dist/components/ai-elements/attachments.js +0 -125
  138. package/dist/components/ai-elements/audio-player.d.ts +0 -30
  139. package/dist/components/ai-elements/audio-player.d.ts.map +0 -1
  140. package/dist/components/ai-elements/audio-player.js +0 -41
  141. package/dist/components/ai-elements/canvas.d.ts +0 -8
  142. package/dist/components/ai-elements/canvas.d.ts.map +0 -1
  143. package/dist/components/ai-elements/canvas.js +0 -5
  144. package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
  145. package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
  146. package/dist/components/ai-elements/chain-of-thought.js +0 -49
  147. package/dist/components/ai-elements/checkpoint.d.ts +0 -12
  148. package/dist/components/ai-elements/checkpoint.d.ts.map +0 -1
  149. package/dist/components/ai-elements/checkpoint.js +0 -10
  150. package/dist/components/ai-elements/code-block.d.ts +0 -53
  151. package/dist/components/ai-elements/code-block.d.ts.map +0 -1
  152. package/dist/components/ai-elements/code-block.js +0 -239
  153. package/dist/components/ai-elements/commit.d.ts +0 -65
  154. package/dist/components/ai-elements/commit.d.ts.map +0 -1
  155. package/dist/components/ai-elements/commit.js +0 -83
  156. package/dist/components/ai-elements/confirmation.d.ts +0 -50
  157. package/dist/components/ai-elements/confirmation.d.ts.map +0 -1
  158. package/dist/components/ai-elements/confirmation.js +0 -57
  159. package/dist/components/ai-elements/connection.d.ts +0 -6
  160. package/dist/components/ai-elements/connection.d.ts.map +0 -1
  161. package/dist/components/ai-elements/connection.js +0 -10
  162. package/dist/components/ai-elements/context.d.ts +0 -33
  163. package/dist/components/ai-elements/context.d.ts.map +0 -1
  164. package/dist/components/ai-elements/context.js +0 -147
  165. package/dist/components/ai-elements/controls.d.ts +0 -5
  166. package/dist/components/ai-elements/controls.d.ts.map +0 -1
  167. package/dist/components/ai-elements/controls.js +0 -5
  168. package/dist/components/ai-elements/conversation.d.ts +0 -24
  169. package/dist/components/ai-elements/conversation.d.ts.map +0 -1
  170. package/dist/components/ai-elements/conversation.js +0 -41
  171. package/dist/components/ai-elements/edge.d.ts +0 -6
  172. package/dist/components/ai-elements/edge.d.ts.map +0 -1
  173. package/dist/components/ai-elements/edge.js +0 -88
  174. package/dist/components/ai-elements/environment-variables.d.ts +0 -39
  175. package/dist/components/ai-elements/environment-variables.d.ts.map +0 -1
  176. package/dist/components/ai-elements/environment-variables.js +0 -60
  177. package/dist/components/ai-elements/file-tree.d.ts +0 -27
  178. package/dist/components/ai-elements/file-tree.d.ts.map +0 -1
  179. package/dist/components/ai-elements/file-tree.js +0 -73
  180. package/dist/components/ai-elements/image.d.ts +0 -7
  181. package/dist/components/ai-elements/image.d.ts.map +0 -1
  182. package/dist/components/ai-elements/image.js +0 -3
  183. package/dist/components/ai-elements/inline-citation.d.ts +0 -39
  184. package/dist/components/ai-elements/inline-citation.d.ts.map +0 -1
  185. package/dist/components/ai-elements/inline-citation.js +0 -86
  186. package/dist/components/ai-elements/jsx-preview.d.ts +0 -30
  187. package/dist/components/ai-elements/jsx-preview.d.ts.map +0 -1
  188. package/dist/components/ai-elements/jsx-preview.js +0 -159
  189. package/dist/components/ai-elements/message.d.ts +0 -38
  190. package/dist/components/ai-elements/message.d.ts.map +0 -1
  191. package/dist/components/ai-elements/message.js +0 -91
  192. package/dist/components/ai-elements/mic-selector.d.ts +0 -46
  193. package/dist/components/ai-elements/mic-selector.d.ts.map +0 -1
  194. package/dist/components/ai-elements/mic-selector.js +0 -180
  195. package/dist/components/ai-elements/model-selector.d.ts +0 -36
  196. package/dist/components/ai-elements/model-selector.d.ts.map +0 -1
  197. package/dist/components/ai-elements/model-selector.js +0 -18
  198. package/dist/components/ai-elements/node.d.ts +0 -22
  199. package/dist/components/ai-elements/node.d.ts.map +0 -1
  200. package/dist/components/ai-elements/node.js +0 -12
  201. package/dist/components/ai-elements/open-in-chat.d.ts +0 -27
  202. package/dist/components/ai-elements/open-in-chat.d.ts.map +0 -1
  203. package/dist/components/ai-elements/open-in-chat.js +0 -81
  204. package/dist/components/ai-elements/package-info.d.ts +0 -30
  205. package/dist/components/ai-elements/package-info.d.ts.map +0 -1
  206. package/dist/components/ai-elements/package-info.js +0 -50
  207. package/dist/components/ai-elements/panel.d.ts +0 -6
  208. package/dist/components/ai-elements/panel.d.ts.map +0 -1
  209. package/dist/components/ai-elements/panel.js +0 -5
  210. package/dist/components/ai-elements/persona.d.ts +0 -49
  211. package/dist/components/ai-elements/persona.d.ts.map +0 -1
  212. package/dist/components/ai-elements/persona.js +0 -175
  213. package/dist/components/ai-elements/plan.d.ts +0 -27
  214. package/dist/components/ai-elements/plan.d.ts.map +0 -1
  215. package/dist/components/ai-elements/plan.js +0 -34
  216. package/dist/components/ai-elements/prompt-input.d.ts +0 -149
  217. package/dist/components/ai-elements/prompt-input.d.ts.map +0 -1
  218. package/dist/components/ai-elements/prompt-input.js +0 -704
  219. package/dist/components/ai-elements/queue.d.ts +0 -62
  220. package/dist/components/ai-elements/queue.d.ts.map +0 -1
  221. package/dist/components/ai-elements/queue.js +0 -24
  222. package/dist/components/ai-elements/reasoning.d.ts +0 -27
  223. package/dist/components/ai-elements/reasoning.d.ts.map +0 -1
  224. package/dist/components/ai-elements/reasoning.js +0 -92
  225. package/dist/components/ai-elements/sandbox.d.ts +0 -25
  226. package/dist/components/ai-elements/sandbox.d.ts.map +0 -1
  227. package/dist/components/ai-elements/sandbox.js +0 -15
  228. package/dist/components/ai-elements/schema-display.d.ts +0 -56
  229. package/dist/components/ai-elements/schema-display.d.ts.map +0 -1
  230. package/dist/components/ai-elements/schema-display.js +0 -90
  231. package/dist/components/ai-elements/shimmer.d.ts +0 -10
  232. package/dist/components/ai-elements/shimmer.d.ts.map +0 -1
  233. package/dist/components/ai-elements/shimmer.js +0 -11
  234. package/dist/components/ai-elements/snippet.d.ts +0 -19
  235. package/dist/components/ai-elements/snippet.d.ts.map +0 -1
  236. package/dist/components/ai-elements/snippet.js +0 -32
  237. package/dist/components/ai-elements/sources.d.ts +0 -13
  238. package/dist/components/ai-elements/sources.d.ts.map +0 -1
  239. package/dist/components/ai-elements/sources.js +0 -9
  240. package/dist/components/ai-elements/speech-input.d.ts +0 -55
  241. package/dist/components/ai-elements/speech-input.d.ts.map +0 -1
  242. package/dist/components/ai-elements/speech-input.js +0 -187
  243. package/dist/components/ai-elements/stack-trace.d.ts +0 -38
  244. package/dist/components/ai-elements/stack-trace.d.ts.map +0 -1
  245. package/dist/components/ai-elements/stack-trace.js +0 -181
  246. package/dist/components/ai-elements/suggestion.d.ts +0 -11
  247. package/dist/components/ai-elements/suggestion.d.ts.map +0 -1
  248. package/dist/components/ai-elements/suggestion.js +0 -13
  249. package/dist/components/ai-elements/task.d.ts +0 -15
  250. package/dist/components/ai-elements/task.d.ts.map +0 -1
  251. package/dist/components/ai-elements/task.js +0 -10
  252. package/dist/components/ai-elements/terminal.d.ts +0 -28
  253. package/dist/components/ai-elements/terminal.d.ts.map +0 -1
  254. package/dist/components/ai-elements/terminal.js +0 -55
  255. package/dist/components/ai-elements/test-results.d.ts +0 -59
  256. package/dist/components/ai-elements/test-results.d.ts.map +0 -1
  257. package/dist/components/ai-elements/test-results.js +0 -98
  258. package/dist/components/ai-elements/tool.d.ts +0 -32
  259. package/dist/components/ai-elements/tool.d.ts.map +0 -1
  260. package/dist/components/ai-elements/tool.js +0 -49
  261. package/dist/components/ai-elements/toolbar.d.ts +0 -6
  262. package/dist/components/ai-elements/toolbar.d.ts.map +0 -1
  263. package/dist/components/ai-elements/toolbar.js +0 -5
  264. package/dist/components/ai-elements/transcription.d.ts +0 -17
  265. package/dist/components/ai-elements/transcription.d.ts.map +0 -1
  266. package/dist/components/ai-elements/transcription.js +0 -36
  267. package/dist/components/ai-elements/voice-selector.d.ts +0 -65
  268. package/dist/components/ai-elements/voice-selector.d.ts.map +0 -1
  269. package/dist/components/ai-elements/voice-selector.js +0 -224
  270. package/dist/components/ai-elements/web-preview.d.ts +0 -35
  271. package/dist/components/ai-elements/web-preview.d.ts.map +0 -1
  272. package/dist/components/ai-elements/web-preview.js +0 -66
  273. package/dist/components/artifact-panel.d.ts +0 -130
  274. package/dist/components/artifact-panel.d.ts.map +0 -1
  275. package/dist/components/artifact-panel.js +0 -180
  276. package/dist/components/attachment.d.ts +0 -24
  277. package/dist/components/attachment.d.ts.map +0 -1
  278. package/dist/components/attachment.js +0 -68
  279. package/dist/components/bubble.d.ts +0 -17
  280. package/dist/components/bubble.d.ts.map +0 -1
  281. package/dist/components/bubble.js +0 -59
  282. package/dist/components/demo-surface.d.ts +0 -34
  283. package/dist/components/demo-surface.d.ts.map +0 -1
  284. package/dist/components/demo-surface.js +0 -21
  285. package/dist/components/files-preview.d.ts +0 -36
  286. package/dist/components/files-preview.d.ts.map +0 -1
  287. package/dist/components/files-preview.js +0 -85
  288. package/dist/components/marker.d.ts +0 -11
  289. package/dist/components/marker.d.ts.map +0 -1
  290. package/dist/components/marker.js +0 -34
  291. package/dist/components/message-scroller.d.ts +0 -17
  292. package/dist/components/message-scroller.d.ts.map +0 -1
  293. package/dist/components/message-scroller.js +0 -29
  294. package/dist/components/message.d.ts +0 -11
  295. package/dist/components/message.d.ts.map +0 -1
  296. package/dist/components/message.js +0 -21
  297. package/dist/components/state-notice.d.ts +0 -13
  298. package/dist/components/state-notice.d.ts.map +0 -1
  299. package/dist/components/state-notice.js +0 -8
  300. package/dist/components/watch-it-work-band.d.ts +0 -12
  301. package/dist/components/watch-it-work-band.d.ts.map +0 -1
  302. package/dist/components/watch-it-work-band.js +0 -8
  303. package/dist/hooks/use-controllable-state.d.ts +0 -9
  304. package/dist/hooks/use-controllable-state.d.ts.map +0 -1
  305. package/dist/hooks/use-controllable-state.js +0 -23
  306. package/dist/lib/agent-attachment.d.ts +0 -11
  307. package/dist/lib/agent-attachment.d.ts.map +0 -1
  308. package/dist/lib/agent-attachment.js +0 -19
  309. package/dist/lib/agent-contracts.d.ts +0 -132
  310. package/dist/lib/agent-contracts.d.ts.map +0 -1
  311. package/dist/lib/agent-contracts.js +0 -6
  312. package/dist/lib/agent-state.d.ts +0 -22
  313. package/dist/lib/agent-state.d.ts.map +0 -1
  314. package/dist/lib/agent-state.js +0 -96
  315. package/dist/lib/agent-work-state.d.ts +0 -36
  316. package/dist/lib/agent-work-state.d.ts.map +0 -1
  317. package/dist/lib/agent-work-state.js +0 -36
  318. package/dist/lib/message-scroller-primitive/components.d.ts +0 -17
  319. package/dist/lib/message-scroller-primitive/components.d.ts.map +0 -1
  320. package/dist/lib/message-scroller-primitive/components.js +0 -204
  321. package/dist/lib/message-scroller-primitive/geometry.d.ts +0 -51
  322. package/dist/lib/message-scroller-primitive/geometry.d.ts.map +0 -1
  323. package/dist/lib/message-scroller-primitive/geometry.js +0 -199
  324. package/dist/lib/message-scroller-primitive/index.d.ts +0 -12
  325. package/dist/lib/message-scroller-primitive/index.d.ts.map +0 -1
  326. package/dist/lib/message-scroller-primitive/index.js +0 -12
  327. package/dist/lib/message-scroller-primitive/stores.d.ts +0 -6
  328. package/dist/lib/message-scroller-primitive/stores.d.ts.map +0 -1
  329. package/dist/lib/message-scroller-primitive/stores.js +0 -53
  330. package/dist/lib/message-scroller-primitive/types.d.ts +0 -88
  331. package/dist/lib/message-scroller-primitive/types.d.ts.map +0 -1
  332. package/dist/lib/message-scroller-primitive/types.js +0 -40
  333. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.d.ts +0 -19
  334. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.d.ts.map +0 -1
  335. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.js +0 -188
  336. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.d.ts +0 -7
  337. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.d.ts.map +0 -1
  338. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.js +0 -506
  339. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.d.ts +0 -49
  340. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.d.ts.map +0 -1
  341. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.js +0 -90
  342. package/dist/lib/message-scroller-primitive/use-render.d.ts +0 -22
  343. package/dist/lib/message-scroller-primitive/use-render.d.ts.map +0 -1
  344. package/dist/lib/message-scroller-primitive/use-render.js +0 -113
  345. package/dist/lib/message-scroller-primitive/utils.d.ts +0 -4
  346. package/dist/lib/message-scroller-primitive/utils.d.ts.map +0 -1
  347. package/dist/lib/message-scroller-primitive/utils.js +0 -9
  348. package/docs/agent-work-surfaces.md +0 -132
  349. package/docs/migration/ai-elements-vendoring.md +0 -29
  350. package/docs/terminal-tui-semantics.md +0 -172
@@ -1,96 +0,0 @@
1
- export function getAgentQueueWindow(items, activeIndex, windowSize = 3) {
2
- const size = Math.max(0, Math.trunc(windowSize));
3
- const start = activeIndex === null
4
- ? 0
5
- : Math.max(0, Math.min(Math.trunc(activeIndex) - 1, Math.max(0, items.length - size)));
6
- const end = Math.min(items.length, start + size);
7
- return {
8
- end,
9
- hasEarlier: start > 0,
10
- hasLater: end < items.length,
11
- start,
12
- window: items.slice(start, end),
13
- };
14
- }
15
- function isFenceOpenAt(text, end) {
16
- let codeOpen = false;
17
- let mathOpen = false;
18
- let mathOpener = null;
19
- let offset = 0;
20
- while (offset < end) {
21
- const newline = text.indexOf("\n", offset);
22
- const lineEnd = newline < 0 || newline > end ? end : newline;
23
- const line = text.slice(offset, lineEnd).trim();
24
- if (/^(?:`{3,}|~{3,})/.test(line)) {
25
- codeOpen = !codeOpen;
26
- }
27
- else if (!codeOpen) {
28
- if (!mathOpen && /^\$\$/.test(line)) {
29
- if (!(line.length >= 4 && /\$\$$/.test(line))) {
30
- mathOpen = true;
31
- mathOpener = "$$";
32
- }
33
- }
34
- else if (!mathOpen && /^\\\[/.test(line)) {
35
- if (!/\\\]$/.test(line)) {
36
- mathOpen = true;
37
- mathOpener = "\\[";
38
- }
39
- }
40
- else if (mathOpen && mathOpener === "$$" && /\$\$$/.test(line)) {
41
- mathOpen = false;
42
- mathOpener = null;
43
- }
44
- else if (mathOpen && mathOpener === "\\[" && /\\\]$/.test(line)) {
45
- mathOpen = false;
46
- mathOpener = null;
47
- }
48
- }
49
- if (newline < 0 || newline >= end) {
50
- break;
51
- }
52
- offset = newline + 1;
53
- }
54
- return codeOpen || mathOpen;
55
- }
56
- function findAgentStableBoundary(text) {
57
- let index = text.length;
58
- while (index > 0) {
59
- const boundary = text.lastIndexOf("\n\n", index - 1);
60
- if (boundary < 0) {
61
- return -1;
62
- }
63
- const splitAt = boundary + 2;
64
- if (!isFenceOpenAt(text, splitAt)) {
65
- return splitAt;
66
- }
67
- index = boundary;
68
- }
69
- return -1;
70
- }
71
- export function splitAgentStreamingMarkdown(text, previousStablePrefix = "") {
72
- let stablePrefix = text.startsWith(previousStablePrefix) ? previousStablePrefix : "";
73
- const boundary = findAgentStableBoundary(text);
74
- if (boundary > stablePrefix.length) {
75
- stablePrefix = text.slice(0, boundary);
76
- }
77
- return {
78
- stablePrefix,
79
- unstableSuffix: text.slice(stablePrefix.length),
80
- };
81
- }
82
- export function windowAgentMessagesByBudget(messages, budget) {
83
- let firstVisible = messages.length;
84
- let weight = 0;
85
- for (let index = messages.length - 1; index >= 0; index -= 1) {
86
- weight += Math.max(0, messages[index].weight);
87
- firstVisible = index;
88
- if (weight >= budget) {
89
- break;
90
- }
91
- }
92
- return {
93
- hasEarlier: firstVisible > 0,
94
- window: messages.slice(firstVisible),
95
- };
96
- }
@@ -1,36 +0,0 @@
1
- /**
2
- * Internal seam for the `AgentWorkState` presentation contract.
3
- *
4
- * This module is the ONE place a work state's icon, ARIA `role`, and
5
- * busy/motion signal are decided. Every caller (`agent-message.tsx`,
6
- * `agent-thread.tsx`, `state-notice.tsx`) reads `statePresentation` instead
7
- * of keeping its own copy of the icon table or the role/busy rule, so a
8
- * future state's presentation rule has exactly one place to be added or
9
- * fixed.
10
- *
11
- * This is NOT part of the public package surface. It has no `exports`
12
- * subpath, matching `agent-attachment.ts` and `seam.ts` in this directory.
13
- *
14
- * Dependency direction is one-way: components import this module; this
15
- * module never imports a component (no cycle).
16
- */
17
- import type { ComponentType } from "react";
18
- type AgentWorkState = "idle" | "empty" | "queued" | "streaming" | "interrupted" | "retryable" | "permission-denied" | "fatal";
19
- type AgentWorkStatePresentation = {
20
- icon: ComponentType<{
21
- className?: string;
22
- }>;
23
- role: "alert" | "status";
24
- busy: boolean;
25
- };
26
- /**
27
- * statePresentation is the single source of truth for a presentable
28
- * `AgentWorkState`'s icon, ARIA `role`, and busy/motion signal. Icon values
29
- * reproduce `agent-message.tsx`'s `stateMeta` and `agent-thread.tsx`'s
30
- * `threadStateDefaults` (confirmed byte-identical icon-for-icon); `role`
31
- * and `busy` reproduce `state-notice.tsx`'s inline rules verbatim.
32
- */
33
- declare function statePresentation(state: Exclude<AgentWorkState, "idle" | "empty">): AgentWorkStatePresentation;
34
- export { statePresentation };
35
- export type { AgentWorkState };
36
- //# sourceMappingURL=agent-work-state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-work-state.d.ts","sourceRoot":"","sources":["../../src/lib/agent-work-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAU3C,KAAK,cAAc,GACf,MAAM,GACN,OAAO,GACP,QAAQ,GACR,WAAW,GACX,aAAa,GACb,WAAW,GACX,mBAAmB,GACnB,OAAO,CAAC;AAEZ,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAcF;;;;;;GAMG;AACH,iBAAS,iBAAiB,CACxB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,GAC/C,0BAA0B,CAE5B;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,CAAC"}
@@ -1,36 +0,0 @@
1
- /**
2
- * Internal seam for the `AgentWorkState` presentation contract.
3
- *
4
- * This module is the ONE place a work state's icon, ARIA `role`, and
5
- * busy/motion signal are decided. Every caller (`agent-message.tsx`,
6
- * `agent-thread.tsx`, `state-notice.tsx`) reads `statePresentation` instead
7
- * of keeping its own copy of the icon table or the role/busy rule, so a
8
- * future state's presentation rule has exactly one place to be added or
9
- * fixed.
10
- *
11
- * This is NOT part of the public package surface. It has no `exports`
12
- * subpath, matching `agent-attachment.ts` and `seam.ts` in this directory.
13
- *
14
- * Dependency direction is one-way: components import this module; this
15
- * module never imports a component (no cycle).
16
- */
17
- import { AlertTriangleIcon, ClockIcon, FileWarningIcon, LoaderCircleIcon, RefreshCwIcon, ShieldXIcon, } from "lucide-react";
18
- const presentationByState = {
19
- fatal: { busy: false, icon: FileWarningIcon, role: "alert" },
20
- interrupted: { busy: false, icon: AlertTriangleIcon, role: "status" },
21
- "permission-denied": { busy: false, icon: ShieldXIcon, role: "alert" },
22
- queued: { busy: false, icon: ClockIcon, role: "status" },
23
- retryable: { busy: false, icon: RefreshCwIcon, role: "status" },
24
- streaming: { busy: true, icon: LoaderCircleIcon, role: "status" },
25
- };
26
- /**
27
- * statePresentation is the single source of truth for a presentable
28
- * `AgentWorkState`'s icon, ARIA `role`, and busy/motion signal. Icon values
29
- * reproduce `agent-message.tsx`'s `stateMeta` and `agent-thread.tsx`'s
30
- * `threadStateDefaults` (confirmed byte-identical icon-for-icon); `role`
31
- * and `busy` reproduce `state-notice.tsx`'s inline rules verbatim.
32
- */
33
- function statePresentation(state) {
34
- return presentationByState[state];
35
- }
36
- export { statePresentation };
@@ -1,17 +0,0 @@
1
- import * as React from "react";
2
- import type { MessageScrollerButtonProps, MessageScrollerContentProps, MessageScrollerItemProps, MessageScrollerProps, MessageScrollerProviderProps, MessageScrollerViewportProps } from "./types";
3
- declare function useMessageScroller(): {
4
- scrollToEnd: (options?: import("./types").MessageScrollerScrollOptions) => boolean;
5
- scrollToMessage: (messageId: string, options?: import("./types").MessageScrollerScrollOptions) => boolean;
6
- scrollToStart: (options?: import("./types").MessageScrollerScrollOptions) => boolean;
7
- };
8
- declare function useMessageScrollerScrollable(): import("./types").MessageScrollerScrollable;
9
- declare function useMessageScrollerVisibility(): import("./types").MessageScrollerVisibilityState;
10
- declare function MessageScrollerProvider({ autoScroll, children, defaultScrollPosition, scrollEdgeThreshold, scrollPreviousItemPeek, scrollMargin, }: MessageScrollerProviderProps): React.JSX.Element;
11
- declare function MessageScroller({ children, ...props }: MessageScrollerProps): React.JSX.Element;
12
- declare function MessageScrollerViewport({ "aria-label": ariaLabel, children, onKeyDown, onScroll, onTouchMove, onWheel, preserveScrollOnPrepend, ref, role, tabIndex, ...props }: MessageScrollerViewportProps): React.JSX.Element;
13
- declare function MessageScrollerContent({ "aria-relevant": ariaRelevant, children, ref, role, spacerClassName, ...props }: MessageScrollerContentProps): React.JSX.Element;
14
- declare function MessageScrollerItem({ messageId, ref, scrollAnchor, ...props }: MessageScrollerItemProps): React.JSX.Element;
15
- declare function MessageScrollerButton({ behavior, children, direction, onClick, render, tabIndex, type, ...props }: MessageScrollerButtonProps): React.ReactElement<any, string | React.JSXElementConstructor<any>> | null;
16
- export { MessageScroller, MessageScrollerButton, MessageScrollerContent, MessageScrollerItem, MessageScrollerProvider, MessageScrollerViewport, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, };
17
- //# sourceMappingURL=components.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/lib/message-scroller-primitive/components.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAE3B,wBAAwB,EACxB,oBAAoB,EACpB,4BAA4B,EAE5B,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AA2BjB,iBAAS,kBAAkB;;;;EAW1B;AAED,iBAAS,4BAA4B,gDAQpC;AAED,iBAAS,4BAA4B,qDAapC;AAED,iBAAS,uBAAuB,CAAC,EAC/B,UAAkB,EAClB,QAAQ,EACR,qBAA6B,EAC7B,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,GACb,EAAE,4BAA4B,qBAgB9B;AAED,iBAAS,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,qBAQpE;AAED,iBAAS,uBAAuB,CAAC,EAC/B,YAAY,EAAE,SAAS,EACvB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,WAAW,EACX,OAAO,EACP,uBAA8B,EAC9B,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,4BAA4B,qBAmF9B;AAED,iBAAS,sBAAsB,CAAC,EAC9B,eAAe,EAAE,YAAY,EAC7B,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,eAAe,EACf,GAAG,KAAK,EACT,EAAE,2BAA2B,qBA8E7B;AAED,iBAAS,mBAAmB,CAAC,EAC3B,SAAS,EACT,GAAG,EACH,YAAoB,EACpB,GAAG,KAAK,EACT,EAAE,wBAAwB,qBA2B1B;AAED,iBAAS,qBAAqB,CAAC,EAC7B,QAAmB,EACnB,QAAQ,EACR,SAAiB,EACjB,OAAO,EACP,MAAM,EACN,QAAQ,EACR,IAAe,EACf,GAAG,KAAK,EACT,EAAE,0BAA0B,6EA0D5B;AAED,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,GAC7B,CAAC"}
@@ -1,204 +0,0 @@
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, };
@@ -1,51 +0,0 @@
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 getFlexGap(element: HTMLElement | null): number;
50
- export { getContentBottom, getElementScrollTop, getElementTop, getElementViewportTop, getFirstVisibleMessageItem, getFlexGap, getLastScrollAnchor, getMaxScrollTop, getMessageScrollerItems, getMessageScrollerScrollable, getMessageScrollerVisibilityState, getNewScrollAnchor, getTailSpacerHeight, getUnanchoredScrollAnchor, hasMultipleNewScrollAnchors, };
51
- //# sourceMappingURL=geometry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../src/lib/message-scroller-primitive/geometry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,8BAA8B,EAC/B,MAAM,SAAS,CAAC;AAEjB,iBAAS,4BAA4B,CAAC,EACpC,OAAO,EACP,mBAAmB,EACnB,MAAM,EACN,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;CAC9B,GAAG,yBAAyB,CAW5B;AAED,iBAAS,iCAAiC,CAAC,EACzC,OAAO,EACP,YAAY,EACZ,sBAAsB,EACtB,MAAM,EACN,QAAQ,EACR,iBAAiB,GAClB,EAAE;IACD,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAChC,GAAG,8BAA8B,CAuDjC;AAED,iBAAS,uBAAuB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,iBAIhF;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,iBAAiB,EAAE,MAAM,sBAU1E;AAED,iBAAS,yBAAyB,CAChC,KAAK,EAAE,WAAW,EAAE,EACpB,cAAc,EAAE;IAAE,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAA;CAAE,sBASvD;AAED,iBAAS,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,iBAAiB,EAAE,MAAM,WAkBnF;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,sBAUhD;AAED,iBAAS,0BAA0B,CAAC,EAClC,OAAO,EACP,MAAM,EACN,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;CACvB,sBAgBA;AAED,iBAAS,mBAAmB,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,YAAY,EACZ,MAAM,EACN,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,0BAA0B,CAAC;IAClC,OAAO,EAAE,WAAW,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;CACvB,UAmCA;AAED,iBAAS,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,UAKjE;AAED,iBAAS,qBAAqB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,UAEzE;AAED,iBAAS,mBAAmB,CAAC,EAC3B,OAAO,EACP,SAAS,EACT,MAAM,EACN,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;CACvB,UAIA;AAED,iBAAS,gBAAgB,CAAC,EACxB,OAAO,EACP,MAAM,EACN,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;CACvB,UAiBA;AAED,iBAAS,eAAe,CAAC,QAAQ,EAAE,WAAW,UAE7C;AAwBD,iBAAS,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,UAS9C;AAYD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,4BAA4B,EAC5B,iCAAiC,EACjC,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,GAC5B,CAAC"}
@@ -1,199 +0,0 @@
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 { getContentBottom, getElementScrollTop, getElementTop, getElementViewportTop, getFirstVisibleMessageItem, getFlexGap, getLastScrollAnchor, getMaxScrollTop, getMessageScrollerItems, getMessageScrollerScrollable, getMessageScrollerVisibilityState, getNewScrollAnchor, getTailSpacerHeight, getUnanchoredScrollAnchor, hasMultipleNewScrollAnchors, };