@exegia/corpora-ui 2.0.0 → 3.1.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 (588) hide show
  1. package/README.md +20 -0
  2. package/dist-lib/EVILCHARTS-LICENSE.txt +21 -0
  3. package/dist-lib/button-CIRkQXA6.js +152 -0
  4. package/dist-lib/button.js +3 -0
  5. package/dist-lib/card.js +150 -0
  6. package/dist-lib/components/atoms/text/default.d.ts +2 -1143
  7. package/dist-lib/components/blocks/shell/index.d.ts +1 -0
  8. package/dist-lib/components/composed/chat/chart/chart-atom.d.ts +30 -0
  9. package/dist-lib/components/composed/chat/chart/chart-context.d.ts +2 -0
  10. package/dist-lib/components/composed/chat/chart/chart-legend.d.ts +4 -0
  11. package/dist-lib/components/composed/chat/chart/chart-plot.d.ts +3 -0
  12. package/dist-lib/components/composed/chat/chart/chart-root.d.ts +3 -0
  13. package/dist-lib/components/composed/chat/chart/chart-tooltip.d.ts +4 -0
  14. package/dist-lib/components/composed/chat/chart/constants.d.ts +3 -0
  15. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-area-chart.d.ts +93 -0
  16. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-bar-chart.d.ts +86 -0
  17. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-brush.d.ts +65 -0
  18. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-chart.d.ts +44 -0
  19. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-dot.d.ts +16 -0
  20. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-legend.d.ts +24 -0
  21. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-line-chart.d.ts +90 -0
  22. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-pie-chart.d.ts +73 -0
  23. package/dist-lib/components/composed/chat/chart/evilcharts/echarts-tooltip.d.ts +29 -0
  24. package/dist-lib/components/composed/chat/chart/index.d.ts +6 -0
  25. package/dist-lib/components/composed/chat/chart/type.d.ts +80 -0
  26. package/dist-lib/components/composed/chat/chart/use-chart-state.d.ts +3 -0
  27. package/dist-lib/components/composed/chat/chart/use-chart.d.ts +6 -0
  28. package/dist-lib/components/composed/chat/chart/utils.d.ts +5 -0
  29. package/dist-lib/components/composed/chat/chart.d.ts +1 -44
  30. package/dist-lib/components/composed/chat/index.d.ts +1 -1
  31. package/dist-lib/components/ui/badge.d.ts +2 -2
  32. package/dist-lib/components/ui/button.d.ts +2 -2
  33. package/dist-lib/components/ui/glasscn/lazy-glass-surface.d.ts +6 -0
  34. package/dist-lib/components/ui/modal.d.ts +10 -0
  35. package/dist-lib/components/ui/overlays.d.ts +4 -0
  36. package/dist-lib/components/ui/select.d.ts +1 -1
  37. package/dist-lib/components/ui/toast.d.ts +2 -0
  38. package/dist-lib/ease-C9At8rnB.js +120 -0
  39. package/dist-lib/exegia-provider-DNTuLljX.js +124 -0
  40. package/dist-lib/index.css +3 -0
  41. package/dist-lib/index.d.ts +3 -0
  42. package/dist-lib/index.js +10283 -8224
  43. package/dist-lib/input.js +28 -0
  44. package/dist-lib/label.js +19 -0
  45. package/dist-lib/lib/segmented-control.d.ts +1 -1
  46. package/dist-lib/lib/state/exegia-provider.d.ts +17 -8
  47. package/dist-lib/lib/state/index.d.ts +2 -0
  48. package/dist-lib/lib/state/portal-context.d.ts +5 -0
  49. package/dist-lib/lib/state/sound-loading.d.ts +4 -0
  50. package/dist-lib/liquid-glass-BihU6nMl.js +50 -0
  51. package/dist-lib/modal-DLaOK-s1.js +82 -0
  52. package/dist-lib/overlays.js +3 -0
  53. package/dist-lib/rolldown-runtime-Dy4uBu1J.js +11 -0
  54. package/dist-lib/scaffold-Qv4hs5Pf.js +925 -0
  55. package/dist-lib/scaffold.js +2 -0
  56. package/dist-lib/shell-BQ9cjIEu.js +722 -0
  57. package/dist-lib/shell.js +2 -0
  58. package/dist-lib/sound-knGH4lj-.js +19 -0
  59. package/dist-lib/state.js +2 -0
  60. package/dist-lib/toast-CataVXHN.js +193 -0
  61. package/dist-lib/utils-BO0qfoA6.js +61 -0
  62. package/package.json +65 -23
  63. package/dist-lib/components/atoms/_layout.d.ts +0 -4
  64. package/dist-lib/components/atoms/bubble/__tests__/bubble.test.d.ts +0 -1
  65. package/dist-lib/components/atoms/bubble/__tests__/reference.test.d.ts +0 -1
  66. package/dist-lib/components/atoms/text/__tests__/text.test.d.ts +0 -1
  67. package/dist-lib/components/atoms/text-selection/__tests__/click-popover.test.d.ts +0 -1
  68. package/dist-lib/components/atoms/text-selection/__tests__/text-selection.test.d.ts +0 -1
  69. package/dist-lib/components/blocks/auth/__tests__/auth-flow-block.test.d.ts +0 -1
  70. package/dist-lib/components/blocks/auth/__tests__/auth-state-atom.test.d.ts +0 -1
  71. package/dist-lib/components/blocks/auth/__tests__/linked-accounts-block.test.d.ts +0 -1
  72. package/dist-lib/components/blocks/auth/__tests__/onboarding-block.test.d.ts +0 -1
  73. package/dist-lib/components/blocks/auth/__tests__/passkey-manager-block.test.d.ts +0 -1
  74. package/dist-lib/components/blocks/auth/__tests__/passkey-sign-in-block.test.d.ts +0 -1
  75. package/dist-lib/components/blocks/auth/__tests__/signup-block.test.d.ts +0 -1
  76. package/dist-lib/components/blocks/auth/__tests__/update-password-block.test.d.ts +0 -1
  77. package/dist-lib/components/blocks/chat/__tests__/ai-panel.test.d.ts +0 -1
  78. package/dist-lib/components/blocks/profile/__tests__/profile-card-block.test.d.ts +0 -1
  79. package/dist-lib/components/blocks/scaffold/__tests__/scaffold-atom.test.d.ts +0 -1
  80. package/dist-lib/components/blocks/scaffold/__tests__/scaffold.test.d.ts +0 -1
  81. package/dist-lib/components/blocks/shell/__tests__/shell-fit-atom.test.d.ts +0 -1
  82. package/dist-lib/components/blocks/shell/__tests__/shell-layout.test.d.ts +0 -1
  83. package/dist-lib/components/blocks/shell/__tests__/shell-metrics.test.d.ts +0 -1
  84. package/dist-lib/components/blocks/sidebar/__tests__/ai-sidebar-atom.test.d.ts +0 -1
  85. package/dist-lib/components/blocks/sidebar/__tests__/ai-sidebar.test.d.ts +0 -1
  86. package/dist-lib/components/blocks/sidebar/__tests__/use-ai-sidebar.test.d.ts +0 -1
  87. package/dist-lib/components/composed/__tests__/logo.test.d.ts +0 -1
  88. package/dist-lib/components/composed/action-bar/__tests__/action-bar.test.d.ts +0 -1
  89. package/dist-lib/components/composed/ai/__tests__/ai.test.d.ts +0 -1
  90. package/dist-lib/components/composed/chat/__tests__/attachment.test.d.ts +0 -1
  91. package/dist-lib/components/composed/chat/__tests__/beautiful-ui.test.d.ts +0 -1
  92. package/dist-lib/components/composed/chat/__tests__/chart.test.d.ts +0 -1
  93. package/dist-lib/components/composed/chat/__tests__/code-block.test.d.ts +0 -1
  94. package/dist-lib/components/composed/chat/__tests__/composer-attachments.test.d.ts +0 -1
  95. package/dist-lib/components/composed/chat/__tests__/composer.test.d.ts +0 -1
  96. package/dist-lib/components/composed/chat/__tests__/flowchart.test.d.ts +0 -1
  97. package/dist-lib/components/composed/chat/__tests__/glass-material.test.d.ts +0 -1
  98. package/dist-lib/components/composed/chat/__tests__/markdown.test.d.ts +0 -1
  99. package/dist-lib/components/composed/chat/__tests__/menu-command.test.d.ts +0 -1
  100. package/dist-lib/components/composed/chat/__tests__/recommendation.test.d.ts +0 -1
  101. package/dist-lib/components/composed/tree/__tests__/tree-atom.test.d.ts +0 -1
  102. package/dist-lib/components/composed/tree/__tests__/tree.test.d.ts +0 -1
  103. package/dist-lib/components/composed/tree/__tests__/use-tree.test.d.ts +0 -1
  104. package/dist-lib/components/composed/user/__tests__/message.test.d.ts +0 -1
  105. package/dist-lib/components/composed/verse/__tests__/verse.test.d.ts +0 -1
  106. package/dist-lib/components/docs/atoms-gallery.d.ts +0 -12
  107. package/dist-lib/components/docs/block-demo-stage.d.ts +0 -7
  108. package/dist-lib/components/docs/blocks-gallery.d.ts +0 -2
  109. package/dist-lib/components/docs/browser.d.ts +0 -10
  110. package/dist-lib/components/docs/code-block.d.ts +0 -4
  111. package/dist-lib/components/docs/components-gallery.d.ts +0 -2
  112. package/dist-lib/components/docs/demo-controls.d.ts +0 -21
  113. package/dist-lib/components/docs/hero.d.ts +0 -5
  114. package/dist-lib/components/docs/mermaid.d.ts +0 -3
  115. package/dist-lib/components/icons/__tests__/icons.test.d.ts +0 -1
  116. package/dist-lib/components/stories/attachment.story.d.ts +0 -11
  117. package/dist-lib/components/stories/auth-flow-block.story.d.ts +0 -2
  118. package/dist-lib/components/stories/avatar.story.d.ts +0 -6
  119. package/dist-lib/components/stories/base.story.d.ts +0 -6
  120. package/dist-lib/components/stories/bubble.story.d.ts +0 -6
  121. package/dist-lib/components/stories/button.story.d.ts +0 -9
  122. package/dist-lib/components/stories/card.story.d.ts +0 -8
  123. package/dist-lib/components/stories/chart.story.d.ts +0 -34
  124. package/dist-lib/components/stories/checkbox.story.d.ts +0 -6
  125. package/dist-lib/components/stories/code-auth-block.story.d.ts +0 -2
  126. package/dist-lib/components/stories/code-block.story.d.ts +0 -12
  127. package/dist-lib/components/stories/composed-password-input.story.d.ts +0 -6
  128. package/dist-lib/components/stories/context-cards.story.d.ts +0 -3
  129. package/dist-lib/components/stories/emoji-action-bar.story.d.ts +0 -3
  130. package/dist-lib/components/stories/field.story.d.ts +0 -6
  131. package/dist-lib/components/stories/file-icons.story.d.ts +0 -5
  132. package/dist-lib/components/stories/filter-table.story.d.ts +0 -21
  133. package/dist-lib/components/stories/flowchart.story.d.ts +0 -3
  134. package/dist-lib/components/stories/forgot-password-block.story.d.ts +0 -2
  135. package/dist-lib/components/stories/frame.story.d.ts +0 -8
  136. package/dist-lib/components/stories/index.d.ts +0 -54
  137. package/dist-lib/components/stories/input-group.story.d.ts +0 -6
  138. package/dist-lib/components/stories/input.story.d.ts +0 -8
  139. package/dist-lib/components/stories/insight-cards.story.d.ts +0 -45
  140. package/dist-lib/components/stories/label.story.d.ts +0 -8
  141. package/dist-lib/components/stories/linked-accounts-block.story.d.ts +0 -2
  142. package/dist-lib/components/stories/login-block.story.d.ts +0 -2
  143. package/dist-lib/components/stories/logo.story.d.ts +0 -3
  144. package/dist-lib/components/stories/markdown.story.d.ts +0 -7
  145. package/dist-lib/components/stories/menu-command.story.d.ts +0 -13
  146. package/dist-lib/components/stories/onboarding-block.story.d.ts +0 -2
  147. package/dist-lib/components/stories/otp-field.story.d.ts +0 -8
  148. package/dist-lib/components/stories/passkey-manager-block.story.d.ts +0 -2
  149. package/dist-lib/components/stories/passkey-sign-in-block.story.d.ts +0 -2
  150. package/dist-lib/components/stories/password-input.story.d.ts +0 -9
  151. package/dist-lib/components/stories/profile-card-block.story.d.ts +0 -6
  152. package/dist-lib/components/stories/recommendation-card.story.d.ts +0 -3
  153. package/dist-lib/components/stories/records-table.story.d.ts +0 -23
  154. package/dist-lib/components/stories/reference.story.d.ts +0 -9
  155. package/dist-lib/components/stories/research-answer.story.d.ts +0 -10
  156. package/dist-lib/components/stories/scaffold-root.story.d.ts +0 -6
  157. package/dist-lib/components/stories/separator.story.d.ts +0 -6
  158. package/dist-lib/components/stories/shell-layout.story.d.ts +0 -2
  159. package/dist-lib/components/stories/signup-block.story.d.ts +0 -2
  160. package/dist-lib/components/stories/social-providers.story.d.ts +0 -3
  161. package/dist-lib/components/stories/streaming-text.story.d.ts +0 -3
  162. package/dist-lib/components/stories/text.story.d.ts +0 -8
  163. package/dist-lib/components/stories/textarea.story.d.ts +0 -6
  164. package/dist-lib/components/stories/tree.story.d.ts +0 -4
  165. package/dist-lib/components/stories/update-password-block.story.d.ts +0 -2
  166. package/dist-lib/components/stories/user.story.d.ts +0 -8
  167. package/dist-lib/components/stories/verse.story.d.ts +0 -6
  168. package/dist-lib/components/ui/chat/__tests__/segmented-toggle.test.d.ts +0 -1
  169. package/dist-lib/index.js.map +0 -1
  170. package/dist-lib/lib/state/__tests__/sound.test.d.ts +0 -1
  171. package/dist-lib/lib/utils.test.d.ts +0 -1
  172. package/src/assets/css/base.css +0 -62
  173. package/src/assets/css/chat.css +0 -229
  174. package/src/assets/css/shadows.css +0 -157
  175. package/src/assets/css/theme.css +0 -321
  176. package/src/components/AGENTS.md +0 -0
  177. package/src/components/atoms/_layout.tsx +0 -9
  178. package/src/components/atoms/avatar/base.tsx +0 -70
  179. package/src/components/atoms/avatar/index.ts +0 -10
  180. package/src/components/atoms/avatar/types.ts +0 -24
  181. package/src/components/atoms/avatar/utils.ts +0 -54
  182. package/src/components/atoms/avatar/verified.tsx +0 -16
  183. package/src/components/atoms/background/index.ts +0 -8
  184. package/src/components/atoms/background/texture.tsx +0 -29
  185. package/src/components/atoms/background/type.ts +0 -10
  186. package/src/components/atoms/background/utils.ts +0 -13
  187. package/src/components/atoms/bubble/__tests__/bubble.test.tsx +0 -193
  188. package/src/components/atoms/bubble/__tests__/reference.test.tsx +0 -25
  189. package/src/components/atoms/bubble/actions.tsx +0 -28
  190. package/src/components/atoms/bubble/context.ts +0 -11
  191. package/src/components/atoms/bubble/default.tsx +0 -46
  192. package/src/components/atoms/bubble/header.tsx +0 -36
  193. package/src/components/atoms/bubble/index.ts +0 -37
  194. package/src/components/atoms/bubble/message.tsx +0 -32
  195. package/src/components/atoms/bubble/reactions.tsx +0 -191
  196. package/src/components/atoms/bubble/types.ts +0 -82
  197. package/src/components/atoms/bubble/utils.ts +0 -46
  198. package/src/components/atoms/chip.tsx +0 -61
  199. package/src/components/atoms/field.tsx +0 -43
  200. package/src/components/atoms/index.ts +0 -26
  201. package/src/components/atoms/loader.tsx +0 -33
  202. package/src/components/atoms/reference.tsx +0 -41
  203. package/src/components/atoms/text/__tests__/text.test.tsx +0 -47
  204. package/src/components/atoms/text/default.tsx +0 -59
  205. package/src/components/atoms/text/heading.tsx +0 -58
  206. package/src/components/atoms/text/index.ts +0 -28
  207. package/src/components/atoms/text/label.tsx +0 -16
  208. package/src/components/atoms/text/paragraph.tsx +0 -55
  209. package/src/components/atoms/text/span.tsx +0 -14
  210. package/src/components/atoms/text/types.ts +0 -41
  211. package/src/components/atoms/text/utils.ts +0 -16
  212. package/src/components/atoms/text-selection/__tests__/click-popover.test.tsx +0 -61
  213. package/src/components/atoms/text-selection/__tests__/text-selection.test.tsx +0 -90
  214. package/src/components/atoms/text-selection/click-popover.tsx +0 -62
  215. package/src/components/atoms/text-selection/index.ts +0 -30
  216. package/src/components/atoms/text-selection/popover.tsx +0 -103
  217. package/src/components/atoms/text-selection/selection-atom.ts +0 -51
  218. package/src/components/atoms/text-selection/selection.tsx +0 -56
  219. package/src/components/atoms/text-selection/types.ts +0 -125
  220. package/src/components/atoms/text-selection/use-selection.ts +0 -84
  221. package/src/components/atoms/types.ts +0 -46
  222. package/src/components/blocks/.gitkeep +0 -0
  223. package/src/components/blocks/auth/__tests__/auth-flow-block.test.tsx +0 -183
  224. package/src/components/blocks/auth/__tests__/auth-state-atom.test.tsx +0 -247
  225. package/src/components/blocks/auth/__tests__/linked-accounts-block.test.tsx +0 -128
  226. package/src/components/blocks/auth/__tests__/onboarding-block.test.tsx +0 -183
  227. package/src/components/blocks/auth/__tests__/passkey-manager-block.test.tsx +0 -131
  228. package/src/components/blocks/auth/__tests__/passkey-sign-in-block.test.tsx +0 -59
  229. package/src/components/blocks/auth/__tests__/signup-block.test.tsx +0 -176
  230. package/src/components/blocks/auth/__tests__/update-password-block.test.tsx +0 -95
  231. package/src/components/blocks/auth/auth-flow-atom.ts +0 -238
  232. package/src/components/blocks/auth/auth-flow-block.tsx +0 -211
  233. package/src/components/blocks/auth/auth-session-atom.ts +0 -82
  234. package/src/components/blocks/auth/auth-shell.tsx +0 -265
  235. package/src/components/blocks/auth/auth-state.ts +0 -40
  236. package/src/components/blocks/auth/code-auth-block.tsx +0 -176
  237. package/src/components/blocks/auth/forgot-password-block.tsx +0 -112
  238. package/src/components/blocks/auth/linked-accounts-block.tsx +0 -203
  239. package/src/components/blocks/auth/login-block.tsx +0 -217
  240. package/src/components/blocks/auth/onboarding/profile-step.tsx +0 -216
  241. package/src/components/blocks/auth/onboarding-block.tsx +0 -183
  242. package/src/components/blocks/auth/passkey-manager-block.tsx +0 -316
  243. package/src/components/blocks/auth/passkey-sign-in-block.tsx +0 -67
  244. package/src/components/blocks/auth/signup-block.tsx +0 -256
  245. package/src/components/blocks/auth/type.ts +0 -436
  246. package/src/components/blocks/auth/update-password-block.tsx +0 -139
  247. package/src/components/blocks/auth/use-auth-state.ts +0 -127
  248. package/src/components/blocks/chat/__tests__/ai-panel.test.tsx +0 -65
  249. package/src/components/blocks/chat/banners.tsx +0 -61
  250. package/src/components/blocks/chat/base.tsx +0 -84
  251. package/src/components/blocks/chat/header.tsx +0 -60
  252. package/src/components/blocks/chat/index.ts +0 -37
  253. package/src/components/blocks/chat/recommendation-stack.tsx +0 -41
  254. package/src/components/blocks/chat/shared.tsx +0 -27
  255. package/src/components/blocks/chat/suggested-prompts.tsx +0 -45
  256. package/src/components/blocks/chat/type.ts +0 -96
  257. package/src/components/blocks/chat/version-history-record.tsx +0 -37
  258. package/src/components/blocks/layout.ts +0 -35
  259. package/src/components/blocks/profile/__tests__/profile-card-block.test.tsx +0 -362
  260. package/src/components/blocks/profile/index.ts +0 -28
  261. package/src/components/blocks/profile/profile-card-atom.ts +0 -247
  262. package/src/components/blocks/profile/profile-card-block.tsx +0 -369
  263. package/src/components/blocks/profile/type.ts +0 -93
  264. package/src/components/blocks/profile/use-profile-card-state.ts +0 -67
  265. package/src/components/blocks/profile/use-profile-card.ts +0 -132
  266. package/src/components/blocks/scaffold/__tests__/scaffold-atom.test.tsx +0 -236
  267. package/src/components/blocks/scaffold/__tests__/scaffold.test.tsx +0 -524
  268. package/src/components/blocks/scaffold/constants.ts +0 -39
  269. package/src/components/blocks/scaffold/index.ts +0 -60
  270. package/src/components/blocks/scaffold/panel-close-button.tsx +0 -36
  271. package/src/components/blocks/scaffold/panel-menu-button.tsx +0 -221
  272. package/src/components/blocks/scaffold/scaffold-actions.tsx +0 -92
  273. package/src/components/blocks/scaffold/scaffold-atom.ts +0 -427
  274. package/src/components/blocks/scaffold/scaffold-canvas.tsx +0 -162
  275. package/src/components/blocks/scaffold/scaffold-context.ts +0 -20
  276. package/src/components/blocks/scaffold/scaffold-inspector.tsx +0 -137
  277. package/src/components/blocks/scaffold/scaffold-main.tsx +0 -28
  278. package/src/components/blocks/scaffold/scaffold-panel.tsx +0 -186
  279. package/src/components/blocks/scaffold/scaffold-root.tsx +0 -120
  280. package/src/components/blocks/scaffold/scaffold-sidebar.tsx +0 -31
  281. package/src/components/blocks/scaffold/scaffold-sub-panel.tsx +0 -122
  282. package/src/components/blocks/scaffold/scaffold-tab.tsx +0 -108
  283. package/src/components/blocks/scaffold/type.ts +0 -264
  284. package/src/components/blocks/scaffold/use-scaffold-state.ts +0 -85
  285. package/src/components/blocks/scaffold/use-scaffold.ts +0 -59
  286. package/src/components/blocks/scaffold/utils.ts +0 -112
  287. package/src/components/blocks/shell/__tests__/shell-fit-atom.test.tsx +0 -362
  288. package/src/components/blocks/shell/__tests__/shell-layout.test.tsx +0 -596
  289. package/src/components/blocks/shell/__tests__/shell-metrics.test.ts +0 -154
  290. package/src/components/blocks/shell/animated-panel-inset.tsx +0 -27
  291. package/src/components/blocks/shell/animated-panel-provider.tsx +0 -269
  292. package/src/components/blocks/shell/animated-panel-trigger.tsx +0 -51
  293. package/src/components/blocks/shell/animated-panel.tsx +0 -180
  294. package/src/components/blocks/shell/index.ts +0 -30
  295. package/src/components/blocks/shell/shell-fit-atom.ts +0 -246
  296. package/src/components/blocks/shell/shell-layout.tsx +0 -139
  297. package/src/components/blocks/shell/shell-metrics.ts +0 -133
  298. package/src/components/blocks/shell/shell-panel-atom.ts +0 -74
  299. package/src/components/blocks/shell/type.ts +0 -361
  300. package/src/components/blocks/shell/use-shell-fit-state.ts +0 -49
  301. package/src/components/blocks/shell/use-shell-fit.ts +0 -153
  302. package/src/components/blocks/shell/use-shell-panels.ts +0 -126
  303. package/src/components/blocks/shell/utils.ts +0 -187
  304. package/src/components/blocks/sidebar/__tests__/ai-sidebar-atom.test.tsx +0 -325
  305. package/src/components/blocks/sidebar/__tests__/ai-sidebar.test.tsx +0 -93
  306. package/src/components/blocks/sidebar/__tests__/use-ai-sidebar.test.tsx +0 -310
  307. package/src/components/blocks/sidebar/ai-sidebar-atom.ts +0 -698
  308. package/src/components/blocks/sidebar/ai-sidebar.tsx +0 -150
  309. package/src/components/blocks/sidebar/index.ts +0 -67
  310. package/src/components/blocks/sidebar/marquee-label.tsx +0 -59
  311. package/src/components/blocks/sidebar/sidebar-context.ts +0 -15
  312. package/src/components/blocks/sidebar/sidebar-icon.tsx +0 -14
  313. package/src/components/blocks/sidebar/sidebar-row.tsx +0 -378
  314. package/src/components/blocks/sidebar/type.ts +0 -294
  315. package/src/components/blocks/sidebar/use-ai-sidebar-state.ts +0 -123
  316. package/src/components/blocks/sidebar/use-ai-sidebar.ts +0 -619
  317. package/src/components/blocks/sidebar/utils.ts +0 -170
  318. package/src/components/blocks/types.ts +0 -6
  319. package/src/components/composed/.gitkeep +0 -0
  320. package/src/components/composed/__tests__/logo.test.tsx +0 -60
  321. package/src/components/composed/action-bar/__tests__/action-bar.test.tsx +0 -125
  322. package/src/components/composed/action-bar/action.tsx +0 -77
  323. package/src/components/composed/action-bar/emojis.tsx +0 -97
  324. package/src/components/composed/action-bar/index.ts +0 -24
  325. package/src/components/composed/action-bar/toolbar.tsx +0 -66
  326. package/src/components/composed/action-bar/types.ts +0 -58
  327. package/src/components/composed/action-bar/utils.ts +0 -140
  328. package/src/components/composed/ai/__tests__/ai.test.tsx +0 -66
  329. package/src/components/composed/ai/avatar.tsx +0 -19
  330. package/src/components/composed/ai/index.ts +0 -36
  331. package/src/components/composed/ai/message.tsx +0 -49
  332. package/src/components/composed/ai/research-answer.tsx +0 -157
  333. package/src/components/composed/ai/shared.tsx +0 -94
  334. package/src/components/composed/ai/streaming-text.tsx +0 -94
  335. package/src/components/composed/ai/suggested-prompt.tsx +0 -183
  336. package/src/components/composed/ai/types.ts +0 -81
  337. package/src/components/composed/chat/__tests__/attachment.test.tsx +0 -218
  338. package/src/components/composed/chat/__tests__/beautiful-ui.test.tsx +0 -57
  339. package/src/components/composed/chat/__tests__/chart.test.tsx +0 -62
  340. package/src/components/composed/chat/__tests__/code-block.test.tsx +0 -12
  341. package/src/components/composed/chat/__tests__/composer-attachments.test.tsx +0 -101
  342. package/src/components/composed/chat/__tests__/composer.test.tsx +0 -248
  343. package/src/components/composed/chat/__tests__/flowchart.test.tsx +0 -145
  344. package/src/components/composed/chat/__tests__/glass-material.test.tsx +0 -54
  345. package/src/components/composed/chat/__tests__/markdown.test.tsx +0 -25
  346. package/src/components/composed/chat/__tests__/menu-command.test.tsx +0 -35
  347. package/src/components/composed/chat/__tests__/recommendation.test.tsx +0 -43
  348. package/src/components/composed/chat/actions.tsx +0 -81
  349. package/src/components/composed/chat/attachment-file.ts +0 -82
  350. package/src/components/composed/chat/attachment.tsx +0 -498
  351. package/src/components/composed/chat/chart.tsx +0 -401
  352. package/src/components/composed/chat/code-block.tsx +0 -123
  353. package/src/components/composed/chat/composer/add-button.tsx +0 -29
  354. package/src/components/composed/chat/composer/base.tsx +0 -573
  355. package/src/components/composed/chat/composer/command-menu.tsx +0 -47
  356. package/src/components/composed/chat/composer/hooks.ts +0 -29
  357. package/src/components/composed/chat/composer/index.ts +0 -19
  358. package/src/components/composed/chat/composer/send-button.tsx +0 -36
  359. package/src/components/composed/chat/composer/suggestions.tsx +0 -115
  360. package/src/components/composed/chat/composer/use-dictation.ts +0 -123
  361. package/src/components/composed/chat/composer/utils.ts +0 -74
  362. package/src/components/composed/chat/context-cards.tsx +0 -63
  363. package/src/components/composed/chat/filter-table.tsx +0 -119
  364. package/src/components/composed/chat/flowchart/chart-node.tsx +0 -162
  365. package/src/components/composed/chat/flowchart/connector.tsx +0 -32
  366. package/src/components/composed/chat/flowchart/constant.ts +0 -26
  367. package/src/components/composed/chat/flowchart/default.tsx +0 -230
  368. package/src/components/composed/chat/flowchart/edge-toolbar.tsx +0 -73
  369. package/src/components/composed/chat/flowchart/hooks.tsx +0 -347
  370. package/src/components/composed/chat/flowchart/index.ts +0 -14
  371. package/src/components/composed/chat/flowchart/step-body.tsx +0 -82
  372. package/src/components/composed/chat/flowchart/types.ts +0 -89
  373. package/src/components/composed/chat/flowchart/utils.ts +0 -78
  374. package/src/components/composed/chat/hint.tsx +0 -59
  375. package/src/components/composed/chat/index.ts +0 -98
  376. package/src/components/composed/chat/insight-cards.tsx +0 -199
  377. package/src/components/composed/chat/markdown-atom.ts +0 -15
  378. package/src/components/composed/chat/markdown.tsx +0 -213
  379. package/src/components/composed/chat/recommendation/checkbox.tsx +0 -122
  380. package/src/components/composed/chat/recommendation/constant.ts +0 -54
  381. package/src/components/composed/chat/recommendation/default.tsx +0 -25
  382. package/src/components/composed/chat/recommendation/group.tsx +0 -36
  383. package/src/components/composed/chat/recommendation/index.ts +0 -17
  384. package/src/components/composed/chat/recommendation/item.tsx +0 -215
  385. package/src/components/composed/chat/recommendation/types.ts +0 -76
  386. package/src/components/composed/chat/records-table.tsx +0 -130
  387. package/src/components/composed/chat/type.ts +0 -157
  388. package/src/components/composed/logo.tsx +0 -171
  389. package/src/components/composed/password-input.tsx +0 -179
  390. package/src/components/composed/reader/applied-mark.tsx +0 -32
  391. package/src/components/composed/reader/apply-toast.tsx +0 -49
  392. package/src/components/composed/reader/index.ts +0 -10
  393. package/src/components/composed/reader/selection-highlight.tsx +0 -26
  394. package/src/components/composed/reader/selection-popover.tsx +0 -149
  395. package/src/components/composed/reader/type.ts +0 -48
  396. package/src/components/composed/social-providers.tsx +0 -154
  397. package/src/components/composed/tree/CLAUDE.md +0 -145
  398. package/src/components/composed/tree/__tests__/tree-atom.test.tsx +0 -217
  399. package/src/components/composed/tree/__tests__/tree.test.tsx +0 -522
  400. package/src/components/composed/tree/__tests__/use-tree.test.tsx +0 -333
  401. package/src/components/composed/tree/constants.ts +0 -55
  402. package/src/components/composed/tree/index.ts +0 -51
  403. package/src/components/composed/tree/tree-atom.ts +0 -590
  404. package/src/components/composed/tree/tree-context.ts +0 -13
  405. package/src/components/composed/tree/tree-node.tsx +0 -496
  406. package/src/components/composed/tree/tree.tsx +0 -233
  407. package/src/components/composed/tree/type.ts +0 -322
  408. package/src/components/composed/tree/use-tree-dnd.ts +0 -179
  409. package/src/components/composed/tree/use-tree-state.ts +0 -105
  410. package/src/components/composed/tree/use-tree.ts +0 -311
  411. package/src/components/composed/tree/utils.ts +0 -172
  412. package/src/components/composed/types.ts +0 -9
  413. package/src/components/composed/user/__tests__/message.test.tsx +0 -79
  414. package/src/components/composed/user/index.ts +0 -14
  415. package/src/components/composed/user/info.tsx +0 -56
  416. package/src/components/composed/user/message.tsx +0 -36
  417. package/src/components/composed/user/pill.tsx +0 -20
  418. package/src/components/composed/user/types.ts +0 -47
  419. package/src/components/composed/user/utils.ts +0 -0
  420. package/src/components/composed/verse/__tests__/verse.test.tsx +0 -57
  421. package/src/components/composed/verse/index.ts +0 -2
  422. package/src/components/composed/verse/types.ts +0 -24
  423. package/src/components/composed/verse/verse.tsx +0 -100
  424. package/src/components/docs/atoms-gallery.tsx +0 -286
  425. package/src/components/docs/block-demo-stage.tsx +0 -38
  426. package/src/components/docs/blocks-gallery.tsx +0 -224
  427. package/src/components/docs/browser.tsx +0 -87
  428. package/src/components/docs/code-block.tsx +0 -10
  429. package/src/components/docs/components-gallery.tsx +0 -182
  430. package/src/components/docs/demo-controls.tsx +0 -142
  431. package/src/components/docs/hero.tsx +0 -197
  432. package/src/components/docs/mermaid.tsx +0 -55
  433. package/src/components/icons/README.md +0 -91
  434. package/src/components/icons/__tests__/icons.test.tsx +0 -58
  435. package/src/components/icons/file-badge-cfm.tsx +0 -615
  436. package/src/components/icons/file-badge-corpus.tsx +0 -604
  437. package/src/components/icons/file-badge-pdf.tsx +0 -570
  438. package/src/components/icons/file-badge-tei.tsx +0 -524
  439. package/src/components/icons/file-badge-tf.tsx +0 -620
  440. package/src/components/icons/file-badge-txt.tsx +0 -607
  441. package/src/components/icons/file-badge-xml.tsx +0 -576
  442. package/src/components/icons/file-wordmark-cfm.tsx +0 -424
  443. package/src/components/icons/file-wordmark-corpus.tsx +0 -454
  444. package/src/components/icons/file-wordmark-pdf.tsx +0 -470
  445. package/src/components/icons/file-wordmark-tei.tsx +0 -424
  446. package/src/components/icons/file-wordmark-tf.tsx +0 -406
  447. package/src/components/icons/file-wordmark-txt.tsx +0 -421
  448. package/src/components/icons/file-wordmark-xml.tsx +0 -424
  449. package/src/components/icons/index.ts +0 -16
  450. package/src/components/icons/types.ts +0 -8
  451. package/src/components/motion/index.ts +0 -0
  452. package/src/components/motion/overflow-actions.tsx +0 -376
  453. package/src/components/motion/popover-morph.tsx +0 -292
  454. package/src/components/motion/popover-position.ts +0 -86
  455. package/src/components/motion/shared-layout-bg.tsx +0 -151
  456. package/src/components/stories/attachment.story.tsx +0 -40
  457. package/src/components/stories/auth-flow-block.story.tsx +0 -17
  458. package/src/components/stories/avatar.story.tsx +0 -33
  459. package/src/components/stories/base.story.tsx +0 -70
  460. package/src/components/stories/bubble.story.tsx +0 -61
  461. package/src/components/stories/button.story.tsx +0 -32
  462. package/src/components/stories/card.story.tsx +0 -36
  463. package/src/components/stories/chart.story.tsx +0 -54
  464. package/src/components/stories/checkbox.story.tsx +0 -30
  465. package/src/components/stories/code-auth-block.story.tsx +0 -20
  466. package/src/components/stories/code-block.story.tsx +0 -35
  467. package/src/components/stories/composed-password-input.story.tsx +0 -41
  468. package/src/components/stories/context-cards.story.tsx +0 -30
  469. package/src/components/stories/emoji-action-bar.story.tsx +0 -20
  470. package/src/components/stories/field.story.tsx +0 -32
  471. package/src/components/stories/file-icons.story.tsx +0 -20
  472. package/src/components/stories/filter-table.story.tsx +0 -63
  473. package/src/components/stories/flowchart.story.tsx +0 -25
  474. package/src/components/stories/forgot-password-block.story.tsx +0 -14
  475. package/src/components/stories/frame.story.tsx +0 -32
  476. package/src/components/stories/index.ts +0 -57
  477. package/src/components/stories/input-group.story.tsx +0 -27
  478. package/src/components/stories/input.story.tsx +0 -42
  479. package/src/components/stories/insight-cards.story.tsx +0 -67
  480. package/src/components/stories/label.story.tsx +0 -32
  481. package/src/components/stories/linked-accounts-block.story.tsx +0 -23
  482. package/src/components/stories/login-block.story.tsx +0 -18
  483. package/src/components/stories/logo.story.tsx +0 -21
  484. package/src/components/stories/markdown.story.tsx +0 -31
  485. package/src/components/stories/menu-command.story.tsx +0 -43
  486. package/src/components/stories/onboarding-block.story.tsx +0 -14
  487. package/src/components/stories/otp-field.story.tsx +0 -35
  488. package/src/components/stories/passkey-manager-block.story.tsx +0 -18
  489. package/src/components/stories/passkey-sign-in-block.story.tsx +0 -15
  490. package/src/components/stories/password-input.story.tsx +0 -35
  491. package/src/components/stories/profile-card-block.story.tsx +0 -29
  492. package/src/components/stories/recommendation-card.story.tsx +0 -37
  493. package/src/components/stories/records-table.story.tsx +0 -52
  494. package/src/components/stories/reference.story.tsx +0 -33
  495. package/src/components/stories/research-answer.story.tsx +0 -32
  496. package/src/components/stories/scaffold-root.story.tsx +0 -47
  497. package/src/components/stories/separator.story.tsx +0 -37
  498. package/src/components/stories/shell-layout.story.tsx +0 -19
  499. package/src/components/stories/signup-block.story.tsx +0 -18
  500. package/src/components/stories/social-providers.story.tsx +0 -26
  501. package/src/components/stories/streaming-text.story.tsx +0 -25
  502. package/src/components/stories/text.story.tsx +0 -31
  503. package/src/components/stories/textarea.story.tsx +0 -34
  504. package/src/components/stories/tree.story.tsx +0 -31
  505. package/src/components/stories/update-password-block.story.tsx +0 -14
  506. package/src/components/stories/user.story.tsx +0 -32
  507. package/src/components/stories/verse.story.tsx +0 -42
  508. package/src/components/theme-provider.tsx +0 -230
  509. package/src/components/types.ts +0 -106
  510. package/src/components/ui/accordion.tsx +0 -68
  511. package/src/components/ui/alert-dialog.tsx +0 -167
  512. package/src/components/ui/alert.tsx +0 -84
  513. package/src/components/ui/autocomplete.tsx +0 -303
  514. package/src/components/ui/avatar.tsx +0 -109
  515. package/src/components/ui/badge.tsx +0 -101
  516. package/src/components/ui/button-group.tsx +0 -88
  517. package/src/components/ui/button.tsx +0 -192
  518. package/src/components/ui/card.tsx +0 -253
  519. package/src/components/ui/chat/__tests__/segmented-toggle.test.tsx +0 -27
  520. package/src/components/ui/chat/avatar-handle.tsx +0 -30
  521. package/src/components/ui/chat/badges.tsx +0 -85
  522. package/src/components/ui/chat/buttons.tsx +0 -94
  523. package/src/components/ui/chat/chips.tsx +0 -106
  524. package/src/components/ui/chat/dot.tsx +0 -81
  525. package/src/components/ui/chat/icon-button.tsx +0 -43
  526. package/src/components/ui/chat/icon-tile.tsx +0 -33
  527. package/src/components/ui/chat/index.ts +0 -12
  528. package/src/components/ui/chat/inline-source.tsx +0 -94
  529. package/src/components/ui/chat/segmented-toggle.tsx +0 -99
  530. package/src/components/ui/chat/tag.tsx +0 -61
  531. package/src/components/ui/chat/thumbnail.tsx +0 -31
  532. package/src/components/ui/chat/waveform.tsx +0 -30
  533. package/src/components/ui/checkbox.tsx +0 -83
  534. package/src/components/ui/collapsible.tsx +0 -42
  535. package/src/components/ui/command.tsx +0 -263
  536. package/src/components/ui/context-menu.tsx +0 -342
  537. package/src/components/ui/emoji-picker.tsx +0 -161
  538. package/src/components/ui/field.tsx +0 -89
  539. package/src/components/ui/frame.tsx +0 -87
  540. package/src/components/ui/glasscn/glass-button-group.tsx +0 -34
  541. package/src/components/ui/glasscn/glass-button.tsx +0 -25
  542. package/src/components/ui/glasscn/glass-container.tsx +0 -94
  543. package/src/components/ui/glasscn/glass-separator.tsx +0 -39
  544. package/src/components/ui/glasscn/liquid-glass.tsx +0 -59
  545. package/src/components/ui/group.tsx +0 -92
  546. package/src/components/ui/input-group.tsx +0 -105
  547. package/src/components/ui/input.tsx +0 -70
  548. package/src/components/ui/kbd.tsx +0 -32
  549. package/src/components/ui/label.tsx +0 -36
  550. package/src/components/ui/menu-command.tsx +0 -156
  551. package/src/components/ui/menu.tsx +0 -352
  552. package/src/components/ui/otp-field.tsx +0 -88
  553. package/src/components/ui/popover-glass.tsx +0 -158
  554. package/src/components/ui/popover.tsx +0 -120
  555. package/src/components/ui/preview-card.tsx +0 -61
  556. package/src/components/ui/scroll-area.tsx +0 -80
  557. package/src/components/ui/select.tsx +0 -257
  558. package/src/components/ui/separator.tsx +0 -23
  559. package/src/components/ui/sheet.tsx +0 -135
  560. package/src/components/ui/skeleton.tsx +0 -18
  561. package/src/components/ui/spinner.tsx +0 -17
  562. package/src/components/ui/switch.tsx +0 -30
  563. package/src/components/ui/tabs.tsx +0 -120
  564. package/src/components/ui/textarea.tsx +0 -58
  565. package/src/components/ui/toast.tsx +0 -325
  566. package/src/components/ui/toolbar.tsx +0 -92
  567. package/src/components/ui/tooltip.tsx +0 -67
  568. package/src/index.css +0 -10
  569. package/src/index.ts +0 -102
  570. package/src/lib/attachment-content.ts +0 -28
  571. package/src/lib/auth-accent.ts +0 -49
  572. package/src/lib/ease.ts +0 -90
  573. package/src/lib/glass-variants.ts +0 -22
  574. package/src/lib/hooks/use-hover-capable.ts +0 -23
  575. package/src/lib/hooks/use-mobile.ts +0 -21
  576. package/src/lib/keyed-atom.ts +0 -60
  577. package/src/lib/segmented-control.ts +0 -42
  578. package/src/lib/sound.ts +0 -39
  579. package/src/lib/specular.ts +0 -10
  580. package/src/lib/state/__tests__/sound.test.tsx +0 -53
  581. package/src/lib/state/exegia-provider.tsx +0 -83
  582. package/src/lib/state/index.ts +0 -4
  583. package/src/lib/state/store.ts +0 -19
  584. package/src/lib/use-motion-panel.ts +0 -78
  585. package/src/lib/utils.test.ts +0 -22
  586. package/src/lib/utils.ts +0 -100
  587. package/src/specular.js +0 -4
  588. /package/{src/components/composed/chat/composer → dist-lib}/BEAUTIFUL-UI-LICENSE.txt +0 -0
@@ -1,81 +0,0 @@
1
- import { Bubble } from "@/components/atoms"
2
- import { Button } from "@/components/ui/button"
3
- import {
4
- Tooltip,
5
- TooltipCreateHandle,
6
- TooltipPopup,
7
- TooltipProvider,
8
- TooltipTrigger,
9
- } from "@/components/ui/tooltip"
10
- import type {
11
- IBubbleActionsProps,
12
- TBubbleActionKey,
13
- TBubbleActionPayload,
14
- } from "./type"
15
- import { useCallback, useMemo, type ComponentType } from "react"
16
-
17
- const tooltipHandle = TooltipCreateHandle<ComponentType>()
18
-
19
- export function Actions<K extends TBubbleActionKey = TBubbleActionKey>({
20
- actions,
21
- size,
22
- onClick,
23
- }: IBubbleActionsProps<K>) {
24
- const handleClick = useCallback(
25
- (key: K, payload: TBubbleActionPayload) => {
26
- if (onClick) onClick(key, payload)
27
- },
28
- [onClick]
29
- )
30
-
31
- const renderActionButton = useCallback(
32
- (key?: K, action?: (typeof actions)[K]) => {
33
- if (!key || !action) return
34
- return (
35
- <Button
36
- aria-label={action?.tooltip}
37
- size={action?.size ?? size}
38
- variant="ghost"
39
- onClick={() => {
40
- const payload =
41
- (action?.onClick?.arguments[1] as TBubbleActionPayload) ??
42
- undefined
43
- handleClick(key, payload)
44
- }}
45
- />
46
- )
47
- },
48
- [handleClick, size]
49
- )
50
-
51
- const actionButtons = useMemo(() => {
52
- if (!actions || Object.values(actions).length === 0) return []
53
- return Object.entries<(typeof actions)[K]>(actions).map(([key, action]) => {
54
- if (!key || !action) return
55
- //return renderActionButton(key as K, action as typeof actions[K]);
56
- return { key: key, action }
57
- })
58
- }, [actions])
59
-
60
- return (
61
- <TooltipProvider>
62
- <Bubble.Actions>
63
- {actionButtons &&
64
- actionButtons.map((item, index) => (
65
- <TooltipTrigger
66
- key={index}
67
- render={renderActionButton(item?.key as K, item?.action)}
68
- >
69
- {item?.action.icon}
70
- </TooltipTrigger>
71
- ))}
72
- </Bubble.Actions>
73
-
74
- <Tooltip handle={tooltipHandle}>
75
- {({ payload: Payload }) => (
76
- <TooltipPopup>{Payload !== undefined && <Payload />}</TooltipPopup>
77
- )}
78
- </Tooltip>
79
- </TooltipProvider>
80
- )
81
- }
@@ -1,82 +0,0 @@
1
- "use client"
2
-
3
- import { useEffect, useState } from "react"
4
-
5
- const MIME_BY_EXTENSION: Record<string, string> = {
6
- jpg: "image/jpeg",
7
- jpeg: "image/jpeg",
8
- png: "image/png",
9
- gif: "image/gif",
10
- webp: "image/webp",
11
- avif: "image/avif",
12
- svg: "image/svg+xml",
13
- mp4: "video/mp4",
14
- webm: "video/webm",
15
- mov: "video/quicktime",
16
- mp3: "audio/mpeg",
17
- m4a: "audio/mp4",
18
- wav: "audio/wav",
19
- ogg: "audio/ogg",
20
- pdf: "application/pdf",
21
- txt: "text/plain",
22
- md: "text/markdown",
23
- csv: "text/csv",
24
- json: "application/json",
25
- xml: "text/xml",
26
- }
27
-
28
- export function attachmentMimeType(file: File): string {
29
- return file.type && file.type !== "application/octet-stream"
30
- ? file.type
31
- : (MIME_BY_EXTENSION[file.name.split(".").pop()?.toLowerCase() ?? ""] ??
32
- file.type)
33
- }
34
-
35
- export function attachmentFileKind(
36
- file: File
37
- ):
38
- { kind: "image" } | { kind: "media"; audio: boolean } | { kind: "document" } {
39
- const mime = attachmentMimeType(file)
40
- if (mime.startsWith("image/")) return { kind: "image" }
41
- if (mime.startsWith("video/") || mime.startsWith("audio/"))
42
- return { kind: "media", audio: mime.startsWith("audio/") }
43
- return { kind: "document" }
44
- }
45
-
46
- interface FilePreview {
47
- file: File
48
- url?: string
49
- text?: string
50
- }
51
-
52
- /** Each mounted attachment owns its URL, so clearing the tray cannot break a sent preview. */
53
- export function useAttachmentFile(file?: File) {
54
- const [preview, setPreview] = useState<FilePreview>()
55
- useEffect(() => {
56
- if (!file) return
57
- let active = true
58
- let url: string | undefined
59
- // Create browser resources after mounting; cancelled renders never allocate a URL.
60
- void Promise.resolve().then(async () => {
61
- if (!active) return
62
- try {
63
- const mime = attachmentMimeType(file)
64
- const blob =
65
- mime && file.type !== mime ? file.slice(0, file.size, mime) : file
66
- url = URL.createObjectURL(blob)
67
- const text =
68
- mime.startsWith("text/") || mime === "application/json"
69
- ? await file.slice(0, 8192).text()
70
- : undefined
71
- if (active) setPreview({ file, url, text })
72
- } catch {
73
- if (active) setPreview({ file, url })
74
- }
75
- })
76
- return () => {
77
- active = false
78
- if (url) URL.revokeObjectURL(url)
79
- }
80
- }, [file])
81
- return preview?.file === file ? preview : undefined
82
- }
@@ -1,498 +0,0 @@
1
- "use client"
2
-
3
- import {
4
- AtSign,
5
- BookOpen,
6
- Download,
7
- Film,
8
- FileText,
9
- Image as ImageIcon,
10
- Link as LinkIcon,
11
- Reply,
12
- TextQuote,
13
- } from "lucide-react"
14
- import { useState, type ReactElement, type ReactNode } from "react"
15
- import { cn } from "@/lib/utils"
16
- import { ATTACHMENT_CONTENT } from "@/lib/attachment-content"
17
- import { Button } from "@/components/ui/button"
18
- import {
19
- PreviewCard,
20
- PreviewCardPopup,
21
- PreviewCardTrigger,
22
- } from "@/components/ui/preview-card"
23
- import {
24
- AvatarHandle,
25
- DurationPill,
26
- Favicon,
27
- PlayButton,
28
- QuoteRail,
29
- RemoveButton,
30
- Waveform,
31
- } from "@/components/ui/chat"
32
- import {
33
- attachmentFileKind,
34
- attachmentMimeType,
35
- useAttachmentFile,
36
- } from "./attachment-file"
37
-
38
- export type TAttachmentKind =
39
- | "document"
40
- | "image"
41
- | "media"
42
- | "text-selection"
43
- | "chat-reply"
44
- | "username-handle"
45
- | "url-link"
46
- export type TAttachmentVariant = "default" | "preview"
47
-
48
- interface IAttachmentBase {
49
- id?: string
50
- className?: string
51
- style?: React.CSSProperties
52
- /** `default` is a compact chip with a hover preview; `preview` displays the content directly. */
53
- variant?: TAttachmentVariant
54
- title: ReactNode
55
- meta?: ReactNode
56
- onRemove?: () => void
57
- removable?: boolean
58
- /** A local file, retained through sending. Its type and preview are resolved automatically. */
59
- file?: File
60
- /** Content URL for an uploaded file, image, media or document. */
61
- src?: string
62
- /** A supplied thumbnail takes precedence over a generated image/video frame. */
63
- thumbnail?: string
64
- /** Custom rich hover content, for formats the browser cannot display itself. */
65
- preview?: ReactNode
66
- /** A document excerpt; text files generate one automatically (first 8 KB). */
67
- previewText?: string
68
- mimeType?: string
69
- }
70
-
71
- export type TAttachmentProps = IAttachmentBase &
72
- (
73
- | { kind: "document"; onAction?: () => void; actionIcon?: ReactNode }
74
- | { kind: "image"; alt?: string }
75
- | {
76
- kind: "media"
77
- poster?: string
78
- duration?: ReactNode
79
- audio?: boolean
80
- onPlay?: () => void
81
- waveform?: number[]
82
- }
83
- | { kind: "text-selection"; quote?: ReactNode }
84
- | {
85
- kind: "chat-reply"
86
- author?: ReactNode
87
- time?: ReactNode
88
- body?: ReactNode
89
- }
90
- | { kind: "username-handle"; initials?: string }
91
- | {
92
- kind: "url-link"
93
- domain?: ReactNode
94
- description?: ReactNode
95
- favicon?: string
96
- href?: string
97
- }
98
- )
99
-
100
- const KIND_ICON = {
101
- document: FileText,
102
- image: ImageIcon,
103
- media: Film,
104
- "text-selection": TextQuote,
105
- "chat-reply": Reply,
106
- "username-handle": AtSign,
107
- "url-link": LinkIcon,
108
- }
109
- const chipClasses =
110
- "flex min-h-[52px] w-60 max-w-full items-center gap-2.5 rounded-lg border border-border-default bg-surface-card py-1.5 pl-1.5 pr-2.5 text-left"
111
- const titleClasses =
112
- "truncate text-[13px] font-medium leading-[15px] text-text-primary"
113
- const metaClasses = "truncate text-[11px] leading-3 text-text-secondary"
114
- const panelClasses =
115
- "w-[260px] max-w-full overflow-hidden rounded-lg border border-border-default bg-surface-card"
116
-
117
- /** Compact attachments open their content on hover/focus; expanded content has no nested preview. */
118
- export function Attachment(props: TAttachmentProps): ReactElement {
119
- const filePreview = useAttachmentFile(props.file)
120
- const resolved = {
121
- ...props,
122
- ...(props.file ? attachmentFileKind(props.file) : {}),
123
- src: props.src ?? filePreview?.url,
124
- previewText: props.previewText ?? filePreview?.text,
125
- mimeType:
126
- props.mimeType ??
127
- (props.file ? attachmentMimeType(props.file) : undefined),
128
- } as TAttachmentProps
129
- if (props.variant === "preview") return <AttachmentPreview {...resolved} />
130
-
131
- return (
132
- <PreviewCard>
133
- <PreviewCardTrigger
134
- delay={300}
135
- tabIndex={0}
136
- render={
137
- <div className="w-fit max-w-full rounded-lg outline-none focus-visible:ring-2 focus-visible:ring-ring" />
138
- }
139
- >
140
- <AttachmentChip {...resolved} />
141
- </PreviewCardTrigger>
142
- <PreviewCardPopup
143
- className="p-1.5 w-fit max-w-[calc(100vw-2rem)] rounded-lg"
144
- data-slot="attachment-hover-preview"
145
- >
146
- {props.preview ?? (
147
- <AttachmentHover {...resolved} id={undefined} className={undefined} />
148
- )}
149
- </PreviewCardPopup>
150
- </PreviewCard>
151
- )
152
- }
153
-
154
- Object.assign(Attachment, { [ATTACHMENT_CONTENT]: true })
155
-
156
- /** Real file content when available; a kind icon otherwise. No fabricated thumbnail. */
157
- function AttachmentVisual({
158
- attachment,
159
- small = false,
160
- className,
161
- }: {
162
- attachment: TAttachmentProps
163
- small?: boolean
164
- className?: string
165
- }): ReactElement {
166
- const [failedSource, setFailedSource] = useState<string>()
167
- const Icon = KIND_ICON[attachment.kind]
168
- const label =
169
- typeof attachment.title === "string" ? attachment.title : "Attachment"
170
- const image =
171
- attachment.thumbnail ??
172
- (attachment.kind === "image" || attachment.kind === "url-link"
173
- ? attachment.src
174
- : attachment.kind === "media"
175
- ? attachment.poster
176
- : undefined)
177
- const video =
178
- attachment.kind === "media" && !attachment.audio
179
- ? attachment.src
180
- : undefined
181
- const pdf =
182
- attachment.kind === "document" &&
183
- (attachment.mimeType === "application/pdf" ||
184
- /\.pdf(?:[?#]|$)/i.test(attachment.src ?? ""))
185
- return (
186
- <div
187
- data-slot="attachment-thumbnail"
188
- className={cn(
189
- "relative flex shrink-0 items-center justify-center overflow-hidden rounded-lg bg-surface-subtle text-text-muted",
190
- small ? "size-10" : "w-60 aspect-[3/2] max-w-full",
191
- className
192
- )}
193
- >
194
- {image && failedSource !== image ? (
195
- <img
196
- src={image}
197
- alt={attachment.kind === "image" ? (attachment.alt ?? label) : label}
198
- onError={() => setFailedSource(image)}
199
- className="size-full object-cover"
200
- />
201
- ) : video && failedSource !== video ? (
202
- <video
203
- src={video.includes("#") ? video : `${video}#t=0.1`}
204
- aria-label={label}
205
- preload="metadata"
206
- muted
207
- playsInline
208
- onError={() => setFailedSource(video)}
209
- className="size-full object-cover"
210
- />
211
- ) : !small && pdf && attachment.src ? (
212
- <object
213
- data={`${attachment.src.split("#")[0]}#page=1&view=FitH&toolbar=0&navpanes=0`}
214
- type="application/pdf"
215
- aria-label={`Preview of ${label}`}
216
- className="bg-white size-full"
217
- >
218
- <span className="p-4 text-sm text-neutral-600">
219
- PDF preview unavailable in this browser.
220
- </span>
221
- </object>
222
- ) : attachment.previewText ? (
223
- <pre
224
- aria-label={`${label} excerpt`}
225
- className={cn(
226
- "font-mono size-full overflow-hidden bg-background text-left break-words whitespace-pre-wrap text-foreground",
227
- small ? "p-1 text-[3px] leading-[4px]" : "p-3 leading-4 text-[11px]"
228
- )}
229
- >
230
- {attachment.previewText}
231
- </pre>
232
- ) : (
233
- <Icon aria-hidden className={small ? "size-4" : "size-9 opacity-60"} />
234
- )}
235
- </div>
236
- )
237
- }
238
-
239
- function AttachmentChip(props: TAttachmentProps): ReactElement {
240
- return (
241
- <div
242
- data-slot="attachment"
243
- data-kind={props.kind}
244
- data-variant="default"
245
- className={cn(chipClasses, props.className)}
246
- id={props.id}
247
- style={props.style}
248
- >
249
- <AttachmentVisual attachment={props} small />
250
- <span className="min-w-0 gap-0.5 flex flex-1 flex-col">
251
- <span className={titleClasses}>{props.title}</span>
252
- {props.meta ? <span className={metaClasses}>{props.meta}</span> : null}
253
- </span>
254
- {props.removable !== false && props.onRemove ? (
255
- <RemoveButton onClick={props.onRemove} />
256
- ) : null}
257
- </div>
258
- )
259
- }
260
-
261
- function AttachmentPreview(props: TAttachmentProps): ReactElement {
262
- const { kind, title, meta, className, id, style } = props
263
- const shared = {
264
- "data-slot": "attachment",
265
- "data-kind": kind,
266
- "data-variant": "preview",
267
- id,
268
- style,
269
- } as const
270
- switch (props.kind) {
271
- case "image":
272
- return (
273
- <div {...shared} className={cn("max-w-full rounded-lg", className)}>
274
- <AttachmentVisual attachment={props} />
275
- </div>
276
- )
277
- case "media": {
278
- if (props.audio) {
279
- return (
280
- <div
281
- {...shared}
282
- className={cn(panelClasses, "gap-2 p-2.5 flex flex-col", className)}
283
- >
284
- {props.src ? (
285
- <audio
286
- controls
287
- preload="metadata"
288
- src={props.src}
289
- aria-label={
290
- typeof title === "string" ? title : "Audio attachment"
291
- }
292
- className="h-9 min-w-0 w-full"
293
- />
294
- ) : (
295
- <div className="gap-3 flex items-center">
296
- <PlayButton onClick={props.onPlay} />
297
- <Waveform bars={props.waveform} />
298
- </div>
299
- )}
300
- {meta ? <span className={metaClasses}>{meta}</span> : null}
301
- </div>
302
- )
303
- }
304
- return (
305
- <div
306
- {...shared}
307
- className={cn(
308
- "w-60 relative max-w-full overflow-hidden rounded-lg",
309
- className
310
- )}
311
- >
312
- {props.src ? (
313
- <video
314
- controls
315
- preload="metadata"
316
- playsInline
317
- src={props.src}
318
- poster={props.poster ?? props.thumbnail}
319
- aria-label={
320
- typeof title === "string" ? title : "Video attachment"
321
- }
322
- className="aspect-[3/2] w-full rounded-lg bg-surface-subtle object-cover"
323
- />
324
- ) : (
325
- <>
326
- <AttachmentVisual attachment={props} />
327
- <PlayButton
328
- onClick={props.onPlay}
329
- className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
330
- />
331
- </>
332
- )}
333
- {props.duration ? (
334
- <DurationPill className="right-2 top-2 pointer-events-none absolute">
335
- {props.duration}
336
- </DurationPill>
337
- ) : null}
338
- </div>
339
- )
340
- }
341
- case "document":
342
- return (
343
- <div {...shared} className={cn(chipClasses, "w-[260px]", className)}>
344
- <AttachmentVisual attachment={props} small />
345
- <span className="min-w-0 gap-0.5 flex flex-1 flex-col">
346
- <span className={titleClasses}>{title}</span>
347
- {meta ? <span className={metaClasses}>{meta}</span> : null}
348
- </span>
349
- {props.onAction ? (
350
- <Button
351
- aria-label="Download"
352
- variant="ghost"
353
- size="icon-xs"
354
- onClick={props.onAction}
355
- >
356
- {props.actionIcon ?? <Download />}
357
- </Button>
358
- ) : null}
359
- </div>
360
- )
361
- case "text-selection":
362
- return (
363
- <div
364
- {...shared}
365
- className={cn(
366
- "gap-2.5 p-2.5 flex w-[260px] max-w-full rounded-lg bg-surface-subtle",
367
- className
368
- )}
369
- >
370
- <QuoteRail />
371
- <span className="min-w-0 gap-1 flex flex-1 flex-col">
372
- <span className="gap-1.5 font-semibold leading-4 flex items-center text-[11px] text-accent-text">
373
- <BookOpen className="size-4 shrink-0" />
374
- <span className="truncate">{title}</span>
375
- </span>
376
- <span className="line-clamp-4 text-[13px] leading-[15px] text-text-primary">
377
- {props.quote ?? meta}
378
- </span>
379
- </span>
380
- </div>
381
- )
382
- case "chat-reply":
383
- return (
384
- <div
385
- {...shared}
386
- className={cn(
387
- "gap-2 p-2.5 flex w-[260px] max-w-full rounded-lg bg-surface-subtle",
388
- className
389
- )}
390
- >
391
- <QuoteRail />
392
- <span className="min-w-0 gap-0.5 flex flex-1 flex-col">
393
- <span className="gap-1.5 leading-4 flex items-center text-[12px] text-accent-text">
394
- <Reply className="size-4 shrink-0" />
395
- <span className="font-semibold truncate">
396
- {props.author ?? title}
397
- </span>
398
- {props.time ? (
399
- <span className="text-[11px] text-text-muted">
400
- {props.time}
401
- </span>
402
- ) : null}
403
- </span>
404
- <span className="line-clamp-3 text-[13px] leading-[15px] text-text-primary">
405
- {props.body ?? meta}
406
- </span>
407
- </span>
408
- </div>
409
- )
410
- case "username-handle":
411
- return (
412
- <span
413
- {...shared}
414
- className={cn(
415
- "h-6 gap-1.5 py-0.5 pl-0.5 pr-2 font-semibold inline-flex max-w-full items-center rounded-lg bg-accent-subtle text-[13px] leading-none text-accent-text",
416
- className
417
- )}
418
- >
419
- <AvatarHandle src={props.src} initials={props.initials} />
420
- {title}
421
- </span>
422
- )
423
- case "url-link": {
424
- const Tag = props.href ? "a" : "div"
425
- return (
426
- <Tag
427
- {...shared}
428
- href={props.href}
429
- target={props.href ? "_blank" : undefined}
430
- rel={props.href ? "noreferrer" : undefined}
431
- className={cn(panelClasses, "w-60 block", className)}
432
- >
433
- <AttachmentVisual
434
- attachment={props}
435
- className="h-[120px] w-full rounded-none"
436
- />
437
- <span className="gap-1 px-3 pb-3 pt-2.5 flex flex-col">
438
- <span className="gap-1.5 font-mono leading-3 flex items-center text-[10.5px] text-text-secondary">
439
- <Favicon src={props.favicon} />
440
- <span className="truncate">{props.domain}</span>
441
- </span>
442
- <span className={titleClasses}>{title}</span>
443
- {props.description ? (
444
- <span className="line-clamp-2 text-[11px] leading-[14px] text-text-secondary">
445
- {props.description}
446
- </span>
447
- ) : null}
448
- </span>
449
- </Tag>
450
- )
451
- }
452
- }
453
- }
454
-
455
- function AttachmentHover(props: TAttachmentProps): ReactElement {
456
- if (props.kind === "document") {
457
- return (
458
- <div className={cn(panelClasses, "border-0")}>
459
- <AttachmentVisual
460
- attachment={props}
461
- className="w-full rounded-b-none"
462
- />
463
- <div className="gap-1 p-3 flex flex-col">
464
- <span className={titleClasses}>{props.title}</span>
465
- {props.meta ? (
466
- <span className={metaClasses}>{props.meta}</span>
467
- ) : null}
468
- </div>
469
- </div>
470
- )
471
- }
472
- if (props.kind === "username-handle") {
473
- return (
474
- <div className="w-60 gap-3 p-3 flex max-w-full items-center rounded-lg bg-surface-card">
475
- <AvatarHandle src={props.src} initials={props.initials} size={20} />
476
- <span className="min-w-0 gap-1 flex flex-col">
477
- <span className={titleClasses}>{props.title}</span>
478
- {props.meta ? (
479
- <span className={metaClasses}>{props.meta}</span>
480
- ) : null}
481
- </span>
482
- </div>
483
- )
484
- }
485
- return (
486
- <div className="gap-2 flex max-w-full flex-col">
487
- <AttachmentPreview {...props} variant="preview" removable={false} />
488
- {props.kind === "image" || props.kind === "media" ? (
489
- <div className="max-w-60 gap-1 px-1 pb-1 flex flex-col">
490
- <span className={titleClasses}>{props.title}</span>
491
- {props.meta ? (
492
- <span className={metaClasses}>{props.meta}</span>
493
- ) : null}
494
- </div>
495
- ) : null}
496
- </div>
497
- )
498
- }